wangguoyu 1 month ago
parent
commit
fa6d5d3858
100 changed files with 617 additions and 11948 deletions
  1. 0 86
      api/banzheng.js
  2. 0 48
      api/hetong.js
  3. 0 431
      api/jiazheng.js
  4. 0 216
      api/kaoshi.js
  5. 0 123
      api/kecheng.js
  6. 0 56
      api/kehu.js
  7. 0 99
      api/lianxi.js
  8. 4 18
      api/login.js
  9. 0 134
      api/my.js
  10. 0 129
      api/sanfang.js
  11. 0 73
      api/shouye.js
  12. 0 13
      api/yishou.js
  13. 0 25
      api/zijiazhenggongsi.js
  14. 0 73
      api/zizhanghao.js
  15. 0 85
      components/custom-tabbar/custom-tabbar-admin.vue
  16. 0 51
      components/custom-tabbar/custom-tabbar-client.vue
  17. 0 352
      components/customMap/customMap.vue
  18. 0 69
      components/customMap/useMap.js
  19. 0 71
      components/dialog/commonDialog.vue
  20. 0 71
      components/dialog/contentDialog.vue
  21. 0 66
      components/dialog/qiepingDl.vue
  22. 0 99
      components/dialog/shengJiDialog.vue
  23. 0 83
      components/dialog/shexiangDialog.vue
  24. 0 38
      components/dialog/tipDialog.vue
  25. 0 103
      components/identification/identification.vue
  26. 0 73
      components/kaoshixuzhi/kaoshixuzhi.vue
  27. 0 73
      components/kaoshixuzhi/lianxixuzhi.vue
  28. 0 79
      components/kecheng-mulu/kecheng-mulu.vue
  29. 0 128
      components/listCard/kaoshiCard.vue
  30. 0 52
      components/listCard/kechengCard.vue
  31. 0 85
      components/listCard/lianxiCard.vue
  32. 0 25
      components/myCollapseCard/myCollapseCard.vue
  33. 0 57
      components/password-lli/password-lli.vue
  34. 0 85
      components/questions/danxuan.vue
  35. 0 87
      components/questions/duoxuan.vue
  36. 0 52
      components/questions/panduan.vue
  37. 0 35
      components/questions/tiankong.vue
  38. 0 85
      components/questions/useQuestionTools.js
  39. 0 39
      components/score/topCard.vue
  40. 0 40
      components/scoreAndAnswer/scoreAndAnswerAdmin.vue
  41. 0 44
      components/scoreAndAnswer/scoreAndAnswerAdminTiankong.vue
  42. 0 146
      components/selectZyLevel/index.vue
  43. 0 239
      components/videoPlay/videoPlay.vue
  44. 0 91
      components/writeSign/index.vue
  45. 0 57
      components/zhuapaiConfirm/answerQueren.vue
  46. 0 137
      components/zhuapaiConfirm/index.vue
  47. 0 138
      components/zhuapaiConfirm/qieping.vue
  48. 0 107
      components/zhuapaiConfirm/submitScore.vue
  49. 0 512
      components/zhuapaiConfirm/useCamera.js
  50. 0 296
      components/zhuapaiConfirm/zhuapai.vue
  51. 9 0
      index.html
  52. 1 1
      manifest.json
  53. 0 330
      pages.json
  54. 311 0
      pages/Login/clientIndex copy.vue
  55. 292 2
      pages/Login/clientIndex.vue
  56. 0 194
      pages/Login/components/adminloginBox.vue
  57. 0 156
      pages/Login/components/clientloginBox.vue
  58. 0 6
      pages/Login/index.vue
  59. 0 466
      pages/admin/Chengji/ksScoreShijuan.vue
  60. 0 257
      pages/admin/Chengji/list.vue
  61. 0 154
      pages/admin/Hetong/Hetong.vue
  62. 0 156
      pages/admin/Hetong/HetongInfo.vue
  63. 0 163
      pages/admin/Hetong/HetongList.vue
  64. 0 264
      pages/admin/Hetong/addSanfangHetong.vue
  65. 0 120
      pages/admin/Hetong/components/addKh.vue
  66. 0 48
      pages/admin/Hetong/components/bingFuWuFei.vue
  67. 0 46
      pages/admin/Hetong/components/fuWuBaoChou.vue
  68. 0 60
      pages/admin/Hetong/components/fuWuNeiRong.vue
  69. 0 82
      pages/admin/Hetong/components/fuWuShiJian.vue
  70. 0 39
      pages/admin/Hetong/components/fuzhuXiaohai.vue
  71. 0 69
      pages/admin/Hetong/components/haiziNianling.vue
  72. 0 69
      pages/admin/Hetong/components/haiziNianling2.vue
  73. 0 124
      pages/admin/Hetong/components/hetongCard.vue
  74. 0 32
      pages/admin/Hetong/components/jiawuItem.vue
  75. 0 45
      pages/admin/Hetong/components/jiazhengCard.vue
  76. 0 64
      pages/admin/Hetong/components/kehuCard.vue
  77. 0 69
      pages/admin/Hetong/components/laorenNianling.vue
  78. 0 32
      pages/admin/Hetong/components/qiTaYueDing.vue
  79. 0 76
      pages/admin/Hetong/components/qianMing.vue
  80. 0 27
      pages/admin/Hetong/components/qitaFuwu.vue
  81. 0 39
      pages/admin/Hetong/components/quanzhiXiaohai.vue
  82. 0 139
      pages/admin/Hetong/components/search.vue
  83. 0 195
      pages/admin/Hetong/components/selectJz.vue
  84. 0 200
      pages/admin/Hetong/components/selectKh.vue
  85. 0 29
      pages/admin/Hetong/components/zhaoguBingren.vue
  86. 0 64
      pages/admin/Hetong/components/zhaoguLaoren.vue
  87. 0 28
      pages/admin/Hetong/components/zhaoguYunfu.vue
  88. 0 96
      pages/admin/Hetong/previewHetong.vue
  89. 0 387
      pages/admin/Hetong/sanfangHetong.vue
  90. 0 16
      pages/admin/Hetong/useHetong.js
  91. 0 499
      pages/admin/Jiazheng/banzhengXinxi.vue
  92. 0 91
      pages/admin/Jiazheng/banzhengXinxiList.vue
  93. 0 607
      pages/admin/Jiazheng/bf/banzhengXinxi.vue
  94. 0 100
      pages/admin/Jiazheng/bf/banzhengXinxiList.vue
  95. 0 247
      pages/admin/Jiazheng/bf/common/dataChecked.vue
  96. 0 145
      pages/admin/Jiazheng/bf/common/jiazhengPdfUpload.vue
  97. 0 282
      pages/admin/Jiazheng/bf/common/jiazhengUpload.vue
  98. 0 104
      pages/admin/Jiazheng/bf/common/kechengLeixing.vue
  99. 0 113
      pages/admin/Jiazheng/bf/common/search.vue
  100. 0 42
      pages/admin/Jiazheng/bf/common/search2.vue

+ 0 - 86
api/banzheng.js

@@ -1,86 +0,0 @@
-import request from '@/utils/request'
-export function getKaozhengList(data = {}) {
-  return request({
-    url: '/app/user/kaozheng/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKaozhengJigou(data = {}) {
-  return request({
-    url: '/app/user/kaozheng/ops/jigou',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKaozhengZhiye(data = {}) {
-  return request({
-    url: '/app/user/kaozheng/ops/zhiye',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKaozhengLevel(data = {}) {
-  return request({
-    url: '/app/user/kaozheng/ops/level',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKaozhengBanzheng(data = {}) {
-  return request({
-    url: '/app/user/kaozheng/ops/status/banzheng',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKaozhengKaoshi(data = {}) {
-  return request({
-    url: '/app/user/kaozheng/ops/status/kaoshi',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function kaozhengDelete(data = {}) {
-  return request({
-    url: '/app/user/kaozheng/delete',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-

+ 0 - 48
api/hetong.js

@@ -1,48 +0,0 @@
-import request from '@/utils/request'
-export function getHetongLast(data = {}) {
-  return request({
-    url: '/app/guanliyuan/hetong/last/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-export function getHetongList(data = {}) {
-  return request({
-    url: '/app/guanliyuan/hetong/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-export function getHetongQianming(data = {}) {
-  return request({
-    url: '/app/guanliyuan/hetong/qianming',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getHetongInfo(data = {}) {
-  return request({
-    url: '/app/guanliyuan/hetong/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-

+ 0 - 431
api/jiazheng.js

@@ -1,431 +0,0 @@
-import request from '@/utils/request'
-
-export function getJiazhengList(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/list',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-// 阿里云 上传
-export function getAliyunPolicy(data = {}) {
-	return request({
-		url: '/app/file/policy',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengLeixing(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/leixing',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengJineng(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/jineng',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengZhuangtai(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/zhuangtai',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getBaozhengJigou(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/jigou',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengLevel(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/level',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengZhiye(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/zhiye',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengZhiyeAll(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/zhiye/all',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengXueli(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/xueli',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengHunyin(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/hunyin',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengMinzu(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/minzu',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengXingzuo(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/xingzuo',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengShuxiang(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/ops/shuxiang',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengJiguan(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/tree/city',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengBanzhengCheckKc(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kaozheng/check/kecheng',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengJianli(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/jianli',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function getJiazhengInfo(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/info',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function jiazhengAdd(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/add',
-		headers: {
-			isToken: false
-		},
-		isLoading: true,
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function jiazhengUpdate(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/update',
-		headers: {
-			isToken: false
-		},
-		isLoading: true,
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function jiazhengKaozhengAdd(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kaozheng/add',
-		headers: {
-			isToken: true
-		},
-		isLoading: true,
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-
-export function jiazhengKaozhengDelete(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kaozheng/delete',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-
-export function jiazhengIdcard(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/idcard',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-
-export function jiazhengCheck(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/check',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function jiazhengKaozhengUpdate(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kaozheng/update',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function jiazhengSharePic(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/share/pic',
-		headers: {
-			isToken: true
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-
-export function commonShare(data = {}) {
-	return request({
-		url: '/common/share',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function jiazhengUserDelete(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/delete',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function kcSelectList(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kecheng/select/list',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function jiazhengKcList(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kecheng/list',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function jiazhengKcAdd(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kecheng/add',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function jiazhengKcDelete(data = {}) {
-	return request({
-		url: '/app/user/jiazheng/kecheng/delete',
-		headers: {
-			isToken: false
-		},
-		method: 'post',
-		data,
-		timeout: 20000
-	})
-}
-export function getAdminClassify(data = {}) {
-  return request({
-    url: '/app/kecheng/guanliyuan/classify',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function kechengReset(data = {}) {
-  return request({
-    url: '/app/user/jiazheng/kecheng/reset',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function chaxunNumberKecheng(data = {}) {
-  return request({
-    url: '/app/user/jiazheng/kecheng/yue',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function jiazhengKaozhengAdds(data = {}) {
-  return request({
-    url: '/app/user/jiazheng/kaozheng/adds',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 216
api/kaoshi.js

@@ -1,216 +0,0 @@
-import request from '@/utils/request'
-
-export function getKaoshiList(data = {}) {
-  return request({
-    url: '/app/kaoshi/guanliyuan/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getKaoshiInfo(data = {}) {
-  return request({
-    url: '/app/kaoshi/guanliyuan/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientKaoshiInfo(data = {}) {
-  return request({
-    url: '/app/kaoshi/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientKaoshiList(data = {}) {
-  return request({
-    url: '/app/kaoshi/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientZhuaPaiUpdate(data = {}) {
-  return request({
-    url: '/app/kaoshi/zhuapai',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientQiepingCheat(data = {}) {
-  return request({
-    url: '/app/qieping/cheat',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientQiepingTimes(data = {}) {
-  return request({
-    url: '/app/qieping/times',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientUserInfo(data = {}) {
-  return request({
-    url: '/app/kaoshi/user/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientKsSubmit(data = {}) {
-  return request({
-    url: '/app/kaoshi/submit',
-    headers: {
-      isToken: true
-    },
-	isLoading:true,
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientKsStart(data = {}) {
-  return request({
-    url: '/app/kaoshi/start',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientKsSave(data = {}) {
-  return request({
-    url: '/app/kaoshi/save',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientKsChengjiView(data = {}) {
-  return request({
-    url: '/app/chengji/view',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientKsChengjiList(data = {}) {
-  return request({
-    url: '/app/chengji/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getAdminKsChengjiList(data = {}) {
-  return request({
-    url: '/app/chengji/guanliyuan/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getAdminKsChengjiView(data = {}) {
-  return request({
-    url: '/app/chengji/guanliyuan/view',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientKaoshiBiaoji(data = {}) {
-  return request({
-    url: '/app/kaoshi/biaoji',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getFileUpload(data = {}) {
-  return request({
-    url: '/app/file/upload',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 123
api/kecheng.js

@@ -1,123 +0,0 @@
-import request from '@/utils/request'
-
-export function getKechengGlList(data = {}) {
-  return request({
-    url: '/app/kecheng/guanliyuan/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKechengGlRecord(data = {}) {
-  return request({
-    url: '/app/kecheng/guanliyuan/record',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKechengGlSave(data = {}) {
-  return request({
-    url: '/app/kecheng/guanliyuan/save',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKechengGlStart(data = {}) {
-  return request({
-    url: '/app/kecheng/guanliyuan/start',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getKechengGlTime(data = {}) {
-  return request({
-    url: '/app/kecheng/guanliyuan/time',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getVideoAuth(data = {}) {
-  return request({
-    url: '/app/video/auth',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-
-export function getClientKechengList(data = {}) {
-  return request({
-    url: '/app/kecheng/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientKechengStart(data = {}) {
-  return request({
-    url: '/app/kecheng/start',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientKechengSave(data = {}) {
-  return request({
-    url: '/app/kecheng/save',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getAdminClassify(data = {}) {
-  return request({
-    url: '/app/kecheng/guanliyuan/classify',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 56
api/kehu.js

@@ -1,56 +0,0 @@
-import request from '@/utils/request'
-export function getKehuList(data = {}) {
-  return request({
-    url: '/app/guanliyuan/kehu/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-export function getKehuAdd(data = {}) {
-  return request({
-    url: '/app/guanliyuan/kehu/add',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-export function getKehuInfo(data = {}) {
-  return request({
-    url: '/app/guanliyuan/kehu/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-export function getKehuUpdate(data = {}) {
-  return request({
-    url: '/app/guanliyuan/kehu/update',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-export function getKehuDelete(data = {}) {
-  return request({
-    url: '/app/guanliyuan/kehu/delete',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 99
api/lianxi.js

@@ -1,99 +0,0 @@
-import request from '@/utils/request'
-
-export function getLianxiList(data = {}) {
-  return request({
-    url: '/app/lianxi/guanliyuan/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getLianxiInfo(data = {}) {
-  return request({
-    url: '/app/lianxi/guanliyuan/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientLianxiList(data = {}) {
-  return request({
-    url: '/app/lianxi/kaozheng/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientLianxiInfo(data = {}) {
-  return request({
-    url: '/app/lianxi/kaozheng/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientLianxiStart(data = {}) {
-  return request({
-    url: '/app/lianxi/kaozheng/start',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientLianxiSubmit(data = {}) {
-  return request({
-    url: '/app/lianxi/kaozheng/submit',
-    headers: {
-      isToken: true
-    },
-	isLoading:true,
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getClientLianxiBiaoji(data = {}) {
-  return request({
-    url: '/app/lianxi/kaozheng/biaoji',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getClientLianxiChengjiView(data = {}) {
-  return request({
-    url: '/app/lianxi/kaozheng/view',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 4 - 18
api/login.js

@@ -1,33 +1,19 @@
 import request from '@/utils/request'
 
-export function login(data = {}) {
+export function bindApplet(data = {}) {
   return request({
-    'url': '/common/app/login',
+    'url': '/common/app/bind/applet',
     headers: {
       isToken: false
     },
-	isLoading: true,
     method: 'post',
     data,
     timeout: 20000
   })
 }
-
-export function getConfig(data = {}) {
-  return request({
-    'url': '/common/app/config',
-    headers: {
-      isToken: false
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getVersion(data = {}) {
+export function SendCode(data = {}) {
   return request({
-    'url': '/common/app/version',
+    'url': '/common/sendCode',
     headers: {
       isToken: false
     },

+ 0 - 134
api/my.js

@@ -1,134 +0,0 @@
-import request from '@/utils/request'
-
-export function getMineUser(data = {}) {
-  return request({
-    url: '/app/mine/user',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getMineInfo(data = {}) {
-  return request({
-    url: '/app/mine/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getMineLogout(data = {}) {
-  return request({
-    url: '/app/mine/logout',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getMineUpdate(data = {}) {
-  return request({
-    url: '/app/mine/update',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-/************************* 管理端 *************************/
-export function getGlMineUser(data = {}) {
-  return request({
-    url: '/app/guanliyuan/mine/user',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getGlMineLogout(data = {}) {
-  return request({
-    url: '/app/guanliyuan/mine/logout',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getGlPasswordUpdate(data = {}) {
-  return request({
-    url: '/app/guanliyuan/mine/update/password',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getGlMineUpdate(data = {}) {
-  return request({
-    url: '/app/guanliyuan/mine/update',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getGlMineQrcode(data = {}) {
-  return request({
-    url: '/app/mine/qrcode',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getDaimaUpdate(data = {}) {
-  return request({
-    url: '/app/guanliyuan/mine/update/daima',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getDaimaInfo(data = {}) {
-  return request({
-    url: '/app/guanliyuan/mine/info/daima',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 129
api/sanfang.js

@@ -1,129 +0,0 @@
-import request from '@/utils/request'
-export function getSanfangList(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getKehuList(data = {}) {
-  return request({
-    url: '/app/guanliyuan/kehu/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getMobanList(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/moban/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-
-export function getSanfangCheck(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/check',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-export function getSanfangAdd(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/add',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-
-
-export function getSanfangInfo(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getSanfangUpdate(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/update',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getSanfangPreview(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/preview',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getSanfangDelete(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/delete',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getSanfangShengxiao(data = {}) {
-  return request({
-    url: '/app/guanliyuan/sanfang/shengxiao',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-

+ 0 - 73
api/shouye.js

@@ -1,73 +0,0 @@
-import request from '@/utils/request'
-
-export function getAppIndexInfo(data = {}) {
-  return request({
-    'url': '/app/index/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getIndexKechengList(data = {}) {
-  return request({
-    'url': '/app/index/kecheng/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getAppNoticeList(data = {}) {
-  return request({
-    'url': '/app/notice/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getAppNoticeInfo(data = {}) {
-  return request({
-    'url': '/app/notice/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getAppNoticeWait(data = {}) {
-  return request({
-    'url': '/app/notice/wait',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getGlIndexInfo(data = {}) {
-  return request({
-    'url': '/app/guanliyuan/index/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 13
api/yishou.js

@@ -1,13 +0,0 @@
-import request from '@/utils/request'
-
-export function getKechengYishou(data = {}) {
-  return request({
-    url: '/app/kecheng/yishou/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 25
api/zijiazhenggongsi.js

@@ -1,25 +0,0 @@
-import request from '@/utils/request'
-
-export function getZiJiazhengGongsiList(data = {}) {
-    return request({
-        url: '/app/jiazheng/children/list',
-        headers: {
-            isToken: true
-        },
-        method: 'post',
-        data,
-        timeout: 20000
-    })
-}
-
-export function getZiJiazhengGongsiInfo(data = {}) {
-    return request({
-        url: '/app/jiazheng/children/info',
-        headers: {
-            isToken: true
-        },
-        method: 'post',
-        data,
-        timeout: 20000
-    })
-}

+ 0 - 73
api/zizhanghao.js

@@ -1,73 +0,0 @@
-import request from '@/utils/request'
-
-export function getUserGuanliAdd(data = {}) {
-  return request({
-    url: '/app/user/guanli/add',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getUserGuanliDelete(data = {}) {
-  return request({
-    url: '/app/user/guanli/delete',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getUserGuanliInfo(data = {}) {
-  return request({
-    url: '/app/user/guanli/info',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getUserGuanliList(data = {}) {
-  return request({
-    url: '/app/user/guanli/list',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getUserGuanliUpdate(data = {}) {
-  return request({
-    url: '/app/user/guanli/update',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}
-
-export function getUserGuanliReset(data = {}) {
-  return request({
-    url: '/app/user/guanli/reset',
-    headers: {
-      isToken: true
-    },
-    method: 'post',
-    data,
-    timeout: 20000
-  })
-}

+ 0 - 85
components/custom-tabbar/custom-tabbar-admin.vue

@@ -1,85 +0,0 @@
-<template>
-	<view class="phone-custom-tabbar">
-			<view class="tabbar-item" v-for="(item, index) in tabList" :key="index" @click="switchTab(item.path,index)">
-				<icon class="tabbar-item-icon" :style="{ backgroundImage: 'url(' + (currentTab == index ? item.activePath : item.iconPath) + ')' }"></icon>
-				<text class="tabbar-item-text" :class="{active: currentTab == index}">{{item.text}}</text>
-			</view>
-		</view>
-</template>
-
-<script>
-	import {getStaticUrl} from '@/utils/common.js';
-	import {
-		useTabBarHistory
-	} from '@/utils/emitEvents.js';
-	import cacheManager from "@/utils/cacheManager.js";
-	export default {
-		props: {
-			currentTab: {
-				type: Number
-			}
-		},
-		data() {
-			return {
-				tabList: [{
-						text: '首页',
-						path: `/pages/admin/ShouYe/shouye`,
-						iconPath: getStaticUrl('static/images/tabbar/unselect/index-icon.png'),
-						activePath: getStaticUrl('static/images/tabbar/select/index-icon.png'),
-					},
-					{
-						text: '家政',
-						path: '/pages/admin/Jiazheng/index',
-						iconPath: getStaticUrl('static/images/tabbar/unselect/jz-icon.png'),
-						activePath: getStaticUrl('static/images/tabbar/select/jz-icon.png'),
-					},
-					{
-						text: '课程',
-						path: '/pages/admin/Kecheng/list',
-						iconPath: getStaticUrl('static/images/tabbar/unselect/kc-icon.png'),
-						activePath: getStaticUrl('static/images/tabbar/select/kc-icon.png'),
-					},
-					{
-						text: '我的',
-						path: `/pages/admin/my/index`,
-						iconPath: getStaticUrl('static/images/tabbar/unselect/my-icon.png'),
-						activePath: getStaticUrl('static/images/tabbar/select/my-icon.png'),
-					},
-				],
-			};
-		},
-		methods: {
-			switchTab(path, index) {
-				// if (index == this.currentTab) {
-				// 	// 同页面不刷新
-				// 	return;
-				// }
-				uni.reLaunch({
-					url: path
-				});
-			},
-
-		},
-	}
-</script>
-
-
-<style scoped>
-	.tabbar-item-box {
-		display: flex;
-		justify-content: space-around;
-		align-items: center;
-		height: 60px;
-		line-height: 60px;
-		/* 其他样式 */
-	}
-
-	.tab-item {
-		flex: 1;
-		/* 样式 */
-	}
-
-	.tab-icon {
-		/* 图标样式 */
-	}
-</style>

+ 0 - 51
components/custom-tabbar/custom-tabbar-client.vue

@@ -1,51 +0,0 @@
-<template>
-	<view class="phone-client-tabbar">
-		<view class="tabbar-item" v-for="(item, index) in tabList" :key="index" @click="switchTab(item.path,index)">
-			<icon class="tabbar-item-icon" :style="{ backgroundImage: 'url(' + (currentTab == index ? item.activePath : item.iconPath) + ')' }"></icon>
-			<text class="tabbar-item-text">{{item.text}}</text>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {getStaticUrl} from '@/utils/common.js';
-	import {
-		useTabBarHistory
-	} from '@/utils/emitEvents.js';
-	import cacheManager from "@/utils/cacheManager.js";
-	export default {
-		props: {
-			currentTab: {
-				type: Number,
-			}
-		},
-		data() {
-			return {
-				tabList: [{
-						text: '首页',
-						path: `/pages/client/ShouYe/shouye`,
-						iconPath: getStaticUrl('static/images/tabbar/unselect/client-jz-icon.png'),
-						activePath: getStaticUrl('static/images/tabbar/select/client-jz-icon.png'),
-					},
-					{
-						text: '我的',
-						path: `/pages/client/my/index`,
-						iconPath: getStaticUrl('static/images/tabbar/unselect/client-my-icon.png'),
-						activePath: getStaticUrl('static/images/tabbar/select/client-my-icon.png'),
-					},
-				],
-			};
-		},
-		methods: {
-			switchTab(path, index) {
-				if (index == this.currentTab) {
-					// 同页面不刷新
-					return;
-				}
-				uni.navigateTo({url: path});
-			},
-		},
-	}
-</script>
-
-

+ 0 - 352
components/customMap/customMap.vue

@@ -1,352 +0,0 @@
-<template>
-	<view class="map-popup-box">
-		<view class="icon-title-navBar-box">
-			<view @click="goUpPage" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">选择地址</text>
-		</view>
-		<uni-popup ref="filterPopup" type="top" :animation="false" :is-mask-click="false"
-			mask-background-color="rgba(0, 0, 0, 0.4)">
-			<view class="white-popup">
-				<view class="icon-title-navBar-box">
-					<view @click="closePop" class="nav-bar-icon"></view>
-					<text class="nav-bar-title">选择城市</text>
-				</view>
-				<t-index-address @select="select"></t-index-address>
-			</view>
-		</uni-popup>
-		<!-- 查询职业 -->
-		<view class="phone-search-box city-search-box">
-			<view @click="openPopup" class="city-select-btn">
-				{{currentCity}}
-			</view>
-			<view class="city-input-box">
-				<input class="search-input" placeholder="请输入地址" v-model="data.keyword" />
-				<view class="search-icon" @click="handleClick">
-					<uni-icons type="search" size="24" color="#fff"></uni-icons>
-				</view>
-			</view>
-		</view>
-		<map style="width: 100%; height: 300px;" :latitude="data.latitude" :longitude="data.longitude"
-			:markers="data.covers" :show-location="true"> </map>
-
-		<view v-if="result" class="map-card-list">
-			<!--  #ifdef H5   -->
-			<view v-for="(item,index) in result.data" key="index" @click="xuanzeAdress(item)" class="map-card-box">
-				<view>
-					<view class="map-card-title"><text v-if="index==0" class="dqwz-text">当前位置</text>{{item.title}}
-					</view>
-					<view class="map-card-address">{{item.address}}</view>
-				</view>
-				<icon class="map-active-icon" v-if="index==0"></icon>
-			</view>
-			<!--   #endif   -->
-			<!--  #ifdef APP   -->
-			<view v-for="(item,index) in result.data.data" key="index" @click="xuanzeAdress(item)" class="map-card-box">
-				<view>
-					<view class="map-card-title"><text v-if="index==0" class="dqwz-text">当前位置</text>{{item.title}}
-					</view>
-					<view class="map-card-address">{{item.address}}</view>
-				</view>
-				<icon class="map-active-icon" v-if="index==0"></icon>
-			</view>
-			<!--   #endif   -->
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		reactive,
-		ref
-	} from "vue"
-	import myIcon from "@/static/images/common/markIcon.png"
-	import {
-		jsonp
-	} from "@/utils/common.js"
-
-	import {
-		onLoad,
-		onHide,
-		onShow
-	} from "@dcloudio/uni-app"
-	import {
-		useCustomMap
-	} from "@/components/customMap/useMap.js"
-	import config from "@/config.js"
-	const emits = defineEmits(['close', 'xuanzeAdress', 'currentWeizhi'])
-	const {
-		getPositionSearchByKeyword
-	} = useCustomMap();
-
-	const result = ref(null);
-	const filterPopup = ref(null);
-	let currentCity = ref('选择城市');
-
-	function select(data) {
-		console.log('data', data);
-		currentCity.value = data.name; // 更新当前城市
-		filterPopup.value.close()
-		getCityLocation(data.name);
-	}
-
-
-
-	function openPopup(data) {
-		console.log('data', data);
-		filterPopup.value.open("top")
-	}
-
-	function closePop(data) {
-		console.log('data', data);
-		filterPopup.value.close()
-	}
-
-
-	function getCityLocation(city) {
-		console.log('222222');
-		console.log('city', city);
-		const Key = config.mapKey
-		const url = `https://apis.map.qq.com/ws/geocoder/v1`;
-		const url2 = `https://apis.map.qq.com/ws/geocoder/v1/?address=${city}&key=${Key}`;
-		// #ifdef H5
-		jsonp(url, {
-			address: `${city}`,
-			key: Key,
-			output: 'jsonp'
-		}, 'ccc1').then(res => {
-			console.log('res1222222', res);
-			if (res.status === 0) {
-			const cityLocation = res.result.location;
-			console.log('cityLocation', cityLocation);
-			if (cityLocation) {
-				data.latitude = cityLocation.lat;
-				data.longitude = cityLocation.lng;
-				data.covers[0].latitude = cityLocation.lat;
-				data.covers[0].longitude = cityLocation.lng;
-				// 重新搜索附近的地点
-				getPositionSearchByKeyword(data.keyword || '公司',
-					`nearby(${cityLocation.lat},${cityLocation.lng},1000)`,
-					onSuccess, onError, {
-						page: 1,
-						size: 3,
-					});
-			}
-			} else {
-				console.error('失败:', res);
-		
-			}
-		}).catch(err => {
-			console.log('err', err);
-		}).finally(() => {
-		
-		})
-		
-		// #endif
-		// #ifdef APP
-		uni.request({
-			url: url2,
-			method: 'get',
-			timeout: 20000,
-		}).then(res => {
-			console.log('res', res);
-			if (res.data && res.data.result && res.data.result.location) {
-				const cityLocation = res.data.result.location;
-				console.log('cityLocation', cityLocation);
-				if (cityLocation) {
-					data.latitude = cityLocation.lat;
-					data.longitude = cityLocation.lng;
-					data.covers[0].latitude = cityLocation.lat;
-					data.covers[0].longitude = cityLocation.lng;
-					// 重新搜索附近的地点
-					getPositionSearchByKeyword(data.keyword || '公司',
-						`nearby(${cityLocation.lat},${cityLocation.lng},1000)`,
-						onSuccess, onError, {
-							page: 1,
-							size: 3,
-						});
-				}
-			}
-		}).catch(err => {
-			console.log('err')
-
-		}).finally(() => {
-
-		})
-		// #endif
-	}
-
-	function handleClick() {
-		if (data.keyword) {
-			getPositionSearchByKeyword(data.keyword, `nearby(${data.latitude},${data.longitude},1000)`, onSuccess,
-				onError, {
-					page: 1,
-					size: 3,
-				})
-		}
-	}
-
-	function onSuccess(res) {
-		console.log('数据', res);
-		result.value = res
-		// #ifdef H5
-		if (res && res.data && res.data.length > 0) {
-			// 获取第一个搜索结果的经纬度
-			const firstResult = res.data[0];
-			const newLatitude = firstResult.location.lat; // 纬度
-			const newLongitude = firstResult.location.lng; // 经度
-
-			// 更新地图的中心点
-			data.latitude = newLatitude;
-			data.longitude = newLongitude;
-
-			// 更新标记点
-			data.covers = [{
-				latitude: newLatitude,
-				longitude: newLongitude,
-				iconPath: myIcon, // 使用你的图标路径
-				width: 30,
-				height: 30
-			}];
-		}
-		// #endif
-		// #ifdef APP
-		if (res.data && res.data.data && res.data.data.length > 0) {
-			// 获取第一个搜索结果的经纬度
-			const firstResult = res.data.data[0];
-			const newLatitude = firstResult.location.lat; // 纬度
-			const newLongitude = firstResult.location.lng; // 经度
-
-			// 更新地图的中心点
-			data.latitude = newLatitude;
-			data.longitude = newLongitude;
-
-			// 更新标记点
-			data.covers = [{
-				latitude: newLatitude,
-				longitude: newLongitude,
-				iconPath: myIcon, // 使用你的图标路径
-				width: 30,
-				height: 30
-			}];
-		}
-		// #endif
-	}
-
-	function onError(err) {
-		console.log('错误', err)
-	}
-
-	function goUpPage(err) {
-		console.log('错误', err)
-		emits('close');
-
-	}
-
-	function xuanzeAdress(item) {
-		console.log('item', item);
-		emits('xuanzeAdress', item.address);
-		emits('currentWeizhi', item.location);
-
-	}
-
-	const data = reactive({
-		keyword: '', // 关键字
-		id: 0, // 使用 marker点击事件 需要填写id
-		title: 'map',
-		latitude: 0,
-		longitude: 0,
-		covers: [{
-			latitude: 0,
-			longitude: 0,
-			iconPath: myIcon,
-			width: 30,
-			height: 30
-		}]
-	})
-
-	function getCityName(latitude, longitude) {
-		const Key = config.mapKey
-		const url1 = `https://apis.map.qq.com/ws/geocoder/v1/?location=${latitude},${longitude}&key=${Key}`;
-		const url = `https://apis.map.qq.com/ws/geocoder/v1`;
-		//const url = `https://apis.map.qq.com/ws/geocoder/v1/`;
-		// #ifdef H5
-		jsonp(url, {
-			location: `${latitude},${longitude}`,
-			key: Key,
-			output: 'jsonp'
-		}, 'ccc').then(res => {
-			console.log('res11111', res);
-			if (res.status === 0) {
-				const city = res.result.address_component.city;
-				currentCity.value = city; // 更新当前城市
-				console.log('当前城市:', city);
-			} else {
-				console.error('逆地理编码失败:', res);
-
-			}
-		}).catch(err => {
-			console.log('err', err);
-		}).finally(() => {
-
-		})
-		// #endif
-		// #ifdef APP
-		uni.request({
-			url: url1,
-			success: (res) => {
-				if (res.data.status === 0) {
-					console.log('当前城市:', res);
-					const city = res.data.result.address_component.city;
-					currentCity.value = city; // 更新当前城市
-					console.log('当前城市:', city);
-				} else {
-					console.error('逆地理编码失败:', res.data.message);
-					uni.showToast({
-						title: '获取城市信息失败',
-						icon: 'none',
-					});
-				}
-			},
-			fail: (err) => {
-				console.error('请求失败:', err);
-				uni.showToast({
-					title: '请求失败',
-					icon: 'none',
-				});
-			}
-		});
-		// #endif
-	}
-	// 初始化
-	function initLocation() {
-		console.log('init')
-		uni.getLocation({
-			type: 'wgs84',
-			success: function(res) {
-				console.log('res', res)
-				data.longitude = res.longitude;
-				data.latitude = res.latitude;
-				data.covers[0].longitude = res.longitude;
-				data.covers[0].latitude = res.latitude;
-				console.log('当前位置的经度:' + res.longitude);
-				console.log('当前位置的纬度:' + res.latitude);
-				getCityName(res.latitude, res.longitude)
-				// 获取当前位置附近的数据
-				getPositionSearchByKeyword('公司', `nearby(${res.latitude},${res.longitude},1000)`, onSuccess,
-					onError, {
-						page: 1,
-						size: 3,
-					});
-			}
-		});
-	}
-
-	onLoad(() => {
-		console.log('初始化',config)
-		initLocation();
-	})
-</script>
-
-<style>
-
-</style>

+ 0 - 69
components/customMap/useMap.js

@@ -1,69 +0,0 @@
-// 文档地址 https://lbs.qq.com/service/webService/webServiceGuide/search/webServiceSearch
-// 注意当前请求仅打包后有效
-import request from '@/utils/request'
-import {
-	ref
-} from "vue"
-import {
-	jsonp
-} from "@/utils/common.js"
-import config from '@/config.js'
-// 关键词不全
-const httpUrl = "https://apis.map.qq.com/ws/place/v1/search"
-const Key = config.mapKey
-
-export function useCustomMap() {
-	// 关键字 范围 页码 数量 成功回调 失败回调
-	function getPositionSearchByKeyword(keyword, boundary, successFun, errorFun, options) {
-		let cpage = options.page || 1;
-		let csize = options.size || 20;
-		let cboundary = boundary; //'nearby(39.992870,116.310250,1000)'
-
-		uni.showLoading({
-			title: '加载中'
-		})
-		// #ifdef H5
-		jsonp(httpUrl, {
-			key: Key,
-			output: "jsonp",
-			keyword: keyword,
-			boundary: cboundary,
-			page_size: csize,
-			page_index: cpage,
-		}).then(res => {
-			successFun && successFun(res)
-		}).catch(err => {
-			errorFun && errorFun(err);
-		}).finally(() => {
-			uni.hideLoading();
-		})
-		// #endif
-		// #ifdef APP
-		uni.request({
-			url: httpUrl,
-			method: 'get',
-			data: {
-				key: Key,
-				output: "JSON",
-				keyword: keyword,
-				boundary: cboundary,
-				page_size: csize,
-				page_index: cpage,
-			},
-			timeout: 20000,
-		}).then(res => {
-			successFun && successFun(res)
-		}).catch(err => {
-			console.log('err')
-			errorFun && errorFun(err);
-		}).finally(() => {
-			uni.hideLoading();
-		})
-		// #endif
-	}
-
-	return {
-		getPositionSearchByKeyword
-	}
-
-}

+ 0 - 71
components/dialog/commonDialog.vue

@@ -1,71 +0,0 @@
-<template>
-	<uni-popup ref="commonPopup" :animation="false" :is-mask-click="false"
-	 mask-background-color="rgba(0, 0, 0, 0.4)">
-	 <view class="phone-common-dialog">
-		<view class="common-body-box">
-			<view class="common-title">{{title}}</view>
-			<view class="common-content" :class="dialogContentClass">{{content}}</view>
-			<view class="common-btn-box">
-				<view class="not-confirm-btn" v-if="showQuxiao" @click="handleClose">{{notBtn}}</view>
-				<view class="confirm-btn" @click="confirmBtn">{{okBtn}}</view>
-			</view>
-		</view>
-	 </view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import { ref } from 'vue';
-	const props = defineProps({
-	  title: {
-	    type: String,
-	    default: ''
-	  },
-	  content: {
-	    type: String,
-		require: true,
-	    default: ''
-	  },
-	  dialogContentClass: {
-	    type: String,
-	  	require: true,
-	    default: 'content-center-class'
-	  },
-	  showQuxiao: {
-		  type: Boolean,
-		  default: true
-	  },
-	  notBtn: {
-	    type: String,
-	  	require: true,
-	    default: '取消'
-	  },
-	  okBtn: {
-	    type: String,
-	  	require: true,
-	    default: '确认'
-	  },
-	});
-	const commonPopup = ref(null); // 索引
-	const $emit = defineEmits(['confirm-btn'])
-	// 打开弹窗
-	function handleShow() {
-		commonPopup.value.open();
-	}
-	// 取消
-	function handleClose() {
-		commonPopup.value.close();
-	}
-	// 确认
-	function confirmBtn(){
-		$emit('confirm-btn');
-		commonPopup.value.close();
-	}
-	defineExpose({
-			handleShow,
-			handleClose
-		})
-</script>
-
-<style>
-</style>

+ 0 - 71
components/dialog/contentDialog.vue

@@ -1,71 +0,0 @@
-<template>
-	<uni-popup ref="commonPopup" :type="type" :animation="false" :is-mask-click="false" mask-background-color="rgba(0, 0, 0, 0.4)" background-color="#fff">
-		<slot></slot>
-	</uni-popup>
-</template>
-
-<script setup>
-	import {
-		reactive,
-		ref
-	} from 'vue';
-	import {
-		getJiazhengZhiye
-	} from "@/api/jiazheng.js"
-
-
-	const props = defineProps({
-		type: {
-			type: String,
-			default: 'bottom'
-		},
-		title: {
-			type: String,
-			default: ''
-		},
-		content: {
-			type: String,
-			require: true,
-			default: ''
-		},
-		dialogContentClass: {
-			type: String,
-			require: true,
-			default: 'content-center-class'
-		},
-		okBtn: {
-			type: String,
-			require: true,
-			default: '保存'
-		},
-		showBtn: {
-			type: Boolean,
-			default: true
-		}
-	});
-	const commonPopup = ref(null); // 索引
-	const $emit = defineEmits(['confirm-btn'])
-
-
-	// 打开弹窗
-	function handleShow() {
-		commonPopup.value.open();
-	}
-	// 取消
-	function handleClose() {
-		commonPopup.value.close();
-	}
-	// 确认
-	function confirmBtn() {
-		$emit('confirm-btn');
-		commonPopup.value.close();
-	}
-
-	defineExpose({
-		handleShow,
-		handleClose
-	})
-</script>
-
-<style>
-</style>

+ 0 - 66
components/dialog/qiepingDl.vue

@@ -1,66 +0,0 @@
-<template>
-	<uni-popup ref="commonPopup" :animation="false" :is-mask-click="false"
-	 mask-background-color="rgba(0, 0, 0, 0.4)">
-	 <view class="phone-common-dialog">
-		<view class="common-body-box">
-			<view class="common-title">{{title}}</view>
-			<view class="common-content" :class="dialogContentClass">{{content}}</view>
-			<view class="common-btn-box">
-				<view class="confirm-btn" @click="confirmBtn">{{okBtn}}</view>
-			</view>
-		</view>
-	 </view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import { ref } from 'vue';
-	const props = defineProps({
-	  title: {
-	    type: String,
-	    default: ''
-	  },
-	  content: {
-	    type: String,
-		require: true,
-	    default: ''
-	  },
-	  dialogContentClass: {
-	    type: String,
-	  	require: true,
-	    default: 'content-center-class'
-	  },
-	  notBtn: {
-	    type: String,
-	  	require: true,
-	    default: '取消'
-	  },
-	  okBtn: {
-	    type: String,
-	  	require: true,
-	    default: '确认'
-	  },
-	});
-	const commonPopup = ref(null); // 索引
-	const $emit = defineEmits(['confirm-btn'])
-	// 打开弹窗
-	function handleShow() {
-		commonPopup.value.open();
-	}
-	// 取消
-	function handleClose() {
-		commonPopup.value.close();
-	}
-	// 确认
-	function confirmBtn(){
-		$emit('confirm-btn');
-		commonPopup.value.close();
-	}
-	defineExpose({
-			handleShow,
-			handleClose
-		})
-</script>
-
-<style>
-</style>

+ 0 - 99
components/dialog/shengJiDialog.vue

@@ -1,99 +0,0 @@
-<!-- 中弹窗 二行文字 -->
-<template>
-	<uni-popup ref="tipMiddlePopup" :animation="false" :is-mask-click="false"
-	 mask-background-color="rgba(255, 255, 255, 0.6);">
-	 <view class="phone-common-dialog">
-		<view class="common-body-box">
-			<view class="common-title">{{title}}</view>
-			<view class="common-content">{{content}}</view>
-			<view class="common-btn-box" style="position: relative">
-				<view v-if="closeFlag" class="not-confirm-btn" @click="handleClose"></view>
-				<view class="confirm-btn no-border-btn" @click="confirmBtn">确认</view>
-				<view v-if="showTip" @click="handleShowImage" style="position: absolute;right: 0;top: 16rpx">
-					<uni-icons type="info" size="30"></uni-icons>
-				</view>
-			</view>
-		</view>
-	 </view>
-	</uni-popup>
-
-  <!-- 自定义预览弹窗 -->
-  <uni-popup ref="previewPopup" type="center" :safe-area="false" :is-mask-click="false">
-    <view class="custom-preview" style="position: relative">
-      <image
-          src="/static/images/login/ggg.gif"
-          mode="widthFix"
-          class="preview-image"
-      />
-      <view class="close-btn" @click="handleCloseImg" style="position: absolute;top: -30px;right: 5px">
-        <text class="close-icon" style="color:#fff">关闭</text>
-      </view>
-    </view>
-  </uni-popup>
-</template>
-
-<script setup>
-	import { ref } from 'vue';
-	const props = defineProps({
-	  title: {
-	    type: String,
-	    default: '提示'
-	  },
-	   closeFlag: {
-	    type: Boolean,
-	    default: true
-	  },
-	  content: {
-	    type: String,
-		require: true,
-	    default: ''
-	  },
-    notClose: {
-      type: Boolean,
-      default: false
-    },
-    showTip: {
-      type: Boolean,
-      default: false
-    }
-	});
-	const tipMiddlePopup = ref(null); // 索引
-
-  const previewPopup = ref(null)
-
-	const $emit = defineEmits(['confirm-btn'])
-	// 打开弹窗
-	function handleShow() {
-		tipMiddlePopup.value.open();
-	}
-	// 取消
-	function handleClose() {
-		tipMiddlePopup.value.close();
-	}
-	// 确认
-	function confirmBtn(){
-		$emit('confirm-btn');
-    if (!props.notClose) {
-      tipMiddlePopup.value.close();
-    }
-	}
-
-  function handleCloseImg() {
-    previewPopup.value.close()
-  }
-
-  function handleShowImage() {
-    previewPopup.value.open()
-    // uni.previewImage({
-    //   urls: ['/static/images/login/ggg.gif'],
-    // });
-  }
-
-	defineExpose({
-			handleShow,
-			handleClose
-		})
-</script>
-
-<style>
-</style>

+ 0 - 83
components/dialog/shexiangDialog.vue

@@ -1,83 +0,0 @@
-<template>
-	<view>
-		<uni-popup ref="commonPopup" :animation="false" :is-mask-click="false"
-		 mask-background-color="rgba(0, 0, 0, 0.4)">
-		 <view class="phone-common-dialog">
-			<view class="common-body-box">
-				<view class="common-title">{{title}}</view>
-				<view class="common-content" :class="dialogContentClass">
-				  <view>
-						<!-- IOS-->
-						<view v-if="platformType === 'ios'" class="content-margin-bottom">推荐使用微信或safari浏览器,使用其他浏览器可能会在考试过程中出现摄像头问题,影响考试结果,导致重考,不建议使用其他浏览器。
-						</view>
-						<!-- 安卓-->
-						<view v-if="platformType === 'Android'" class="content-margin-bottom">
-							推荐使用微信或火狐浏览器、谷歌浏览器,使用其他浏览器可能会在考试过程中出现摄像头问题,影响考试结果,导致重考,不建议使用其他浏览器。
-						</view>
-						<view class="content-margin-bottom">请在考试前使用摄像头测试功能,测试摄像头是否可以正常工作,在测试前请先确保摄像头设备可以正常使用,并且使用推荐浏览器并赋予了浏览器摄像头权限。</view>
-						<view>若摄像头测试中图像显示异常,请及时更换浏览器或手机,以免影响考试结果。</view>
-					</view>
-				</view>
-				<view class="common-btn-box">
-					<view class="confirm-btn" @click="confirmBtn">{{okBtn}}</view>
-				</view>
-			</view>
-		 </view>
-		</uni-popup>
-	</view>
-</template>
-
-<script setup>
-	import { ref } from 'vue';
-	const props = defineProps({
-	  title: {
-	    type: String,
-	    default: ''
-	  },
-	  content: {
-	    type: String,
-		require: true,
-	    default: ''
-	  },
-	  dialogContentClass: {
-	    type: String,
-	  	require: true,
-	    default: ''
-	  },
-	  notBtn: {
-	    type: String,
-	  	require: true,
-	    default: '取消'
-	  },
-	  okBtn: {
-	    type: String,
-	  	require: true,
-	    default: '确认'
-	  },
-	});
-	const commonPopup = ref(null); // 索引
-	const $emit = defineEmits(['confirm-btn'])
-	
-	const platformType = uni.getSystemInfoSync().platform;
-	
-	// 打开弹窗
-	function handleShow() {
-		commonPopup.value.open();
-	}
-	// 取消
-	function handleClose() {
-		commonPopup.value.close();
-	}
-	// 确认
-	function confirmBtn(){
-		$emit('confirm-btn');
-		commonPopup.value.close();
-	}
-	defineExpose({
-			handleShow,
-			handleClose
-		})
-</script>
-
-<style>
-</style>

+ 0 - 38
components/dialog/tipDialog.vue

@@ -1,38 +0,0 @@
-<template>
-	<uni-popup ref="tipPopup" :animation="false" :is-mask-click="false"
-	 mask-background-color="rgba(0, 0, 0, 0.4)">
-	 <view class="phone-tip-dialog">
-			<view class="common-body-box">
-				<view class="tip-title">{{title}}</view>
-				<view class="tip-content" :class="dialogContentClass">{{content}}</view>
-			</view>
-	 </view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import { ref } from 'vue';
-	const props = defineProps({
-		title: {
-		  type: String,
-		  default: ''
-		},
-	  content: {
-	    type: String,
-		require: true,
-	    default: ''
-	  },
-	});
-	const tipPopup = ref(null); // 索引
-	const $emit = defineEmits(['confirm-btn'])
-	// 打开弹窗
-	function handleShow() {
-		tipPopup.value.open();
-	}
-	defineExpose({
-			handleShow
-		})
-</script>
-
-<style>
-</style>

+ 0 - 103
components/identification/identification.vue

@@ -1,103 +0,0 @@
-<template>
-	<view>
-		<uni-popup ref="popupRef" type="dialog" :animation="false" :is-mask-click="false"
-			mask-background-color="rgba(0, 0, 0, 0.4);">
-			<uni-popup-dialog mode="input" class="phone-ksxz-dialog" title="身份确认" :duration="2000" :before-close="true"
-				cancelText="修改" @close="handleClose" @confirm="handleConfirm">
-				<view @click="handleCloseOnly" class="ksxz-close-icon"></view>
-				<view class="ksxz-content-box">
-					<view class="ksxz-img-box">
-						<!-- #ifdef H5 -->
-							<img :src="data.icon" v-if="data.icon" alt="">
-							<icon class="phone-default-userImg" v-else></icon>
-						<!-- <image :src="data.icon" /> -->
-						<!-- #endif -->
-					</view>
-					<view :class="{isEmpty: !data.realName}">姓名:{{data.realName}}</view>
-					<view :class="{isEmpty: !data.realName}">电话:{{data.userName}}</view>
-					<view>职业:{{data.zyName}}</view>
-					<view>等级:{{data.zyLevelName}}</view>
-					<view :class="{isEmpty: !data.realName}">证件号:{{data.idcard}}</view>
-				</view>
-			</uni-popup-dialog>
-		</uni-popup>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive
-	} from "vue"
-	const popupRef = ref(null)
-	const data = reactive({
-		realName: '',
-		userName: '',
-		zyLevelName: '',
-		zyName: '',
-		idcard: '',
-		icon: '',
-		gender: '',
-		userId: '',
-	})
-
-	const emits = defineEmits(['confirm', 'changeData'])
-
-	function handleCloseOnly() {
-		popupRef.value.close()
-	}
-
-	function showDialog(options) {
-		data.realName = options.realName;
-		data.userName = options.userName;
-		data.zyLevelName = options.zyLevelName;
-		data.zyName = options.zyName;
-		data.idcard = options.idcard;
-		data.icon = options.icon;
-		data.userId = options.userId;
-		data.gender = options.gender; // 1男 2女 0未知
-
-		popupRef.value.open()
-	}
-
-	function handleClose() {
-		emits('changeData');
-		popupRef.value.close()
-	}
-
-	function handleConfirm() {
-		let arr = [];
-		if (!data.realName) {
-			arr.push('姓名');
-		}
-		if (!data.userName) {
-			arr.push('电话');
-		}
-		if (!data.icon) {
-			arr.push('头像');
-		}
-		if (!data.idcard) {
-			arr.push('证件号');
-		}
-		if (!data.realName || !data.userName||!data.icon||!data.idcard) {
-			uni.showToast({
-				icon: 'none',
-				title: `请完善${arr.join('、')}信息!`
-			})
-			return;
-		}
-		
-		emits('confirm', data);
-		popupRef.value.close()
-	}
-
-	defineExpose({
-		showDialog
-	})
-</script>
-
-<style scoped lang="scss">
-.isEmpty {
-	color: #ff0101;
-}
-</style>

+ 0 - 73
components/kaoshixuzhi/kaoshixuzhi.vue

@@ -1,73 +0,0 @@
-<template>
-	<view>
-		<uni-popup ref="popupRef" type="dialog" :animation="false" :is-mask-click="false"
-		mask-background-color="rgba(0, 0, 0, 0.4);">
-			<uni-popup-dialog mode="input"
-			class="phone-ksxz-dialog"
-				title="考试须知"
-				:duration="2000" 
-				:before-close="true"
-				@close="handleClose"
-				@confirm="handleConfirm">
-				<view class="ksxz-content-box">
-					<view v-if="data.ksName">考试名称:{{data.ksName}}</view>
-					<view v-if="data.zyName">职业:{{data.zyName}}</view>
-					<view v-if="data.zyLevelName">等级:{{data.zyLevelName}}</view>
-					<view v-if="data.ksScore">总分:{{data.ksScore}}</view>
-					<view v-if="data.okScore">及格分:{{data.okScore}}</view>
-					<view>
-						<view v-if="data.intro" class="ksms-row">考试描述:</view>
-						<rich-text v-if="data.intro" :nodes="data.intro" class="ksms-intro"></rich-text>
-					</view>
-				</view>
-			</uni-popup-dialog>
-		</uni-popup>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,reactive
-	} from "vue";
-	const popupRef = ref(null)
-	const data = reactive({
-		intro: '',
-		ksName: '',
-		ksScore: '',
-		okScore: '',
-		zyLevelName: '',
-		zyName: '',
-	})
-	
-	const emits = defineEmits(['confirm', 'cancel'])
-
-	function showDialog(options) {
-		data.intro = options.intro;
-		data.ksName = options.ksName;
-		data.ksScore = options.ksScore;
-		data.okScore = options.okScore;
-		data.zyName = options.zyName;
-		data.zyLevelName = options.zyLevelName;
-		data.ksId = options.ksId;
-		
-		popupRef.value.open()
-	}
-
-	function handleClose() {
-		emits('cancel');
-		popupRef.value.close()
-	}
-
-	function handleConfirm() {
-		emits('confirm', data);
-		popupRef.value.close()
-	}
-
-	defineExpose({
-		showDialog
-	})
-</script>
-
-<style lang="scss">
-
-</style>

+ 0 - 73
components/kaoshixuzhi/lianxixuzhi.vue

@@ -1,73 +0,0 @@
-<template>
-
-	<uni-popup ref="popupRef" type="dialog" :animation="false" :is-mask-click="false"
-	mask-background-color="rgba(0, 0, 0, 0.4);">
-		<uni-popup-dialog mode="input"
-		class="phone-ksxz-dialog"
-			title="练习须知"
-			:duration="2000" 
-			:before-close="true"
-			@close="handleClose"
-			@confirm="handleConfirm">
-			<view class="ksxz-content-box">
-				<view v-if="data.lxName">练习名称:{{data.lxName}}</view>
-				<view v-if="data.zyName">职业:{{data.zyName}}</view>
-				<view v-if="data.zyLevelName">等级:{{data.zyLevelName}}</view>
-				<view v-if="data.ksScore">总分:{{data.ksScore}}</view>
-				<view v-if="data.okScore">及格分:{{data.okScore}}</view>
-				<view>
-					<view v-if="data.intro" class="ksms-row">练习描述:</view>
-					<rich-text v-if="data.intro" :nodes="data.intro" class="ksms-intro"></rich-text>
-				</view>
-			</view>
-		</uni-popup-dialog>
-	</uni-popup>
-
-</template>
-
-<script setup>
-	import {
-		ref,reactive
-	} from "vue";
-	const popupRef = ref(null)
-	const data = reactive({
-		intro: '',
-		lxName: '',
-		ksScore: '',
-		okScore: '',
-		zyLevelName: '',
-		zyName: '',
-	})
-	
-	const emits = defineEmits(['confirm', 'cancel'])
-
-	function showDialog(options) {
-		data.intro = options.intro;
-		data.lxName = options.lxName;
-		data.ksScore = options.ksScore;
-		data.okScore = options.okScore;
-		data.zyName = options.zyName;
-		data.zyLevelName = options.zyLevelName;
-		data.lxId = options.lxId;
-		
-		popupRef.value.open()
-	}
-
-	function handleClose() {
-		emits('cancel');
-		popupRef.value.close()
-	}
-
-	function handleConfirm() {
-		emits('confirm', data);
-		popupRef.value.close()
-	}
-
-	defineExpose({
-		showDialog
-	})
-</script>
-
-<style lang="scss">
-
-</style>

+ 0 - 79
components/kecheng-mulu/kecheng-mulu.vue

@@ -1,79 +0,0 @@
-<template>
-	<view class="kecheng-mulu-box">
-		<myCollapseCardVue v-for="zhang in chapterArr" :title="zhang.name" @click.stop="handleZhangClick(zhang)"
-			:open="zhang.open">
-			<myCollapseCardVue v-for="jie in zhang.jieList" :title="jie.name" @click.stop="handleJieClick(jie, zhang)"
-				:open="jie.open">
-				<view :class="{'kejian-active': activeKjId == item.kjId,'kejian-item':true }" v-for="item in jie.kejianList" @click.stop="handleKejianClick(item)">
-					<icon class="kejian-item-icon"></icon>
-					<text class="kejian-item-name">{{item.name}}</text>
-					<text v-if="isHasProgress">
-						<text v-if="item.maxProcess < 100">{{item.maxProcess >= item.curProcess ? item.maxProcess: item.curProcess}}%</text>
-						<text v-else>{{item.maxProcess}}%</text>
-					</text>
-				</view>
-			</myCollapseCardVue>
-		</myCollapseCardVue>
-	</view>
-</template>
-
-<script setup>
-	import myCollapseCardVue from '../myCollapseCard/myCollapseCard.vue';
-	import {
-		ref
-	} from 'vue';
-	const props = defineProps({
-		chapterArr: {
-			type: Array
-		},
-		isHasProgress: {
-			type: Boolean
-		},
-		activeKjId: {
-			type: [Number,String]
-		}
-	})
-
-	const emits = defineEmits(['play'])
-
-	function handleZhangClick(item) {
-
-		if (item.open) {
-			// 展开 -》 关闭
-			props.chapterArr.forEach(zhang => {
-				zhang.open = false;
-				zhang.jieList.forEach(jie => {
-					jie.open = false;
-				})
-			})
-		} else {
-			// 关闭 -》 展开
-			props.chapterArr.forEach(zhang => {
-				zhang.open = false;
-				zhang.jieList.forEach(jie => {
-					jie.open = false;
-				})
-			})
-			item.open = true;
-		}
-	}
-
-	function handleJieClick(item, zhang) {
-		if (item.open) {
-			// 展开 -》 关闭
-			zhang.jieList.forEach(jie => {
-				jie.open = false;
-			})
-		} else {
-			// 关闭 -》 展开
-			zhang.jieList.forEach(jie => {
-				jie.open = false;
-			})
-			item.open = true;
-		}
-	}
-
-	function handleKejianClick(item) {
-		emits('play', item)
-	}
-</script>

+ 0 - 128
components/listCard/kaoshiCard.vue

@@ -1,128 +0,0 @@
-<template>
-	<view class="shouye-card-box kaoshi-card-box">
-		<!-- card title -->
-		<view class="card-head-box">
-			<view class="card-line-title">考试</view>
-			<view class="card-more" @click="checkMore" v-if="data.count">更多<text class="more-num">{{data.count}}</text><icon class="more-jt"></icon></view>
-		</view>
-		
-		<!-- kaoshi title -->
-		<view class="card-name-box"> 	
-			<view class="card-name" v-if="data.zyName"><icon></icon>{{data.zyName}}</view>
-			<text class="card-level">{{data.zyLevelName}}</text>
-			<!-- <view class="card-name"><icon></icon>考试名称</view>
-			<text class="card-level">初级</text> -->
-		</view>
-		<!-- 内容区域 -->
-		<view class="card-content-box kaoshi-content-box">
-			<view class="card-content-item">
-				<icon class="card-time-icon"></icon>
-				<view class="content-text-box">
-					<text>时间</text>
-					<view>{{data.totalTm}}分钟</view>
-				</view>
-			</view>
-			<view class="card-content-item">
-				<icon class="card-num-icon"></icon>
-				<view class="content-text-box">
-					<text>次数</text>
-					<view>{{data.maxTimes ? data.loseTimes:'不限'}}次</view>
-				</view>
-			</view>
-			<view class="card-content-item">
-				<icon class="card-sum-icon"></icon>
-				<view class="content-text-box">
-					<text>总分</text>
-					<view>{{data.ksScore}}分</view>
-				</view>
-			</view>
-			<view class="card-content-item">
-				<icon class="card-pass-icon"></icon>
-				<view class="content-text-box">
-					<text>及格分</text>
-					<view>{{data.okScore}}分</view>
-				</view>
-			</view>
-		</view>
-		<!-- 底部 -->
-		<view class="card-bottom-box">
-			<button type="default" class="index-card-btn" v-if="data.status == 1" @click="handleStart(data)">进行考试</button>
-			<button type="default" class="index-card-btn" v-if="data.status == 2" @click="handleStart(data)">进行考试</button>
-			<button type="default" class="index-card-btn" v-if="data.status == 3" @click="handleContinue(data)">考试中</button>
-		</view>
-		
-		<!-- 考试须知 -->
-		<kaoshixuzhiVue ref="ksxzRef" @confirm="handleConfirmKs" key="1"></kaoshixuzhiVue>
-		<!-- 身份确认 -->
-		<identificationVue ref="shenfenRef" @confirm="handleConfirmIdent" @changeData="handleChangeIdentification" key="2"></identificationVue>
-	</view>
-</template>
-
-<script setup>
-	import kaoshixuzhiVue from "@/components/kaoshixuzhi/kaoshixuzhi.vue";
-	import identificationVue from "@/components/identification/identification.vue";
-	import {useIdentificationTools} from "@/pages/client/Kaoshi/examTools.js"
-	import * as kaoshiApi from "@/api/kaoshi.js"
-	import { ref } from "vue"
-	
-	const {	saveIdentCache, getIdentCache, removeIdentCache } = useIdentificationTools();
-	defineProps({
-		data: {
-			type: Object,
-		}
-	})
-	const ksxzRef = ref(null)
-	const shenfenRef = ref(null)
-	const activeks = ref(null);
-	
-	function checkMore() {
-		uni.navigateTo({
-			url: '/pages/client/Kaoshi/list?from=shouye'
-		})
-	}
-	
-	// 修改身份
-	function handleChangeIdentification() {
-		uni.navigateTo({
-			url:'/pages/client/my/myInfo?from=shouye'
-		})
-	}
-	
-	function handleConfirmIdent(data) {
-		saveIdentCache(activeks.value.ksId, true);
-		ksxzRef.value.showDialog(activeks.value)
-	}
-	
-	
-	function handleStart(data) {
-		activeks.value = data;
-		const result = getIdentCache(data.ksId);
-		if (result) {
-			ksxzRef.value.showDialog(data)
-		} else {
-			kaoshiApi.getClientUserInfo({ksId: data.ksId}).then(res => {
-				shenfenRef.value.showDialog(res.data);
-			})
-		}
-	
-	}
-	
-	function handleConfirmKs(data) {
-		checkKaoshi(data)
-	}
-	
-	function checkKaoshi(item) {
-		uni.navigateTo({
-			url: `/pages/client/Kaoshi/exam?ksId=${item.ksId}&zhuapai=${activeks.value.zhuapai}&userKaozhengId=${activeks.value.userKaozhengId}&from=shouye`
-		})
-	}
-	
-	function handleContinue(data) {
-		activeks.value = data;
-		// 考试中 直接进入考试
-		checkKaoshi(data)
-	}
-</script>
-
-<style>
-</style>

+ 0 - 52
components/listCard/kechengCard.vue

@@ -1,52 +0,0 @@
-<template>
-	<view class="shouye-card-box kecheng-card-box">
-		<!-- card title -->
-		<view class="card-head-box">
-			<view class="card-line-title">课程</view>
-			<view class="card-more" @click="checkMore" v-if="data.count">更多<text class="more-num">{{data.count}}</text><icon class="more-jt"></icon></view>
-		</view>
-		<!-- kaoshi title -->
-		<view class="card-name-box">
-			<view class="card-name" v-if="data.name"><icon></icon>{{data.name}}</view>
-			<!-- <text class="card-level">{{data.zyLevelName}}</text> -->
-		</view>
-		<!-- 内容区域 -->
-		<view class="card-content-box kaoshi-content-box">
-			<view class="card-content-item">
-				<icon class="card-time-icon"></icon>
-				<view class="content-text-box">
-					<text>时间</text>
-					<view>{{formatSecondsToCnhms(data.period, true)}}</view>
-				</view>
-			</view>
-		</view>
-		<!-- 底部 -->
-		<view class="card-bottom-box">
-			<button type="default" class="index-card-btn" @click="handleStudy(data)">课程学习</button>
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {formatSecondsToCnhms} from "@/utils/common.js"
-	defineProps({
-		data: {
-			type: Object,
-		}
-	})
-	
-	function checkMore() {
-		uni.navigateTo({
-			url:"/pages/client/Kecheng/list?from=shouye"
-		})
-	}
-	
-	function handleStudy(item) {
-		uni.navigateTo({
-			url: `/pages/client/Kecheng/study?kcId=${item.kcId}&jzId=${item.jzId}&from=shouye`
-		})
-	}
-</script>
-
-<style>
-</style>

+ 0 - 85
components/listCard/lianxiCard.vue

@@ -1,85 +0,0 @@
-<template>
-	<view class="shouye-card-box lianxi-card-box">
-		<!-- card title -->
-		<view class="card-head-box">
-			<view class="card-line-title">练习</view>
-			<view class="card-more" @click="checkMore" v-if="data.count">更多<text class="more-num">{{data.count}}</text><icon class="more-jt"></icon></view>
-		</view>
-		<!-- kaoshi title -->
-		<view class="card-name-box">
-			<view class="card-name" v-if="data.zyName"><icon></icon>{{data.zyName}}</view>
-			<text class="card-level">{{data.zyLevelName}}</text>
-		</view>
-		<!-- 内容区域 -->
-		<view class="card-content-box kaoshi-content-box">
-			<!-- <view class="card-content-item">
-				<icon class="card-time-icon"></icon>
-				<view class="content-text-box">
-					<text>时间</text>
-					<view>{{data.totalTm}}分钟</view>
-				</view>
-			</view> -->
-			<view class="card-content-item">
-				<icon class="card-sum-icon"></icon>
-				<view class="content-text-box">
-					<text>总分</text>
-					<view>{{data.ksScore}}分</view>
-				</view>
-			</view>
-			<view class="card-content-item">
-				<icon class="card-pass-icon"></icon>
-				<view class="content-text-box">
-					<text>及格分</text>
-					<view>{{data.okScore}}分</view>
-				</view>
-			</view>
-		</view>
-		<!-- 底部 -->
-		<view class="card-bottom-box">
-			<button type="default" class="index-card-btn" @click="handleStart(data)">进行练习</button>
-		</view>
-		
-		<!-- 考试须知 -->
-		<lianxixuzhi ref="lxzRef" @confirm="handleConfirmLx" key="1"></lianxixuzhi>
-	</view>
-</template>
-
-<script setup>
-	import lianxixuzhi from "@/components/kaoshixuzhi/lianxixuzhi.vue";
-	import * as lianxi from "@/api/lianxi.js"
-	import { ref } from "vue"
-	defineProps({
-		data: {
-			type: Object,
-		}
-	})
-	const activeks = ref(null);
-	const lxzRef = ref(null)
-	
-	function checkMore() {
-		uni.navigateTo({
-			url: '/pages/client/Lianxi/list?from=shouye'
-		})
-	}
-	
-	function handleStart(data) {
-		lxzRef.value.showDialog(data)
-	}
-	
-	function handleConfirmKs(data) {
-		checkKaoshi(data)
-	}
-	
-	function checkKaoshi(item) {
-		uni.navigateTo({
-			url: `/pages/client/Lianxi/exam?lxId=${item.lxId}&from=shouye`
-		})
-	}
-	
-	function handleConfirmLx(data) {
-		checkKaoshi(data)
-	}
-</script>
-
-<style>
-</style>

+ 0 - 25
components/myCollapseCard/myCollapseCard.vue

@@ -1,25 +0,0 @@
-<template>
-	<view class="my-collapse-card">
-		<view class="my-collapse-item" :class="{'item-open': open}">
-			<text class="collapse-text">{{title}}</text>
-			<icon class="collapse-item-icon"></icon>
-		</view>
-		<view class="my-card-content" :class="{'content-open': open}">
-			<slot></slot>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "myCollapseCard",
-		props: {
-			title: {
-				type: String
-			},
-			open: {
-				type:Boolean
-			}
-		},
-	}
-</script>

+ 0 - 57
components/password-lli/password-lli.vue

@@ -1,57 +0,0 @@
-<template>
-	<view style="visibility: hidden;">
-		<view class="phone-password-lli" :myflag="myflag" :change:myflag="PSLLI.doPasswordlli(password)"></view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "password-lli",
-		props: {
-			password: {
-				type: [String,Number],
-				default: ''
-			}
-		},
-		data() {
-			return {
-				myflag: 0
-			};
-		},
-		methods: {
-			lliPassword() {
-				this.myflag++
-			},
-			getPassword(data) {
-				this.$emit('lli-password',data);
-			}
-		}
-	}
-</script>
-
-<script module="PSLLI" lang="renderjs">
-	export default {
-		methods: {
-			doPasswordlli(password) {
-				if (window.lli && this.$ownerInstance) {
-					this.$ownerInstance.callMethod('getPassword', window.lli.encode(password))
-				}
-			}
-		},
-		mounted() {
-			if (window.lli && typeof window.lli.encode === 'function') {
-			} else {
-				const script = document.createElement('script')
-				// #ifdef H5
-				script.src = '/mdist/static/encode.js'
-				// #endif
-				
-				// #ifdef APP-PLUS
-				script.src = 'static/encode.js'
-				// #endif
-				
-				document.head.appendChild(script)
-			}
-		},
-	}
-</script>

+ 0 - 85
components/questions/danxuan.vue

@@ -1,85 +0,0 @@
-<template>
-	<view v-if="question" class="phone-danxuan-box">
-		<view class="phone-shiti-question">
-			<view class="question-num">{{question.onlyNum}}、</view>
-			<!-- 题干区域 -->
-			<rich-text :nodes="data.name"></rich-text>
-		</view>
-		
-		<!-- 选项区域 -->
-		<view v-for="(item,index) in data.contents" class="danxuan-option-box" :class="formatClass(index)" :key="index">
-			<text class="option-change"  @click="onSelect(index)">{{item.number}}</text>
-			<rich-text :nodes="item.label" class="option-question"></rich-text>
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		watch
-	} from 'vue';
-	import {
-		useQuestionTools
-	} from "./useQuestionTools"
-	const {
-		getLetterByIndex
-	} = useQuestionTools();
-
-	const props = defineProps({
-		question: {
-			type: Object,
-		},
-		showError: {
-			type: Boolean,
-			default: false
-		}
-	})
-
-	const data = reactive({
-		name: '', //题干数据
-		contents: [], // 选项数据
-	})
-
-	watch(() => props.question, (val) => formatData(val), {
-		immediate: true
-	})
-
-	function formatClass(index) {
-		if (props.showError) {
-			return {
-				active_right: props.question.result == index,
-				showError: props.question.reply == index && props.question.result != index
-			}
-		} else {
-			  if (props.question.reply === ''||props.question.reply === null ) {
-				return {
-				  active: false
-				}
-			  }
-			return {
-				active: props.question.reply == index
-			}
-		}
-	}
-
-	function formatData(val) {
-		if (val) {
-			data.name = val.name;
-			data.contents = val.content.map((item, index) => {
-				return {
-					label: item,
-					number: getLetterByIndex(index)
-				}
-			})
-		}
-	}
-
-	function onSelect(index) {
-		if (props.showError) {
-			return;
-		}
-		props.question.reply = index;
-	}
-</script>

+ 0 - 87
components/questions/duoxuan.vue

@@ -1,87 +0,0 @@
-<template>
-	<view v-if="question" class="phone-duoxuan-box">
-		<view class="phone-shiti-question">
-			<view class="question-num">{{question.onlyNum}}、</view>
-			<!-- 题干区域 -->
-			<rich-text :nodes="data.name"></rich-text>
-		</view>
-		<!-- 选项区域 -->
-		<view v-for="(item,index) in data.contents" class="duoxuan-option-box" :class="formatClass(index)" :key="index">
-			<text class="option-change" @click="onSelect(index)">{{item.number}}</text>
-			<rich-text :nodes="item.label" class="option-question"></rich-text>
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		watch
-	} from 'vue';
-	import {
-		useQuestionTools
-	} from "./useQuestionTools"
-	const {
-		getLetterByIndex,
-		haveSameElements
-	} = useQuestionTools();
-
-	const props = defineProps({
-		question: {
-			type: Object,
-		},
-		showError: {
-			type: Boolean,
-			default: false
-		}
-	})
-
-	const data = reactive({
-		name: '', //题干数据
-		contents: [], // 选项数据
-	})
-
-	watch(() => props.question, (val) => formatData(val), {
-		immediate: true
-	})
-
-
-	function formatClass(index) {
-		if (props.showError) {
-			return {
-				active_right: props.question.result.some(item => item == index),
-				showError: !props.question.result.some(item => item == index)
-			}
-		} else {
-			return {
-				active: props.question.reply.some(item => item == index)
-			}
-		}
-	}
-
-	function formatData(val) {
-		if (val) {
-			data.name = val.name;
-			data.contents = val.content.map((item, index) => {
-				return {
-					label: item,
-					number: getLetterByIndex(index)
-				}
-			})
-		}
-	}
-
-	function onSelect(index) {
-		if (props.showError) {
-			return;
-		}
-		if (props.question.reply) {
-			if (props.question.reply.some(item => item == index)) {
-				props.question.reply = props.question.reply.filter(item => item != index);
-			} else {
-				props.question.reply.push(index);
-			}
-		}
-	}
-</script>

+ 0 - 52
components/questions/panduan.vue

@@ -1,52 +0,0 @@
-<template>
-	<view class="phone-panduan-box">
-		<view class="phone-shiti-question">
-			<view class="question-num">{{question.onlyNum}}、</view>
-			<!-- 题干区域 -->
-			<rich-text :nodes="question.name"></rich-text>
-		</view>
-		<!-- 选项区域 -->
-		<radio-group @change="radioChange" class="panduan-option-box">
-			<label class="option-question" :class="formatClass('1')">
-				<radio value="1" :disabled="showError" :checked="question.reply == '1'"/>
-				<view>正确</view>
-			</label>
-			<label class="option-question" :class="formatClass('0')"> 
-				<radio value="0" :disabled="showError" :checked="question.reply == '0'"/>
-				<view>错误</view>
-			</label>
-		</radio-group>
-	</view>
-</template>
-
-<script setup>
-	const props = defineProps({
-		question: {
-			type: Object,
-		},
-		showError: {
-			type: Boolean,
-			default: false
-		}
-	})
-
-	function radioChange(e) {
-		if (props.showError) {
-			return;
-		}
-		props.question.reply = e.detail.value;
-	}
-	
-	function formatClass(index) {
-		if (props.showError) {
-			return {
-				active_right: props.question.result == index,
-				showError: props.question.reply == index && props.question.result != index
-			}
-		} else {
-			return {
-				active: props.question.reply == index
-			}
-		}
-	}
-</script>

+ 0 - 35
components/questions/tiankong.vue

@@ -1,35 +0,0 @@
-<template>
-	<view v-if="question" class="phone-tiankong-box">
-		<view class="phone-shiti-question">
-			<view class="question-num">{{question.onlyNum}}、</view>
-			<!-- 题干区域 -->
-			<rich-text :nodes="question.name"></rich-text>
-		</view>
-		<!-- 选项区域 -->
-		<view v-for="(item,index) in question.reply" class="tiankong-option-box" :key="index" :class="formatClass(index)">
-			<text class="option-question">填空{{index+1}}:</text>
-			<input type="text" v-model="question.reply[index]" class="option-question-text" :placeholder="`请输入填空${index+1}答案`">
-		</view>
-	</view>
-</template>
-
-<script setup>
-	const props = defineProps({
-		question: {
-			type: Object,
-		},
-		showError: {
-			type: Boolean,
-			default: false
-		}
-	})
-
-	function formatClass(index) {
-		if (props.showError) {
-			return {
-				active_right: props.question.result[index].some(item => item == props.question.reply[index]?props.question.reply[index].trim(): ''),
-				showError: !props.question.result[index].some(item => item == props.question.reply[index]?props.question.reply[index].trim(): '')
-			}
-		}
-	}
-</script>

+ 0 - 85
components/questions/useQuestionTools.js

@@ -1,85 +0,0 @@
-export function useQuestionTools() {
-	function getLetterByIndex(index) {
-		let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
-		if (index < 0 || index > 26) {
-			return '?';
-		}
-		return letters.charAt(index);
-	}
-
-	// 判断两个数组是否具有相同元素
-	function haveSameElements(arr1, arr2) {
-		// 如果两个数组的长度不同,它们不可能包含相同的元素
-		if (arr1.length !== arr2.length) {
-			return false;
-		}
-
-		// 对两个数组进行排序
-		arr1.sort((a, b) => a - b);
-		arr2.sort((a, b) => a - b);
-
-		// 比较排序后的数组是否相同
-		for (let i = 0; i < arr1.length; i++) {
-			if (arr1[i] != arr2[i]) {
-				return false;
-			}
-		}
-
-		// 如果所有元素都相同,返回 true
-		return true;
-	}
-
-	function checkDanxuanReply(item) {
-		if (item.reply === 0 || item.reply === '0') {
-			return true
-		}
-		if (!item.reply || item.reply === '' || item.reply === [] || item.reply.length === 0) {
-			return false;
-		} else {
-			return true;
-		}
-	}
-
-	function checkDuoxuanReply(item) {
-		if (!item.reply || item.reply === '' || item.reply === [] || item.reply.length === 0) {
-			return false;
-		} else {
-			for (const _item of item.reply) {
-				if (_item === '') {
-					return false;
-				}
-			}
-			return true;
-		}
-	}
-
-	function checkPanduanReply(item) {
-		if (!item.reply || item.reply === '' || item.reply === [] || item.reply.length === 0) {
-			return false;
-		} else {
-			return true;
-		}
-	}
-
-	function checkTiankongReply(item) {
-		if (!item.reply || item.reply === '' || item.reply === [] || item.reply.length === 0) {
-			return false;
-		} else {
-			for (const _item of item.reply) {
-				if (_item === '') {
-					return false;
-				}
-			}
-			return true;
-		}
-	}
-
-	return {
-		getLetterByIndex,
-		haveSameElements,
-		checkDanxuanReply,
-		checkDuoxuanReply,
-		checkPanduanReply,
-		checkTiankongReply
-	}
-}

+ 0 - 39
components/score/topCard.vue

@@ -1,39 +0,0 @@
-<template>
-	<view class="score-page-title">
-		<view class="title-types"><text>{{name}}</text>/<text>{{zyLevelName}}</text></view>
-		<view>
-			<text class="user-score">{{userScore}}</text>/<text>{{Score}}</text>
-			<!-- <text @click="handleOpenCard"><i></i> {{count}}/{{total}}</text> -->
-		</view>
-	</view>
-</template>
-
-<script setup>
-	defineProps({
-		name: {
-			type: String
-		},
-		zyLevelName: {
-			type: String
-		},
-		userScore: {
-			type:  [String,Number]
-		},
-		Score: {
-			type: [String,Number]
-		},
-		// count: {
-		// 	type:  [String,Number]
-		// },
-		// total: {
-		// 	type:  [String,Number]
-		// },
-	})
-	// const emits = defineEmits(['openCard'])
-	// function handleOpenCard (){
-	// 	emits('openCard')
-	// }
-</script>
-
-<style>
-</style>

+ 0 - 40
components/scoreAndAnswer/scoreAndAnswerAdmin.vue

@@ -1,40 +0,0 @@
-<template>
-	<uni-popup ref="popupRef" background-color="#fff" >
-		<view class="phone-question-answer-box">
-			<view class="phone-line-title">答案解析</view>
-			<view class="btdf-row">本题得分:<text>{{data.score}}</text>分</view>
-			<view class="zqda-row">正确答案:<text>{{data.result}}</text></view>
-			<view class="ndda-row">您的答案:<text>{{data.reply}}</text></view>
-			<view class="dajx-row">答案解析: 
-				<rich-text :nodes="data.answer"></rich-text>
-			</view>
-		</view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import {ref,reactive} from "vue";
-	const popupRef = ref('popupRef');
-	const data = reactive({
-		score: 0,
-		reply: '',
-		result: '',
-		answer: '',
-	})
-	
-	function showPopup(options) {
-		console.log('options',options)
-		data.score = options.score;
-		data.reply = options.reply;
-		data.result = options.result;
-		data.answer = options.answer;
-		
-		popupRef.value.open('bottom')
-	}
-	
-	defineExpose({showPopup})
-</script>
-
-<style>
-
-</style>

+ 0 - 44
components/scoreAndAnswer/scoreAndAnswerAdminTiankong.vue

@@ -1,44 +0,0 @@
-<template>
-	<uni-popup ref="popupRef" background-color="#fff" >
-		<view class="phone-question-answer-box">
-			<view class="phone-line-title">答案解析</view>
-			<view class="btdf-row">本题得分:<text>{{data.score}}</text>分</view>
-			<view class="zqda-row">正确答案:
-				<view v-for="(item,index) in data.result">{{`填空${index+1}`}} : {{item}}</view>
-			</view>
-			<view class="ndda-row">您的答案:
-			<view v-for="(item,index) in data.reply"> {{`填空${index+1}`}}: {{item}}</view>
-			</view>
-			<view class="dajx-row">答案解析: 
-				<rich-text :nodes="data.answer"></rich-text>
-			</view>
-		</view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import {ref,reactive} from "vue";
-	const popupRef = ref('popupRef');
-	const data = reactive({
-		score: 0,
-		reply: '',
-		result: '',
-		answer: '',
-	})
-	
-	function showPopup(options) {
-		console.log('options',options)
-		data.score = options.score;
-		data.reply = options.reply;
-		data.result = options.result;
-		data.answer = options.answer;
-		
-		popupRef.value.open('bottom')
-	}
-	
-	defineExpose({showPopup})
-</script>
-
-<style>
-
-</style>

+ 0 - 146
components/selectZyLevel/index.vue

@@ -1,146 +0,0 @@
-<template>
-	<contentDialogVue ref="commonPopup" title="选择职业">
-		<view class="phone-zydj-popup">
-			<view class="icon-title-navBar-box">
-				<view class="nav-bar-icon" @click="handleClose"></view>
-				<text class="nav-bar-title">职业等级</text>
-			</view>
-			<!-- 技能块展示 -->
-			<view class="phone-select-group">
-				<view v-for="item in data.list" :key="item.id" class="phone-select-item"
-					:class="{ selectActive: item.active }" @click="toggleSelect(item)">
-					{{ item.name }}
-				</view>
-			</view>
-			<view class="zydj-popup-btn-box">
-				<button type="default" class="phone-green-btn" @click="confirmBtn">保存</button>
-			</view>
-		</view>
-	</contentDialogVue>
-
-</template>
-
-<script setup>
-	import {
-		reactive,
-		ref
-	} from 'vue';
-	import {
-		getJiazhengZhiye,
-	} from "@/api/jiazheng.js"
-	import contentDialogVue from '@/components/dialog/contentDialog.vue';
-
-
-	const props = defineProps({
-		title: {
-			type: String,
-			default: ''
-		},
-		content: {
-			type: String,
-			require: true,
-			default: ''
-		},
-		dialogContentClass: {
-			type: String,
-			require: true,
-			default: 'content-center-class'
-		},
-		notBtn: {
-			type: String,
-			require: true,
-			default: '取消'
-		},
-		okBtn: {
-			type: String,
-			require: true,
-			default: '确认'
-		},
-		id: {
-			type: Number,
-		},
-		mode: {
-			type: String,
-			default: 'duoxuan' // danxuan / duoxuan
-		}
-	});
-
-	const commonPopup = ref(null);
-	const $emit = defineEmits(['confirm-btn'])
-
-	const data = reactive({
-		list: [],
-		// item: {
-		// 	zyId: null,
-		// 	zyName: null,
-		//  active: true
-		// }
-	})
-
-
-
-	// 打开弹窗
-	function handleShow(mdata) {
-		getZyList(mdata)
-
-	}
-	// 取消
-	function handleClose() {
-		commonPopup.value.handleClose();
-	}
-	// 确认
-	function confirmBtn() {
-		$emit('confirm-btn', data.list.filter(item => item.active).map(item => {
-      return {
-        name: item.name,
-        id: item.id,
-      }
-    }));
-		handleClose();
-	}
-
-	function getZyList(alreadySelect) {
-		getJiazhengZhiye({
-			id: props.id
-		}).then(res => {
-			data.list = res.data.map(item => {
-				if (alreadySelect) {
-					const da1 = alreadySelect.find(ite => ite.zyId == item.id);
-					if (da1) {
-						return {
-							id: item.id,
-							name: item.name,
-							active: true
-						}
-					}
-				}
-				return {
-					id: item.id,
-					name: item.name,
-					active: false
-				}
-			})
-			commonPopup.value.handleShow();
-		})
-	}
-
-	function toggleSelect(item) {
-		item.active = !item.active;
-		if (props.mode == 'danxuan') {
-      data.list.map(cite => {
-				if (cite.id != item.id) {
-					cite.active = false;
-				}
-			})
-		}
-	}
-
-	defineExpose({
-		handleShow,
-		handleClose
-	})
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 239
components/videoPlay/videoPlay.vue

@@ -1,239 +0,0 @@
-<template>
-	<view>
-		<view ref="videoContent" id="wgy-player-test" :playAuth="playAuth" :change:playAuth="renderScript.receiveMsg"
-			:videoId="videoId" :change:videoId="renderScript.videoIdFun" 
-			:playCount="playCount" :change:playCount="renderScript.playVideo"
-			:status="hideFlag"
-			:change:hideFlag="renderScript.hideFlagFun" :seekTime="seekTime" :change:seekTime="renderScript.seekTimeFun"
-			class="kecheng-video">
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "videoPlay",
-		data() {
-			return {
-				playAuth: "", //播放凭证
-				hideFlag: 'show',
-				videoId: "", //阿里云视频id
-				seekTime: '',
-				playCount: 0,
-			};
-		},
-		onUnload() {
-			// 切换
-			this.hideFlag = 'hide'
-		},
-		onHide() {
-			this.hideFlag = 'hide'
-		},
-		methods: {
-			init(options) {
-				this.playAuth = options.playAuth;
-				this.videoId = options.videoId;
-				this.seekTime = options.seekTime;
-				this.setSeekTime(options.seekTime)
-				const isPlay = options.isPlay || false;
-				if(isPlay) {
-					this.playCount++
-				}
-			},
-			setSeekTime(seekTime) {
-				this.seekTime = '';
-				this.$nextTick(() => {
-					this.seekTime = seekTime;
-				})
-			},
-			handlePause() {
-				this.$emit('play-pause')
-			},
-			handlePlay() {
-				this.$emit('play-play')
-			},
-			playEnd() {
-				this.$emit('play-end')
-			},
-			handleTimeupdate(timer) {
-				this.$emit('play-timeupdate',timer)
-			}
-		}
-	}
-</script>
-
-<script module="renderScript" lang="renderjs">
-	export default {
-		data() {
-			return {
-				player: null,
-				playAuth: '',
-				videoId: '',
-			}
-		},
-		methods: {
-			playVideo() {
-				setTimeout(() => {
-					this.player && this.player.play()
-				}, 300);
-			},
-			receiveMsg(newValue, oldValue, ownerInstance, instance) {
-				if (newValue) {
-					this.playAuth = ''
-					this.playAuth = newValue
-					this.loadWebPlayerSDK()
-				}
-			},
-			videoIdFun(newValue, oldValue, ownerInstance, instance) {
-				if (newValue) {
-					this.videoId = ''
-					this.videoId = newValue
-				}
-			},
-			hideFlagFun(newValue, oldValue, ownerInstance, instance) {
-				if (this.player) {
-					this.player.pause()
-				}
-			},
-			seekTimeFun(newValue, oldValue, ownerInstance, instance) {
-				if (newValue) {
-					this.player && this.player.seek(newValue)
-					console.log('已设置时间',newValue)
-				}
-			},
-			playAli() {
-				let that = this
-				//配置播放器
-				if (!this.playAuth) {
-					return false;
-				}
-				let player = new Aliplayer({
-					id: "wgy-player-test",
-					vid: this.videoId,
-					playauth: this.playAuth,
-					extraInfo: {
-						poster: 'noposter'
-					},
-					skinLayout: [{
-							name: "bigPlayButton",
-							align: "blabs",
-							x: 30,
-							y: 80
-						},
-						{
-							name: "H5Loading",
-							align: "cc"
-						},
-						{
-							name: "controlBar",
-							align: "blabs",
-							x: 0,
-							y: 0,
-							children: [{
-									name: "progress",
-									align: "blabs",
-									x: 0,
-									y: 44
-								},
-								{
-									name: "playButton",
-									align: "tl",
-									x: 15,
-									y: 12
-								},
-								{
-									name: "fullScreenButton",
-									align: "tr",
-									x: 10,
-									y: 12
-								},
-								{
-									name: "timeDisplay",
-									align: "tr",
-									x: 10,
-									y: 5
-								}
-							]
-						}
-					],
-					qualitySort: "asc",
-					format: "mp4",
-					mediaType: "video",
-					encryptType: 1,
-					autoplay: false,
-					isLive: false,
-					rePlay: false,
-					playsinline: true,
-					preload: false,
-					controlBarVisibility: "hover",
-					useH5Prism: true
-
-				}, function(player) {
-					console.log('ppp', player)
-				});
-				this.player = player;
-				player.on('canplay', function() {
-					player.tag.play();
-				});
-				player.on('ended', function() {
-					that.$ownerInstance.callMethod('playEnd', {
-						data: 'end'
-					})
-				});
-				player.on('pause', function() {
-					that.$ownerInstance.callMethod('handlePause')
-				});
-				player.on('play', function() {
-					that.$ownerInstance.callMethod('handlePlay')
-				});
-				player.on('timeupdate', function(time) {
-					that.$ownerInstance.callMethod('handleTimeupdate',time.target.childNodes[0].currentTime)
-				});
-				
-				
-			},
-			isHasScript() {
-				let scriptExists = false;
-				for (let script of document.scripts) {
-					if (script.src === 'https://g.alicdn.com/de/prismplayer/2.9.6/aliplayer-min.js') {
-						scriptExists = true;
-						break;
-					}
-				}
-				return scriptExists
-			},
-			loadWebPlayerSDK() {
-				if (this.player) {
-					this.player.dispose();
-				}
-				if (this.isHasScript()) {
-					this.playAli()
-					return;
-				}
-				return new Promise((resolve, reject) => {
-					const s_tag = document.createElement('script'); // 引入播放器js
-					s_tag.type = 'text/javascript';
-					s_tag.src = 'https://g.alicdn.com/de/prismplayer/2.9.6/aliplayer-min.js';
-					s_tag.charset = 'utf-8';
-					s_tag.onload = () => {
-						//	console.log(this.playAuth);
-						setTimeout(() => {
-							this.playAli()
-						}, 10);
-						resolve();
-					}
-					document.body.appendChild(s_tag);
-					const l_tag = document.createElement('link'); // 引入播放器css
-					l_tag.rel = 'stylesheet';
-					l_tag.href =
-						'https://g.alicdn.com/de/prismplayer/2.9.6/skins/default/aliplayer-min.css';
-					document.body.appendChild(l_tag);
-				});
-			},
-		}
-	}
-</script>
-
-<style lang="scss">
-
-</style>

+ 0 - 91
components/writeSign/index.vue

@@ -1,91 +0,0 @@
-<template>
-	<view class="ht-qm-box">
-		<view class="qm-tip-box">
-			<view>手写签名</view>
-			<jp-signature ref="signatureRef"></jp-signature>
-			<view class="qm-tip-text">
-				注意事项:<br/>
-				1.请仔细阅读全文,确认完全理解条款后签名。<br/>
-				2.需本人手写签名,签字即视为认可合同内容。<br/>
-				3.签名具有法律效力,签署后须履行约定义务,纠纷以签名数据为法律凭据。
-			</view>
-		</view>
-	</view>
-	<image v-show="false" :src="url" alt="" />
-	
-	<view class="ht-btn-box">
-		<button @click="save" type="default" class="phone-green-btn">保存</button>
-		<button @click="clear" type="default" class="phone-white-btn">清空</button>
-		<!-- <button size="mini" @click="undo" type="default" class="phone-white-btn">撤消</button> -->
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				url: '',
-			}
-		},
-		methods: {
-			save() {
-				this.$refs.signatureRef.canvasToTempFilePath({
-					success: (res) => {
-						// 是否为空画板 无签名
-						console.log(res.isEmpty)
-						console.log(res)
-						this.base64(res.tempFilePath)
-
-						// 生成图片的临时路径
-						// H5 生成的是base64
-						//	this.url = res.tempFilePath
-					}
-				})
-			},
-			// 转换	 app
-			base64(tempFilePath) {
-				let base64Code;
-				let path = plus.io.convertLocalFileSystemURL(tempFilePath);
-				// console.log('tempFilePath',tempFilePath);
-				// console.log('path',path);
-				let fileReader = new plus.io.FileReader();
-				fileReader.readAsDataURL(path);
-				fileReader.onloadend = res => {
-					// console.log('res',res);
-					base64Code = res.target.result;
-					this.url = res.target.result
-					this.$emit('getBase64',this.url)
-					// console.log('base64Code',base64Code);
-				}
-		
-			},
-			// miniProgramConvertToBase64(tempFilePath) {
-			// 				uni.getFileSystemManager().readFile({
-			// 					filePath: tempFilePath,
-			// 					encoding: 'base64',
-			// 					success: (res) => {
-			// 						let base64 = 'data:image/png;base64,' + res.data
-			// 						console.log('小程序base64转换成功,长度:', base64.length)
-			// 						this.url = base64
-			// 					},
-			// 					fail: (err) => {
-			// 						console.error('小程序转换失败:', err)
-			// 						// 转换失败时保持使用临时路径
-			// 						uni.showToast({
-			// 							title: '转换失败,使用原图',
-			// 							icon: 'none'
-			// 						})
-			// 					}
-			// 				})
-			// 			},
-		
-			clear() {
-				this.$refs.signatureRef.clear()
-			},
-			undo() {
-				this.$refs.signatureRef.undo()
-			},
-
-		}
-	}
-</script>

+ 0 - 57
components/zhuapaiConfirm/answerQueren.vue

@@ -1,57 +0,0 @@
-<template>
-	<view>
-		<uni-popup ref="popupRef" type="dialog" :animation="false" :is-mask-click="false"
-		mask-background-color="rgba(0, 0, 0, 0.4);">
-			<uni-popup-dialog mode="input"
-			class="phone-ksxz-dialog"
-				title="提示"
-				:duration="2000" 
-				:before-close="true"
-				:showClose="true"
-				@close="handleClose"
-				@confirm="handleConfirm">
-				<text>
-					您已经回答了{{data.answercartsCount}}题(共{{data.answercartsTotal}}题),确认交卷?
-				</text>
-			</uni-popup-dialog>
-		</uni-popup>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,reactive
-	} from "vue";
-	const popupRef = ref(null)
-	const data = reactive({
-		answercartsCount: '',
-		answercartsTotal: '',
-
-	})
-	
-	const emits = defineEmits(['confirm', 'cancel'])
-	
-	function showDialog(options) {
-		data.answercartsCount = options.answercartsCount;
-		data.answercartsTotal = options.answercartsTotal;
-		popupRef.value.open()
-	}
-	
-	function handleClose() {
-		emits('cancel');
-		popupRef.value.close()
-	}
-	
-	function handleConfirm() {
-		emits('confirm', data);
-		popupRef.value.close()
-	}
-	
-	defineExpose({
-		showDialog
-	})
-	
-</script>
-
-<style>
-</style>

+ 0 - 137
components/zhuapaiConfirm/index.vue

@@ -1,137 +0,0 @@
-<template>
-	<uni-popup ref="popupRef" type="dialog" :animation="false" :is-mask-click="false"
-		mask-background-color="rgba(0, 0, 0, 0.4);">
-		<uni-popup-dialog mode="input" class="phone-camera my-dialog-cc" :title="title" :duration="2000" :before-close="true"
-			@close="handleClose" @confirm="handleConfirm">
-			<view class="phone-camera-box" style="overflow: hidden;">
-				<view v-show="!showConfirmBtn" class="sxt-tip-box" style="text-align: center;">{{textMess}}</view>
-				<video v-show="showConfirmBtn" ref="videoRef" style="width:100%; height: 320rpx;" id="videoConfirm"
-					:controls="false" :enable-progress-gesture="false"></video>
-					
-				<!-- 隐藏抓拍绘制图片 -->
-				<canvas id="canvasConfirm" style="width: auto; height: 320rpx;visibility: hidden;position: absolute;"></canvas>
-				<!-- <canvas id="canvasConfirm" style="width: auto; height: 320rpx;"></canvas> -->
-				<!-- 测试抓拍使用 -->
-				<!-- <button @click="handleZhua">抓拍</button> -->
-			</view>
-		</uni-popup-dialog>
-	</uni-popup>
-</template>
-
-<script setup>
-	import {
-		ref,
-		onUnmounted,
-		onMounted,
-		nextTick
-	} from "vue"
-	import {
-		useH5Camera
-	} from "./useCamera.js"
-	
-	defineProps({
-		title: {
-			type: String,
-			default: '摄像头确认'
-		}
-	})
-	
-	const emits = defineEmits(['success', 'error', 'cancel'])
-	
-	const popupRef = ref(null)
-	const showConfirmBtn = ref(false);
-	
-	let zhuapaiFun = null;
-	let stopCamera = null;
-	let errorFunCompleteFn = null;
-	const textMess = ref('摄像头正在初始化...')
-
-	function startCamera() {
-		// 请求摄像头权限并获取流
-		// #ifdef H5
-		console.log('navigator', navigator)
-		const {
-			startH5Camera,
-			handlePaiZhao,
-			stopH5Camera,
-			errorFunComplete
-		} = useH5Camera({
-			elVideoId: '#videoConfirm',
-			elCanvasId: '#canvasConfirm',
-			onVideoSuccess,
-			onVideoError
-		})
-		startH5Camera();
-		zhuapaiFun = handlePaiZhao;
-		stopCamera = stopH5Camera;
-		errorFunCompleteFn = errorFunComplete;
-		// #endif
-
-		// #ifdef APP-PLUS
-		console.log('App端暂时不支持摄像头功能')
-		// #endif
-	}
-
-	function handleZhua() {
-		zhuapaiFun()
-	}
-
-
-	function onVideoSuccess() {
-		showConfirmBtn.value = true;
-	}
-
-	function onVideoError(e) {
-		showConfirmBtn.false = true;
-		textMess.value = '摄像头初始化失败!'
-		emits('error')
-		errorFunCompleteFn && errorFunCompleteFn(e)
-	}
-
-	function showDialog() {
-		textMess.value = '摄像头正在初始化...'
-		popupRef.value.open();
-		nextTick(() => {
-			startCamera()
-		})
-	}
-
-	function handleClose() {
-		emits('cancel')
-		popupRef.value.close();
-		stopCamera && stopCamera()
-	}
-
-	function handleConfirm() {
-		emits('success')
-		popupRef.value.close();
-		stopCamera && stopCamera()
-	}
-
-	defineExpose({
-		showDialog
-	})
-
-	onUnmounted(() => {
-		// 组件销毁时停止摄像头
-		stopCamera && stopCamera();
-	})
-</script>
-
-<style lang="scss">
-	.phone-camera-box {
-		width: 100%;
-	}
-
-	.uni-video-container {
-		width: 100%;
-	}
-
-	.uni-video-video {
-		width: 100%;
-	}
-
-  .my-dialog-cc .uni-dialog-button-group .uni-border-left .uni-button-color{
-      color: #3fd2a1;
-  }
-</style>

+ 0 - 138
components/zhuapaiConfirm/qieping.vue

@@ -1,138 +0,0 @@
-<template>
-	<view></view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		onUnmounted,
-		nextTick,
-		computed
-	} from "vue";
-	import {
-		getClientQiepingCheat,getClientQiepingTimes
-	} from "@/api/kaoshi.js"
-	import {
-		useZhuapaiStore
-	} from "@/store/zhuapai.js"
-
-	const zhuapaiStore = useZhuapaiStore();
-
-	const emits = defineEmits(['zhuapai', 'forceSubmit'])
-	const zhuapaiFlag = ref(false);
-	const zhuapaixiaoshi = ref(0);
-	const leaveTime = ref('');
-	const toggleScreenSecond = ref(0);
-	const toggleScreenFlag = ref(0);
-	const ksId = ref('')
-
-	function cheatingFun() {
-		// 用户离开了当前页面
-		if (document.visibilityState === 'hidden') {
-			console.log('页面不可见');
-			if (zhuapaiFlag.value) {
-				// 此时 切出后台 发生抓拍情况下 要传递固定图片
-				console.log('切出去zhuapaixiaoshi 恢复正常');
-				zhuapaixiaoshi.value = 1
-				zhuapaiStore.setStatus(1)
-			}
-			//  计时
-			leaveTime.value = new Date().getTime();
-		} else if (document.visibilityState === 'visible') {
-			console.log('切回来 恢复正常');
-			// 用户打开或回到页面
-			if (zhuapaiFlag.value) {
-				zhuapaixiaoshi.value = 0
-				zhuapaiStore.setStatus(0)
-				emits('zhuapai') // 重置抓拍
-			}
-			zhuapaixiaoshi.value = 0
-			zhuapaiStore.setStatus(0)
-			console.log('页面可见');
-			let nowTime = new Date().getTime();
-			if (Number(nowTime) - Number(leaveTime.value) > toggleScreenSecond.value + '000') {
-				let req = {
-					ksId: ksId.value,
-				};
-				getClientQiepingCheat(req).then(res => {
-					//cutScreenDialog   是否超限 true:超过限制 false:未超过限制 ,
-					if (res.code === 0 && res.data.flag) {
-						emits('forceSubmit') // 强制交卷
-					} else {
-						emits('qiepingToast', res.data.times) // 提示警告
-					}
-				});
-			}
-		}
-	}
-
-	function zhuapaiFun() {
-		if (document.visibilityState === 'hidden') {
-			console.log('页面不可见');
-			zhuapaixiaoshi.value = 1
-			zhuapaiStore.setStatus(1)
-		} else if (document.visibilityState === 'visible') {
-			zhuapaixiaoshi.value = 0
-			zhuapaiStore.setStatus(0)
-			emits('zhuapai')
-		}
-	}
-
-	function init(options) {
-		console.log('init', options)
-		toggleScreenFlag.value = options.toggleScreenFlag;
-		toggleScreenSecond.value = options.toggleScreenSecond;
-		zhuapaiFlag.value = options.zhuapaiFlag;
-		ksId.value = options.ksId;
-		// #ifdef H5
-		if (toggleScreenFlag.value !== 0) {
-			console.log("有切屏");
-			document.addEventListener('visibilitychange', cheatingFun, false);
-			cheatingNumberSearch();
-		}
-		if (zhuapaiFlag.value && toggleScreenFlag.value == 0) {
-			console.log("有抓拍 无切屏");
-			// 有抓拍 没有切屏  此方法是 解决切到后台,抓拍停留一帧的问题
-			document.addEventListener('visibilitychange', zhuapaiFun, false);
-		}
-		// #endif
-	}
-
-	function cheatingNumberSearch() {
-		let req = {
-			ksId: ksId.value,
-		};
-		getClientQiepingTimes(req).then(res => {
-			if (res.code === 0) {
-				if (res.data.times > 0 && res.data.times <= res.data.toggleScreenFlag) {
-					emits('qiepingToast', res.data.times) // 提示警告
-				} else if (res.data.times > 0 && res.data.times >= res.data.toggleScreenFlag) {
-					emits('forceSubmit') // 强制交卷
-				} 
-			}
-		});
-	}
-
-	function stopListen() {
-		if (toggleScreenFlag.value !== 0) {
-			console.log("有切屏 销毁");
-			document.removeEventListener('visibilitychange', cheatingFun, false);
-		}
-		if (zhuapaiFlag.value && toggleScreenFlag.value == 0) {
-			console.log("有抓拍 无切屏 销毁");
-			document.removeEventListener('visibilitychange', zhuapaiFun, false);
-		}
-	}
-
-	onUnmounted(() => {
-		// 组件销毁时移除监听
-		stopListen()
-	})
-
-	defineExpose({
-		init
-	})
-</script>
-
-<style>
-</style>

+ 0 - 107
components/zhuapaiConfirm/submitScore.vue

@@ -1,107 +0,0 @@
-<template>
-	<uni-popup ref="popupRef" :animation="false" :is-mask-click="false" type="bottom"
-		mask-background-color="rgba(0, 0, 0, 0.4);">
-		<view class="exam-score-dialog">
-			<view class="icon-title-bjcolor-navBar-box">
-				<view @click="handleClose" class="nav-bar-icon"></view>
-				<text class="nav-bar-title">{{title}}</text>
-			</view>
-
-			<view class="score-content-box">
-          <view class="score-content-name">{{data[nameKey]}}</view>
-          <view class="content-score-box">
-					<view>
-						<view class="score-content-text">正确数量:{{data.rightCount}}</view>
-						<view class="score-content-text">试题总数:{{data.shitiTotal}}</view>
-						<view class="score-content-text">及格分数:{{data.okScore}}</view>
-						<view class="score-content-text">{{labelName}}:{{data.ksScore}}</view>
-					</view>
-					<view class="score-content-text"><text>{{data.userScore}}</text>分</view>
-				</view>
-			</view>
-
-			<view class="progress-text-btn-box">
-				<text class="progress-text">正确率</text>
-				<c-progress-circle :progress='data.userAccuracy/100' color='#3fd2a1' size='240rpx'
-					boderWidth="240rpx" class="progress-circle-box"></c-progress-circle>
-				<button type="default" class="phone-green-btn score-dialog-btn" @click="handleCheckSj">查看成绩</button>
-			</view>
-		</view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive
-	} from "vue";
-	const popupRef = ref(null)
-	const data = reactive({
-		ksName: '',
-    lxName: '',
-		ksScore: '',
-		okScore: '',
-		rightCount: '',
-		shitiTotal: '',
-		userScore: '',
-	})
-
-	defineProps({
-		title: {
-			type: String,
-			default: '考试得分'
-		},
-		labelName: {
-			type: String,
-			default: '考试总分'
-		},
-    nameKey: {
-      type: String,
-      default: 'ksName'
-    }
-	})
-
-	const emits = defineEmits(['confirm', 'close'])
-
-	function handleClose() {
-		emits('close');
-		popupRef.value.close()
-	}
-
-	function handleCheckSj() {
-		emits('confirm', data);
-		popupRef.value.close()
-	}
-
-	function showDialog(options) {
-		data.ksName = options.ksName;
-    data.lxName = options.lxName;
-		data.ksScore = options.ksScore;
-		data.okScore = options.okScore;
-		data.rightCount = options.rightCount;
-		data.shitiTotal = options.shitiTotal;
-		data.userScore = options.userScore;
-		data.userAccuracy = options.userAccuracy;
-		popupRef.value.open()
-	}
-
-	defineExpose({
-		showDialog
-	})
-</script>
-
-<style lang="scss">
-	 .content{
-	        display: flex;
-	        flex-direction: column;
-	        align-items: center;
-	        padding-top: 20rpx;
-	        font-size: 28rpx;
-	    }
-	    .btnBox{
-	        width: 100%;
-	        display: flex;
-	        align-items: center;
-	        margin-top:30rpx;
-	    }
-</style>

+ 0 - 512
components/zhuapaiConfirm/useCamera.js

@@ -1,512 +0,0 @@
-const errorMessage = {
-	ms1: '请使用微信、Chrome、Firefox或Safari浏览器,如果浏览器没有问题,请联系管理员',
-	ms2: '请使用微信、Chrome、Firefox或Safari',
-	ms3: 'navigator对象无媒体属性', // 错误提示同ms2
-	ms4: '未找到摄像头,请确认摄像头是否正常以及当前摄像头是否被禁用',
-	ms5: '检测到当前摄像头已被占用,请关闭摄像头后重新尝试',
-	ms6: '摄像头硬件无法满足使用要求,请更换摄像头后重新尝试',
-	ms7: '请开启浏览器摄像头权限',
-	ms8: '未获取摄像头数据,请检测摄像头是否正常',
-	ms9: '当前浏览器不支持,请更换浏览器后尝试',
-	ms10: '当前Android系统版本低于9!请更新操作系统',
-	ms11: '当前IOS系统版本低于14.3!请更新操作系统',
-	ms12: '推荐使用safari浏览器或微信,使用其他浏览器可能会在考试过程中出现摄像头问题,影响考试结果,导致重考,不建议使用其他浏览器。',
-	ms13: '推荐使用火狐浏览器、谷歌浏览器或微信,使用其他浏览器可能会在考试过程中出现摄像头问题,影响考试结果,导致重考,不建议使用其他浏览器',
-};
-
-export {
-	errorMessage
-};
-
-
-function checkPlatform2() {
-	const ua = navigator.userAgent.toLowerCase();
-	// 安卓系统
-	if (/android/i.test(navigator.userAgent)) {
-		let test = /android\s([\w.]+)/;
-		let match = test.exec(ua);
-		let version = match[1].split('.')[0];
-		if (version < 9) {
-			uni.showToast({
-				icon: 'none',
-				title: errorMessage.ms10
-			})
-			
-			return {
-				data: false,
-				waitCode: false
-			};
-		}
-		// 判断 浏览器 Android
-		if (!checkAndroidForBrowser()) {
-			// 提示信息
-			uni.showToast({
-				icon: 'none',
-				title: errorMessage.ms13
-			})
-			
-			return {
-				data: true,
-				waitCode: true
-			};
-		}
-		return {
-			data: true,
-			waitCode: false
-		};
-	}
-	// ios 系统
-	if (/(iphone | ipad | ipod | iOS)/i.test(navigator.userAgent)) {
-		let test = /os\s([\w]+)/;
-		let match = test.exec(ua);
-		let vs = match[1].split('_');
-		let version = '';
-
-		if (vs.length > 2) {
-			version = `${vs[0]}.${vs[1]}`;
-		} else if (vs.length == 2) {
-			version = `${vs[0]}.${vs[1]}`;
-		} else {
-			version = `${vs[0]}.0`;
-		}
-
-		if (version < 14.3) {
-			uni.showToast({
-				icon: 'none',
-				title: errorMessage.ms11
-			})
-			return {
-				data: false,
-				waitCode: false,
-				duration: 3000
-			};
-		}
-
-		// 判断浏览器兼容 判断 ios 浏览器提示信息
-		// 判断 浏览器 Android
-		if (!checkIosForBrowser()) {
-			// 提示信息
-			uni.showToast({
-				icon: 'none',
-				title: errorMessage.ms12,
-				duration: 5000
-			})
-			return {
-				data: true,
-				waitCode: true
-			};
-		}
-
-		return {
-			data: true,
-			waitCode: false
-		};
-	}
-}
-
-function checkIosForBrowser() {
-	let u = navigator.userAgent;
-	let result = false;
-	let curname = getBrowser();
-	// 如果是 苹果
-	if (curname === 'safari') {
-		result = true;
-	}
-	// 如果是 微信
-	if (u.indexOf('MicroMessenger') > -1) {
-		result = true;
-	}
-	return result;
-}
-
-function checkAndroidForBrowser() {
-	let curname = getBrowser();
-	let result = false;
-	// 如果是 谷歌
-	if (curname === 'chrome') {
-		result = true;
-	}
-	if (curname === 'firefox') {
-		result = true;
-	}
-	// 如果是 微信
-	if (curname === 'wechat') {
-		result = true;
-	}
-	return result;
-}
-
-function getBrowser() {
-	var u = navigator.userAgent;
-
-	var bws = [{
-		name: 'sgssapp',
-		it: /sogousearch/i.test(u),
-	}, {
-		name: 'wechat',
-		it: /MicroMessenger/i.test(u),
-	}, {
-		name: 'weibo',
-		it: !!u.match(/Weibo/i),
-	}, {
-		name: 'uc',
-		it: !!u.match(/UCBrowser/i) || u.indexOf(' UBrowser') > -1,
-	}, {
-		name: 'sogou',
-		it: u.indexOf('MetaSr') > -1 || u.indexOf('Sogou') > -1,
-	}, {
-		name: 'xiaomi',
-		it: u.indexOf('MiuiBrowser') > -1,
-	}, {
-		name: 'baidu',
-		it: u.indexOf('Baidu') > -1 || u.indexOf('BIDUBrowser') > -1,
-	}, {
-		name: '360',
-		it: u.indexOf('360EE') > -1 || u.indexOf('360SE') > -1,
-	}, {
-		name: '2345',
-		it: u.indexOf('2345Explorer') > -1,
-	}, {
-		name: 'edge',
-		it: u.indexOf('Edge') > -1,
-	}, {
-		name: 'ie11',
-		it: u.indexOf('Trident') > -1 && u.indexOf('rv:11.0') > -1,
-	}, {
-		name: 'ie',
-		it: u.indexOf('compatible') > -1 && u.indexOf('MSIE') > -1,
-	}, {
-		name: 'firefox',
-		it: u.indexOf('Firefox') > -1,
-	}, {
-		name: 'safari',
-		it: u.indexOf('Safari') > -1 && u.indexOf('Chrome') === -1 && u.indexOf('(KHTML, like Gecko) Version') >
-			-1 && u.indexOf('MQQBrowser') === -1 && u.indexOf('FingerBrowser') === -1,
-	}, {
-		name: 'qqbrowser',
-		it: u.indexOf('MQQBrowser') > -1 && u.indexOf(' QQ') === -1,
-	}, {
-		name: 'qq',
-		it: u.indexOf('QQ') > -1,
-	}, {
-		name: 'chrome',
-		it: u.indexOf('(KHTML, like Gecko) Chrome') > -1 && u.indexOf('MiuiBrowser') === -1 && u.indexOf(
-			'UCBrowser') === -1 && u.indexOf('HarmonyOS') === -1 && u.indexOf('HuaweiBrowser') === -1,
-	}, {
-		name: 'opera',
-		it: u.indexOf('Opera') > -1 || u.indexOf('OPR') > -1,
-	}, {
-		name: 'wechat',
-		it: /MicroMessenger/i.test(u)
-	}, ];
-
-	for (var i = 0; i < bws.length; i++) {
-		if (bws[i].it) {
-			return bws[i].name;
-		}
-	}
-
-	return 'other';
-}
-
-export function errorFunComplete(e) {
-	const name = e.name;
-	if (name === 'NotFoundError' || name === 'DevicesNotFoundError') {
-		uni.showToast({
-			icon: 'none',
-			title: errorMessage.ms4,
-		})
-	}
-	if (name === 'NotReadableError' || name === 'TrackStartError') {
-		uni.showToast({
-			icon: 'none',
-			title: errorMessage.ms5,
-		})
-	} else if (name === 'OverconstrainedError' || name === 'ConstraintNotSatisfiedError') {
-		uni.showToast({
-			icon: 'none',
-			title: errorMessage.ms6,
-		})
-	} else if (name === 'NotAllowedError' || name === 'PermissionDeniedError') {
-		uni.showToast({
-			icon: 'none',
-			title: errorMessage.ms7,
-		})
-	} else if (name === 'TypeError' || name === 'TypeError') {
-		uni.showToast({
-			icon: 'none',
-			title: errorMessage.ms8,
-		})
-	} else {
-		uni.showToast({
-			icon: 'none',
-			title: errorMessage.ms9,
-		})
-	}
-}
-
-let constraints = {
-	audio: false,
-	video: {
-		width: 480,
-		height: 320,
-		sourceId: 'default',
-		deviceId: 'default',
-		transform: 'rotate(180deg)',
-		facingMode: {
-			exact: 'user'
-		},
-	},
-};
-
-// 校验权限
-export function check(success, error, backFun) {
-
-	if (!navigator) {
-		uni.showToast({
-			icon: 'none',
-			title: errorMessage.ms1,
-			duration: 5000
-		})
-		// 当前浏览器版本 无媒体对象
-		backFun && backFun();
-		return false;
-	}
-
-	const resoutData = checkPlatform2();
-	const timeD = resoutData.waitCode ? 5000 : 0;
-	if (!resoutData.data) {
-		backFun && backFun();
-		return false;
-	}
-
-	setTimeout(() => {
-		if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
-			//最新的标准API 返回promise
-			navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);
-		} else if (navigator.webkitGetUserMedia) {
-			//webkit核心浏览器
-			navigator.webkitGetUserMedia(constraints, success, error);
-
-		} else if (navigator.mozGetUserMedia) {
-			//firfox浏览器
-			navigator.mozGetUserMedia(constraints, success, error);
-
-		} else if (navigator.getUserMedia) {
-			//旧版API
-			navigator.getUserMedia(constraints, success, error);
-		} else {
-			uni.showToast({
-				icon: 'none',
-				title: errorMessage.ms2,
-			})
-			backFun && backFun();
-		}
-	}, timeD);
-	// 没有媒体对象
-	// Toast.fail(errorMessage.ms2);
-	// 1. ios 14.3版本一下
-	// 2. 当前浏览器非完整版
-}
-
-// 抓拍确认
-export function check2(success, error) {
-
-
-	if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
-		//最新的标准API 返回promise
-		navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);
-	} else if (navigator.webkitGetUserMedia) {
-		//webkit核心浏览器
-		navigator.webkitGetUserMedia(constraints, success, error);
-
-	} else if (navigator.mozGetUserMedia) {
-		//firfox浏览器
-		navigator.mozGetUserMedia(constraints, success, error);
-	} else if (navigator.getUserMedia) {
-		//旧版API
-		navigator.getUserMedia(constraints, success, error);
-	}
-}
-
-import {
-	ref,
-	nextTick
-} from "vue"
-import {useZhuapaiStore} from "@/store/zhuapai.js"
-import {getFileUpload} from "@/api/kaoshi.js"
-
-// H5 播放抓拍功能
-export function useH5Camera({
-	elVideoId,
-	elCanvasId,
-	onVideoSuccess, // 成功播放回调
-	onVideoError, // 失败回调
-	zhuapaiHttp, // 抓拍接口将base64 上传
-	operId
-}) {
-
-	const zhuapaiStore = useZhuapaiStore();
-
-
-	const videoRef = ref('');
-	videoRef.value = document.querySelector(`${elVideoId} .uni-video-video`);
-
-	function videoSuccessFun(MediaStream) {
-		// 赋值流
-		videoRef.value.srcObject = MediaStream;
-		// 设置video监听 为了确实获取视频播放判断有视频数据流
-		addVideoListener();
-		// 播放video 执行播放操作
-		playVideo();
-	}
-
-	function addVideoListener() {
-		videoRef && videoRef.value.addEventListener('play', onVideoPlay);
-	}
-
-	function removeVideoListener() {
-		videoRef && videoRef.value.removeEventListener('play', onVideoPlay);
-	}
-
-	function playVideo() {
-		if (videoRef.value) {
-			videoRef.value.play();
-		}
-	}
-
-	function onVideoPlay() {
-		onVideoSuccess && onVideoSuccess();
-	}
-
-	function videoErrorFun(e) {
-		console.log('错误', e)
-		removeVideoListener();
-		onVideoError && onVideoError(e)
-	}
-
-	// 主动开启
-	function startH5Camera() {
-		check2(videoSuccessFun, videoErrorFun);
-	}
-
-	// 主动关闭
-	function stopH5Camera() {
-		// 重置虚拟流
-		const stream = videoRef && videoRef.value.srcObject;
-		if (!stream) {
-			return;
-		}
-
-		const tracks = stream.getTracks();
-		tracks.forEach(function(track) {
-			track.stop();
-		});
-		// 销毁视频资源
-		videoRef.value.srcObject = null;
-		// 移除监听
-		removeVideoListener && removeVideoListener();
-	}
-
-	function handlePaiZhao() {
-		try {
-			const streamActive = videoRef.value.srcObject.active;
-			// 判断视频流 是否运行
-			if (!streamActive) {
-				onVideoError && onVideoError(new Error('摄像头抓拍异常'))
-				return;
-			}
-		} catch (e) {
-			onVideoError && onVideoError(new Error('摄像头抓拍异常'))
-			return;
-		}
-
-		try {
-			if (zhuapaiStore.status == 0) {
-				// status 为 如果抓拍过程中 应用进入后台 传递固定图片 0为正常 1为进入后台
-				let canvas = document.querySelector(`${elCanvasId} .uni-canvas-canvas`);
-				let context = canvas.getContext('2d');
-				context.drawImage(videoRef.value, 0, 0, videoRef.value.clientWidth, videoRef.value.clientHeight);
-				const ImageFile = context.canvas.toDataURL('image/png');
-				getSnapShotImage(ImageFile);
-			} else {
-				 const ImageFile = getBase64Image()
-				getSnapShotImage(ImageFile);
-			}
-		} catch (err) {
-			console.error('源 :绘图失败', err);
-		}
-	}
-
-	function getBase64Image() {
-		var canvas = document.createElement("canvas");
-		var ctx = canvas.getContext("2d");
-		canvas.width = 480;
-		canvas.height = 320;
-		ctx.drawImage(document.querySelector('#gdImg'), 0, 0, 480, 320);
-		let image = new Image();
-		image.src = canvas.toDataURL('image/png', 1)
-		setTimeout(res => {
-			ctx.clearRect(0, 0, 480, 320)
-		}, 500)
-		return image.src
-	}
-
-	function getSnapShotImage(data) {
-		// console.log('base64', data)
-		const imgData = data.split(';base64,');
-		if (!imgData.length) {
-			console.error('【源 :拍照数据异常,未找到图片二进制数据分割节点: `;base64,`】');
-			return;
-		}
-		const opt = {
-			data: imgData[1],
-			prefix: 'kaoshi/zhuapai',
-			suffix: 'png',
-			
-		};
-
-		console.log('optoptopt', opt)
-		
-		getFileUpload(opt).then(res => {
-			const dOption = {
-				operId,
-				url: res.data
-			}
-			zhuapaiHttp && zhuapaiHttp(dOption)
-				.then(res => {
-					console.log('【源 : 获取抓拍数据】');
-				})
-				.catch(err => {
-					console.error('源 :抓拍接口异常', err);
-					uni.showToast({
-						icon: 'none',
-						title: '抓拍图片异常!'
-					})
-					uni.redirectTo({
-						url: "/pages/client/Kaoshi/list"
-					})
-				});
-		}).catch(err => {
-			uni.showToast({
-				icon: 'none',
-				title: '当前网络可能存在异常,请稍后重试,如持续异常,请联系管理员。注:若异常未联系管理员,可能会影响考试结果。'
-			})
-			uni.redirectTo({
-				url: "/pages/client/Kaoshi/list"
-			})
-		})
-		
-		
-	}
-
-	return {
-		startH5Camera,
-		stopH5Camera,
-		handlePaiZhao,
-		errorFunComplete,
-		playVideo
-	}
-}
-
-

+ 0 - 296
components/zhuapaiConfirm/zhuapai.vue

@@ -1,296 +0,0 @@
-<template>
-	<view class="zhuapai-drop-container" id="Drop" ref="DropRef" :style="style" @touchmove="touchmove($event)"
-		@touchstart="touchstart($event)">
-		<view class="phone-camera-box-zhuapai">
-			<video ref="videoRef" class="video-view-box" :class="myClass" id="videoZhaPai" :controls="false"></video>
-			<!-- 隐藏抓拍绘制图片 -->
-			<canvas id="canvasZhuaPai" class="video-view-box canvas-view-box" :class="myClass"></canvas>
-			<!-- 用于抓拍切出去传递固定img-->
-			<!-- #ifdef H5 -->
-			<img :src="imgUrl" alt="" id="gdImg" v-show="false">
-			<!-- #endif -->
-			<!-- 测试抓拍使用 -->
-			<!-- <button @click="handleZhua">抓拍</button> -->
-		</view>
-		<span v-show="showVideo" @click="noShowVideoBtn" class="shiti-video-hidden-btn"><i></i></span>
-		<span v-show="!showVideo" @click="showVideoBtn" class="shiti-video-show-btn"><i></i></span>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		onUnmounted,
-		nextTick,
-		computed
-	} from "vue";
-	import {
-		useH5Camera
-	} from "@/components/zhuapaiConfirm/useCamera";
-	import * as ksApi from "@/api/kaoshi.js"
-	import {
-		getStaticUrl
-	} from "@/utils/common.js"
-
-	const imgUrl = getStaticUrl('static/images/exam/nokaoshi.png')
-
-	let zhuapaiFun = null;
-	let stopCamera = null;
-	let playVideoFun = null;
-
-	const DropRef = ref(null);
-	const DropContainerRef = ref(null);
-	const zhuapai = ref(0); // 单位分
-	const operId = ref(null); // 单位分
-	const disX = ref(0); // 移动x
-	const disY = ref(0); // 移动y
-	const showVideo = ref(true);
-	const isBuffer = ref(false);
-
-	const stopTimer = ref(null);
-	const style = ref({
-		top: "10vh",
-		right: "0",
-	});
-
-	const myClass = computed(() => {
-		return {
-			'show-video': showVideo.value,
-			'hidden-video': !showVideo.value
-		}
-	})
-
-	const emits = defineEmits(['init', 'success', 'error', 'cancel', 'progress'])
-
-	function noShowVideoBtn() {
-		showVideo.value = false
-	}
-
-	function showVideoBtn() {
-		showVideo.value = true;
-		playVideoFun && playVideoFun();
-	}
-
-	function touchmove(event) {
-		// 2,获取手指移动的实时位置  需要减去位置差
-		let moveX = event.touches[0].pageX - disX.value;
-		let moveY = event.touches[0].pageY - disY.value;
-
-		const systemInfo = uni.getSystemInfoSync();
-		const windowHeight = systemInfo.windowHeight; // 可视区域高度 ‌:ml-citation{ref="1,3" data="citationList"}  
-		const windowWidth = systemInfo.windowWidth; // 可视区域高度 ‌:ml-citation{ref="1,3" data="citationList"}  
-
-
-		// 3,获取容器的宽高和拖动元素的宽高  每一次移动都会获取一次 ,建议放在外面进行获取
-		let dragHeight = DropRef.value.$el.offsetHeight;
-		let dragWidth = DropRef.value.$el.offsetWidth;
-
-		// 4,控制范围:在元素 被拖拽的过程中 判断 元素的定位值 是否到达边界 如果到了 就不能在走了
-		if (moveX <= 0) {
-			moveX = 0;
-		}
-		// 上边界
-		if (moveY <= 0) {
-			moveY = 0;
-		}
-		//下边界  容器高度 - 拖动元素高度
-		if (moveY >= windowHeight - dragHeight - 150) {
-			moveY = windowHeight - dragHeight - 150;
-		}
-		//右边界   容器宽度 - 拖动元素宽度
-		if (moveX >= windowWidth - dragWidth) {
-			moveX = 0;
-		}
-
-		// 5,开始移动
-		style.value.top = moveY + "px";
-
-	}
-
-	function touchstart(event) {
-		disX.value = event.touches[0].pageX - DropRef.value.$el.offsetLeft;
-		disY.value = event.touches[0].pageY - DropRef.value.$el.offsetTop;
-	}
-
-
-	function init(options) {
-		zhuapai.value = options.zhuapai;
-		operId.value = options.operId;
-		if (zhuapai.value > 0) {
-			// 启动摄像头
-			nextTick(() => {
-				startCamera()
-				// 设定计时器
-				setInterval(() => handleZhua(), zhuapai.value * 60 * 1000)
-			})
-
-		}
-	}
-
-	function startCamera() {
-		// 请求摄像头权限并获取流
-		// #ifdef H5
-		console.log('navigator', navigator)
-		const {
-			startH5Camera,
-			handlePaiZhao,
-			stopH5Camera,
-			playVideo
-		} = useH5Camera({
-			elVideoId: '#videoZhaPai',
-			elCanvasId: '#canvasZhuaPai',
-			onVideoSuccess,
-			onVideoError,
-			zhuapaiHttp: ksApi.getClientZhuaPaiUpdate,
-			operId: operId.value
-		})
-		startH5Camera();
-		zhuapaiFun = handlePaiZhao;
-		stopCamera = stopH5Camera;
-		playVideoFun = playVideo;
-		// #endif
-
-	}
-
-	function handleZhua() {
-		zhuapaiFun && zhuapaiFun()
-	}
-
-	function onVideoSuccess() {
-		setTimeout(() => {
-			// 首次运行进行抓拍一次
-			handleZhua();
-		}, 3000);
-		addVideoListener();
-	}
-
-	function onVideoError() {
-		emits('error')
-		removeVideoListener()
-	}
-
-	// 针对视频通话的监听处理
-
-	function onTimeupdate() {
-		if (isBuffer.value) {
-			console.log('buffer')
-			return;
-		}
-		if (!stopTimer.value) {
-			return;
-		}
-		console.log('onTimeupdate')
-		clearTimeout(stopTimer.value);
-		stopTimer.value = null;
-	}
-
-	function onProgress() {
-		if (stopTimer.value) {
-			return;
-		}
-		isBuffer.value = true;
-		console.log('onProgress')
-		// buffer时间增大到3秒 过滤掉后续的onTimeupdate
-		setTimeout(() => {isBuffer.value = false}, 3000)
-		// 视频中途暂停被占用
-		stopTimer.value = setTimeout(() => {
-			emits('progress', false);
-			console.log('结束')
-		}, 10 * 1000)
-	}
-   function addVideoListener() {
-		let video = document.querySelector(`#videoZhaPai .uni-video-video`)
-		// 判定有流
-		video.addEventListener('progress', onProgress);
-		video.addEventListener('timeupdate', onTimeupdate);
-	}
-     function removeVideoListener() {
-		let video =document.querySelector(`#videoZhaPai .uni-video-video`)
-		video && video.removeEventListener('progress', onProgress);
-		video && video.removeEventListener('timeupdate', onTimeupdate);
-	}
-
-
-	onUnmounted(() => {
-		// 组件销毁时停止摄像头
-		stopCamera && stopCamera();
-		removeVideoListener();
-	})
-
-	defineExpose({
-		init,
-		showVideoBtn
-	})
-</script>
-
-<style lang="scss">
-	.zhuapai-drop-container {
-		width: 180rpx;
-		height: 400rpx;
-		margin: 0;
-		padding: 0;
-		z-index: 10;
-		position: absolute;
-		overflow: hidden;
-
-		.phone-camera-box-zhuapai {
-			width: 100%;
-			height: 240rpx;
-			position: absolute;
-			overflow: hidden;
-
-			.uni-video-container {
-				background-color: transparent;
-				pointer-events: none;
-			}
-
-			.canvas-view-box,
-			.hidden-video {
-				transform: translateY(10000rpx);
-			}
-		}
-
-		.video-view-box {
-			width: 100%;
-			height: 240rpx;
-			position: absolute;
-		}
-
-		.shiti-video-hidden-btn,
-		.shiti-video-show-btn {
-			position: absolute;
-			top: 0;
-
-			i {
-				width: 32rpx;
-				height: 32rpx;
-				display: block;
-				background-size: cover;
-				background-repeat: no-repeat;
-				background-position: center;
-			}
-		}
-
-		.shiti-video-hidden-btn {
-			width: 60rpx;
-			height: 60rpx;
-			left: 0;
-
-			i {
-				background-image: url("@/static/images/exam/video-close-icon.svg");
-				margin: 6rpx auto 6rpx 6rpx;
-			}
-		}
-
-		.shiti-video-show-btn {
-			background-color: #dcfbf1;
-			padding: 20rpx;
-			border-radius: 8rpx;
-			right: 0;
-
-			i {
-				background-image: url("@/static/images/exam/video-play-icon.svg");
-			}
-		}
-	}
-</style>

+ 9 - 0
index.html

@@ -10,6 +10,13 @@
 				'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
 				(coverSupport ? ', viewport-fit=cover' : '') + '" />')
 		</script>
+		<script>
+			window.AliyunCaptchaConfig = {
+				region: 'cn',
+				prefix: 'm9a704',
+			};
+		</script>
+		<script src="https://o.alicdn.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js"></script>
 		<title></title>
 		<!--preload-links-->
 		<!--app-context-->
@@ -17,5 +24,7 @@
 	<body>
 		<div id="app"><!--app-html--></div>
 		<script type="module" src="/main.js"></script>
+		<script type="text/javascript" src="https://www.chengxiangjiaoyu.com/uni.webview.1.5.6.js"></script>
+
 	</body>
 </html>

+ 1 - 1
manifest.json

@@ -167,7 +167,7 @@
     "vueVersion" : "3",
     "h5" : {
         "router" : {
-            "base" : "/mdist",
+            "base" : "/h5",
             "mode" : "history"
         },
         "title" : "北京诚祥",

+ 0 - 330
pages.json

@@ -1,340 +1,10 @@
 {
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
-			"path": "pages/Login/index",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
 			"path": "pages/Login/clientIndex",
 			"style": {
 				"navigationStyle": "custom"
 			}
-		},
-		{
-			"path": "pages/admin/ShouYe/shouye",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/ShouYe/shouye",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		}, {
-			"path": "pages/admin/Jiazheng/index",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		}, {
-			"path": "pages/admin/Jiazheng/jiazhengUserInfo",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		}, {
-			"path": "pages/admin/Jiazheng/kechengBind",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},{
-			"path": "pages/client/jiazheng/shareImage",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		}, {
-			"path": "pages/admin/Jiazheng/jiazhengUserManager",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Kaoshi/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Kaoshi/exam",
-			"style": {
-				"navigationStyle": "custom",
-				"app-plus": {
-					"softinputMode": "adjustResize",
-					"softinputNavBar": "none"
-				}
-			}
-
-		},
-		{
-			"path": "pages/admin/Kecheng/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/demo/demo1",
-			"style": {
-				"navigationBarTitleText": "demo1",
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Kecheng/study",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Lianxi/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Lianxi/lianxi",
-			"style": {
-				"navigationStyle": "custom",
-				"app-plus": {
-					"softinputMode": "adjustResize",
-					"softinputNavBar": "none"
-				}
-			}
-		},
-		{
-			"path": "pages/client/Kaoshi/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/Kecheng/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/Lianxi/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/Kaoshi/exam",
-			"style": {
-				"navigationStyle": "custom",
-				"app-plus": {
-					"softinputMode": "adjustResize",
-					"softinputNavBar": "none"
-				}
-			}
-
-		},
-		{
-			"path": "pages/client/Lianxi/exam",
-			"style": {
-				"navigationStyle": "custom",
-				"app-plus": {
-					"softinputMode": "adjustResize",
-					"softinputNavBar": "none"
-				}
-			}
-
-		},
-		{
-			"path": "pages/client/Chengji/lxScoreShijuan",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/Chengji/ksScoreShijuan",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Chengji/ksScoreShijuan",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/Chengji/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/my/index",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/my/index",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Chengji/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/my/myInfo",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/my/myInfo",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/client/Kecheng/study",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/tongzhi/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/tongzhi/details",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/banzheng/list",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/banzheng/filter",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/zizhanghao/list",
-			"style" : 
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/yishou/yishou",
-			"style" : 
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/zijiazheng/index",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/zijiazheng/banzhengshuliang",
-			"style" : 
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/zijiazheng/yibanzhengshuliang",
-			"style" : 
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/zijiazheng/jiazhengrenyuan",
-			"style" : 
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/demo/demo2",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/Hetong/Hetong",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/Hetong/HetongList",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/Hetong/HetongInfo",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/my/jzInfo",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/kehu/kehuList",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/kehu/kehuInfo",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/Hetong/sanfangHetong",
-			"style" :
-			{
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path" : "pages/admin/Hetong/addSanfangHetong",
-			"style" : 
-			{
-					"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/admin/Hetong/previewHetong",
-			"style": {
-				"navigationStyle": "custom"
-			}
 		}
 	],
 	"tabBar": {

+ 311 - 0
pages/Login/clientIndex copy.vue

@@ -0,0 +1,311 @@
+<!-- src/views/captcha/CaptchaPage.vue -->
+<template>
+  <div class="captcha-page">
+    <div class="container">
+      <!-- 表单区域 -->
+      <div class="form-group">
+        <label for="phone">手机号</label>
+        <input 
+          v-model="form.phone" 
+          type="tel" 
+          id="phone" 
+          placeholder="请输入手机号" 
+          maxlength="11"
+        />
+      </div>
+      
+      <!-- 验证码显示区域 -->
+      <div id="captcha-container" class="captcha-container"></div>
+      
+      <div class="form-group">
+        <label for="smsCode">短信验证码</label>
+        <div class="sms-input-group">
+          <input 
+            v-model="form.smsCode" 
+            type="text" 
+            id="smsCode" 
+            placeholder="请输入短信验证码" 
+            maxlength="6"
+          />
+          <button 
+            class="get-sms-btn" 
+            :disabled="smsCountdown > 0 || !isPhoneValid"
+            @click="getSmsCode"
+          >
+            {{ smsCountdown > 0 ? `${smsCountdown}s后重试` : '获取验证码' }}
+          </button>
+        </div>
+      </div>
+      
+      <button 
+        class="submit-btn" 
+        :disabled="!isFormValid || isSubmitting" 
+        @click="handleSubmit"
+      >
+        {{ isSubmitting ? '提交中...' : '绑定手机号' }}
+      </button>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, computed, onMounted, onUnmounted } from 'vue'
+import { tijiao } from '@/api/login.js'  // 直接使用你的API
+import { toast } from '@/utils/common'
+
+// 表单数据
+const form = ref({
+  phone: '',
+  smsCode: ''
+})
+
+// 状态管理
+const captchaVerifyParam = ref(null)
+const isSubmitting = ref(false)
+const smsCountdown = ref(0)
+let countdownTimer = null
+
+// 计算属性
+const isPhoneValid = computed(() => {
+  const phone = form.value.phone
+  return /^1[3-9]\d{9}$/.test(phone)
+})
+
+const isFormValid = computed(() => {
+  return isPhoneValid.value && 
+         form.value.smsCode.length === 6 && 
+         captchaVerifyParam.value
+})
+
+// 生命周期
+onMounted(() => {
+  loadAliyunCaptcha()
+})
+
+onUnmounted(() => {
+  if (countdownTimer) {
+    clearInterval(countdownTimer)
+  }
+})
+
+// 加载阿里云验证码
+function loadAliyunCaptcha() {
+  // 动态加载阿里云验证码脚本
+  const script = document.createElement('script')
+  script.src = 'https://o.alicdn.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js'
+  script.onload = () => {
+    initCaptcha()
+  }
+  script.onerror = () => {
+    toast('验证码加载失败,请重试')
+  }
+  document.head.appendChild(script)
+}
+
+// 初始化验证码
+function initCaptcha() {
+  window.AliyunCaptchaConfig = {
+    region: 'cn',
+    prefix: 'm9a704',
+  }
+
+  try {
+    window.initAliyunCaptcha({
+      SceneId: '1xp14eyl',
+      mode: "embed",
+      element: "#captcha-container",
+      success: (param) => {
+        captchaVerifyParam.value = param
+        console.log('验证码验证成功:', param)
+      },
+      fail: (err) => {
+        toast('验证失败,请重试')
+        console.error('验证码验证失败:', err)
+      },
+      slideStyle: {
+        width: 320,
+        height: 40
+      },
+      language: 'cn',
+      timeout: 5000,
+    })
+  } catch (error) {
+    console.error('初始化验证码失败:', error)
+    toast('验证码初始化失败')
+  }
+}
+
+// 获取短信验证码
+async function getSmsCode() {
+  if (!isPhoneValid.value) {
+    toast('请输入正确的手机号')
+    return
+  }
+
+  try {
+    // 这里调用你的短信接口
+    const response = await tijiao({
+      phone: form.value.phone,
+      captchaVerifyParam: captchaVerifyParam.value,
+      type: 'sms'
+    })
+    
+    if (response.code === 0) {
+      toast('验证码已发送')
+      startSmsCountdown()
+    } else {
+      toast(response.msg || '发送失败')
+    }
+  } catch (error) {
+    console.error('获取短信验证码失败:', error)
+    toast('发送失败,请重试')
+  }
+}
+
+// 开始短信倒计时
+function startSmsCountdown() {
+  smsCountdown.value = 60
+  countdownTimer = setInterval(() => {
+    smsCountdown.value--
+    if (smsCountdown.value <= 0) {
+      clearInterval(countdownTimer)
+      countdownTimer = null
+    }
+  }, 1000)
+}
+
+// 提交表单
+async function handleSubmit() {
+  if (!isFormValid.value || isSubmitting.value) return
+
+  isSubmitting.value = true
+
+  try {
+    const params = {
+      phone: form.value.phone,
+      smsCode: form.value.smsCode,
+      captchaVerifyParam: captchaVerifyParam.value
+    }
+
+    // 直接使用你项目中的API
+    const response = await tijiao(params)
+    
+    if (response.code === 0) {
+      toast('绑定成功')
+      
+      // 通知uniapp页面
+      if (window.uni && uni.postMessage) {
+        uni.postMessage({
+          data: {
+            status: 'success',
+            phone: form.value.phone,
+            captchaResult: captchaVerifyParam.value,
+            userInfo: response.data // 如果有用户信息
+          }
+        })
+      }
+      
+      // 延迟返回,确保消息传递
+      setTimeout(() => {
+        if (window.uni && uni.navigateBack) {
+          uni.navigateBack()
+        }
+      }, 1000)
+    } else {
+      toast(response.msg || '绑定失败')
+    }
+  } catch (error) {
+    console.error('绑定失败:', error)
+    toast('绑定失败,请重试')
+  } finally {
+    isSubmitting.value = false
+  }
+}
+</script>
+
+<style scoped>
+.captcha-page {
+  height: 100vh;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: #f5f5f5;
+}
+
+.container {
+  width: 90%;
+  max-width: 400px;
+  background: white;
+  padding: 30px;
+  border-radius: 10px;
+  box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+}
+
+.form-group {
+  margin-bottom: 20px;
+}
+
+.form-group label {
+  display: block;
+  margin-bottom: 8px;
+  font-weight: bold;
+  color: #333;
+}
+
+.form-group input {
+  width: 100%;
+  padding: 10px;
+  border: 1px solid #ddd;
+  border-radius: 5px;
+  box-sizing: border-box;
+}
+
+.sms-input-group {
+  display: flex;
+  gap: 10px;
+}
+
+.sms-input-group input {
+  flex: 1;
+}
+
+.get-sms-btn {
+  padding: 10px 15px;
+  background: #007aff;
+  color: white;
+  border: none;
+  border-radius: 5px;
+  cursor: pointer;
+  white-space: nowrap;
+}
+
+.get-sms-btn:disabled {
+  background: #ccc;
+  cursor: not-allowed;
+}
+
+.captcha-container {
+  margin: 20px 0;
+  min-height: 100px;
+}
+
+.submit-btn {
+  width: 100%;
+  padding: 12px;
+  background: #07c160;
+  color: white;
+  border: none;
+  border-radius: 5px;
+  font-size: 16px;
+  cursor: pointer;
+}
+
+.submit-btn:disabled {
+  background: #ccc;
+  cursor: not-allowed;
+}
+
+.submit-btn:hover:not(:disabled) {
+  background: #06ae56;
+}
+</style>

+ 292 - 2
pages/Login/clientIndex.vue

@@ -1,6 +1,296 @@
+<!-- my/index.vue -->
 <template>
-	<ClientLoginBox></ClientLoginBox>
+	<view class="my-page">
+		<!-- 你的页面内容 -->
+		<div class="captcha-container" v-if="showCaptcha">
+			<view class="input-item">
+				<text class="label">手机号:</text>
+				<input v-model="userTel" type="number" placeholder="请输入手机号" class="input" maxlength="11" />
+			</view>
+
+			<view id="your-dom-id" class="nc-container"></view>
+
+			<view class="code-input">
+				<input v-model="verification" type="number" placeholder="请输入验证码" class="code-input-field" />
+				<button @click="checkVerification" class="code-btn">
+					{{btnText}}
+				</button>
+			</view>
+
+			<button @click="save()" class="verify-phone-btn">绑定手机号</button>
+		</div>
+	</view>
 </template>
+
 <script setup>
-	import ClientLoginBox  from './components/clientloginBox.vue'
+	import {
+		ref,
+		onMounted,
+		onUnmounted
+	} from 'vue'
+
+	import {
+		bindApplet,
+		SendCode
+	} from "@/api/login.js"
+	import {
+		toast
+	} from '@/utils/common'
+	import {
+		onLoad,
+		onShow
+	} from '@dcloudio/uni-app';
+	// 从URL参数中获取code
+	const wxCode = ref('')
+	const showCaptcha = ref(false)
+	const userTel = ref('')
+	const verification = ref('')
+	const btnTextDisabled = ref(false)
+	const btnText = ref('获取验证码')
+	const countdown = ref(60)
+	const isValidate = ref(false)
+	const sliderData = ref({})
+	const timer = ref(null)
+	// 生命周期
+	onLoad((options) => {
+		// 获取URL中的code参数
+		const queryCode = options.code
+		console.log('接收到code参数:', queryCode)
+
+		if (queryCode) {
+			wxCode.value = queryCode
+			showCaptcha.value = true
+			// 页面加载完成后初始化验证码
+			initCaptcha()
+		} else {
+			toast('参数错误,请重新登录')
+		}
+	})
+
+	onUnmounted(() => {
+		clearTimer()
+	})
+
+
+
+
+	// 初始化验证码
+	function initCaptcha() {
+		try {
+			window.initAliyunCaptcha({
+				SceneId: "1xp14eyl",
+				mode: "embed",
+				element: "#your-dom-id",
+				success: function(captchaVerifyParam) {
+					console.log('验证成功:', captchaVerifyParam);
+					sliderData.value.param = captchaVerifyParam
+					isValidate.value = true;
+				},
+				fail: function(result) {
+					console.error('验证失败:', result);
+					isValidate.value = false;
+				},
+				slideStyle: {
+					width: 350,
+					height: 40,
+				},
+				language: 'cn',
+			});
+		} catch (error) {
+			console.error('初始化验证码失败:', error)
+			toast('验证码初始化失败')
+		}
+	}
+
+	// 获取验证码
+	async function checkVerification() {
+		if (!userTel.value) {
+			toast('请输入手机号!')
+			return false
+		}
+
+		// if (!/^1[3-9]\d{9}$/.test(userTel.value)) {
+		// 	toast('请输入正确的手机号!')
+		// 	return false
+		// }
+
+		if (isValidate.value) {
+			try {
+				const res = await SendCode({
+					'param': sliderData.value.param,
+					'phone': userTel.value,
+					'sceneId': '1xp14eyl',
+				})
+
+				if (res.code === 0 && res.data) {
+					setTime()
+				} else {
+					toast(res.msg || '发送失败')
+				}
+			} catch (error) {
+				console.error('发送验证码失败:', error)
+				isValidate.value = false
+				initCaptcha()
+				toast('发送失败,请重试')
+			}
+		} else {
+			toast('请先完成滑块验证!')
+			return false
+		}
+	}
+
+	// 倒计时
+	function setTime() {
+		if (countdown.value === 0) {
+			btnTextDisabled.value = false
+			btnText.value = '获取验证码'
+			countdown.value = 60
+			isValidate.value = false
+			initCaptcha()
+		} else {
+			btnTextDisabled.value = true
+			btnText.value = countdown.value + 's'
+			countdown.value--
+			timer.value = setTimeout(() => {
+				setTime()
+			}, 1000)
+		}
+	}
+
+	function clearTimer() {
+		if (timer.value) {
+			clearTimeout(timer.value)
+			timer.value = null
+		}
+	}
+
+	// 绑定手机号
+	async function save() {
+		if (!verification.value) {
+			toast('请输入验证码')
+			return
+		}
+
+		try {
+			const params = {
+				tel: userTel.value,
+				code: verification.value,
+				openId: wxCode.value // 传递微信的code
+			}
+
+			// 使用tijiao接口绑定手机号
+			const response = await bindApplet(params)
+
+			if (response.code === 0) {
+				toast('绑定成功')
+
+				uni.postMessage({
+					data: {
+						status: 'success',
+						phone: userTel.value,
+						captchaResult: sliderData.value.param,
+						bindResult: response.data
+					}
+				})
+
+				// 延迟返回
+				setTimeout(() => {
+					uni.navigateBack()
+				}, 1000)
+			} else {
+				toast(response.msg || '绑定失败')
+			}
+		} catch (error) {
+			console.error('绑定失败:', error)
+			toast('绑定失败,请重试')
+		}
+	}
 </script>
+
+<style scoped>
+	.my-page {
+		padding: 30rpx;
+	}
+
+	.captcha-container {
+		background: white;
+		padding: 40rpx 30rpx;
+		border-radius: 16rpx;
+		box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.08);
+	}
+
+	.input-item {
+		display: flex;
+		align-items: center;
+		margin-bottom: 30rpx;
+	}
+
+	.label {
+		width: 150rpx;
+		font-size: 28rpx;
+		color: #333;
+	}
+
+	.input {
+		flex: 1;
+		height: 80rpx;
+		padding: 0 20rpx;
+		border: 1px solid #e5e5e5;
+		border-radius: 8rpx;
+		font-size: 28rpx;
+	}
+
+	.nc-container {
+		margin: 30rpx 0;
+		display: block !important;
+	}
+
+	.code-input {
+		display: flex;
+		align-items: center;
+		height: 80rpx;
+		margin-bottom: 30rpx;
+		border: 1px solid #e5e5e5;
+		border-radius: 8rpx;
+		overflow: hidden;
+	}
+
+	.icon {
+		width: 40rpx;
+		height: 40rpx;
+		margin: 0 20rpx;
+	}
+
+	.code-input-field {
+		flex: 1;
+		height: 100%;
+		padding: 0 20rpx;
+		font-size: 28rpx;
+	}
+
+	.code-btn {
+		width: 200rpx;
+		height: 100%;
+		line-height: 80rpx;
+		background-color: #17c05b;
+		color: #fff;
+		font-size: 26rpx;
+		border: none;
+		border-radius: 0;
+	}
+
+	.code-btn:disabled {
+		background-color: #ccc;
+	}
+
+	.verify-phone-btn {
+		width: 100%;
+		height: 90rpx;
+		line-height: 90rpx;
+		background-color: #17c05b;
+		color: #fff;
+		font-size: 32rpx;
+		border: none;
+		border-radius: 45rpx;
+	}
+</style>

+ 0 - 194
pages/Login/components/adminloginBox.vue

@@ -1,194 +0,0 @@
-<template>
-	<view class="phone-login-page">
-		<view class="login-wrap-box">
-			<view class="bjcx-head-box">
-				<icon class="bjcx-logo-box"></icon>
-				<view class="bjcx-logo-title">家政学</view>
-			</view>
-			
-			<view class="login-input-box">
-				<icon class="user-icon"></icon>
-				<input class="login-input" type="text" v-model="userName" placeholder="请输入手机号" @input="userInputChange">
-				<view class="close-btn" v-if="clearTelIcon" @click="clearTel"></view>
-			</view>
-			<view class="login-input-box">
-				<icon class="tel-icon"></icon>
-				<input class="login-input" placeholder="请输入密码" v-model="password" :password="showPassword" 
-				 @input="passwordInputChange"/>
-				<text class="login-eye" :class="[!showPassword ? 'uni-eye-active' : '']"
-					@click="changePassword"></text>
-				<view class="close-btn" v-if="clearPwIcon" @click="clearPw"></view>
-			</view>
-			<button type="default" @click="handleLogin" class="phone-green-btn login-btn">登录</button>
-		<!-- 已加密的:{{lliPassword}} -->
-		</view>
-		<passwordLli ref="passLLiRef" :password="password" @lli-password="onLliPassword" />
-		<tip-dialog ref="tipDialogRef" :title="tipTitle" :content="tipContent"></tip-dialog>
-		
-		<!-- 安卓强制升级 -->
-		<shengJiDialog ref="tipDialogRef2" :closeFlag='false' :title="tipTitle" @confirm-btn="BanbenConfirmBtn" :showTip="true"
-			:notClose="true" :content="tipContentAndroid">
-		</shengJiDialog>
-	</view>
-</template>
-
-<script setup>
-	import {onShow} from '@dcloudio/uni-app';
-	import cacheManager from '@/utils/cacheManager.js'
-	import * as httpApi from "@/api/login.js"
-	import passwordLli from "@/components/password-lli/password-lli.vue";
-	import {ref} from "vue"
-	import {toast} from "@/utils/common";
-	import {useIsCanBack} from "@/store/isCanBack.js"
-	import config from '../../../config.js'
-	import tipDialog from '@/components/dialog/tipDialog.vue';
-	import shengJiDialog from '@/components/dialog/shengJiDialog.vue';
-	import {
-		useVersionUpdate
-	} from "@/utils/versionUpdate.js";
-	
-	const userName = ref('') // 用户名
-	const password = ref('') // 密码
-	const lliPassword = ref('') // 加密后的密码
-	const passLLiRef = ref(null)
-	const showPassword= ref(true)
-	const clearTelIcon= ref(false)
-	const clearPwIcon= ref(false)
-	
-	const store = useIsCanBack();
-	const version = config.appInfo.version;
-	const tipDialogRef = ref(null);
-	const tipTitle = '升级提醒';
-	const tipContent = '您的APP不是最新版本,部分功能不能使用,请升级至最新版本!';
-	const tipContentAndroid = '您的APP不是最新版本,部分功能不能使用,请升级至最新版本!'
-	
-	const tipDialogRef2 = ref(null)
-	const updateUrl = ref(null)
-	
-	const {
-		initDownload
-	} = useVersionUpdate()
-	
-	function BanbenConfirmBtn() {
-		const systemInfo = uni.getSystemInfoSync();
-			if (systemInfo.platform == 'ios') {
-				const appStoreUrl = 'itms-apps://itunes.apple.com/app/6754060756'
-				plus.runtime.openURL(appStoreUrl)
-			} else {
-				initDownload(updateUrl.value)
-			}
-	}	
-	
-	// 加密
-	function handleUpdateLLiPassword() {
-		passLLiRef.value.lliPassword();
-	}
-	function onLliPassword(password) {
-		console.log('onLliPassword',password)
-		lliPassword.value = password;
-	}
-	
-	// 手机号校验
-	function userInputChange(event){
-		if (event.detail.value.length > 0) {
-			clearTelIcon.value = true;
-		} else {
-			clearTelIcon.value = false;
-		}
-	}
-	
-	// 密码校验
-	function passwordInputChange(event){
-		if (event.detail.value.length > 0) {
-			clearPwIcon.value = true;
-		} else {
-			clearPwIcon.value = false;
-		}
-	}
-	
-	// 清除手机号
-	function clearTel(){
-		userName.value = '';
-		clearTelIcon.value = false;
-	}
-	
-	// 清除密码
-	function clearPw(){
-		password.value = '';
-		clearPwIcon.value = false;
-	}
-
-	// 密码显隐
-	function changePassword() {
-      showPassword.value = !showPassword.value;
-    }
-	
-	// 登录
-	function handleLogin() {
-		if(userName.value.length ===0){
-			toast('请输入手机号!')
-			return
-		}
-		
-		if(password.value.length ===0){
-			toast('请输入密码!')
-			return
-		}
-		
-		// 去除 userName 两端的空格
-		const trimmedUserName = userName.value;
-		const trimmedPassword = lliPassword.value;
-		
-	
-		httpApi.login({
-			// type 1app 2为H5
-			type:1,
-			userName: trimmedUserName,
-			password: lliPassword.value,
-		}).then(res => {
-			// 2为家政管理员
-			if(res.data.type ===2 ||res.data.type ===5){
-			
-				cacheManager.set('auth', res.data)
-				store.setIsCanBack(false)
-				// 页面跳转
-				gotoPage();
-			}else{
-				toast('登录失败,您的身份有误,请联系管理员。')
-			}
-		}).catch(err => {
-			store.setIsCanBack(true)
-		})
-	}
-	
-	// 跳转
-	function gotoPage(){
-        uni.navigateTo({
-          url: `/pages/admin/ShouYe/shouye`
-        })
-		}
-		
-	function getLoginInit(){
-		httpApi.getVersion({}).then(res => {
-	
-			if (version != res.data.version) {
-				updateUrl.value = res.data.updateUrl
-				
-				const systemInfo = uni.getSystemInfoSync();
-				if (systemInfo.platform == 'ios') {
-				
-				} else {
-					tipDialogRef2.value.handleShow();
-				}
-			}
-		})
-	}
-	
-	onShow(() => {
-		getLoginInit()
-	})	
-</script>
-
-<style>
-
-</style>

+ 0 - 156
pages/Login/components/clientloginBox.vue

@@ -1,156 +0,0 @@
-<template>
-	<view class="phone-login-page">
-		<view class="login-wrap-box">
-			<view class="bjcx-head-box">
-				<icon class="bjcx-logo-box"></icon>
-				<view class="bjcx-logo-title">家政学</view>
-			</view>
-
-			<view class="login-input-box">
-				<icon class="user-icon"></icon>
-				<input class="login-input" type="text" v-model="userName" placeholder="请输入手机号" @input="userInputChange">
-				<view class="close-btn" v-if="clearTelIcon" @click="clearTel"></view>
-			</view>
-			<view class="login-input-box">
-				<icon class="tel-icon"></icon>
-				<input class="login-input" placeholder="请输入证件号后六位" v-model="password" :password="showPassword"
-					@input="passwordInputChange" />
-				<text class="login-eye" :class="[!showPassword ? 'uni-eye-active' : '']" @click="changePassword"></text>
-				<view class="close-btn" v-if="clearPwIcon" @click="clearPw"></view>
-			</view>
-			<button type="default" @click="handleLogin" class="phone-green-btn login-btn">登录</button>
-			<!-- 已加密的:{{lliPassword}} -->
-		</view>
-		<passwordLli ref="passLLiRef" :password="password" @lli-password="onLliPassword" />
-	</view>
-</template>
-
-<script setup>
-	import cacheManager from '@/utils/cacheManager.js'
-	import * as httpApi from "@/api/login.js"
-	import passwordLli from "@/components/password-lli/password-lli.vue";
-	import {
-		ref
-	} from "vue"
-	import {
-		toast
-	} from "@/utils/common";
-	import {
-		useIsCanBack
-	} from "@/store/isCanBack.js"
-
-
-	const userName = ref('') // 用户名
-	const password = ref('') // 密码
-	const lliPassword = ref('') // 加密后的密码
-	const passLLiRef = ref(null)
-	const showPassword = ref(true)
-	const clearTelIcon = ref(false)
-	const clearPwIcon = ref(false)
-
-	const store = useIsCanBack();
-
-	// 加密
-	function handleUpdateLLiPassword() {
-		console.log('handleUpdateLLiPassword')
-		passLLiRef.value.lliPassword();
-	}
-
-	function onLliPassword(password) {
-		console.log('onLliPassword', password)
-		lliPassword.value = password;
-	}
-
-	// 手机号校验
-	function userInputChange(event) {
-		if (event.detail.value.length > 0) {
-			clearTelIcon.value = true;
-		} else {
-			clearTelIcon.value = false;
-		}
-	}
-
-	// 密码校验
-	function passwordInputChange(event) {
-		if (event.detail.value.length > 0) {
-			clearPwIcon.value = true;
-		} else {
-			clearPwIcon.value = false;
-		}
-	}
-
-	// 清除手机号
-	function clearTel() {
-		userName.value = '';
-		clearTelIcon.value = false;
-	}
-
-	// 清除密码
-	function clearPw() {
-		password.value = '';
-		clearPwIcon.value = false;
-	}
-
-	// 密码显隐
-	function changePassword() {
-		showPassword.value = !showPassword.value;
-	}
-
-	// 登录
-	function handleLogin() {
-		if (userName.value.length === 0) {
-			toast('请输入手机号!')
-			return
-		}
-
-		if (password.value.length === 0) {
-			toast('请输入密码!')
-			return
-		}
-
-		// 去除 userName 两端的空格
-		const trimmedUserName = userName.value;
-		const trimmedPassword = lliPassword.value;
-
-		uni.showLoading({
-			title: '登录中'
-		})
-
-		httpApi.login({
-			// type 1app 2为H5
-			type: 2,
-			userName: trimmedUserName,
-			password: lliPassword.value,
-		}).then(res => {
-			// 4为家政人员
-			if (res.data.type === 4) {
-
-		
-
-				cacheManager.set('auth', res.data)
-				store.setIsCanBack(false)
-				// 页面跳转
-				gotoPage();
-			} else {
-				toast('登录失败,您的身份有误,请联系管理员。')
-			}
-
-
-		}).catch(err => {
-			store.setIsCanBack(true)
-		}).finally(err => {
-			uni.hideLoading()
-		})
-	}
-
-	// 跳转
-	function gotoPage() {
-		uni.navigateTo({
-			url: `/pages/client/ShouYe/shouye`
-		})
-	}
-</script>
-
-<style>
-
-</style>

+ 0 - 6
pages/Login/index.vue

@@ -1,6 +0,0 @@
-<template>
-	<AdminloginBox></AdminloginBox>
-</template>
-<script setup>
-	import AdminloginBox from './components/adminloginBox.vue'
-</script>

+ 0 - 466
pages/admin/Chengji/ksScoreShijuan.vue

@@ -1,466 +0,0 @@
-<template>
-	<view class="phone-score-page">
-		<!-- 导航区域 -->
-		<view class="icon-title-navBar-box">
-			<view @click="handleBack" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">{{data.ksName}}</text>
-		</view>
-		<!-- 上方区域 -->
-		<topCard v-if="data.ksName" @openCard="handleOpenCard" :name="data.ksName" :zyLevelName="data.zyLevelName"
-			:userScore="data.userScore" :Score="data.ksScore"></topCard>
-
-		<!-- 段落 -->
-		<view class="score-shiti-content">
-			<!-- 试题区域 -->
-			<view v-if="activeSt">
-				<template v-if="activeSt.stTypeId == 1">
-					<!-- 单选 -->
-					<danxuan :question="activeSt" :key="activeSt.stId"></danxuan>
-				</template>
-				<template v-if="activeSt.stTypeId == 2">
-					<!-- 多选 -->
-					<duoxuan :question="activeSt" :key="activeSt.stId"></duoxuan>
-				</template>
-				<template v-if="activeSt.stTypeId == 3">
-					<!-- 判断 -->
-					<panduan :question="activeSt" :key="activeSt.stId"></panduan>
-				</template>
-				<template v-if="activeSt.stTypeId == 4">
-					<!-- 填空 -->
-					<tiankong :question="activeSt" :key="activeSt.stId"></tiankong>
-				</template>
-			</view>
-			<!-- 解析 -->
-			<view v-if="activeSt" class="score-answer-box">
-				<view class="phone-question-answer-box" v-if="activeSt.stTypeId != 4">
-					<view class="phone-line-title">答案解析</view>
-					<view class="btdf-row">本题得分:<text>{{answerRes.score}}</text>分</view>
-					<view class="zqda-row">正确答案:<text>{{answerRes.result}}</text></view>
-					<view class="ndda-row">您的答案:<text>{{answerRes.reply}}</text></view>
-					<view class="dajx-row">答案解析:
-						<rich-text :nodes="answerRes.answer"></rich-text>
-					</view>
-				</view>
-				<view class="phone-question-answer-box" v-else>
-					<view class="phone-line-title">答案解析</view>
-					<view class="btdf-row">本题得分:<text>{{answerRes.score}}</text>分</view>
-					<view class="zqda-row">正确答案:
-						<view v-for="(item,index) in answerRes.result">{{`填空${index+1}`}} : {{item}}</view>
-					</view>
-					<view class="ndda-row">您的答案:
-						<view v-for="(item,index) in answerRes.reply"> {{`填空${index+1}`}}: {{item}}</view>
-					</view>
-					<view class="dajx-row">答案解析:
-						<rich-text :nodes="answerRes.answer"></rich-text>
-					</view>
-				</view>
-			</view>
-		</view>
-		<!-- 上下按钮 -->
-		<view v-if="activeSt" class="score-bottom-box">
-			<view @click="handleOpenCard" class="score-num-box">
-				<icon class="score-num-icon"></icon>
-				<text
-					class="active-num">{{activeSt && activeSt.onlyNum||0}}</text>/<text>{{data.StListForSearch.length}}</text>
-			</view>
-			<view>
-				<button type="default" size="mini" hover-class="none" class="phone-green-btn score-answer-btn"
-					@click="handlePrev" v-if="!isFistStId">上一题</button>
-				<button type="default" size="mini" hover-class="none" class="phone-green-btn score-answer-btn"
-					@click="handleNext" v-if="!isLastStId">下一题</button>
-				<button type="default" size="mini" hover-class="none" class="phone-green-btn score-answer-btn"
-					@click="handleBack" v-if="isLastStId">完成</button>
-			</view>
-		</view>
-
-		<!-- 答题卡 -->
-		<uni-popup ref="popupRef" background-color="#fff" :animation="false" :is-mask-click="false" :mask-click="false">
-			<view class="answer-card-popup">
-				<view class="icon-title-navBar-box">
-					<view @click="handlePopupBack" class="nav-bar-icon"> </view>
-					<text class="nav-bar-title">答题卡</text>
-				</view>
-				<view class="card-content-box">
-					<view class="answer-card-content" v-for="(paragraph,paragraphIndex) in questionData"
-						:key="paragraphIndex">
-						<view class="paragraph-title">
-							{{paragraph.name}}
-						</view>
-						<view class="paragraph-qa" v-for="(qa,qaIndex) in paragraph.qas" :key="qaIndex"
-							:class="getQaClass(qa)" @click="answerCardItemClick(qa)">{{qa.onlyNum}}
-						</view>
-					</view>
-				</view>
-			</view>
-		</uni-popup>
-
-	</view>
-</template>
-
-<script setup>
-	import topCard from "@/components/score/topCard.vue"
-	import danxuan from "@/components/questions/danxuan.vue";
-	import duoxuan from "@/components/questions/duoxuan.vue";
-	import tiankong from "@/components/questions/tiankong.vue";
-	import panduan from "@/components/questions/panduan.vue";
-	import {
-		useQuestionTools
-	} from "@/components/questions/useQuestionTools.js";
-
-	import {
-		onLoad
-	} from "@dcloudio/uni-app";
-	import {
-		ref,
-		reactive,
-		computed
-	} from "vue"
-	import * as ksApi from "@/api/kaoshi.js"
-	const {
-		checkDanxuanReply,
-		checkDuoxuanReply,
-		checkPanduanReply,
-		checkTiankongReply,
-		getLetterByIndex
-	} = useQuestionTools();
-
-
-	const hisId = ref(null)
-	const popupRef = ref(null)
-
-	const data = reactive({
-		ksId: null,
-		ksName: '',
-		stTotal: 0,
-		zyLevelName: '',
-		userScore: '',
-		ksScore: 0,
-		StListForSearch: [],
-		duanluo: []
-	})
-
-	const questionData = ref([]);
-	const progress = reactive({
-		dlIndex: 0,
-		dtIndex: 0
-	})
-
-	const dlName = computed(() => {
-		if (data.StListForSearch && activeSt.value) {
-			return data.StListForSearch[activeSt.value.onlyNum].paragraphName
-		} else {
-			return ''
-		}
-	})
-
-	const activeSt = computed(() => {
-		if (questionData.value.length) {
-			return questionData.value.length && questionData.value[progress.dlIndex].qas[progress.dtIndex];
-		} else {
-			return null
-		}
-	})
-
-	const answerRes = computed(() => {
-		const qa = activeSt.value;
-		let score = qa.score;
-		let reply = '';
-		let result = '';
-		let answer = qa.answer;
-		if (qa.stTypeId == 1) {
-			// 单选题
-			if (qa.reply && qa.reply.trim() !== '') {
-				reply = getLetterByIndex(qa.reply)
-			} else {
-				reply = '未答'
-			}
-
-			if (qa.result) {
-				result = getLetterByIndex(qa.result)
-			} else {
-				result = '无答案'
-			}
-		}
-		if (qa.stTypeId == 2) {
-			// 多选题
-
-			if (qa.reply && qa.reply.length) {
-				reply = qa.reply.map(item => {
-					if (item.trim()) {
-						return getLetterByIndex(item.trim())
-					}
-				}).join(',')
-			} else {
-				reply = '未答'
-			}
-			if (qa.result) {
-				result = qa.result.map(item => {
-					if (item.trim()) {
-						return getLetterByIndex(item.trim())
-					}
-				}).join(',')
-			} else {
-				result = '无答案'
-			}
-		}
-		if (qa.stTypeId == 3) {
-			// 判断题
-			if (qa.reply === '') {
-				reply = '未答'
-			} else if (qa.reply == 0) {
-				reply = '错误'
-			} else if (qa.reply == 1) {
-				reply = '正确'
-			}
-			if (qa.result == 0) {
-				result = '错误'
-			} else if (qa.result == 1) {
-				result = '正确'
-			}
-		}
-		if (qa.stTypeId == 4) {
-			let reply = qa.reply || [];
-			let result = qa.result || [];
-			// 填空题
-			return {
-				score,
-				reply,
-				result,
-				answer
-			}
-		} else {
-			return {
-				score,
-				reply,
-				result,
-				answer
-			}
-		}
-	})
-
-	const isFistStId = computed(() => {
-		if (data.StListForSearch.length) {
-			return data.StListForSearch[0].stId == activeSt.value.stId
-		} else {
-			return false
-		}
-	});
-	const isLastStId = computed(() => {
-		if (data.StListForSearch.length) {
-			return data.StListForSearch[data.StListForSearch.length - 1].stId == activeSt.value.stId
-		} else {
-			return false
-		}
-	});
-
-
-	onLoad((options) => {
-		hisId.value = options.hisId;
-		initPage()
-	})
-
-
-	function getQaClass(qa) {
-		if (qa.marked && qa.marked === true) {
-			return 'paragraph-qa-block-mark';
-		} else {
-			if (qa.stTypeId == 1) {
-				if (checkDanxuanReply(qa)) {
-					return 'paragraph-qa-block-done';
-				} else {
-					return 'paragraph-qa-block-init';
-				}
-			} else if (qa.stTypeId == 2) {
-				if (checkDuoxuanReply(qa)) {
-					return 'paragraph-qa-block-done';
-				} else {
-					return 'paragraph-qa-block-init';
-				}
-			} else if (qa.stTypeId == 3) {
-				if (checkPanduanReply(qa)) {
-					return 'paragraph-qa-block-done';
-				} else {
-					return 'paragraph-qa-block-init';
-				}
-			} else if (qa.stTypeId == 4) {
-				if (checkTiankongReply(qa)) {
-					return 'paragraph-qa-block-done';
-				} else {
-					return 'paragraph-qa-block-init';
-				}
-			}
-		}
-	}
-
-	function skipQuestion(dlIndex, dtIndex) {
-		progress.dlIndex = dlIndex;
-		progress.dtIndex = dtIndex;
-		handlePopupBack()
-	}
-
-	function answerCardItemClick(qa) {
-		const actQa = data.StListForSearch.find(item => item.stId == qa.stId);
-		skipQuestion(actQa.dlIndex, actQa.dtIndex)
-	}
-	
-
-	function handleBack() {
-		uni.redirectTo({
-			url: "/pages/admin/Chengji/list"
-		})
-	}
-
-
-	function formatDuanluoList() {
-		let uIndex = 0; // 试题num
-		let iDuanluo = 0; // 段落num
-		let result = [];
-		for (const duanluo of data.duanluo) {
-			let paragraph = {
-				qas: [],
-			};
-			paragraph.name = duanluo.name;
-
-			let iQa = 0; // 当前试题序号
-			let order = 0; // 当前题型中第几题
-			for (const iDanxuan of duanluo.danxuan) {
-				iDanxuan.type = 'danxuan';
-				iDanxuan.marked = false;
-				iDanxuan.onlyNum = uIndex + 1;
-				iDanxuan.order = order;
-				iDanxuan.iQa = iQa;
-				paragraph.qas.push(iDanxuan);
-				uIndex++;
-				order++;
-				iQa++;
-
-				data.StListForSearch.push({
-					stId: iDanxuan.stId,
-					paragraphName: paragraph.name,
-					dlIndex: iDuanluo,
-					dtIndex: iDanxuan.iQa,
-					num: iDanxuan.onlyNum
-				})
-			}
-			order = 0;
-			for (const iDuoxuan of duanluo.duoxuan) {
-				iDuoxuan.type = 'duoxuan';
-				iDuoxuan.marked = false;
-				iDuoxuan.onlyNum = uIndex + 1;
-				iDuoxuan.order = order;
-				paragraph.qas.push(iDuoxuan);
-				iDuoxuan.iQa = iQa;
-				uIndex++;
-				order++;
-				iQa++;
-
-				data.StListForSearch.push({
-					stId: iDuoxuan.stId,
-					paragraphName: paragraph.name,
-					dlIndex: iDuanluo,
-					dtIndex: iDuoxuan.iQa,
-					num: iDuoxuan.onlyNum
-				})
-			}
-			order = 0;
-			for (const iPanduan of duanluo.panduan) {
-				iPanduan.type = 'panduan';
-				iPanduan.marked = false;
-				iPanduan.onlyNum = uIndex + 1;
-				iPanduan.order = order;
-				paragraph.qas.push(iPanduan);
-				iPanduan.iQa = iQa;
-				uIndex++;
-				order++;
-				iQa++;
-
-				data.StListForSearch.push({
-					stId: iPanduan.stId,
-					paragraphName: paragraph.name,
-					dlIndex: iDuanluo,
-					dtIndex: iPanduan.iQa,
-					num: iPanduan.onlyNum
-				})
-			}
-			order = 0;
-			for (const iTiankong of duanluo.tiankong) {
-				iTiankong.type = 'tiankong';
-				iTiankong.marked = false;
-				iTiankong.onlyNum = uIndex + 1;
-				iTiankong.order = order;
-				paragraph.qas.push(iTiankong);
-				iTiankong.iQa = iQa;
-				uIndex++;
-				order++;
-				iQa++;
-
-				data.StListForSearch.push({
-					stId: iTiankong.stId,
-					paragraphName: paragraph.name,
-					dlIndex: iDuanluo,
-					dtIndex: iTiankong.iQa,
-					num: iTiankong.onlyNum
-				})
-			}
-			iDuanluo++;
-			questionData.value.push(paragraph)
-
-		}
-	}
-
-	function handlePrev() {
-		const qa = data.StListForSearch.find(item => item.stId == activeSt.value.stId);
-		const index = qa.num - 1;
-		if (index > 0) {
-			const result = data.StListForSearch[index - 1];
-			progress.dlIndex = result.dlIndex;
-			progress.dtIndex = result.dtIndex
-		}
-
-	}
-
-	function handleNext() {
-		const qa = data.StListForSearch.find(item => item.stId == activeSt.value.stId);
-		const index = qa.num - 1;
-		if (index < data.StListForSearch.length) {
-			const result = data.StListForSearch[index + 1];
-			progress.dlIndex = result.dlIndex;
-			progress.dtIndex = result.dtIndex
-		}
-	}
-
-
-
-	function initPage() {
-		ksApi.getAdminKsChengjiView({
-			hisId: hisId.value
-		}).then(res => {
-			const {
-				duanluoList,
-				ksName,
-				zyLevelName,
-				userScore,
-				ksScore
-			} = res.data;
-			data.ksName = ksName;
-			data.zyLevelName = zyLevelName;
-			data.userScore = userScore;
-			data.ksScore = ksScore;
-			data.duanluo = duanluoList;
-
-			formatDuanluoList();
-		})
-	}
-
-	function handlePopupBack() {
-		popupRef.value.close()
-	}
-
-	function handleOpenCard() {
-		popupRef.value.open('top')
-	}
-</script>
-
-<style>
-
-</style>

+ 0 - 257
pages/admin/Chengji/list.vue

@@ -1,257 +0,0 @@
-<template>
-	<view class="phone-list-page">
-		<view class="phone-navBar-box border-navBar-box">
-			<view @click="goUpPage" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">成绩</text>
-			<view class="nav-bar-icon-box">
-				<uni-icons class="nav-bar-right-icon" type="search" size="22" color="#666"
-					@click="toggle('top')"></uni-icons>
-			</view>
-		</view>
-		<!-- 查询职业 -->
-		<!-- <view class="phone-search-box">
-			<input class="search-input" placeholder="请输入职业名称" v-model="data.zyName" />
-			<view class="search-icon" @click="handleSearch">
-				<uni-icons type="search" size="24" color="#fff"></uni-icons>
-			</view>
-		</view> -->
-		
-		<view>
-			<search-dialog ref="searchDialogRef" 
-				@search-btn="dialogSearchBtn"
-				@reset-search="dialogSearchReset"></search-dialog>
-		</view>
-		
-		<!-- 课程列表 -->
-		<scroll-view scroll-y="true" refresher-enabled="true" :refresher-triggered="data.loading"
-				:refresher-threshold="50" refresher-background="transparent" @refresherrefresh="onRefresh" @scrolltolower="onScrolltolower"
-				class="admin-phone-tabbar-view">
-				<uni-list class="admin-list-box">
-					<uni-list-item v-for="item in data.list" class="admin-list-item-box">
-						<template v-slot:body>
-							<view class="item-card-row">
-								<!-- 数量 -->
-								<view class="ks-item-top">
-									<view class="ks-name">{{item.ksName}}</view>
-									<view class="ks-zyLevelName">{{item.zyLevelName}}</view>
-								</view>
-								
-								<view class="ks-totalTm-row">
-									<view class="ks-totalTm">
-										<icon class="phone-user-icon" />姓名:{{item.realName}} 
-									</view>
-									<view class="ks-totalTm">
-										<icon class="phone-tel-icon" />手机号:{{item.userName}} 
-									</view>
-								</view>
-								<view class="ks-totalTm">
-									<icon class="phone-time-icon" />{{item.answerStartTime}} - {{item.answerEndTime}}
-								</view>
-								<!-- <view class="ks-totalTm">
-									<icon class="phone-time-icon" /> {{item.userScore}} / {{item.okScore}}/{{item.ksScore}}
-								</view> -->
-								<!-- 分数 -->
-								<view class="ks-score-content">
-									<view class="ks-score">
-										<icon class="phone-zongfen-icon" />总分:<text>{{item.ksScore}}</text>
-									</view>
-									<view class="ks-okScore cj-okScore">
-										<icon class="phone-jigefen-icon" />及格分:<text>{{item.okScore}}</text>
-									</view>
-									<view class="ks-getScore">
-										<icon class="phone-defen-icon" />得分:<text>{{item.userScore}}</text>
-									</view>
-								</view>
-								<button @click="checkKecheng(item)" type="primary" size="mini"
-									class="item-view-btn">查看内容</button>
-							</view>
-						</template>
-					</uni-list-item>
-					<uni-load-more :status="data.state" @click="getMore(0)"
-						:contentText="data.contentText"></uni-load-more>
-				</uni-list>
-			</scroll-view>
-
-		<!-- 页面底端 -->
-		<customTabbarAdminVue :current-tab="0"></customTabbarAdminVue>
-	</view>
-</template>
-
-<script setup>
-	import customTabbarAdminVue from "@/components/custom-tabbar/custom-tabbar-admin.vue";
-	import {
-		ref,
-		reactive
-	} from "vue";
-	import {
-		onLoad
-	} from "@dcloudio/uni-app";
-	import * as kaoshiApi from "@/api/kaoshi.js"
-	import {
-		formatDuration
-	} from "@/utils/common.js"
-	import searchDialog from "@/pages/admin/jiazheng/common/search.vue";
-	
-
-	const data = reactive({
-		zyName: '', // 职业名称
-		list: [], // 考试列表
-		loading: false,
-		page: 0,
-		size: 10,
-		state: 'more',
-		contentText: {
-			contentdown: '查看更多',
-			contentrefresh: '加载中',
-			contentnomore: '没有更多'
-		},
-		userName: '',
-		realName: '',
-	})
-	
-	const searchDialogRef = ref(null);
-	
-	function dialogSearchReset() {
-		data.userName = '';
-		data.realName = '';
-	}
-	
-	function dialogSearchBtn(name, searchData) {
-		switch (name) {
-			case '姓名':
-				dialogSearchReset();
-				data.realName = searchData.value;
-				break;
-			case '手机号':
-				data.userName = searchData.value;
-				break;
-		}
-		onRefresh();
-	}
-	
-	const toggle = (data, index) => {
-		searchDialogRef.value.handleShow();
-	}
-
-	function goUpPage() {
-		uni.redirectTo({
-			url: '/pages/admin/ShouYe/shouye'
-		})
-	}
-
-	function handleSearch() {
-		data.page = 0;
-		refreshData();
-	}
-
-	function checkKecheng(item) {
-		uni.navigateTo({
-			url: `/pages/admin/Chengji/ksScoreShijuan?hisId=${item.hisId}`
-		})
-	}
-	
-	function onScrolltolower() {
-		getMore()
-	}
-
-	function onRefresh() {
-		data.page = 0;
-		data.list = [];
-		data.loading = true;
-		refreshData();
-	}
-
-	function refreshData() {
-		const opt = {
-			page: 1,
-			size: 10, // 固定查询10条
-			userName: data.userName,
-			realName: data.realName
-		}
-		data.list = [];
-		// 数学
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-
-		kaoshiApi.getAdminKsChengjiList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-				data.loading = false;
-			} else {
-				data.state = 'no-more';
-				data.loading = false;
-			}
-		}).catch(err => {
-			data.state = 'more';
-			data.loading = false;
-		})
-	}
-
-	function getMore() {
-		const opt = {
-			page: 1,
-			size: 10, // 固定查询10条
-			userName: data.userName,
-			realName: data.realName
-		}
-		if (data.state == 'no-more') return;
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-		kaoshiApi.getAdminKsChengjiList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-				data.loading = false;
-			} else {
-				data.state = 'no-more';
-				data.loading = false;
-			}
-		}).catch(err => {
-			data.state = 'more';
-			data.loading = false;
-		})
-	}
-
-	onLoad(() => {
-		getMore()
-	})
-</script>
-
-<style lang="scss" scoped>
-	.phone-kecheng-page {
-		background-color: #ccc;
-		box-sizing: border-box;
-	}
-
-	.phone-search-content {
-		position: relative;
-		background-color: #fff;
-		height: 42px;
-
-		.search-input {
-			height: 42px;
-			line-height: 40px;
-			border-radius: 20px;
-			border: 1px solid #ccc;
-			padding: 0 70px 0 20px;
-		}
-
-		.search-icon {
-			position: absolute;
-			right: 5px;
-			top: 4px;
-			padding: 6px;
-			background-color: #ccc;
-			border-radius: 20px;
-			width: 50px;
-			text-align: center;
-		}
-	}
-</style>

+ 0 - 154
pages/admin/Hetong/Hetong.vue

@@ -1,154 +0,0 @@
-<template>
-	<view class="phone-hetong-page">
-		<view class="phone-navBar-box">
-			<view @click="goUpPage" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">合同</text>
-			<view class="lsht-icon" @click="handleGoLishi"></view>
-		</view>
-		<template v-if="tId">
-			<view class="pdf-box"> 
-				 <img v-for="item in imgList" mode="aspectFit" :src="`data:image/png;base64,${item}`" 
-				 @click="previewBase64Image(`data:image/png;base64,${item}`)" class="pdf-img"/>
-			</view>
-			<!-- 加载提示 -->
-			<view class="pdf-tip-box" v-if="isLoading">
-				<view class="tip-img-box">
-					 <view class="tip-text">加载中...</view>
-				</view>
-			</view>
-		</template>
-		<view class="hetong-tip-box" v-if="info.status == 0">
-				  请务必仔细阅读上述内容,确认已完全理解所有条款后,点击【我已阅读】按钮完成签字确认。
-		</view>
-		<button v-if="info.status == 0" type="default" class="phone-green-btn ht-btn"
-			@click="handleQianming">我已阅读</button>
-
-		<uni-popup ref="popupRef" type="bottom" background-color="#fff" :is-mask-click="false" :mask-click="false">
-			<view class="ht-qm-popup">
-				<view class="icon-title-navBar-box">
-					<view @click="goback2" class="nav-bar-icon"></view>
-					<text class="nav-bar-title">签名</text>
-				</view>
-				<writeSign @getBase64="getBase64"></writeSign>
-			</view>
-		</uni-popup>
-		
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref
-	} from "vue";
-	import * as httpApi from "@/api/hetong.js"
-	import {
-		onLoad
-	} from "@dcloudio/uni-app"
-	import writeSign from "@/components/writeSign/index.vue"
-  import {throttleAdvanced} from "@/utils/common.js"
-  import { base64ToPath } from 'image-tools';
-
-	const tId = ref(null)
-	const info = ref({})
-	const popupRef = ref(null)
-	const imgList = ref([])
-	const isLoading = ref(true)
-  const timer1 = ref(null)
-
-	function goUpPage() {
-		uni.navigateBack()
-    clearTimeout(timer1.value);
-    timer1.value = null;
-	}
-	onLoad(({id}) => {
-    tId.value = id;
-		init(id)
-	})
-
-	function init(id) {
-		if (!id) {
-			uni.showToast({
-				title: '数据异常,请确认路径是否完整'
-			})
-			return;
-		}
-
-		httpApi.getHetongInfo({id}).then(res => {
-			info.value = res.data;
-			imgList.value = res.data.base64List;
-		}).finally(() => {
-			isLoading.value = false;
-		})
-	}
-
-  async function previewBase64Image(base64Data) {
-      try {
-        // 关键步骤:将 Base64 字符串转换为本地临时路径
-        // 此处以使用 image-tools 的 base64ToPath 为例
-        const localPath = await base64ToPath(base64Data);
-        // 调用 UniApp 的图片预览 API
-        uni.previewImage({
-          urls: [localPath], // 注意:urls 参数需要是数组,即使只预览一张图
-          current: 0, // 当前显示图片在 urls 数组中的索引
-        });
-      } catch (error) {
-        // 如果出现错误(如转换失败),隐藏加载提示并告知用户
-        console.error('预览失败:', error);
-        uni.showToast({
-          title: '预览失败',
-          icon: 'none'
-        });
-      }
-  }
-
-	function handleGoLishi() {
-		uni.redirectTo({
-			url: '/pages/admin/Hetong/HetongList'
-		})
-	}
-
-	function handleQianming() {
-		popupRef.value.open()
-	}
-
-  const  handleQM = throttleAdvanced((img) => {
-    uni.showToast({
-      title: "签名提交中...",
-      mask: true,
-    })
-
-    httpApi.getHetongQianming({
-      id: tId.value,
-      yifangBase64: img.replace(/^data:image\/\w+;base64,/, ''), // 当前接口,只有唯一yifangBase64 + id
-    }).then(res => {
-      if (res.data) {
-        uni.showToast({
-          title: "签名成功",
-          duration: 2000,
-          mask: true,
-          success() {
-            timer1.value = setTimeout(() => uni.navigateBack(),2000)
-          }
-        })
-      }
-    })
-  })
-
-	function getBase64(img) {
-		if (!img) {
-			uni.showToast({
-				title: '签名异常'
-			})
-			return;
-		}
-    handleQM(img)
-	}
-
-	function goback2() {
-		popupRef.value.close()
-	}
-</script>
-
-<style>
-
-</style>

+ 0 - 156
pages/admin/Hetong/HetongInfo.vue

@@ -1,156 +0,0 @@
-<template>
-	<view class="phone-hetong-page">
-		<view class="phone-navBar-box">
-			<view @click="goUpPage" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">合同</text>
-			<view class="lsht-icon" @click="handleGoLishi"></view>
-		</view>
-		<template v-if="tId">
-			<view class="pdf-box">
-				<img v-for="item in imgList" mode="aspectFit" :src="`data:image/png;base64,${item}`"
-					@click="previewBase64Image(`data:image/png;base64,${item}`)" class="pdf-img" />
-			</view>
-			<!-- 加载提示 -->
-			<view class="pdf-tip-box" v-if="isLoading">
-				<view class="tip-img-box">
-					 <view class="tip-text">加载中...</view>
-				</view>
-			</view>
-		</template>
-
-		<view class="hetong-tip-box" v-if="tId && info.status == 0">
-			请务必仔细阅读上述内容,确认已完全理解所有条款后,点击【我已阅读】按钮完成签字确认。
-		</view>
-		<button @click="handleQianming" v-if="tId && info.status == 0" class="phone-green-btn ht-btn"
-			type="default">我已阅读</button>
-
-		<uni-popup ref="popupRef" type="bottom" background-color="#fff" :is-mask-click="false" :mask-click="false">
-			<view class="ht-qm-popup">
-				<view class="icon-title-navBar-box">
-					<view @click="goback2" class="nav-bar-icon"></view>
-					<text class="nav-bar-title">签名</text>
-				</view>
-				<writeSign @getBase64="getBase64"></writeSign>
-			</view>
-		</uni-popup>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref
-	} from "vue";
-	import * as httpApi from "@/api/hetong.js"
-	import {
-		onLoad
-	} from "@dcloudio/uni-app"
-	import writeSign from "@/components/writeSign/index.vue"
-	import {
-		throttleAdvanced
-	} from "@/utils/common.js"
-	import {
-		base64ToPath
-	} from "image-tools";
-
-	const tId = ref(null)
-
-	const info = ref({})
-	const show = ref(false)
-	const popupRef = ref(null)
-	const imgList = ref([])
-	const isLoading = ref(true)
-	const timer1 = ref(null)
-
-	onLoad((options) => {
-		tId.value = options.id;
-		init();
-	})
-
-	function handleQianming() {
-		popupRef.value.open()
-	}
-
-	function init() {
-		httpApi.getHetongInfo({
-			id: tId.value
-		}).then(res => {
-			info.value = res.data;
-			imgList.value = res.data.base64List;
-		}).finally(() => {
-			isLoading.value = false;
-		})
-	}
-
-	async function previewBase64Image(base64Data) {
-		try {
-			// 关键步骤:将 Base64 字符串转换为本地临时路径
-			// 此处以使用 image-tools 的 base64ToPath 为例
-			const localPath = await base64ToPath(base64Data);
-			// 调用 UniApp 的图片预览 API
-			uni.previewImage({
-				urls: [localPath], // 注意:urls 参数需要是数组,即使只预览一张图
-				current: 0, // 当前显示图片在 urls 数组中的索引
-			});
-		} catch (error) {
-			// 如果出现错误(如转换失败),隐藏加载提示并告知用户
-			console.error('预览失败:', error);
-			uni.showToast({
-				title: '预览失败',
-				icon: 'none'
-			});
-		}
-	}
-
-	function goUpPage() {
-		uni.navigateBack()
-		clearTimeout(timer1.value);
-		timer1.value = null;
-	}
-
-	const handleQM = throttleAdvanced((img) => {
-		uni.showToast({
-			title: "签名提交中...",
-			mask: true,
-		})
-
-		httpApi.getHetongQianming({
-			id: tId.value,
-			yifangBase64: img.replace(/^data:image\/\w+;base64,/, '')
-		}).then(res => {
-			if (res.data) {
-				uni.showToast({
-					title: "签名成功",
-					duration: 2000,
-					mask: true,
-					success() {
-						timer1.value = setTimeout(() => goUpPage(), 2000)
-					}
-				})
-			}
-		})
-	})
-
-	function getBase64(img) {
-		if (!img) {
-			uni.showToast({
-				title: '签名异常'
-			})
-			return;
-		}
-		handleQM(img)
-
-	}
-	function handleGoLishi() {
-		uni.redirectTo({
-			url: '/pages/admin/Hetong/HetongList'
-		})
-	}
-
-	function goback2() {
-		popupRef.value.close()
-	}
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 163
pages/admin/Hetong/HetongList.vue

@@ -1,163 +0,0 @@
-<template>
-	<view class="phone-list-page ht-list-page">
-		<view class="icon-title-navBar-box">
-			<view @click="goUpPage" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">历史合同</text>
-		</view>
-	<!-- 课程列表 -->
-	<scroll-view scroll-y="true" refresher-enabled="true" :refresher-triggered="data.loading"
-		:refresher-threshold="50" refresher-background="transparent" @refresherrefresh="onRefresh"  @scrolltolower="onScrolltolower"
-		class="admin-phone-tabbar-view">
-		<uni-list class="admin-list-box ht-list-box">
-			<uni-list-item v-for="item in data.list" class="ht-list-item-box">
-				<template v-slot:body>
-					<view class="ht-card-row">
-						<view class="ht-status-btn-row">
-							<view class="ht-status">合同状态:<view :class="'status-' + item.status">{{formatStatus(item.status)}}</view></view>
-							<view class="ht-biew-btn" @click="checkKecheng(item)">查看<icon class="ht-jt"></icon></view>
-						</view>
-						<view class="ht-time"><icon class="phone-time-icon" />合同开始时间:{{formatTime(item.startDate)}} </view>
-						<view class="ht-time"><icon class="phone-time-icon" />合同结束时间:{{formatTime(item.endDate)}} </view>
-					</view>
-				</template>
-			</uni-list-item>
-			<uni-load-more :status="data.state" @click="getMore(0)" :contentText="data.contentText"></uni-load-more>
-		</uni-list>
-	</scroll-view>
-	<!-- 页面底端 -->
-	<customTabbarClientVue></customTabbarClientVue>
-	</view>
-</template>
-
-<script setup>
-import {ref,reactive} from "vue";
-import {onLoad,onShow} from "@dcloudio/uni-app";
-import {getHetongList} from '@/api/hetong.js'
-import customTabbarClientVue from "@/components/custom-tabbar/custom-tabbar-admin.vue";
-const data = reactive({
-		list: [], // 考试列表
-		loading: false,
-		page: 0,
-		size: 10,
-		state: 'more',
-		contentText: {
-			contentdown: '查看更多',
-			contentrefresh: '加载中',
-			contentnomore: '没有更多'
-		},
-})	
-	
-onLoad((options) => {
-		data.from = options.from;
-		
-	})
-
-onShow(() => {
-  refreshData()
-})
-
-function onRefresh() {
-	data.page = 0;
-	data.list = [];
-	data.loading = true;
-	refreshData();
-}
-
-function refreshData() {
-	const opt = {
-		page: 1,
-		size: 10, // 固定查询10条
-	}
-	data.list = [];
-	// 数学
-	data.state = 'loading';
-	data.page++;
-	opt.page = data.page;
-	
-	    console.log('列表',opt)
-	
-	getHetongList(opt).then(res => {
-
-
-
-		data.list = data.list.concat(res.data.data);
-		data.loading = false;
-		if (res.data.total > data.list.length) {
-			data.state = 'more';
-			data.loading = false;
-		} else {
-			data.state = 'no-more';
-			data.loading = false;
-		}
-	}).catch(err => {
-		data.state = 'more';
-		data.loading = false;
-	})
-}
-
-function getMore() {
-	const opt = {
-		page: 1,
-		size: 10, // 固定查询10条
-	}
-	if (data.state == 'no-more') return;
-	data.state = 'loading';
-	data.page++;
-	opt.page = data.page;
-	getHetongList(opt).then(res => {
-    console.log('列表2',res.data)
-
-    data.list = data.list.concat(res.data.data);
-		data.loading = false;
-		if (res.data.total > data.list.length) {
-			data.state = 'more';
-			data.loading = false;
-		} else {
-			data.state = 'no-more';
-			data.loading = false;
-		}
-	}).catch(err => {
-		data.state = 'more';
-		data.loading = false;
-	})
-}
-
-function onScrolltolower() {
-	getMore()
-}
-
-function handleSearch() {
-	data.page = 0;
-	refreshData();
-}
-
-// 在现有代码底部添加此方法
-function formatStatus(status) {
-  const statusMap = {
-    0: '待签字',
-    1: '待审核',
-    2: '生效',
-	3: '失效',
-  };
-  return statusMap[status] || '未知状态'; // 处理未知状态
-}
-
-function formatTime(data){
-		return data.split(' ')[0];
-}
-
-function checkKecheng(item) {
-	uni.navigateTo({
-		url: `/pages/admin/Hetong/HetongInfo?id=${item.id}`
-	})
-}
-
-function goUpPage() {
-	uni.redirectTo({
-		url: '/pages/admin/ShouYe/shouye'
-	})	
-}
-</script>
-
-<style>
-</style>

+ 0 - 264
pages/admin/Hetong/addSanfangHetong.vue

@@ -1,264 +0,0 @@
-<template>
-	<view class="sfht-info-page">
-		<view class="icon-title-navBar-box">
-			<view @click="goUpPage" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">新增三方合同</text>
-		</view>
-		<!-- form -->
-		<view class="sfht-form-box">
-			<!-- 合同模板 -->
-			<view class="form-label-select form-radius-box">
-				<view class="phone-form-label"><text class="form-label-require"></text>合同模板</view>
-				<picker :range="data.mobanList" mode='selector' :value="data.mobanIndex" range-key="name"
-					@change="onMobanSelect" class="select-picker-box">
-					<view class="form-radio-select">
-						<view v-if="data.mobanList[data.mobanIndex]">{{ data.mobanList[data.mobanIndex].name}}</view>
-						<icon></icon>
-					</view>
-				</picker>
-			</view>
-
-			<!-- 客户信息 -->
-			<kehuCardVue></kehuCardVue>
-			<!-- 家政人员 -->
-			<jiazhengCardVue></jiazhengCardVue>
-
-			<template v-if="data.mobanIndex == 0">
-
-				<!-- 合同信息 -->
-				<hetongCardVue></hetongCardVue>
-				<!-- 其他约定 -->
-				<qiTaYueDingVue></qiTaYueDingVue>
-				<!-- 家政签名 -->
-				<qianMingVue></qianMingVue>
-
-			</template>
-
-			<common-dialog ref="commonDialogRef" title="提示" :showQuxiao="false" content="请完善社会信用代码与服务监督热线"
-				@confirm-btn="handleConfirm"></common-dialog>
-		</view>
-
-		<view class="sfht-info-btn-box">
-			<button type="default" class="phone-green-btn" @click="handleAdd"
-				v-if="data.type == 'addHetong'">创建合同</button>
-			<button type="default" class="phone-green-btn" @click="handleUpdate"
-				v-if="data.type == 'editorHetong'">更新合同</button>
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import {
-		onLoad
-	} from "@dcloudio/uni-app";
-	import * as httpApi from "@/api/sanfang.js"
-
-	import hetongCardVue from "./components/hetongCard.vue";
-	import jiazhengCardVue from "./components/jiazhengCard.vue";
-	import kehuCardVue from "./components/kehuCard.vue";
-	import qianMingVue from "./components/qianMing.vue";
-	import qiTaYueDingVue from "./components/qiTaYueDing.vue";
-	import commonDialog from '@/components/dialog/commonDialog.vue';
-
-	import {
-		useHetong
-	} from "./useHetong.js"
-	import {
-		getSanfangInfo
-	} from "../../../api/sanfang";
-
-	const {
-		provideHetong
-	} = useHetong()
-
-	const emits = defineEmits('select-kehu')
-
-	const data = reactive({
-		mobanList: [],
-		mobanIndex: null,
-		hetong: {
-			htId: null, // 合同模板id
-			baochou: '', // 基本月报酬
-			qita: '', // 其他服务
-			bingren: '', // 病人病情
-			dizhi: '', // 服务地址
-			fafangri: '', // 工资发放日
-			fangshi: 1, // 服务方式,1住家型,2非住家型
-			fsShijian: '', // 非住家型服务时间
-			fuwufei: '', // 服务费
-			fuwufeiRate: '', // 服务费百分比
-			fzHaizi: '', // 辅助照顾孩子人数
-			fzHzNianling: '', // 辅助照顾孩子年龄
-			huli: '', // 产妇护理
-			jiabingEndDate: '', // 甲丙服务结束时间
-			jiabingStartDate: '', // 甲丙服务开始时间
-			jiandurexian: '', // 服务监督热线
-			jiayiEndDate: '', // 甲乙服务结束时间
-			jiayiStartDate: '', // 甲乙服务开始时间
-			khId: '', // 客户ID
-			khName: '', // 客户姓名
-			khIdcard: '', // 客户身份证号
-			laoren: '', // 照顾老人人数
-			leixing: 1, // 服务类型,1普通家务保姆,2钟点工保姆,3育儿嫂,4其他
-			lrnianling: '', // 照顾老人年龄: 60,70,80
-			lxName: '', // 其他服务类型名称
-			mianji: '', // 住房面积
-			qzHaizi: '', // 全职照顾孩子人数
-			qzHzNianliang: '', // 全职照顾孩子年龄
-			realName: '', // 家政姓名
-			renkou: '', // 常驻人口数
-			tianshu: '', // 基本月报酬天数
-			userId: '', // 家政员ID
-			xinyongdaima: '', // 统一社会信用代码
-			xiuxi: '', // 休息天数
-			khUserName: '', // 客户电话
-      shentiqingkuang: 0, // 身体状态,1 能自理 ,2半自理, 3不能自理
-			beizhu: '', // 备注
-			qianmingBase64: '',
-			id: null,
-      jutidizhi: '',
-		},
-		type: null,
-    timer: null
-	})
-
-	const commonDialogRef = ref(null)
-
-	// 穿透式传参
-	provideHetong(data)
-
-	const jzRef = ref(null)
-
-	function handleSelct(code) {
-		if (code == 'kh') {
-			khRef.value.handleShow();
-		} else {
-			jzRef.value.handleShow();
-		}
-	}
-
-	function goUpPage() {
-		uni.navigateBack()
-	}
-
-	function getMoban() {
-		return httpApi.getMobanList().then(res => {
-			data.mobanList = res.data;
-			// 初始化默认选中
-			data.mobanIndex = 0;
-		})
-	}
-
-	function onMobanSelect(da) {
-		data.mobanIndex = da.detail.value
-	}
-
-	function handleQianming(da) {
-		data.qianming = da;
-	}
-
-	function handleAdd() {
-    uni.showLoading({
-      title: '创建中...',
-      mask: true
-    });
-		const opt = Object.assign({}, {
-			...data.hetong,
-			htId: data.mobanList[data.mobanIndex].id
-		})
-		httpApi.getSanfangAdd(opt).then(res => {
-			if (res.data) {
-        uni.hideLoading()
-				uni.showToast({
-					title: "创建成功",
-          duration:2000,
-					success() {
-            setTimeout(() => {
-              uni.navigateBack()
-            },2000)
-					}
-				})
-			}
-		}).catch(() => {
-      uni.hideLoading()
-    }).
-    finally(() => {
-      clearTimeout(data.timer);
-      data.timer = null;
-    })
-	}
-
-	function handleUpdate() {
-
-    uni.showLoading({
-      title: '更新中...',
-      mask: true
-    });
-		const opt = Object.assign({}, {
-			...data.hetong,
-			htId: data.mobanList[data.mobanIndex].id
-		})
-		httpApi.getSanfangUpdate(opt).then(res => {
-			if (res.data) {
-        uni.hideLoading()
-				uni.showToast({
-					title: "更新成功",
-          duration:2000,
-          mask: true,
-					success() {
-            setTimeout(() => {
-              uni.navigateBack()
-            },2000)
-					}
-				})
-			}
-		}).catch(() => {
-      uni.hideLoading()
-    })
-	}
-
-	function handleConfirm() {
-		uni.redirectTo({
-			url: '/pages/admin/my/jzInfo' // 跳转完善
-		})
-	}
-
-	onLoad((option) => {
-
-		const {
-			flag,
-			id
-		} = option;
-
-		if (flag) {
-			data.type = 'editorHetong'
-			getMoban().then(() => {
-				httpApi.getSanfangInfo({
-					id
-				}).then(res => {
-					Object.assign(data.hetong, res.data)
-					
-					console.log('ccccc', res.data)
-				})
-			})
-		} else {
-			data.type = 'addHetong'
-			httpApi.getSanfangCheck().then(res => {
-				if (res.data) {
-					getMoban();
-				} else {
-					commonDialogRef.value.handleShow()
-				}
-			})
-		}
-	})
-</script>
-
-<style>
-
-</style>

+ 0 - 120
pages/admin/Hetong/components/addKh.vue

@@ -1,120 +0,0 @@
-<template>
-  <uni-popup ref="popupRef" type="bottom" background-color="#fff" :is-mask-click="false" :mask-click="false">
-    <view class="admin-kehu-info">
-    	<view class="icon-title-navBar-box">
-    		<view @click="goback2" class="nav-bar-icon"></view>
-    		<text class="nav-bar-title">新增家政客户</text>
-    	</view>
-    	<view>
-    		<view class="form-label-input">
-    			<view class="phone-form-label"><text class="form-label-require">*</text>姓名</view>
-    			<uni-easyinput v-model="formData.realName"
-    				placeholder="请输入姓名" />
-    		</view>
-    		
-    		<view class="form-label-input">
-    			<view class="phone-form-label"><text class="form-label-require">*</text>手机号</view>
-    			<uni-easyinput type="number" v-model="formData.userName"
-    				placeholder="请输入手机号" maxlength="11" />
-    		</view>
-    		<view class="form-label-input">
-    			<view class="phone-form-label">
-    				<text class="form-label-require"></text>
-    				<text v-if="formData.idtype ==1">身份证号</text>
-    				<text v-if="formData.idtype ==2">护照号</text>
-    				<icon @click="idCardChange" class="change-icon">切换</icon>
-    			</view>
-    			<uni-easyinput :disabled="!statusFlag && status=='edit'" @blur="idCardBlur" v-model="formData.idcard"
-    				placeholder="请输入身份证号或护照号" maxlength="18" />
-    		</view>
-    		<view class="form-label-input flex-start-row">
-    			<view class="phone-form-label"><text class="form-label-require"></text>具体地址</view>
-    			<textarea v-model="jingli" maxlength="-1" placeholder="请填写具体地址" class="form-textarea-box" />
-    		</view>
-    	</view>
-    	<button type="default" class="phone-green-btn info-btn" @click="saveBtn">保存</button>
-    </view>
-  </uni-popup>
-</template>
-
-<script setup>
-import {ref,reactive,nextTick} from "vue";
-import {onLoad} from "@dcloudio/uni-app";
-import * as khApi from "@/api/kehu.js"
-
-const emits = defineEmits('success')
-
-const formData = reactive({
-	realName: '',
-	userName: '',
-	idcard: '',
-	idtype: '1',
-})
-
-function goback2() {
-  popupRef.value.close();
-}
-
-const popupRef = ref(null)
-const data = reactive({
-})
-
-function handleShow() {
-  popupRef.value.open();
-}
-
-function idCardChange(data) {
-	formData.idtype = formData.idtype == 1 ? 2 : 1;
-}
-
-// 保存
-function saveBtn(){
-	htAdd();
-}
-
-// 新增
-function htAdd(){
-	let arr = [];
-	if (!formData.realName) {
-		arr.push('姓名');
-	}
-	if (!formData.userName) {
-		arr.push('电话');
-	}
-	if (!formData.realName || !formData.userName) {
-		uni.showToast({
-			icon: 'none',
-			title: `请完善${arr.join('、')}信息!`
-		})
-		return;
-	}
-	uni.showLoading({
-	      title: '新增中...',
-	      mask: true
-	    });
-	const opt = {
-		realName: formData.realName,
-		userName: formData.userName,
-		idtype: formData.idtype,
-		idcard: formData.idcard,
-	}
-	khApi.getKehuAdd(opt).then(res => {
-		if (res.data) {
-			uni.showToast({
-				title: '新增成功'
-			})
-			goback2();
-			emits('success')
-		}
-	}).finally(()=>{
-		uni.hideLoading()
-	})
-}
-
-defineExpose({
-  handleShow
-})
-</script>
-
-<style>
-</style>

+ 0 - 48
pages/admin/Hetong/components/bingFuWuFei.vue

@@ -1,48 +0,0 @@
-<template>
-	<uni-collapse class="fwnr-collapse-box"  @change="handleChange">
-		<uni-collapse-item title="丙方服务费" :open="true">
-			<view class="form-label-input">
-				<view class="fwnr-form-label"><text class="form-label-require"></text>服务费=乙方基本月报酬x倍数</view>
-				<uni-easyinput v-model="data.hetong.fuwufeiRate" placeholder="请输入倍数" />
-			</view>
-			<view class="form-label-input form-label-disabled">
-				<view class="fwnr-form-label"><text class="form-label-require"></text>即人民币(元)</view>
-				<view>{{money}}</view>
-			</view>
-		</uni-collapse-item>
-	</uni-collapse>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-	import {computed} from "vue";
-	const {
-		injectHetong
-	} = useHetong();
-	
-	const data = injectHetong();
-	
-	
-	
-	const emits = defineEmits(['change'])
-	
-	const money = computed(() => {
-		if (data.hetong.baochou && data.hetong.fuwufeiRate) {
-			data.hetong.fuwufei = data.hetong.baochou * data.hetong.fuwufeiRate;
-			return data.hetong.baochou * data.hetong.fuwufeiRate
-		} else {
-			data.hetong.fuwufei = 0;
-			return 0
-		}
-	})
-	
-	
-	function handleChange() {
-		emits('change')
-	}
-</script>
-
-<style>
-</style>

+ 0 - 46
pages/admin/Hetong/components/fuWuBaoChou.vue

@@ -1,46 +0,0 @@
-<template>
-	<uni-collapse class="fwnr-collapse-box collapse-border-box"  @change="handleChange">
-		<uni-collapse-item title="服务报酬" :open="true">
-			<view class="form-label-input">
-				<view class="phone-form-label"><text class="form-label-require"></text>乙方基本月报酬(元)</view>
-				<uni-easyinput v-model="data.hetong.baochou" placeholder="请输入金额" />
-			</view>
-			<view class="form-label-input">
-				<view class="phone-form-label"><text class="form-label-require"></text>基本日报酬(基本月报酬÷工作天数)</view>
-				<uni-easyinput v-model="data.hetong.tianshu" placeholder="天数" />
-			</view>
-			<view class="form-label-input">
-				<view class="phone-form-label"><text class="form-label-require"></text>乙方每月休息(天)</view>
-				<uni-easyinput v-model="data.hetong.xiuxi" placeholder="请输入休息天数" />
-			</view>
-			<view class="form-label-input">
-				<view class="phone-form-label"><text class="form-label-require"></text>加班费(日报酬x倍数)</view>
-				<view >2倍</view>
-			</view>
-			<view class="form-label-input">
-				<view class="phone-form-label"><text class="form-label-require"></text>每月工资发放日</view>
-				<uni-easyinput v-model="data.hetong.fafangri" placeholder="请输入每月发放日" />
-			</view>
-		</uni-collapse-item>
-	</uni-collapse>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-	
-	const {
-		injectHetong
-	} = useHetong();
-	
-	const data = injectHetong();
-	const emits = defineEmits(['change'])
-	function handleChange() {
-		emits('change')
-	}
-</script>
-
-
-<style>
-</style>

+ 0 - 60
pages/admin/Hetong/components/fuWuNeiRong.vue

@@ -1,60 +0,0 @@
-<template>
-	<uni-collapse ref="collapse" class="fwnr-collapse-box" @change="handleChange">
-		<uni-collapse-item title="服务内容" :open="true">
-			<!-- 一般家务 -->
-			<jiawuItemVue></jiawuItemVue>
-			
-			<!-- 辅助照顾小孩 -->
-			<fuzhuXiaohai @change="onChange"></fuzhuXiaohai>
-			
-			<!-- 全职照顾小孩 -->
-			<quanzhiXiaohai @change="onChange"></quanzhiXiaohai>
-			
-			<!-- 照顾老人 -->
-			<zhaoguLaoren @change="onChange"></zhaoguLaoren>
-			
-			<!-- 照顾病人 -->
-			<zhaoguBingren></zhaoguBingren>
-			
-			<!-- 孕妇 -->
-			<zhaoguYunfu></zhaoguYunfu>
-			
-			<!-- 其他服务内容 -->
-			<qitaFuwu></qitaFuwu>
-			
-		</uni-collapse-item>
-	</uni-collapse>
-</template>
-
-<script setup>
-	import jiawuItemVue from './jiawuItem.vue';
-	import fuzhuXiaohai from './fuzhuXiaohai.vue';
-	import quanzhiXiaohai from "./quanzhiXiaohai.vue";
-	import zhaoguLaoren from "./zhaoguLaoren.vue";
-	import zhaoguBingren from "./zhaoguBingren.vue";
-	import zhaoguYunfu from "./zhaoguYunfu.vue";
-	import qitaFuwu from "./qitaFuwu.vue"
-	
-	
-	import {ref} from "vue"
-
-	const emits = defineEmits(['change'])
-
-	const collapse= ref(null)
-
-
-	function handleChange() {
-		emits('change')
-	}
-
-	function onChange() {
-		setTimeout(() => {
-			collapse.value && collapse.value.resize();
-			emits('change')
-		}, 300)
-	}
-</script>
-
-
-<style>
-</style>

+ 0 - 82
pages/admin/Hetong/components/fuWuShiJian.vue

@@ -1,82 +0,0 @@
-<template>
-	<uni-collapse class="fwnr-collapse-box collapse-border-box" @change="handleChange">
-		<uni-collapse-item title="服务时间" :open="true">
-			<view class="form-label-select">
-				<view class="phone-form-label"><text class="form-label-require"></text>三方合同服务期限(开始)</view>
-				<picker mode='date' :value="data.hetong.jiabingStartDate" @change="onDateStartSelect"
-					class="form-radio-select">
-					<view class="data-select-box">
-						<view>{{data.hetong.jiabingStartDate}}</view>
-						<icon></icon>
-					</view>
-				</picker>
-			</view>
-			<view class="form-label-select">
-				<view class="phone-form-label"><text class="form-label-require"></text>三方合同服务期限(结束)</view>
-				<picker mode='date' :value="data.hetong.jiabingEndDate" @change="onDateEndSelect"
-					class="form-radio-select">
-					<view class="data-select-box">
-						<view>{{data.hetong.jiabingEndDate}}</view>
-						<icon></icon>
-					</view>
-				</picker>
-			</view>
-			<view class="form-label-select" v-if="false">
-				<view class="phone-form-label"><text class="form-label-require"></text>甲乙双方服务期限(开始)</view>
-				<picker mode='date' :value="data.hetong.jiayiStartDate" @change="onDateStartSelect2"
-					class="form-radio-select">
-					<view class="data-select-box">
-						<view>{{data.hetong.jiayiStartDate}}</view>
-						<icon></icon>
-					</view>
-				</picker>
-			</view>
-			<view class="form-label-select" v-if="false">
-				<view class="phone-form-label"><text class="form-label-require"></text>甲乙双方服务期限(结束)</view>
-				<picker mode='date' :value="data.hetong.jiayiEndDate" @change="onDateEndSelect2"
-					class="form-radio-select">
-					<view class="data-select-box">
-						<view>{{data.hetong.jiayiEndDate}}</view>
-						<icon></icon>
-					</view>
-				</picker>
-			</view>
-		</uni-collapse-item>
-	</uni-collapse>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-
-	const {
-		injectHetong
-	} = useHetong();
-	const data = injectHetong();
-
-	const emits = defineEmits(['change'])
-
-	function handleChange() {
-		emits('change')
-	}
-
-	function onDateStartSelect(e) {
-		console.log('cccc', e)
-		data.hetong.jiabingStartDate = e.detail.value
-	}
-
-	function onDateEndSelect(e) {
-		data.hetong.jiabingEndDate = e.detail.value
-	}
-
-	function onDateStartSelect2(e) {
-		data.hetong.jiayiStartDate = e.detail.value
-	}
-
-	function onDateEndSelect2(e) {
-		data.hetong.jiayiEndDate = e.detail.value
-	}
-</script>
-<style>
-</style>

+ 0 - 39
pages/admin/Hetong/components/fuzhuXiaohai.vue

@@ -1,39 +0,0 @@
-<template>
-	<view class="fwnr-item-box">
-		<view class="title-row-box">
-			<text>辅助照顾小孩:</text>
-			<view class="title-del-btn">
-				<icon class="del-icon" v-show="false"></icon>
-			</view>
-		</view>
-		<view class="fwnr-label-input">
-			<view class="fwnr-form-label"><text class="form-label-require"></text>孩子人数</view>
-			<uni-easyinput v-model="data.hetong.fzHaizi" placeholder="请输入照顾几个孩子" />
-		</view>
-		<haiziNianlingVue2 @change="onChange"></haiziNianlingVue2>
-	</view>
-</template>
-
-<script setup>
-	import haiziNianlingVue2 from './haiziNianling2.vue';
-
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-
-	const emits = defineEmits(['change'])
-
-
-	const data = injectHetong()
-
-	function onChange() {
-		emits('change')
-	}
-</script>
-
-
-<style>
-</style>

+ 0 - 69
pages/admin/Hetong/components/haiziNianling.vue

@@ -1,69 +0,0 @@
-<template>
-	<view v-for="(item,index) in myData.children" :key="item.timer" class="fwnr-label-input">
-		<view class="fwnr-form-label"><text class="form-label-require"></text><template v-if="index == 0">孩子年龄</template></view>
-		<uni-easyinput v-model="item.age" placeholder="请输入孩子年龄(月数)" @change="onChange" />
-		<view @click="handleAdd" v-if="myData.children.length == 1" class="fwnr-add-btn"><icon></icon></view>
-		<view @click="handleAdd" class="fwnr-add-btn"
-			v-else-if="myData.children.length-1 == index && myData.children.length != 1 && myData.children.length<3">
-			<icon></icon>
-		</view>
-		<view @click="handleDelete(item.timer)" v-else class="fwnr-del-btn"><icon></icon></view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		computed,
-		reactive,
-		watch,
-		watchEffect
-	} from "vue"
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-
-	const data = injectHetong()
-
-	const emits = defineEmits(['change'])
-
-	const myData = reactive({
-		children: []
-	})
-
-	watchEffect(() => {
-		const list = data.hetong.qzHzNianliang && data.hetong.qzHzNianliang.split(',').map((item,index) => ({
-			age: item,
-			timer: new Date().getTime()+index
-		}));
-		myData.children = list.length ? list : [{
-			age: '',
-			timer: new Date().getTime()
-		}]
-	})
-
-	function onChange() {
-		data.hetong.qzHzNianliang = myData.children.map(item => item.age).join(',')
-	}
-
-	function handleAdd() {
-		myData.children.push({
-			age: '',
-			timer: new Date().getTime()
-		});
-		data.hetong.qzHzNianliang = myData.children.map(item => item.age).join(',')
-		emits('change')
-	}
-
-	function handleDelete(timer) {
-		console.log('timer', timer)
-		myData.children = myData.children.filter(item => item.timer != timer)
-		data.hetong.qzHzNianliang = myData.children.map(item => item.age).join(',')
-		emits('change')
-	}
-</script>
-
-<style>
-</style>

+ 0 - 69
pages/admin/Hetong/components/haiziNianling2.vue

@@ -1,69 +0,0 @@
-<template>
-	<view v-for="(item,index) in myData.children" :key="item.timer" class="fwnr-label-input">
-		<view class="fwnr-form-label"><text class="form-label-require"></text><template v-if="index == 0">孩子年龄</template></view>
-		<uni-easyinput v-model="item.age" placeholder="请输入孩子年龄" @change="onChange" />
-		<view @click="handleAdd" v-if="myData.children.length == 1" class="fwnr-add-btn"><icon></icon></view>
-		<view @click="handleAdd" class="fwnr-add-btn"
-			v-else-if="myData.children.length-1 == index && myData.children.length != 1 && myData.children.length">
-			<icon></icon>
-		</view>
-		<view @click="handleDelete(item.timer)" v-else class="fwnr-del-btn"><icon></icon></view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		computed,
-		reactive,
-		watch,
-		watchEffect
-	} from "vue"
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-
-	const data = injectHetong()
-
-	const emits = defineEmits(['change'])
-
-	const myData = reactive({
-		children: []
-	})
-
-	watchEffect(() => {
-		const list = data.hetong.fzHzNianling && data.hetong.fzHzNianling.split(',').map((item,index) => ({
-			age: item,
-			timer: new Date().getTime()+index
-		}));
-		myData.children = list.length ? list : [{
-			age: '',
-			timer: new Date().getTime()
-		}]
-	})
-
-	function onChange() {
-		data.hetong.fzHzNianling = myData.children.map(item => item.age).join(',')
-	}
-
-	function handleAdd() {
-		myData.children.push({
-			age: '',
-			timer: new Date().getTime()
-		});
-		data.hetong.fzHzNianling = myData.children.map(item => item.age).join(',')
-		emits('change')
-	}
-
-	function handleDelete(timer) {
-		console.log('timer', timer)
-		myData.children = myData.children.filter(item => item.timer != timer)
-		data.hetong.fzHzNianling = myData.children.map(item => item.age).join(',')
-		emits('change')
-	}
-</script>
-
-<style>
-</style>

+ 0 - 124
pages/admin/Hetong/components/hetongCard.vue

@@ -1,124 +0,0 @@
-<template>
-	<uni-collapse ref="collapse" class="sfht-collapse-box" @change="onChange">
-		<uni-collapse-item title="合同信息" :open="true">
-			<!-- 服务类型 -->
-			<view class="form-label-select">
-				<view class="phone-form-label"><text class="form-label-require"></text>服务类型</view>
-				<picker :range="leixings" mode='selector' :value="data.hetong.leixing-1" range-key="text"
-					@change="onSelectLeixing" class="select-picker-box">
-					<view class="form-radio-select">
-						<view v-if="leixings[data.hetong.leixing-1]">{{leixings[data.hetong.leixing-1].text}}</view>
-						<icon></icon>
-					</view>
-				</picker>
-			</view>
-			
-			<view class="form-label-input" v-if="data.hetong.leixing == 4">
-				<view class="phone-form-label"><text class="form-label-require"></text>其他类型</view>
-				<uni-easyinput v-model="data.hetong.lxName" placeholder="请输入其他类型" />
-			</view>
-			<!-- 服务方式 -->
-			<view class="form-label-select">
-				<view class="phone-form-label"><text class="form-label-require"></text>服务方式</view>
-				<picker :range="fuwus" mode='selector' :value="data.hetong.fangshi-1" range-key="text"
-					@change="onSelectFuwufangshi" class="select-picker-box">
-					<view class="form-radio-select">
-						<view v-if="fuwus[data.hetong.fangshi-1]">{{fuwus[data.hetong.fangshi-1].text}}</view>
-						<icon></icon>
-					</view>
-				</picker>
-			</view>
-			<view class="form-label-input" v-if="data.hetong.fangshi == 2">
-				<view class="phone-form-label"><text class="form-label-require"></text>服务时间</view>
-				<uni-easyinput v-model="data.hetong.fsShijian" placeholder="请输入非住家型服务时间" />
-			</view>
-			<!-- 服务地址 -->
-			<view class="form-label-input">
-				<view class="phone-form-label"><text class="form-label-require"></text>服务地址</view>
-				<uni-easyinput v-model="data.hetong.dizhi" placeholder="请输入服务地址" />
-			</view>
-			<!-- 服务内容 -->
-			<fuWuNeiRong @change="onChange"></fuWuNeiRong>
-			<!-- 服务报酬 -->
-			<fuWuBaoChou @change="onChange"></fuWuBaoChou>
-			<!-- 服务时间 -->
-			<fuWuShiJian @change="onChange"></fuWuShiJian>
-			<!-- 丙方服务费 -->
-			<bingFuWuFei @change="onChange"></bingFuWuFei>
-		</uni-collapse-item>
-	</uni-collapse>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import fuWuNeiRong from "./fuWuNeiRong.vue"
-	import fuWuBaoChou from "./fuWuBaoChou.vue"
-	import fuWuShiJian from "./fuWuShiJian.vue"
-	import bingFuWuFei from "./bingFuWuFei.vue"
-	import {
-		useHetong
-	} from "../useHetong.js"
-
-	const {
-		injectHetong
-	} = useHetong();
-
-	const data = injectHetong()
-
-	const collapse = ref(null)
-	const leixings = [{
-			value: 1,
-			text: '普通家务保姆'
-		},
-		{
-			value: 2,
-			text: '钟点工保姆'
-		},
-		{
-			value: 3,
-			text: '育儿嫂'
-		},
-		{
-			value: 4,
-			text: '其他'
-		}
-	]
-
-	const fuwus = [{
-			value: 1,
-			text: '住家型'
-		},
-		{
-			value: 2,
-			text: '非住家型(服务时间)'
-		},
-	]
-
-	setTimeout(() => {
-		collapse.value && collapse.value.resize()
-	}, 300)
-
-	function onChange() {
-		setTimeout(() => {
-			collapse.value && collapse.value.resize()
-		}, 300)
-	}
-
-	function onSelectLeixing(e) {
-		data.hetong.leixing = e.detail.value + 1
-	}
-
-	function onSelectFuwufangshi(e) {
-		data.hetong.fangshi = e.detail.value + 1;
-		if (data.hetong.fangshi != 2) {
-			data.hetong.fsShijian = ''
-		}
-	}
-</script>
-
-<style>
-</style>

+ 0 - 32
pages/admin/Hetong/components/jiawuItem.vue

@@ -1,32 +0,0 @@
-<template>
-	<view class="fwnr-item-box">
-		<view class="title-row-box">
-			<text>一般家务:</text> 
-			 <view class="title-del-btn">
-				 <icon class="del-icon" v-show="false"></icon>
-			 </view>
-		</view>
-		<view class="fwnr-label-input">
-			<view class="fwnr-form-label"><text class="form-label-require"></text>住房面积</view>
-			<uni-easyinput v-model="data.hetong.mianji" placeholder="请输入住房面积" />
-		</view>
-		<view class="fwnr-label-input">
-			<view class="fwnr-form-label"><text class="form-label-require"></text>常驻人口</view>
-			<uni-easyinput v-model="data.hetong.renkou" placeholder="请输入常驻人口" />
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-	
-	const data = injectHetong()
-</script>
-
-<style>
-</style>

+ 0 - 45
pages/admin/Hetong/components/jiazhengCard.vue

@@ -1,45 +0,0 @@
-<template>
-	<view class="sfht-mt24">
-		<!-- 合同模板 -->
-		<view class="form-label-select form-radius-box">
-			<view class="phone-form-label"><text class="form-label-require">*</text>家政人员</view>
-			<view class="form-radio-select" @click="handleSelect">
-				<view v-show="!!data.hetong.realName">{{data.hetong.realName}}</view>
-				<icon></icon>
-			</view>
-		</view>
-	</view>
-	<!-- 家政 -->
-	<selectJz ref="jzRef" @select="onJzSelect"></selectJz>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import selectJz from "./selectJz.vue"
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-	
-	const data = injectHetong()
-	
-	const jzRef = ref(null);
-	
-	function handleSelect() {
-		jzRef.value.handleShow()
-	}
-	
-	function onJzSelect(da) {
-		data.hetong.realName = da.realName;
-		data.hetong.userId = da.userId;
-	}
-</script>
-
-<style>
-</style>

+ 0 - 64
pages/admin/Hetong/components/kehuCard.vue

@@ -1,64 +0,0 @@
-<template>
-	<uni-collapse class="sfht-collapse-box">
-		<uni-collapse-item title="客户信息" :open="true">
-			<view class="sfht-add-row">
-				<view class="sfht-title-add-btn" @click="handleSelct">客户选择<icon></icon>
-				</view>
-			</view>
-			<view class="form-label-input form-label-disabled">
-				<view class="phone-form-label"><text class="form-label-require">*</text>姓名</view>
-				<view>{{data.hetong.khName}}</view>
-			</view>
-			<view class="form-label-input form-label-disabled">
-				<view class="phone-form-label"><text class="form-label-require">*</text>电话</view>
-				<view>{{data.hetong.khUserName}}</view>
-			</view>
-			<view class="form-label-input">
-				<view class="phone-form-label"><text class="form-label-require">*</text>证件号</view>
-				<uni-easyinput v-model="data.hetong.khIdcard" placeholder="请输入证件号" />
-			</view>
-			<view class="form-label-input" v-if="false">
-				<view class="phone-form-label"><text class="form-label-require"></text>具体地址</view>
-				<uni-easyinput v-model="data.hetong.jutidizhi" placeholder="请输入具体地址" />
-			</view>
-		</uni-collapse-item>
-	</uni-collapse>
-
-	<!-- 客户 -->
-	<selectKh ref="khRef" @select="onKhSelect"></selectKh>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import selectKh from "./selectKh.vue"
-	import {
-		useHetong
-	} from "../useHetong.js"
-
-	const {
-		injectHetong
-	} = useHetong();
-
-	const data = injectHetong()
-
-	const khRef = ref(null)
-
-	function handleSelct() {
-		khRef.value.handleShow();
-	}
-
-	function onKhSelect(da) {
-		data.hetong.khId = da.userId;
-		data.hetong.khIdcard = da.idcard;
-		data.hetong.khName = da.realName;
-		data.hetong.khUserName = da.userName;
-		data.hetong.jutidizhi = da.jutidizhi;
-	}
-</script>
-
-<style>
-</style>

+ 0 - 69
pages/admin/Hetong/components/laorenNianling.vue

@@ -1,69 +0,0 @@
-<template>
-	<view v-for="(item,index) in myData.children" :key="item.timer" class="fwnr-label-input">
-		<view class="fwnr-form-label"><text class="form-label-require"></text><template v-if="index == 0">老人年龄</template></view>
-		<uni-easyinput v-model="item.age" placeholder="请输入老人年龄" @change="onChange" />
-		<view @click="handleAdd" v-if="myData.children.length == 1" class="fwnr-add-btn"><icon></icon></view>
-		<view @click="handleAdd" class="fwnr-add-btn"
-			v-else-if="myData.children.length-1 == index && myData.children.length != 1 && myData.children.length<3">
-				<icon></icon>
-		</view>
-		<view @click="handleDelete(item.timer)" v-else class="fwnr-del-btn"><icon></icon></view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		computed,
-		reactive,
-		watch,
-		watchEffect
-	} from "vue"
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-
-	const data = injectHetong()
-
-	const emits = defineEmits(['change'])
-
-	const myData = reactive({
-		children: []
-	})
-
-	watchEffect(() => {
-		const list = data.hetong.lrnianling && data.hetong.lrnianling.split(',').map((item,index) => ({
-			age: item,
-			timer: new Date().getTime()+index
-		}));
-		myData.children = list.length ? list : [{
-			age: '',
-			timer: new Date().getTime()
-		}]
-	})
-
-	function onChange() {
-		data.hetong.lrnianling = myData.children.map(item => item.age).join(',')
-	}
-
-	function handleAdd() {
-		myData.children.push({
-			age: '',
-			timer: new Date().getTime()
-		});
-		data.hetong.lrnianling = myData.children.map(item => item.age).join(',')
-		emits('change')
-	}
-
-	function handleDelete(timer) {
-		console.log('timer', timer)
-		myData.children = myData.children.filter(item => item.timer != timer)
-		data.hetong.lrnianling = myData.children.map(item => item.age).join(',')
-		emits('change')
-	}
-</script>
-
-<style>
-</style>

+ 0 - 32
pages/admin/Hetong/components/qiTaYueDing.vue

@@ -1,32 +0,0 @@
-<template>
-	<uni-collapse class="sfht-collapse-box">
-		<uni-collapse-item title="其他约定" :open="true">
-			<view class="form-label-input flex-start-row">
-				<view class="phone-form-label"><text class="form-label-require"></text>备注</view>
-				<textarea v-model="data.hetong.beizhu"  placeholder="请填写备注" class="form-textarea-box" @input="onInputChange"/>
-			</view>
-		</uni-collapse-item>
-	</uni-collapse>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-	const data = injectHetong()
-
-	function onInputChange(e) {
-		data.hetong.beizhu = e.detail.value
-	}
-</script>
-
-<style>
-</style>

+ 0 - 76
pages/admin/Hetong/components/qianMing.vue

@@ -1,76 +0,0 @@
-<template>
-	<view>
-		<!-- 合同模板 -->
-		<view class="sfht-mt24">
-			<view class="form-label-select form-radius-box">
-				<view class="phone-form-label"><text class="form-label-require"></text>签名</view>
-				<view class="form-radio-select" @click="handleQianming">
-					<view>{{!!data.hetong.qianmingBase64? '已签名': ''}}</view>
-					<icon></icon>
-				</view>
-			</view>
-		</view>
-		<uni-popup ref="popupRef" type="bottom" background-color="#fff" :is-mask-click="false" :mask-click="false">
-			<view class="ht-qm-popup">
-				<view class="icon-title-navBar-box">
-					<view @click="goback2" class="nav-bar-icon"></view>
-					<text class="nav-bar-title">签名</text>
-				</view>
-				<writeSign @getBase64="getBase64"></writeSign>
-			</view>
-		</uni-popup>
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import writeSign from "@/components/writeSign/index.vue"
-	import {
-		throttleAdvanced
-	} from "@/utils/common.js"
-	import {
-		base64ToPath
-	} from "image-tools";
-	import {
-		useHetong
-	} from "../useHetong.js"
-
-	const {
-		injectHetong
-	} = useHetong();
-	const data = injectHetong()
-
-
-
-	const popupRef = ref(null)
-
-	const handleQM = throttleAdvanced((img) => {
-		data.hetong.qianmingBase64 = img.replace(/^data:image\/\w+;base64,/, '')
-		goback2();
-	})
-
-	function handleQianming() {
-		popupRef.value.open()
-	}
-
-	function goback2() {
-		popupRef.value.close()
-	}
-
-	function getBase64(img) {
-		if (!img) {
-			uni.showToast({
-				title: '签名异常'
-			})
-			return;
-		}
-		handleQM(img)
-	}
-</script>
-
-<style>
-</style>

+ 0 - 27
pages/admin/Hetong/components/qitaFuwu.vue

@@ -1,27 +0,0 @@
-<template>
-	<view class="fwnr-item-box">
-		<view class="title-row-box">
-			<text>其他服务内容</text> 
-			 <view class="title-del-btn">
-				 <icon class="del-icon" v-show="false"></icon>
-			 </view>
-		</view>
-		<view class="fwnr-label-input">
-			<uni-easyinput v-model="data.hetong.qita" placeholder="请输入其他服务内容" />
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-	
-	const data = injectHetong()
-</script>
-
-<style>
-</style>

+ 0 - 39
pages/admin/Hetong/components/quanzhiXiaohai.vue

@@ -1,39 +0,0 @@
-<template>
-	<view class="fwnr-item-box">
-		<view class="title-row-box">
-			<text>全职照顾小孩:</text>
-			<view class="title-del-btn">
-				<icon class="del-icon" v-show="false"></icon>
-			</view>
-		</view>
-		<view class="fwnr-label-input">
-			<view class="fwnr-form-label"><text class="form-label-require"></text>孩子人数</view>
-			<uni-easyinput v-model="data.hetong.qzHaizi" placeholder="请输入照顾几个孩子" />
-		</view>
-		<haiziNianlingVue @change="onChange"></haiziNianlingVue>
-	</view>
-</template>
-
-<script setup>
-	import haiziNianlingVue from './haiziNianling.vue';
-
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-
-	const emits = defineEmits(['change'])
-
-
-	const data = injectHetong()
-
-	function onChange() {
-		emits('change')
-	}
-</script>
-
-
-<style>
-</style>

+ 0 - 139
pages/admin/Hetong/components/search.vue

@@ -1,139 +0,0 @@
-<template>
-	<uni-popup ref="searchPopup" type="top" :animation="false" :is-mask-click="true"
-		mask-background-color="rgba(0, 0, 0, 0.4)">
-		<view class="select-search-row">
-			<view class="select-search-body">
-				<view class="select-jt-box" @click="toggleMenu">
-					<view class="selected-item">{{ selectedOption.label }}</view>
-					<view class="arrow" :class="{ 'arrow-up': isMenuOpen, 'arrow-down': !isMenuOpen }"></view>
-				</view>
-				<view class="select-list-box" v-if="isMenuOpen">
-					<view v-for="(option, index) in options" :key="option.value" class="menu-item"
-						@click="selectOption(option)">
-						{{ option.label }}
-					</view>
-				</view>
-				<input type="text" class="search-input" v-model="searchInput" :placeholder="searchPlaceholder" />
-				<view class="search-icon" @click="handleSearch">
-					<uni-icons type="search" size="24" color="#fff"></uni-icons>
-				</view>
-			</view>
-		</view>
-		<view class="search-clear-box" v-if="searchInput" @click="searchReset">
-			<icon></icon>
-			<text>清空搜索</text>
-		</view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import {
-		ref,
-		computed
-	} from 'vue';
-	const $emit = defineEmits(['search-btn', 'reset-search'])
-	const searchPopup = ref(null); // 索引
-
-	const props = defineProps({
-		shenfen: {
-			type: String,
-		}
-	})
-
-	let arr = computed(() => {
-		if (props.shenfen == 'kh') {
-			return [{
-				label: '客户名',
-				value: 2
-			}, ]
-		} else if (props.shenfen == 'jz') {
-			return [{
-				label: '阿姨名',
-				value: 3
-			}]
-		} else {
-			return [{
-					label: '客户名',
-					value: 2
-				},
-				{
-					label: '阿姨名',
-					value: 3
-				}
-			]
-		}
-	})
-
-	let txt = computed(() => {
-		if (props.shenfen == 'kh') {
-			return '请输入客户名'
-		} else if (props.shenfen == 'jz') {
-			return '请输入家政阿姨名'
-		} else {
-			return '请输入客户名'
-		}
-	})
-
-
-	const options = ref(arr);
-	const searchPlaceholder = ref(txt);
-	const searchInput = ref('');
-	// 存储当前选中的选项对象
-	const selectedOption = ref(options.value[0]);
-
-	// 存储菜单是否打开的状态
-	const isMenuOpen = ref(false);
-
-	// 切换菜单打开/关闭状态的函数
-	const toggleMenu = () => {
-		isMenuOpen.value = !isMenuOpen.value;
-
-	};
-
-	// 选择选项的函数
-	const selectOption = (option) => {
-		selectedOption.value = option;
-		searchInput.value = '';
-		isMenuOpen.value = false; // 选择后关闭菜单
-		if (option.value == 2) {
-			searchPlaceholder.value = '请输入客户名'
-		} else {
-			searchPlaceholder.value = '请输入家政阿姨名'
-		}
-	};
-
-	// 打开弹窗
-	function handleShow() {
-		searchPopup.value.open();
-	}
-	// 取消
-	function handleClose() {
-		searchInput.value = '';
-		searchPopup.value.close();
-	}
-	// 确认
-	function handleSearch() {
-		let searchKey = '';
-		searchKey = selectedOption.value.value;
-		// 搜索 key和 data
-		$emit('search-btn', searchKey, searchInput);
-		searchPopup.value.close();
-	}
-
-	// 清空搜索
-	function searchReset() {
-		searchInput.value = '';
-		$emit('reset-search');
-	}
-	
-	function handleSetValue(value) {
-		searchInput.value = value
-	}
-
-
-	defineExpose({
-		handleShow,
-		handleClose,
-		handleSetValue
-	})
-</script>

+ 0 - 195
pages/admin/Hetong/components/selectJz.vue

@@ -1,195 +0,0 @@
-<template>
-	<uni-popup ref="popupRef" type="bottom" background-color="#fff" :is-mask-click="false" :mask-click="false">
-		<view class="jz-select-list">
-			<view class="phone-navBar-box">
-				<view @click="goback2" class="nav-bar-icon"></view>
-				<text class="nav-bar-title">选择家政阿姨</text>
-				<uni-icons class="nav-bar-right-icon bar-ml10" type="search" size="20"
-					@click="toggle('top')"></uni-icons>
-			</view>
-			<view>
-				<search-dialog ref="searchDialogRef" shenfen="jz" @search-btn="dialogSearchBtn"
-					@reset-search="dialogSearchReset"></search-dialog>
-			</view>
-			<!-- 无限滚动容器 -->
-				<scroll-view scroll-y="true" refresher-enabled="true" :refresher-triggered="data.loading"
-					:refresher-threshold="50" @scrolltolower="onScrolltolower" refresher-background="transparent"
-					@refresherrefresh="onRefresh" class="jz-scroll-view">
-					<uni-list class="jz-scroll-view">
-						<radio-group @change="radioChange">
-							<uni-list-item v-for="item in data.list" class="jz-list-item-box">
-								<template v-slot:body>
-									<view class="jz-select-card">
-										<radio :value="item.id && item.id.toString()" activeBackgroundColor="#3fd2a1"
-										:checked="item.id == data.activeData" />
-										<view class="card-body-row">
-											<view class="card-img-box">
-												<img :src="item.icon" v-if="item.icon">
-												<icon class="phone-default-userImg" v-else></icon>
-											</view>
-											<view class="body-content-row">
-												<view class="head-name">{{item.realName}}</view>
-												<view class="content-text-row">
-													<view> {{item.age}}岁<text v-if="item.jingyan"> | {{item.jingyan}}经验</text>
-													</view>
-													<view class="text-status">{{item.zhuangtai}}</view>
-												</view>
-												<view class="content-text-row">
-													{{item.jiguanShengName === item.jiguanShiName ? item.jiguanShengName  : `${item.jiguanShengName} ${item.jiguanShiName}`}}人
-												</view>
-											</view>
-										</view>
-									</view>
-								</template>
-							</uni-list-item>
-						</radio-group>
-						<uni-load-more :status="data.state" @click="getMore(0)"
-							:contentText="data.contentText"></uni-load-more>
-					</uni-list>
-				</scroll-view>
-
-			<view class="select-jz-btn-box">
-				<button @click="handleSelect" type="default" class="phone-green-btn">选择此家政阿姨</button>
-			</view>
-
-		</view>
-	</uni-popup>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import {
-		onLoad
-	} from "@dcloudio/uni-app";
-	import * as httpApi from "@/api/sanfang.js"
-	import {
-		getJiazhengList
-	} from "@/api/jiazheng.js"
-	import searchDialog from "./search.vue";
-
-
-	const emits = defineEmits(['select'])
-
-	function goback2() {
-		popupRef.value.close();
-	}
-	const searchDialogRef = ref(null);
-	const popupRef = ref(null)
-	const data = reactive({
-		status: 0,
-		statusText: '待签字',
-		state: 'more',
-		list: [], // 考试列表
-		loading: false,
-		realName: '',
-		page: 0,
-		size: 10,
-		activeData: null
-	})
-
-	function toggle() {
-		searchDialogRef.value.handleShow();
-	}
-
-	function dialogSearchBtn(opt, searchInput) {
-		data.realName = searchInput
-		onRefresh()
-	}
-
-	function dialogSearchReset() {
-		data.realName = '';
-	}
-
-	function onScrolltolower() {
-		getMore()
-	}
-
-	function onRefresh() {
-		if (data.loading) return;
-		data.page = 0;
-		data.list = [];
-		data.loading = true;
-		refreshData();
-	}
-
-	function refreshData() {
-		const opt = {
-			realName: data.realName,
-			page: data.page,
-			size: data.size,
-			status: data.status
-		}
-		data.list = [];
-		// 数学
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-
-		getJiazhengList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-			} else {
-				data.state = 'no-more';
-			}
-		}).catch(err => {
-			data.state = 'more';
-		}).finally(() => {
-			data.loading = false;
-		})
-	}
-
-	function getMore() {
-		const opt = {
-			realName: data.realName,
-			page: data.page,
-			size: data.size,
-			status: data.status
-		}
-		if (data.state == 'no-more') return;
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-		getJiazhengList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-			} else {
-				data.state = 'no-more';
-			}
-		}).catch(err => {
-			data.state = 'more';
-		}).finally(() => {
-			data.loading = false;
-		})
-	}
-
-	function radioChange(opt) {
-		data.activeData = data.list.find(item => item.id == opt.detail.value)
-	}
-
-	function handleSelect() {
-		emits('select', data.activeData)
-		popupRef.value.close();
-	}
-
-	function handleShow() {
-		data.realName = '';
-		popupRef.value.open();
-		onRefresh();
-	}
-
-	defineExpose({
-		handleShow
-	})
-</script>
-
-<style>
-</style>

+ 0 - 200
pages/admin/Hetong/components/selectKh.vue

@@ -1,200 +0,0 @@
-<template>
-	<view>
-		<uni-popup ref="popupRef" type="bottom" background-color="#fff" :is-mask-click="false" :mask-click="false">
-			<view class="kehu-select-list">
-				<view class="phone-navBar-box">
-					<view @click="goback2" class="nav-bar-icon"></view>
-					<text>选择客户</text>
-					<uni-icons class="nav-bar-right-icon bar-ml10" type="search" size="20"
-						@click="toggle('top')"></uni-icons>
-				</view>
-				<view>
-					<search-dialog ref="searchDialogRef" shenfen="kh" @search-btn="dialogSearchBtn"
-						@reset-search="dialogSearchReset"></search-dialog>
-				</view>
-		
-				<view class="list-new-btn-box">
-					<button type="default" class="phone-green-btn" @click="handleAddKehu">新增客户</button>
-				</view>
-		
-				<!-- 无限滚动容器 -->
-				<scroll-view scroll-y="true" refresher-enabled="true" :refresher-triggered="data.loading"
-					:refresher-threshold="50" @scrolltolower="onScrolltolower" refresher-background="transparent"
-					@refresherrefresh="onRefresh">
-					<uni-list class="kh-scroll-view">
-						<radio-group @change="radioChange">
-							<uni-list-item v-for="item in data.list" class="kh-list-item-box">
-								<template v-slot:body>
-									<view class="kh-select-card">
-										<radio :value="item.id && item.id.toString()" activeBackgroundColor="#3fd2a1"
-										:checked="item.id == data.activeData&&data.activeData.id" />
-										<view class="select-card-body-row">
-											<view class="body-row"><icon class="user-icon"></icon>{{item.realName}}</view>
-											<view class="body-row"><icon class="tel-icon"></icon>{{item.userName}}</view>
-											<view class="body-row" v-if="item.idcard"><icon class="idcard-icon"></icon>{{item.idcard}}</view>
-										</view>
-									</view>
-								</template>
-							</uni-list-item>
-						</radio-group>
-						<uni-load-more :status="data.state" @click="getMore(0)"
-							:contentText="data.contentText"></uni-load-more>
-					</uni-list>
-				</scroll-view>
-				<view class="select-kh-btn-box">
-					<button @click="handleSelect" type="default" class="phone-green-btn">选择此客户</button>
-				</view>
-			</view>
-		</uni-popup>
-		
-		<addKh ref="addKhRef" @success="onSuccess"></addKh>
-	</view>
-
-
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import {
-		onLoad
-	} from "@dcloudio/uni-app";
-	import * as httpApi from "@/api/sanfang.js"
-	import searchDialog from "./search.vue";
-	import addKh from "./addKh"
-
-	const emits = defineEmits(['select'])
-
-	function goback2() {
-		popupRef.value.close();
-	}
-
-	const addKhRef = ref(null)
-	const searchDialogRef = ref(null);
-	const popupRef = ref(null)
-	const data = reactive({
-		status: 0,
-		statusText: '待签字',
-		state: 'more',
-		list: [], // 考试列表
-		loading: false,
-		realName: '',
-		page: 0,
-		size: 10,
-		activeData: null
-	})
-	
-	function onSuccess() {
-		onRefresh()
-	}
-
-	function toggle() {
-		searchDialogRef.value.handleShow();
-	}
-
-	function dialogSearchBtn(opt, searchInput) {
-		data.realName = searchInput
-		onRefresh()
-	}
-
-	function dialogSearchReset() {
-		data.realName = '';
-	}
-
-	function onScrolltolower() {
-		getMore()
-	}
-
-	function onRefresh() {
-		if (data.loading) return;
-		data.page = 0;
-		data.list = [];
-		data.loading = true;
-		refreshData();
-	}
-
-	function refreshData() {
-		const opt = {
-			realName: data.realName,
-			page: data.page,
-			size: data.size,
-			status: data.status
-		}
-		data.list = [];
-		// 数学
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-
-		httpApi.getKehuList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-			} else {
-				data.state = 'no-more';
-			}
-		}).catch(err => {
-			data.state = 'more';
-		}).finally(() => {
-			data.loading = false;
-		})
-	}
-
-	function getMore() {
-		const opt = {
-			realName: data.realName,
-			page: data.page,
-			size: data.size,
-			status: data.status
-		}
-		if (data.state == 'no-more') return;
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-		httpApi.getKehuList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-			} else {
-				data.state = 'no-more';
-			}
-		}).catch(err => {
-			data.state = 'more';
-		}).finally(() => {
-			data.loading = false;
-		})
-	}
-
-	function radioChange(opt) {
-		data.activeData = data.list.find(item => item.id == opt.detail.value)
-	}
-
-	function handleAddKehu() {
-		addKhRef.value.handleShow()
-	}
-
-
-	function handleSelect() {
-		emits('select', data.activeData)
-		popupRef.value.close();
-	}
-
-	function handleShow() {
-		data.realName = '';
-		popupRef.value.open();
-		onRefresh();
-	}
-
-	defineExpose({
-		handleShow
-	})
-</script>
-
-<style>
-</style>

+ 0 - 29
pages/admin/Hetong/components/zhaoguBingren.vue

@@ -1,29 +0,0 @@
-<template>
-	<view class="fwnr-item-box">
-		<view class="title-row-box">
-			<text>照顾病人</text> 
-			 <view class="title-del-btn">
-				 <icon class="del-icon" v-show="false"></icon>
-			 </view>
-		</view>
-		<view class="fwnr-label-input">
-			<view class="fwnr-form-label"><text class="form-label-require"></text>病人病情</view>
-			<uni-easyinput v-model="data.hetong.bingren" placeholder="请输入病人病情" />
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-	
-	const data = injectHetong()
-</script>
-
-
-<style>
-</style>

+ 0 - 64
pages/admin/Hetong/components/zhaoguLaoren.vue

@@ -1,64 +0,0 @@
-<template>
-	<view class="fwnr-item-box">
-		<view class="title-row-box">
-			<text>照顾老人:</text>
-			<view class="title-del-btn">
-				<icon class="del-icon" v-show="false"></icon>
-			</view>
-		</view>
-		<view class="form-label-radio fwnr-label-radio">
-			<view class="phone-form-label"><text class="form-label-require"></text>身体情况</view>
-			<view class="form-radio-group">
-				<view v-for="item in items" :key="item.value" class="form-radio-item" @click="radioChange(item.value)"
-					:class="{genderActive:data.hetong.shentiqingkuang==item.value }">{{item.text}}</view>
-			</view>
-		</view>
-		<view class="fwnr-label-input">
-			<view class="fwnr-form-label"><text class="form-label-require"></text>老人人数</view>
-			<uni-easyinput v-model="data.hetong.laoren" placeholder="请输入照顾几位老人" />
-		</view>
-		<laorenNianling @change="onChange"></laorenNianling>
-	</view>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-	import laorenNianling from "./laorenNianling.vue"
-	import {
-		ref
-	} from "vue"
-	const {
-		injectHetong
-	} = useHetong();
-
-	const data = injectHetong()
-
-	const emits = defineEmits(['change'])
-
-	const items = [{
-		value: 1,
-		text: '能自理'
-	}, {
-		value: 2,
-		text: '半自理'
-	}, {
-		value: 3,
-		text: '不能自理'
-	}, ]
-
-	function onChange() {
-		emits('change')
-	}
-
-	function radioChange(value) {
-    if (data.hetong.shentiqingkuang == value) {
-      data.hetong.shentiqingkuang = 0
-    } else {data.hetong.shentiqingkuang = value}
-	}
-</script>
-
-
-<style>
-</style>

+ 0 - 28
pages/admin/Hetong/components/zhaoguYunfu.vue

@@ -1,28 +0,0 @@
-<template>
-	<view class="fwnr-item-box">
-		<view class="title-row-box">
-			<text>孕、产妇护理</text> 
-			 <view class="title-del-btn">
-				 <icon class="del-icon" v-show="false"></icon>
-			 </view>
-		</view>
-		<view class="fwnr-label-input">
-			<uni-easyinput v-model="data.hetong.huli" placeholder="请输入护理内容" />
-		</view>
-	</view>
-</template>
-
-<script setup>
-	import {
-		useHetong
-	} from "../useHetong.js"
-	const {
-		injectHetong
-	} = useHetong();
-	
-	const data = injectHetong()
-</script>
-
-
-<style>
-</style>

+ 0 - 96
pages/admin/Hetong/previewHetong.vue

@@ -1,96 +0,0 @@
-<template>
-  <view class="phone-hetong-page">
-    <view class="phone-navBar-box">
-      <view @click="goUpPage" class="nav-bar-icon"></view>
-      <text class="nav-bar-title">合同</text>
-      <view></view>
-    </view>
-    <template v-if="tId">
-      <view class="pdf-box">
-        <img v-for="item in imgList" mode="aspectFit" :src="`data:image/png;base64,${item}`"
-             @click="previewBase64Image(`data:image/png;base64,${item}`)" class="pdf-img" />
-      </view>
-      <!-- 加载提示 -->
-      <view class="pdf-tip-box" v-if="isLoading">
-        <view class="tip-img-box">
-          <view class="tip-text">加载中...</view>
-        </view>
-      </view>
-    </template>
-  </view>
-</template>
-
-<script setup>
-import {
-  ref
-} from "vue";
-import * as httpApi from "@/api/hetong.js"
-import {
-  onLoad
-} from "@dcloudio/uni-app"
-import {getSanfangPreview} from "@/api/sanfang";
-import {
-	base64ToPath
-} from "image-tools";
-
-const tId = ref(null)
-
-const info = ref({})
-const show = ref(false)
-const imgList = ref([])
-const isLoading = ref(true)
-const timer1 = ref(null)
-
-onLoad((options) => {
-  tId.value = options.id;
-  init();
-})
-
-function init() {
-  getSanfangPreview({
-    id: tId.value
-  }).then(res => {
-    info.value = res.data;
-    imgList.value = res.data.base64List;
-  }).finally(() => {
-    isLoading.value = false;
-  })
-}
-
-async function previewBase64Image(base64Data) {
-  try {
-    // 关键步骤:将 Base64 字符串转换为本地临时路径
-    // 此处以使用 image-tools 的 base64ToPath 为例
-    const localPath = await base64ToPath(base64Data);
-    // 调用 UniApp 的图片预览 API
-    uni.previewImage({
-      urls: [localPath], // 注意:urls 参数需要是数组,即使只预览一张图
-      current: 0, // 当前显示图片在 urls 数组中的索引
-    });
-  } catch (error) {
-    // 如果出现错误(如转换失败),隐藏加载提示并告知用户
-    console.error('预览失败:', error);
-    uni.showToast({
-      title: '预览失败',
-      icon: 'none'
-    });
-  }
-}
-
-function goUpPage() {
-  uni.navigateBack()
-  clearTimeout(timer1.value);
-  timer1.value = null;
-}
-
-function handleGoLishi() {
-  uni.redirectTo({
-    url: '/pages/admin/Hetong/sanfangHetong'
-  })
-}
-
-</script>
-
-<style scoped>
-
-</style>

+ 0 - 387
pages/admin/Hetong/sanfangHetong.vue

@@ -1,387 +0,0 @@
-<template>
-	<view class="admin-sfht-list">
-		<view class="phone-navBar-box">
-			<view @click="goUpPage" class="nav-bar-icon"></view>
-			<text class="nav-bar-title">三方合同</text>
-			<uni-icons class="nav-bar-right-icon bar-ml10" type="search" size="20" @click="toggle('top')"></uni-icons>
-		</view>
-		<view class="jiazheng-search-box">
-			<view @click.stop="clickAlltype" class="select-item-box">
-				<text class="select-text">{{data.statusText}}</text>
-				<icon class="select-jt-default" />
-			</view>
-		</view>
-
-		<view class="list-new-btn-box">
-			<button type="default" class="phone-green-btn" @click="handleAdd">新增合同</button>
-		</view>
-
-		<!-- 状态面板 -->
-		<view class="all-type-box" v-show="isOpen" @click="clickAlltype">
-			<view class="phone-radio-group data-check-radio-group">
-				<!-- 技能块展示 -->
-				<view v-for="item in listStatus" @click="handleSelectStatus(item)" :key="item.status"
-					class="phone-radio-item">
-					{{ item.statusText }}
-				</view>
-			</view>
-		</view>
-
-		<view>
-			<search-dialog ref="searchDialogRef" :shenfen="shenfen" @search-btn="dialogSearchBtn"
-				@reset-search="dialogSearchReset"></search-dialog>
-		</view>
-
-		<!-- 无限滚动容器 -->
-		<view>
-			<scroll-view scroll-y="true" refresher-enabled="true" :refresher-triggered="data.loading"
-				:refresher-threshold="50" @scrolltolower="onScrolltolower" refresher-background="transparent"
-				@refresherrefresh="onRefresh">
-				<uni-list class="sfht-scroll-view">
-					<uni-list-item v-for="item in data.list" class="sfht-list-item-box">
-						<template v-slot:body>
-							<view class="sfht-card-box">
-								<view class="card-head-row">
-									<view @click="handleDelete(item)" class="del-btn-box">
-										<icon class="del-btn"></icon>
-									</view>
-									<button type="default" class="phone-green-btn ht-head-btn" v-if="item.status == 0" @click="tuisong(item)">推送</button>
-									<button type="default" class="phone-green-btn ht-head-btn"
-										@click.stop="handlePreview(item)">预览</button>
-									<button type="default" class="phone-white-btn ht-head-btn"
-										@click.stop="handleEditor(item)" v-if="item.status<2">编辑</button>
-									<button type="default" v-if="item.status==1" class="phone-white-btn ht-head-btn"
-										@click.stop="handleShengxiao(item)">生效</button>
-								</view>
-								<view class="card-body-row">
-									<view class="body-row">
-										<view class="title-text">
-											<icon class="user-icon"></icon>家政人员名称
-										</view>
-										<view class="value-text">{{item.realName}}</view>
-									</view>
-									<view class="body-row">
-										<view class="title-text">
-											<icon class="idcard-icon"></icon>客户名称
-										</view>
-										<view class="value-text">{{item.khName}}</view>
-									</view>
-								</view>
-								<view class="card-body-row">
-									<view class="body-row">
-										<view class="title-text">
-											<icon class="date-icon"></icon>合同开始时间
-										</view>
-										<view class="value-text">{{item.startDate}}</view>
-									</view>
-									<view class="body-row">
-										<view class="title-text">
-											<icon class="date-icon"></icon>合同结束时间
-										</view>
-										<view class="value-text">{{item.endDate}}</view>
-									</view>
-									<view class="body-row">
-										<view class="title-text">
-											<icon class="htzt-icon"></icon>合同状态
-										</view>
-										<view class="status-0" v-if="item.status== 0">待签字</view>
-										<view class="status-1" v-if="item.status== 1">待审核</view>
-										<view class="status-2" v-if="item.status== 2">有效</view>
-										<view class="status-3" v-if="item.status== 3">失效</view>
-									</view>
-								</view>
-							</view>
-						</template>
-					</uni-list-item>
-					<uni-load-more :status="data.state" @click="getMore(0)"
-						:contentText="data.contentText"></uni-load-more>
-				</uni-list>
-			</scroll-view>
-		</view>
-
-		<!-- 删除子账号 -->
-		<common-dialog ref="commonDialogRef" title="删除确认" content="你确定要执行这个操作吗"
-			@confirm-btn="handleDeleteConfirm"></common-dialog>
-
-		<customTabbarAdminVue :current-tab="1"></customTabbarAdminVue>
-
-	</view>
-</template>
-
-<script setup>
-	import {
-		ref,
-		reactive,
-		nextTick
-	} from "vue";
-	import {
-		onShow,
-		onLoad
-	} from "@dcloudio/uni-app";
-	import * as httpApi from "@/api/sanfang.js"
-	import searchDialog from "./components/search.vue";
-	import customTabbarAdminVue from "@/components/custom-tabbar/custom-tabbar-admin.vue";
-	import commonDialog from '@/components/dialog/commonDialog.vue';
-	import {
-		getSanfangDelete
-	} from "../../../api/sanfang";
-
-	const searchDialogRef = ref(null);
-	const commonDialogRef = ref(null)
-	const data = reactive({
-		status: 0,
-		statusText: '待签字',
-		state: 'more',
-		list: [], // 考试列表
-		loading: false,
-		jzRealName: '',
-		khRealName: '',
-		page: 0,
-		size: 10,
-	})
-	const isOpen = ref(false)
-
-	const active = ref(null);
-
-	const listStatus = ref([{
-			statusText: '有效',
-			status: 2,
-		},
-		{
-			statusText: '待审核',
-			status: 1,
-		},
-		{
-			statusText: '待签字',
-			status: 0,
-		}, {
-			statusText: '失效',
-			status: 3,
-		}
-	])
-	const shenfen = ref(null);
-
-	function toggle() {
-		searchDialogRef.value.handleShow();
-	}
-	
-	function handleShengxiao(da) {
-		httpApi.getSanfangShengxiao({id:da.id}).then(res => {
-			if (res.data) {
-				uni.showToast({
-					title: '合同已生效'
-				})
-				onRefresh();
-			}
-		})
-	}
-
-	function tuisong(data){
-		
-		if (!plus.runtime.isApplicationExist({
-				pname: 'com.tencent.mm'
-			})) {
-			uni.showToast({
-				title: '请先安装微信',
-				icon: 'none'
-			});
-			return;
-		}
-		
-		// 分享到小程序  我想加个参数  
-		uni.share({
-		    provider: 'weixin',
-		    scene: "WXSceneSession",
-		    type: 5,
-		    imageUrl: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/share-logo@3.png',
-		    title: '欢迎体验uniapp12312',
-		    miniProgram: {
-		        id: 'gh_fa5889151e7d',
-		        path: 'pages/Login/clientIndex?from=appcx&id='+data.id,
-		        type: 2, //暂时用体验版
-		        webUrl: 'http://uniapp.dcloud.io'
-		    },
-		    success: ret => {
-		        console.log(JSON.stringify(ret));
-		    }
-		});
-	}
-	function goUpPage() {
-		// uni.redirectTo({
-		// 	url: '/pages/admin/ShouYe/shouye'
-		// })
-    uni.navigateBack()
-	}
-
-	function clickAlltype() {
-		isOpen.value = !isOpen.value;
-	}
-
-	function handleSelectStatus(item) {
-		data.status = item.status;
-		data.statusText = item.statusText;
-
-		onRefresh();
-	}
-
-	function handleAdd() {
-		uni.navigateTo({
-			url: '/pages/admin/Hetong/addSanfangHetong'
-		})
-	}
-
-	function handleDelete(item) {
-		active.value = item;
-		commonDialogRef.value.handleShow();
-	}
-
-	function handleDeleteConfirm() {
-		httpApi.getSanfangDelete({
-			id: active.value.id
-		}).then(res => {
-			if (res.code == 0) {
-				uni.showToast({
-					title: '成功'
-				})
-				onRefresh();
-			} else {
-				uni.showToast({
-					title: '失败'
-				})
-			}
-		})
-	}
-
-	function handleEditor(item) {
-		uni.navigateTo({
-			url: `/pages/admin/Hetong/addSanfangHetong?flag=editor&id=${item.id}`
-		})
-	}
-
-	function handlePreview(item) {
-		uni.navigateTo({
-			url: `/pages/admin/Hetong/previewHetong?id=${item.id}`
-		})
-	}
-
-	function dialogSearchBtn(opt, searchInput) {
-		if (opt == 2) {
-			data.khRealName = searchInput
-			data.jzRealName = '';
-		} else {
-			data.khRealName = '';
-			data.jzRealName = searchInput
-		}
-
-		onRefresh()
-	}
-
-	function dialogSearchReset() {
-		data.jzRealName = '';
-		data.khRealName = '';
-	}
-
-	function onScrolltolower() {
-		getMore()
-	}
-
-	function onRefresh() {	
-		if (data.loading) return;
-    data.state = '';
-		data.page = 0;
-		data.list = [];
-		data.loading = true;
-		refreshData();
-	}
-
-	function refreshData() {
-		const opt = {
-			jzRealName: data.jzRealName,
-			khRealName: data.khRealName,
-			page: data.page,
-			size: data.size,
-			status: data.status
-		}
-		data.list = [];
-		// 数学
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-
-		httpApi.getSanfangList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-			} else {
-				data.state = 'no-more';
-			}
-		}).catch(err => {
-			data.state = 'more';
-		}).finally(() => {
-			data.loading = false;
-		})
-	}
-
-	function getMore() {
-		const opt = {
-			jzRealName: data.jzRealName,
-			khRealName: data.khRealName,
-			page: data.page,
-			size: data.size,
-			status: data.status
-		}
-		if (data.state == 'no-more') return;
-		data.state = 'loading';
-		data.page++;
-		opt.page = data.page;
-		httpApi.getSanfangList(opt).then(res => {
-			data.list = data.list.concat(res.data.data);
-			data.loading = false;
-			if (res.data.total > data.list.length) {
-				data.state = 'more';
-			} else {
-				data.state = 'no-more';
-			}
-		}).catch(err => {
-			data.state = 'more';
-		}).finally(() => {
-			data.loading = false;
-		})
-	}
-
-	onLoad((options) => {
-
-		const {
-			from,
-			jzName,
-			khName
-		} = options;
-		if (jzName) {
-			data.jzRealName = jzName;
-			shenfen.value = 'jz'
-			nextTick(() => {
-				searchDialogRef.value.handleSetValue(jzName)
-			})
-		}
-		if (khName) {
-			data.khRealName = khName
-			shenfen.value = 'kh'
-			nextTick(() => {
-				searchDialogRef.value.handleSetValue(khName)
-			})
-		}
-	})
-
-	onShow(() => {
-		data.page = 0;
-		data.list = [];
-		data.state = '';
-		getMore()
-	})
-</script>
-
-<style>
-
-</style>

+ 0 - 16
pages/admin/Hetong/useHetong.js

@@ -1,16 +0,0 @@
-import { provide,inject } from "vue"
-
-
-const customKey = 'hetong';
-
-export function useHetong() {
-	
-	const injectHetong = (defaultValue) => inject(customKey,defaultValue)
-	
-	const provideHetong = (data) => provide(customKey, data)
-	
-	return {
-		injectHetong,
-		provideHetong
-	}
-}

+ 0 - 499
pages/admin/Jiazheng/banzhengXinxi.vue

@@ -1,499 +0,0 @@
-<template>
-	<view class="jz-content-box">
-		<view :class="isZijiazheng=='true'?'mask-view':''">
-			<view class="content-body-box">
-				<view v-if="status =='add'" class="bzsm-tip-box form-top-margin">
-					<view class="title-btn-box">
-						<view class="phone-line-title">说明</view>
-						<view @click="resetFun" class="reset-btn">重置</view>
-					</view>
-					<view class="tip-content-box">1.如果不需要办理证书,可直接点击保存按钮。</view>
-					<view class="tip-content-box">2.点击重置按钮,只重置办证信息,其他信息不改变。</view>
-				</view>
-				<!-- 报证机构(picker 实现下拉选择) -->
-				<view class="form-label-select form-top-margin">
-					<view class="phone-form-label"><text class="form-label-require">*</text>报证机构</view>
-					<picker :disabled="(status =='edit'&&localStatus=='')" mode="selector" :range="jigouNames"
-						@change="jigouChange" class="select-picker-box">
-						<view class="form-radio-select"
-							:class="{'form-radio-disabled': (status =='edit'&&localStatus=='')}">
-							<view>{{ formData.baozhengJigouName || '请选择报证机构' }}</view>
-							<icon></icon>
-						</view>
-					</picker>
-				</view>
-				<view v-if="formData.banzhengInfoFlag" class="form-label-select">
-					<view class="phone-form-label"><text class="form-label-require">*</text>参训时间</view>
-					<uni-datetime-picker class="form-radio-picker" v-model="formData.canxunshijian" type="date"
-						@change="canxunShijianChange">
-						<view class="form-radio-select">
-							<view>{{formData.canxunshijian}}</view>
-							<icon></icon>
-						</view>
-					</uni-datetime-picker>
-				</view>
-
-				<view v-if="formData.banzhengInfoFlag" class="form-label-input">
-					<view class="phone-form-label"><text class="form-label-require">*</text>实操成绩</view>
-					<input v-model="formData.shicaochengji" placeholder="请填写实操成绩" />
-				</view>
-				<view v-if="formData.banzhengInfoFlag" class="form-label-input">
-					<view class="phone-form-label"><text class="form-label-require">*</text>总课时</view>
-					<input v-model="formData.zongkeshi" placeholder="请填写总课时" />
-				</view>
-				<view v-if="formData.needFlag" class="form-label-select">
-					<view class="phone-form-label"><text class="form-label-require"></text>需要考试</view>
-					<radio-group @change="kaoshiChange">
-						<label class="radio-label">
-							<radio :value="'true'" :checked="formData.needKaoshi == 'true'" color="#3fd2a1"
-								style="transform:scale(0.65)" />
-							<text>是</text>
-						</label>
-						<label class="radio-label">
-							<radio :value="'false'" :checked="formData.needKaoshi == 'false'" color="#3fd2a1"
-								style="transform:scale(0.65)" />
-							<text>否</text>
-						</label>
-					</radio-group>
-				</view>
-				<view class="form-label-input">
-					<view class="phone-form-label"><text class="form-label-require">*</text>职业名称</view>
-					<view @click="selectZy" class="input-text-row text-ellipsis-row">
-						<!-- wgy看这  v-for去掉换成一个数组或字符串 -->
-						<view class="text-ellipsis" v-if="zyNameAndLevel">{{zyNameAndLevel}}</view>
-						<view class="text-ellipsis" v-else>请选择职业名称</view>
-						<icon></icon>
-					</view>
-				</view>
-				<view class="form-label-select">
-					<view class="phone-form-label"><text class="form-label-require">*</text>职业等级</view>
-					<picker mode="selector" :disabled="isZyFlag" :style="isZyFlag?'color:#999':''" :range="zhiyeLevels"
-						@change="levelChange" class="select-picker-box">
-						<view class="form-radio-select">
-							<view>{{ formData.zhiyeLevelName || '请选择等级' }}</view>
-							<icon></icon>
-						</view>
-					</picker>
-				</view>
-				<view v-if="isZijiazheng !='true'" class="page-btn-box">
-					<button type="default" v-if="isZijiazheng !='true'" @click="goBack"
-						class="phone-white-btn">返回</button>
-					<button type="default" v-if="isZijiazheng !='true'" @click="addSaveFormPiliang"
-						class="phone-green-btn">添加</button>
-				</view>
-
-			</view>
-			<selectZyLevel ref="selectRef" @confirm-btn="selectZyLevelConfirm" :mode=modeControl
-				:id="formData.baozhengJigouId"></selectZyLevel>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		getBaozhengJigou,
-		getJiazhengLevel,
-		getJiazhengZhiye,
-		getJiazhengBanzhengCheckKc
-	} from "@/api/jiazheng.js"
-	import dayjs from "dayjs";
-	import selectZyLevel from "@/components/selectZyLevel/index.vue"
-	export default {
-		data() {
-			return {
-				formData: {
-					baozhengJigouId: '',
-					baozhengJigouName: '',
-					baozhengJigouType: '',
-					banzhengInfoFlag: false,
-					zhiyeName: '',
-					zhiyeId: '',
-					zhiyeLevelName: '',
-					zhiyeLevelId: '',
-					canxunshijian: '',
-					shicaochengji: '',
-					zongkeshi: '',
-					needKecheng: 'false', // 默认选中"是"
-					needKaoshi: 'false', // 默认选中"是"
-					kcDisabled: false,
-					needFlag: false,
-					id: '',
-					createTime: ''
-				},
-				baozhengJigouOpt: [
-
-				],
-				zhiyelevelsOpt: [],
-				zhiyeNameOpt: [
-
-				],
-				localStatus: '',
-				currentIndex: '',
-				isJgFlag: true,
-				isZyFlag: true,
-				piliang: '',
-				piliangArray: [],
-				zyNameAndLevel: ''
-			};
-		},
-		props: {
-			status: {
-				type: String,
-			},
-			isZijiazheng: {
-				type: String,
-			}
-
-		},
-		components: {
-			selectZyLevel
-		},
-		computed: {
-			jigouNames() {
-				return this.baozhengJigouOpt.map(item => item.name);
-			},
-			zhiyeNames() {
-				return this.zhiyeNameOpt.map(item => item.name);
-			},
-			zhiyeLevels() {
-				return this.zhiyelevelsOpt.map(item => item.name);
-			},
-			modeControl() {
-				if (this.localStatus == 'addEdit') {
-					return 'danxuan'
-				} else if (this.status == 'add') {
-					return 'duoxuan'
-				} else if (this.localStatus == 'editAdd') {
-					return 'duoxuan'
-				} else {
-					return 'danxuan'
-				}
-			}
-		},
-		created() {
-			this.getJigou()
-			this.localStatus = this.status
-
-		},
-		methods: {
-			selectZy() {
-				if (this.formData.baozhengJigouId == '') {
-					uni.showToast({
-						title: '请选择报证机构',
-						icon: 'none'
-					});
-					return false
-				}
-				console.log('this.piliangArray', this.piliangArray);
-
-				let newArray = this.piliangArray.map(item => {
-					return {
-						zyId: item.id,
-						zyName: item.name,
-					};
-				});
-				this.$refs.selectRef.handleShow(newArray)
-			},
-			selectZyLevelConfirm(data) {
-				console.log('data', data);
-				this.piliangArray = [...data]
-				this.zyNameAndLevel = data.map(item => `${item.name}`).join(',');
-				console.log('this.piliangArray', this.piliangArray);
-				this.zhiyeChange(this.piliangArray)
-				//234
-			},
-			// 提交表单
-			addSaveFormPiliang() {
-				let req = {
-					zyLevelName: this.formData.zhiyeLevelName,
-					zyLevel: this.formData.zhiyeLevelId,
-					canxunshijian: this.formData.canxunshijian,
-					jgId: this.formData.baozhengJigouId,
-					needKaoshi: this.formData.needKaoshi,
-					needKecheng: this.formData.needKecheng,
-					shicaochengji: this.formData.shicaochengji,
-					zongkeshi: this.formData.zongkeshi,
-					jgType: this.formData.baozhengJigouType,
-					jgName: this.formData.baozhengJigouName,
-					id: this.formData.id,
-					createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
-				}
-				let mergedArray = this.piliangArray.map(item => {
-					return {
-						...req, // 展开req的所有属性
-						zyId: item.id,
-						zyName: item.name,
-					};
-				});
-				console.log('this.mergedArray', mergedArray);
-
-				if (req.jgId == '') {
-					uni.showToast({
-						title: '请选择报证机构',
-						icon: 'none'
-					});
-					return false
-				}
-				if (this.piliangArray.length == 0) {
-					uni.showToast({
-						title: '请选择职业名称',
-						icon: 'none'
-					});
-					return false
-				}
-				if (!req.zyLevel) {
-					uni.showToast({
-						title: '请选择职业等级',
-						icon: 'none'
-					});
-					return false
-				}
-				// 验证机构类型为1时的必填字段
-				if (this.formData.baozhengJigouType == 1 &&
-					(this.formData.shicaochengji == '' ||
-						this.formData.zongkeshi == '' ||
-						this.formData.canxunshijian == '')) {
-					uni.showToast({
-						title: '请填写参训时间,实操成绩,总课时',
-						icon: 'none'
-					});
-					return false
-				}
-
-				console.log('this.status', this.status);
-				console.log('this.localStatus', this.localStatus);
-				console.log('this.mergedArray', mergedArray);
-				if (this.localStatus == 'addEdit') {
-					this.$emit('addEdit', mergedArray[0], 'addEdit', this.currentIndex);
-				} else if (this.status == 'add') {
-					this.$emit('addSave', mergedArray);
-				} else if (this.localStatus == 'editAdd') {
-					this.$emit('editSave', mergedArray, 'editAdd');
-				} else {
-					this.$emit('editSave', mergedArray[0], 'edit', this.currentIndex);
-				}
-			},
-			goBack() {
-				this.isJgFlag = true
-				this.isZyFlag = true
-				this.piliangArray = []
-				this.$emit('goBack');
-			},
-			editinfo(data, index) {
-				this.piliangArray = []
-				this.$nextTick(() => {
-					if (!data) {
-						return false
-					}
-					console.log('index', index);
-					console.log('data', data);
-					this.currentIndex = index
-					this.zyNameAndLevel = data.zyName
-					this.formData.baozhengJigouName = data.jgName;
-					this.formData.baozhengJigouId = data.jgId;
-					this.formData.id = data.id;
-					this.formData.baozhengJigouType = data.jgType;
-					this.formData.banzhengInfoFlag = data.jgType == 1;
-					this.formData.zhiyeName = data.zyName;
-					this.formData.zhiyeId = data.zyId;
-					this.formData.zhiyeLevelName = data.zyLevelName;
-					this.formData.zhiyeLevelId = data.zyLevel;
-					if (this.formData.baozhengJigouId) {
-						this.isJgFlag = false
-					}
-					if (this.formData.baozhengJigouId && this.formData.zhiyeId) {
-						this.isZyFlag = false
-						let req = {
-							jgId: this.formData.baozhengJigouId,
-							zyId: this.formData.zhiyeId,
-						}
-						getJiazhengLevel(req).then(res => {
-							console.log('res', res);
-							this.zhiyelevelsOpt = res.data
-						})
-					}
-
-					this.formData.canxunshijian = data.canxunshijian;
-					this.formData.zongkeshi = data.zongkeshi;
-					this.formData.shicaochengji = data.shicaochengji;
-					this.formData.needKecheng = data.needKecheng ? data.needKecheng.toString() : 'false';
-					this.formData.needKaoshi = data.needKaoshi ? data.needKaoshi.toString() : 'false';
-					if (this.formData.banzhengInfoFlag) {
-						this.formData.needFlag = false
-					} else {
-						this.formData.needFlag = true
-					}
-					this.piliangArray = [{
-						id: data.zyId,
-						name: data.zyName,
-						zyLevel: data.zyLevel,
-						zyLevelName: data.zyLevelName
-					}]
-				})
-			},
-			getJigou() {
-				getBaozhengJigou({}).then(res => {
-					console.log('res', res);
-					this.baozhengJigouOpt = res.data
-				})
-			},
-			getZhiye() {
-				this.zhiyeNameOpt = []
-				this.formData.zhiyeName = ''
-				this.formData.zhiyeId = ''
-				getJiazhengZhiye({
-					id: this.formData.baozhengJigouId
-				}).then(res => {
-					console.log('res', res);
-					this.zhiyeNameOpt = res.data
-				})
-			},
-			getZhiyeLevel() {
-				this.zhiyelevelsOpt = []
-				this.formData.zhiyeLevelName = ''
-				this.formData.zhiyeLevelId = ''
-				let req = {
-					jgId: this.formData.baozhengJigouId,
-					zyId: this.formData.zhiyeId,
-
-				}
-				getJiazhengLevel(req).then(res => {
-					console.log('res', res);
-					this.zhiyelevelsOpt = res.data
-				})
-			},
-			resetData() {
-				this.formData.zhiyeName = ''
-				this.formData.zhiyeId = ''
-				this.formData.zhiyeLevelName = ''
-				this.formData.zhiyeLevelId = ''
-				this.formData.canxunshijian = ''
-				this.formData.shicaochengji = ''
-				this.formData.zongkeshi = ''
-				this.isJgFlag = true
-				this.isZyFlag = true
-				this.zyNameAndLevel = ''
-				this.piliangArray = []
-			},
-			resetFun() {
-				this.formData.zhiyeName = ''
-				this.formData.zhiyeId = ''
-				this.formData.zhiyeLevelName = ''
-				this.formData.zhiyeLevelId = ''
-				this.formData.canxunshijian = ''
-				this.formData.shicaochengji = ''
-				this.formData.zongkeshi = ''
-				this.formData.baozhengJigouName = ''
-				this.formData.baozhengJigouId = ''
-				this.formData.baozhengJigouName = ''
-				this.formData.needKecheng = 'false'
-				this.formData.needKaoshi = 'false'
-				this.formData.needFlag = false
-				this.formData.kcDisabled = false
-				this.formData.banzhengInfoFlag = false
-				this.isJgFlag = true
-				this.isZyFlag = true
-				this.piliangArray = []
-				this.zyNameAndLevel = ''
-
-			},
-			// 报证机构选择
-			jigouChange(e) {
-				this.formData.baozhengJigouName = this.baozhengJigouOpt[e.detail.value].name;
-				this.formData.baozhengJigouId = this.baozhengJigouOpt[e.detail.value].jgId;
-				this.formData.baozhengJigouType = this.baozhengJigouOpt[e.detail.value].jgType;
-				this.formData.banzhengInfoFlag = this.baozhengJigouOpt[e.detail.value].jgType == 1;
-				// 每一次都重置
-				this.resetData()
-
-				console.log('this.formData.banzhengInfoFlag', this.formData.banzhengInfoFlag);
-				if (this.formData.banzhengInfoFlag) {
-					this.formData.needFlag = false
-					this.formData.needKaoshi = 'false'
-					this.formData.needKecheng = 'false'
-				} else {
-					this.formData.needFlag = true
-					this.formData.needKaoshi = 'true'
-					this.formData.needKecheng = 'false'
-				}
-				if (this.formData.baozhengJigouId) {
-					this.isJgFlag = false //开启
-					//this.getZhiye()
-				}
-			},
-
-			// 职业等级选择
-			levelChange(e) {
-				this.formData.zhiyeLevelId = this.zhiyelevelsOpt[e.detail.value].id;
-				this.formData.zhiyeLevelName = this.zhiyelevelsOpt[e.detail.value].name;
-			},
-			checkKc() {
-				let req = {
-					zyId: this.formData.zhiyeId,
-					zyLevel: this.formData.zhiyeLevelId
-				}
-				getJiazhengBanzhengCheckKc(req).then(res => {
-					console.log('res', res);
-					if (res.data.pass.toString() == 'true') {
-						this.formData.kcDisabled = false
-						this.formData.needKecheng = 'true'
-					} else {
-						uni.showToast({
-							title: res.data.msg,
-							icon: 'none'
-						});
-						this.formData.needKecheng = 'false'
-						this.formData.kcDisabled = true
-					}
-					//	this.zhiyelevelsOpt = res.data
-				})
-			},
-			// 职业名称选择
-			zhiyeChange(data) {
-				//123
-				//	this.formData.zhiyeName = this.zhiyeNameOpt[e.detail.value].name;
-				this.formData.zhiyeId = data[0].id;
-				if (this.formData.baozhengJigouId && this.formData.zhiyeId) {
-					this.isZyFlag = false
-					this.getZhiyeLevel()
-				}
-			},
-			canxunShijianChange(e) {
-				console.log('e', e);
-				this.formData.canxunshijian = e
-			},
-
-			// 需要课程选择
-			kechengChange(e) {
-				this.formData.needKecheng = e.detail.value.toString();
-				console.log('this.formData.needKecheng', this.formData.needKecheng);
-				if (this.formData.needKecheng == 'true') {
-					if (this.formData.zhiyeId && this.formData.zhiyeLevelId) {
-						this.checkKc()
-					} else {
-						uni.showToast({
-							title: '请选择职业以及职业等级',
-							icon: 'none'
-						});
-						setTimeout(() => {
-							this.formData.needKecheng = 'false'
-						}, 1000)
-
-						return false
-					}
-				}
-			},
-
-			// 需要考试选择
-			kaoshiChange(e) {
-				this.formData.needKaoshi = e.detail.value.toString();
-			},
-			currentMove(data) {
-				console.log('data', data);
-				// currentMove 编辑状态下的新增
-				this.localStatus = data
-				console.log('localStatus', this.localStatus);
-			}
-		}
-	};
-</script>

+ 0 - 91
pages/admin/Jiazheng/banzhengXinxiList.vue

@@ -1,91 +0,0 @@
-<template>
-	<view class="bzxx-list-page">
-		<view :class="isZijiazheng=='true'?'mask-view':''">
-			<view  class="bz-new-btn-box" v-if="list.length>0">
-				<button type="default" class="phone-green-btn" @click="addBanzheng">添加</button>
-			</view>
-			<view class="bzxx-wrap-box" v-if="list.length>0">
-				<view v-for="(item,index) in list" :key="index" class="bzxx-card-box">
-					<view class="name-btn-box">
-						<view class="jg-name">报证机构:{{item.jgName}}</view>
-						<view class="name-btn editer-btn" @click="goEdit(item,index)">编辑</view>
-						<view class="name-btn delete-btn" @click="deleteFun(item,index)">删除</view>
-					</view>
-					<view class="bzxx-zy-row">
-						<icon class="zy-icon"></icon>职业名称:<text>{{item.zyName}}</text>
-					</view>
-					<view class="bzxx-zy-row">
-						<icon class="zydj-icon"></icon>职业等级:<text>{{item.zyLevelName}}</text>
-					</view>
-					<view class="bzxx-time-row">
-						<icon class="time-icon"></icon><text>申报时间:{{item.createTime}}</text>
-					</view>
-				</view>
-			</view>
-			<view v-if="list.length==0" class="bzxx-add-btn-box">
-				<view @click="addBanzheng" class="bzxx-add-btn"><text>+</text>添加办证信息</view>
-			</view>
-			<view v-if="status =='add'&&isZijiazheng !='true'" class="bzxx-btn-box">
-				<button type="default" @click="saveBanzheng" class="phone-green-btn">保存</button>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		getBaozhengJigou,
-		getJiazhengLevel,
-		getJiazhengZhiye,
-		getJiazhengBanzhengCheckKc
-	} from "@/api/jiazheng.js"
-	import {
-		toast
-	} from "@/utils/common";
-	export default {
-		data() {
-			return {
-
-			};
-		},
-		props: {
-			list: {
-				type: Array,
-				default: () => []
-			},
-			status: {
-				type: String,
-			}
-		},
-		computed: {
-
-		},
-		created() {
-
-		},
-		methods: {
-			addBanzheng() {
-				this.$emit('addBanzheng');
-			},
-			saveBanzheng() {
-				this.$emit('saveBanzheng');
-			},
-			goEdit(item, index) {
-
-				console.log('item', item);
-				if (item.statusBanzheng != '未办证' && this.status == 'edit') {
-					toast("已提交办证申请,禁止修改")
-					return false
-				}
-				this.$emit('editBanzheng', item, index);
-			},
-			deleteFun(item, index) {
-				if (item.statusBanzheng != '未办证' && this.status == 'edit') {
-					toast("已提交办证申请,禁止删除")
-					return false
-				}
-				this.$emit('deleteBanzheng', item, index);
-			}
-		}
-	};
-</script>

+ 0 - 607
pages/admin/Jiazheng/bf/banzhengXinxi.vue

@@ -1,607 +0,0 @@
-<template>
-	<view class="jz-content-box">
-		<view :class="isZijiazheng=='true'?'mask-view':''">
-			<view class="content-body-box">
-				<view v-if="status =='add'" class="bzsm-tip-box form-top-margin">
-					<view class="title-btn-box">
-						<view class="phone-line-title">说明</view>
-						<view @click="resetFun" class="reset-btn">重置</view>
-					</view>
-					<view class="tip-content-box">1.如果不需要办理证书,可直接点击保存按钮。</view>
-					<view class="tip-content-box">2.点击重置按钮,只重置办证信息,其他信息不改变。</view>
-				</view>
-				<!-- 报证机构(picker 实现下拉选择) -->
-				<view class="form-label-select form-top-margin">
-					<view class="phone-form-label"><text class="form-label-require">*</text>报证机构</view>
-					<picker :disabled="(status =='edit'&&localStatus=='')" mode="selector" :range="jigouNames"
-						@change="jigouChange" class="select-picker-box">
-						<view class="form-radio-select"
-							:class="{'form-radio-disabled': (status =='edit'&&localStatus=='')}">
-							<view>{{ formData.baozhengJigouName || '请选择报证机构' }}</view>
-							<icon></icon>
-						</view>
-					</picker>
-				</view>
-				<!-- 职业名称(picker 实现下拉选择) -->
-				<view class="form-label-select">
-					<view class="phone-form-label"><text class="form-label-require">*</text>职业名称</view>
-					<picker mode="selector" :disabled="isJgFlag" :style="isJgFlag?'color:#999':''" :range="zhiyeNames"
-						range-key="name" @change="zhiyeChange" class="select-picker-box">
-						<view class="form-radio-select">
-							<view>{{ formData.zhiyeName || '请选择职业名称' }}</view>
-							<icon></icon>
-						</view>
-					</picker>
-				</view>
-				<!-- 职业等级(picker 实现下拉选择) -->
-				<view class="form-label-select">
-					<view class="phone-form-label"><text class="form-label-require">*</text>职业等级</view>
-					<picker mode="selector" :disabled="isZyFlag" :style="isZyFlag?'color:#999':''" :range="zhiyeLevels"
-						@change="levelChange" class="select-picker-box">
-						<view class="form-radio-select">
-							<view>{{ formData.zhiyeLevelName || '请选择等级' }}</view>
-							<icon></icon>
-						</view>
-					</picker>
-				</view>
-
-				<view v-if="formData.banzhengInfoFlag" class="form-label-select">
-					<view class="phone-form-label"><text class="form-label-require">*</text>参训时间</view>
-					<uni-datetime-picker class="form-radio-picker" v-model="formData.canxunshijian" type="date"
-						@change="canxunShijianChange">
-						<view class="form-radio-select">
-							<view>{{formData.canxunshijian}}</view>
-							<icon></icon>
-						</view>
-					</uni-datetime-picker>
-				</view>
-
-				<view v-if="formData.banzhengInfoFlag" class="form-label-input">
-					<view class="phone-form-label"><text class="form-label-require">*</text>实操成绩</view>
-					<input v-model="formData.shicaochengji" placeholder="请填写实操成绩" />
-				</view>
-				<view v-if="formData.banzhengInfoFlag" class="form-label-input">
-					<view class="phone-form-label"><text class="form-label-require">*</text>总课时</view>
-					<input v-model="formData.zongkeshi" placeholder="请填写总课时" />
-				</view>
-				<view v-if="formData.needFlag" class="form-label-select">
-					<view class="phone-form-label"><text class="form-label-require"></text>需要考试</view>
-					<radio-group @change="kaoshiChange">
-						<label class="radio-label">
-							<radio :value="'true'" :checked="formData.needKaoshi == 'true'" color="#3fd2a1"
-								style="transform:scale(0.65)" />
-							<text>是</text>
-						</label>
-						<label class="radio-label">
-							<radio :value="'false'" :checked="formData.needKaoshi == 'false'" color="#3fd2a1"
-								style="transform:scale(0.65)" />
-							<text>否</text>
-						</label>
-					</radio-group>
-				</view>
-				<view v-if="isZijiazheng !='true'" class="page-btn-box">
-					<button type="default" v-if="piliang !=1&&isZijiazheng !='true'" @click="goBack"
-						class="phone-white-btn">返回</button>
-					<button type="default" v-if="piliang ==1&&isZijiazheng !='true'" @click="piliangBaocun"
-						class="phone-green-btn">确认</button>
-					<button type="default" v-if="piliang !=1&&isZijiazheng !='true'" @click="addSaveForm"
-						class="phone-green-btn">添加</button>
-				</view>
-				<view v-if="piliangArray.length>0" v-for="(item,index) in piliangArray" :key="index"
-					class="bzsm-tip-box form-top-margin">
-					<view class="title-btn-box">
-						<view class="phone-line-title">{{item.jgName}}</view>
-						<view class="reset-btn" @click="piliangDelete(item,index)">删除</view>
-					</view>
-					<view class="tip-content-box">{{item.zyName}} {{item.zyLevelName}}</view>
-					<!-- 				<view class="tip-content-box">职业名称:{{item.zyName}}</view>
-				<view class="tip-content-box">职业等级:{{item.zyLevelName}}</view> -->
-				</view>
-
-
-			</view>
-			<view v-if="isZijiazheng !='true' &&piliang ==1" class="page-btn-box content-footer-box">
-				<button type="default" v-if="piliang ==1&&isZijiazheng !='true'" @click="goBack"
-					class="phone-white-btn">返回</button>
-				<button type="default" v-if="piliang ==1&&isZijiazheng !='true'" @click="addSaveFormPiliang"
-					class="phone-green-btn">添加</button>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		getBaozhengJigou,
-		getJiazhengLevel,
-		getJiazhengZhiye,
-		getJiazhengBanzhengCheckKc
-	} from "@/api/jiazheng.js"
-	import dayjs from "dayjs";
-	export default {
-		data() {
-			return {
-				formData: {
-					baozhengJigouId: '',
-					baozhengJigouName: '',
-					baozhengJigouType: '',
-					banzhengInfoFlag: false,
-					zhiyeName: '',
-					zhiyeId: '',
-					zhiyeLevelName: '',
-					zhiyeLevelId: '',
-					canxunshijian: '',
-					shicaochengji: '',
-					zongkeshi: '',
-					needKecheng: 'false', // 默认选中"是"
-					needKaoshi: 'false', // 默认选中"是"
-					kcDisabled: false,
-					needFlag: false,
-					id: '',
-					createTime: ''
-				},
-				baozhengJigouOpt: [
-
-				],
-				zhiyelevelsOpt: [],
-				zhiyeNameOpt: [
-
-				],
-				localStatus: '',
-				currentIndex: '',
-				isJgFlag: true,
-				isZyFlag: true,
-				piliang: '',
-				piliangArray: []
-			};
-		},
-		props: {
-			status: {
-				type: String,
-			},
-			isZijiazheng: {
-				type: String,
-			}
-
-		},
-		computed: {
-			jigouNames() {
-				return this.baozhengJigouOpt.map(item => item.name);
-			},
-			zhiyeNames() {
-				return this.zhiyeNameOpt.map(item => item.name);
-			},
-			zhiyeLevels() {
-				return this.zhiyelevelsOpt.map(item => item.name);
-			},
-		},
-		created() {
-			this.getJigou()
-			this.localStatus = this.status
-
-		},
-		methods: {
-			piliangDelete(item, index) {
-				this.piliangArray.splice(index, 1);
-			},
-			isPiliang(data) {
-				this.piliang = data
-				if (data == 0) {
-					this.piliangArray = []
-				}
-			},
-			goBack() {
-				this.isJgFlag = true
-				this.isZyFlag = true
-				this.piliangArray = []
-				this.$emit('goBack');
-			},
-			editinfo(data, index) {
-				this.piliangArray = []
-				console.log('123123', data);
-				this.$nextTick(() => {
-					if (!data) {
-						return false
-					}
-					console.log('datssssa', data);
-					this.currentIndex = index
-					this.formData.baozhengJigouName = data.jgName;
-					this.formData.baozhengJigouId = data.jgId;
-					this.formData.id = data.id;
-					this.formData.baozhengJigouType = data.jgType;
-					this.formData.banzhengInfoFlag = data.jgType == 1;
-					this.formData.zhiyeName = data.zyName;
-					this.formData.zhiyeId = data.zyId;
-					this.formData.zhiyeLevelName = data.zyLevelName;
-					this.formData.zhiyeLevelId = data.zyLevel;
-					if (this.formData.baozhengJigouId) {
-						this.isJgFlag = false
-						getJiazhengZhiye({
-							id: this.formData.baozhengJigouId
-						}).then(res => {
-							console.log('res', res);
-							this.zhiyeNameOpt = res.data
-						})
-					}
-					if (this.formData.baozhengJigouId && this.formData.zhiyeId) {
-						this.isZyFlag = false
-						let req = {
-							jgId: this.formData.baozhengJigouId,
-							zyId: this.formData.zhiyeId,
-
-						}
-						getJiazhengLevel(req).then(res => {
-							console.log('res', res);
-							this.zhiyelevelsOpt = res.data
-						})
-					}
-					this.formData.canxunshijian = data.canxunshijian;
-					this.formData.zongkeshi = data.zongkeshi;
-					this.formData.shicaochengji = data.shicaochengji;
-					this.formData.needKecheng = data.needKecheng ? data.needKecheng.toString() : 'false';
-					this.formData.needKaoshi = data.needKaoshi ? data.needKaoshi.toString() : 'false';
-
-					if (this.formData.banzhengInfoFlag) {
-						this.formData.needFlag = false
-
-					} else {
-						this.formData.needFlag = true
-
-					}
-				})
-			},
-			getJigou() {
-				getBaozhengJigou({}).then(res => {
-					console.log('res', res);
-					this.baozhengJigouOpt = res.data
-				})
-			},
-			getZhiye() {
-				this.zhiyeNameOpt = []
-				this.formData.zhiyeName = ''
-				this.formData.zhiyeId = ''
-				getJiazhengZhiye({
-					id: this.formData.baozhengJigouId
-				}).then(res => {
-					console.log('res', res);
-					this.zhiyeNameOpt = res.data
-				})
-			},
-			getZhiyeLevel() {
-				this.zhiyelevelsOpt = []
-				this.formData.zhiyeLevelName = ''
-				this.formData.zhiyeLevelId = ''
-				let req = {
-					jgId: this.formData.baozhengJigouId,
-					zyId: this.formData.zhiyeId,
-
-				}
-				getJiazhengLevel(req).then(res => {
-					console.log('res', res);
-					this.zhiyelevelsOpt = res.data
-				})
-			},
-			resetData() {
-				this.formData.zhiyeName = ''
-				this.formData.zhiyeId = ''
-				this.formData.zhiyeLevelName = ''
-				this.formData.zhiyeLevelId = ''
-				this.formData.canxunshijian = ''
-				this.formData.shicaochengji = ''
-				this.formData.zongkeshi = ''
-				this.isJgFlag = true
-				this.isZyFlag = true
-			},
-			resetFun() {
-				this.formData.zhiyeName = ''
-				this.formData.zhiyeId = ''
-				this.formData.zhiyeLevelName = ''
-				this.formData.zhiyeLevelId = ''
-				this.formData.canxunshijian = ''
-				this.formData.shicaochengji = ''
-				this.formData.zongkeshi = ''
-				this.formData.baozhengJigouName = ''
-				this.formData.baozhengJigouId = ''
-				this.formData.baozhengJigouName = ''
-				this.formData.needKecheng = 'false'
-				this.formData.needKaoshi = 'false'
-				this.formData.needFlag = false
-				this.formData.kcDisabled = false
-				this.formData.banzhengInfoFlag = false
-				this.isJgFlag = true
-				this.isZyFlag = true
-					this.piliangArray = []
-
-			},
-			// 报证机构选择
-			jigouChange(e) {
-				this.formData.baozhengJigouName = this.baozhengJigouOpt[e.detail.value].name;
-				this.formData.baozhengJigouId = this.baozhengJigouOpt[e.detail.value].jgId;
-				this.formData.baozhengJigouType = this.baozhengJigouOpt[e.detail.value].jgType;
-				this.formData.banzhengInfoFlag = this.baozhengJigouOpt[e.detail.value].jgType == 1;
-				// 每一次都重置
-				this.resetData()
-
-				console.log('this.formData.banzhengInfoFlag', this.formData.banzhengInfoFlag);
-				if (this.formData.banzhengInfoFlag) {
-					this.formData.needFlag = false
-					this.formData.needKaoshi = 'false'
-					this.formData.needKecheng = 'false'
-				} else {
-					this.formData.needFlag = true
-					this.formData.needKaoshi = 'true'
-					this.formData.needKecheng = 'false'
-				}
-				if (this.formData.baozhengJigouId) {
-					this.isJgFlag = false //开启
-					this.getZhiye()
-				}
-			},
-
-			// 职业等级选择
-			levelChange(e) {
-				this.formData.zhiyeLevelId = this.zhiyelevelsOpt[e.detail.value].id;
-				this.formData.zhiyeLevelName = this.zhiyelevelsOpt[e.detail.value].name;
-			},
-			checkKc() {
-				let req = {
-					zyId: this.formData.zhiyeId,
-					zyLevel: this.formData.zhiyeLevelId
-				}
-				getJiazhengBanzhengCheckKc(req).then(res => {
-					console.log('res', res);
-					if (res.data.pass.toString() == 'true') {
-						this.formData.kcDisabled = false
-						this.formData.needKecheng = 'true'
-					} else {
-						uni.showToast({
-							title: res.data.msg,
-							icon: 'none'
-						});
-						this.formData.needKecheng = 'false'
-						this.formData.kcDisabled = true
-					}
-					//	this.zhiyelevelsOpt = res.data
-				})
-			},
-			// 职业名称选择
-			zhiyeChange(e) {
-				this.formData.zhiyeName = this.zhiyeNameOpt[e.detail.value].name;
-				this.formData.zhiyeId = this.zhiyeNameOpt[e.detail.value].id;
-				if (this.formData.baozhengJigouId && this.formData.zhiyeId) {
-					this.isZyFlag = false
-					this.getZhiyeLevel()
-				}
-			},
-			canxunShijianChange(e) {
-				console.log('e', e);
-				this.formData.canxunshijian = e
-			},
-
-			// 需要课程选择
-			kechengChange(e) {
-				this.formData.needKecheng = e.detail.value.toString();
-				console.log('this.formData.needKecheng', this.formData.needKecheng);
-				if (this.formData.needKecheng == 'true') {
-					if (this.formData.zhiyeId && this.formData.zhiyeLevelId) {
-						this.checkKc()
-					} else {
-						uni.showToast({
-							title: '请选择职业以及职业等级',
-							icon: 'none'
-						});
-						setTimeout(() => {
-							this.formData.needKecheng = 'false'
-						}, 1000)
-
-						return false
-					}
-				}
-			},
-
-			// 需要考试选择
-			kaoshiChange(e) {
-				this.formData.needKaoshi = e.detail.value.toString();
-			},
-			currentMove(data) {
-				console.log('data', data);
-				// currentMove 编辑状态下的新增
-				this.localStatus = data
-				console.log('localStatus', this.localStatus);
-			},
-			piliangBaocun() {
-				let req = {
-					canxunshijian: this.formData.canxunshijian,
-					jgId: this.formData.baozhengJigouId,
-					needKaoshi: this.formData.needKaoshi,
-					needKecheng: this.formData.needKecheng,
-					shicaochengji: this.formData.shicaochengji,
-					zongkeshi: this.formData.zongkeshi,
-					zyId: this.formData.zhiyeId,
-					zyLevel: this.formData.zhiyeLevelId,
-					jgType: this.formData.baozhengJigouType,
-					jgName: this.formData.baozhengJigouName,
-					zyName: this.formData.zhiyeName,
-					zyLevelName: this.formData.zhiyeLevelName,
-					id: this.formData.id,
-					createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
-				}
-				if (this.status == 'add' || this.localStatus == 'editadd' || this.localStatus == 'addEdit') {
-					req.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss")
-				}
-				if (req.jgId == '' || req.zyId == '' || req.zyLevel == '') {
-					uni.showToast({
-						title: '请选择保证机构,职业名称,职业等级',
-						icon: 'none'
-					});
-					return false
-				}
-				if (this.formData.baozhengJigouType == 1 && (this.formData.shicaochengji == '' || this.formData
-						.zongkeshi ==
-						'' || this.formData.canxunshijian == '')) {
-					uni.showToast({
-						title: '请填写参训时间,实操成绩,总课时',
-						icon: 'none'
-					});
-					return false
-				}
-				// 检查重复数据 - 新增的重复检查逻辑
-				const isDuplicate = this.piliangArray.some(item =>
-					item.jgId === req.jgId &&
-					item.zyId === req.zyId &&
-					item.zyLevel === req.zyLevel
-				);
-
-				if (isDuplicate) {
-					uni.showToast({
-						title: '该机构、职业和等级已存在,无法重复添加',
-						icon: 'none'
-					});
-					return false;
-				}
-
-				//console.log('req', req);
-				this.piliangArray.push(req)
-				console.log('this.piliangArray', this.piliangArray);
-			},
-			// 提交表单
-			addSaveFormPiliang() {
-				let req = {
-					canxunshijian: this.formData.canxunshijian,
-					jgId: this.formData.baozhengJigouId,
-					needKaoshi: this.formData.needKaoshi,
-					needKecheng: this.formData.needKecheng,
-					shicaochengji: this.formData.shicaochengji,
-					zongkeshi: this.formData.zongkeshi,
-					zyId: this.formData.zhiyeId,
-					zyLevel: this.formData.zhiyeLevelId,
-					jgType: this.formData.baozhengJigouType,
-					jgName: this.formData.baozhengJigouName,
-					zyName: this.formData.zhiyeName,
-					zyLevelName: this.formData.zhiyeLevelName,
-					id: this.formData.id,
-					createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
-				}
-				if (this.status == 'add' || this.localStatus == 'editadd' || this.localStatus == 'addEdit') {
-					req.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss")
-				}
-				if (req.jgId == '' || req.zyId == '' || req.zyLevel == '') {
-					uni.showToast({
-						title: '请选择保证机构,职业名称,职业等级',
-						icon: 'none'
-					});
-					return false
-				}
-				if (this.formData.baozhengJigouType == 1 && (this.formData.shicaochengji == '' || this.formData
-						.zongkeshi ==
-						'' || this.formData.canxunshijian == '')) {
-					uni.showToast({
-						title: '请填写参训时间,实操成绩,总课时',
-						icon: 'none'
-					});
-					return false
-				}
-
-
-				console.log('this.status', this.status);
-				console.log('this.localStatus', this.localStatus);
-
-				if (this.localStatus == 'editAdd') {
-					if (this.piliangArray.length == 0) {
-						this.$emit('editSavePiliang', req);
-					} else {
-						console.log('this.piliangArray', this.piliangArray);
-						this.$emit('editSavePiliang', this.piliangArray)
-					}
-
-				} else if (this.status == 'add') {
-					if (this.piliangArray.length == 0) {
-						this.$emit('addSavePiliang', req);
-					} else {
-						console.log('this.piliangArray', this.piliangArray);
-						this.$emit('addSavePiliang', this.piliangArray)
-					}
-				}
-			
-
-			},
-			// 提交表单
-			addSaveForm() {
-				//debugger
-
-				console.log('statusstatusstatus', this.status);
-
-				let req = {
-					canxunshijian: this.formData.canxunshijian,
-					jgId: this.formData.baozhengJigouId,
-					needKaoshi: this.formData.needKaoshi,
-					needKecheng: this.formData.needKecheng,
-					shicaochengji: this.formData.shicaochengji,
-					zongkeshi: this.formData.zongkeshi,
-					zyId: this.formData.zhiyeId,
-					zyLevel: this.formData.zhiyeLevelId,
-					jgType: this.formData.baozhengJigouType,
-					jgName: this.formData.baozhengJigouName,
-					zyName: this.formData.zhiyeName,
-					zyLevelName: this.formData.zhiyeLevelName,
-					id: this.formData.id,
-					createTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
-				}
-				console.log('req', req);
-				if (this.status == 'add' || this.localStatus == 'editadd' || this.localStatus == 'addEdit') {
-					req.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss")
-				}
-				if (req.jgId == '' || req.zyId == '' || req.zyLevel == '') {
-					uni.showToast({
-						title: '请选择保证机构,职业名称,职业等级',
-						icon: 'none'
-					});
-					return false
-				}
-				if (this.formData.baozhengJigouType == 1 && (this.formData.shicaochengji == '' || this.formData
-						.zongkeshi ==
-						'' || this.formData.canxunshijian == '')) {
-					uni.showToast({
-						title: '请填写参训时间,实操成绩,总课时',
-						icon: 'none'
-					});
-					return false
-				}
-				console.log('req123123123', req);
-				if (req.jgId && req.zyId && req.zyLevel) {
-					if (this.localStatus == 'addEdit') {
-						this.$emit('addEdit', req, 'addEdit', this.currentIndex);
-					} else if (this.status == 'add') {
-						this.$emit('addSave', req);
-					} else if (this.localStatus == 'editAdd') {
-						this.$emit('editSave', req, 'editAdd');
-					} else {
-						this.$emit('editSave', req, 'edit', this.currentIndex);
-					}
-
-				} else if (req.jgId == '' && req.zyId == '' && req.zyLevel == '') {
-					if (this.status == 'add') {
-						this.$emit('addSave', '');
-					} else if (this.localStatus == 'editAdd') {
-						//this.$emit('editSave', '');
-						// uni.showToast({
-						// 	title: '请选择保证机构,职业名称,职业等级',
-						// 	icon: 'none'
-						// });
-
-						// return false
-					} else {
-
-					}
-				} else {
-					uni.showToast({
-						title: '请选择保证机构,职业名称,职业等级',
-						icon: 'none'
-					});
-
-					return false
-				}
-			}
-		}
-	};
-</script>

+ 0 - 100
pages/admin/Jiazheng/bf/banzhengXinxiList.vue

@@ -1,100 +0,0 @@
-<template>
-	<view class="bzxx-list-page">
-		<view :class="isZijiazheng=='true'?'mask-view':''">
-			<view  class="bz-new-btn-box" v-if="list.length>0">
-				<button type="default" class="phone-white-btn" @click="addBanzheng">添加</button>
-				<button type="default" class="phone-green-btn" @click="addBanzhengPiliang">批量添加</button>
-			</view>
-			<view class="bzxx-wrap-box" v-if="list.length>0">
-				<view v-for="(item,index) in list" :key="index" class="bzxx-card-box">
-					<view class="name-btn-box">
-						<view class="jg-name">报证机构:{{item.jgName}}</view>
-						<view class="name-btn editer-btn" @click="goEdit(item,index)">编辑</view>
-						<view class="name-btn delete-btn" @click="deleteFun(item,index)">删除</view>
-					</view>
-					<view class="bzxx-zy-row">
-						<icon class="zy-icon"></icon>职业名称:<text>{{item.zyName}}</text>
-					</view>
-					<view class="bzxx-zy-row">
-						<icon class="zydj-icon"></icon>职业等级:<text>{{item.zyLevelName}}</text>
-					</view>
-					<view class="bzxx-time-row">
-						<icon class="time-icon"></icon><text>申报时间:{{item.createTime}}</text>
-					</view>
-				</view>
-			</view>
-		<!-- 	<view v-if="list.length>0 && status!='edit'" class="bzxx-btn-box">
-				<button type="default" v-if="status!='edit'&&isZijiazheng !='true'" @click="saveBanzheng" class="phone-green-btn">保存</button>
-			</view> -->
-			<view v-if="list.length==0" class="bzxx-add-btn-box">
-				<view @click="addBanzheng" class="bzxx-add-btn"><text>+</text>添加办证信息</view>
-				<view @click="addBanzhengPiliang" class="bzxx-add-btn"><text>+</text>批量添加办证信息</view>
-
-			</view>
-			<view v-if="status =='add'&&isZijiazheng !='true'" class="bzxx-btn-box">
-				<button type="default" @click="saveBanzheng" class="phone-green-btn">保存</button>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		getBaozhengJigou,
-		getJiazhengLevel,
-		getJiazhengZhiye,
-		getJiazhengBanzhengCheckKc
-	} from "@/api/jiazheng.js"
-	import {
-		toast
-	} from "@/utils/common";
-	export default {
-		data() {
-			return {
-
-			};
-		},
-		props: {
-			list: {
-				type: Array,
-				default: () => []
-			},
-			status: {
-				type: String,
-			}
-		},
-		computed: {
-
-		},
-		created() {
-
-		},
-		methods: {
-			addBanzheng() {
-				this.$emit('addBanzheng');
-			},
-			addBanzhengPiliang() {
-				this.$emit('addBanzhengPiliang');
-			},
-			saveBanzheng() {
-				this.$emit('saveBanzheng');
-			},
-			goEdit(item, index) {
-
-				console.log('item', item);
-				if (item.statusBanzheng != '未办证' && this.status == 'edit') {
-					toast("已提交办证申请,禁止修改")
-					return false
-				}
-				this.$emit('editBanzheng', item, index);
-			},
-			deleteFun(item, index) {
-				if (item.statusBanzheng != '未办证' && this.status == 'edit') {
-					toast("已提交办证申请,禁止删除")
-					return false
-				}
-				this.$emit('deleteBanzheng', item, index);
-			}
-		}
-	};
-</script>

+ 0 - 247
pages/admin/Jiazheng/bf/common/dataChecked.vue

@@ -1,247 +0,0 @@
-<template>
-	<view class="phone-radio-group data-check-radio-group">
-		<!-- 技能块展示 -->
-		<view v-for="item in displayedList" :key="item.id" class="phone-radio-item"
-			:class="{ radioActive: isSelected(item.id) }" @click="toggleSelect(item)">
-			{{ item.name }}
-		</view>
-		<!-- 添加按钮 -->
-		<view v-if="showAddButton" class="radio-add-btn" @click="handleAdd">
-			+ 添加
-		</view>
-
-		<!-- 展开/收起按钮 -->
-		<view class="radio-btn-box label-radio-btn-box">
-			<view v-if="showExpandButton" :class="[{ 'radio-btn': true }, showAll ? 'collapsed-btn' : 'expanded-btn']"
-				@click="toggleExpand">
-				{{ showAll ? '收起' : `展开` }}
-			</view>
-		</view>
-
-
-		<!-- 	<view v-if="showExpandButton" class="expand-button" @click="toggleExpand">
-			{{ showAll ? '收起' : `展开剩余${remainingCount}项` }}
-		</view> -->
-
-		<!-- 添加弹窗 -->
-		<uni-popup ref="addPopup" type="dialog" :animation="false" :is-mask-click="false">
-			<view class="phone-common-dialog">
-				<view class="common-body-box">
-					<view class="common-title">新增技能</view>
-					<view class="common-input-box">
-						<input v-model="newName" placeholder="请输入技能名称" class="common-input-margin" />
-					</view>
-				</view>
-				<view class="common-btn-box">
-					<view class="not-confirm-btn" @click="cancelAdd">取消</view>
-					<view class="confirm-btn" @click="confirmAdd">确认</view>
-				</view>
-			</view>
-		</uni-popup>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: 'SkillSelector',
-		props: {
-			// 技能列表(必须包含id和name字段)
-			list: {
-				type: Array,
-				required: true,
-				default: () => []
-			},
-			// 默认显示数量
-			defaultCount: {
-				type: Number,
-				default: 10
-			},
-			// 是否显示添加功能
-			showAdd: {
-				type: Boolean,
-				default: true
-			},
-			// 新增模式选择
-			mode: {
-				type: String,
-				default: 'multiple', // 'single' | 'multiple'
-				validator: (value) => ['single', 'multiple'].includes(value)
-			},
-			// 外部传入的已选id(单选时为单个id,多选时为id数组)
-			selectedIds: {
-				type: [Array, Number,String],
-				default: () => []
-			},
-			selectedNames: {
-				type: String,
-				default: ''
-			}
-		},
-		data() {
-			return {
-				showAll: false,
-				selectedData: [],
-				newName: ''
-			};
-		},
-		computed: {
-			displayedList() {
-				return this.showAll ? this.list : this.list.slice(0, this.defaultCount);
-			},
-			remainingCount() {
-				return this.list.length - this.defaultCount;
-			},
-			showExpandButton() {
-				return this.list.length > this.defaultCount;
-			},
-			showAddButton() {
-				if (!this.showAdd) return false;
-				return this.showAll || this.list.length < this.defaultCount;
-			}
-		},
-		watch: {
-			// 监听外部传入的selectedIds变化,更新selectedData
-			selectedIds: {
-
-				handler(newVal) {
-					if (this.mode === 'single') {
-						// 单选模式
-						const selectedItem = this.list.find(item => item.id == newVal);
-						this.selectedData = selectedItem ? [selectedItem] : [];
-					} else {
-						// 多选模式
-						this.selectedData = this.list.filter(item => newVal.includes(item.id));
-					}
-				}
-			},
-			// 监听外部传入的selectedNames变化,更新selectedData
-			selectedNames: {
-				immediate: true,
-				handler(newVal) {
-					if (!newVal) {
-						this.selectedData = [];
-						return;
-					}
-					// 将字符串解析为名称数组
-					const names = newVal.split(',').map(name => name.trim());
-					// 根据名称从list中找到对应的数据
-					this.selectedData = this.list.filter(item => names.includes(item.name));
-				}
-			}
-		},
-		methods: {
-			isSelected(id) {
-				return this.selectedData.some(item => item.id === id);
-			},
-
-
-			toggleSelect(data) {
-				if (this.mode == 'single') {
-					this.handleSingleSelect(data);
-				} else {
-					this.handleMultipleSelect(data);
-				}
-				this.$emit('change', this.selectedData);
-			},
-			// 单选处理逻辑
-			handleSingleSelect(data) {
-				const isSelected = this.selectedData.some(item => item.id == data.id);
-				if (isSelected) {
-					// 取消选择
-					this.selectedData = [];
-				} else {
-					// 替换选择
-					this.selectedData = [data];
-				}
-			},
-			// 多选处理逻辑
-			handleMultipleSelect(data) {
-				const index = this.selectedData.findIndex(item => item.id == data.id);
-				if (index === -1) {
-					this.selectedData.push(data);
-				} else {
-					this.selectedData.splice(index, 1);
-				}
-			},
-			toggleExpand() {
-				this.showAll = !this.showAll;
-			},
-
-			handleAdd() {
-				this.$refs.addPopup.open();
-			},
-
-			confirmAdd() {
-				if (!this.newName.trim()) {
-					uni.showToast({
-						title: '请输入技能名称',
-						icon: 'none'
-					});
-					return;
-				}
-
-				const newObject = {
-					id: this.list.length,
-					name: this.newName
-				};
-				console.log('list', this.list);
-				console.log('newObject', newObject);
-
-				this.$emit('add', newObject);
-				this.newName = '';
-				this.$refs.addPopup.close();
-			},
-
-			cancelAdd() {
-				this.newName = '';
-				this.$refs.addPopup.close();
-			}
-		}
-	};
-</script>
-
-<style scoped>
-	.add-block {
-		background: transparent;
-		border: 1px dashed #007aff;
-		color: #007aff;
-	}
-
-	.expand-button {
-		margin-top: 30rpx;
-		color: #007aff;
-		font-size: 28rpx;
-		text-align: center;
-	}
-
-	.add-popup {
-		padding: 40rpx;
-		background: #fff;
-		border-radius: 16rpx;
-	}
-
-	.add-input {
-		width: 100%;
-		padding: 20rpx;
-		border: 1px solid #eee;
-		border-radius: 8rpx;
-		margin-bottom: 40rpx;
-	}
-
-	.button-group {
-		display: flex;
-		gap: 20rpx;
-	}
-
-	.confirm-button {
-		flex: 1;
-		background: #007aff;
-		color: #fff;
-	}
-
-	.cancel-button {
-		flex: 1;
-		background: #ff3b30;
-		color: #fff;
-	}
-</style>

+ 0 - 145
pages/admin/Jiazheng/bf/common/jiazhengPdfUpload.vue

@@ -1,145 +0,0 @@
-<template>
-  <view>
-    <!-- 触发按钮 -->
-    <slot name="trigger" :uploading="uploading">
-      <button 
-        :disabled="uploading"
-        @click="choosePdf"
-        class="upload-btn"
-      >
-        {{ uploading ? '上传中...' : '上传PDF' }}
-      </button>
-    </slot>
-  </view>
-</template>
-
-<script>
-export default {
-  name: 'PdfUploader',
-  props: {
-    // 上传接口地址
-    uploadUrl: {
-      type: String,
-      required: true
-    },
-    // 最大文件大小(单位:MB)
-    maxSize: {
-      type: Number,
-      default: 50
-    }
-  },
-  data() {
-    return {
-      uploading: false
-    }
-  },
-  methods: {
-    // 选择PDF文件
-    async choosePdf() {
-      if (this.uploading) return
-      
-      try {
-        const [file] = await this.selectFile()
-        await this.verifyFile(file)
-        const result = await this.uploadFile(file)
-        this.$emit('success', result)
-      } catch (error) {
-        this.$emit('error', error)
-        this.showToast(error.message)
-      }
-    },
-
-    // 选择文件
-    selectFile() {
-      return new Promise((resolve, reject) => {
-        uni.chooseFile({
-          count: 1,
-          type: 'file',
-          extension: ['pdf'],
-          success: res => resolve(res.tempFiles),
-          fail: () => reject(new Error('取消选择'))
-        })
-      })
-    },
-
-    // 验证文件
-    verifyFile(file) {
-      const maxBytes = this.maxSize * 1024 * 1024
-      
-      if (!file.type.includes('pdf')) {
-        throw new Error('请选择PDF文件')
-      }
-      
-      if (file.size > maxBytes) {
-        throw new Error(`文件大小不能超过${this.maxSize}MB`)
-      }
-      
-      return true
-    },
-
-    // 执行上传
-    uploadFile(file) {
-      this.uploading = true
-      
-      return new Promise((resolve, reject) => {
-        uni.uploadFile({
-          url: this.uploadUrl,
-          filePath: file.path,
-          name: 'file',
-          formData: {
-            filename: file.name
-          },
-          success: (res) => {
-            if (res.statusCode === 200) {
-              resolve(JSON.parse(res.data))
-            } else {
-              reject(new Error('上传失败'))
-            }
-          },
-          fail: () => reject(new Error('网络错误')),
-          complete: () => (this.uploading = false)
-        })
-      })
-    },
-
-    // 显示提示
-    showToast(message) {
-      uni.showToast({
-        title: message,
-        icon: 'none',
-        duration: 3000
-      })
-    }
-  }
-}
-</script>
-
-<style scoped>
-.upload-btn {
-  background-color: #007AFF;
-  color: white;
-  padding: 10px 20px;
-  border-radius: 5px;
-  font-size: 14px;
-}
-
-.upload-btn[disabled] {
-  background-color: #cccccc;
-}
-</style>
-<!--  <SimplePdfUploader
-      upload-url="https://your-api.com/upload"
-      :max-size="30"
-      @success="handleSuccess"
-      @error="handleError"
-    >
-      <!-- 自定义触发按钮 -->
-      <template v-slot:trigger="{ uploading }">
-        <button 
-          :disabled="uploading"
-          class="custom-btn"
-        >
-          {{ uploading ? '正在上传...' : '选择PDF文件' }}
-        </button>
-      </template>
-    </SimplePdfUploader> -->

+ 0 - 282
pages/admin/Jiazheng/bf/common/jiazhengUpload.vue

@@ -1,282 +0,0 @@
-<template>
-	<view v-if="changjingType =='shenfenzheng'" class="sfz-upload-box" @click="showActionSheet">
-		<view v-if="!imageUrl" class="sfz-content"><text>+</text> 添加身份证</view>
-		<image class="sfz-image" v-else :src="imageUrl" mode=""></image>
-	</view>
-
-	<view v-else-if="changjingType =='more'" class="admin-upload-btn-box" @click="showActionSheet">
-		<text>+</text>
-	</view>
-	<view v-else class="admin-upload-btn-box" @click="showActionSheet">
-		<text v-if="!imageUrl">+</text>
-		<image v-else class="other-image" :src="imageUrl" mode=""></image>
-	</view>
-	<view v-if="bottomText" class="upload-bottom-text">
-		{{bottomText}}
-	</view>
-</template>
-
-<script>
-	import axios from 'axios';
-	import {
-		getAliyunPolicy
-	} from "@/api/jiazheng.js"
-		import cacheManager from "@/utils/cacheManager.js";
-	export default {
-		emits: ['getFileUrl'], // 声明自定义事件
-		data() {
-			return {
-				imageUrl: ""
-			}
-		},
-		props: {
-			bottomText: { // 试题序号
-				type: String
-			},
-			changjingType: {
-				type: String,
-				default: ''
-			},
-			img: {
-				type: String,
-				default: ''
-			}
-		},
-		watch: {
-			img: {
-				handler(newVal) {
-					this.imageUrl = newVal
-				}
-			},
-
-		},
-		methods: {
-			showActionSheet() {
-
-				// 判断是否是H5环境
-				// #ifdef H5
-				this.chooseImage('album'); // H5环境下直接选择相册
-				// #endif
-
-				// #ifndef H5
-				uni.showActionSheet({
-					itemList: ['拍照', '从相册选择'],
-					success: (res) => {
-						if (res.tapIndex === 0) {
-							this.chooseImage('camera');
-						} else if (res.tapIndex === 1) {
-							this.chooseImage('album');
-						}
-					}
-				});
-				// #endif
-
-			},
-			chooseImage(sourceType) {
-				uni.chooseImage({
-					count: 1, // 只能选择一张图片
-					sourceType: [sourceType], // 'camera' 或 'album'
-					success: (res) => {
-						console.log('res', res);
-
-						// #ifndef H5
-						const filePath = res.tempFilePaths[0];
-						this.uploadFileToAliyun(filePath);
-						// #endif
-						// #ifdef H5
-						const filePath = res.tempFiles[0];
-						this.uploadFileToAliyun(filePath);
-						// #endif
-					}
-				});
-			},
-			uploadFileToAliyun(filePath) {
-				console.log('filePath', filePath);
-
-				const loading = uni.showLoading({
-					title: '上传中...',
-					mask: true
-				});
-				try {
-
-					// #ifdef H5
-					const suffixList = filePath.name.split('.');
-					let req = {
-						prefix: 'resource/',
-						suffix: suffixList[suffixList.length - 1],
-					}
-					// #endif
-					// #ifndef H5
-					const suffix = filePath.split('.').pop();
-					let req = {
-						prefix: 'resource/',
-						suffix: suffix
-					}
-					// #endif
-					getAliyunPolicy(req).then(res => {
-						let that = this;
-						if (res.code == 0) {
-							const policyData = res.data;
-							console.log('policyData', policyData);
-
-							// #ifdef H5
-							const formData = new FormData();
-							formData.append('key', policyData.key);
-							formData.append('policy', policyData.policy);
-							formData.append('OSSAccessKeyId', policyData.accessid);
-							formData.append('signature', policyData.signature);
-							formData.append('success_action_status', '200');
-							formData.append('file', filePath);
-
-							axios.post(policyData.uploadUrl, formData)
-								.then(alRes => {
-									if (alRes.status === 200) {
-										that.imageUrl =
-											`${policyData.downloadUrl}/${policyData.key}`;
-										uni.showToast({
-											title: '上传成功',
-											icon: 'success'
-										});
-										that.$emit('getFileUrl', that.imageUrl);
-									} else {
-										uni.showToast({
-											title: '上传失败',
-										});
-									}
-								})
-							// #endif
-
-							// #ifndef H5
-							console.log('appappappappappapp');
-							// 非 H5 环境下使用 uni.uploadFile 上传
-							uni.uploadFile({
-								url: policyData.uploadUrl,
-								filePath: filePath,
-								name: 'file',
-								formData: {
-									key: policyData.key,
-									policy: policyData.policy,
-									OSSAccessKeyId: policyData.accessid,
-									signature: policyData.signature,
-									success_action_status: '200'
-								},
-								header: {
-									'Content-Type': 'multipart/form-data'
-								},
-								success(uploadRes) {
-									console.log('uploadRes', uploadRes);
-									if (uploadRes.statusCode === 200) {
-										that.imageUrl = `${policyData.downloadUrl}/${policyData.key}`;
-										uni.showToast({
-											title: '上传成功',
-											icon: 'success'
-										});
-										that.$emit('getFileUrl', that.imageUrl);
-									} else {
-										uni.showToast({
-											title: '上传失败',
-										});
-									}
-								},
-								fail(err) {
-									console.log('err', err);
-								}
-							});
-							// #endif
-
-						} else {
-							uni.showToast({
-								title: '获取凭证失败',
-							});
-						}
-					});
-				} catch (error) {
-					uni.showToast({
-						title: '上传失败',
-						icon: 'none'
-					});
-					console.error('上传失败:', error);
-				} finally {
-					uni.hideLoading();
-				}
-			}
-			// uploadFileToAliyun(filePath) {
-			// 	console.log('filePath', filePath);
-			// 	const loading = uni.showLoading({
-			// 		title: '上传中...',
-			// 		mask: true
-			// 	});
-
-			// 	try {
-			// 		const suffix = filePath.split('.').pop();
-			// 		let req = {
-			// 			prefix: 'resource/',
-			// 			suffix: suffix
-			// 		}
-
-			// 		getAliyunPolicy(req).then(res => {
-			// 			let that = this
-			// 			if (res.code == 0) {
-			// 				const policyData = res.data;
-			// 				console.log('policyData', policyData);
-			// 				const formData = {
-			// 					key: policyData.key,
-			// 					policy: policyData.policy,
-			// 					OSSAccessKeyId: policyData.accessid,
-			// 					signature: policyData.signature,
-			// 					success_action_status: '200',
-			// 					file: {
-			// 						name: policyData.key,
-			// 						uri: filePath
-			// 					}
-			// 				};
-			// 				uni.uploadFile({
-			// 					url: policyData.uploadUrl,
-			// 					filePath: filePath,
-			// 					name: 'file',
-			// 					formData: formData,
-			// 					header: {
-			// 						'Content-Type': 'multipart/form-data'
-			// 					},
-			// 					success(uploadRes) {
-			// 						console.log('uploadRes', uploadRes);
-			// 						if (uploadRes.statusCode === 200) {
-			// 							that.imageUrl = `${policyData.downloadUrl}/${policyData.key}`;
-			// 							uni.showToast({
-			// 								title: '上传成功',
-			// 								icon: 'success'
-			// 							});
-			// 							console.log('imageUrl', that.imageUrl);
-			// 							that.$emit('getFileUrl', that.imageUrl);
-			// 						} else {
-			// 							uni.showToast({
-			// 								title: '上传失败',
-			// 							});
-			// 							return false
-			// 						}
-			// 					},
-			// 					fail(err) {
-			// 						console.log('err', err);
-			// 					}
-			// 				});
-
-			// 			} else {
-			// 				uni.showToast({
-			// 					title: '获取凭证失败',
-			// 				});
-			// 				return false
-			// 			}
-			// 		})
-			// 	} catch (error) {
-			// 		uni.showToast({
-			// 			title: '上传失败',
-			// 			icon: 'none'
-			// 		});
-			// 		console.error('上传失败:', error);
-			// 	} finally {
-			// 		uni.hideLoading();
-			// 	}
-			// },
-		}
-	};
-</script>

+ 0 - 104
pages/admin/Jiazheng/bf/common/kechengLeixing.vue

@@ -1,104 +0,0 @@
-<template>
-	<uni-popup ref="popupKechengLeixingRef" type="top" :animation="false" :is-mask-click="false"
-		mask-background-color="rgba(0, 0, 0, 0.4)">
-		<view class="phone-filter-page">
-			<view class="icon-title-navBar-box">
-				<view @click="goUpPage" class="nav-bar-icon"></view>
-				<text class="nav-bar-title">筛选</text>
-			</view>
-			<view class="filter-body-box">
-				<radio-group @change="handleChange">
-					<!-- 报证机构 -->
-					<view class="filter-body-radio" v-for="item in data.list">
-						<label class="radio-name-box"
-							:class="{radioActive: activeSelect && activeSelect.id==item.id}">
-							<radio :value="`${item.id}`" :checked="item.checked" activeBackgroundColor="#3fd2a1" style="transform:scale(0.8)"/>
-							{{item.lable}}
-						</label>
-						<view class="phone-radio-group filter-radio-group">
-							<view class="phone-radio-item" v-for="citem in item.children"
-								:class="{radioActive: activeSelect && activeSelect.id == citem.id}"
-								@click.stop="handleSelect(citem,item)">
-								{{citem.lable}}
-							</view>
-						</view>
-					</view>
-				</radio-group>
-			</view>
-			<view class="filter-btn-box">
-				<button type="default" class="phone-white-btn filter-btn" @click="handleReset">重置</button>
-				<button type="default" class="phone-green-btn filter-btn" @click="handleConfirm">筛选</button>
-			</view>
-		</view>
-	</uni-popup>
-
-
-</template>
-
-<script setup>
-	import {
-		reactive,
-		ref
-	} from "vue";
-
-	const emits = defineEmits(['select', 'reset']);
-	const data = reactive({
-		list: []
-	})
-	const activeSelect = ref(null);
-
-	const popupKechengLeixingRef = ref(null);
-
-	function goUpPage() {
-		popupKechengLeixingRef.value.close();
-	}
-
-	function handleConfirm() {
-		emits('select', activeSelect.value)
-		popupKechengLeixingRef.value.close();
-	}
-
-	function handleReset() {
-		activeSelect.value = null;
-		emits('reset')
-		popupKechengLeixingRef.value.close();
-	}
-
-	function handleChange(myData) {
-		const activeD = myData.detail.value;
-		data.list.forEach(item => {
-			if (item.id != activeD) {
-				item.checked = false
-			} else {
-				item.checked = true;
-				activeSelect.value = item;
-			}
-
-		})
-	}
-
-	function handleSelect(myData) {
-		data.list.forEach(item => {
-			item.checked = false
-		})
-		activeSelect.value = myData;
-	}
-
-	function showPopup({
-		data: myData
-	}) {
-		data.list = myData;
-		popupKechengLeixingRef.value.open('top')
-	}
-
-
-	defineExpose({
-		showPopup
-	})
-</script>
-
-<style lang="scss">
-	.active {
-		color: red
-	}
-</style>

+ 0 - 113
pages/admin/Jiazheng/bf/common/search.vue

@@ -1,113 +0,0 @@
-<template>
-	<uni-popup ref="searchPopup" type="top" :animation="false" :is-mask-click="true"
-	 mask-background-color="rgba(0, 0, 0, 0.4)">
-	   <view class="select-search-row">
-		   <view class="select-search-body">
-			  <view class="select-jt-box" @click="toggleMenu">
-				<view class="selected-item">{{ selectedOption.label }}</view>
-				<view class="arrow" :class="{ 'arrow-up': isMenuOpen, 'arrow-down': !isMenuOpen }"></view>
-			  </view>
-			  <view class="select-list-box" v-if="isMenuOpen">
-				<view
-				  v-for="(option, index) in options"
-				  :key="option.value"
-				  class="menu-item"
-				  @click="selectOption(option)"
-				>
-				  {{ option.label }}
-				</view>
-			  </view>
-			  <input type="text" class="search-input" v-model="searchInput" :placeholder="searchPlaceholder" />
-			  <view class="search-icon" @click="handleSearch">
-			  	<uni-icons type="search" size="24" color="#fff"></uni-icons>
-			  </view>	
-			</view>
-		</view>
-		<view class="search-clear-box" v-if="searchInput" @click="searchReset">
-			<icon></icon>
-			<text>清空搜索</text>
-		</view>
-  </uni-popup>
-</template>
-
-<script setup>
-import { ref } from 'vue';
-const $emit = defineEmits(['search-btn','reset-search'])
-const searchPopup = ref(null); // 索引
-
-
-const options = ref([
-	  { label: '全部', value: 1 },
-	  { label: '姓名', value: 2 },
-	  { label: '手机号', value: 3 }
-	]);
-const searchPlaceholder= ref('请输入姓名、手机号等关键字');
-const searchInput= ref('');
-// 存储当前选中的选项对象
-const selectedOption = ref(options.value[0]);
- 
-// 存储菜单是否打开的状态
-const isMenuOpen = ref(false);
- 
-// 切换菜单打开/关闭状态的函数
-const toggleMenu = () => {
-  isMenuOpen.value = !isMenuOpen.value;
-};
- 
-// 选择选项的函数
-const selectOption = (option) => {
-  selectedOption.value = option;
-  searchInput.value = '';
-  if(option.label==="全部"){
-	  searchPlaceholder.value = '请输入姓名、手机号等关键字';
-  }else{
-	  searchPlaceholder.value = '请输入'+ option.label;
-  }
-  
-  isMenuOpen.value = false; // 选择后关闭菜单
-};
-
-function validatePhoneNumber(value){
-	const phoneRegex = /^1[3-9]\d{9}$/;
-	if (phoneRegex.test(value)) {
-		return '手机号';
-	} else {
-		return '姓名';
-	}
-}
-
-// 打开弹窗
-function handleShow() {
-	searchPopup.value.open();
-}
-// 取消
-function handleClose() {
-	searchInput.value = '';
-	searchPopup.value.close();
-}
-// 确认
-function handleSearch(){
-	let searchKey = '';
-	if(selectedOption.value.label==="全部"){
-		searchKey = validatePhoneNumber(searchInput.value)
-	}else{
-		searchKey = selectedOption.value.label;
-	}
-	// 搜索 key和 data
-	$emit('search-btn',searchKey,searchInput);
-	searchPopup.value.close();
-}
-
-// 清空搜索
-function searchReset(){
-	searchInput.value = '';
-	$emit('reset-search');
-}
-
-
-defineExpose({
-	handleShow,
-	handleClose
-})
-</script>
-

+ 0 - 42
pages/admin/Jiazheng/bf/common/search2.vue

@@ -1,42 +0,0 @@
-<template>
-	<uni-popup ref="searchPopup" type="top" :animation="false" :is-mask-click="true"
-	 mask-background-color="rgba(0, 0, 0, 0.4)">
-	   <view class="select-search-row">
-		   <view class="select-search-body">
-			  <input type="text" class="search-input" v-model="searchInput" placeholder="请输入课程名称" />
-			  <view class="search-icon" @click="handleSearch">
-			  	<uni-icons type="search" size="24" color="#fff"></uni-icons>
-			  </view>	
-			</view>
-		</view>
-  </uni-popup>
-</template>
-
-<script setup>
-import { ref } from 'vue';
-const $emit = defineEmits(['search-btn'])
-const searchPopup = ref(null); // 索引
-
-const searchInput= ref('');
- 
-// 打开弹窗
-function handleShow() {
-	searchPopup.value.open();
-}
-// 取消
-function handleClose() {
-	searchInput.value = '';
-	searchPopup.value.close();
-}
-// 确认
-function handleSearch(){
-	$emit('search-btn',searchInput);
-	searchPopup.value.close();
-}
-
-defineExpose({
-	handleShow,
-	handleClose
-})
-</script>
-

Some files were not shown because too many files changed in this diff