天波h5前端应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

383 line
11KB

  1. <template>
  2. <div class="page" v-if="isSHowPage">
  3. <van-nav-bar title="" :border="true" :left-arrow="true" @click-left="onNavBack" v-if="showLeftArrow">
  4. <template #left>
  5. <van-icon name="arrow-left" size="23" style="padding: 0"/>返回
  6. </template>
  7. </van-nav-bar>
  8. <div class="tip">
  9. <div class="icon">
  10. <i class="iconfont icon-tishi"></i>
  11. </div>
  12. <div class="info">
  13. <div class="titie">温馨提醒:</div>
  14. <div class="content">
  15. {{ tips }}
  16. </div>
  17. </div>
  18. </div>
  19. <div v-if="info">
  20. <!-- 第一步 -->
  21. <div class="step" v-show="info.initScaleState !== 1">
  22. <div class="name">第一步</div>
  23. <div class="title">
  24. <div class="text">情绪初始化评估</div>
  25. <div class="status success" v-if="info.initScaleState === 1">
  26. <span class="icon"
  27. ><i class="iconfont icon-caozuochenggong"></i
  28. ></span>
  29. <span>已完成</span>
  30. </div>
  31. <div class="status" v-else>待完成</div>
  32. </div>
  33. <div class="sub_title">
  34. 完成一次“情绪初始化评估”,有助于建立您的个人情绪模型。
  35. </div>
  36. <div class="step_button">
  37. <van-button
  38. round
  39. type="info"
  40. style="width: 100%; height: 100%"
  41. v-if="info.initScaleState !== 1"
  42. @click="toQuestion"
  43. >去完成</van-button>
  44. </div>
  45. </div>
  46. <!-- 第二步 -->
  47. <div class="step" v-show="info.progress !== 1">
  48. <div class="name">第二步</div>
  49. <div class="title">
  50. <div class="text">连续佩戴两小时</div>
  51. <div class="status success" v-if="info.progress === 1">
  52. <span class="icon"
  53. ><i class="iconfont icon-caozuochenggong"></i
  54. ></span>
  55. <span>已完成</span>
  56. </div>
  57. <div class="status" v-else>{{ stateText}}</div>
  58. </div>
  59. <div class="schedule">
  60. <van-progress
  61. :percentage="(info.progress) * 100"
  62. stroke-width="10px"
  63. color="#638ee4"
  64. :show-pivot="true"
  65. ></van-progress>
  66. </div>
  67. <div class="sub_title">
  68. 请连续佩戴不低于2小时,有助于为您输出更加精准的情绪分析指标。
  69. </div>
  70. </div>
  71. <div class="completed" v-show="info.progress === 1 && info.initScaleState === 1">
  72. <van-button
  73. round
  74. type="info"
  75. >建模已完成</van-button
  76. >
  77. </div>
  78. </div>
  79. </div>
  80. </template>
  81. <script>
  82. import axios from 'axios'
  83. import APICore from "@/api/core";
  84. export default {
  85. name: 'PsychologicalModeling',
  86. data() {
  87. return {
  88. info: null,
  89. showLeftArrow: null,
  90. isSHowPage: false,
  91. fromUrl: '',
  92. }
  93. },
  94. computed: {
  95. stateText() {
  96. return this.info.progress > 0 ? '进行中' : '待完成';
  97. },
  98. autoJump() {
  99. return this.$route.query.autoJump === '1';
  100. },
  101. tips() {
  102. return this.info.isFirstModeling === 1
  103. ? '首次佩戴,需完成以下2步,建立情绪模型。完成初始化建模后,将为您计算抑郁、压力、疲劳分值。'
  104. : '由于您长时间未佩戴手表,需重新建模,请连续佩戴不低于2小时,佩戴完成后,将为您计算抑郁、压力、疲劳的分值。'
  105. }
  106. },
  107. mounted() {
  108. //页面标题
  109. window.document.title = '情绪初始化建模'
  110. //页面传参
  111. let params = { ...this.$route.query }
  112. if (params.uid) {
  113. this.uid = params.uid;
  114. // 缓存从随手精灵传过来的token
  115. this.$store.commit('ssjlToken', params.accessToken || '');
  116. // 缓存从随手精灵传过来的标识
  117. this.$store.commit('fromSsjl', params.fromSsjl);
  118. // 是否显示 返回标签
  119. this.showLeftArrow = this.$store.getters.fromSsjl === 'true';
  120. this.fromUrl = params.fromUrl;
  121. console.log("fromUrl", this.fromUrl);
  122. //初始化
  123. this.init()
  124. } else {
  125. this.$toast('参数错误')
  126. }
  127. },
  128. methods: {
  129. // 获取b端token
  130. getAuth() {
  131. let manufactorId = "5bf13062-a41e-4d00-ba14-1101aad12650";
  132. let that = this;
  133. return new Promise((resolve, reject) => {
  134. APICore.getAuth({ manufactorId: manufactorId }).then(res => {
  135. let data = res.data;
  136. if(data.code === 0) {
  137. resolve(res.data.data);
  138. } else {
  139. that.$toast.fail(`${data.message}`);
  140. reject('');
  141. }
  142. })
  143. })
  144. },
  145. // 返回
  146. onNavBack() {
  147. let fromSsjl = this.$store.getters.fromSsjl === 'true';
  148. if(fromSsjl) {
  149. let baseUrl = this.fromUrl;
  150. window.location.href = `${baseUrl}/#/device`;
  151. } else {
  152. this.$router.go(-1);
  153. }
  154. },
  155. async init() {
  156. if(!this.$route.query.accessToken) {
  157. // 如果当前url没有 accessToken, 获取token,并且存储到本地缓存里面
  158. let authToken = await this.getAuth();
  159. this.$store.commit('ssjlToken', authToken);
  160. }
  161. let ssjlToken = this.$store.getters.ssjlToken;
  162. let re = await this.api('/api/Question/Progress', {
  163. method: 'GET',
  164. sslVerify: false,
  165. withCredentials: false,
  166. params: {
  167. uid: this.uid,
  168. },
  169. }, ssjlToken)
  170. if (re.success) {
  171. this.info = re.response
  172. if (re.response && re.response.state === -1) {
  173. this.$toast('用户不存在或未绑定手表')
  174. } else if (re.response && re.response.initScaleState === 1 && re.response.progress === 1 && !this.autoJump) {
  175. // 2023.6.1 需求变更,建模完成直接跳到心理健康汇总页面
  176. this.$router.replace(`/psychologicalMain?uid=${this.uid}&fromUrl=${this.fromUrl || ''}`);
  177. }
  178. } else {
  179. this.$toast(re.msg)
  180. }
  181. setTimeout(() => {
  182. this.isSHowPage = true;
  183. }, 800)
  184. },
  185. toQuestion() {
  186. this.$router.replace(`/PsychologicalQuestionnaire?uid=${this.uid}`)
  187. },
  188. api(url, config, token) {
  189. let baseUrl = process.env.NODE_ENV === 'production' ? 'https://dbmq.rzliot.com/auth_heart' : 'https://dbmq.rzliot.com/heart';
  190. setTimeout(() => {
  191. this.$toast.loading({
  192. message: '',
  193. forbidClick: true,
  194. duration: 0,
  195. })
  196. }, 100)
  197. return new Promise((res) => {
  198. axios({
  199. url: `${baseUrl}${url}`,
  200. ...config,
  201. // 增加请求头部 token
  202. headers: {
  203. 'AccessToken': token
  204. }
  205. })
  206. .then((re) => {
  207. if (re) {
  208. if (re.data) {
  209. console.log(re.data)
  210. res(re.data)
  211. this.$toast.clear()
  212. return
  213. }
  214. this.$toast(`信息获取失败-${re.status}`)
  215. res(true)
  216. this.$toast.clear()
  217. return
  218. }
  219. this.$toast(`信息获取失败-${url}`)
  220. res(true)
  221. this.$toast.clear()
  222. })
  223. .catch((e) => {
  224. this.$toast(`信息获取失败-${url}`)
  225. res(true)
  226. this.$toast.clear()
  227. console.log(e)
  228. })
  229. })
  230. },
  231. },
  232. }
  233. </script>
  234. <style lang="scss" scoped>
  235. @font-face {
  236. font-family: 'iconfont'; /* Project id 2652084 */
  237. src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAQoAAsAAAAACFQAAAPaAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDBgqEIIQDATYCJAMMCwgABCAFhGcHQRtqBxEVnBvJPhLjmMRz8aCJJho3wfN8ne+5817QmS/XTApqUAGT1kmpHaidloBWXGdzOaZE+Aj1S75l+ek70v5OL82zLE6hFEIiJEbx96dyFkjAnwUAJnXNTcUP1HiBAtaxhhUr2KsXyLuo1/rCrIx6BgFM6tACo12HbjZpk4bPmkIRGksqkFbKpPFjhxOWRnRLpRBGCEKXamQTATDWGo+AjeHn5RdRCYNBQGHt0mtM+1Hc+Zr+1VZ+0gf1Gl+CgIcbQABQQI2NmWVIu7MfKk7WQGHWKTUpDKIRjEkjySSEglIHt/zHM0CCWMoUTFVRGBclugwEvto8VnH9qyAIhIDrIApTOVMVOr2mNDQjKSPHeM4zz6ZrPrYDY3fjR7a4+xTrY15tvZVw5KkZtx/X+HznyRPHnvCeqZskVmTOjMmRnF1girdzz7F4ju3uiB/xc53CoFi1HdXMW9Vu1TonY+gTzqB98OucaHakkW3GjxWJhX9kQXymq/AjJ5sfbS5Hc9nm5+KfvW9ZiYfnRXbG8tzG6nK7+u265yW2Hv38lNG3PmqlJo7Hjv0enTXu0fJ0ouuAIf1WL94ysHiw9aA5vca2mth0ZPGOvtu99JioF7HtiBd95LA4E7Gj3qPSVmO6tC3erV1e54F9yvUsu3Bh2Z7l+lwiLGETNtvRp9ylmtsGlm7eieOF8GLvn+zifT/067/LLFd8TdeujrureHTFyFEf+hbPVft+SK96RrBXE7tqx8rt21XpUO2QwwZswmZvsZsOz8+pN3TsrzXZ143c71m5NwLL+4xyo30jdTbxttGdTvRcMG4rPzrU0SFdrfTjHqXWlOrxuHR1FdK1219m/7yFvU52Hh3x6th9I25U9b0QTS1XvFyq35thACTvqtuqZZiOq5kq9v9/w/jtj8cOTW/2P2xpAN5vbXsP+5NxDcwN4RfjFPjbqkFApFYhULpOcFsQQLEkk4cBmLYJfm81QBZvh6uzweUghMlOwSBEcVCEKYdpqhoEsIhCkDDNwaQ67VdbZPsIzBFdDKjEC4GQwRsM0rgKigw+mKa+ECCPHwTJ4A8mrqy2s6gkZs2oBC3oB9SGBudoJJR7QD92iqtiF+RY4wjkSVbM7HFAHmNGvPpCxIFj6mHHT8OuIwhMDRpJKpFQpqmre0liqJ+sYRCFgFgAzQOgxkAMOB8t+e87gHhGOhQMxC52JlKeyAdyEjIAtlcOoLYb6R254ikQBEdHORiiB9gpO9LZSQII9YMaEIOQUA2IB0pSgnJQZbK8un+5XYCJtaUSQ5Ro0kcqeo5kKhy8J7dhKXWs6skEAAA=');
  238. }
  239. .iconfont {
  240. font-family: 'iconfont' !important;
  241. // font-size: 16px;
  242. font-style: normal;
  243. -webkit-font-smoothing: antialiased;
  244. -moz-osx-font-smoothing: grayscale;
  245. }
  246. .icon-caozuochenggong:before {
  247. content: '\e60f';
  248. }
  249. .icon-tishi:before {
  250. content: '\e654';
  251. }
  252. .page {
  253. width: 100%;
  254. min-height: 100%;
  255. box-sizing: border-box;
  256. font-size: 3.6vw;
  257. text-align: left;
  258. background: #f4f4f4;
  259. padding-bottom: 30vw;
  260. .tip {
  261. display: flex;
  262. font-size: 3.3vw;
  263. padding: 6vw 4vw;
  264. justify-content: space-between;
  265. align-items: center;
  266. background: white;
  267. .icon {
  268. overflow: hidden;
  269. display: flex;
  270. justify-content: center;
  271. align-items: center;
  272. width: 40px;
  273. height: 40px;
  274. color: #ff865a;
  275. font-size: 6vw;
  276. border-radius: 50%;
  277. background: #fff5f1;
  278. }
  279. .info {
  280. width: calc(100% - 50px);
  281. line-height: 20px;
  282. text-align: left;
  283. .titie {
  284. color: #ff865a;
  285. }
  286. .content {
  287. color: gray;
  288. }
  289. }
  290. }
  291. .step {
  292. margin-top: 3vw;
  293. padding: 4vw 8vw;
  294. padding-right: 4vw;
  295. background: white;
  296. .name {
  297. display: flex;
  298. align-items: center;
  299. font-size: 3.8vw;
  300. padding-bottom: 2vw;
  301. &::before {
  302. content: '';
  303. display: block;
  304. width: 1vw;
  305. height: 1vw;
  306. border: 2px solid #638ee4;
  307. border-radius: 50%;
  308. margin-left: calc(-2vw - 4px);
  309. margin-right: 1vw;
  310. }
  311. }
  312. .title {
  313. display: flex;
  314. justify-content: space-between;
  315. padding: 3vw 0;
  316. .status {
  317. color: #ff865a;
  318. }
  319. .success {
  320. color: #638ee4;
  321. .icon {
  322. font-size: 4vw;
  323. margin-right: 1vw;
  324. }
  325. }
  326. }
  327. .sub_title {
  328. padding: 3vw 0;
  329. color: gray;
  330. }
  331. .step_button {
  332. height: 14vw;
  333. width: 60vw;
  334. margin: auto;
  335. .van-button--info {
  336. background-color: #638ee4;
  337. border: 1px solid #638ee4;
  338. }
  339. }
  340. }
  341. .completed {
  342. position: relative;
  343. margin-top: 3vw;
  344. height: 400px;
  345. @include center();
  346. .van-button--info {
  347. height: 8vh;
  348. width: 75vw;
  349. background-color: #638ee4;
  350. border: 1px solid #638ee4;
  351. }
  352. }
  353. .button {
  354. position: fixed;
  355. left: 0;
  356. right: 0;
  357. bottom: 15vw;
  358. width: 75vw;
  359. height: 14vw;
  360. margin: auto;
  361. .van-button--info {
  362. background-color: #638ee4;
  363. border: 1px solid #638ee4;
  364. }
  365. }
  366. }
  367. </style>