Przeglądaj źródła

fix: 活动/任务/孩子页面日期解析改用 parseDate(iOS 兼容)

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
asus 3 miesięcy temu
rodzic
commit
b1ea909fc2

+ 19 - 12
cfc-frontend/pages/activity/create.vue

@@ -129,6 +129,7 @@
 <script>
 import { adminCreateActivity, adminUpdateActivity, adminPublishActivity, submitActivityForReview, getActivityDetail } from '../../utils/api.js'
 import config from '../../config.js'
+import { parseDate } from '../../utils/format.js'
 
 var BASE_URL = config.api('')
 
@@ -230,22 +231,28 @@ export default {
           self.parentFeeYuan = self.form.parentFee ? (self.form.parentFee / 100).toString() : '0'
           self.parentMemberFeeYuan = self.form.parentMemberFee ? (self.form.parentMemberFee / 100).toString() : '0'
           if (d.startTime) {
-            var sd = new Date(d.startTime.replace ? d.startTime.replace(/-/g, '/') : d.startTime)
-            self.datePart = self.fmtDate(sd)
-            self.timePart = self.fmtTime(sd)
-            self.form.startTime = sd.toISOString()
+            var sd = parseDate(d.startTime)
+            if (sd) {
+              self.datePart = self.fmtDate(sd)
+              self.timePart = self.fmtTime(sd)
+              self.form.startTime = sd.toISOString()
+            }
           }
           if (d.endTime) {
-            var ed = new Date(d.endTime.replace ? d.endTime.replace(/-/g, '/') : d.endTime)
-            self.endDatePart = self.fmtDate(ed)
-            self.endTimePart = self.fmtTime(ed)
-            self.form.endTime = ed.toISOString()
+            var ed = parseDate(d.endTime)
+            if (ed) {
+              self.endDatePart = self.fmtDate(ed)
+              self.endTimePart = self.fmtTime(ed)
+              self.form.endTime = ed.toISOString()
+            }
           }
           if (d.registrationDeadline) {
-            var rd = new Date(d.registrationDeadline.replace ? d.registrationDeadline.replace(/-/g, '/') : d.registrationDeadline)
-            self.regDatePart = self.fmtDate(rd)
-            self.regTimePart = self.fmtTime(rd)
-            self.form.registrationDeadline = rd.toISOString()
+            var rd = parseDate(d.registrationDeadline)
+            if (rd) {
+              self.regDatePart = self.fmtDate(rd)
+              self.regTimePart = self.fmtTime(rd)
+              self.form.registrationDeadline = rd.toISOString()
+            }
           }
           // sync pickers
           for (var i = 0; i < self.dimensionOptions.length; i++) {

+ 7 - 5
cfc-frontend/pages/activity/index.vue

@@ -309,6 +309,7 @@
 <script>
 import { getActivityList, getMyActivityRegistrations, activityCheckin, cancelActivityRegistration, adminListMyActivities, adminPublishActivity, submitActivityForReview } from '@/utils/api.js'
 import config from '@/config.js'
+import { parseDate } from '../../utils/format.js'
 
 export default {
   computed: {
@@ -587,7 +588,8 @@ export default {
             for (var i = 0; i < records.length; i++) {
               var act = records[i]
               if (act.startTime) {
-                var startTime = new Date(act.startTime.replace(/-/g, '/'))
+                var startTime = parseDate(act.startTime)
+                if (!startTime) continue
                 if (startTime > now && act.status === 'approved') {
                   filtered.push(act)
                 }
@@ -664,8 +666,8 @@ export default {
           for (var i = 0; i < records.length; i++) {
             var act = records[i]
             if (act.endTime) {
-              var endTime = new Date(act.endTime.replace(/-/g, '/'))
-              if (endTime < now || act.status === 'cancelled' || act.status === 'rejected') {
+              var endTime = parseDate(act.endTime)
+              if ((endTime && endTime < now) || act.status === 'cancelled' || act.status === 'rejected') {
                 ended.push(act)
               }
             } else {
@@ -711,8 +713,8 @@ export default {
         act._txt = map[act.status] || act.status
       } else {
         if (act.endTime) {
-          var endTime = new Date(act.endTime.replace(/-/g, '/'))
-          if (endTime < new Date()) {
+          var endTime = parseDate(act.endTime)
+          if (endTime && endTime < new Date()) {
             act._cls = 'ended'
             act._txt = '已结束'
             return act

+ 3 - 2
cfc-frontend/pages/activity/registrations.vue

@@ -59,6 +59,7 @@
 
 <script>
 import { adminActivityRegistrationList, adminApproveRegistration, adminRejectRegistration, getActivityDetail } from '@/utils/api.js'
+import { parseDate } from '../../utils/format.js'
 
 export default {
   data() {
@@ -174,8 +175,8 @@ export default {
       if (!v) return ''
       var s = String(v)
       if (s.indexOf('-') < 0 && s.indexOf('/') < 0) return s
-      var d = new Date(s.replace(/-/g, '/'))
-      if (isNaN(d.getTime())) return s
+      var d = parseDate(s)
+      if (!d) return s
       var pad = function(n) { return n < 10 ? '0' + n : '' + n }
       return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes())
     }

+ 7 - 3
cfc-frontend/pages/child/tasks.vue

@@ -127,6 +127,7 @@ import BaseBadge from '@/components/BaseBadge.vue'
 import BaseEmpty from '@/components/BaseEmpty.vue'
 import BaseLoading from '@/components/BaseLoading.vue'
 import { getTodayTasks, completeTask as completeTaskApi, getChildren, switchBackToParent, verifyPassword } from '../../utils/api.js'
+import { parseDate } from '../../utils/format.js'
 
 export default {
   components: { PlayfulButton, BaseBadge, BaseEmpty, BaseLoading },
@@ -292,7 +293,8 @@ export default {
     getTimeLeft(task) {
       var deadline, now, diff, hours, minutes, days
       if (!task.deadline) return '无截止时间'
-      deadline = new Date(task.deadline)
+      deadline = parseDate(task.deadline)
+      if (!deadline) return ''
       now = new Date()
       diff = deadline - now
       if (diff < 0) return ''
@@ -310,14 +312,16 @@ export default {
       var deadline, now
       if (task.status === 'completed') return false
       if (!task.deadline) return false
-      deadline = new Date(task.deadline)
+      deadline = parseDate(task.deadline)
+      if (!deadline) return false
       now = new Date()
       return deadline < now
     },
     getOverdueDays(task) {
       var deadline, now, diff, days, hours
       if (!task.deadline) return ''
-      deadline = new Date(task.deadline)
+      deadline = parseDate(task.deadline)
+      if (!deadline) return ''
       now = new Date()
       diff = now - deadline
       days = Math.floor(diff / (1000 * 60 * 60 * 24))

+ 3 - 1
cfc-frontend/pages/games/records.vue

@@ -49,6 +49,7 @@
 
 <script>
 import { getGameHistory } from '../../utils/api.js'
+import { parseDate } from '../../utils/format.js'
 
 export default {
   data() {
@@ -114,7 +115,8 @@ export default {
     },
     formatTime(dateStr) {
       if (!dateStr) return ''
-      const d = new Date(dateStr)
+      const d = parseDate(dateStr)
+      if (!d) return ''
       const month = (d.getMonth() + 1).toString().padStart(2, '0')
       const day = d.getDate().toString().padStart(2, '0')
       const hour = d.getHours().toString().padStart(2, '0')

+ 3 - 1
cfc-frontend/pages/tasks/tasks.vue

@@ -191,6 +191,7 @@
 
 <script>
 import { getTodayTasks, completeTask as completeTaskApi, createTask as createTaskApi, getChildren, getTodayParentTasks, completeParentTask as completeParentTaskApi, batchCompleteTasks, batchDeleteTasks } from '../../utils/api.js'
+import { parseDate } from '../../utils/format.js'
 import PlayfulCard from '@/components/PlayfulCard.vue'
 
 export default {
@@ -443,7 +444,8 @@ export default {
     },
     formatTime(dateStr) {
       if (!dateStr) return ''
-      const date = new Date(dateStr)
+      const date = parseDate(dateStr)
+      if (!date) return ''
       return `${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`
     },
     enterBatchMode() {

+ 3 - 1
cfc-frontend/pages/wisdom/index.vue

@@ -155,6 +155,7 @@ import ArticleBookshelf from '../../components/ArticleBookshelf.vue'
 import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import FamilyMemberStrip from '../../components/FamilyMemberStrip.vue'
 import { getVisibleSections, getChildren, getTodayTasksByCategory, getActivityList, getProductsByDomain, getFamilyEnergySandbox, getAssessmentLatestResult, getFeaturedArticles, getDanReportByChild } from '../../utils/api.js'
+import { parseDate } from '../../utils/format.js'
 
 export default {
   components: { TabTransition, PageBanner, LoginGuideCard, RadarChart, FamilyEnergyBar, DimensionTasks, DimensionActivities, DimensionProducts, ArticleBookshelf, AIFloatingAvatar, FamilyMemberStrip },
@@ -486,7 +487,8 @@ export default {
     },
     formatDate: function(dateStr) {
       if (!dateStr) return ''
-      var d = new Date(dateStr)
+      var d = parseDate(dateStr)
+      if (!d) return ''
       return d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()
     }
   }