| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- 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": "薄白"}]}指标值用简短中文描述,如舌色「淡红」、苔色「薄白」、裂纹「无」、齿痕「轻」。
|