detail.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <template>
  2. <view class="container">
  3. <view class="loading" v-if="loading">加载中...</view>
  4. <template v-if="record">
  5. <view class="header-card">
  6. <view class="header-top">
  7. <text class="record-title">{{ record.recordTitle || '成长档案' }}</text>
  8. <text class="record-tag" :class="record.status === 'completed' ? 'tag-completed' : 'tag-pending'">
  9. {{ record.status === 'completed' ? '已完成' : '待同步' }}
  10. </text>
  11. </view>
  12. <text class="external-badge" v-if="record.externalSync">来自外部系统</text>
  13. </view>
  14. <view class="info-card">
  15. <text class="card-title">基本信息</text>
  16. <view class="info-row">
  17. <text class="info-label">综合得分</text>
  18. <text class="info-value">{{ record.overallScore != null ? record.overallScore : '暂无' }}</text>
  19. </view>
  20. <view class="info-row" v-if="record.childAge">
  21. <text class="info-label">评估年龄</text>
  22. <text class="info-value">{{ record.childAge }}个月</text>
  23. </view>
  24. <view class="info-row" v-if="record.height">
  25. <text class="info-label">身高</text>
  26. <text class="info-value">{{ record.height }} cm</text>
  27. </view>
  28. <view class="info-row" v-if="record.weight">
  29. <text class="info-label">体重</text>
  30. <text class="info-value">{{ record.weight }} kg</text>
  31. </view>
  32. <view class="info-row" v-if="record.school">
  33. <text class="info-label">学校</text>
  34. <text class="info-value">{{ record.school }}</text>
  35. </view>
  36. <view class="info-row" v-if="record.grade">
  37. <text class="info-label">年级</text>
  38. <text class="info-value">{{ gradeNames[record.grade] || record.grade }}</text>
  39. </view>
  40. <view class="info-row" v-if="record.academicPerformance">
  41. <text class="info-label">成绩表现</text>
  42. <text class="info-value">{{ record.academicPerformance }}</text>
  43. </view>
  44. <view class="info-row" v-if="record.schoolProvince || record.schoolCity || record.schoolDistrict">
  45. <text class="info-label">学校区域</text>
  46. <text class="info-value">{{ (record.schoolProvince||'') + (record.schoolCity||'') + (record.schoolDistrict||'') + (record.schoolStreet||'') }}</text>
  47. </view>
  48. <view class="info-row">
  49. <text class="info-label">创建时间</text>
  50. <text class="info-value">{{ formatDate(record.createdAt) }}</text>
  51. </view>
  52. </view>
  53. <view class="section-card" v-if="record.assessmentSummary">
  54. <text class="card-title">测评摘要</text>
  55. <text class="card-content">{{ record.assessmentSummary }}</text>
  56. <button class="btn-link" v-if="record.assessmentId" @click="viewAssessment">查看完整报告</button>
  57. </view>
  58. <view class="section-card" v-if="record.growthSuggestions">
  59. <text class="card-title">成长建议</text>
  60. <text class="card-content">{{ record.growthSuggestions }}</text>
  61. </view>
  62. <view class="section-card" v-if="record.taskRecommendations">
  63. <text class="card-title">任务推荐</text>
  64. <text class="card-content">{{ record.taskRecommendations }}</text>
  65. </view>
  66. <view class="footer-actions">
  67. <button class="btn-delete" @click="handleDelete">删除档案</button>
  68. </view>
  69. </template>
  70. </view>
  71. </template>
  72. <script>
  73. import { getGrowthRecordDetail, deleteGrowthRecord } from '../../utils/api.js'
  74. export default {
  75. data() {
  76. return {
  77. loading: true,
  78. record: null,
  79. recordId: null,
  80. gradeNames: {1:'一年级',2:'二年级',3:'三年级',4:'四年级',5:'五年级',6:'六年级',7:'初一',8:'初二',9:'初三',10:'高一',11:'高二',12:'高三'}
  81. }
  82. },
  83. onLoad(options) {
  84. this.recordId = options.recordId
  85. this.loadDetail()
  86. },
  87. methods: {
  88. async loadDetail() {
  89. this.loading = true
  90. try {
  91. const res = await getGrowthRecordDetail(this.recordId)
  92. if (res.code === 200) {
  93. this.record = res.data
  94. } else {
  95. uni.showToast({ title: '加载失败', icon: 'none' })
  96. }
  97. } catch (e) {
  98. console.error(e)
  99. uni.showToast({ title: '加载失败', icon: 'none' })
  100. } finally {
  101. this.loading = false
  102. }
  103. },
  104. viewAssessment() {
  105. uni.navigateTo({
  106. url: '/pages/growth/assessment-result?recordId=' + this.recordId + '&assessmentId=' + this.record.assessmentId
  107. })
  108. },
  109. handleDelete() {
  110. uni.showModal({
  111. title: '确认删除',
  112. content: '删除后无法恢复,确定要删除此成长档案吗?',
  113. success: async (res) => {
  114. if (res.confirm) {
  115. uni.showLoading({ title: '删除中...' })
  116. try {
  117. const result = await deleteGrowthRecord(this.recordId)
  118. uni.hideLoading()
  119. if (result.code === 200) {
  120. uni.showToast({ title: '删除成功', icon: 'success' })
  121. setTimeout(() => {
  122. uni.navigateBack()
  123. }, 500)
  124. } else {
  125. uni.showToast({ title: result.message || '删除失败', icon: 'none' })
  126. }
  127. } catch (e) {
  128. uni.hideLoading()
  129. uni.showToast({ title: '删除失败', icon: 'none' })
  130. }
  131. }
  132. }
  133. })
  134. },
  135. formatDate(date) {
  136. if (!date) return ''
  137. return date.substring(0, 19).replace('T', ' ')
  138. }
  139. }
  140. }
  141. </script>
  142. <style scoped>
  143. .container {
  144. padding: 30rpx;
  145. background: #F8F8F8;
  146. min-height: 100vh;
  147. }
  148. .loading {
  149. text-align: center;
  150. padding: 60rpx;
  151. color: #999;
  152. font-size: 28rpx;
  153. }
  154. .header-card {
  155. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  156. border-radius: 20rpx;
  157. padding: 30rpx;
  158. margin-bottom: 20rpx;
  159. }
  160. .header-top {
  161. display: flex;
  162. justify-content: space-between;
  163. align-items: center;
  164. }
  165. .record-title {
  166. font-size: 36rpx;
  167. font-weight: bold;
  168. color: #fff;
  169. }
  170. .record-tag {
  171. font-size: 22rpx;
  172. padding: 6rpx 16rpx;
  173. border-radius: 20rpx;
  174. }
  175. .tag-completed {
  176. background: rgba(255,255,255,0.3);
  177. color: #fff;
  178. }
  179. .tag-pending {
  180. background: rgba(255,152,0,0.3);
  181. color: #fff;
  182. }
  183. .external-badge {
  184. font-size: 22rpx;
  185. color: rgba(255,255,255,0.8);
  186. margin-top: 10rpx;
  187. display: inline-block;
  188. background: rgba(255,255,255,0.2);
  189. padding: 4rpx 12rpx;
  190. border-radius: 10rpx;
  191. }
  192. .info-card, .section-card {
  193. background: #fff;
  194. border-radius: 20rpx;
  195. padding: 30rpx;
  196. margin-bottom: 20rpx;
  197. }
  198. .card-title {
  199. font-size: 30rpx;
  200. font-weight: bold;
  201. color: #333;
  202. display: block;
  203. margin-bottom: 20rpx;
  204. }
  205. .info-row {
  206. display: flex;
  207. justify-content: space-between;
  208. padding: 12rpx 0;
  209. border-bottom: 1rpx solid #f5f5f5;
  210. }
  211. .info-label {
  212. font-size: 28rpx;
  213. color: #999;
  214. }
  215. .info-value {
  216. font-size: 28rpx;
  217. color: #333;
  218. font-weight: bold;
  219. }
  220. .card-content {
  221. font-size: 28rpx;
  222. color: #666;
  223. line-height: 1.6;
  224. display: block;
  225. }
  226. .btn-link {
  227. width: 100%;
  228. height: 60rpx;
  229. line-height: 60rpx;
  230. background: #f0f0ff;
  231. color: #667eea;
  232. border-radius: 10rpx;
  233. font-size: 26rpx;
  234. text-align: center;
  235. margin-top: 20rpx;
  236. }
  237. .footer-actions {
  238. padding: 30rpx 0;
  239. }
  240. .btn-delete {
  241. width: 100%;
  242. height: 80rpx;
  243. line-height: 80rpx;
  244. background: #fff;
  245. color: #ff4444;
  246. border: 2rpx solid #ff4444;
  247. border-radius: 40rpx;
  248. font-size: 28rpx;
  249. text-align: center;
  250. }
  251. </style>