server: port: 9082 tomcat: headers: X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Strict-Transport-Security: max-age=31536000; includeSubDomains spring: servlet: multipart: max-file-size: 50MB max-request-size: 50MB application: name: cfc-backend datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.16.251:3306/zxyj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true username: zxyj password: zxyj@123 hikari: maximum-pool-size: 50 minimum-idle: 10 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 pool-name: CfcHikariPool redis: host: ${REDIS_HOST:localhost} port: ${REDIS_PORT:6379} password: ${REDIS_PASSWORD:} timeout: 3000ms lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 sfms: datasource: enabled: false # 本地开发禁用 SFMS 数据源,需要迁移时改为 true driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.16.251:3306/zxyj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true username: zxyj password: zxyj@123 mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml type-aliases-package: com.etotem.cfc.entity configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl global-config: db-config: id-type: auto logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 jwt: secret: ${JWT_SECRET:cfc-prod-jwt-secret-2026-keep-it-safe!} # 30 天(2592000000ms)。配合小程序端 wx.login 静默续期(/api/auth/silent-login), # 用户几乎无需手动重新登录。 # 安全前提:续期只能走 code2Session(微信签发的单次 code,能证明设备持有), # 严禁恢复「裸 openid 换 token」——那等于任何拿到 openid 的人都能冒充该账号。 expiration: 2592000000 zkxz: enabled: false sync-api-url: https://api.zkxz.org.cn/api/ login-url: member/login sync-client-url: user/create list-client-url: user/list sync-teacher-url: teacher/create user-report: user/report report-info: report/info zx-user: "" zx-pass: "" wechat: appid: wx5ba8038ef16fb245 secret: ${WECHAT_SECRET:dev-only-wechat-secret} mch-id: 1703255039 mch-key: ${WECHAT_MCH_KEY:dev-only-mch-key} api-v3-key: ${WECHAT_API_V3_KEY:dev-only-api-v3-key} mch-serial-no: 53C2A906094D725BC350A3414AADCA6D79882AAF private-key-path: cert/apiclient_key.pem notify-url: http://cfc.bianwoyou.com.cn/api/payment/notify login-url: https://api.weixin.qq.com/sns/jscode2session phone-url: https://api.weixin.qq.com/wxa/business/getuserphonenumber test-mode: true # 测试模式:跳过微信 API 调用,使用模拟数据 appkey: ${WECHAT_APPKEY:cXqYJseX2MUaRM5kVHLQRskw5l5ZrDNo} # 虚拟支付 AppKey 现网(环境变量可覆盖) sandbox-appkey: ${WECHAT_SANDBOX_APPKEY:sKcsYR0e9T603wvD5yFcvISBcFLh3TXH} # 虚拟支付 AppKey 沙箱(环境变量可覆盖) virtual-pay-env: ${WECHAT_VIRTUAL_PAY_ENV:0} # 0=现网 1=沙箱 virtual-pay-token: ${WECHAT_VIRTUAL_PAY_TOKEN:cfcVirtualPay2026} # 虚拟支付消息推送 Token(与小程序后台消息推送配置一致) offer-id: ${WECHAT_VIRTUAL_PAY_OFFER_ID:1450607643} # 虚拟支付应用ID(mp-支付基础配置中的 offerId;productId 才是道具ID) test-phone: "13800138000" # 测试模式使用的手机号 alert-template-id: ${WECHAT_ALERT_TEMPLATE_ID:} promotion-tier-template-id: ${WECHAT_PROMOTION_TIER_TEMPLATE_ID:} # 小程序码环境:dev=development / test=trial / prod=release env-version: ${WECHAT_ENV_VERSION:release} dify: base-url: ${DIFY_BASE_URL:http://dify.bianwoyou.cn/v1} api-key: ${DIFY_API_KEY:app-dev-only-key} nutrition-api-key: ${DIFY_NUTRITION_API_KEY:app-dev-only-nutrition-key} emotion-api-key: "" # 照片情绪识别,空字符串=mock模式 bodyfat-scale: image-dir: ${BODYFAT_SCALE_IMAGE_DIR:docs/参考资料/体脂秤} deepseek: vision-api-key: ${DEEPSEEK_VISION_API_KEY:""} # DeepSeek-VL 视觉模型 API Key,空=mock模式 vision-base-url: ${DEEPSEEK_VISION_BASE_URL:https://api.deepseek.com/v1} callback-secret: ${DIFY_CALLBACK_SECRET:dev-only-callback-secret} python: executable: python enabled: true base-url: https://ai.etotem.com.cn timeout-ms: 15000 # LLM 推理可达 30-60s(画像/问卷更长),read 超时必须覆盖推理耗时,connect 超时才用 timeout-ms read-timeout-ms: 300000 # menu/generate 等长推理任务可达 120s,5 分钟兜底 circuit-breaker: failure-threshold: 3 reset-timeout-ms: 30000 langgraph: # LangGraph 报告解析服务(健康报告 PDF → 结构化 JSON) # 开发环境默认 localhost,生产环境指向 ai.etotem.com.cn # TODO(部署): 容器化时需确保 uploads/health-reports 对 LangGraph 容器可见 base-url: ${LANGGRAPH_BASE_URL:http://localhost:9000} profile-timeout-ms: 90000 # 画像生成推理可达 30-60s,独立超时 report: collect: # 健康报告异步采集:未命中指纹脚本时交本地 opencode 服务解析 # 启动命令见根 AGENTS.md:opencode web --port 4090 --hostname 127.0.0.1 opencode-base: ${OPENCODE_BASE:http://127.0.0.1:4090} opencode-user: opencode opencode-password: ${OPENCODE_ADMIN_PASSWORD:IwinTrue@123} opencode-workdir: ${OPENCODE_WORKDIR:/app/cfc} # provider-id 必须与 GET /config/providers 返回的 id 完全一致(本机为 agnes,不是 agnes-ai) # 模型只在 prompt_async 请求体生效;勿用 opencode/big-pickle(免费额度限流,会空转超时) opencode-model-provider: ${OPENCODE_MODEL_PROVIDER:agnes} opencode-model-id: ${OPENCODE_MODEL_ID:agnes-2.5-flash} opencode-agent: ${OPENCODE_AGENT:build} math: verify-mode: dify # dify | eval; dify=走Dify工作流, eval=服务端计算(兜底) workflow-id: "" # Dify 数学判题工作流 ID(留空则使用 eval 兜底) upload: base-dir: /data/cfc-uploads allowed-types: image/jpeg,image/png,image/gif,image/webp,application/pdf storage: type: jdcloud # jdcloud | local jdcloud: endpoint: s3.cn-north-1.jdcloud-oss.com access-key: JDC_F351EC3CB1F8593204ABCDA2CBF2 secret-key: 970C0C6985A6BF29D0C79AE3693B9899 bucket: cfc region: cn-north-1 shop: order: payment-timeout-minutes: 30 # 订单超时时间(分钟) virtual-pay: payment-timeout-minutes: 30 # 虚拟支付订单超时时间(分钟) logging: level: com.etotem.cfc: debug # 应用配置 app: init-test-data: false # 是否初始化测试/种子数据,生产环境应关闭 # Admin 登录配置 admin: skip-captcha: true # 测试环境跳过验证码,方便自动化测试 ai: prompts: questionnaire-version: "1" questionnaire-parent: | 你是一位专业的家庭关系评估顾问,擅长设计温暖、不具威胁性的关系问卷。 你的任务是为填写者设计一份关系评估问卷,了解填写者与被评估成员之间的关系质量。 ## 基本信息 - 填写者(答卷人):{respondent_name},{respondent_gender},{respondent_age}岁,星座:{respondent_zodiac} - 被评估成员:{member_name},{member_gender},{member_age}岁,星座:{member_zodiac} - 你(填写者)与被评估成员的关系:{relationship_desc} - 家庭基本情况:{family_context} ## 角色与任务 填写者是家长,被评估成员是其孩子。家长对子女的关系感知是评估的重点。 请生成 **15-18 道**情境化题目,涵盖三个维度,每个维度约 5-6 题: ### 信任维度(trust) 从以下间接角度设计题目: - 遇到困难时是否愿意向对方求助 - 是否会向对方分享不愿让他人知道的事 - 与对方相处时是否感到安全、不被评判 - 对方是否值得信赖(守承诺、不泄露隐私等) - 犯错后是否担心对方的反应 ### 亲密维度(intimacy) 从以下间接角度设计题目: - 是否愿意与对方共处(无需说话也能舒适) - 对方是否是你情绪低落时的"避风港" - 是否愿意与对方分享个人感受 - 对方是否让你感到被理解和接纳 - 是否觉得对方是"最懂你的人"之一 ### 沟通维度(communication) 从以下间接角度设计题目: - 意见不合时是否能平静沟通 - 对方是否认真倾听,而非急于评判或给建议 - 是否能自然表达自己的真实想法 - 对方是否经常打断你或没听完就下结论 - 是否觉得你们之间有"说不出口"的话题 ## 题目设计要求 1. **情境化**:用具体场景代替抽象问法(如:"当你遇到困难时..." 而非 "你是否信任对方") 2. **温暖语气**:避免让填写者感到被审判,用"你是否觉得...""你是否愿意..." 3. **选项差异化**:4-5 个选项,描述具体行为或感受 4. **反向计分题**:至少 3 道题设置 direction="negative",用于检测答题一致性 5. **覆盖双方画像**:如有星座、年龄差距等信息,可在题目中适度融入(如"青春期""代沟"等) ## 返回格式(严格 JSON,无其他内容) {{ "version": 1, "questions": [ {{ "id": "q1", "dimension": "trust", "direction": "positive", "weight": 1.0, "text": "题目文字", "options": [ {{"id": "a", "score": 0}}, {{"id": "b", "score": 1}}, {{"id": "c", "score": 2}}, {{"id": "d", "score": 3}} ] }} ] }} 确保 JSON 格式正确,所有题目覆盖三个维度,共 15-18 题。 questionnaire-child: | 你是一位专业的家庭关系评估顾问,擅长设计温暖、不具威胁性的关系问卷。 你的任务是为填写者设计一份关系评估问卷,了解填写者与被评估成员之间的关系质量。 ## 基本信息 - 填写者(答卷人):{respondent_name},{respondent_gender},{respondent_age}岁,星座:{respondent_zodiac} - 被评估成员:{member_name},{member_gender},{member_age}岁,星座:{member_zodiac} - 你(填写者)与被评估成员的关系:{relationship_desc} - 家庭基本情况:{family_context} ## 角色与任务 填写者是孩子,被评估成员是其家长。孩子对家长的关系感知是评估的重点。 请生成 **15-18 道**情境化题目,涵盖三个维度,每个维度约 5-6 题: ### 信任维度(trust) 从以下间接角度设计题目: - 遇到困难时是否愿意向对方求助 - 是否会向对方分享不愿让他人知道的事 - 与对方相处时是否感到安全、不被评判 - 对方是否值得信赖(守承诺、不泄露隐私等) - 犯错后是否担心对方的反应 ### 亲密维度(intimacy) 从以下间接角度设计题目: - 是否愿意与对方共处(无需说话也能舒适) - 对方是否是你情绪低落时的"避风港" - 是否愿意与对方分享个人感受 - 对方是否让你感到被理解和接纳 - 是否觉得对方是"最懂你的人"之一 ### 沟通维度(communication) 从以下间接角度设计题目: - 意见不合时是否能平静沟通 - 对方是否认真倾听,而非急于评判或给建议 - 是否能自然表达自己的真实想法 - 对方是否经常打断你或没听完就下结论 - 是否觉得你们之间有"说不出口"的话题 ## 题目设计要求 1. **情境化**:用具体场景代替抽象问法(如:"当你遇到困难时..." 而非 "你是否信任对方") 2. **温暖语气**:避免让填写者感到被审判,用"你是否觉得...""你是否愿意..." 3. **选项差异化**:4-5 个选项,描述具体行为或感受 4. **反向计分题**:至少 3 道题设置 direction="negative",用于检测答题一致性 5. **覆盖双方画像**:如有星座、年龄差距等信息,可在题目中适度融入(如"青春期""代沟"等) ## 返回格式(严格 JSON,无其他内容) {{ "version": 1, "questions": [ {{ "id": "q1", "dimension": "trust", "direction": "positive", "weight": 1.0, "text": "题目文字", "options": [ {{"id": "a", "score": 0}}, {{"id": "b", "score": 1}}, {{"id": "c", "score": 2}}, {{"id": "d", "score": 3}} ] }} ] }} 确保 JSON 格式正确,所有题目覆盖三个维度,共 15-18 题。 tongue-system: | 你是资深中医舌诊专家。根据用户上传的舌象图片,输出结构化 JSON,不要输出任何 JSON 之外的文字。indicators 数组的 code 字段必须严格从以下 7 个值中选择,禁止自创或改写:tongue_color(舌色)、coating_color(苔色)、coating_texture(苔质)、fissure(裂纹)、teeth_mark(齿痕)、sublingual_vein(舌下络脉)、constitution(体质)。JSON 格式:{"overall_assessment": "整体舌象评估结论", "indicators": [{"code": "tongue_color", "value": "淡红"}, {"code": "coating_color", "value": "薄白"}]}指标值用简短中文描述,如舌色「淡红」、苔色「薄白」、裂纹「无」、齿痕「轻」。