tab2.page.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <ion-header sticky>
  2. <ion-toolbar>
  3. <ion-segment [(ngModel)]="selectedTab" color="primary" class="custom-segment">
  4. <ion-segment-button value="checkin">
  5. <ion-icon aria-hidden="true" name="calendar"></ion-icon>
  6. 打卡
  7. </ion-segment-button>
  8. <ion-segment-button value="plan">
  9. <ion-icon name="checkmark-circle" aria-hidden="true"></ion-icon>
  10. 计划
  11. </ion-segment-button>
  12. <ion-segment-button value="consultation">
  13. <ion-icon name="help-circle" aria-hidden="true"></ion-icon>
  14. 问诊
  15. </ion-segment-button>
  16. </ion-segment>
  17. </ion-toolbar>
  18. </ion-header>
  19. <ion-content [fullscreen]="true">
  20. <div style="height: 56px;"></div>
  21. <!-- 打卡 -->
  22. <div *ngIf="selectedTab === 'checkin'" class="checkin">
  23. <ion-card-content *ngFor="let user of planUser">
  24. <ion-card>
  25. <ion-card-header>
  26. <ion-card-title>欢迎回来!{{ user.get('name') }}</ion-card-title>
  27. </ion-card-header>
  28. <ion-card-content>
  29. <div class="greeting-container">
  30. <!-- 头像和信息容器 -->
  31. <div class="avatar-info-container">
  32. <!-- 头像部分 -->
  33. <div class="avatar-container">
  34. <img [src]="user.get('avater')" alt="用户头像" class="avatar">
  35. </div>
  36. <!-- 用户信息部分 -->
  37. <div class="user-info">
  38. <ion-card>
  39. <ion-card-content>
  40. <p><strong>身高:</strong>{{ user.get('height') }} cm</p>
  41. <p><strong>体重:</strong>{{ user.get('weight') }} kg</p>
  42. <p><strong>BMI:</strong>{{ calculateBMI(user.get('height'), user.get('weight')) }}</p>
  43. <p><strong>运动目标:</strong>{{ user.get('fitnessGoals') }}</p>
  44. </ion-card-content>
  45. </ion-card>
  46. <ion-label>{{ getEncouragement(calculateBMI(user.get('height'), user.get('weight'))) }}</ion-label>
  47. </div>
  48. </div>
  49. </div>
  50. </ion-card-content>
  51. </ion-card>
  52. <ion-card>
  53. <ion-card-header>
  54. <ion-card-title>打卡区域</ion-card-title>
  55. </ion-card-header>
  56. <ion-card-content>
  57. <ion-datetime [value]="realDate.toISOString()" (ionChange)="onDateChange($event)">
  58. </ion-datetime>
  59. <div class="card-info">
  60. <p><strong>已打卡天数:</strong>{{ user.get('days') }}天</p>
  61. <p><strong>连续打卡天数:</strong>{{ user.get('sucdays') }}天</p>
  62. <p><strong>打卡日期:</strong>{{user.get('checkeddays')}}</p>
  63. <ion-button expand="full" (click)="markAttendance()">打卡</ion-button>
  64. </div>
  65. </ion-card-content>
  66. </ion-card>
  67. <ion-card>
  68. <!-- 未登录 -->
  69. @if(!currentUser?.id){
  70. <ion-card-header>
  71. <ion-card-title>请登录</ion-card-title>
  72. <ion-card-subtitle>暂无信息</ion-card-subtitle>
  73. </ion-card-header>
  74. }
  75. <!-- 未登录 -->
  76. @if(currentUser?.id){
  77. <ion-card-header>
  78. <ion-card-title>{{currentUser?.get("username")}} {{currentUser?.get("realname")}}</ion-card-title>
  79. <ion-card-subtitle>性别:{{currentUser?.get("gender")||"-"}} 年龄:{{currentUser?.get("age")||"-"}}
  80. </ion-card-subtitle>
  81. </ion-card-header>
  82. }
  83. <ion-card-content>
  84. @if(!currentUser?.id){
  85. <ion-button expand="block" (click)="signup()">注册</ion-button>
  86. <ion-button expand="block" (click)="login()">登录</ion-button>
  87. }
  88. @if(currentUser?.id){
  89. <ion-button expand="block" (click)="editUser()">编辑资料</ion-button>
  90. <ion-button expand="block" (click)="logout()" color="light">登出</ion-button>
  91. }
  92. </ion-card-content>
  93. </ion-card>
  94. </ion-card-content>
  95. </div>
  96. <!-- 计划 -->
  97. <div *ngIf="selectedTab === 'plan'" class="plan">
  98. <ion-card-content>
  99. <ion-card>
  100. <ion-card-header>
  101. <ion-card-title>我的本周计划</ion-card-title>
  102. </ion-card-header>
  103. <div class="plan-table">
  104. <ion-grid class="table">
  105. <ion-row>
  106. <ion-col size="1.5" class="grid-header">日期</ion-col>
  107. <ion-col size="1.5" class="grid-header">部位</ion-col>
  108. <ion-col size="1.5" class="grid-header">项目1</ion-col>
  109. <ion-col size="2.5" class="grid-header">项目2</ion-col>
  110. <ion-col size="2.5" class="grid-header">项目3</ion-col>
  111. <ion-col size="2.5" class="grid-header">项目4</ion-col>
  112. </ion-row>
  113. <!-- 绑定计划数据 -->
  114. <ion-row *ngFor="let day of planList">
  115. <ion-item-sliding>
  116. <ion-item>
  117. <!-- 显示计划内容 -->
  118. <ion-col size="1" class="plan-column">{{ day.get('date') }}</ion-col>
  119. <ion-col size="1" class="plan-column">{{ day.get('trainingPart') }}</ion-col>
  120. <!-- 显示每个训练项目,确保即使为空也占位 -->
  121. <ion-col size="2.5" *ngFor="let task of day.get('trainingItems'); let i = index" class="plan-column">
  122. <div class="task-container">
  123. <span class="task-item">{{ task.item || '' }}</span>
  124. <span class="sets-reps">{{ task.sets }} x {{ task.reps }}</span>
  125. </div>
  126. </ion-col>
  127. </ion-item>
  128. <!-- 滑动时显示的按钮,设置 side="end" 来将按钮显示在右边 -->
  129. <ion-item-options side="end">
  130. <ion-item-option class="edit-btn" color="primary" shape="round" (click)="editPlan(day)">编辑
  131. </ion-item-option>
  132. <ion-item-option class="delete-btn" color="danger" (click)="deletePlan(day)">删除</ion-item-option>
  133. </ion-item-options>
  134. </ion-item-sliding>
  135. </ion-row>
  136. </ion-grid>
  137. </div>
  138. </ion-card>
  139. <ion-card-subtitle>
  140. <ion-icon name="alert-circle-outline" style="margin-right: 5px;"></ion-icon>左滑行内数据可对计划进行修改哦!
  141. </ion-card-subtitle>
  142. <ion-button expand="full" shape="round" class="reverse" (click)="regeneratePlan()">
  143. <ion-icon name="infinite-outline" style="margin-right:5px ;"></ion-icon>重新生成计划
  144. </ion-button>
  145. </ion-card-content>
  146. </div>
  147. <!-- 问诊 -->
  148. <div *ngIf="selectedTab === 'consultation'" class="consult">
  149. <ion-card-content>
  150. <div
  151. style="width: 95%; margin: auto; height: 110px; display: flex; justify-content: space-between; background-color: #ffffff; border: 1px solid #e7e7db; border-radius: 20px; overflow: hidden;"
  152. (click)="doPoemTask()">
  153. <!-- 左侧内容部分 -->
  154. <div
  155. style="display: flex; flex-direction: column; justify-content: flex-start; margin-top: 23px; margin-left: 40px; position: relative;">
  156. <!-- 品牌动态提示标签 -->
  157. <div
  158. style="position: absolute; padding: 5px; color: #fff; background-color: #009b7d; top: -25px; left: -20px; border-radius: 7px; font-size: 12px;">
  159. 健身动作
  160. </div>
  161. <!-- 标题 -->
  162. <h3>
  163. 一键<span style="color: #6dbdac; font-size: 30px; font-weight: bolder; font-family: SimSun;">生成</span>
  164. </h3>
  165. <!-- 按钮 -->
  166. <div style="color: #fff;">
  167. <ion-button size="small" class="lan">点击了解-></ion-button>
  168. </div>
  169. </div>
  170. <!-- 右侧图片部分 -->
  171. <div>
  172. <img src="../../assets/images/action5.png" style="height: 100px; display: flex; justify-content: flex-end;"
  173. alt="">
  174. </div>
  175. </div>
  176. <!-- 任务区域 -->
  177. <ion-card *ngIf="actionTaskVisible">
  178. <ion-card-header>
  179. <ion-card-title>动作生成</ion-card-title>
  180. </ion-card-header>
  181. <ion-card-content>
  182. <div *ngFor="let step of actionTaskList">
  183. <ion-item>
  184. <ion-icon *ngIf="step.progress === 0 && !step.error" name="radio-button-off-outline"></ion-icon>
  185. <ion-icon *ngIf="step.progress !== 0 && step.progress !== 1" name="reload-outline"></ion-icon>
  186. <ion-icon *ngIf="step.progress === 1" name="checkmark-circle-outline"></ion-icon>
  187. <ion-icon *ngIf="step.error" name="close-circle-outline"></ion-icon>
  188. {{ step.title }}
  189. <span *ngIf="step.progress">{{ step.progress * 100 | number:'2.0-0' }}%</span>
  190. <span *ngIf="step.error" style="color:red;">{{ step.error }}</span>
  191. </ion-item>
  192. </div>
  193. </ion-card-content>
  194. </ion-card>
  195. <!-- 图片展示 -->
  196. <ion-card *ngIf="shareData.images">
  197. <ion-card-header>
  198. <ion-card-title>动作展示</ion-card-title>
  199. </ion-card-header>
  200. <ion-card-content>
  201. <div *ngFor="let imageUrl of shareData.images">
  202. <img [src]="imageUrl" alt="诊断图片" style="width: 100%; height: 400px; object-fit: cover;" />
  203. </div>
  204. </ion-card-content>
  205. </ion-card>
  206. <!-- 诊断结果 -->
  207. <!-- AI教练互动 -->
  208. <ion-card id="coaches">
  209. <ion-card-header>
  210. <ion-card-title>教练简介</ion-card-title>
  211. <ion-card-subtitle>顶级教练</ion-card-subtitle>
  212. </ion-card-header>
  213. <ion-card-content style="padding: 5px;">
  214. <ion-list>
  215. <ion-item *ngFor="let coach of coachList" lines="none">
  216. <ion-thumbnail slot="start">
  217. <img [src]="coach.get('avater') || '../../assets/images/coach1.jpg'" [alt]="coach.get('name')" />
  218. </ion-thumbnail>
  219. <div class="coach-info" style="width: 120px;">
  220. <h3>{{ coach.get('name') }}({{ coach.get('age') }}岁)</h3>
  221. <p>擅长领域:{{ coach.get('specialize')}}</p>
  222. <p>WiseFitness俱乐部</p>
  223. </div>
  224. <div style="margin-left: 10px;">
  225. <ion-button shape="round" size="small" (click)="openInquiry(coach)">
  226. <ion-icon name="logo-gitlab" style="margin-right: 5px;"></ion-icon>
  227. 立即咨询
  228. </ion-button>
  229. </div>
  230. </ion-item>
  231. </ion-list>
  232. </ion-card-content>
  233. </ion-card>
  234. <div
  235. style="width: 95%; margin: auto; height: 110px; display: flex; justify-content: space-between; background-color: #ffffff; border: 1px solid #e7e7db; border-radius: 20px; overflow: hidden;"
  236. (click)="doInqueryTask()">
  237. <!-- 左侧内容部分 -->
  238. <div
  239. style="display: flex; flex-direction: column; justify-content: flex-start; margin-top: 23px; margin-left: 40px; position: relative;">
  240. <!-- 品牌动态提示标签 -->
  241. <div
  242. style="position: absolute; padding: 5px; color: #fff; background-color: #009b7d; top: -25px; left: -20px; border-radius: 7px; font-size: 12px;">
  243. 身体疼痛
  244. </div>
  245. <!-- 标题 -->
  246. <h3>
  247. 一键<span style="color: #6dbdac; font-size: 30px; font-weight: bolder; font-family: SimSun;">诊断</span>
  248. </h3>
  249. <!-- 按钮 -->
  250. <div style="color: #fff;">
  251. <ion-button size="small" class="lan">点击诊断-></ion-button>
  252. </div>
  253. </div>
  254. <!-- 右侧图片部分 -->
  255. <div>
  256. <img src="../../assets/images/battle1.png" style="height: 100px; display: flex; justify-content: flex-end;"
  257. alt="">
  258. </div>
  259. </div>
  260. <ion-card *ngIf="healthTaskVisible">
  261. <ion-card-header>
  262. <ion-card-title>医疗诊断</ion-card-title>
  263. </ion-card-header>
  264. <ion-card-content>
  265. <div *ngFor="let step of healthTaskList">
  266. <ion-item>
  267. <ion-icon *ngIf="step.progress === 0 && !step.error" name="radio-button-off-outline"></ion-icon>
  268. <ion-icon *ngIf="step.progress !== 0 && step.progress !== 1" name="reload-outline"></ion-icon>
  269. <ion-icon *ngIf="step.progress === 1" name="checkmark-circle-outline"></ion-icon>
  270. <ion-icon *ngIf="step.error" name="close-circle-outline"></ion-icon>
  271. {{ step.title }}
  272. <span *ngIf="step.progress">{{ step.progress * 100 | number:'2.0-0' }}%</span>
  273. <span *ngIf="step.error" style="color:red;">{{ step.error }}</span>
  274. </ion-item>
  275. </div>
  276. </ion-card-content>
  277. </ion-card>
  278. <ion-card *ngIf="shareData.diagResult">
  279. <ion-card-header>
  280. <ion-card-title>{{ shareData.diagResult.title }}</ion-card-title>
  281. </ion-card-header>
  282. <ion-card-content>
  283. <h2>{{ shareData.diagResult.desc }}</h2>
  284. <fm-markdown-preview class="content-style" [content]=shareData.diagResult.content>
  285. </fm-markdown-preview>
  286. </ion-card-content>
  287. </ion-card>
  288. </ion-card-content>
  289. </div>
  290. </ion-content>