diff --git a/.cursor/rules/存客宝AI-项目工作流.mdc b/.cursor/rules/存客宝AI-项目工作流.mdc
new file mode 100644
index 00000000..fffe5f18
--- /dev/null
+++ b/.cursor/rules/存客宝AI-项目工作流.mdc
@@ -0,0 +1,25 @@
+---
+description: 存客宝 AI 集成与项目开发工作流
+alwaysApply: true
+---
+
+# 存客宝 AI 项目开发工作流
+
+## 1. 前置工作流
+
+每次对话开始时,**先用本机小模型全量读取并调用** `Z:\SynologyDrive\存客宝AI` 的能力,再开始后续开发。
+
+## 2. 开发与验证
+
+- **每次使用**时调用存客宝 AI,对当前项目进行验证与开发
+- 每次对话时,结合存客宝 AI 的**多功能同步讨论**来修改代码
+- 将上述流程同步更新到对应 Skill
+
+## 3. 项目级 Skill 生成
+
+开发过程中,需从存客宝 AI 抽取能力并生成针对本项目的 Skill:
+
+1. 该 Skill 用于管理整个项目,应继承存客宝 AI 的相应功能,并结合本项目已有代码与架构
+2. **详细阅读**项目内所有代码
+3. 按你认为**最佳分工方式**,对项目代码的各个域进行模块划分
+4. 将生成的 Skill 命名为合适的中文名称,放在**项目根目录**下
diff --git a/miniprogram/pages/read/read.js b/miniprogram/pages/read/read.js
index f0cedc92..eb7f1485 100644
--- a/miniprogram/pages/read/read.js
+++ b/miniprogram/pages/read/read.js
@@ -1210,14 +1210,15 @@ Page({
this.setData({ showPosterModal: false })
},
- // 保存海报到相册(与海报绘制尺寸一致,必须传 destWidth/destHeight 否则部分机型导出失败)
+ // 保存海报到相册:画布 300x450 兼容 iOS,导出 2 倍 600x900 提升清晰度(宽高比 2:3 不变)
savePoster() {
const width = 300
const height = 450
+ const exportScale = 2
wx.canvasToTempFilePath({
canvasId: 'posterCanvas',
- destWidth: width,
- destHeight: height,
+ destWidth: width * exportScale,
+ destHeight: height * exportScale,
fileType: 'png',
success: (res) => {
if (!res.tempFilePath) {
diff --git a/miniprogram/pages/read/read.wxml b/miniprogram/pages/read/read.wxml
index dbc9d37e..37375214 100644
--- a/miniprogram/pages/read/read.wxml
+++ b/miniprogram/pages/read/read.wxml
@@ -256,7 +256,7 @@
✕
-
+
diff --git a/soul-api/.env b/soul-api/.env
index 78d75d4f..077a905f 100644
--- a/soul-api/.env
+++ b/soul-api/.env
@@ -14,6 +14,8 @@ WECHAT_APPSECRET=3c1fb1f63e6e052222bbcead9d07fe0c
WECHAT_MCH_ID=1318592501
WECHAT_MCH_KEY=wx3e31b068be59ddc131b068be59ddc2
WECHAT_NOTIFY_URL=https://soul.quwanzhi.com/api/miniprogram/pay/notify
+# 小程序码/订阅消息跳转版本:formal=正式版(默认) | trial=体验版 | developer=开发版
+WECHAT_MINI_PROGRAM_STATE=formal
# 微信转账配置(API v3)
WECHAT_APIV3_KEY=wx3e31b068be59ddc131b068be59ddc2
diff --git a/soul-api/internal/config/config.go b/soul-api/internal/config/config.go
index e457c966..354a1726 100644
--- a/soul-api/internal/config/config.go
+++ b/soul-api/internal/config/config.go
@@ -120,9 +120,9 @@ func Load() (*Config, error) {
if wechatNotifyURL == "" {
wechatNotifyURL = "https://soul.quwanzhi.com/api/miniprogram/pay/notify" // 默认回调地址
}
- wechatMiniProgramState := os.Getenv("WECHAT_MINI_PROGRAM_STATE")
+ wechatMiniProgramState := strings.TrimSpace(os.Getenv("WECHAT_MINI_PROGRAM_STATE"))
if wechatMiniProgramState != "developer" && wechatMiniProgramState != "trial" {
- wechatMiniProgramState = "formal" // 默认正式版
+ wechatMiniProgramState = "formal" // 默认正式版,避免生成开发版码导致「开发版已过期」
}
// 转账配置
diff --git a/soul-api/internal/wechat/miniprogram.go b/soul-api/internal/wechat/miniprogram.go
index 0d23fed4..28224d77 100644
--- a/soul-api/internal/wechat/miniprogram.go
+++ b/soul-api/internal/wechat/miniprogram.go
@@ -216,9 +216,11 @@ func GenerateMiniProgramCode(scene, page string, width int) ([]byte, error) {
scene = scene[:32]
}
+ // 仅 developer/trial 生成对应版本码,其余一律正式版,避免扫码提示「开发版已过期」
envVersion := "release"
- if cfg != nil && cfg.WechatMiniProgramState != "" {
- switch cfg.WechatMiniProgramState {
+ if cfg != nil {
+ state := strings.TrimSpace(cfg.WechatMiniProgramState)
+ switch state {
case "developer":
envVersion = "develop"
case "trial":
@@ -227,6 +229,9 @@ func GenerateMiniProgramCode(scene, page string, width int) ([]byte, error) {
envVersion = "release"
}
}
+ if cfg != nil {
+ fmt.Printf("[GenerateMiniProgramCode] env_version=%s (WechatMiniProgramState=%q)\n", envVersion, cfg.WechatMiniProgramState)
+ }
reqBody := map[string]interface{}{
"scene": scene,
"page": page,
diff --git a/soul-api/soul-api b/soul-api/soul-api
index e72095d3..40d2af45 100644
Binary files a/soul-api/soul-api and b/soul-api/soul-api differ