abiao 1 mesiac pred
rodič
commit
feaebfe600
34 zmenil súbory, kde vykonal 167 pridanie a 560 odobranie
  1. 0 1
      .cloudbase/container/debug.json
  2. 0 27
      api/project.js
  3. 1 2
      app.wxss
  4. 1 2
      component/currency/currency.js
  5. 0 14
      component/project/project.js
  6. 0 3
      component/project/project.json
  7. 0 16
      component/project/project.wxml
  8. 0 49
      component/project/project.wxss
  9. 0 31
      component/toast/toast.js
  10. 0 9
      component/toast/toast.wxml
  11. 0 22
      component/toast/toast.wxss
  12. 0 83
      packageUser/pages/user/bankinfo/bankinfo.js
  13. 0 4
      packageUser/pages/user/bankinfo/bankinfo.json
  14. 0 48
      packageUser/pages/user/bankinfo/bankinfo.wxml
  15. 0 122
      packageUser/pages/user/bankinfo/bankinfo.wxss
  16. 0 12
      packageUser/pages/user/cash/cash.js
  17. 1 13
      packageUser/pages/user/fund/fund.js
  18. 19 18
      packageWellness/pages/tcm/diagnosis/diagnosis.js
  19. 1 1
      packageWellness/pages/tcm/diagnosis/diagnosis.json
  20. 9 9
      packageWellness/pages/tcm/diagnosis/diagnosis.wxml
  21. 10 9
      packageWellness/pages/tcm/report/report.js
  22. 1 1
      packageWellness/pages/tcm/report/report.json
  23. 9 9
      packageWellness/pages/tcm/report/report.wxml
  24. 1 1
      packageWellness/pages/tcm/user-form/user-form.js
  25. 1 1
      packageWellness/pages/tcm/user-form/user-form.json
  26. 3 3
      packageWellness/pages/tcm/user-form/user-form.wxml
  27. 0 5
      pages/user/all/all.js
  28. 0 4
      pages/user/all/all.wxml
  29. 7 6
      pages/wellness/wellness.js
  30. 11 11
      pages/wellness/wellness.wxml
  31. 0 9
      project.private.config.json
  32. 88 0
      utils/compliance.js
  33. 0 11
      utils/modules.js
  34. 4 4
      utils/request.js

+ 0 - 1
.cloudbase/container/debug.json

@@ -1 +0,0 @@
-{"containers":[],"config":{}}

+ 0 - 27
api/project.js

@@ -1,27 +0,0 @@
-var $state = require('../utils/modules.js')
-var _request = require('../utils/request.js')
-
-// 项目列表
-function getProjects (that, state, page, per_page) {
-  // wx.showLoading({
-  //   title: '加载中',
-  // })
-  var url = 'v1/products'
-  var params = {
-    state: state,
-    page: page,
-    per_page: per_page
-  }
-  var success = function (val, res) {
-    $state.state.projectList.total = val.data.list_count
-    var result = res ? that.data.project.concat(val.data.list || []) : []
-    that.setData({ project: result })
-    $state.state.projectList.more = val.data.list_count > val.data.list
-  }
-  _request.$get(url, params, success)
-}
-
-module.exports = {
-  getProjects: getProjects
-}
-

+ 1 - 2
app.wxss

@@ -1,5 +1,4 @@
 /**app.wxss**/
-@import "component/toast/toast.wxss";
 page {
   font-family: "微软雅黑", "Microsoft Yahei";
   height: 100%;
@@ -47,4 +46,4 @@ button {
   margin: 0;
   padding: 0;
   background: none;
-}
+}

+ 1 - 2
component/currency/currency.js

@@ -1,4 +1,3 @@
-// component/project/project.js
 var util = require('../../utils/accounting.min.js');
 Component({
   properties: {
@@ -26,4 +25,4 @@ Component({
       })
     }
   }
-})
+})

+ 0 - 14
component/project/project.js

@@ -1,14 +0,0 @@
-// component/project/project.js
-Component({
-
-  /**
-   * 页面的初始数据
-   */
-  properties: {
-    projectItem: {
-      type: Array
-    }
-  },
-  data: {
-  }
-})

+ 0 - 3
component/project/project.json

@@ -1,3 +0,0 @@
-{
-  "component": true
-}

+ 0 - 16
component/project/project.wxml

@@ -1,16 +0,0 @@
-<!--component/project/project.wxml-->
-<view class="all">
-  <view class="project" wx:for="{{projectItem}}">
-    <image class="project-img" src="{{item.cover}}"></image>
-    <view class="project-info">
-      <text class="project-title">{{item.name}}</text>
-      <text class="project-count">已售{{item.current_investor_count}}件</text>
-      <view class="project-price">
-      <currency symbol="¥" value="200" ></currency>
-      </view>
-      <text class="project-point">(或{{item.person_min_crowd_funding / 1000}}代金券)</text>
-    </view>
-    <view class="project-out"></view>
-  </view>
-  <view class="clean"></view>
-</view>

+ 0 - 49
component/project/project.wxss

@@ -1,49 +0,0 @@
-/* component/project/project.wxss */
-.all {
-  padding-top: 20rpx;
-}
-.clean {
-  clear: both;
-}
-.project {
-  position: relative;
-  float: left;
-  margin-left: 20rpx;
-  margin-bottom: 20rpx;
-  width: 345rpx;
-  height: 554rpx;
-  background-color: #fff;
-}
-.project-img {
-  width: 100%;
-  height: 345rpx;
-}
-.project-title {
-  padding-top: 15rpx;
-  line-height: 36rpx;
-  margin-bottom:15rpx;
-  -webkit-line-clamp: 2;
-  font-size: 28rpx;
-  color: #2b2b2b;
-  overflow:hidden;
-  text-overflow:ellipsis;
-  display:-webkit-box;
-  -webkit-box-orient:vertical;
-}
-.project-info {
-  padding: 0 10rpx;
-}
-.project-count {
-  display: block;
-  color: #bbbbbb;
-  font-size: 24rpx;
-}
-.project-price {
-  color: #eab86a;
-  font-size: 28rpx;
-  font-weight: bold;
-}
-.project-point {
-  color: #bbbbbb;
-  font-size: 24rpx;
-}

+ 0 - 31
component/toast/toast.js

@@ -1,31 +0,0 @@
-
-let _compData = {
-  '_toast_.isHide': false,// 控制组件显示隐藏
-  '_toast_.content': ''// 显示的内容
-}
-let toastPannel = {
-  // toast显示的方法
-  show: function(data) {
-    let self = this;
-    this.setData({ '_toast_.isHide': true, '_toast_.content': data});
-    setTimeout(function(){
-      self.setData({ '_toast_.isHide': false})
-    },2000)
-  }
-}
-function ToastPannel() {
-  // 拿到当前页面对象
-  let pages = getCurrentPages();
-  let curPage = pages[pages.length - 1];
-  this.__page = curPage;
-  // 小程序最新版把原型链干掉了。。。换种写法
-  Object.assign(curPage, toastPannel);
-  // 附加到page上,方便访问
-  curPage.toastPannel = this;
-  // 把组件的数据合并到页面的data对象中
-  curPage.setData(_compData);
-  return this;
-}
-module.exports = {
-  ToastPannel
-}

+ 0 - 9
component/toast/toast.wxml

@@ -1,9 +0,0 @@
- <template name="toast">
-  <view class="toast_content_box" wx:if="{{ isHide }}">
-    <view class="toast_content">
-      <view class="toast_content_text">
-        {{content}}
-      </view>
-    </view>
-  </view>
- </template>

+ 0 - 22
component/toast/toast.wxss

@@ -1,22 +0,0 @@
-.toast_content_box {
-  display: flex;
-  width: 100%;
-  height: 100%;
-  justify-content: center;
-  align-items: center;
-  position: fixed;
-  z-index: 999;
-}
-.toast_content {
-  width: 50%;
-  padding: 20rpx;
-  background: rgba(0, 0, 0, 0.8);
-  border-radius: 20rpx;
-}
-.toast_content_text {
-  height: 100%;
-  width: 100%;
-  color: #fff;
-  font-size: 28rpx;
-  text-align: center;
-} 

+ 0 - 83
packageUser/pages/user/bankinfo/bankinfo.js

@@ -1,83 +0,0 @@
-var _request = require('../../../../utils/request.js')
-Page({
-
-  /**
-   * 页面的初始数据
-   */
-  data: {
-  	has_bank:false,
-    account_name: '',
-    bank_name: '',
-    bank_account: '',
-    bankInfo:{}
-  },
-  /**
-   * 生命周期函数--监听页面加载
-   */
-  onLoad: function (options) {
-//  this.checkCertified()
-		this.getBankInfo();
-  },
-  accountName (e) {
-    console.log(e)
-    var that = this
-    that.setData({
-      account_name: e.detail.value
-    })
-  },
-  bankName (e) {
-    console.log(e)
-    var that = this
-    that.setData({
-      bank_name: e.detail.value
-    })
-  },
-  bankAccount (e) {
-    console.log(e)
-    var that = this
-    that.setData({
-      bank_account: e.detail.value
-    })
-  },
-	confirmClick () {
-	    var that = this
-	    var url = 'v1/user/save_card'
-	    var params = {
-	      account_name: that.data.account_name,
-		    bank_name: that.data.bank_name,
-		    bank_account: that.data.bank_account
-	    }
-	    var success = function (res) {
-	      if (res.data) {
-	        wx.showToast({
-	          title: '银行卡绑定成功~',
-	          icon: 'none',
-	          duration: 2000
-	        })
-	        that.getBankInfo()
-	      }
-	    }
-	    _request.$post(url, params, success)
-	},
-  getBankInfo(){
-  	var that = this
-    var url = 'v1/user/get_bank_info'
-    var params = {
-    }
-    var success = function (res) {
-      	that.setData({
-        	account_name: res.data.account_name,
-			    bank_name: res.data.bank_name,
-			    bank_account: res.data.bank_account,
-			    bankInfo:res.data,
-			    has_bank:res.data.has_bank
-        })
-    }
-    _request.$get(url, params, success)
-  },
-  onShareAppMessage: function (val) {
-    return _request.share({
-      sc: 'xcx_user_identity'
-    })
-  }
-})

+ 0 - 4
packageUser/pages/user/bankinfo/bankinfo.json

@@ -1,4 +0,0 @@
-{
-  "navigationBarTitleText": "银行信息",
-  "disableScroll": true
-}

+ 0 - 48
packageUser/pages/user/bankinfo/bankinfo.wxml

@@ -1,48 +0,0 @@
-<view class="identity__bg">
-  <view class="identity__head">
-    <image src="https://fohow.oss-cn-shenzhen.aliyuncs.com/xcx/xcx/rabbitimg/identity_bg.png"></image>
-  </view>
-
-  <view class="identity_wid">
-    <view class="identity_content">
-      <view class="title" wx:if="{{!has_bank}}">请先绑定银行卡</view>
-      <view class="title" wx:if="{{has_bank}}">已成功绑定银行卡</view>
-      <view class="identity_name">
-        <view class="fl">
-          <text>姓名</text>
-          <input type="text" bindinput="accountName" placeholder="真实姓名" value="{{account_name}}" disabled="{{has_bank}}"/>
-          <view class="clean"></view>
-        </view>
-        <view class="clean"></view>
-      </view>
-      <view class="identity_number">
-        <view class="fl">
-          <text>开户银行</text>
-          <input type="text" bindinput="bankName" placeholder="请填写银行卡开户银行" value="{{bank_name}}" disabled="{{has_bank}}"/>
-          <view class="clean"></view>
-        </view>
-        <view class="clean"></view>
-      </view>
-      <view class="identity_number">
-        <text>银行账号</text>
-        <input type="text" bindinput="bankAccount" placeholder="请输入您的银行账号" value="{{bank_account}}" disabled="{{has_bank}}"/>
-        <view class="clean"></view>
-      </view>
-
-      <view class="identity_btn" bindtap="confirmClick" wx:if="{{!has_bank}}">立即绑定</view>
-    </view>
-
-<!--
-    <view class="identity_content" wx:if="{{has_bank}}">
-      <image class="identity__img" src="https://fohow.oss-cn-shenzhen.aliyuncs.com/xcx/xcx/rabbitimg/identity.png"></image>
-      <view class="identity_headImg">
-        <image wx:if="{{certificateData.head}}" src="{{certificateData.head}}"></image>
-        <image wx:if="{{!certificateData.head}}" src="https://fohow.oss-cn-shenzhen.aliyuncs.com/xcx/user/labbit_default.png"></image>
-      </view>
-      <view class="info">{{certificateData.real_name}}</view>
-      <view class="info">{{certificateData.identity_card_with_star}}</view>
-    </view>
--->  
-  </view>
-
-</view>

+ 0 - 122
packageUser/pages/user/bankinfo/bankinfo.wxss

@@ -1,122 +0,0 @@
-.identity__bg {
-  width: 100%;
-  min-height: 100%;
-  background: #f3f3f3;
-}
-.identity__head {
-  width: 100%;
-  height: 248rpx;
-  background-image: linear-gradient(180deg, 
-    #eab86a 0%, 
-    #d4932b 100%);
-}
-.identity__head image {
-  display: block;
-  width: 201rpx;
-  height: 251rpx;
-  margin: 0 auto;
-}
-.identity_wid {
-  width: 100%;
-  padding: 0 20rpx;
-  box-sizing: border-box;
-}
-.identity_content {
-  position: relative;
-  width: 100%;
-  background: #fff;
-  padding: 54rpx 30rpx 38rpx;
-  margin-top: 20rpx;
-  box-sizing: border-box;
-}
-.identity_content .title {
-  text-align: center;
-  font-size: 28rpx;
-  color: #7f93ae;
-  margin-bottom: 54rpx;
-}
-.identity_name, .identity_number {
-  width: 100%;
-  height: 100rpx;
-  background: #f6f9fd;
-  border: 1rpx solid #e5e5e5;
-  padding-left: 30rpx;
-  padding-right: 20rpx;
-  margin-bottom:30rpx;
-  box-sizing: border-box;
-}
-.identity_name fl {
-  float: left;
-}
-.identity_name text, .identity_number text{
-  /*display: inline-block;*/
-  float: left;
-  width: 140rpx;
-  line-height: 100rpx;
-  font-size: 28rpx;
-  color: #7f93ae;
-}
-.identity_name input {
-  float: left;
-  width: 160rpx;
-  height: 100rpx;
-  border: none;
-  outline: none;
-  font-size: 28rpx;
-  color: #b8c6d9;
-}
-.identity_name .btn {
-  float: right;
-  width: 260rpx;
-  height: 52rpx;
-  background: #fff;
-  border-radius: 26rpx;
-  line-height: 52rpx;
-  font-size: 24rpx;
-  color: #eab86a;
-  border: 1rpx solid #eab86a;
-  box-sizing: border-box;
-  text-align: center;
-  margin-top: 24rpx;
-}
-.identity_number input {
-  float: left;
-  width: 440rpx;
-  height: 100rpx;
-  border: none;
-  outline: none;
-  font-size: 28rpx;
-  color: #b8c6d9;
-}
-.identity_btn {
-  width: 100%;
-  height: 88rpx;
-  background: #eab86a;
-  border-radius: 8rpx;
-  line-height: 88rpx;
-  text-align: center;
-  font-size: 28rpx;
-  color: #ffffff;
-}
-.identity__img {
-  position: absolute;
-  width: 224rpx;
-  height: 162rpx;
-  right: 0;
-}
-.identity_headImg {
-  width: 172rpx;
-  height: 172rpx;
-  margin: 0 auto 46rpx;
-}
-.identity_headImg image {
-  width: 100%;
-  height: 100%;
-  border-radius: 50%;
-}
-.identity_content .info {
-  font-size: 28rpx;
-  color: #7f93ae;
-  text-align: center;
-  margin-bottom: 24rpx;
-}

+ 0 - 12
packageUser/pages/user/cash/cash.js

@@ -136,18 +136,6 @@ Page({
   				duration: 2000
   			  })
   			}
-  		// }else{
-  		// 	wx.showToast({
-  		// 	title: '提现请先绑定银行卡~',
-  		// 	icon: 'none',
-  		// 	duration: 2000
-  		//   })
-  		// 	setTimeout(function(){
-  		// 		wx.navigateTo({
-  		// 		  url: '/packageUser/pages/user/bankinfo/bankinfo'
-  		// 		})
-  		// 	},1000)
-  		// }
     // }
     // _request.$get(url, params, success)
   },

+ 1 - 13
packageUser/pages/user/fund/fund.js

@@ -139,18 +139,6 @@ Page({
 				duration: 2000
 			  })
 			}
-		// }else{
-		// 	wx.showToast({
-		// 	title: '提现请先绑定银行卡~',
-		// 	icon: 'none',
-		// 	duration: 2000
-		//   })
-		// 	setTimeout(function(){
-		// 		wx.navigateTo({
-		// 		  url: '/packageUser/pages/user/bankinfo/bankinfo'
-		// 		})
-		// 	},1000)
-		// }
     // }
     // _request.$get(url, params, success)
   },
@@ -273,4 +261,4 @@ Page({
       sc: 'xcx_user_cash'
     })
   }
-})
+})

+ 19 - 18
packageWellness/pages/tcm/diagnosis/diagnosis.js

@@ -1,4 +1,5 @@
 var tcm = require('../../../../utils/tcm.js')
+var compliance = require('../../../../utils/compliance.js')
 
 var EXAMPLE_IMAGES = {
   tongue: 'https://cfohow.hiwavo.com/fohow-app/xcx/tcm/sheup.png',
@@ -33,7 +34,7 @@ var USER_OPTION_LABELS = {
     it_programmer: 'IT/程序员',
     driver: '司机(出租车/货运/公交等)',
     teacher: '教师/培训师',
-    medical_staff: '医护人员',
+    medical_staff: '健康护理人员',
     service_industry: '服务行业(餐饮/零售/酒店等)',
     heavy_labor: '重体力劳动(建筑/搬运/制造等)',
     outdoor_worker: '户外工作者(农业/快递/外卖等)',
@@ -67,7 +68,7 @@ Page({
       {
         key: 'tongue',
         title: '舌面',
-        desc: '请伸出舌头,拍摄舌面正面照,需清晰展示舌颜色和纹理',
+        desc: '请伸出舌头,拍摄舌面正面照,需清晰展示舌颜色和纹理',
         required: true,
         localPath: '',
         url: '',
@@ -76,7 +77,7 @@ Page({
       {
         key: 'tongueBottom',
         title: '舌下',
-        desc: '请翘起舌头,拍摄舌底照片,需清晰展示舌下络脉',
+        desc: '请翘起舌头,拍摄舌底照片,需清晰展示舌下纹理',
         required: true,
         localPath: '',
         url: '',
@@ -85,7 +86,7 @@ Page({
       {
         key: 'face',
         title: '面部',
-        desc: '请正对镜头拍摄面部照片,需清晰展示面部整体气色',
+        desc: '请正对镜头拍摄面部照片,需清晰展示面部整体状态',
         required: true,
         localPath: '',
         url: '',
@@ -264,8 +265,8 @@ Page({
     }
 
       wx.showModal({
-        title: '删除检测人',
-        content: '确认删除“' + user.nickName + '”吗?删除后该成员的康养检测入口将不可用。',
+        title: '删除成员',
+        content: '确认删除“' + user.nickName + '”吗?删除后该成员的康养评估入口将不可用。',
       confirmColor: '#e35b4e',
       success: function (res) {
         if (!res.confirm) {
@@ -296,7 +297,7 @@ Page({
   viewRecords: function () {
     if (!this.data.currentUser || !this.data.currentUser.ID) {
       wx.showToast({
-        title: '请先选择检测人',
+        title: '请先选择成员',
         icon: 'none'
       })
       return
@@ -422,7 +423,7 @@ Page({
   goQuestionsStep: function () {
     if (!this.data.currentUser || !this.data.currentUser.ID) {
       wx.showToast({
-        title: '请先选择检测人',
+        title: '请先选择成员',
         icon: 'none'
       })
       return
@@ -465,8 +466,8 @@ Page({
         var item = list[i]
         nextList.push({
           key: item.key || '',
-          title: item.title || '',
-          hint: item.hint || '',
+          title: compliance.sanitizeText(item.title || ''),
+          hint: compliance.sanitizeText(item.hint || ''),
           required: item.required === true,
           multiSelect: item.multiSelect === true,
           exclusivePairs: item.exclusivePairs || [],
@@ -475,10 +476,10 @@ Page({
           options: (item.options || []).map(function (opt) {
             return {
               value: opt.value || '',
-              label: opt.label || '',
+              label: compliance.sanitizeText(opt.label || ''),
               isCustom: opt.isCustom === true,
-              placeholder: opt.placeholder || '',
-              description: opt.description || '',
+              placeholder: compliance.sanitizeText(opt.placeholder || ''),
+              description: compliance.sanitizeText(opt.description || ''),
               isExclusive: opt.isExclusive === true,
               selected: false,
               disabled: false
@@ -496,7 +497,7 @@ Page({
         loadingQuestions: false
       })
       wx.showToast({
-        title: '问诊题目加载失败',
+        title: '健康问答题目加载失败',
         icon: 'none'
       })
     })
@@ -672,8 +673,8 @@ Page({
     }
 
     wx.showModal({
-      title: 'AI 健康分析知情同意',
-      content: '本功能使用人工智能技术对舌象、面部与问诊信息进行分析,结果仅供健康参考,不构成医疗诊断或治疗建议。',
+      title: 'AI 健康评估知情同意',
+      content: '本功能使用人工智能技术对舌象、面部与健康问答信息进行分析,结果仅供健康参考,不构成专业建议。',
       confirmText: '继续提交',
       confirmColor: '#eab86a',
       success: function (res) {
@@ -708,7 +709,7 @@ Page({
         questionAnswers[question.key] = selectedValues
       }
       if (question.customText) {
-        customAnswers[question.key] = question.customText
+        customAnswers[question.key] = compliance.sanitizeText(question.customText)
       }
     }
 
@@ -722,7 +723,7 @@ Page({
       questionAnswers: questionAnswers,
       customAnswers: customAnswers,
       observationImages: observationImages,
-      extraNote: that.data.extraNote || '',
+      extraNote: compliance.sanitizeText(that.data.extraNote || ''),
       additionalText: ''
     }).then(function (data) {
       wx.showToast({

+ 1 - 1
packageWellness/pages/tcm/diagnosis/diagnosis.json

@@ -1,3 +1,3 @@
 {
-  "navigationBarTitleText": "中医诊疗"
+  "navigationBarTitleText": "AI健康评估"
 }

+ 9 - 9
packageWellness/pages/tcm/diagnosis/diagnosis.wxml

@@ -1,18 +1,18 @@
 <view class="diagnosis-page">
   <view class="topbar">
     <view class="user-switch" bindtap="openUserPopup">
-      <text class="user-name">{{currentUser ? currentUser.nickName : '请选择检测人'}}</text>
+      <text class="user-name">{{currentUser ? currentUser.nickName : '请选择成员'}}</text>
       <text class="user-meta" wx:if="{{currentUser}}">{{currentUser.sex == 1 ? '女' : '男'}} · {{currentUser.height || '--'}}cm</text>
     </view>
-    <view class="record-btn" bindtap="viewRecords">诊疗记录</view>
+    <view class="record-btn" bindtap="viewRecords">评估记录</view>
   </view>
 
   <view wx:if="{{currentUser}}" class="user-detail-card">
-    <view class="user-detail-title">检测人信息</view>
+    <view class="user-detail-title">成员信息</view>
     <view class="user-detail-tags" wx:if="{{currentUser.detailTags && currentUser.detailTags.length}}">
       <view class="user-detail-tag" wx:for="{{currentUser.detailTags}}" wx:key="index" wx:for-item="tag">{{tag}}</view>
     </view>
-    <view wx:else class="user-detail-empty">当前检测人尚未补充国家、人种、职业信息,建议完善后再检测。</view>
+    <view wx:else class="user-detail-empty">当前成员尚未补充国家、人种、职业信息,建议完善后再评估。</view>
   </view>
 
   <view wx:if="{{currentStep == 0}}" class="step-page">
@@ -49,7 +49,7 @@
       <view class="step-line active"></view>
       <view class="step-item active">
         <view class="step-dot">2</view>
-        <view class="step-label">问诊填写</view>
+        <view class="step-label">健康问答</view>
       </view>
       <view class="step-line"></view>
       <view class="step-item">
@@ -58,7 +58,7 @@
       </view>
     </view>
 
-    <view wx:if="{{loadingQuestions}}" class="loading-box">问诊题目加载中...</view>
+    <view wx:if="{{loadingQuestions}}" class="loading-box">健康问答题目加载中...</view>
     <block wx:else>
       <view class="question-card" wx:for="{{questionList}}" wx:key="key" wx:for-index="qIndex">
         <view class="question-head">
@@ -76,13 +76,13 @@
 
       <view class="question-card">
         <view class="question-title">补充说明</view>
-        <textarea class="custom-input note-input" placeholder="可补充睡眠、饮食、近期不适等信息(选填)" bindinput="updateExtraNote" value="{{extraNote}}"></textarea>
+        <textarea class="custom-input note-input" placeholder="可补充睡眠、饮食、近期状态等信息(选填)" bindinput="updateExtraNote" value="{{extraNote}}"></textarea>
       </view>
     </block>
   </view>
 
   <view class="bottom-action">
-    <view wx:if="{{currentStep == 0}}" class="action-btn" bindtap="goQuestionsStep">下一步:问诊填写</view>
+    <view wx:if="{{currentStep == 0}}" class="action-btn" bindtap="goQuestionsStep">下一步:健康问答</view>
     <view wx:if="{{currentStep == 1}}" class="action-group">
       <view class="secondary-btn" bindtap="goBackStep">返回上一步</view>
       <view class="action-btn submit {{submitting ? 'disabled-btn' : ''}}" bindtap="submitExam">{{submitting ? '提交中...' : '提交并生成报告'}}</view>
@@ -91,7 +91,7 @@
 
   <view class="mask" wx:if="{{showUserPopup}}" bindtap="closeUserPopup">
     <view class="popup user-popup" catchtap="noop">
-      <view class="popup-title">选择检测人</view>
+      <view class="popup-title">选择成员</view>
       <view class="user-item {{currentUser && currentUser.ID == item.ID ? 'current-user' : ''}}" wx:for="{{scaleUsers}}" wx:key="ID" data-user="{{item}}" bindtap="selectUser">
       <view class="user-item-main">
           <view class="user-item-name">{{item.nickName}}</view>

+ 10 - 9
packageWellness/pages/tcm/report/report.js

@@ -1,4 +1,5 @@
 var tcm = require('../../../../utils/tcm.js')
+var compliance = require('../../../../utils/compliance.js')
 
 Page({
   data: {
@@ -76,7 +77,7 @@ Page({
         questionList: that.buildQuestionList(data.questionAnswersLocalizedExpanded || {}),
         sectionList: that.buildSectionList(aiSections),
         imageList: that.buildImageList(exam.observationImagesOss || exam.observationImages || {}),
-        errorMessage: aiSections && aiSections.error ? aiSections.error : '',
+        errorMessage: aiSections && aiSections.error ? compliance.sanitizeText(aiSections.error) : '',
         reportTime: that.formatDateTime(exam.CreatedAt || '')
       })
 
@@ -91,7 +92,7 @@ Page({
       that.setData({
         loading: false,
         status: 'error',
-        errorMessage: err && err.message ? err.message : '报告加载失败'
+        errorMessage: err && err.message ? compliance.sanitizeText(err.message) : '报告加载失败'
       })
     })
   },
@@ -99,12 +100,12 @@ Page({
   buildQuestionList: function (source) {
     var list = []
     if (Array.isArray(source)) {
-      return source
+      return compliance.sanitizeValue(source)
     }
     for (var key in source) {
       list.push({
-        title: key,
-        value: Array.isArray(source[key]) ? source[key].join(',') : source[key]
+        title: compliance.sanitizeText(key),
+        value: compliance.sanitizeText(Array.isArray(source[key]) ? source[key].join(',') : source[key])
       })
     }
     return list
@@ -113,9 +114,9 @@ Page({
   buildSectionList: function (aiSections) {
     var mapping = [
       { key: 'general', title: '一般情况', badge: '壹' },
-      { key: 'inquiry', title: '问诊分析', badge: '贰' },
-      { key: 'observation', title: '望诊分析', badge: '叁' },
-      { key: 'constitution', title: '体质辨识', badge: '肆' },
+      { key: 'inquiry', title: '健康问答分析', badge: '贰' },
+      { key: 'observation', title: '图片分析', badge: '叁' },
+      { key: 'constitution', title: '体质分析', badge: '肆' },
       { key: 'advice', title: '调养建议', badge: '伍' },
       { key: 'summary', title: '报告摘要', badge: '陆' }
     ]
@@ -126,7 +127,7 @@ Page({
           key: mapping[i].key,
           badge: mapping[i].badge,
           title: mapping[i].title,
-          content: aiSections[mapping[i].key]
+          content: compliance.sanitizeText(aiSections[mapping[i].key])
         })
       }
     }

+ 1 - 1
packageWellness/pages/tcm/report/report.json

@@ -1,3 +1,3 @@
 {
-  "navigationBarTitleText": "诊疗报告"
+  "navigationBarTitleText": "AI分析报告"
 }

+ 9 - 9
packageWellness/pages/tcm/report/report.wxml

@@ -2,14 +2,14 @@
   <view wx:if="{{loading}}" class="state-box">报告加载中...</view>
 
   <view wx:elif="{{status == 'empty'}}" class="state-card">
-    <view class="state-title">暂无诊疗报告</view>
-    <view class="state-desc">完成一次 AI 舌诊后,这里会展示最新报告。</view>
-    <view class="state-btn" bindtap="goDiagnosis">立即检测</view>
+    <view class="state-title">暂无评估报告</view>
+    <view class="state-desc">完成一次 AI 健康评估后,这里会展示最新报告。</view>
+    <view class="state-btn" bindtap="goDiagnosis">开始评估</view>
   </view>
 
   <view wx:elif="{{status == 'pending' || status == 'generating'}}" class="state-card generating-card">
     <view class="state-title">AI 正在生成报告</view>
-    <view class="state-desc">系统已接收本次诊疗信息,通常需要几十秒,请耐心等待。</view>
+    <view class="state-desc">系统已接收本次评估信息,通常需要几十秒,请耐心等待。</view>
     <view class="loading-dot"></view>
   </view>
 
@@ -25,9 +25,9 @@
         <view class="hero-main">
           <view class="hero-badge-wrap">
             <image class="hero-badge-icon" src="/images/footer/wellnessc.png" mode="aspectFit"></image>
-            <view class="hero-badge">中医诊疗</view>
+            <view class="hero-badge">AI健康评估</view>
           </view>
-          <view class="hero-title">AI 舌诊报告</view>
+          <view class="hero-title">AI 分析报告</view>
           <view class="hero-sub">{{scaleUser ? scaleUser.nickName : '当前用户'}}<text wx:if="{{reportTime}}"> · {{reportTime}}</text></view>
         </view>
         <view class="hero-status">{{exam && exam.status == 'completed' ? '已完成' : '生成中'}}</view>
@@ -64,7 +64,7 @@
     <view class="info-card" wx:if="{{questionList.length}}">
       <view class="card-head">
         <view class="card-accent"></view>
-        <view class="card-title">问诊记录</view>
+        <view class="card-title">健康问答记录</view>
       </view>
       <view class="question-item" wx:for="{{questionList}}" wx:key="title">
         <view class="question-title">{{item.title}}</view>
@@ -75,7 +75,7 @@
     <view class="info-card" wx:if="{{imageList.length}}">
       <view class="card-head">
         <view class="card-accent"></view>
-        <view class="card-title">检测图片</view>
+        <view class="card-title">上传图片</view>
       </view>
       <view class="image-list">
         <view class="image-item" wx:for="{{imageList}}" wx:key="title">
@@ -98,7 +98,7 @@
         <view class="card-accent warn"></view>
         <view class="card-title small">AI 生成内容提示</view>
       </view>
-      <view class="section-content">本报告由人工智能技术辅助生成,分析结果仅供健康参考,不构成医疗诊断或治疗建议。如有明显不适,请及时咨询专业医疗机构和医生。</view>
+      <view class="section-content">本报告由人工智能技术辅助生成,分析结果仅供健康参考,不构成专业建议。如需进一步了解身体状态,请及时咨询专业健康顾问。</view>
     </view>
   </view>
 </view>

+ 1 - 1
packageWellness/pages/tcm/user-form/user-form.js

@@ -31,7 +31,7 @@ var OCCUPATION_OPTIONS = [
   { value: 'it_programmer', label: 'IT/程序员' },
   { value: 'driver', label: '司机(出租车/货运/公交等)' },
   { value: 'teacher', label: '教师/培训师' },
-  { value: 'medical_staff', label: '医护人员' },
+  { value: 'medical_staff', label: '健康护理人员' },
   { value: 'service_industry', label: '服务行业(餐饮/零售/酒店等)' },
   { value: 'heavy_labor', label: '重体力劳动(建筑/搬运/制造等)' },
   { value: 'outdoor_worker', label: '户外工作者(农业/快递/外卖等)' },

+ 1 - 1
packageWellness/pages/tcm/user-form/user-form.json

@@ -1,3 +1,3 @@
 {
-  "navigationBarTitleText": "添加检测人"
+  "navigationBarTitleText": "添加成员"
 }

+ 3 - 3
packageWellness/pages/tcm/user-form/user-form.wxml

@@ -1,7 +1,7 @@
 <view class="user-form-page">
   <view class="hero-card">
-    <view class="hero-badge">检测人资料</view>
-    <view class="hero-title">{{isEditMode ? '编辑检测人' : '新增检测人'}}</view>
+    <view class="hero-badge">成员资料</view>
+    <view class="hero-title">{{isEditMode ? '编辑成员' : '新增成员'}}</view>
     <view class="hero-desc">与 APP 保持一致,支持昵称、性别、生日、身高、目标体重、国家、人种、职业。</view>
   </view>
 
@@ -63,5 +63,5 @@
     </picker>
   </view>
 
-  <view class="submit-btn {{saving ? 'submit-btn-disabled' : ''}}" bindtap="submitForm">{{saving ? '保存中...' : '保存检测人'}}</view>
+  <view class="submit-btn {{saving ? 'submit-btn-disabled' : ''}}" bindtap="submitForm">{{saving ? '保存中...' : '保存成员'}}</view>
 </view>

+ 0 - 5
pages/user/all/all.js

@@ -545,11 +545,6 @@ console.log('getUserProfile')
       url: '/packageUser/pages/user/identity/identity'
     })
   },
-  // toBankInfo () {
-  //   wx.navigateTo({
-  //     url: '/packageUser/pages/user/bankinfo/bankinfo'
-  //   })
-  // },
   toAddressList () {
     wx.navigateTo({
       url: '/packageUser/pages/user/address/address'

+ 0 - 4
pages/user/all/all.wxml

@@ -168,10 +168,6 @@
         <view class="user-line__title">会员认证</view>
         <image class="user-line__right" src="https://cfohow.hiwavo.com/xcx/user/right.png"></image>
       </view> -->
-      <!-- <view class="user-line" bindtap="toBankInfo">
-        <view class="user-line__title">银行信息</view>
-        <image class="user-line__right" src="https://cfohow.hiwavo.com/xcx/user/right.png"></image>
-      </view> -->
       <view class="user-line" bindtap="toAddressList">
         <view class="user-line__title">收货地址</view>
         <image class="user-line__right" src="https://cfohow.hiwavo.com/xcx/user/right.png"></image>

+ 7 - 6
pages/wellness/wellness.js

@@ -1,4 +1,5 @@
 var tcm = require('../../utils/tcm.js')
+var compliance = require('../../utils/compliance.js')
 
 Page({
   data: {
@@ -52,7 +53,7 @@ Page({
         that.setData({
           latestExam: null,
           latestExamSummary: '',
-          latestExamStatusText: '添加检测人后即可开始 AI 舌诊'
+          latestExamStatusText: '添加成员后即可开始 AI 健康评估'
         })
       }
     }).catch(function () {
@@ -79,7 +80,7 @@ Page({
       that.setData({
         latestExam: null,
         latestExamSummary: '',
-        latestExamStatusText: '暂无诊疗报告'
+        latestExamStatusText: '暂无评估报告'
       })
     })
   },
@@ -92,16 +93,16 @@ Page({
       return '最新报告生成中'
     }
     if (status === 'failed') {
-      return '上次诊疗生成失败,可重新检测'
+      return '上次评估生成失败,可重新评估'
     }
-    return '暂无诊疗报告'
+    return '暂无评估报告'
   },
 
   getLatestExamSummary: function (aiSections) {
     if (!aiSections) {
       return ''
     }
-    return aiSections.summary || aiSections.general || aiSections.observation || ''
+    return compliance.sanitizeText(aiSections.summary || aiSections.general || aiSections.observation || '')
   },
 
   goDiagnosis: function () {
@@ -113,7 +114,7 @@ Page({
   goLatestReport: function () {
     if (!this.data.currentUser || !this.data.currentUser.ID) {
       wx.showToast({
-        title: '请先添加检测人',
+        title: '请先添加成员',
         icon: 'none'
       })
       return

+ 11 - 11
pages/wellness/wellness.wxml

@@ -4,11 +4,11 @@
       <image class="hero-icon" src="/images/footer/wellnessc.png" mode="aspectFit"></image>
       <view class="hero-badge">康养中心</view>
     </view>
-    <view class="hero-title">AI舌诊 · 中医诊疗</view>
+    <view class="hero-title">AI健康评估</view>
     <view class="hero-user" wx:if="{{currentUser}}">
-      当前检测人:{{currentUser.nickName}} · {{currentUser.sex == 1 ? '女' : '男'}} · {{currentUser.height || '--'}}cm
+      当前成员:{{currentUser.nickName}} · {{currentUser.sex == 1 ? '女' : '男'}} · {{currentUser.height || '--'}}cm
     </view>
-    <view class="hero-user" wx:else>当前检测人:未设置</view>
+    <view class="hero-user" wx:else>当前成员:未设置</view>
   </view>
 
   <view class="summary-card" bindtap="goLatestReport">
@@ -16,8 +16,8 @@
       <view class="summary-title">康养档案</view>
       <view class="summary-status">{{latestExamStatusText}}</view>
       <view class="summary-text" wx:if="{{latestExamSummary}}">{{latestExamSummary}}</view>
-      <view class="summary-time" wx:if="{{latestExam && latestExam.CreatedAt}}">最近检测:{{latestExam.CreatedAt}}</view>
-      <view class="summary-time" wx:else>查看最新检测人的舌诊报告</view>
+      <view class="summary-time" wx:if="{{latestExam && latestExam.CreatedAt}}">最近评估:{{latestExam.CreatedAt}}</view>
+      <view class="summary-time" wx:else>查看当前成员的AI分析报告</view>
     </view>
     <view class="summary-action">查看报告</view>
   </view>
@@ -28,8 +28,8 @@
     <view class="feature-top">
       <view class="feature-main">
         <view class="feature-tag">AI 智能分析</view>
-        <view class="feature-title">中医诊疗</view>
-        <view class="feature-subtitle">舌面、舌下、面部上传 + 问诊生成报告</view>
+        <view class="feature-title">AI健康评估</view>
+        <view class="feature-subtitle">舌面、舌下、面部上传 + 健康问答生成报告</view>
       </view>
       <view class="feature-icon">
         <image class="feature-icon-image" src="/images/footer/wellnessc.png" mode="aspectFit"></image>
@@ -38,16 +38,16 @@
     <view class="feature-points">
       <view class="feature-point">3 张关键照片</view>
       <view class="feature-point">全身照选填</view>
-      <view class="feature-point">动态问诊</view>
+      <view class="feature-point">动态健康问答</view>
       <view class="feature-point">AI 调养建议</view>
     </view>
-    <view class="feature-btn">立即检测</view>
+    <view class="feature-btn">开始评估</view>
   </view>
 
-  <view class="section-title">检测须知</view>
+  <view class="section-title">拍摄须知</view>
   <view class="tips-card">
     <view class="tips-item">自然光或均匀灯光下拍摄,避免逆光和强曝光。</view>
     <view class="tips-item">保持镜头稳定,对焦清晰,确保舌面纹理可见。</view>
-    <view class="tips-item">AI 报告仅供健康参考,不替代专业医疗诊断。</view>
+    <view class="tips-item">AI 报告仅供健康参考,不能替代专业健康顾问的建议。</view>
   </view>
 </view>

+ 0 - 9
project.private.config.json

@@ -1,9 +0,0 @@
-{
-  "setting": {
-    "urlCheck": false,
-    "compileHotReLoad": true
-  },
-  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
-  "projectname": "fohowXcx",
-  "libVersion": "3.14.0"
-}

+ 88 - 0
utils/compliance.js

@@ -0,0 +1,88 @@
+var REPLACE_RULES = [
+  ['\u7981\u5fcc\uff1a\u4e0d\u8981\u5728\u98df\u7528\u6709\u8272\u996e\u98df\u6216\u836f\u7269\u540e', '注意:不要在食用有色饮食或保健品后'],
+  ['\u7528\u4e8e\u62cd\u6444\u820c\u8c61/\u9762\u90e8\u7167\u7247\u4ee5\u8fdb\u884c\u4e2d\u533b\u8bca\u65ad', '用于拍摄舌象/面部照片以进行AI健康分析'],
+  ['\u672c\u529f\u80fd\u4f7f\u7528\u4eba\u5de5\u667a\u80fd\u6280\u672f\u5bf9\u60a8\u63d0\u4f9b\u7684\u820c\u8c61\u3001\u9762\u8c61\u53ca\u95ee\u8bca\u4fe1\u606f', '本功能使用人工智能技术对您提供的舌象、面象及健康问答信息'],
+  ['\u4e0d\u80fd\u66ff\u4ee3\u4e13\u4e1a\u533b\u751f\u7684\u8bca\u65ad', '不能替代专业健康顾问的建议'],
+  ['\u54a8\u8be2\u4e13\u4e1a\u533b\u7597\u673a\u6784\u548c\u533b\u751f', '咨询专业健康顾问'],
+  ['\u524d\u5f80\u6b63\u89c4\u533b\u7597\u673a\u6784\u5c31\u8bca', '前往正规健康机构咨询'],
+  ['\u533b\u7597\u8bca\u65ad\u6216\u6cbb\u7597\u5efa\u8bae', '专业建议'],
+  ['\u4e0d\u6784\u6210\u4efb\u4f55\u533b\u7597\u8bca\u65ad\u6216\u6cbb\u7597\u5efa\u8bae', '仅供参考,不构成专业建议'],
+  ['AI\u5065\u5eb7\u5206\u6790\u77e5\u60c5\u540c\u610f', 'AI健康评估知情同意'],
+  ['AI\u820c\u8bca\u00b7\u95ee\u8bca', 'AI健康评估'],
+  ['\u4e2d\u533b\u8bca\u7597', 'AI健康评估'],
+  ['\u4e2d\u533b\u8bca\u65ad', 'AI健康分析'],
+  ['\u533b\u7597\u8bca\u65ad', '健康分析'],
+  ['\u6cbb\u7597\u5efa\u8bae', '专业建议'],
+  ['\u671b\u8bca\u5206\u6790', '图片分析'],
+  ['\u671b\u8bca\u56fe\u7247', '图片分析'],
+  ['\u8bca\u65ad\u7ed3\u679c', '分析报告'],
+  ['\u8bca\u65ad\u8bb0\u5f55', '评估记录'],
+  ['\u8bca\u65ad\u7528\u8bed', '分析内容'],
+  ['\u8bca\u7597\u8bb0\u5f55', '评估记录'],
+  ['\u8bca\u7597\u65f6\u95f4', '评估时间'],
+  ['\u820c\u8bca', '舌头分析'],
+  ['\u9762\u8bca', '面部分析'],
+  ['\u95ee\u8bca', '健康问答'],
+  ['\u671b\u8bca', '图片分析'],
+  ['\u8bca\u7597', '评估'],
+  ['\u8bca\u65ad', '分析'],
+  ['\u836f\u7269', '保健品'],
+  ['\u7981\u5fcc', '注意'],
+  ['\u533b\u62a4\u4eba\u5458', '健康护理人员']
+]
+
+var GENERAL_RULES = [
+  ['\u5904\u65b9', '建议'],
+  ['\u786e\u8bca', '分析'],
+  ['\u6cbb\u6108', '改善'],
+  ['\u6cbb\u7597', '调理'],
+  ['\u5c31\u8bca', '咨询'],
+  ['\u533b\u751f', '健康顾问'],
+  ['\u533b\u7597', '健康'],
+  ['\u75be\u75c5', '健康状态'],
+  ['\u75c5\u75c7', '状态'],
+  ['\u75c7\u72b6', '状态'],
+  ['\u60a3\u8005', '用户'],
+  ['\u75c5\u4eba', '用户'],
+  ['\u7528\u836f', '保养'],
+  ['\u7597\u6548', '效果'],
+  ['\u533b\u9662', '健康机构']
+]
+
+function sanitizeText(value) {
+  if (value === undefined || value === null) {
+    return value
+  }
+  var text = String(value)
+  for (var i = 0; i < REPLACE_RULES.length; i++) {
+    text = text.split(REPLACE_RULES[i][0]).join(REPLACE_RULES[i][1])
+  }
+  for (var j = 0; j < GENERAL_RULES.length; j++) {
+    text = text.split(GENERAL_RULES[j][0]).join(GENERAL_RULES[j][1])
+  }
+  return text
+}
+
+function sanitizeValue(value) {
+  if (typeof value === 'string' || typeof value === 'number') {
+    return sanitizeText(value)
+  }
+  if (Array.isArray(value)) {
+    return value.map(function (item) {
+      return sanitizeValue(item)
+    })
+  }
+  if (value && typeof value === 'object') {
+    var next = {}
+    for (var key in value) {
+      next[key] = sanitizeValue(value[key])
+    }
+    return next
+  }
+  return value
+}
+
+module.exports = {
+  sanitizeText: sanitizeText,
+  sanitizeValue: sanitizeValue
+}

+ 0 - 11
utils/modules.js

@@ -1,11 +0,0 @@
-
-const state = {
-  ceshi: 2,
-  projectList: {
-    total: 0,
-    more: true
-  }
-}
-module.exports = {
-  state: state
-}

+ 4 - 4
utils/request.js

@@ -1,12 +1,12 @@
 
 
 // 新正式
-const apiHost = 'https://xcx-api.fohowyc.com/';
-const apiHostX = 'https://app-api.fohowyc.com/';//正式
+  const apiHost = 'https://xcx-api.fohowyc.com/';
+  const apiHostX = 'https://app-api.fohowyc.com/';//正式
 
 // 测试
- //const apiHost = 'https://tfohowapi.hiwavo.com/';
- //const apiHostX = 'https://txj.hiwavo.com/';
+  // const apiHost = 'https://tfohowapi.hiwavo.com/';
+  // const apiHostX = 'https://txj.hiwavo.com/';