Browse Source

用户联调

master
kola-web 4 days ago
parent
commit
8f15bab3e2
  1. 46
      api-doc/charlie.md
  2. 647
      api-doc/psvt-patient-api-doc.md
  3. 12
      src/app.json
  4. 16
      src/app.ts
  5. 10
      src/components/pickerArea/index.scss
  6. 2
      src/components/pickerArea/index.wxml
  7. 1
      src/components/popup/index.ts
  8. 4
      src/components/popup/index.wxml
  9. 4
      src/components/uploadFile/index.wxml
  10. 2
      src/custom-tab-bar/index.wxml
  11. 120
      src/doc/pages/doc/index.ts
  12. 26
      src/doc/pages/doc/index.wxml
  13. 21
      src/doc/pages/doc1/index.scss
  14. 31
      src/doc/pages/doc1/index.ts
  15. 6
      src/doc/pages/doc2/index.json
  16. 3
      src/doc/pages/doc2/index.scss
  17. 10
      src/doc/pages/doc2/index.ts
  18. 3
      src/doc/pages/doc2/index.wxml
  19. 6
      src/doc/pages/doc3/index.json
  20. 3
      src/doc/pages/doc3/index.scss
  21. 10
      src/doc/pages/doc3/index.ts
  22. 3
      src/doc/pages/doc3/index.wxml
  23. 6
      src/doc/pages/doc4/index.json
  24. 3
      src/doc/pages/doc4/index.scss
  25. 10
      src/doc/pages/doc4/index.ts
  26. 3
      src/doc/pages/doc4/index.wxml
  27. 6
      src/doc/pages/doc5/index.json
  28. 3
      src/doc/pages/doc5/index.scss
  29. 10
      src/doc/pages/doc5/index.ts
  30. 3
      src/doc/pages/doc5/index.wxml
  31. BIN
      src/images/tabbar/tabbar1-1-active.png
  32. BIN
      src/images/tabbar/tabbar1-1.png
  33. BIN
      src/images/tabbar/tabbar1-2-active.png
  34. BIN
      src/images/tabbar/tabbar1-2.png
  35. BIN
      src/images/tabbar/tabbar1-3-active.png
  36. BIN
      src/images/tabbar/tabbar1-3.png
  37. BIN
      src/images/tabbar/tabbar1-4-active.png
  38. BIN
      src/images/tabbar/tabbar1-4.png
  39. 16
      src/pages/articleDetail/index.wxml
  40. 4
      src/pages/changeTel/index.json
  41. 51
      src/pages/changeTel/index.scss
  42. 91
      src/pages/changeTel/index.ts
  43. 32
      src/pages/changeTel/index.wxml
  44. 4
      src/pages/confirmInfo/index.json
  45. 1
      src/pages/confirmInfo/index.scss
  46. 72
      src/pages/confirmInfo/index.ts
  47. 127
      src/pages/confirmInfo/index.wxml
  48. 6
      src/pages/drugMap/index.wxml
  49. 1
      src/pages/followDetail/index.ts
  50. 4
      src/pages/followDetail/index.wxml
  51. 1
      src/pages/followForm/index.ts
  52. 2
      src/pages/followForm/index.wxml
  53. 1
      src/pages/health/index.ts
  54. 14
      src/pages/health/index.wxml
  55. 1
      src/pages/heartDetail/index.ts
  56. 2
      src/pages/heartDetail/index.wxml
  57. 1
      src/pages/heartForm/index.ts
  58. 2
      src/pages/heartForm/index.wxml
  59. 1
      src/pages/hotTopic/index.ts
  60. 2
      src/pages/hotTopic/index.wxml
  61. 1
      src/pages/hotTopicDetail/index.ts
  62. 20
      src/pages/hotTopicDetail/index.wxml
  63. 1
      src/pages/index/index.ts
  64. 24
      src/pages/index/index.wxml
  65. 47
      src/pages/login/index.scss
  66. 113
      src/pages/login/index.ts
  67. 36
      src/pages/login/index.wxml
  68. 3
      src/pages/my/index.json
  69. 6
      src/pages/my/index.scss
  70. 126
      src/pages/my/index.ts
  71. 32
      src/pages/my/index.wxml
  72. 1
      src/pages/myCollection/index.ts
  73. 16
      src/pages/myCollection/index.wxml
  74. 1
      src/pages/myComment/index.ts
  75. 6
      src/pages/myComment/index.wxml
  76. 1
      src/pages/myWall/index.ts
  77. 10
      src/pages/myWall/index.wxml
  78. 7
      src/pages/userInfo/index.json
  79. 18
      src/pages/userInfo/index.scss
  80. 261
      src/pages/userInfo/index.ts
  81. 76
      src/pages/userInfo/index.wxml
  82. 8
      src/pages/videoDetail/index.wxml
  83. 1
      src/pages/videoList/index.ts
  84. 12
      src/pages/videoList/index.wxml
  85. 1
      src/pages/wall/index.ts
  86. 22
      src/pages/wall/index.wxml
  87. 1
      src/pages/wallDetail/index.ts
  88. 34
      src/pages/wallDetail/index.wxml
  89. 1
      src/pages/wallForm/index.ts
  90. 18
      src/pages/wallForm/index.wxml
  91. 16
      src/pages/wechatWork/index.wxml

46
api-doc/charlie.md

File diff suppressed because one or more lines are too long

647
api-doc/psvt-patient-api-doc.md

@ -8,12 +8,13 @@ @@ -8,12 +8,13 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| code | string | 是 | wx.login获取的登录凭证 |
| channelId | int | 否 | 扫码渠道ID |
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------ | ---- | ---------------------- |
| code | string | 是 | wx.login获取的登录凭证 |
| channelId | int | 否 | 扫码渠道ID |
**响应示例**:
```json
{
"code": 0,
@ -22,23 +23,23 @@ @@ -22,23 +23,23 @@
"isLogin": true,
"isReg": true,
"userId": "xxx",
"openId": "xxx",
"openId": "xxx"
}
}
```
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| 字段名 | 类型 | 说明 |
| ---------- | ------ | -------------------------- |
| loginState | string | 登录态凭证,后续接口需携带 |
| isLogin | bool | 是否已登录 |
| userId | string | 用户ID |
| openId | string | 小程序OpenId |
| isPhoneRegistered | bool | 是否已手机号注册 |
| isInfoSubmitted | bool | 是否已提交信息 |
| isLogin | bool | 是否已登录 |
| userId | string | 用户ID |
| openId | string | 小程序OpenId |
| isReg | bool | 是否已信息提交注册 |
**业务逻辑**:
1. 调用微信接口获取openid和session_key
2. 创建/更新PSVT用户记录(t_psvt_user_info)
3. 若有channelId参数,更新ScanChannelId(最终渠道,每次扫码都更新)
@ -47,38 +48,40 @@ @@ -47,38 +48,40 @@
---
### 1.2 手机号授权注册 `POST ?r=psvt/patient/phone-register`
### 1.2 手机号授权注册 `POST ?r=psvt/login/wx-reg-login`
**说明**: 解密微信加密数据获取手机号,完成手机号注册。事务操作。
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| encryptedData | string | 是 | 微信加密手机号数据 |
| iv | string | 是 | 微信加密iv |
| channelId | int | 否 | 手机号注册时的渠道ID |
| 参数名 | 类型 | 必填 | 说明 |
| ------------- | ------ | ---- | -------------------- |
| encryptedData | string | 是 | 微信加密手机号数据 |
| iv | string | 是 | 微信加密iv |
| channelId | int | 否 | 手机号注册时的渠道ID |
**响应示例**:
```json
{
"code": 0,
"message": "success",
"data": {
"telephone": "138xxxx1234",
"isPhoneRegistered": true
"isLogin": true,
"isReg": true
}
}
```
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| telephone | string | 注册的手机号 |
| isPhoneRegistered | bool | 是否已手机号注册 |
| 字段名 | 类型 | 说明 |
| ------- | ---- | ------------------ |
| isLogin | bool | 是否已登录 |
| isReg | bool | 是否已信息提交注册 |
**业务逻辑**:
1. 解密微信加密数据获取手机号
2. 更新t_psvt_user_info的Telephone、IsPhoneRegistered=1、PhoneRegisterTime
3. 若有channelId,记录TelChannelId(首次手机号注册渠道,仅记录首次,不更新)
@ -89,26 +92,59 @@ @@ -89,26 +92,59 @@
---
### 1.2.1 手机号验证码注册 `POST ?r=psvt/login/reg-login`
**说明**: 解密微信加密数据获取手机号,完成手机号注册。事务操作。
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------ | ---- | -------------------- |
| mobile | string | 是 | 手机号 |
| code | string | 是 | 验证码 |
| channelId | int | 否 | 手机号注册时的渠道ID |
**响应示例**:
```json
{
"code": 0,
"message": "success",
"data": {
"isLogin": true,
"isReg": true
}
}
```
**响应字段说明**:
| 字段名 | 类型 | 说明 |
| ------- | ---- | ------------------ |
| isLogin | bool | 是否已登录 |
| isReg | bool | 是否已信息提交注册 |
### 1.3 患者信息提交注册 `POST ?r=psvt/patient/register`
**说明**: 提交年龄段、性别、确诊状态、手术状态等信息完成注册。事务操作。
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ageRange | int | 是 | 年龄段:1-18~28岁,2-29~40岁,3-41~50岁,4-50岁以上 |
| gender | int | 是 | 性别:1-男,2-女 |
| provinceId | int | 否 | 省份ID |
| provinceName | string | 否 | 省份名称 |
| cityId | int | 否 | 市ID |
| cityName | string | 否 | 市名称 |
| diagnosisStatus | int | 是 | 确诊状态:1-疑似PSVT正在了解中,2-已确诊PSVT,3-心悸/心跳过快 尚未就诊,4-亲友相关 想了解更多 |
| diagnosisTime | string | 否 | 确诊时间(YYYY-MM格式) |
| surgeryStatus | int | 是 | 手术状态:1-已接收射频消融/相关手术,2-尚未接收手术,3-正在评估 |
| channelId | int | 否 | 提交信息渠道ID |
| 参数名 | 类型 | 必填 | 说明 |
| --------------- | ------ | ---- | --------------------------------------------------------------------------------------------- |
| ageRange | int | 是 | 年龄段:1-18~28岁,2-29~40岁,3-41~50岁,4-50岁以上 |
| gender | int | 是 | 性别:1-男,2-女 |
| provinceId | int | 否 | 省份ID |
| provinceName | string | 否 | 省份名称 |
| cityId | int | 否 | 市ID |
| cityName | string | 否 | 市名称 |
| diagnosisStatus | int | 是 | 确诊状态:1-疑似PSVT正在了解中,2-已确诊PSVT,3-心悸/心跳过快 尚未就诊,4-亲友相关 想了解更多 |
| diagnosisTime | string | 否 | 确诊时间(YYYY-MM格式) |
| surgeryStatus | int | 是 | 手术状态:1-已接收射频消融/相关手术,2-尚未接收手术,3-正在评估 |
| channelId | int | 否 | 提交信息渠道ID |
**响应示例**:
```json
{
"code": 0,
@ -124,14 +160,15 @@ @@ -124,14 +160,15 @@
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| userId | string | 用户ID |
| nickName | string | 随机生成的昵称(4字母+8数字) |
| avatar | string | 随机分配的头像URL |
| isRegistered | bool | 是否已注册 |
| 字段名 | 类型 | 说明 |
| ------------ | ------ | ----------------------------- |
| userId | string | 用户ID |
| nickName | string | 随机生成的昵称(4字母+8数字) |
| avatar | string | 随机分配的头像URL |
| isRegistered | bool | 是否已注册 |
**业务逻辑**:
1. 生成随机昵称(4随机字母+8随机数字)
2. 随机分配头像(10张图片池中随机选1)
3. 创建t_psvt_patient_info记录(患者属性)
@ -150,6 +187,7 @@ @@ -150,6 +187,7 @@
**请求参数**: 无(通过loginState获取userId)
**响应示例**:
```json
{
"code": 0,
@ -179,26 +217,26 @@ @@ -179,26 +217,26 @@
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| userId | string | 用户ID |
| openId | string | 小程序OpenId |
| telephone | string | 手机号 |
| isPhoneRegistered | bool | 是否已手机号注册 |
| isInfoSubmitted | bool | 是否已提交信息 |
| isHeartRateTips | bool | 是否开启心率提醒 |
| firstOpenTime | string | 首次打开时间 |
| phoneRegisterTime | string | 手机号注册时间 |
| infoSubmitTime | string | 信息提交时间 |
| nickName | string | 昵称(未提交信息时为null) |
| avatar | string | 头像URL(未提交信息时为null) |
| ageRange | int | 年龄段(未提交信息时为null) |
| gender | int | 性别(未提交信息时为null) |
| provinceName | string | 省份名称(未提交信息时为null) |
| cityName | string | 市名称(未提交信息时为null) |
| diagnosisStatus | int | 确诊状态(未提交信息时为null) |
| diagnosisTime | string | 确诊时间(未提交信息时为null) |
| surgeryStatus | int | 手术状态(未提交信息时为null) |
| 字段名 | 类型 | 说明 |
| ----------------- | ------ | ------------------------------ |
| userId | string | 用户ID |
| openId | string | 小程序OpenId |
| telephone | string | 手机号 |
| isPhoneRegistered | bool | 是否已手机号注册 |
| isInfoSubmitted | bool | 是否已提交信息 |
| isHeartRateTips | bool | 是否开启心率提醒 |
| firstOpenTime | string | 首次打开时间 |
| phoneRegisterTime | string | 手机号注册时间 |
| infoSubmitTime | string | 信息提交时间 |
| nickName | string | 昵称(未提交信息时为null) |
| avatar | string | 头像URL(未提交信息时为null) |
| ageRange | int | 年龄段(未提交信息时为null) |
| gender | int | 性别(未提交信息时为null) |
| provinceName | string | 省份名称(未提交信息时为null) |
| cityName | string | 市名称(未提交信息时为null) |
| diagnosisStatus | int | 确诊状态(未提交信息时为null) |
| diagnosisTime | string | 确诊时间(未提交信息时为null) |
| surgeryStatus | int | 手术状态(未提交信息时为null) |
---
@ -208,22 +246,23 @@ @@ -208,22 +246,23 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| avatar | string | 否 | 头像URL |
| nickName | string | 否 | 昵称 |
| telephone | string | 否 | 手机号 |
| ageRange | int | 否 | 年龄段 |
| gender | int | 否 | 性别 |
| provinceId | int | 否 | 省份ID |
| provinceName | string | 否 | 省份名称 |
| cityId | int | 否 | 市ID |
| cityName | string | 否 | 市名称 |
| diagnosisStatus | int | 否 | 确诊状态(已确诊PSVT后不可修改) |
| diagnosisTime | string | 否 | 确诊时间 |
| surgeryStatus | int | 否 | 手术状态(已确诊PSVT后不可修改) |
| 参数名 | 类型 | 必填 | 说明 |
| --------------- | ------ | ---- | -------------------------------- |
| avatar | string | 否 | 头像URL |
| nickName | string | 否 | 昵称 |
| telephone | string | 否 | 手机号 |
| ageRange | int | 否 | 年龄段 |
| gender | int | 否 | 性别 |
| provinceId | int | 否 | 省份ID |
| provinceName | string | 否 | 省份名称 |
| cityId | int | 否 | 市ID |
| cityName | string | 否 | 市名称 |
| diagnosisStatus | int | 否 | 确诊状态(已确诊PSVT后不可修改) |
| diagnosisTime | string | 否 | 确诊时间 |
| surgeryStatus | int | 否 | 手术状态(已确诊PSVT后不可修改) |
**响应示例**:
```json
{
"code": 0,
@ -254,6 +293,7 @@ @@ -254,6 +293,7 @@
**响应字段说明**: 同1.4获取我的信息
**业务逻辑**:
1. 若已确诊PSVT(DiagnosisStatus=2),则diagnosisStatus和surgeryStatus不可修改
2. 更新t_psvt_patient_info患者属性
3. 若更新了手机号,同步更新t_psvt_user_info的Telephone
@ -267,11 +307,12 @@ @@ -267,11 +307,12 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| channelId | int | 是 | 渠道码ID |
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ---- | ---- | -------- |
| channelId | int | 是 | 渠道码ID |
**响应示例**:
```json
{
"code": 0,
@ -284,11 +325,12 @@ @@ -284,11 +325,12 @@
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| 字段名 | 类型 | 说明 |
| -------- | ---- | ------------ |
| recorded | bool | 是否记录成功 |
**业务逻辑**:
1. 验证渠道码存在
2. 更新用户ScanChannelId(最终渠道,每次扫码都更新)
3. 记录邀约记录(InviteType=1用户打开)
@ -304,60 +346,66 @@ @@ -304,60 +346,66 @@
**请求参数**: 无
**响应示例**:
```json
{
"code": 0,
"message": "success",
"data": {
"genderList": [{"1": "男"}, {"2": "女"}],
"ageRangeList": [{"1": "18~28岁"}, {"2": "29~40岁"}, {"3": "41~50岁"}, {"4": "50岁以上"}],
"diagnosisStatusList": [{"1": "疑似PSVT正在了解中"}, {"2": "已确诊PSVT"}, {"3": "心悸/心跳过快 尚未就诊"}, {"4": "亲友相关 想了解更多"}],
"surgeryStatusList": [{"1": "已接收射频消融/相关手术"}, {"2": "尚未接收手术"}, {"3": "正在评估"}]
"genderList": [{ "1": "男" }, { "2": "女" }],
"ageRangeList": [{ "1": "18~28岁" }, { "2": "29~40岁" }, { "3": "41~50岁" }, { "4": "50岁以上" }],
"diagnosisStatusList": [
{ "1": "疑似PSVT正在了解中" },
{ "2": "已确诊PSVT" },
{ "3": "心悸/心跳过快 尚未就诊" },
{ "4": "亲友相关 想了解更多" }
],
"surgeryStatusList": [{ "1": "已接收射频消融/相关手术" }, { "2": "尚未接收手术" }, { "3": "正在评估" }]
}
}
```
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| genderList | array | 性别列表,每项为 {value: "label"} |
| ageRangeList | array | 年龄段列表,每项为 {value: "label"} |
| 字段名 | 类型 | 说明 |
| ------------------- | ----- | ------------------------------------- |
| genderList | array | 性别列表,每项为 {value: "label"} |
| ageRangeList | array | 年龄段列表,每项为 {value: "label"} |
| diagnosisStatusList | array | 确诊状态列表,每项为 {value: "label"} |
| surgeryStatusList | array | 手术状态列表,每项为 {value: "label"} |
| surgeryStatusList | array | 手术状态列表,每项为 {value: "label"} |
**genderList值说明**:
| 值 | 说明 |
|---|---|
| 1 | 男 |
| 2 | 女 |
| 值 | 说明 |
| --- | ---- |
| 1 | 男 |
| 2 | 女 |
**ageRangeList值说明**:
| 值 | 说明 |
|---|---|
| 1 | 18~28岁 |
| 2 | 29~40岁 |
| 3 | 41~50岁 |
| 4 | 50岁以上 |
| 值 | 说明 |
| --- | -------- |
| 1 | 18~28岁 |
| 2 | 29~40岁 |
| 3 | 41~50岁 |
| 4 | 50岁以上 |
**diagnosisStatusList值说明**:
| 值 | 说明 |
|---|---|
| 1 | 疑似PSVT正在了解中 |
| 2 | 已确诊PSVT |
| 3 | 心悸/心跳过快 尚未就诊 |
| 4 | 亲友相关 想了解更多 |
| 值 | 说明 |
| --- | ---------------------- |
| 1 | 疑似PSVT正在了解中 |
| 2 | 已确诊PSVT |
| 3 | 心悸/心跳过快 尚未就诊 |
| 4 | 亲友相关 想了解更多 |
**surgeryStatusList值说明**:
| 值 | 说明 |
|---|---|
| 1 | 已接收射频消融/相关手术 |
| 2 | 尚未接收手术 |
| 3 | 正在评估 |
| 值 | 说明 |
| --- | ----------------------- |
| 1 | 已接收射频消融/相关手术 |
| 2 | 尚未接收手术 |
| 3 | 正在评估 |
---
@ -369,14 +417,15 @@ @@ -369,14 +417,15 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| search | string | 否 | 搜索关键字(手机号/UserId/省市) |
| channelId | int | 否 | 渠道ID筛选 |
| page | int | 否 | 页码,默认1 |
| count | int | 否 | 每页数量,默认10 |
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------ | ---- | -------------------------------- |
| search | string | 否 | 搜索关键字(手机号/UserId/省市) |
| channelId | int | 否 | 渠道ID筛选 |
| page | int | 否 | 页码,默认1 |
| count | int | 否 | 每页数量,默认10 |
**响应示例**:
```json
{
"code": 0,
@ -430,56 +479,56 @@ @@ -430,56 +479,56 @@
**响应字段说明(data层级)**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| page | int | 当前页码 |
| pages | int | 总页数 |
| count | int | 总记录数 |
| 字段名 | 类型 | 说明 |
| ------- | ------ | ------------ |
| page | int | 当前页码 |
| pages | int | 总页数 |
| count | int | 总记录数 |
| summary | object | 汇合统计数据 |
| list | array | 患者列表 |
| list | array | 患者列表 |
**summary字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| totalOpenCount | int | 总打开数 |
| phoneRegisteredCount | int | 手机号注册数 |
| phoneRegisteredRate | string | 手机号注册率(百分比) |
| infoSubmittedCount | int | 信息提交数 |
| infoSubmittedRate | string | 信息提交率(百分比) |
| diagnosedPsvtCount | int | 确诊PSVT数 |
| diagnosedPsvtRate | string | 确诊PSVT率(百分比) |
| firstOpenPhoneRegisteredCount | int | 首次打开完成手机号注册数 |
| firstOpenInfoSubmittedCount | int | 首次打开完成信息填写数 |
| phoneRegisteredNotLostCount | int | 手机号注册后未流失数 |
| 字段名 | 类型 | 说明 |
| ----------------------------- | ------ | ------------------------ |
| totalOpenCount | int | 总打开数 |
| phoneRegisteredCount | int | 手机号注册数 |
| phoneRegisteredRate | string | 手机号注册率(百分比) |
| infoSubmittedCount | int | 信息提交数 |
| infoSubmittedRate | string | 信息提交率(百分比) |
| diagnosedPsvtCount | int | 确诊PSVT数 |
| diagnosedPsvtRate | string | 确诊PSVT率(百分比) |
| firstOpenPhoneRegisteredCount | int | 首次打开完成手机号注册数 |
| firstOpenInfoSubmittedCount | int | 首次打开完成信息填写数 |
| phoneRegisteredNotLostCount | int | 手机号注册后未流失数 |
**list行字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| userId | string | 用户ID |
| telephone | string | 手机号 |
| nickName | string | 昵称 |
| avatar | string | 头像URL |
| ageRange | int | 年龄段 |
| gender | int | 性别 |
| provinceName | string | 省份名称 |
| cityName | string | 市名称 |
| diagnosisStatus | int | 确诊状态 |
| diagnosisTime | string | 确诊时间 |
| surgeryStatus | int | 手术状态 |
| firstOpenTime | string | 首次打开时间 |
| phoneRegisterTime | string | 手机号注册时间 |
| infoSubmitTime | string | 信息提交时间 |
| isFirstOpenPhoneRegistered | bool | 首次打开完成手机号注册 |
| isFirstOpenInfoSubmitted | bool | 首次打开完成信息填写 |
| isPhoneRegisteredNotLost | bool | 手机号注册后未流失 |
| scanChannelId | int | 扫码渠道ID |
| scanChannelName | string | 扫码渠道名称 |
| telChannelId | int | 手机号注册渠道ID |
| telChannelName | string | 手机号注册渠道名称 |
| submitChannelId | int | 提交信息渠道ID |
| submitChannelName | string | 提交信息渠道名称 |
| 字段名 | 类型 | 说明 |
| -------------------------- | ------ | ---------------------- |
| userId | string | 用户ID |
| telephone | string | 手机号 |
| nickName | string | 昵称 |
| avatar | string | 头像URL |
| ageRange | int | 年龄段 |
| gender | int | 性别 |
| provinceName | string | 省份名称 |
| cityName | string | 市名称 |
| diagnosisStatus | int | 确诊状态 |
| diagnosisTime | string | 确诊时间 |
| surgeryStatus | int | 手术状态 |
| firstOpenTime | string | 首次打开时间 |
| phoneRegisterTime | string | 手机号注册时间 |
| infoSubmitTime | string | 信息提交时间 |
| isFirstOpenPhoneRegistered | bool | 首次打开完成手机号注册 |
| isFirstOpenInfoSubmitted | bool | 首次打开完成信息填写 |
| isPhoneRegisteredNotLost | bool | 手机号注册后未流失 |
| scanChannelId | int | 扫码渠道ID |
| scanChannelName | string | 扫码渠道名称 |
| telChannelId | int | 手机号注册渠道ID |
| telChannelName | string | 手机号注册渠道名称 |
| submitChannelId | int | 提交信息渠道ID |
| submitChannelName | string | 提交信息渠道名称 |
---
@ -489,11 +538,12 @@ @@ -489,11 +538,12 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | int | 是 | 用户信息表ID |
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---- | ---- | ------------ |
| id | int | 是 | 用户信息表ID |
**响应示例**:
```json
{
"code": 0,
@ -533,36 +583,58 @@ @@ -533,36 +583,58 @@
### 2.3 渠道码列表 `GET ?r=channel/list`
**说明**: 获取所有有效渠道码列表。
**说明**: 获取有效渠道码列表,支持分页
**请求参数**: 无
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---- | ---- | ---------------- |
| page | int | 否 | 页码,默认1 |
| count | int | 否 | 每页数量,默认10 |
**响应示例**:
```json
{
"code": 0,
"message": "success",
"data": [
{
"channelId": 1,
"channelName": "渠道A",
"channelDesc": "渠道A说明",
"miniCodeUrl": "https://xxx/minicode_1.png",
"createDate": "2023-01-01",
"updateDate": "2023-01-01"
}
]
"data": {
"page": 1,
"pages": 5,
"count": 50,
"list": [
{
"channelId": 1,
"channelName": "渠道A",
"channelDesc": "渠道A说明",
"miniCodeUrl": "https://xxx/minicode_1.png",
"createDate": "2023-01-01",
"updateDate": "2023-01-01"
}
]
}
}
```
**响应字段说明(每行)**:
**响应字段说明(data层级)**:
| 字段名 | 类型 | 说明 |
| ------ | ----- | -------- |
| page | int | 当前页码 |
| pages | int | 总页数 |
| count | int | 总记录数 |
| list | array | 渠道列表 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| channelDesc | string | 渠道码说明 |
**list行字段说明**:
| 字段名 | 类型 | 说明 |
| ----------- | ------ | --------------- |
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| channelDesc | string | 渠道码说明 |
| miniCodeUrl | string | 小程序码图片URL |
| createDate | string | 创建日期 |
| updateDate | string | 更新日期 |
---
@ -572,12 +644,13 @@ @@ -572,12 +644,13 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| channelName | string | 是 | 渠道名称 |
| channelDesc | string | 否 | 渠道码说明 |
| 参数名 | 类型 | 必填 | 说明 |
| ----------- | ------ | ---- | ---------- |
| channelName | string | 是 | 渠道名称 |
| channelDesc | string | 否 | 渠道码说明 |
**响应示例**:
```json
{
"code": 0,
@ -591,10 +664,10 @@ @@ -591,10 +664,10 @@
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| channelId | int | 新创建的渠道ID |
| channelName | string | 渠道名称 |
| 字段名 | 类型 | 说明 |
| ----------- | ------ | -------------- |
| channelId | int | 新创建的渠道ID |
| channelName | string | 渠道名称 |
---
@ -604,13 +677,14 @@ @@ -604,13 +677,14 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| channelId | int | 是 | 渠道ID |
| channelName | string | 否 | 渠道名称 |
| channelDesc | string | 否 | 渠道码说明 |
| 参数名 | 类型 | 必填 | 说明 |
| ----------- | ------ | ---- | ---------- |
| channelId | int | 是 | 渠道ID |
| channelName | string | 否 | 渠道名称 |
| channelDesc | string | 否 | 渠道码说明 |
**响应示例**:
```json
{
"code": 0,
@ -624,9 +698,9 @@ @@ -624,9 +698,9 @@
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| channelId | int | 渠道ID |
| 字段名 | 类型 | 说明 |
| ----------- | ------ | ---------------- |
| channelId | int | 渠道ID |
| channelName | string | 更新后的渠道名称 |
---
@ -637,11 +711,12 @@ @@ -637,11 +711,12 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| channelId | int | 是 | 渠道ID |
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ---- | ---- | ------ |
| channelId | int | 是 | 渠道ID |
**响应示例**:
```json
{
"code": 0,
@ -654,11 +729,12 @@ @@ -654,11 +729,12 @@
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| channelId | int | 已删除的渠道ID |
| 字段名 | 类型 | 说明 |
| --------- | ---- | -------------- |
| channelId | int | 已删除的渠道ID |
**业务逻辑**:
1. 校验渠道存在
2. 将渠道的Status置为100(删除状态),逻辑删除
3. 更新UpdateBy和UpdateTime
@ -672,11 +748,12 @@ @@ -672,11 +748,12 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| channelId | int | 是 | 渠道ID |
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ---- | ---- | ------ |
| channelId | int | 是 | 渠道ID |
**响应示例**:
```json
{
"code": 0,
@ -691,13 +768,14 @@ @@ -691,13 +768,14 @@
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| 字段名 | 类型 | 说明 |
| ----------- | ------ | --------------- |
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| miniCodeUrl | string | 小程序码图片URL |
**业务逻辑**:
1. 若渠道已有小程序码URL(MiniCodeUrl),直接返回
2. 若没有,调用微信接口生成小程序码(scene参数包含渠道ID)
3. 保存生成的MiniCodeUrl到渠道记录
@ -710,13 +788,14 @@ @@ -710,13 +788,14 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| inviteDateBegin | string | 否 | 邀约日期开始(YYYY-MM-DD) |
| inviteDateEnd | string | 否 | 邀约日期结束(YYYY-MM-DD) |
| channelIds | string | 否 | 渠道ID筛选,逗号分隔(如"1,2,3") |
| 参数名 | 类型 | 必填 | 说明 |
| --------------- | ------ | ---- | --------------------------------- |
| inviteDateBegin | string | 否 | 邀约日期开始(YYYY-MM-DD) |
| inviteDateEnd | string | 否 | 邀约日期结束(YYYY-MM-DD) |
| channelIds | string | 否 | 渠道ID筛选,逗号分隔(如"1,2,3") |
**响应示例**:
```json
{
"code": 0,
@ -738,16 +817,16 @@ @@ -738,16 +817,16 @@
**响应字段说明(每行)**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| statDate | string | 统计日期 |
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| channelDesc | string | 渠道码说明 |
| openPatientCount | int | 邀约打开患者数 |
| phoneRegisteredCount | int | 邀约注册手机号患者数 |
| infoSubmittedCount | int | 邀约提交信息患者数 |
| diagnosedPsvtCount | int | 确诊PSVT患者数 |
| 字段名 | 类型 | 说明 |
| -------------------- | ------ | -------------------- |
| statDate | string | 统计日期 |
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| channelDesc | string | 渠道码说明 |
| openPatientCount | int | 邀约打开患者数 |
| phoneRegisteredCount | int | 邀约注册手机号患者数 |
| infoSubmittedCount | int | 邀约提交信息患者数 |
| diagnosedPsvtCount | int | 确诊PSVT患者数 |
---
@ -757,16 +836,17 @@ @@ -757,16 +836,17 @@
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| inviteDateBegin | string | 否 | 邀约日期开始(YYYY-MM-DD) |
| inviteDateEnd | string | 否 | 邀约日期结束(YYYY-MM-DD) |
| channelId | int | 否 | 渠道ID筛选 |
| inviteType | int | 否 | 邀约类型筛选:1-用户打开,2-手机号注册,3-信息提交 |
| page | int | 否 | 页码,默认1 |
| count | int | 否 | 每页数量,默认10 |
| 参数名 | 类型 | 必填 | 说明 |
| --------------- | ------ | ---- | -------------------------------------------------- |
| inviteDateBegin | string | 否 | 邀约日期开始(YYYY-MM-DD) |
| inviteDateEnd | string | 否 | 邀约日期结束(YYYY-MM-DD) |
| channelId | int | 否 | 渠道ID筛选 |
| inviteType | int | 否 | 邀约类型筛选:1-用户打开,2-手机号注册,3-信息提交 |
| page | int | 否 | 页码,默认1 |
| count | int | 否 | 每页数量,默认10 |
**响应示例**:
```json
{
"code": 0,
@ -799,7 +879,7 @@ @@ -799,7 +879,7 @@
"diagnosisTime": "2023-06",
"surgeryStatus": 1,
"surgeryStatusName": "已手术",
"telephone": "138xxxx1234",
"telephone": "138xxxx1234"
}
]
}
@ -808,45 +888,45 @@ @@ -808,45 +888,45 @@
**响应字段说明(data层级)**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| page | int | 当前页码 |
| pages | int | 总页数 |
| count | int | 总记录数 |
| list | array | 原始数据列表 |
| 字段名 | 类型 | 说明 |
| ------ | ----- | ------------ |
| page | int | 当前页码 |
| pages | int | 总页数 |
| count | int | 总记录数 |
| list | array | 原始数据列表 |
**list行字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 记录ID |
| inviteTime | string | 邀约时间 |
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| inviteType | int | 邀约类型 |
| userId | string | 用户ID |
| patientId | int | 患者ID |
| nickName | string | 昵称 |
| gender | int | 性别 |
| ageRange | int | 年龄段 |
| provinceName | string | 省份名称 |
| cityName | string | 市名称 |
| diagnosisStatus | int | 确诊状态 |
| diagnosisTime | string | 确诊时间 |
| surgeryStatus | int | 手术状态 |
| telephone | string | 手机号 |
| firstOpenTime | string | 首次打开时间 |
| phoneRegisterTime | string | 手机号注册时间 |
| infoSubmitTime | string | 信息提交时间 |
| isFirstOpenPhoneRegistered | bool | 首次打开完成手机号注册 |
| isFirstOpenInfoSubmitted | bool | 首次打开完成信息填写 |
| isPhoneRegisteredNotLost | bool | 手机号注册后未流失 |
| scanChannelId | int | 扫码渠道ID |
| scanChannelName | string | 扫码渠道名称 |
| telChannelId | int | 手机号注册渠道ID |
| telChannelName | string | 手机号注册渠道名称 |
| submitChannelId | int | 提交信息渠道ID |
| submitChannelName | string | 提交信息渠道名称 |
| 字段名 | 类型 | 说明 |
| -------------------------- | ------ | ---------------------- |
| id | int | 记录ID |
| inviteTime | string | 邀约时间 |
| channelId | int | 渠道ID |
| channelName | string | 渠道名称 |
| inviteType | int | 邀约类型 |
| userId | string | 用户ID |
| patientId | int | 患者ID |
| nickName | string | 昵称 |
| gender | int | 性别 |
| ageRange | int | 年龄段 |
| provinceName | string | 省份名称 |
| cityName | string | 市名称 |
| diagnosisStatus | int | 确诊状态 |
| diagnosisTime | string | 确诊时间 |
| surgeryStatus | int | 手术状态 |
| telephone | string | 手机号 |
| firstOpenTime | string | 首次打开时间 |
| phoneRegisterTime | string | 手机号注册时间 |
| infoSubmitTime | string | 信息提交时间 |
| isFirstOpenPhoneRegistered | bool | 首次打开完成手机号注册 |
| isFirstOpenInfoSubmitted | bool | 首次打开完成信息填写 |
| isPhoneRegisteredNotLost | bool | 手机号注册后未流失 |
| scanChannelId | int | 扫码渠道ID |
| scanChannelName | string | 扫码渠道名称 |
| telChannelId | int | 手机号注册渠道ID |
| telChannelName | string | 手机号注册渠道名称 |
| submitChannelId | int | 提交信息渠道ID |
| submitChannelName | string | 提交信息渠道名称 |
---
@ -857,26 +937,33 @@ @@ -857,26 +937,33 @@
**请求参数**: 无
**响应示例**:
```json
{
"code": 0,
"message": "success",
"data": {
"genderList": [{"1": "男"}, {"2": "女"}],
"ageRangeList": [{"1": "18~28岁"}, {"2": "29~40岁"}, {"3": "41~50岁"}, {"4": "50岁以上"}],
"diagnosisStatusList": [{"1": "疑似PSVT正在了解中"}, {"2": "已确诊PSVT"}, {"3": "心悸/心跳过快 尚未就诊"}, {"4": "亲友相关 想了解更多"}],
"surgeryStatusList": [{"1": "已接收射频消融/相关手术"}, {"2": "尚未接收手术"}, {"3": "正在评估"}]
"genderList": [{ "1": "男" }, { "2": "女" }],
"ageRangeList": [{ "1": "18~28岁" }, { "2": "29~40岁" }, { "3": "41~50岁" }, { "4": "50岁以上" }],
"diagnosisStatusList": [
{ "1": "疑似PSVT正在了解中" },
{ "2": "已确诊PSVT" },
{ "3": "心悸/心跳过快 尚未就诊" },
{ "4": "亲友相关 想了解更多" }
],
"surgeryStatusList": [{ "1": "已接收射频消融/相关手术" }, { "2": "尚未接收手术" }, { "3": "正在评估" }]
}
}
```
**响应字段说明**:
| 字段名 | 类型 | 说明 |
|---|---|---|
| genderList | array | 性别列表,每项为 {value: "label"} |
| ageRangeList | array | 年龄段列表,每项为 {value: "label"} |
| 字段名 | 类型 | 说明 |
| ------------------- | ----- | ------------------------------------- |
| genderList | array | 性别列表,每项为 {value: "label"} |
| ageRangeList | array | 年龄段列表,每项为 {value: "label"} |
| diagnosisStatusList | array | 确诊状态列表,每项为 {value: "label"} |
| surgeryStatusList | array | 手术状态列表,每项为 {value: "label"} |
| surgeryStatusList | array | 手术状态列表,每项为 {value: "label"} |
---
---

12
src/app.json

@ -24,19 +24,13 @@ @@ -24,19 +24,13 @@
"pages/myWall/index",
"pages/myComment/index",
"pages/myCollection/index",
"pages/userInfo/index"
"pages/userInfo/index",
"pages/changeTel/index"
],
"subPackages": [
{
"root": "doc",
"pages": [
"pages/doc/index",
"pages/doc1/index",
"pages/doc2/index",
"pages/doc3/index",
"pages/doc4/index",
"pages/doc5/index"
]
"pages": ["pages/doc/index", "pages/doc1/index"]
}
],
"tabBar": {

16
src/app.ts

@ -87,7 +87,7 @@ App<IAppOption>({ @@ -87,7 +87,7 @@ App<IAppOption>({
},
})
},
waitLogin({ type = 0 } = { type: 'any' }) {
waitLogin({ type = 1 } = { type: 1 }) {
return new Promise((resolve) => {
const checkLogin = () => {
if (this.globalData.loginState) {
@ -104,20 +104,20 @@ App<IAppOption>({ @@ -104,20 +104,20 @@ App<IAppOption>({
})
},
checkLoginType(type = 'any') {
const { isPhoneRegistered, isInfoSubmitted } = this.globalData.initLoginInfo
const { isLogin, isReg } = this.globalData.initLoginInfo
if (type === 'any') {
return true
}
if (!isPhoneRegistered) {
if (!isLogin) {
wx.reLaunch({
url: '/pages/login/index',
})
return false
}
if (!isInfoSubmitted) {
if (!isReg) {
wx.reLaunch({
url: '/pages/confirmInfo/index',
})
@ -139,12 +139,8 @@ App<IAppOption>({ @@ -139,12 +139,8 @@ App<IAppOption>({
})
},
getUserInfo(type: 0 | 1 | 2 = 0) {
const url = {
0: '?r=wtx/user/userinfo',
1: '?r=wtx/account/info',
2: '?r=wtx/doctor/account/info',
}[type]
getUserInfo() {
const url = '?r=psvt/patient/my-info'
return wx.ajax({
method: 'GET',
url: url,

10
src/components/pickerArea/index.scss

@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
padding: 18rpx 30rpx;
box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 0, 0, 0.11);
border-radius: 12rpx 12rpx 12rpx 12rpx;
border: 2rpx solid #f23a2f;
border: 2rpx solid rgba(47, 130, 169, 1);
display: flex;
align-items: center;
justify-content: space-between;
@ -69,7 +69,7 @@ @@ -69,7 +69,7 @@
display: flex;
align-items: center;
justify-content: center;
background: #f23a2f;
background: rgba(47, 130, 169, 1);
border-radius: 12rpx 12rpx 12rpx 12rpx;
}
}
@ -91,7 +91,7 @@ @@ -91,7 +91,7 @@
background: #f7f8f9;
&.active {
color: #fff;
background-color: #f23a2f;
background-color: rgba(47, 130, 169, 1);
}
}
}
@ -118,9 +118,9 @@ @@ -118,9 +118,9 @@
height: 36rpx;
}
&.active {
color: #f23a2f;
color: rgba(47, 130, 169, 1);
.word {
color: #f23a2f;
color: rgba(47, 130, 169, 1);
}
}
}

2
src/components/pickerArea/index.wxml

@ -9,11 +9,9 @@ @@ -9,11 +9,9 @@
<view class="area">
<view class="item" bind:tap="handleProvince">
<view class="content">{{ProvinceName || '请选择省份'}}</view>
<image class="icon" src="{{imageUrl}}icon6.png?t={{Timestamp}}"></image>
</view>
<view class="item" bind:tap="handleCity">
<view class="content">{{CityName || '请选择城市'}}</view>
<image class="icon" src="{{imageUrl}}icon6.png?t={{Timestamp}}"></image>
</view>
<view class="btn" bind:tap="handleShare">确定</view>
</view>

1
src/components/popup/index.ts

@ -122,7 +122,6 @@ Component({ @@ -122,7 +122,6 @@ Component({
},
handlePopup1Check1() {
if (this.data.popup1Check1) {
app.mpBehavior({ PageName: 'BTN_PATIENTPRIVACY' })
}
},
handleSelectStatus(e) {

4
src/components/popup/index.wxml

@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
<view class="title">欢迎加入“愈见守护”</view>
<view class="content">
亲爱的用户,为了更好地向您提供平台服务保护您的权益,我们完善了
<text class="link" bind:tap="routerTo" data-url="/doc/pages/doc1/index">《个人信息及隐私政策》</text>
<text class="link" bind:tap="routerTo" data-url="/doc/pages/doc1/index?type=1">《个人信息及隐私政策》</text>
,请您仔细阅读。一旦您开始使用,即表示您已充分理解并同意协议内容。
</view>
<view class="check">
@ -26,7 +26,7 @@ @@ -26,7 +26,7 @@
></checkbox>
<view class="c-content">
我特此同意
<text class="link" bind:tap="routerTo" data-url="/doc/pages/doc1/index">《个人信息及隐私政策》</text>
<text class="link" bind:tap="routerTo" data-url="/doc/pages/doc1/index?type=1">《个人信息及隐私政策》</text>
规定收集我的相关敏感个人信息
</view>
</view>

4
src/components/uploadFile/index.wxml

@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
></image>
<image wx:else class="sub-image" mode="aspectFill" src="{{imageUrl}}{{item.fileType}}.png?t={{Timestamp}}"></image>
<view class="item_mask">
<image class="item_mask_icon" wx:if="{{item.fileType === 'video'}}" src="/images/icon17.png"></image>
<image class="item_mask_icon" wx:if="{{item.fileType === 'video'}}" src="{{imageUrl}}icon17.png?t={{Timestamp}}"></image>
<view class="clear" wx:if="{{delete}}" catchtap="deleteFile" data-item="{{item}}" data-index="{{index}}">
<van-icon name="cross" />
</view>
@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
<slot wx:if="{{isSlot}}"></slot>
<view wx:else class="btn">
<image class="icon" src="/images/icon16.png"></image>
<image class="icon" src="{{imageUrl}}icon16.png?t={{Timestamp}}"></image>
</view>
</view>
</view>

2
src/custom-tab-bar/index.wxml

@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
wx:else
bind:tap="handleNav"
data-index="{{index}}"
icon="{{imageUrl}}/tabbar/{{active==index ? item.iconActive : item.icon}}.png?r={{Timestamp}}"
icon="{{imageUrl}}tabbar/{{active==index ? item.iconActive : item.icon}}.png?r={{Timestamp}}"
>
<view class="name {{index==active && 'active'}}">{{item.text}}</view>
</van-tabbar-item>

120
src/doc/pages/doc/index.ts

@ -1,102 +1,48 @@ @@ -1,102 +1,48 @@
const app = getApp<IAppOption>()
Page({
data: {
popupShow: false,
popupType: '',
popupParams: {
position: 'bottom',
} as any,
topicShow: false,
replayShow: true,
fileList: [] as any[],
},
onLoad() {
app.waitLogin({ type: 0 }).then(() => {})
},
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',
data: {
WorkerId: app.globalData.scene?.workerId || '',
},
}).then(() => {
this.setData({
popupShow: false,
popupType: '',
popupParams: {},
})
const waitBindDoctorId = app.globalData.waitBindDoctorId
if (waitBindDoctorId) {
this.handleBindDoctor(waitBindDoctorId)
}
})
}
if (popupType === 'conformBindDoctorConform') {
this.setData({
popupShow: false,
})
wx.ajax({
method: 'POST',
url: '?r=wtx/account/wait-bind-doctor',
data: {
doctorId: app.globalData.waitBindDoctorId,
},
}).then(() => {
wx.navigateTo({
url: `/patient/pages/login/index`,
list: [] as Array<{
id: number
type: number
title: string
content: string
version: string
updateTime: string
}>,
},
onLoad(options) {
// 如果带了 active 参数,直接跳转到对应协议详情
if (options.active) {
this.getList().then(() => {
const type = Number(options.active)
wx.redirectTo({
url: `/doc/pages/doc1/index?type=${type}`,
})
})
return
}
this.getList()
},
handlePopupCancel() {
const { popupType } = this.data
if (popupType === 'argument') {
wx.exitMiniProgram()
}
if (popupType === 'conformBindDoctorConform') {
this.setData({
popupShow: false,
getList() {
return wx
.ajax({
method: 'GET',
url: '?r=psvt/agreement/get-list',
})
wx.ajax({
method: 'POST',
url: '?r=wtx/account/wait-bind-doctor',
data: {
doctorId: app.globalData.waitBindDoctorId,
},
}).then(() => {
app.globalData.waitBindDoctorId = ''
.then((res) => {
this.setData({
list: res,
})
})
}
},
handleWechatWork() {
handleToDetail(e: WechatMiniprogram.TouchEvent) {
const { type } = e.currentTarget.dataset
wx.navigateTo({
url: '/pages/wechatWork/index',
url: `/doc/pages/doc1/index?type=${type}`,
})
},
handleSetData(e) {
const { fileList } = this.data
this.setData({
fileList: [...fileList, ...e.detail],
})
},
handleDeleteFile(e) {
const { index } = e.detail
const { fileList } = this.data
this.setData({
fileList: fileList.filter((_, i) => i !== index),
})
},
topicClose() {
this.setData({
topicShow: false,
})
handleBack() {
wx.navigateBack()
},
})

26
src/doc/pages/doc/index.wxml

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
<navbar fixed custom-style="background:{{background}}" back>
<view class="page-title" slot="left">
<view class="page-title" slot="left" bind:tap="handleBack">
<van-icon name="arrow-left" />
个人信息
</view>
@ -7,24 +7,18 @@ @@ -7,24 +7,18 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="list">
<view class="info-card">
<view class="info-row">
<text class="info-label">《隐私政策》</text>
<van-icon name="arrow" class="info-arrow" />
</view>
<view class="info-row">
<text class="info-label">《用户协议》</text>
<van-icon name="arrow" class="info-arrow" />
</view>
<view class="info-row">
<text class="info-label">《法律声明》</text>
<van-icon name="arrow" class="info-arrow" />
</view>
<view class="info-row">
<text class="info-label">《健康敏感信息处理与AI服务授权告知书》</text>
<view
class="info-row"
wx:for="{{list}}"
wx:key="type"
bind:tap="handleToDetail"
data-type="{{item.type}}"
>
<text class="info-label">《{{item.title}}》</text>
<van-icon name="arrow" class="info-arrow" />
</view>
</view>

21
src/doc/pages/doc1/index.scss

@ -1,3 +1,22 @@ @@ -1,3 +1,22 @@
.page{
.page {
padding: 0 40rpx;
.header {
padding: 40rpx 0 24rpx;
border-bottom: 1rpx solid #f1f5f9;
margin-bottom: 24rpx;
.title {
font-size: 36rpx;
font-weight: bold;
color: #1e293b;
line-height: 50rpx;
}
.meta {
margin-top: 12rpx;
font-size: 24rpx;
color: #94a3b8;
}
}
}

31
src/doc/pages/doc1/index.ts

File diff suppressed because one or more lines are too long

6
src/doc/pages/doc2/index.json

@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
{
"navigationBarTitleText": "个人信息共享知情同意书",
"usingComponents": {
"mp-html": "mp-html"
}
}

3
src/doc/pages/doc2/index.scss

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
.page{
padding: 0 40rpx;
}

10
src/doc/pages/doc2/index.ts

File diff suppressed because one or more lines are too long

3
src/doc/pages/doc2/index.wxml

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
<view class="page">
<mp-html content="{{doc}}"></mp-html>
</view>

6
src/doc/pages/doc3/index.json

@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
{
"navigationBarTitleText": "个人信息及隐私保护政策",
"usingComponents": {
"mp-html": "mp-html"
}
}

3
src/doc/pages/doc3/index.scss

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
.page{
padding: 0 40rpx;
}

10
src/doc/pages/doc3/index.ts

File diff suppressed because one or more lines are too long

3
src/doc/pages/doc3/index.wxml

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
<view class="page">
<mp-html content="{{doc}}"></mp-html>
</view>

6
src/doc/pages/doc4/index.json

@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
{
"navigationBarTitleText": "用户协议",
"usingComponents": {
"mp-html": "mp-html"
}
}

3
src/doc/pages/doc4/index.scss

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
.page{
padding: 0 40rpx;
}

10
src/doc/pages/doc4/index.ts

File diff suppressed because one or more lines are too long

3
src/doc/pages/doc4/index.wxml

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
<view class="page">
<mp-html content="{{doc}}"></mp-html>
</view>

6
src/doc/pages/doc5/index.json

@ -1,6 +0,0 @@ @@ -1,6 +0,0 @@
{
"navigationBarTitleText": "个人信息及隐私保护政策",
"usingComponents": {
"mp-html": "mp-html"
}
}

3
src/doc/pages/doc5/index.scss

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
.page{
padding: 0 40rpx;
}

10
src/doc/pages/doc5/index.ts

File diff suppressed because one or more lines are too long

3
src/doc/pages/doc5/index.wxml

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
<view class="page">
<mp-html content="{{doc}}"></mp-html>
</view>

BIN
src/images/tabbar/tabbar1-1-active.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
src/images/tabbar/tabbar1-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/images/tabbar/tabbar1-2-active.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
src/images/tabbar/tabbar1-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
src/images/tabbar/tabbar1-3-active.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
src/images/tabbar/tabbar1-3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/images/tabbar/tabbar1-4-active.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
src/images/tabbar/tabbar1-4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

16
src/pages/articleDetail/index.wxml

@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
<view class="pv">1209人阅读</view>
</view>
<view class="banner">
<image class="b-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="b-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
</view>
<view class="mp-wrap">
<mp-html content="{{content}}"></mp-html>
@ -21,10 +21,10 @@ @@ -21,10 +21,10 @@
<view class="r-list">
<view class="list-card">
<view class="photo-wrap">
<image class="photo" mode="aspectFill" src="/images/bg1.png"></image>
<image class="photo" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<!-- <view class="type1">图文</view> -->
<view class="type2">
<image class="icon" src="/images/icon10.png"></image>
<image class="icon" src="{{imageUrl}}icon10.png?t={{Timestamp}}"></image>
视频
</view>
</view>
@ -34,11 +34,11 @@ @@ -34,11 +34,11 @@
<view class="tag">认识PSVT</view>
<view class="stat">
<view class="s-item">
<image class="icon" src="/images/icon8.png"></image>
<image class="icon" src="{{imageUrl}}icon8.png?t={{Timestamp}}"></image>
2.1万
</view>
<view class="s-item">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
2.1万
</view>
</view>
@ -50,15 +50,15 @@ @@ -50,15 +50,15 @@
<view class="page-footer">
<view class="op-wrap">
<view class="op">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon28.png"></image>
<image class="icon" src="{{imageUrl}}icon28.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon29.png"></image>
<image class="icon" src="{{imageUrl}}icon29.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
</view>

4
src/pages/changeTel/index.json

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
{
"navigationBarTitleText": "修改手机号",
"usingComponents": {}
}

51
src/pages/changeTel/index.scss

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
page {
background-color: rgba(247, 247, 250, 1);
}
.page {
padding: 48rpx 40rpx;
.form {
padding: 0 32rpx;
background-color: #fff;
border-radius: 24rpx;
.row {
display: flex;
align-items: center;
.label {
font-size: 32rpx;
color: rgba(1, 1, 5, 1);
width: 5em;
}
.container {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10rpx;
.input {
padding: 32rpx 0;
font-size: 32rpx;
color: rgba(1, 1, 5, 1);
}
.place-input {
color: rgba(161, 164, 172, 0.4);
}
.btn {
flex-shrink: 0;
font-size: 32rpx;
color: rgba(246, 74, 58, 1);
}
}
}
}
.login-out {
margin-top: 48rpx;
padding: 20rpx;
font-size: 32rpx;
line-height: 48rpx;
color: #fff;
text-align: center;
background: linear-gradient(356deg, #f23a2f 0%, #fc684f 100%);
border-radius: 96rpx;
}
}

91
src/pages/changeTel/index.ts

@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
const app = getApp<IAppOption>()
let timer = null as null | number
Page({
data: {
mobile: '',
code: '',
codeText: '发送验证码',
},
onLoad() {},
onUnload() {
if (timer) {
clearInterval(timer as number)
timer = null
}
},
getCode() {
if (timer) return
const mobile = this.data.mobile
if (!mobile) {
wx.showToast({
title: '手机号不能为空',
icon: 'none',
})
return
}
// 验证手机号
if (!/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/.test(mobile)) {
wx.showToast({
title: '手机号格式不正确',
icon: 'none',
})
return
}
wx.ajax({
method: 'POST',
url: '?r=wtx/login/send-verify-code',
data: {
mobile,
},
}).then((res) => {
console.log(res)
wx.showToast({
icon: 'none',
title: '验证码已发送~',
})
let time = 60
timer = setInterval(() => {
time--
this.setData({
codeText: time + 's后重新发送',
})
if (time <= 0) {
clearInterval(timer as number)
timer = null
this.setData({
codeText: '发送验证码',
})
}
}, 1000)
})
},
handleSubmit() {
wx.showModal({
title: '确定修改此手机号?',
confirmColor: '#F64A3A',
success: (res) => {
if (!res.confirm) return
const { mobile, code } = this.data
const { registrationSource, registChannel, regBusinessId } = app.globalData
wx.ajax({
method: 'POST',
url: '?r=wtx/account/update-telephone',
data: {
mobile,
code,
registrationSource,
registChannel,
regBusinessId,
},
}).then((_res) => {
wx.navigateBack()
})
},
})
},
handleBack() {
wx.navigateBack()
},
})

32
src/pages/changeTel/index.wxml

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
<view class="page">
<view class="form">
<view class="row">
<view class="label">新手机号</view>
<view class="container">
<input
type="number"
class="input"
model:value="{{mobile}}"
maxlength="11"
placeholder-class="place-input"
placeholder="请输入新手机号"
/>
</view>
</view>
<view class="row">
<view class="label">验证码</view>
<view class="container">
<input
type="number"
class="input"
model:value="{{code}}"
maxlength="6"
placeholder-class="place-input"
placeholder="请输入验证码"
/>
<view class="btn" bind:tap="getCode">{{codeText}}</view>
</view>
</view>
</view>
<view class="login-out" bind:tap="handleSubmit">提交</view>
</view>

4
src/pages/confirmInfo/index.json

@ -1,4 +1,6 @@ @@ -1,4 +1,6 @@
{
"navigationStyle": "custom",
"usingComponents": {}
"usingComponents": {
"picker-area": "/components/pickerArea/index"
}
}

1
src/pages/confirmInfo/index.scss

@ -142,6 +142,7 @@ page { @@ -142,6 +142,7 @@ page {
}
.select3 {
margin-top: 24rpx;
margin-bottom: 56rpx;
.picker-content {
padding: 0 34rpx;
height: 88rpx;

72
src/pages/confirmInfo/index.ts

@ -1,16 +1,27 @@ @@ -1,16 +1,27 @@
const app = getApp<IAppOption>()
interface OptionItem {
value: number
label: string
}
Page({
data: {
menuTop: 0,
step: 1,
// 基础数据列表 (from API 1.7)
ageRangeList: [] as OptionItem[],
genderList: [] as OptionItem[],
diagnosisStatusList: [] as OptionItem[],
surgeryStatusList: [] as OptionItem[],
// Step 1: 基础信息
ageRange: 0 as number,
gender: 0 as number,
provinceId: '' as string | number,
provinceId: '',
provinceName: '',
cityId: '' as string | number,
cityId: '',
cityName: '',
regionText: '',
@ -28,6 +39,35 @@ Page({ @@ -28,6 +39,35 @@ Page({
menuTop: menuRes.top,
currentMonth,
})
this.getBaseData()
},
getBaseData() {
wx.ajax({
method: 'GET',
url: '?r=psvt/patient/base-data',
}).then((res) => {
const parseList = (list: any): OptionItem[] => {
if (Array.isArray(list)) {
return list.map((item) => {
const key = Object.keys(item)[0]
return { value: Number(key), label: item[key] }
})
}
if (list && typeof list === 'object') {
return Object.keys(list).map((key) => ({
value: Number(key),
label: list[key],
}))
}
return []
}
this.setData({
ageRangeList: parseList(res.ageRangeList),
genderList: parseList(res.genderList),
diagnosisStatusList: parseList(res.diagnosisStatusList),
surgeryStatusList: parseList(res.surgeryStatusList),
})
})
},
handleSelect(e: WechatMiniprogram.TouchEvent) {
const { key, value } = e.currentTarget.dataset
@ -35,12 +75,14 @@ Page({ @@ -35,12 +75,14 @@ Page({
[key]: Number(value),
})
},
handleRegionChange(e: WechatMiniprogram.PickerChange) {
const region = e.detail.value as string[]
handleAreaChange(e: any) {
const [province, city] = e.detail
this.setData({
provinceName: region[0],
cityName: region[2] || region[1],
regionText: region.filter((r) => r && r !== '全部').join(' '),
provinceId: province.value,
provinceName: province.label,
cityId: city.value,
cityName: city.label,
regionText: [province.label, city.label].filter(Boolean).join(' '),
})
},
handleDiagnosisTimeChange(e: WechatMiniprogram.PickerChange) {
@ -106,16 +148,12 @@ Page({ @@ -106,16 +148,12 @@ Page({
data,
loading: true,
loadingText: '提交中...',
}).then((res) => {
const { isRegistered } = res
if (isRegistered) {
if (app.globalData.initLoginInfo) {
app.globalData.initLoginInfo.isInfoSubmitted = true
}
wx.reLaunch({
url: '/pages/index/index',
})
}
}).then(() => {
app.globalData.initLoginInfo.isReg = 1
app.globalData.initLoginInfo.isLogin = 1
wx.reLaunch({
url: '/pages/index/index',
})
})
},
})

127
src/pages/confirmInfo/index.wxml

@ -1,12 +1,12 @@ @@ -1,12 +1,12 @@
<view
class="page"
style="background: url('/images/bg2.png') no-repeat top center/100% 454rpx;padding-top: {{menuTop}}px;"
style="background: url('{{imageUrl}}bg2.png?t={{Timestamp}}') no-repeat top center/100% 454rpx;padding-top: {{menuTop}}px;"
>
<image class="logo" src="/images/logo1.png"></image>
<image class="logo" src="{{imageUrl}}logo1.png?t={{Timestamp}}"></image>
<view class="page-header">
<view class="item {{step==1 &&'active'}}">
<view class="order" wx:if="{{step===1}}">1</view>
<view class="order" wx:else><image class="icon" src="/images/icon3.png"></image></view>
<view class="order" wx:else><image class="icon" src="{{imageUrl}}icon3.png?t={{Timestamp}}"></image></view>
<view class="name">基础信息</view>
</view>
<view class="line {{step>1 &&'active'}}"></view>
@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
</view>
</view>
<view class="tip">
<image class="icon" src="/images/icon4.png"></image>
<image class="icon" src="{{imageUrl}}icon4.png?t={{Timestamp}}"></image>
<view class="content">这些信息将用于优化内容推荐与服务提醒,不作为诊断或 治疗建议依据。</view>
</view>
@ -26,63 +26,47 @@ @@ -26,63 +26,47 @@
<view class="row-title">我的年龄段</view>
<view class="select1">
<view
class="s-item {{ageRange===1 && 'active'}}"
class="s-item {{ageRange===item.value && 'active'}}"
wx:for="{{ageRangeList}}"
wx:key="value"
bind:tap="handleSelect"
data-key="ageRange"
data-value="1"
>18-28岁</view>
<view
class="s-item {{ageRange===2 && 'active'}}"
bind:tap="handleSelect"
data-key="ageRange"
data-value="2"
>29-40岁</view>
<view
class="s-item {{ageRange===3 && 'active'}}"
bind:tap="handleSelect"
data-key="ageRange"
data-value="3"
>41-50岁</view>
<view
class="s-item {{ageRange===4 && 'active'}}"
bind:tap="handleSelect"
data-key="ageRange"
data-value="4"
>50岁以上</view>
data-value="{{item.value}}"
>{{item.label}}</view>
</view>
</view>
<view class="row">
<view class="row-title">我的性别</view>
<view class="select2">
<view
class="s-item {{gender===1 && 'active1'}}"
class="s-item {{gender===1 && index==0 && 'active1'}} {{gender===2 && index==1 && 'active2'}}"
wx:for="{{genderList}}"
wx:key="value"
bind:tap="handleSelect"
data-key="gender"
data-value="1"
data-value="{{item.value}}"
>
<image class="icon" src="/images/icon5.png"></image>
</view>
<view
class="s-item {{gender===2 && 'active2'}}"
bind:tap="handleSelect"
data-key="gender"
data-value="2"
>
<image class="icon" src="/images/icon6.png"></image>
<image class="icon" src="{{imageUrl}}icon5.png?t={{Timestamp}}" wx:if="{{item.value===1}}"></image>
<image class="icon" src="{{imageUrl}}icon6.png?t={{Timestamp}}" wx:if="{{item.value===2}}"></image>
{{item.label}}
</view>
</view>
</view>
<view class="row">
<view class="row-title">所在地区</view>
<view class="select3">
<picker mode="region" bindchange="handleRegionChange">
<picker-area
pname="{{provinceName}}"
pid="{{provinceId}}"
cname="{{cityName}}"
cid="{{cityId}}"
bind:change="handleAreaChange"
>
<view class="picker-content">
<view class="content" data-place="请选择所在地区">{{regionText || ''}}</view>
<image class="icon" src="/images/icon7.png"></image>
<image class="icon" src="{{imageUrl}}icon7.png?t={{Timestamp}}"></image>
</view>
</picker>
</picker-area>
</view>
</view>
</view>
@ -93,39 +77,14 @@ @@ -93,39 +77,14 @@
<view class="row-title">确诊状态</view>
<view class="select4">
<view
class="s-item {{diagnosisStatus===1 && 'active'}}"
bind:tap="handleSelect"
data-key="diagnosisStatus"
data-value="1"
>
<view class="title">疑似PSVT</view>
<view class="content">正在了解中</view>
</view>
<view
class="s-item {{diagnosisStatus===2 && 'active'}}"
class="s-item {{diagnosisStatus===item.value && 'active'}}"
wx:for="{{diagnosisStatusList}}"
wx:key="value"
bind:tap="handleSelect"
data-key="diagnosisStatus"
data-value="2"
data-value="{{item.value}}"
>
<view class="title">已确诊PSVT</view>
</view>
<view
class="s-item {{diagnosisStatus===3 && 'active'}}"
bind:tap="handleSelect"
data-key="diagnosisStatus"
data-value="3"
>
<view class="title">心悸/心跳过快</view>
<view class="content">尚未就诊</view>
</view>
<view
class="s-item {{diagnosisStatus===4 && 'active'}}"
bind:tap="handleSelect"
data-key="diagnosisStatus"
data-value="4"
>
<view class="title">亲友相关</view>
<view class="content">想了解更多</view>
<view class="title">{{item.label}}</view>
</view>
</view>
</view>
@ -135,7 +94,7 @@ @@ -135,7 +94,7 @@
<picker mode="date" fields="month" bindchange="handleDiagnosisTimeChange" end="{{currentMonth}}">
<view class="picker-content">
<view class="content" data-place="选择确诊时间">{{diagnosisTime || ''}}</view>
<image class="icon" src="/images/icon7.png"></image>
<image class="icon" src="{{imageUrl}}icon7.png?t={{Timestamp}}"></image>
</view>
</picker>
</view>
@ -144,28 +103,14 @@ @@ -144,28 +103,14 @@
<view class="row-title">是否接受过相关手术治疗</view>
<view class="select4">
<view
class="s-item {{surgeryStatus===1 && 'active'}}"
bind:tap="handleSelect"
data-key="surgeryStatus"
data-value="1"
>
<view class="title">已接受射频消融 /相关手术</view>
</view>
<view
class="s-item {{surgeryStatus===2 && 'active'}}"
bind:tap="handleSelect"
data-key="surgeryStatus"
data-value="2"
>
<view class="title">尚未接受手术</view>
</view>
<view
class="s-item {{surgeryStatus===3 && 'active'}}"
class="s-item {{surgeryStatus===item.value && 'active'}}"
wx:for="{{surgeryStatusList}}"
wx:key="value"
bind:tap="handleSelect"
data-key="surgeryStatus"
data-value="3"
data-value="{{item.value}}"
>
<view class="title">正在评估</view>
<view class="title">{{item.label}}</view>
</view>
</view>
</view>

6
src/pages/drugMap/index.wxml

@ -1,9 +1,9 @@ @@ -1,9 +1,9 @@
<navbar fixed custom-style="background:{{background}}" back>
<image class="page-title" slot="left" src="/images/logo2.png"></image>
<image class="page-title" slot="left" src="{{imageUrl}}logo2.png?t={{Timestamp}}"></image>
</navbar>
<view class="page" style="background: url('/images/bg6.png') no-repeat top center/100%;padding-top: {{pageTop}}rpx;">
<image class="logo" src="/images/bg5.png"></image>
<view class="page" style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100%;padding-top: {{pageTop}}rpx;">
<image class="logo" src="{{imageUrl}}bg5.png?t={{Timestamp}}"></image>
<view class="content">
我们正在全力打造购药地图服务
<view></view>

1
src/pages/followDetail/index.ts

@ -19,7 +19,6 @@ Page({ @@ -19,7 +19,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

4
src/pages/followDetail/index.wxml

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="form">
<view class="form-item">
@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
</view>
<view class="photo9">
<view class="p-item" wx:for="{{3}}" wx:key="index">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
</view>
</view>
</view>

1
src/pages/followForm/index.ts

@ -16,7 +16,6 @@ Page({ @@ -16,7 +16,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

2
src/pages/followForm/index.wxml

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="form">
<view class="form-item">

1
src/pages/health/index.ts

@ -160,7 +160,6 @@ Page({ @@ -160,7 +160,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

14
src/pages/health/index.wxml

@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
<navbar id="navbar" fixed custom-style="background:{{background}}" back>
<image class="page-title" slot="left" src="/images/logo2.png"></image>
<image class="page-title" slot="left" src="{{imageUrl}}logo2.png?t={{Timestamp}}"></image>
</navbar>
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<!-- <swiper class="banner"> -->
<!-- <swiper-item> -->
<!-- <image class="b-img" mode="aspectFill" src="/images/bg1.png"></image> -->
<!-- <image class="b-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image> -->
<!-- </swiper-item> -->
<!-- </swiper> -->
<van-tabs
@ -38,7 +38,7 @@ @@ -38,7 +38,7 @@
<picker mode="date">
<view class="date">2026.01</view>
</picker>
<image class="icon" src="/images/icon25.png"></image>
<image class="icon" src="{{imageUrl}}icon25.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="stats-grid">
@ -90,7 +90,7 @@ @@ -90,7 +90,7 @@
<picker mode="date">
<view class="date">2026.01</view>
</picker>
<image class="icon" src="/images/icon25.png"></image>
<image class="icon" src="{{imageUrl}}icon25.png?t={{Timestamp}}"></image>
</view>
<view class="total">
共复诊
@ -108,7 +108,7 @@ @@ -108,7 +108,7 @@
</view>
<view class="photo9">
<view class="p-item" wx:for="{{3}}" wx:key="index">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="title">未更新处方</view>
@ -121,5 +121,5 @@ @@ -121,5 +121,5 @@
</view>
<view class="fixed-add">
<image class="icon" src="/images/icon24.png"></image>
<image class="icon" src="{{imageUrl}}icon24.png?t={{Timestamp}}"></image>
</view>

1
src/pages/heartDetail/index.ts

@ -16,7 +16,6 @@ Page({ @@ -16,7 +16,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

2
src/pages/heartDetail/index.wxml

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="form">
<view class="form-item">

1
src/pages/heartForm/index.ts

@ -16,7 +16,6 @@ Page({ @@ -16,7 +16,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

2
src/pages/heartForm/index.wxml

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="form">
<view class="rate">

1
src/pages/hotTopic/index.ts

@ -14,7 +14,6 @@ Page({ @@ -14,7 +14,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

2
src/pages/hotTopic/index.wxml

@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
<view
class="page"
style="background: url('/images/bg9.png') no-repeat top center/100% 508rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg9.png?t={{Timestamp}}') no-repeat top center/100% 508rpx;padding-top: {{pageTop}}px;"
>
<view class="container">
<view class="tp-list">

1
src/pages/hotTopicDetail/index.ts

@ -14,7 +14,6 @@ Page({ @@ -14,7 +14,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

20
src/pages/hotTopicDetail/index.wxml

@ -6,11 +6,11 @@ @@ -6,11 +6,11 @@
<view
class="page"
style="background: url('/images/bg10.png') no-repeat top center/100% 506rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg10.png?t={{Timestamp}}') no-repeat top center/100% 506rpx;padding-top: {{pageTop}}px;"
>
<view class="info">
<view class="i-header">
<image class="icon" src="/images/icon23.png"></image>
<image class="icon" src="{{imageUrl}}icon23.png?t={{Timestamp}}"></image>
<view class="name">我的心悸经历</view>
</view>
<view class="total">1200人浏览 | 300篇帖子</view>
@ -23,13 +23,13 @@ @@ -23,13 +23,13 @@
<view class="list">
<view class="list-card" bind:tap="handleDetail">
<view class="user">
<image class="avatar" mode="aspectFill" src="/images/bg1.png"></image>
<image class="avatar" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="name">@林间心跳</view>
<view class="date">2026年7月1日 13:09</view>
</view>
</view>
<view class="hot" style="background: url('/images/bg11.png') no-repeat top center/100%">热门推荐</view>
<view class="hot" style="background: url('{{imageUrl}}bg11.png?t={{Timestamp}}') no-repeat top center/100%">热门推荐</view>
<view class="content">
<view class="c-topic">#我的心悸经历</view>
<view class="c-topic">#PSVT急救常识</view>
@ -39,11 +39,11 @@ @@ -39,11 +39,11 @@
<view class="tag" wx:for="{{4}}" wx:key="index">患者故事</view>
</view>
<!-- 单图 -->
<image class="photo1" mode="heightFix" src="/images/bg1.png"></image>
<image class="photo1" mode="heightFix" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<!-- 多图 -->
<view class="photo9">
<view class="p-item" wx:for="{{3}}" wx:key="index">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="comment">
@ -52,15 +52,15 @@ @@ -52,15 +52,15 @@
</view>
<view class="footer">
<view class="op">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon8.png"></image>
<image class="icon" src="{{imageUrl}}icon8.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon15.png"></image>
<image class="icon" src="{{imageUrl}}icon15.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
</view>
@ -70,5 +70,5 @@ @@ -70,5 +70,5 @@
</view>
<view class="fixed-add">
<image class="icon" src="/images/icon24.png"></image>
<image class="icon" src="{{imageUrl}}icon24.png?t={{Timestamp}}"></image>
</view>

1
src/pages/index/index.ts

@ -14,7 +14,6 @@ Page({ @@ -14,7 +14,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

24
src/pages/index/index.wxml

@ -1,18 +1,18 @@ @@ -1,18 +1,18 @@
<navbar fixed custom-style="background:{{background}}" back>
<image class="page-title" slot="left" src="/images/logo2.png"></image>
<image class="page-title" slot="left" src="{{imageUrl}}logo2.png?t={{Timestamp}}"></image>
</navbar>
<view class="page" style="background: url('/images/bg3.png') no-repeat top center/100%;padding-top: {{pageTop}}px;">
<view class="page" style="background: url('{{imageUrl}}bg3.png?t={{Timestamp}}') no-repeat top center/100%;padding-top: {{pageTop}}px;">
<view class="user">
<image class="avatar" mode="aspectFill" src="/images/bg1.png"></image>
<image class="avatar" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="name">Hi, 伍六七</view>
<view class="content">星动守护您的第 15 天~</view>
</view>
</view>
<view class="new-gift">
<image class="characters" src="/images/bg5.png"></image>
<image class="n-img" src="/images/bg4.png"></image>
<image class="characters" src="{{imageUrl}}bg5.png?t={{Timestamp}}"></image>
<image class="n-img" src="{{imageUrl}}bg4.png?t={{Timestamp}}"></image>
</view>
<view class="kkd"></view>
<view class="video-list">
@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
</view>
<view class="scroll">
<view class="card" wx:for="{{10}}" wx:key="index">
<image class="poster" mode="aspectFill" src="/images/bg1.png"></image>
<image class="poster" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="info">
<view class="title">心脏突然狂飙跳</view>
</view>
@ -46,10 +46,10 @@ @@ -46,10 +46,10 @@
<view class="i-list">
<view class="list-card">
<view class="photo-wrap">
<image class="photo" mode="aspectFill" src="/images/bg1.png"></image>
<image class="photo" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<!-- <view class="type1">图文</view> -->
<view class="type2">
<image class="icon" src="/images/icon10.png"></image>
<image class="icon" src="{{imageUrl}}icon10.png?t={{Timestamp}}"></image>
视频
</view>
</view>
@ -59,11 +59,11 @@ @@ -59,11 +59,11 @@
<view class="tag">认识PSVT</view>
<view class="stat">
<view class="s-item">
<image class="icon" src="/images/icon8.png"></image>
<image class="icon" src="{{imageUrl}}icon8.png?t={{Timestamp}}"></image>
2.1万
</view>
<view class="s-item">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
2.1万
</view>
</view>
@ -75,10 +75,10 @@ @@ -75,10 +75,10 @@
</view>
<view class="back-top">
<image class="icon" src="/images/icon11.png"></image>
<image class="icon" src="{{imageUrl}}icon11.png?t={{Timestamp}}"></image>
</view>
<view class="wechat" bind:tap="handleWechatWork">
<image class="icon" src="/images/icon12.png"></image>
<image class="icon" src="{{imageUrl}}icon12.png?t={{Timestamp}}"></image>
<view class="name">健康助理</view>
</view>

47
src/pages/login/index.scss

@ -42,12 +42,57 @@ @@ -42,12 +42,57 @@
height: 40rpx;
}
}
.switch{
.switch {
margin-top: 56rpx;
font-size: 32rpx;
color: rgba(47, 130, 169, 1);
text-align: center;
}
.form {
margin-top: 32rpx;
.row {
margin-bottom: 40rpx;
padding: 0 10rpx 0 32rpx;
display: flex;
align-items: center;
background: #f9fafb;
border: 1px solid #f1f5f9;
border-radius: 24rpx;
.input {
flex: 1;
padding: 20rpx 0;
height: 40rpx;
font-size: 28rpx;
color: rgba(30, 41, 59, 1);
}
.input-place {
color: rgba(148, 163, 184, 1);
}
.code {
margin-left: 24rpx;
flex-shrink: 0;
width: 212rpx;
height: 68rpx;
border-radius: 24rpx;
font-size: 28rpx;
color: #fff;
background: var(--, linear-gradient(270deg, #439fc7 0%, #2f82a9 100%));
display: flex;
align-items: center;
justify-content: center;
}
}
.submit {
height: 96rpx;
background: var(--, linear-gradient(270deg, #439fc7 0%, #2f82a9 100%));
border-radius: 24rpx;
font-size: 34rpx;
color: #ffffff;
font-weight: bold;
text-align: center;
line-height: 96rpx;
}
}
.argument {
margin-top: 120rpx;
line-height: 48rpx;

113
src/pages/login/index.ts

@ -1,9 +1,16 @@ @@ -1,9 +1,16 @@
const app = getApp<IAppOption>()
let timer = null as null | number
Page({
data: {
menuTop: 0,
checked: false,
codeText: '发送验证码',
showTel: false,
mobile: '',
code: '',
},
onLoad(_options) {
const menuRes = wx.getMenuButtonBoundingClientRect()
@ -12,6 +19,51 @@ Page({ @@ -12,6 +19,51 @@ Page({
})
app.waitLogin({ type: 'any' }).then(() => {})
},
getCode() {
if (timer) return
const mobile = this.data.mobile
if (!mobile) {
wx.showToast({
title: '手机号不能为空',
icon: 'none',
})
return
}
// 验证手机号
if (!/^1[3-9,]\d{9}$/.test(mobile)) {
wx.showToast({
title: '手机号格式不正确',
icon: 'none',
})
return
}
wx.ajax({
method: 'POST',
url: '?r=psvt/login/send-verify-code',
data: {
mobile,
},
}).then((_res) => {
wx.showToast({
icon: 'none',
title: '验证码已发送~',
})
let time = 60
timer = setInterval(() => {
time--
this.setData({
codeText: `${time}s后重新发送`,
})
if (time <= 0) {
clearInterval(timer as number)
timer = null
this.setData({
codeText: '发送验证码',
})
}
}, 1000)
})
},
handleCheck() {
this.setData({
checked: !this.data.checked,
@ -23,14 +75,14 @@ Page({ @@ -23,14 +75,14 @@ Page({
const channelId = app.globalData.scene?.channelId || ''
wx.ajax({
method: 'POST',
url: '?r=psvt/patient/phone-register',
url: '?r=psvt/login/wx-reg-login',
data: {
iv: encodeURIComponent(iv),
encryptedData: encodeURIComponent(encryptedData),
channelId,
},
}).then(() => {
this.submitCallback()
}).then((res) => {
this.submitCallback(res)
})
}
},
@ -40,12 +92,59 @@ Page({ @@ -40,12 +92,59 @@ Page({
icon: 'none',
})
},
submitCallback() {
app.globalData.initLoginInfo.isReg = 1
wx.redirectTo({
url: '/pages/confirmInfo/index',
async handleSubmit() {
const { mobile, code } = this.data
if (!mobile) {
wx.showToast({
title: '请输入手机号',
icon: 'none',
})
return
}
if (!code) {
wx.showToast({
title: '请输入验证码',
icon: 'none',
})
return
}
wx.ajax({
method: 'POST',
url: '?r=psvt/login/reg-login',
data: {
mobile,
code,
},
showMsg: false,
})
.then((res) => {
this.submitCallback(res)
})
.catch((err) => {
wx.showToast({
title: err.data.msg,
icon: 'none',
})
})
},
handleShowTel() {
this.setData({
showTel: !this.data.showTel,
})
},
submitCallback(res) {
app.globalData.initLoginInfo.isReg = res.isReg
app.globalData.initLoginInfo.isLogin = res.isLogin
if (res.isReg === 0) {
wx.redirectTo({
url: '/pages/confirmInfo/index',
})
} else {
wx.redirectTo({
url: '/pages/index/index',
})
}
},
handleVisitors() {
app.globalData.anyWhere = true
wx.reLaunch({

36
src/pages/login/index.wxml

@ -1,35 +1,41 @@ @@ -1,35 +1,41 @@
<view class="page" style="background: url('/images/bg1.png') no-repeat top center/100%;padding-top: {{menuTop}}px;">
<image class="logo" src="/images/logo1.png"></image>
<view class="page" style="background: url('{{imageUrl}}bg1.png?t={{Timestamp}}') no-repeat top center/100%;padding-top: {{menuTop}}px;">
<image class="logo" src="{{imageUrl}}logo1.png?t={{Timestamp}}"></image>
<view class="container">
<view class="tip">请先阅读并同意相关协议。立即加入后,我们将为您提供更匹配的科普内容与服务支持。</view>
<button
wx:if="{{checked}}"
class="phone-btn"
open-type="getPhoneNumber"
bindgetphonenumber="handleWxSubmit"
>
<image class="icon" src="/images/icon1.png"></image>
<button wx:if="{{checked}}" class="phone-btn" open-type="getPhoneNumber" bindgetphonenumber="handleWxSubmit">
<image class="icon" src="{{imageUrl}}icon1.png?t={{Timestamp}}"></image>
手机号快捷登录
</button>
<button wx:else class="phone-btn" bind:tap="handleWxCheck">
<image class="icon" src="/images/icon1.png"></image>
<image class="icon" src="{{imageUrl}}icon1.png?t={{Timestamp}}"></image>
手机号快捷登录
</button>
<view class="switch">或输入手机号</view>
<view class="switch" bind:tap="handleShowTel">或输入手机号</view>
<view class="form" wx:if="{{showTel}}">
<view class="row">
<input type="number" model:value="{{mobile}}" class="input" placeholder="请输入手机号" />
</view>
<view class="row">
<input type="number" model:value="{{code}}" class="input" placeholder="请输入验证码" />
<view class="code" bind:tap="getCode">{{codeText}}</view>
</view>
<view wx:if="{{checked}}" class="submit" bind:tap="handleSubmit">立即加入</view>
<view wx:else class="submit" bind:tap="handleWxCheck">立即加入</view>
</view>
<view class="argument">
<view class="a-col">
<checkbox class="check" checked="{{checked}}" bind:tap="handleCheck">
<view class="check-content">
我已阅读并同意
<view class="link" bind:tap="handleLink" data-url="/doc/pages/privacyAgreement/index?active=1">
<view class="link" catch:tap="handleLink" data-url="/doc/pages/doc1/index?active=2">
《用户协议》
</view>
以及
<view class="link" bind:tap="handleLink" data-url="/doc/pages/privacyAgreement/index?active=1">
<view class="link" catch:tap="handleLink" data-url="/doc/pages/doc1/index?active=1">
《隐私政策》
</view>
<view class="link" bind:tap="handleLink" data-url="/doc/pages/privacyAgreement/index?active=1">
<view class="link" catch:tap="handleLink" data-url="/doc/pages/doc1/index?active=3">
《法律声明》
</view>
并同意平台基于服务需要收集和使用我的必要个人信息。
@ -39,7 +45,7 @@ @@ -39,7 +45,7 @@
</view>
<view class="any" bind:tap="handleVisitors">
随便看看
<image class="icon" src="/images/icon2.png"></image>
<image class="icon" src="{{imageUrl}}icon2.png?t={{Timestamp}}"></image>
</view>
</view>
</view>

3
src/pages/my/index.json

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
"navigationStyle": "custom",
"usingComponents": {
"popup": "/components/popup/index",
"navbar": "/components/navbar/index"
"navbar": "/components/navbar/index",
"van-icon": "@vant/weapp/icon/index"
}
}

6
src/pages/my/index.scss

@ -83,6 +83,8 @@ page { @@ -83,6 +83,8 @@ page {
height: 48rpx;
}
.content {
flex: 1;
padding: 0 32rpx;
font-size: 32rpx;
color: rgba(30, 41, 59, 1);
}
@ -96,7 +98,7 @@ page { @@ -96,7 +98,7 @@ page {
margin: 30rpx 40rpx;
padding: 32rpx;
border-radius: 32rpx;
border: 1px solid #fff;
border: 1rpx solid #fff;
background: rgba(255, 255, 255, 0.7);
box-sizing: border-box;
display: flex;
@ -108,7 +110,7 @@ page { @@ -108,7 +110,7 @@ page {
font-size: 32rpx;
color: rgba(30, 41, 59, 1);
line-height: 48rpx;
border-bottom: 1px dashed rgba(47, 130, 169, 0.35);
border-bottom: 1rpx dashed rgba(47, 130, 169, 0.35);
.high {
display: inline;
color: #2f82a9;

126
src/pages/my/index.ts

@ -1,129 +1,35 @@ @@ -1,129 +1,35 @@
const app = getApp<IAppOption>()
const app = getApp()
Page({
data: {
popupShow: false,
// popupType: 'stayTuned',
popupType: 'touristsInviteCode',
popupParams: {},
userInfo: {} as any,
showPatient: false,
applyWord: {
ApplyButtonWordOne: '',
ApplyButtonWordTwo: '',
},
days: 0,
},
onShow() {
app.waitLogin({ type: 0 }).then(() => {
app.mpBehavior({ PageName: 'BTN_MY_NAV' })
app.getUserInfo().then((userInfo) => {
this.setData({
userInfo,
Days: userInfo.Days.replace(/(\d+)/g, '<span style="font-size: 20px;color: rgba(242, 58, 47, 1);">$1</span>'),
})
})
this.getGeneConfig()
this.getApplyWord()
app.waitLogin().then(() => {
this.getMyInfo()
})
},
getGeneConfig() {
getMyInfo() {
wx.ajax({
method: 'GET',
url: '?r=wtx/common/get-gene-config',
data: {},
url: '?r=psvt/patient/my-info',
}).then((res) => {
let days = 0
if (res.firstOpenTime) {
const first = new Date(res.firstOpenTime.replace(/-/g, '/'))
const now = new Date()
days = Math.max(1, Math.ceil((now.getTime() - first.getTime()) / (1000 * 60 * 60 * 24)))
}
this.setData({
showPatient: res === '1',
})
})
},
getApplyWord() {
wx.ajax({
method: 'GET',
url: '?r=wtx/common/get-apply-word',
data: {},
}).then((res) => {
this.setData({
applyWord: res,
})
})
},
onChooseAvatar(e) {
const { avatarUrl } = e.detail
const url = `${app.globalData.upFileUrl}?r=file-service/upload-img`
wx.showLoading({
title: '上传中',
})
wx.uploadFile({
url,
filePath: avatarUrl,
name: 'file',
success: (res) => {
const data = JSON.parse(res.data)
const avatarUrl = data.data.Url
wx.ajax({
method: 'POST',
url: '?r=wtx/user/update-avatar',
data: {
Avatar: avatarUrl,
},
})
.then(() => {
wx.hideLoading()
wx.showToast({
title: '头像更新成功!',
icon: 'none',
})
this.setData({
'userInfo.Avatar': avatarUrl,
})
})
.catch(() => {
wx.hideLoading()
})
},
fail() {
wx.hideLoading()
},
})
},
handlePopupCancel() {
this.setData({
popupShow: false,
})
},
handlePopupOk() {
this.setData({
popupShow: false,
})
},
handlePatient(e) {
const { url, pname } = e.currentTarget.dataset
const { userInfo } = this.data
if (pname) {
app.mpBehavior({ PageName: pname })
}
if (userInfo.PatientId <= 0) {
this.setData({
popupShow: true,
popupType: 'touristsInviteCode',
userInfo: res,
days,
})
return
}
wx.navigateTo({
url,
})
},
routerTo(e: any) {
const { url, pname } = e.currentTarget.dataset
if (pname) {
app.mpBehavior({ PageName: pname })
}
wx.navigateTo({
url,
})
const { url } = e.currentTarget.dataset
wx.navigateTo({ url })
},
})

32
src/pages/my/index.wxml

@ -1,18 +1,18 @@ @@ -1,18 +1,18 @@
<navbar fixed custom-style="background:{{background}}" back>
<image class="page-title" slot="left" src="/images/logo2.png"></image>
<image class="page-title" slot="left" src="{{imageUrl}}logo2.png?t={{Timestamp}}"></image>
</navbar>
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="user">
<image class="avatar" mode="aspectFill" src="/images/bg1.png"></image>
<image class="avatar" mode="aspectFill" src="{{userInfo.avatar || imageUrl + 'bg1.png'}}"></image>
<view class="wrap">
<view class="name">张小山</view>
<view class="content">
<view class="name">{{userInfo.nickName || '用户'}}</view>
<view class="content" wx:if="{{days}}">
星动守护您的第
<view class="high">15</view>
<view class="high">{{days}}</view>
天~
</view>
</view>
@ -20,31 +20,31 @@ @@ -20,31 +20,31 @@
<view class="kkd">
<view class="k-item">
我的帖子
<image class="icon" src="/images/icon30.png"></image>
<image class="icon" src="{{imageUrl}}icon30.png?t={{Timestamp}}"></image>
</view>
<view class="k-item">
健康档案
<image class="icon" src="/images/icon31.png"></image>
<image class="icon" src="{{imageUrl}}icon31.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="list">
<view class="list-item">
<image class="icon" src="/images/icon32.png"></image>
<image class="icon" src="{{imageUrl}}icon32.png?t={{Timestamp}}"></image>
<view class="content">我的评论</view>
<van-icon class="arrow" name="arrow" />
</view>
<view class="list-item">
<image class="icon" src="/images/icon33.png"></image>
<image class="icon" src="{{imageUrl}}icon33.png?t={{Timestamp}}"></image>
<view class="content">我的收藏</view>
<van-icon class="arrow" name="arrow" />
</view>
<view class="list-item">
<image class="icon" src="/images/icon34.png"></image>
<view class="list-item" bind:tap="routerTo" data-url="/pages/userInfo/index">
<image class="icon" src="{{imageUrl}}icon34.png?t={{Timestamp}}"></image>
<view class="content">个人信息</view>
<van-icon class="arrow" name="arrow" />
</view>
<view class="list-item">
<image class="icon" src="/images/icon35.png"></image>
<view class="list-item" bind:tap="routerTo" data-url="/doc/pages/doc/index">
<image class="icon" src="{{imageUrl}}icon35.png?t={{Timestamp}}"></image>
<view class="content">隐私协议</view>
<van-icon class="arrow" name="arrow" />
</view>
@ -60,9 +60,9 @@ @@ -60,9 +60,9 @@
</view>
<view class="content">
长按识别二维码
<image class="icon" src="/images/icon36.png"></image>
<image class="icon" src="{{imageUrl}}icon36.png?t={{Timestamp}}"></image>
</view>
</view>
<image class="code" src="/images/bg1.png" show-menu-by-longpress></image>
<image class="code" src="{{imageUrl}}bg1.png?t={{Timestamp}}" show-menu-by-longpress></image>
</view>
</view>

1
src/pages/myCollection/index.ts

@ -27,7 +27,6 @@ Page({ @@ -27,7 +27,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

16
src/pages/myCollection/index.wxml

@ -5,10 +5,10 @@ @@ -5,10 +5,10 @@
</view>
</navbar>
<view class="page" style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx">
<view class="page" style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx">
<view class="page-header" id="page-header" style="" style="padding-top: {{pageTop + 21}}px;">
<view class="search">
<image class="icon" src="/images/icon14.png"></image>
<image class="icon" src="{{imageUrl}}icon14.png?t={{Timestamp}}"></image>
<input class="input" placeholder-class="place-input" type="text" placeholder="搜索视频" />
</view>
</view>
@ -31,14 +31,14 @@ @@ -31,14 +31,14 @@
<view class="body1">
<view class="card" wx:for="{{10}}" wx:key="index">
<view class="photo">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="stat">
<view class="s-item">
<image class="icon" src="/images/icon8-1.png"></image>
<image class="icon" src="{{imageUrl}}icon8-1.png?t={{Timestamp}}"></image>
12
</view>
<view class="s-item">
<image class="icon" src="/images/icon9-1.png"></image>
<image class="icon" src="{{imageUrl}}icon9-1.png?t={{Timestamp}}"></image>
12
</view>
</view>
@ -51,10 +51,10 @@ @@ -51,10 +51,10 @@
<view class="body2">
<view class="list-card">
<view class="photo-wrap">
<image class="photo" mode="aspectFill" src="/images/bg1.png"></image>
<image class="photo" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<!-- <view class="type1">图文</view> -->
<view class="type2">
<image class="icon" src="/images/icon10.png"></image>
<image class="icon" src="{{imageUrl}}icon10.png?t={{Timestamp}}"></image>
视频
</view>
</view>
@ -62,7 +62,7 @@ @@ -62,7 +62,7 @@
<view class="title">什么是 PSVT?3 分钟带您了 解阵发性室上性心动过速</view>
<view class="op-wrap">
<view class="op">
<image class="icon" src="/images/icon9-active.png"></image>
<image class="icon" src="{{imageUrl}}icon9-active.png?t={{Timestamp}}"></image>
取消收藏
</view>
</view>

1
src/pages/myComment/index.ts

@ -19,7 +19,6 @@ Page({ @@ -19,7 +19,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

6
src/pages/myComment/index.wxml

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="list">
<view class="list-card" bind:tap="handleDetail">
@ -28,11 +28,11 @@ @@ -28,11 +28,11 @@
</view>
</view>
<view class="card-overlay">
<image class="icon" src="/images/icon40.png"></image>
<image class="icon" src="{{imageUrl}}icon40.png?t={{Timestamp}}"></image>
<view class="overlay-text">评论正在审核中,预计1-2个工作日内完成审核。</view>
</view>
<view class="rejected">
<image class="icon" src="/images/icon39.png"></image>
<image class="icon" src="{{imageUrl}}icon39.png?t={{Timestamp}}"></image>
<view class="blod">驳回原因:</view>
语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当
语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当

1
src/pages/myWall/index.ts

@ -19,7 +19,6 @@ Page({ @@ -19,7 +19,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

10
src/pages/myWall/index.wxml

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="list">
<view class="list-card" bind:tap="handleDetail">
@ -22,23 +22,23 @@ @@ -22,23 +22,23 @@
<view class="tag" wx:for="{{4}}" wx:key="index">患者故事</view>
</view>
<!-- 单图 -->
<image class="photo1" mode="heightFix" src="/images/bg1.png"></image>
<image class="photo1" mode="heightFix" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<!-- 多图 -->
<view class="photo9">
<view class="p-item" wx:for="{{3}}" wx:key="index">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="date">2026年7月1日 13:09</view>
<view class="rejected">
<image class="icon" src="/images/icon39.png"></image>
<image class="icon" src="{{imageUrl}}icon39.png?t={{Timestamp}}"></image>
<view class="blod">驳回原因:</view>
语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当
语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当 语言不当
</view>
<view class="footer">
<view class="public">
<image class="icon" src="/images/icon37.png"></image>
<image class="icon" src="{{imageUrl}}icon37.png?t={{Timestamp}}"></image>
公开可见
</view>
<view class="btn-wrap">

7
src/pages/userInfo/index.json

@ -1,10 +1,9 @@ @@ -1,10 +1,9 @@
{
"navigationStyle": "custom",
"navigationBarTitleText": "我的评论",
"navigationBarTitleText": "个人信息",
"usingComponents": {
"popup": "/components/popup/index",
"navbar": "/components/navbar/index",
"uploadFile": "/components/uploadFile/index",
"van-popup": "@vant/weapp/popup/index"
"picker-area": "/components/pickerArea/index",
"van-icon": "@vant/weapp/icon/index"
}
}

18
src/pages/userInfo/index.scss

@ -21,7 +21,6 @@ page { @@ -21,7 +21,6 @@ page {
.info-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24rpx 0;
border-bottom: 1rpx solid #f1f5f9;
@ -38,6 +37,16 @@ page { @@ -38,6 +37,16 @@ page {
.info-value {
flex: 1;
padding-left: 24rpx;
font-size: 32rpx;
line-height: 48rpx;
color: #64748b;
text-align: right;
}
.info-input {
flex: 1;
padding-left: 24rpx;
font-size: 32rpx;
line-height: 48rpx;
color: #64748b;
@ -46,15 +55,20 @@ page { @@ -46,15 +55,20 @@ page {
.info-arrow {
color: #64748b;
margin-top: 4rpx;
margin-left: 8rpx;
}
.avatar-wrap {
.avatar-wrapper {
width: 112rpx;
height: 112rpx;
border-radius: 50%;
background: #d9d9d9;
overflow: hidden;
padding: 0;
margin: 0;
border: none;
line-height: normal;
.avatar {
width: 100%;

261
src/pages/userInfo/index.ts

@ -1,101 +1,204 @@ @@ -1,101 +1,204 @@
const app = getApp<IAppOption>()
interface OptionItem {
value: number
label: string
}
const parseList = (list: any): OptionItem[] => {
if (Array.isArray(list)) {
return list.map((item) => {
const key = Object.keys(item)[0]
return { value: Number(key), label: item[key] }
})
}
if (list && typeof list === 'object') {
return Object.keys(list).map((key) => ({
value: Number(key),
label: list[key],
}))
}
return []
}
Page({
data: {
popupShow: false,
popupType: '',
popupParams: {
position: 'bottom',
} as any,
// 用户信息 (from API 1.4)
userInfo: {} as any,
topicShow: false,
replayShow: true,
// 基础数据列表 (from API 1.7)
ageRangeList: [] as OptionItem[],
genderList: [] as OptionItem[],
diagnosisStatusList: [] as OptionItem[],
surgeryStatusList: [] as OptionItem[],
fileList: [] as any[],
// picker 索引
ageRangeIndex: 0,
genderIndex: 0,
// 地区
provinceId: '' as string | number,
provinceName: '',
cityId: '' as string | number,
cityName: '',
regionText: '',
currentMonth: '',
},
onLoad() {
app.waitLogin({ type: 0 }).then(() => {})
},
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',
data: {
WorkerId: app.globalData.scene?.workerId || '',
},
}).then(() => {
this.setData({
popupShow: false,
popupType: '',
popupParams: {},
})
const waitBindDoctorId = app.globalData.waitBindDoctorId
if (waitBindDoctorId) {
this.handleBindDoctor(waitBindDoctorId)
}
})
}
if (popupType === 'conformBindDoctorConform') {
this.setData({
popupShow: false,
const now = new Date()
const currentMonth = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`
this.setData({ currentMonth })
this.getBaseData().then(() => {
this.getMyInfo()
})
},
getMyInfo() {
wx.ajax({
method: 'GET',
url: '?r=psvt/patient/my-info',
}).then((res) => {
this.enrichUserInfo(res)
})
},
enrichUserInfo(info: any) {
info.ageRangeName = this.getLabel(this.data.ageRangeList, info.ageRange)
info.genderName = this.getLabel(this.data.genderList, info.gender)
info.diagnosisStatusName = this.getLabel(this.data.diagnosisStatusList, info.diagnosisStatus)
info.surgeryStatusName = this.getLabel(this.data.surgeryStatusList, info.surgeryStatus)
const regionText = [info.provinceName, info.cityName].filter(Boolean).join(' ')
const ageRangeIndex = this.getIndex(this.data.ageRangeList, info.ageRange)
const genderIndex = this.getIndex(this.data.genderList, info.gender)
this.setData({
userInfo: info,
ageRangeIndex,
genderIndex,
provinceId: info.provinceId || '',
provinceName: info.provinceName || '',
cityId: info.cityId || '',
cityName: info.cityName || '',
regionText,
})
},
getBaseData() {
return wx
.ajax({
method: 'GET',
url: '?r=psvt/patient/base-data',
})
wx.ajax({
method: 'POST',
url: '?r=wtx/account/wait-bind-doctor',
data: {
doctorId: app.globalData.waitBindDoctorId,
},
}).then(() => {
wx.navigateTo({
url: `/patient/pages/login/index`,
.then((res) => {
this.setData({
ageRangeList: parseList(res.ageRangeList),
genderList: parseList(res.genderList),
diagnosisStatusList: parseList(res.diagnosisStatusList),
surgeryStatusList: parseList(res.surgeryStatusList),
})
})
}
},
handlePopupCancel() {
const { popupType } = this.data
if (popupType === 'argument') {
wx.exitMiniProgram()
}
if (popupType === 'conformBindDoctorConform') {
this.setData({
popupShow: false,
})
wx.ajax({
method: 'POST',
url: '?r=wtx/account/wait-bind-doctor',
data: {
doctorId: app.globalData.waitBindDoctorId,
},
}).then(() => {
app.globalData.waitBindDoctorId = ''
})
}
},
handleWechatWork() {
wx.navigateTo({
url: '/pages/wechatWork/index',
getLabel(list: OptionItem[], value: number): string {
const item = list.find((i) => i.value === value)
return item ? item.label : ''
},
getIndex(list: OptionItem[], value: number): number {
const index = list.findIndex((i) => i.value === value)
return index >= 0 ? index : 0
},
onChooseAvatar(e: WechatMiniprogram.CustomEvent) {
const { avatarUrl } = e.detail
const url = `${app.globalData.upFileUrl}?r=file-service/upload-img`
wx.showLoading({ title: '上传中' })
wx.uploadFile({
url,
filePath: avatarUrl,
name: 'file',
success: (res) => {
const data = JSON.parse(res.data)
const uploadedUrl = data.data.Url
wx.ajax({
method: 'POST',
url: '?r=psvt/patient/update-my-info',
data: { avatar: uploadedUrl },
})
.then(() => {
wx.hideLoading()
wx.showToast({ title: '头像更新成功!', icon: 'none' })
this.setData({ 'userInfo.avatar': uploadedUrl })
})
.catch(() => {
wx.hideLoading()
})
},
fail() {
wx.hideLoading()
},
})
},
handleSetData(e) {
const { fileList } = this.data
handleNickNameChange(e: WechatMiniprogram.Input) {
const nickName = e.detail.value.trim()
if (!nickName || nickName === this.data.userInfo.nickName) return
this.submitUpdate({ nickName })
},
// picker 选择
handleAgeChange(e: WechatMiniprogram.PickerChange) {
const index = Number(e.detail.value)
const item = this.data.ageRangeList[index]
if (!item || item.value === this.data.userInfo.ageRange) return
this.submitUpdate({ ageRange: item.value })
},
handleGenderChange(e: WechatMiniprogram.PickerChange) {
const index = Number(e.detail.value)
const item = this.data.genderList[index]
if (!item || item.value === this.data.userInfo.gender) return
this.submitUpdate({ gender: item.value })
},
handleAreaChange(e: any) {
const [province, city] = e.detail
const provinceId = province.value ? Number(province.value) : ''
const cityId = city.value ? Number(city.value) : ''
this.setData({
fileList: [...fileList, ...e.detail],
provinceId,
provinceName: province.label,
cityId,
cityName: city.label,
regionText: [province.label, city.label].filter(Boolean).join(' '),
})
this.submitUpdate({
provinceId,
provinceName: province.label,
cityId,
cityName: city.label,
})
},
handleDeleteFile(e) {
const { index } = e.detail
const { fileList } = this.data
this.setData({
fileList: fileList.filter((_, i) => i !== index),
submitUpdate(data: Record<string, any>) {
wx.ajax({
method: 'POST',
url: '?r=psvt/patient/update-my-info',
data,
loading: true,
loadingText: '保存中...',
}).then((res) => {
this.enrichUserInfo(res)
wx.showToast({ title: '保存成功', icon: 'none' })
})
},
topicClose() {
this.setData({
topicShow: false,
handleChangeTel() {
wx.navigateTo({
url: '/pages/changeTel/index',
})
},
handleBack() {
wx.navigateBack()
},
handleLogout() {
wx.showModal({
title: '提示',
content: '确定退出登录吗?',
success: (res) => {
if (res.confirm) {
app.globalData.loginState = ''
app.globalData.initLoginInfo = {}
wx.reLaunch({ url: '/pages/login/index' })
}
},
})
},
})

76
src/pages/userInfo/index.wxml

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
<navbar fixed custom-style="background:{{background}}" back>
<view class="page-title" slot="left">
<view class="page-title" slot="left" bind:tap="handleBack">
<van-icon name="arrow-left" />
个人信息
</view>
@ -7,54 +7,72 @@ @@ -7,54 +7,72 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="list">
<view class="info-card">
<view class="info-row">
<text class="info-label">头像</text>
<view class="avatar-wrap">
<image class="avatar" src="" mode="aspectFill" />
</view>
<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
<image class="avatar" src="{{userInfo.avatar || ''}}" mode="aspectFill" />
</button>
</view>
<view class="info-row">
<text class="info-label">昵称</text>
<text class="info-value">ZSX0092</text>
<input
class="info-input"
value="{{userInfo.nickName || ''}}"
bindblur="handleNickNameChange"
placeholder="请输入昵称"
/>
</view>
<view class="info-row" bind:tap="handlePhone">
<view class="info-row" bind:tap="handleChangeTel">
<text class="info-label">手机号</text>
<text class="info-value">153****0000</text>
<van-icon name="arrow" class="info-arrow" />
</view>
<view class="info-row" bind:tap="handleAge">
<text class="info-label">年龄段</text>
<text class="info-value">18-35岁</text>
<van-icon name="arrow" class="info-arrow" />
</view>
<view class="info-row" bind:tap="handleGender">
<text class="info-label">性别</text>
<text class="info-value">女</text>
<van-icon name="arrow" class="info-arrow" />
</view>
<view class="info-row" bind:tap="handleRegion">
<text class="info-label">所在地区</text>
<text class="info-value">北京/北京市</text>
<text class="info-value">{{userInfo.telephone || ''}}</text>
<van-icon name="arrow" class="info-arrow" />
</view>
<view class="info-row" bind:tap="handleHealth">
<picker range="{{ageRangeList}}" range-key="label" value="{{ageRangeIndex}}" bindchange="handleAgeChange">
<view class="info-row">
<text class="info-label">年龄段</text>
<text class="info-value">{{userInfo.ageRangeName || ''}}</text>
<van-icon name="arrow" class="info-arrow" />
</view>
</picker>
<picker range="{{genderList}}" range-key="label" value="{{genderIndex}}" bindchange="handleGenderChange">
<view class="info-row">
<text class="info-label">性别</text>
<text class="info-value">{{userInfo.genderName || ''}}</text>
<van-icon name="arrow" class="info-arrow" />
</view>
</picker>
<picker-area
id="pickerArea"
pname="{{provinceName}}"
pid="{{provinceId}}"
cname="{{cityName}}"
cid="{{cityId}}"
bind:change="handleAreaChange"
>
<view class="info-row">
<text class="info-label">所在地区</text>
<text class="info-value">{{regionText || ''}}</text>
<van-icon name="arrow" class="info-arrow" />
</view>
</picker-area>
<view class="info-row">
<text class="info-label">我的健康状态</text>
<text class="info-value">已确诊</text>
<text class="info-value">{{userInfo.diagnosisStatusName || ''}}</text>
</view>
<view class="info-row">
<view class="info-row" wx:if="{{userInfo.diagnosisStatus === 2}}">
<text class="info-label">确诊时间</text>
<text class="info-value">2024-08-01</text>
<text class="info-value">{{userInfo.diagnosisTime || ''}}</text>
</view>
<view class="info-row">
<text class="info-label">是否接受过手术治疗</text>
<text class="info-value">正在评估</text>
<text class="info-value">{{userInfo.surgeryStatusName || ''}}</text>
</view>
</view>
<view class="btn-logout">退出登录</view>
<view class="btn-logout" bind:tap="handleLogout">退出登录</view>
<view class="btn-cancel">注销</view>
</view>
</view>

8
src/pages/videoDetail/index.wxml

@ -60,19 +60,19 @@ @@ -60,19 +60,19 @@
<view class="container">
<view class="op-wrap">
<view class="op">
<image class="icon" src="/images/icon9-1.png"></image>
<image class="icon" src="{{imageUrl}}icon9-1.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon8-1.png"></image>
<image class="icon" src="{{imageUrl}}icon8-1.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon28-1.png"></image>
<image class="icon" src="{{imageUrl}}icon28-1.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon29-1.png"></image>
<image class="icon" src="{{imageUrl}}icon29-1.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
</view>

1
src/pages/videoList/index.ts

@ -14,7 +14,6 @@ Page({ @@ -14,7 +14,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

12
src/pages/videoList/index.wxml

@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
<navbar fixed custom-style="background:{{background}}" back>
<image class="page-title" slot="left" src="/images/logo2.png"></image>
<image class="page-title" slot="left" src="{{imageUrl}}logo2.png?t={{Timestamp}}"></image>
</navbar>
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="page-header">
<view class="search">
<image class="icon" src="/images/icon14.png"></image>
<image class="icon" src="{{imageUrl}}icon14.png?t={{Timestamp}}"></image>
<input class="input" placeholder-class="place-input" type="text" placeholder="搜索帖子 / 话题 / 患者故事" />
</view>
</view>
@ -18,14 +18,14 @@ @@ -18,14 +18,14 @@
<view class="list">
<view class="card" wx:for="{{4}}" wx:key="index">
<view class="photo">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="stat">
<view class="s-item">
<image class="icon" src="/images/icon8-1.png"></image>
<image class="icon" src="{{imageUrl}}icon8-1.png?t={{Timestamp}}"></image>
12
</view>
<view class="s-item">
<image class="icon" src="/images/icon9-1.png"></image>
<image class="icon" src="{{imageUrl}}icon9-1.png?t={{Timestamp}}"></image>
12
</view>
</view>

1
src/pages/wall/index.ts

@ -14,7 +14,6 @@ Page({ @@ -14,7 +14,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

22
src/pages/wall/index.wxml

@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
<navbar fixed custom-style="background:{{background}}" back>
<image class="page-title" slot="left" src="/images/logo2.png"></image>
<image class="page-title" slot="left" src="{{imageUrl}}logo2.png?t={{Timestamp}}"></image>
</navbar>
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="page-header">
<view class="search">
<image class="icon" src="/images/icon14.png"></image>
<image class="icon" src="{{imageUrl}}icon14.png?t={{Timestamp}}"></image>
<input class="input" placeholder-class="place-input" type="text" placeholder="搜索帖子 / 话题 / 患者故事" />
</view>
</view>
@ -33,13 +33,13 @@ @@ -33,13 +33,13 @@
<view class="list">
<view class="list-card" bind:tap="handleDetail">
<view class="user">
<image class="avatar" mode="aspectFill" src="/images/bg1.png"></image>
<image class="avatar" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="name">@林间心跳</view>
<view class="date">2026年7月1日 13:09</view>
</view>
</view>
<view class="hot" style="background: url('/images/bg11.png') no-repeat top center/100%">热门推荐</view>
<view class="hot" style="background: url('{{imageUrl}}bg11.png?t={{Timestamp}}') no-repeat top center/100%">热门推荐</view>
<view class="content">
<view class="c-topic">#我的心悸经历</view>
<view class="c-topic">#PSVT急救常识</view>
@ -49,11 +49,11 @@ @@ -49,11 +49,11 @@
<view class="tag" wx:for="{{4}}" wx:key="index">患者故事</view>
</view>
<!-- 单图 -->
<image class="photo1" mode="heightFix" src="/images/bg1.png"></image>
<image class="photo1" mode="heightFix" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<!-- 多图 -->
<view class="photo9">
<view class="p-item" wx:for="{{3}}" wx:key="index">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="comment">
@ -62,15 +62,15 @@ @@ -62,15 +62,15 @@
</view>
<view class="footer">
<view class="op">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon8.png"></image>
<image class="icon" src="{{imageUrl}}icon8.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon15.png"></image>
<image class="icon" src="{{imageUrl}}icon15.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
</view>
@ -79,5 +79,5 @@ @@ -79,5 +79,5 @@
</view>
<view class="fixed-add">
<image class="icon" src="/images/icon24.png"></image>
<image class="icon" src="{{imageUrl}}icon24.png?t={{Timestamp}}"></image>
</view>

1
src/pages/wallDetail/index.ts

@ -18,7 +18,6 @@ Page({ @@ -18,7 +18,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

34
src/pages/wallDetail/index.wxml

@ -7,11 +7,11 @@ @@ -7,11 +7,11 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="info-card">
<view class="user">
<image class="avatar" mode="aspectFill" src="/images/bg1.png"></image>
<image class="avatar" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="name">@林间心跳</view>
<view class="date">2026年7月1日 13:09</view>
@ -26,11 +26,11 @@ @@ -26,11 +26,11 @@
<view class="tag" wx:for="{{4}}" wx:key="index">患者故事</view>
</view>
<!-- 单图 -->
<image class="photo1" mode="heightFix" src="/images/bg1.png"></image>
<image class="photo1" mode="heightFix" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<!-- 多图 -->
<view class="photo9">
<view class="p-item" wx:for="{{3}}" wx:key="index">
<image class="p-img" mode="aspectFill" src="/images/bg1.png"></image>
<image class="p-img" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
</view>
</view>
<view class="comment">
@ -47,7 +47,7 @@ @@ -47,7 +47,7 @@
<view class="list">
<view class="list-card">
<view class="comment-item">
<image class="avatar" mode="aspectFill" src="/images/bg1.png"></image>
<image class="avatar" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="w-header">
<view class="name">小鹿</view>
@ -56,11 +56,11 @@ @@ -56,11 +56,11 @@
<view class="content">我也是,复诊前先整理记录,医生会更容易</view>
<view class="op-wrap">
<view class="op">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon15.png"></image>
<image class="icon" src="{{imageUrl}}icon15.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
</view>
@ -68,7 +68,7 @@ @@ -68,7 +68,7 @@
</view>
<view class="replay-list">
<view class="comment-item">
<image class="avatar" mode="aspectFill" src="/images/bg1.png"></image>
<image class="avatar" mode="aspectFill" src="{{imageUrl}}bg1.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="w-header">
<view class="name">小鹿</view>
@ -80,11 +80,11 @@ @@ -80,11 +80,11 @@
</view>
<view class="op-wrap">
<view class="op">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon15.png"></image>
<image class="icon" src="{{imageUrl}}icon15.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
</view>
@ -102,7 +102,7 @@ @@ -102,7 +102,7 @@
<view class="page-footer">
<view class="auth" wx:if="{{false}}">
<image class="icon" mode="widthFix" src="/images/icon37.png"></image>
<image class="icon" mode="widthFix" src="{{imageUrl}}icon37.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="status">公开可见</view>
<view class="content">
@ -112,7 +112,7 @@ @@ -112,7 +112,7 @@
</view>
</view>
<view class="auth" wx:elif="{{false}}">
<image class="icon" mode="widthFix" src="/images/icon22.png"></image>
<image class="icon" mode="widthFix" src="{{imageUrl}}icon22.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="status">仅自己可见</view>
<view class="content">
@ -124,15 +124,15 @@ @@ -124,15 +124,15 @@
<view class="comment" wx:else>我要评论</view>
<view class="op-wrap">
<view class="op">
<image class="icon" src="/images/icon9.png"></image>
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon8.png"></image>
<image class="icon" src="{{imageUrl}}icon8.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
<view class="op">
<image class="icon" src="/images/icon15.png"></image>
<image class="icon" src="{{imageUrl}}icon15.png?t={{Timestamp}}"></image>
<view class="num">126</view>
</view>
</view>
@ -180,11 +180,11 @@ @@ -180,11 +180,11 @@
<view class="action-popup">
<view class="a-list">
<view class="row">
<image class="icon" src="/images/icon41.png"></image>
<image class="icon" src="{{imageUrl}}icon41.png?t={{Timestamp}}"></image>
编辑
</view>
<view class="row">
<image class="icon" src="/images/icon42.png"></image>
<image class="icon" src="{{imageUrl}}icon42.png?t={{Timestamp}}"></image>
删除
</view>
</view>

1
src/pages/wallForm/index.ts

@ -19,7 +19,6 @@ Page({ @@ -19,7 +19,6 @@ Page({
handlePopupOk() {
const { popupType } = this.data
if (popupType === 'argument') {
app.mpBehavior({ PageName: 'BTN_PATIENTLOG' })
wx.ajax({
method: 'POST',
url: '?r=wtx/user/agree-guest-privacy',

18
src/pages/wallForm/index.wxml

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<view
class="page"
style="background: url('/images/bg6.png') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100% 478rpx;padding-top: {{pageTop}}px;"
>
<view class="form">
<view class="upload-wrap">
@ -22,13 +22,13 @@ @@ -22,13 +22,13 @@
></textarea>
<view class="topic-list">
<view class="t-item" wx:for="{{5}}" wx:key="index">
<image class="icon" src="/images/icon18.png"></image>
<image class="icon" src="{{imageUrl}}icon18.png?t={{Timestamp}}"></image>
我的心悸经历
</view>
</view>
<view class="wrap">
<view class="topic-btn">
<image class="icon" src="/images/icon18.png"></image>
<image class="icon" src="{{imageUrl}}icon18.png?t={{Timestamp}}"></image>
话题
</view>
<view class="total">0/2000</view>
@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
</view>
<view class="tag-module">
<view class="t-header">
<image class="icon" src="/images/icon19.png"></image>
<image class="icon" src="{{imageUrl}}icon19.png?t={{Timestamp}}"></image>
内容标签
</view>
<view class="tag-wrap">
@ -45,19 +45,19 @@ @@ -45,19 +45,19 @@
</view>
<view class="view-module">
<view class="v-header">
<image class="icon" src="/images/icon20.png"></image>
<image class="icon" src="{{imageUrl}}icon20.png?t={{Timestamp}}"></image>
谁可以看
</view>
<view class="v-wrap">
<view class="item active">
<image class="icon" src="/images/icon21.png"></image>
<image class="icon" src="{{imageUrl}}icon21.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="name">公开</view>
<view class="content">所有用户可见</view>
</view>
</view>
<view class="item">
<image class="icon" src="/images/icon22.png"></image>
<image class="icon" src="{{imageUrl}}icon22.png?t={{Timestamp}}"></image>
<view class="wrap">
<view class="name">私密</view>
<view class="content">仅自己可见</view>
@ -67,11 +67,11 @@ @@ -67,11 +67,11 @@
</view>
<view class="page-footer">
<view class="cancel">
<image class="icon" src="/images/icon26.png"></image>
<image class="icon" src="{{imageUrl}}icon26.png?t={{Timestamp}}"></image>
存草稿
</view>
<view class="send">
<image class="icon" src="/images/icon27.png"></image>
<image class="icon" src="{{imageUrl}}icon27.png?t={{Timestamp}}"></image>
发布
</view>
</view>

16
src/pages/wechatWork/index.wxml

@ -1,17 +1,17 @@ @@ -1,17 +1,17 @@
<navbar fixed custom-style="background:{{background}}" back>
<image class="page-title" slot="left" src="/images/logo2.png"></image>
<image class="page-title" slot="left" src="{{imageUrl}}logo2.png?t={{Timestamp}}"></image>
</navbar>
<view class="page" style="background: url('/images/bg6.png') no-repeat top center/100%;padding-top: {{pageTop}}rpx;">
<view class="container" style="background: url('/images/bg7.png') no-repeat top center/100%">
<view class="page" style="background: url('{{imageUrl}}bg6.png?t={{Timestamp}}') no-repeat top center/100%;padding-top: {{pageTop}}rpx;">
<view class="container" style="background: url('{{imageUrl}}bg7.png?t={{Timestamp}}') no-repeat top center/100%">
<view class="title">
<image class="icon1" src="/images/icon13.png"></image>
<image class="icon1" src="{{imageUrl}}icon13.png?t={{Timestamp}}"></image>
添加你的专属客服
<image class="icon2" src="/images/icon13.png"></image>
<image class="icon2" src="{{imageUrl}}icon13.png?t={{Timestamp}}"></image>
</view>
<view class="code-wrap" style="background: url('/images/bg8.png') no-repeat top center/100%">
<image class="code" src="/images/bg1.png" show-menu-by-longpress></image>
<view class="code-wrap" style="background: url('{{imageUrl}}bg8.png?t={{Timestamp}}') no-repeat top center/100%">
<image class="code" src="{{imageUrl}}bg1.png?t={{Timestamp}}" show-menu-by-longpress></image>
</view>
<view class="btn" style="background: url('/images/btn1.png') no-repeat top center/100%">长按识别二维码</view>
<view class="btn" style="background: url('{{imageUrl}}btn1.png?t={{Timestamp}}') no-repeat top center/100%">长按识别二维码</view>
</view>
</view>

Loading…
Cancel
Save