Explorar o código

feat: 将人才小程序 UI 包代码整合回主目录

将 7 个 rencai-* UI 包的代码复制回 mini-talent/ 目录,
恢复 Taro 原生热重载能力。

变更内容:
- 复制 7 个 API 客户端到 src/api/
- 复制 21 个组件到 src/components/
- 复制 2 个工具函数到 src/utils/
- 复制 3 个类型文件到 src/types/
- 复制 useAuth hook 到 src/hooks/
- 替换 7 个页面文件(移除桥接层)
- 移除 package.json 中 7 个 @d8d/rencai-* 依赖
- 修正所有导入路径为相对路径

验证结果:
- ✅ AC 9: package.json 无 rencai 依赖
- ✅ AC 13: 源码无 rencai 包导入
- ✅ 文件结构: 7 API, 21 组件, 2 工具, 3 类型

Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname hai 2 días
pai
achega
5ba9070a0a
Modificáronse 45 ficheiros con 3612 adicións e 136 borrados
  1. 0 7
      mini-talent/package.json
  2. 6 0
      mini-talent/src/api/index.ts
  3. 9 0
      mini-talent/src/api/talentAttendanceClient.ts
  4. 7 0
      mini-talent/src/api/talentAuthClient.ts
  5. 7 0
      mini-talent/src/api/talentDashboardClient.ts
  6. 7 0
      mini-talent/src/api/talentEmploymentClient.ts
  7. 7 0
      mini-talent/src/api/talentPersonalInfoClient.ts
  8. 7 0
      mini-talent/src/api/talentSettingsClient.ts
  9. 1 1
      mini-talent/src/app.tsx
  10. 110 0
      mini-talent/src/components/AttendanceCalendar.tsx
  11. 23 0
      mini-talent/src/components/AttendanceDetails.tsx
  12. 81 0
      mini-talent/src/components/AttendanceRecordItem.tsx
  13. 32 0
      mini-talent/src/components/AttendanceStats.tsx
  14. 54 0
      mini-talent/src/components/BankCardInfo.tsx
  15. 66 0
      mini-talent/src/components/BankCardItem.tsx
  16. 90 0
      mini-talent/src/components/CurrentEmploymentStatus.tsx
  17. 61 0
      mini-talent/src/components/DocumentPhotoItem.tsx
  18. 50 0
      mini-talent/src/components/DocumentPhotos.tsx
  19. 56 0
      mini-talent/src/components/EmploymentHistory.tsx
  20. 34 0
      mini-talent/src/components/EmploymentHistoryItem.tsx
  21. 38 0
      mini-talent/src/components/LogoutButton.tsx
  22. 48 0
      mini-talent/src/components/MenuItem.tsx
  23. 44 0
      mini-talent/src/components/MenuSection.tsx
  24. 80 0
      mini-talent/src/components/MonthSelector.tsx
  25. 148 0
      mini-talent/src/components/PersonalBasicInfo.tsx
  26. 78 0
      mini-talent/src/components/RencaiTabBarLayout.tsx
  27. 30 0
      mini-talent/src/components/SalaryRecordItem.tsx
  28. 86 0
      mini-talent/src/components/SalaryRecords.tsx
  29. 80 0
      mini-talent/src/components/UserInfoHeader.tsx
  30. 61 0
      mini-talent/src/components/UserProfileSummary.tsx
  31. 1 0
      mini-talent/src/hooks/index.ts
  32. 195 0
      mini-talent/src/hooks/useAuth.tsx
  33. 120 1
      mini-talent/src/pages/account-security/index.tsx
  34. 121 2
      mini-talent/src/pages/attendance/index.tsx
  35. 176 2
      mini-talent/src/pages/employment/index.tsx
  36. 325 2
      mini-talent/src/pages/index/index.tsx
  37. 157 3
      mini-talent/src/pages/login/index.tsx
  38. 145 2
      mini-talent/src/pages/personal-info/index.tsx
  39. 253 2
      mini-talent/src/pages/settings/index.tsx
  40. 76 0
      mini-talent/src/types/attendance.ts
  41. 86 0
      mini-talent/src/types/employment.ts
  42. 73 0
      mini-talent/src/types/settings.ts
  43. 30 0
      mini-talent/src/utils/maskUtils.ts
  44. 143 0
      mini-talent/src/utils/mockAttendanceData.ts
  45. 310 114
      pnpm-lock.yaml

+ 0 - 7
mini-talent/package.json

@@ -53,13 +53,6 @@
   "dependencies": {
     "@babel/runtime": "^7.24.4",
     "@d8d/mini-shared-ui-components": "workspace:*",
-    "@d8d/rencai-auth-ui": "workspace:*",
-    "@d8d/rencai-dashboard-ui": "workspace:*",
-    "@d8d/rencai-personal-info-ui": "workspace:*",
-    "@d8d/rencai-attendance-ui": "workspace:*",
-    "@d8d/rencai-employment-ui": "workspace:*",
-    "@d8d/rencai-settings-ui": "workspace:*",
-    "@d8d/rencai-shared-ui": "workspace:*",
     "@hookform/resolvers": "^5.2.1",
     "@radix-ui/react-slot": "^1.2.3",
     "@tanstack/react-query": "^5.90.12",

+ 6 - 0
mini-talent/src/api/index.ts

@@ -0,0 +1,6 @@
+export { talentAuthClient } from './talentAuthClient'
+export { talentDashboardClient } from './talentDashboardClient'
+export { talentPersonalInfoClient } from './talentPersonalInfoClient'
+export { talentAttendanceClient } from './talentAttendanceClient'
+export { talentEmploymentClient } from './talentEmploymentClient'
+export { talentSettingsClient } from './talentSettingsClient'

+ 9 - 0
mini-talent/src/api/talentAttendanceClient.ts

@@ -0,0 +1,9 @@
+// 人才考勤记录API客户端
+// 注意: 考勤记录API为P2延期功能,当前为前端模拟实现
+// 待史诗015后续故事实现后端API后再集成
+
+// 路径前缀: /api/v1/rencai (待实现)
+export const talentAttendanceClient = {
+  // 考勤API将在史诗015后续故事中实现
+  // 当前使用前端模拟数据
+};

+ 7 - 0
mini-talent/src/api/talentAuthClient.ts

@@ -0,0 +1,7 @@
+import { rencaiAuthRoutes } from '@d8d/core-module/auth-module/routes';
+import { rpcClient } from '@d8d/mini-shared-ui-components/utils/rpc/rpc-client';
+
+// 人才用户认证API客户端
+// 支持手机号/身份证号/残疾证号登录
+// 路径前缀: /api/v1/rencai/auth
+export const talentAuthClient = rpcClient<typeof rencaiAuthRoutes>('/api/v1/rencai/auth');

+ 7 - 0
mini-talent/src/api/talentDashboardClient.ts

@@ -0,0 +1,7 @@
+// @ts-ignore
+import type { talentPersonalInfoRoutes } from '@d8d/allin-disability-module';
+import { rpcClient } from '@d8d/mini-shared-ui-components/utils/rpc/rpc-client';
+
+// 人才仪表板API客户端 - 聚合个人信息
+// 路径前缀: /api/v1/rencai
+export const talentDashboardClient = rpcClient<typeof talentPersonalInfoRoutes>('/api/v1/rencai');

+ 7 - 0
mini-talent/src/api/talentEmploymentClient.ts

@@ -0,0 +1,7 @@
+// @ts-ignore
+import type { talentEmploymentRoutes } from '@d8d/allin-order-module';
+import { rpcClient } from '@d8d/mini-shared-ui-components/utils/rpc/rpc-client';
+
+// 人才就业信息API客户端
+// 路径前缀: /api/v1/rencai
+export const talentEmploymentClient = rpcClient<typeof talentEmploymentRoutes>('/api/v1/rencai');

+ 7 - 0
mini-talent/src/api/talentPersonalInfoClient.ts

@@ -0,0 +1,7 @@
+// @ts-ignore
+import type { talentPersonalInfoRoutes } from '@d8d/allin-disability-module';
+import { rpcClient } from '@d8d/mini-shared-ui-components/utils/rpc/rpc-client';
+
+// 人才个人信息API客户端
+// 路径前缀: /api/v1/rencai
+export const talentPersonalInfoClient = rpcClient<typeof talentPersonalInfoRoutes>('/api/v1/rencai');

+ 7 - 0
mini-talent/src/api/talentSettingsClient.ts

@@ -0,0 +1,7 @@
+import { rencaiAuthRoutes } from '@d8d/core-module/auth-module/routes';
+import { rpcClient } from '@d8d/mini-shared-ui-components/utils/rpc/rpc-client';
+
+// 人才设置页API客户端
+// 复用认证API: 退出登录、获取用户信息
+// 路径前缀: /api/v1/rencai/auth
+export const talentSettingsClient = rpcClient<typeof rencaiAuthRoutes>('/api/v1/rencai/auth');

+ 1 - 1
mini-talent/src/app.tsx

@@ -2,7 +2,7 @@ import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
 // import '@/utils/headers-polyfill.js'
 import { PropsWithChildren } from 'react'
 import { QueryClientProvider } from '@tanstack/react-query'
-import { AuthProvider, queryClient } from '@d8d/rencai-auth-ui/hooks'
+import { AuthProvider, queryClient } from './hooks'
 
 import './app.css'
 

+ 110 - 0
mini-talent/src/components/AttendanceCalendar.tsx

@@ -0,0 +1,110 @@
+/**
+ * 考勤日历组件
+ * 显示当前月份的日历视图,标记打卡状态
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { AttendanceCalendarProps } from '../types/attendance'
+
+/**
+ * 获取指定月份的日期网格
+ */
+function getCalendarDates(year: number, month: number): (Date | null)[] {
+  const dates: (Date | null)[] = []
+  const firstDay = new Date(year, month - 1, 1)
+  const lastDay = new Date(year, month, 0)
+  const firstDayOfWeek = firstDay.getDay()
+  const daysInMonth = lastDay.getDate()
+
+  // 填充月初空白
+  for (let i = 0; i < firstDayOfWeek; i++) {
+    dates.push(null)
+  }
+
+  // 填充日期
+  for (let day = 1; day <= daysInMonth; day++) {
+    dates.push(new Date(year, month - 1, day))
+  }
+
+  return dates
+}
+
+/**
+ * 判断是否为周末
+ */
+function isWeekend(date: Date): boolean {
+  const day = date.getDay()
+  return day === 0 || day === 6
+}
+
+/**
+ * 格式化日期为 YYYY-MM-DD
+ */
+function formatDate(date: Date): string {
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
+/**
+ * 检查日期是否有打卡记录
+ */
+function hasAttendanceRecord(date: Date, records: any[]): boolean {
+  const dateStr = formatDate(date)
+  return records.some(r => r.date === dateStr && r.checkInTime !== '--:--')
+}
+
+export const AttendanceCalendar: React.FC<AttendanceCalendarProps> = ({
+  year,
+  month,
+  attendanceRecords
+}) => {
+  const dates = getCalendarDates(year, month)
+
+  return (
+    <View className="bg-white rounded-lg p-4 mb-4 mx-4 flex flex-col">
+      <Text className="font-semibold text-gray-700 mb-3 text-base">考勤日历</Text>
+
+      {/* 星期标题 */}
+      <View className="grid grid-cols-7 gap-1 mb-2">
+        <View className="text-center text-xs text-gray-500"><Text>日</Text></View>
+        <View className="text-center text-xs text-gray-500"><Text>一</Text></View>
+        <View className="text-center text-xs text-gray-500"><Text>二</Text></View>
+        <View className="text-center text-xs text-gray-500"><Text>三</Text></View>
+        <View className="text-center text-xs text-gray-500"><Text>四</Text></View>
+        <View className="text-center text-xs text-gray-500"><Text>五</Text></View>
+        <View className="text-center text-xs text-gray-500"><Text>六</Text></View>
+      </View>
+
+      {/* 日期网格 */}
+      <View className="grid grid-cols-7 gap-1">
+        {dates.map((date, index) => {
+          if (!date) {
+            return <View key={`empty-${index}`} className="p-2" />
+          }
+
+          const attended = hasAttendanceRecord(date, attendanceRecords)
+          const weekend = isWeekend(date)
+
+          return (
+            <View
+              key={date.toISOString()}
+              className={`
+                text-center
+                p-2
+                rounded-full
+                ${attended ? 'bg-green-500' : 'bg-gray-200'}
+                ${weekend && !attended ? 'text-gray-400' : ''}
+              `}
+            >
+              <Text className={`text-sm ${attended ? 'text-white' : ''}`}>
+                {date.getDate()}
+              </Text>
+            </View>
+          )
+        })}
+      </View>
+    </View>
+  )
+}

+ 23 - 0
mini-talent/src/components/AttendanceDetails.tsx

@@ -0,0 +1,23 @@
+/**
+ * 打卡明细列表组件
+ * 显示打卡记录列表,按日期倒序排列
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { AttendanceDetailsProps } from '../types/attendance'
+import { AttendanceRecordItem } from './AttendanceRecordItem'
+
+export const AttendanceDetails: React.FC<AttendanceDetailsProps> = ({ records }) => {
+  return (
+    <View className="bg-white rounded-lg p-4 mb-4 mx-4 flex flex-col">
+      <Text className="font-semibold text-gray-700 mb-3 text-base">打卡明细</Text>
+
+      {/* 列表容器 - 垂直布局 */}
+      <View className="flex flex-col space-y-3">
+        {records.map((record) => (
+          <AttendanceRecordItem key={record.date} record={record} />
+        ))}
+      </View>
+    </View>
+  )
+}

+ 81 - 0
mini-talent/src/components/AttendanceRecordItem.tsx

@@ -0,0 +1,81 @@
+/**
+ * 打卡记录项组件
+ * 显示单条打卡记录的详细信息
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { AttendanceRecordItemProps, AttendanceStatus } from '../types/attendance'
+
+/**
+ * 获取状态颜色
+ */
+function getStatusColor(status: AttendanceStatus): string {
+  switch (status) {
+    case AttendanceStatus.NORMAL:
+      return 'bg-green-100 text-green-800'
+    case AttendanceStatus.LATE:
+      return 'bg-yellow-100 text-yellow-800'
+    case AttendanceStatus.EARLY_LEAVE:
+      return 'bg-orange-100 text-orange-800'
+    case AttendanceStatus.ABSENT:
+      return 'bg-red-100 text-red-800'
+    default:
+      return 'bg-gray-100 text-gray-800'
+  }
+}
+
+/**
+ * 获取状态标签
+ */
+function getStatusLabel(status: AttendanceStatus): string {
+  switch (status) {
+    case AttendanceStatus.NORMAL:
+      return '正常'
+    case AttendanceStatus.LATE:
+      return '迟到'
+    case AttendanceStatus.EARLY_LEAVE:
+      return '早退'
+    case AttendanceStatus.ABSENT:
+      return '缺勤'
+    default:
+      return '未知'
+  }
+}
+
+export const AttendanceRecordItem: React.FC<AttendanceRecordItemProps> = ({ record }) => {
+  const statusColor = getStatusColor(record.status)
+  const statusLabel = getStatusLabel(record.status)
+
+  // 格式化日期显示
+  const dateDisplay = formatChineseDate(record.date)
+
+  return (
+    <View className="flex justify-between items-center p-3 border border-gray-100 rounded-lg">
+      {/* 左侧:日期和时间 */}
+      <View className="flex flex-col">
+        <Text className="text-sm font-medium text-gray-800">{dateDisplay} {record.weekday}</Text>
+        <View className="flex text-xs text-gray-500 mt-1">
+          <Text className="mr-3">上班: {record.checkInTime}</Text>
+          <Text>下班: {record.checkOutTime}</Text>
+        </View>
+      </View>
+
+      {/* 右侧:状态标签 */}
+      <View className={`text-xs px-2 py-1 rounded-full ${statusColor}`}>
+        <Text>{statusLabel}</Text>
+      </View>
+    </View>
+  )
+}
+
+/**
+ * 格式化日期为中文格式
+ * @param dateStr YYYY-MM-DD格式日期
+ * @returns 中文格式日期(如:11月25日)
+ */
+function formatChineseDate(dateStr: string): string {
+  const date = new Date(dateStr)
+  const month = date.getMonth() + 1
+  const day = date.getDate()
+  return `${month}月${day}日`
+}

+ 32 - 0
mini-talent/src/components/AttendanceStats.tsx

@@ -0,0 +1,32 @@
+/**
+ * 考勤统计卡片组件
+ * 显示出勤率、正常出勤天数、异常统计
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { AttendanceStatsProps } from '../types/attendance'
+
+export const AttendanceStats: React.FC<AttendanceStatsProps> = ({ stats }) => {
+  return (
+    <View className="bg-white rounded-lg p-4 mb-4 mx-4 flex flex-col">
+      {/* 两列统计布局 */}
+      <View className="flex justify-between items-center mb-4">
+        <View className="flex flex-col">
+          <Text className="text-gray-700 text-sm">出勤率</Text>
+          <Text className="text-2xl font-bold text-gray-800">{stats.attendanceRate}%</Text>
+        </View>
+        <View className="flex flex-col text-right">
+          <Text className="text-gray-700 text-sm">正常出勤</Text>
+          <Text className="text-2xl font-bold text-gray-800">{stats.normalDays}天</Text>
+        </View>
+      </View>
+
+      {/* 异常统计 */}
+      <View className="flex justify-between text-xs text-gray-500">
+        <Text>迟到: {stats.lateCount}次</Text>
+        <Text>早退: {stats.earlyLeaveCount}次</Text>
+        <Text>缺勤: {stats.absentCount}次</Text>
+      </View>
+    </View>
+  )
+}

+ 54 - 0
mini-talent/src/components/BankCardInfo.tsx

@@ -0,0 +1,54 @@
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import BankCardItem, { BankCardInfo } from './BankCardItem'
+
+interface BankCardInfoProps {
+  bankCards: BankCardInfo[] | null
+  loading: boolean
+}
+
+/**
+ * 银行卡信息卡片组件
+ * 支持多张银行卡的列表展示
+ */
+const BankCardInfo: React.FC<BankCardInfoProps> = ({ bankCards, loading }) => {
+  if (loading) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+        <View className="h-5 bg-gray-200 rounded w-24 mb-4 animate-pulse" />
+        <View className="space-y-3">
+          {[1, 2].map((i) => (
+            <View key={i} className="border-b border-gray-100 py-3">
+              <View className="h-4 bg-gray-200 rounded w-3/4 mb-2 animate-pulse" />
+              <View className="h-4 bg-gray-200 rounded w-1/2 animate-pulse" />
+            </View>
+          ))}
+        </View>
+      </View>
+    )
+  }
+
+  if (!bankCards || bankCards.length === 0) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+        <Text className="text-base font-semibold text-gray-800 mb-4">银行卡信息</Text>
+        <Text className="text-gray-500 text-sm">暂无银行卡信息</Text>
+      </View>
+    )
+  }
+
+  return (
+    <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+      {/* 标题 */}
+      <Text className="text-base font-semibold text-gray-700 mb-3">银行卡信息</Text>
+
+      <View>
+        {bankCards.map((bankCard) => (
+          <BankCardItem key={bankCard.id} bankCard={bankCard} />
+        ))}
+      </View>
+    </View>
+  )
+}
+
+export default BankCardInfo

+ 66 - 0
mini-talent/src/components/BankCardItem.tsx

@@ -0,0 +1,66 @@
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { maskCardNumber } from '../utils/maskUtils'
+
+/**
+ * 银行卡信息类型(从RPC推断)
+ */
+export interface BankCardInfo {
+  id: number
+  subBankName: string
+  bankName: string | null
+  cardNumber: string
+  cardholderName: string
+  cardType: string | null
+  isDefault: number
+  fileUrl: string | null
+}
+
+interface BankCardItemProps {
+  bankCard: BankCardInfo
+}
+
+/**
+ * 银行卡列表项组件
+ * 显示:银行名称、卡号脱敏、卡类型、是否默认
+ */
+const BankCardItem: React.FC<BankCardItemProps> = ({ bankCard }) => {
+  return (
+    <View className="bg-blue-50 rounded-lg p-4 mb-3 last:mb-0">
+      <View className="flex flex-col">
+        {/* 第一行:银行名称和默认标签 */}
+        <View className="flex justify-between items-center mb-2">
+          <Text className="font-medium text-gray-800">
+            {bankCard.bankName || bankCard.subBankName}
+          </Text>
+          {bankCard.isDefault === 1 && (
+            <View className="bg-blue-100 px-2 py-1 rounded-full">
+              <Text className="text-xs text-blue-800">默认</Text>
+            </View>
+          )}
+        </View>
+
+        {/* 第二行:卡类型 */}
+        {bankCard.cardType && (
+          <View className="mb-1">
+            <Text className="text-sm text-gray-600">{bankCard.cardType}</Text>
+          </View>
+        )}
+
+        {/* 第三行:卡号 (大号加粗) */}
+        <View className="mb-1">
+          <Text className="text-lg font-bold text-gray-800">
+            {maskCardNumber(bankCard.cardNumber)}
+          </Text>
+        </View>
+
+        {/* 第四行:持卡人姓名 */}
+        <View className="mt-2">
+          <Text className="text-sm text-gray-600">持卡人:{bankCard.cardholderName}</Text>
+        </View>
+      </View>
+    </View>
+  )
+}
+
+export default BankCardItem

+ 90 - 0
mini-talent/src/components/CurrentEmploymentStatus.tsx

@@ -0,0 +1,90 @@
+/**
+ * 当前就业状态卡片组件
+ * 显示企业信息、工作状态、入职日期等
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { CurrentEmploymentStatus as CurrentEmploymentStatusType, WorkStatus, WorkStatusLabels } from '../types/employment'
+
+interface CurrentEmploymentStatusProps {
+  status: CurrentEmploymentStatusType | null
+  loading?: boolean
+}
+
+export const CurrentEmploymentStatus: React.FC<CurrentEmploymentStatusProps> = ({ status, loading }) => {
+  if (loading) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-4">
+        <Text className="font-semibold text-gray-700">当前就业状态</Text>
+        <View className="flex items-center justify-center py-8">
+          <Text className="text-gray-400">加载中...</Text>
+        </View>
+      </View>
+    )
+  }
+
+  if (!status) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-4">
+        <Text className="font-semibold text-gray-700 mb-3">当前就业状态</Text>
+        <View className="flex flex-col items-center justify-center py-8">
+          {/* 未就业图标 - Heroicons briefcase */}
+          <View className="i-heroicons-briefcase-20-solid text-gray-300 w-12 h-12 mb-3" />
+          <Text className="text-gray-500 font-medium mb-1">暂无就业信息</Text>
+          <Text className="text-gray-400 text-sm">您还没有被分配到任何订单</Text>
+        </View>
+      </View>
+    )
+  }
+
+  const isCurrentWorking = status.workStatus === WorkStatus.WORKING
+  const statusBgColor = isCurrentWorking ? 'bg-green-100' : 'bg-gray-100'
+  const statusTextColor = isCurrentWorking ? 'text-green-800' : 'text-gray-800'
+
+  return (
+    <View className="bg-white rounded-lg p-4 mb-4">
+      <Text className="font-semibold text-gray-700 mb-3">当前就业状态</Text>
+
+      {/* 企业图标和名称 */}
+      <View className="flex items-center mb-4">
+        {/* 企业图标 - Heroicons building */}
+        <View className="w-12 h-12 rounded-full bg-blue-100 flex items-center justify-center mr-3">
+          <View className="i-heroicons-building-office-2-20-solid text-blue-500 w-6 h-6" />
+        </View>
+        <View className="flex flex-col">
+          <Text className="font-medium text-gray-800">{status.companyName}</Text>
+          <Text className="text-sm text-gray-500">{status.orderName || status.positionName || '未知岗位'}</Text>
+        </View>
+      </View>
+
+      {/* 2列网格信息 */}
+      <View className="grid grid-cols-2 gap-3 text-sm">
+        {/* 入职日期 */}
+        <View className="flex flex-col">
+          <Text className="text-gray-500">入职日期</Text>
+          <Text className="text-gray-800">{status.joinDate}</Text>
+        </View>
+
+        {/* 工作状态 */}
+        <View className="flex flex-col">
+          <Text className="text-gray-500">工作状态</Text>
+          <View className={`${statusBgColor} ${statusTextColor} text-xs px-2 py-1 rounded-self-start`}>
+            <Text>{WorkStatusLabels[status.workStatus]}</Text>
+          </View>
+        </View>
+
+        {/* 订单编号 */}
+        <View className="flex flex-col">
+          <Text className="text-gray-500">订单编号</Text>
+          <Text className="text-gray-800">#{status.orderId}</Text>
+        </View>
+
+        {/* 薪资水平 */}
+        <View className="flex flex-col">
+          <Text className="text-gray-500">薪资水平</Text>
+          <Text className="text-gray-800">¥{status.salaryLevel.toLocaleString()}/月</Text>
+        </View>
+      </View>
+    </View>
+  )
+}

+ 61 - 0
mini-talent/src/components/DocumentPhotoItem.tsx

@@ -0,0 +1,61 @@
+import React from 'react'
+import { View, Text, Image } from '@tarojs/components'
+import Taro from '@tarojs/taro'
+
+/**
+ * 证件照片信息类型(从RPC推断)
+ */
+export interface PhotoInfo {
+  id: number
+  photoType: string
+  fileUrl: string | null
+  fileName: string | null
+  uploadTime: string
+  canDownload: number
+}
+
+interface DocumentPhotoItemProps {
+  photo: PhotoInfo
+}
+
+/**
+ * 证件照片列表项组件
+ * 支持点击照片预览功能
+ */
+const DocumentPhotoItem: React.FC<DocumentPhotoItemProps> = ({ photo }) => {
+  const handlePreview = () => {
+    if (!photo.fileUrl) return
+
+    Taro.previewImage({
+      current: photo.fileUrl,
+      urls: [photo.fileUrl]
+    })
+  }
+
+  return (
+    <View
+      onClick={handlePreview}
+      className="border border-gray-200 rounded-lg p-3 text-center cursor-pointer"
+    >
+      <View className="w-full aspect-square bg-gray-100 rounded-lg overflow-hidden mx-auto mb-2">
+        {photo.fileUrl ? (
+          <Image
+            src={photo.fileUrl}
+            mode="aspectFill"
+            className="w-full h-full"
+            lazyLoad
+          />
+        ) : (
+          <View className="w-full h-full flex items-center justify-center">
+            <View className="i-heroicons-document-20-solid text-gray-400 text-2xl" />
+          </View>
+        )}
+      </View>
+      <Text className="text-xs text-gray-600 text-center line-clamp-1">
+        {photo.photoType || photo.fileName || '未知'}
+      </Text>
+    </View>
+  )
+}
+
+export default DocumentPhotoItem

+ 50 - 0
mini-talent/src/components/DocumentPhotos.tsx

@@ -0,0 +1,50 @@
+import React from 'react'
+import { View, Text, ScrollView } from '@tarojs/components'
+import DocumentPhotoItem, { PhotoInfo } from './DocumentPhotoItem'
+
+interface DocumentPhotosProps {
+  photos: PhotoInfo[] | null
+  loading: boolean
+}
+
+/**
+ * 证件照片卡片组件
+ * 网格布局展示证件照片
+ */
+const DocumentPhotos: React.FC<DocumentPhotosProps> = ({ photos, loading }) => {
+  if (loading) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+        <View className="h-5 bg-gray-200 rounded w-24 mb-4 animate-pulse" />
+        <View className="grid grid-cols-2 gap-3">
+          {[1, 2, 3, 4].map((i) => (
+            <View key={i} className="aspect-square bg-gray-200 rounded-lg animate-pulse" />
+          ))}
+        </View>
+      </View>
+    )
+  }
+
+  if (!photos || photos.length === 0) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+        <Text className="text-base font-semibold text-gray-800 mb-4">证件照片</Text>
+        <Text className="text-gray-500 text-sm">暂无证件照片</Text>
+      </View>
+    )
+  }
+
+  return (
+    <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+      <Text className="text-base font-semibold text-gray-800 mb-4">证件照片</Text>
+
+      <View className="grid grid-cols-2 gap-3">
+        {photos.map((photo) => (
+          <DocumentPhotoItem key={photo.id} photo={photo} />
+        ))}
+      </View>
+    </View>
+  )
+}
+
+export default DocumentPhotos

+ 56 - 0
mini-talent/src/components/EmploymentHistory.tsx

@@ -0,0 +1,56 @@
+/**
+ * 就业历史卡片组件
+ * 显示就业历史时间线
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { EmploymentHistoryItem } from '../types/employment'
+import { EmploymentHistoryItemComponent } from './EmploymentHistoryItem'
+
+interface EmploymentHistoryProps {
+  history: EmploymentHistoryItem[]
+  loading?: boolean
+}
+
+export const EmploymentHistory: React.FC<EmploymentHistoryProps> = ({ history, loading }) => {
+  if (loading) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-4">
+        <Text className="font-semibold text-gray-700 mb-3">就业历史</Text>
+        <View className="flex items-center justify-center py-8">
+          <Text className="text-gray-400">加载中...</Text>
+        </View>
+      </View>
+    )
+  }
+
+  if (!history || history.length === 0) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-4">
+        <Text className="font-semibold text-gray-700 mb-3">就业历史</Text>
+        <View className="flex flex-col items-center justify-center py-8">
+          {/* 暂无就业历史图标 - Heroicons clock */}
+          <View className="i-heroicons-clock-20-solid text-gray-300 w-12 h-12 mb-3" />
+          <Text className="text-gray-500 font-medium mb-1">暂无就业历史</Text>
+          <Text className="text-gray-400 text-sm">还没有任何就业记录</Text>
+        </View>
+      </View>
+    )
+  }
+
+  return (
+    <View className="bg-white rounded-lg p-4 mb-4">
+      <Text className="font-semibold text-gray-700 mb-3">就业历史</Text>
+
+      <View className="flex flex-col space-y-4">
+        {history.map((item, index) => (
+          <EmploymentHistoryItemComponent
+            key={`${item.orderId}-${index}`}
+            item={item}
+            isLast={index === history.length - 1}
+          />
+        ))}
+      </View>
+    </View>
+  )
+}

+ 34 - 0
mini-talent/src/components/EmploymentHistoryItem.tsx

@@ -0,0 +1,34 @@
+/**
+ * 就业历史项组件
+ * 显示单条就业历史,带时间线样式
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { EmploymentHistoryItem, WorkStatus, isCurrentWork, formatDateRange } from '../types/employment'
+
+interface EmploymentHistoryItemProps {
+  item: EmploymentHistoryItem
+  isLast: boolean
+}
+
+export const EmploymentHistoryItemComponent: React.FC<EmploymentHistoryItemProps> = ({ item, isLast }) => {
+  const currentWork = isCurrentWork(item.workStatus)
+  const dotColor = currentWork ? 'bg-blue-500' : 'bg-gray-400'
+
+  return (
+    <View className="flex">
+      {/* 时间线圆点+连线 */}
+      <View className="flex flex-col items-center mr-3">
+        <View className={`w-3 h-3 rounded-full ${dotColor}`} />
+        {!isLast && <View className="w-0.5 h-full bg-gray-200 mt-1" />}
+      </View>
+
+      {/* 内容 */}
+      <View className="flex-1 pb-4">
+        <Text className="font-medium text-gray-800">{item.companyName || '未知企业'}</Text>
+        <Text className="text-sm text-gray-500 mb-1">{item.orderName || item.positionName || '未知岗位'}</Text>
+        <Text className="text-xs text-gray-500">{formatDateRange(item.joinDate, item.leaveDate)}</Text>
+      </View>
+    </View>
+  )
+}

+ 38 - 0
mini-talent/src/components/LogoutButton.tsx

@@ -0,0 +1,38 @@
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+
+interface LogoutButtonProps {
+  /** 点击处理函数 */
+  onPress: () => void
+  /** 是否正在退出 */
+  isLoggingOut?: boolean
+}
+
+/**
+ * 退出登录按钮组件
+ * 红色图标背景
+ * 原型参考: docs/小程序原型/rencai.html (行770-906)
+ */
+export const LogoutButton: React.FC<LogoutButtonProps> = ({
+  onPress,
+  isLoggingOut = false
+}) => {
+  return (
+    <View className="bg-white mb-6">
+      <View
+        className="flex flex-row items-center p-3 rounded-lg hover:bg-gray-50"
+        onClick={onPress}
+      >
+        {/* 红色退出图标 */}
+        <View className="w-10 h-10 rounded-full bg-red-100 flex items-center justify-center mr-3">
+          <View className="i-heroicons-arrow-right-on-rectangle-20-solid w-5 h-5 text-red-500" />
+        </View>
+
+        {/* 退出登录文本 */}
+        <Text className="text-gray-700 text-sm">
+          {isLoggingOut ? '退出中...' : '退出登录'}
+        </Text>
+      </View>
+    </View>
+  )
+}

+ 48 - 0
mini-talent/src/components/MenuItem.tsx

@@ -0,0 +1,48 @@
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+
+interface MenuItemProps {
+  /** 菜单项标题 */
+  title: string
+  /** 图标类名(Heroicons) */
+  icon: string
+  /** 图标背景色类名 */
+  bgColor: string
+  /** 图标颜色类名 */
+  iconColor: string
+  /** 点击处理函数 */
+  onPress: () => void
+}
+
+/**
+ * 菜单项组件
+ * 带圆形图标和右箭头
+ * 原型参考: docs/小程序原型/rencai.html (行770-906)
+ */
+export const MenuItem: React.FC<MenuItemProps> = ({
+  title,
+  icon,
+  bgColor,
+  iconColor,
+  onPress
+}) => {
+  return (
+    <View
+      className="flex flex-row items-center justify-between p-3 rounded-lg hover:bg-gray-50"
+      onClick={onPress}
+    >
+      {/* 左侧:图标和标题 */}
+      <View className="flex flex-row items-center">
+        {/* 圆形图标背景 */}
+        <View className={`w-10 h-10 rounded-full ${bgColor} flex items-center justify-center mr-3`}>
+          {/* Heroicons图标 */}
+          <View className={`${icon} w-5 h-5 ${iconColor}`} />
+        </View>
+        <Text className="text-gray-700 text-sm">{title}</Text>
+      </View>
+
+      {/* 右箭头 */}
+      <View className="i-heroicons-chevron-right-20-solid w-5 h-5 text-gray-400" />
+    </View>
+  )
+}

+ 44 - 0
mini-talent/src/components/MenuSection.tsx

@@ -0,0 +1,44 @@
+import React from 'react'
+import { View } from '@tarojs/components'
+import { MenuItem } from './MenuItem'
+import type { MenuSection as MenuSectionType } from '../types/settings'
+
+interface MenuSectionProps {
+  /** 菜单分组数据 */
+  section: MenuSectionType
+}
+
+/**
+ * 菜单分组组件
+ * 显示一组相关的菜单项
+ */
+export const MenuSection: React.FC<MenuSectionProps> = ({ section }) => {
+  return (
+    <View className="bg-white mb-4">
+      {/* 分组标题(可选) */}
+      {section.title && (
+        <View className="px-4 py-2 bg-gray-50">
+          <View className="text-xs text-gray-500 font-medium">{section.title}</View>
+        </View>
+      )}
+
+      {/* 菜单项列表 */}
+      <View className="flex flex-col">
+        {section.items.map((item, index) => (
+          <View
+            key={item.id}
+            className={index > 0 ? 'border-t border-gray-100' : ''}
+          >
+            <MenuItem
+              title={item.title}
+              icon={item.icon}
+              bgColor={item.bgColor}
+              iconColor={item.iconColor}
+              onPress={item.onPress}
+            />
+          </View>
+        ))}
+      </View>
+    </View>
+  )
+}

+ 80 - 0
mini-talent/src/components/MonthSelector.tsx

@@ -0,0 +1,80 @@
+/**
+ * 月份选择器组件
+ * 使用小程序 Picker 组件选择年月
+ */
+import React from 'react'
+import { View, Text, Picker } from '@tarojs/components'
+import { MonthSelectorProps } from '../types/attendance'
+
+export const MonthSelector: React.FC<MonthSelectorProps> = ({
+  currentMonth,
+  onPreviousMonth,
+  onNextMonth,
+  onMonthChange
+}) => {
+  // 生成最近3年的月份选项
+  const currentYear = new Date().getFullYear()
+  const yearOptions = Array.from({ length: 3 }, (_, i) => currentYear - 1 + i)
+  const monthOptions = Array.from({ length: 12 }, (_, i) => i + 1)
+
+  const yearRange = [
+    yearOptions.map((y) => `${y}年`),
+    monthOptions.map((m) => `${m}月`)
+  ]
+
+  // 解析当前年月
+  const parseCurrentMonth = () => {
+    const match = currentMonth.match(/(\d+)年(\d+)月/)
+    if (match) {
+      return { year: parseInt(match[1]), month: parseInt(match[2]) }
+    }
+    return { year: currentYear, month: new Date().getMonth() + 1 }
+  }
+
+  const { year: selectedYear, month: selectedMonth } = parseCurrentMonth()
+
+  // 计算默认选中的索引
+  const defaultValue = [
+    yearOptions.indexOf(selectedYear),
+    selectedMonth - 1
+  ]
+
+  // 处理 Picker 选择变化
+  const handlePickerChange = (e: any) => {
+    if (!onMonthChange) return
+
+    const [yearIndex, monthIndex] = e.detail.value
+    const newYear = yearOptions[yearIndex]
+    const newMonth = monthOptions[monthIndex]
+    onMonthChange(newYear, newMonth)
+  }
+
+  return (
+    <View className="flex justify-between items-center mb-4 px-4">
+      <Text className="font-semibold text-gray-700 text-base">考勤记录</Text>
+      <View className="flex items-center bg-gray-100 rounded-lg">
+        {/* 左箭头图标 */}
+        <View
+          className="i-heroicons-chevron-left-20-solid w-5 h-5 text-gray-500 mx-2"
+          onClick={onPreviousMonth}
+        />
+        {/* 月份选择器 */}
+        <Picker
+          mode="multiSelector"
+          range={yearRange}
+          value={defaultValue}
+          onChange={handlePickerChange}
+        >
+          <View className="px-2 py-1">
+            <Text className="text-sm text-gray-700">{currentMonth}</Text>
+          </View>
+        </Picker>
+        {/* 右箭头图标 */}
+        <View
+          className="i-heroicons-chevron-right-20-solid w-5 h-5 text-gray-500 mx-2"
+          onClick={onNextMonth}
+        />
+      </View>
+    </View>
+  )
+}

+ 148 - 0
mini-talent/src/components/PersonalBasicInfo.tsx

@@ -0,0 +1,148 @@
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { maskIdCard } from '../utils/maskUtils'
+
+/**
+ * 个人基本信息响应类型(从RPC推断)
+ */
+export interface PersonalInfoResponse {
+  name: string
+  gender: string
+  idCard: string
+  disabilityId: string
+  disabilityType: string
+  disabilityLevel: string
+  phone: string
+  province: string
+  city: string
+  district: string | null
+  detailedAddress: string | null
+  birthDate: string | null
+  idAddress: string
+  idValidDate: string | null
+  disabilityValidDate: string | null
+  canDirectContact: number
+  isMarried: number | null
+  nation: string | null
+  jobStatus: number
+  specificDisability: string | null
+}
+
+interface PersonalBasicInfoProps {
+  personalInfo: PersonalInfoResponse | null
+  loading: boolean
+}
+
+/**
+ * 个人基本信息卡片组件
+ * 显示:姓名、性别、年龄、身份证号、残疾证号、残疾类型、联系电话、联系地址
+ */
+const PersonalBasicInfo: React.FC<PersonalBasicInfoProps> = ({ personalInfo, loading }) => {
+  if (loading) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+        <View className="h-5 bg-gray-200 rounded w-24 mb-4 animate-pulse" />
+        <View className="space-y-3">
+          {[1, 2, 3, 4, 5].map((i) => (
+            <View key={i} className="h-4 bg-gray-200 rounded animate-pulse" />
+          ))}
+        </View>
+      </View>
+    )
+  }
+
+  if (!personalInfo) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+        <Text className="text-gray-500 text-sm">暂无个人信息</Text>
+      </View>
+    )
+  }
+
+  // 计算年龄
+  const calculateAge = (birthDate: string | null): number => {
+    if (!birthDate) return 0
+    const birth = new Date(birthDate)
+    const today = new Date()
+    let age = today.getFullYear() - birth.getFullYear()
+    const monthDiff = today.getMonth() - birth.getMonth()
+    if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
+      age--
+    }
+    return age
+  }
+
+  // 组合完整地址
+  const fullAddress = [
+    personalInfo.province,
+    personalInfo.city,
+    personalInfo.district,
+    personalInfo.detailedAddress
+  ].filter(Boolean).join('')
+
+  const age = calculateAge(personalInfo.birthDate)
+
+  return (
+    <View className="bg-white rounded-lg p-4 mb-3 flex flex-col">
+      <Text className="text-base font-semibold text-gray-800 mb-4">个人基本信息</Text>
+
+      {/* 垂直布局的信息列表 */}
+      <View className="flex flex-col space-y-3">
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">姓名</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">{personalInfo.name || '--'}</Text>
+        </View>
+
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">性别</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">{personalInfo.gender || '--'}</Text>
+        </View>
+
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">年龄</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">{age > 0 ? `${age}岁` : '--'}</Text>
+        </View>
+
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">身份证号</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">
+            {maskIdCard(personalInfo.idCard)}
+          </Text>
+        </View>
+
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">残疾证号</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">
+            {maskIdCard(personalInfo.disabilityId)}
+          </Text>
+        </View>
+
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">残疾类型</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">
+            {personalInfo.disabilityType || '--'}
+          </Text>
+        </View>
+
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">残疾等级</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">
+            {personalInfo.disabilityLevel || '--'}
+          </Text>
+        </View>
+
+        <View className="flex justify-between items-center">
+          <Text className="text-sm text-gray-500 w-24">联系电话</Text>
+          <Text className="text-sm text-gray-800 flex-1 text-right">{personalInfo.phone || '--'}</Text>
+        </View>
+
+        <View className="flex flex-col">
+          <Text className="text-sm text-gray-500 mb-1">联系地址</Text>
+          <Text className="text-sm text-gray-800 text-right">{fullAddress || '--'}</Text>
+        </View>
+      </View>
+    </View>
+  )
+}
+
+export default PersonalBasicInfo

+ 78 - 0
mini-talent/src/components/RencaiTabBarLayout.tsx

@@ -0,0 +1,78 @@
+import React, { ReactNode } from 'react'
+import { View } from '@tarojs/components'
+import { TabBar, type TabBarItem } from '@d8d/mini-shared-ui-components/components/tab-bar'
+import Taro from '@tarojs/taro'
+
+export interface RencaiTabBarLayoutProps {
+  children: ReactNode
+  activeKey: string
+}
+
+const rencaiTabBarItems: TabBarItem[] = [
+  {
+    key: 'index',
+    title: '首页',
+    iconClass: 'i-heroicons-home-20-solid',
+    selectedIconClass: 'i-heroicons-home-20-solid',
+  },
+  {
+    key: 'attendance',
+    title: '考勤',
+    iconClass: 'i-heroicons-clock-20-solid',
+    selectedIconClass: 'i-heroicons-clock-20-solid',
+  },
+  {
+    key: 'personal-info',
+    title: '我的',
+    iconClass: 'i-heroicons-user-20-solid',
+    selectedIconClass: 'i-heroicons-user-20-solid',
+  },
+  {
+    key: 'settings',
+    title: '更多',
+    iconClass: 'i-heroicons-squares-2x2-20-solid',
+    selectedIconClass: 'i-heroicons-squares-2x2-20-solid',
+  },
+]
+
+export const RencaiTabBarLayout: React.FC<RencaiTabBarLayoutProps> = ({ children, activeKey }) => {
+  const handleTabChange = (key: string) => {
+    // 使用 Taro 的导航 API 进行页面跳转
+    switch (key) {
+      case 'index':
+        Taro.switchTab({ url: '/pages/index/index' })
+        break
+      case 'attendance':
+        Taro.switchTab({ url: '/pages/attendance/index' })
+        break
+      case 'personal-info':
+        Taro.switchTab({ url: '/pages/personal-info/index' })
+        break
+      case 'settings':
+        Taro.switchTab({ url: '/pages/settings/index' })
+        break
+      default:
+        break
+    }
+  }
+
+  return (
+    <View className="min-h-screen bg-gray-50 flex flex-col">
+      <View className="flex-1 flex flex-col">
+        {children}
+      </View>
+      <TabBar
+        items={rencaiTabBarItems}
+        activeKey={activeKey}
+        onChange={handleTabChange}
+        fixed={true}
+        safeArea={true}
+        color="#999"
+        selectedColor="#3b82f6"
+        backgroundColor="white"
+      />
+    </View>
+  )
+}
+
+export default RencaiTabBarLayout

+ 30 - 0
mini-talent/src/components/SalaryRecordItem.tsx

@@ -0,0 +1,30 @@
+/**
+ * 薪资记录项组件
+ * 显示单条薪资记录信息
+ */
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { SalaryRecord } from '../types/employment'
+import { formatMonth } from '../types/employment'
+
+interface SalaryRecordItemProps {
+  record: SalaryRecord
+}
+
+export const SalaryRecordItem: React.FC<SalaryRecordItemProps> = ({ record }) => {
+  return (
+    <View className="flex justify-between items-center p-3 border border-gray-100 rounded-lg">
+      <View className="flex flex-col">
+        <Text className="text-sm font-medium text-gray-800">{formatMonth(record.month)}</Text>
+        <View className="flex flex-col">
+          <Text className="text-xs text-gray-500">
+            {record.companyName || '未知企业'} · {record.orderName || '未知岗位'}
+          </Text>
+        </View>
+      </View>
+      <Text className="text-lg font-bold text-gray-800">
+        ¥{record.salaryAmount.toLocaleString()}
+      </Text>
+    </View>
+  )
+}

+ 86 - 0
mini-talent/src/components/SalaryRecords.tsx

@@ -0,0 +1,86 @@
+/**
+ * 薪资记录卡片组件
+ * 显示薪资记录列表
+ */
+import React from 'react'
+import Taro from '@tarojs/taro'
+import { View, Text } from '@tarojs/components'
+import { SalaryRecord } from '../types/employment'
+import { SalaryRecordItem } from './SalaryRecordItem'
+
+interface SalaryRecordsProps {
+  records: SalaryRecord[]
+  loading?: boolean
+  onViewAll?: () => void
+  showViewAll?: boolean
+}
+
+export const SalaryRecords: React.FC<SalaryRecordsProps> = ({
+  records,
+  loading,
+  onViewAll,
+  showViewAll = true
+}) => {
+  const handleViewAll = () => {
+    if (onViewAll) {
+      onViewAll()
+    } else {
+      // 默认行为:显示提示
+      Taro.showToast({
+        title: '查看全部功能开发中',
+        icon: 'none'
+      })
+    }
+  }
+
+  if (loading) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-4">
+        <View className="flex justify-between items-center mb-3">
+          <Text className="font-semibold text-gray-700">薪资记录</Text>
+        </View>
+        <View className="flex items-center justify-center py-8">
+          <Text className="text-gray-400">加载中...</Text>
+        </View>
+      </View>
+    )
+  }
+
+  if (!records || records.length === 0) {
+    return (
+      <View className="bg-white rounded-lg p-4 mb-4">
+        <View className="flex justify-between items-center mb-3">
+          <Text className="font-semibold text-gray-700">薪资记录</Text>
+        </View>
+        <View className="flex flex-col items-center justify-center py-8">
+          {/* 暂无薪资记录图标 - Heroicons currency-dollar */}
+          <View className="i-heroicons-currency-dollar-20-solid text-gray-300 w-12 h-12 mb-3" />
+          <Text className="text-gray-500 font-medium mb-1">暂无薪资记录</Text>
+          <Text className="text-gray-400 text-sm">还没有任何薪资发放记录</Text>
+        </View>
+      </View>
+    )
+  }
+
+  // 默认显示最近3条
+  const displayRecords = records.slice(0, 3)
+
+  return (
+    <View className="bg-white rounded-lg p-4 mb-4">
+      <View className="flex justify-between items-center mb-3">
+        <Text className="font-semibold text-gray-700">薪资记录</Text>
+        {showViewAll && records.length > 0 && (
+          <Text className="text-blue-500 text-sm" onClick={handleViewAll}>
+            查看全部
+          </Text>
+        )}
+      </View>
+
+      <View className="flex flex-col space-y-3">
+        {displayRecords.map((record, index) => (
+          <SalaryRecordItem key={`${record.orderId}-${record.month}-${index}`} record={record} />
+        ))}
+      </View>
+    </View>
+  )
+}

+ 80 - 0
mini-talent/src/components/UserInfoHeader.tsx

@@ -0,0 +1,80 @@
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import { PersonalInfoResponse } from './PersonalBasicInfo'
+
+interface UserInfoHeaderProps {
+  personalInfo: PersonalInfoResponse | null
+  loading: boolean
+}
+
+/**
+ * 就业状态映射
+ */
+const jobStatusMap: Record<number, string> = {
+  0: '待业',
+  1: '在职'
+}
+
+/**
+ * 顶部用户信息区域组件
+ * 渐变背景,显示用户头像、姓名和状态
+ */
+const UserInfoHeader: React.FC<UserInfoHeaderProps> = ({ personalInfo, loading }) => {
+  if (loading) {
+    return (
+      <View className="bg-gradient-to-b from-blue-500 to-blue-700 p-5 mb-3">
+        <View className="flex justify-between items-start">
+          <View className="flex items-center">
+            <View className="w-16 h-16 rounded-full border-2 border-white mr-4 bg-blue-400 flex items-center justify-center animate-pulse" />
+            <View>
+              <View className="h-6 bg-white/30 rounded w-20 mb-2" />
+              <View className="h-4 bg-white/20 rounded w-32" />
+            </View>
+          </View>
+        </View>
+      </View>
+    )
+  }
+
+  // 提取姓名首字作为头像占位符 (即使personalInfo为null也渲染)
+  const nameInitial = personalInfo?.name ? personalInfo.name.charAt(0) : '?'
+  const displayName = personalInfo?.name || '未知用户'
+
+  // 组合用户状态: "残疾类型 · 等级 · 就业状态"
+  const userStatus = [
+    personalInfo?.disabilityType,
+    personalInfo?.disabilityLevel,
+    personalInfo?.jobStatus !== undefined ? jobStatusMap[personalInfo.jobStatus] : undefined
+  ].filter(Boolean).join(' · ') || '状态未知'
+
+  return (
+    <View className="bg-gradient-to-b from-blue-500 to-blue-700 p-5 mb-3">
+      <View className="flex justify-between items-start">
+        {/* 左侧: 头像和用户信息 */}
+        <View className="flex items-center">
+          {/* 用户头像 - 圆形,带白色边框,使用姓名首字 */}
+          <View className="w-16 h-16 rounded-full border-2 border-white mr-4 bg-blue-600 flex items-center justify-center">
+            <Text className="text-white text-xl font-bold">{nameInitial}</Text>
+          </View>
+
+          {/* 用户信息 */}
+          <View>
+            <Text className="text-xl font-bold text-white block mb-1">
+              {displayName}
+            </Text>
+            <Text className="text-sm text-white opacity-80">
+              {userStatus}
+            </Text>
+          </View>
+        </View>
+
+        {/* 右上角: 相机按钮 (暂不实现点击功能) */}
+        <View className="bg-white/20 rounded-full p-2">
+          <View className="i-heroicons-camera-20-solid w-5 h-5 text-white" />
+        </View>
+      </View>
+    </View>
+  )
+}
+
+export default UserInfoHeader

+ 61 - 0
mini-talent/src/components/UserProfileSummary.tsx

@@ -0,0 +1,61 @@
+import React from 'react'
+import { View, Text } from '@tarojs/components'
+import type { UserProfile } from '../types/settings'
+
+interface UserProfileSummaryProps {
+  /** 用户信息 */
+  profile: UserProfile
+}
+
+/**
+ * 用户信息摘要组件
+ * 显示用户头像、姓名、残疾类型和统计数据
+ * 原型参考: docs/小程序原型/rencai.html (行770-906)
+ */
+export const UserProfileSummary: React.FC<UserProfileSummaryProps> = ({ profile }) => {
+  // 获取姓名首字作为头像
+  const avatarText = profile.name?.charAt(0) || ''
+
+  return (
+    <View className="bg-white border-b border-gray-200">
+      {/* 用户头像和基本信息 */}
+      <View className="flex flex-row items-center p-4 mb-4">
+        {/* 圆形头像 */}
+        <View className="w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mr-4">
+          <Text className="text-white text-xl font-bold">{avatarText}</Text>
+        </View>
+
+        {/* 姓名和残疾类型 */}
+        <View className="flex flex-col">
+          <Text className="font-semibold text-gray-800 text-base">{profile.name}</Text>
+          <Text className="text-sm text-gray-500 mt-1">
+            {profile.disabilityType} · {profile.disabilityLevel}
+          </Text>
+        </View>
+      </View>
+
+      {/* 3列统计数据 */}
+      <View className="flex flex-row justify-around pb-4">
+        {/* 本月出勤 */}
+        <View className="flex flex-col items-center">
+          <Text className="text-xl font-bold text-gray-800">{profile.stats.thisMonthAttendance}</Text>
+          <Text className="text-xs text-gray-500 mt-1">本月出勤</Text>
+        </View>
+
+        {/* 累计出勤 */}
+        <View className="flex flex-col items-center">
+          <Text className="text-xl font-bold text-gray-800">{profile.stats.totalAttendance}</Text>
+          <Text className="text-xs text-gray-500 mt-1">累计出勤</Text>
+        </View>
+
+        {/* 本月薪资 */}
+        <View className="flex flex-col items-center">
+          <Text className="text-xl font-bold text-gray-800">
+            ¥{profile.stats.thisMonthSalary.toLocaleString()}
+          </Text>
+          <Text className="text-xs text-gray-500 mt-1">本月薪资</Text>
+        </View>
+      </View>
+    </View>
+  )
+}

+ 1 - 0
mini-talent/src/hooks/index.ts

@@ -0,0 +1 @@
+export { AuthProvider, useAuth, useRequireAuth, queryClient, type TalentUserInfo, type AuthContextType } from './useAuth'

+ 195 - 0
mini-talent/src/hooks/useAuth.tsx

@@ -0,0 +1,195 @@
+import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'
+import Taro from '@tarojs/taro'
+import { QueryClient, useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
+import { talentAuthClient } from '../api'
+import type { InferResponseType } from 'hono'
+
+// 使用RPC类型推断,确保类型与后端API完全一致
+export type TalentUserInfo = InferResponseType<typeof talentAuthClient.me.$get, 200>
+
+export interface AuthContextType {
+  isLoggedIn: boolean
+  user: TalentUserInfo | null
+  token: string | null
+  login: (identifier: string, password: string) => Promise<void>
+  logout: () => Promise<void>
+  refreshUser: () => Promise<void>
+  loading: boolean
+}
+
+const AuthContext = createContext<AuthContextType | undefined>(undefined)
+
+const TOKEN_KEY = 'talent_token'
+const USER_KEY = 'talent_user'
+
+// 导出queryClient以供外部使用(与mini-enterprise-auth-ui保持一致)
+export const queryClient = new QueryClient()
+
+export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
+  const queryClient = useQueryClient()
+
+  const [_isLoggedIn, setIsLoggedIn] = useState(false)
+  const [token, setToken] = useState<string | null>(null)
+  const [loading, setLoading] = useState(true)
+
+  // 使用React Query管理用户状态
+  const { data: user, isLoading } = useQuery<TalentUserInfo | null, Error>({
+    queryKey: ['talentCurrentUser'],
+    queryFn: async () => {
+      const storedToken = Taro.getStorageSync(TOKEN_KEY)
+      if (!storedToken) {
+        return null
+      }
+
+      try {
+        const response = await talentAuthClient.me.$get()
+        if (response.status !== 200) {
+          throw new Error('获取用户信息失败')
+        }
+
+        // 使用 response.json() 解析数据
+        const userInfo = await response.json()
+
+        // 缓存到本地存储(序列化为JSON字符串)
+        Taro.setStorageSync(USER_KEY, JSON.stringify(userInfo))
+        return userInfo
+      } catch (error) {
+        console.error('获取用户信息失败:', error)
+        Taro.removeStorageSync(TOKEN_KEY)
+        Taro.removeStorageSync(USER_KEY)
+        return null
+      }
+    },
+    staleTime: Infinity,
+    refetchOnWindowFocus: false,
+    refetchOnReconnect: false,
+  })
+
+  // 同步isLoggedIn状态
+  useEffect(() => {
+    setIsLoggedIn(!!user)
+    setToken(Taro.getStorageSync(TOKEN_KEY) || null)
+    setLoading(false)
+  }, [user])
+
+  const loginMutation = useMutation<void, Error, { identifier: string; password: string }>({
+    mutationFn: async ({ identifier, password }) => {
+      const response = await talentAuthClient.login.$post({
+        json: {
+          identifier: identifier.trim(),
+          password: password.trim()
+        }
+      })
+
+      if (response.status !== 200) {
+        throw new Error('登录失败')
+      }
+
+      // 使用 response.json() 解析数据
+      const data = await response.json()
+      const { token, user } = data
+
+      // 保存到本地存储(user序列化为JSON字符串)
+      Taro.setStorageSync(TOKEN_KEY, token)
+      Taro.setStorageSync(USER_KEY, JSON.stringify(user))
+
+      setToken(token)
+    },
+    onSuccess: () => {
+      // 刷新用户信息
+      queryClient.invalidateQueries({ queryKey: ['talentCurrentUser'] })
+    },
+    onError: (error) => {
+      Taro.showToast({
+        title: error.message || '登录失败,请检查账号和密码',
+        icon: 'none',
+        duration: 2000,
+      })
+    },
+  })
+
+  const logoutMutation = useMutation<void, Error>({
+    mutationFn: async () => {
+      try {
+        // TODO: 调用退出API
+        // await talentAuthClient.logout.$post()
+      } catch (error) {
+        console.error('Logout error:', error)
+      } finally {
+        Taro.removeStorageSync(TOKEN_KEY)
+        Taro.removeStorageSync(USER_KEY)
+      }
+    },
+    onSuccess: () => {
+      // 先清除用户状态
+      queryClient.setQueryData(['talentCurrentUser'], null)
+      // 立即跳转到登录页(不使用异步,因为 reLaunch 不返回 Promise)
+      Taro.reLaunch({ url: '/pages/login/index' })
+    },
+    onError: (error) => {
+      Taro.showToast({
+        title: error.message || '登出失败',
+        icon: 'none',
+        duration: 2000,
+      })
+    },
+  })
+
+  const login = async (identifier: string, password: string): Promise<void> => {
+    await loginMutation.mutateAsync({ identifier, password })
+  }
+
+  const logout = async (): Promise<void> => {
+    await logoutMutation.mutateAsync()
+  }
+
+  const refreshUser = async (): Promise<void> => {
+    await queryClient.invalidateQueries({ queryKey: ['talentCurrentUser'] })
+  }
+
+  const value: AuthContextType = {
+    isLoggedIn: !!user,
+    user: user || null,
+    token,
+    login,
+    logout,
+    refreshUser,
+    loading: loading || isLoading,
+  }
+
+  return (
+    <AuthContext.Provider value={value}>
+      {children}
+    </AuthContext.Provider>
+  )
+}
+
+export const useAuth = (): AuthContextType => {
+  const context = useContext(AuthContext)
+  if (context === undefined) {
+    throw new Error('useAuth must be used within an AuthProvider')
+  }
+  return context
+}
+
+/**
+ * useRequireAuth Hook
+ * 检查登录状态,未登录则重定向到登录页
+ *
+ * 参考实现: mini-enterprise-auth-ui/src/hooks/useRequireAuth.ts
+ */
+export const useRequireAuth = (): void => {
+  const { isLoggedIn, loading } = useAuth()
+
+  useEffect(() => {
+    // 只有在非loading状态且未登录时才跳转
+    if (!loading && !isLoggedIn) {
+      // 使用 reLaunch 而不是 redirectTo,确保在 TabBar 页面也能正常跳转
+      Taro.reLaunch({
+        url: '/pages/login/index'
+      })
+    }
+  }, [isLoggedIn, loading])
+}
+
+export default AuthContext

+ 120 - 1
mini-talent/src/pages/account-security/index.tsx

@@ -1,3 +1,122 @@
-import AccountSecurityPage from '@d8d/rencai-settings-ui/pages/AccountSecurityPage/AccountSecurityPage'
+import React from 'react'
+import { View, ScrollView, Text } from '@tarojs/components'
+import Taro from '@tarojs/taro'
+import { useQuery } from '@tanstack/react-query'
+import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'
+import { useRequireAuth } from '../../hooks'
+import type { LoginLog } from '../../types/settings'
+
+/**
+ * 账号与安全页
+ * 显示登录日志列表
+ * 非TabBar页面 - 带返回按钮
+ */
+const AccountSecurityPage: React.FC = () => {
+  // 检查登录状态
+  useRequireAuth()
+
+  // 模拟登录日志数据(API待实现)
+  const mockLoginLogs: LoginLog[] = [
+    {
+      id: 1,
+      loginTime: '2025-12-28 10:30:25',
+      device: 'iPhone 15 Pro',
+      ipAddress: '192.168.1.100'
+    },
+    {
+      id: 2,
+      loginTime: '2025-12-27 18:45:12',
+      device: 'iPhone 15 Pro',
+      ipAddress: '192.168.1.100'
+    },
+    {
+      id: 3,
+      loginTime: '2025-12-26 09:15:33',
+      device: 'iPhone 15 Pro',
+      ipAddress: '192.168.1.100'
+    },
+    {
+      id: 4,
+      loginTime: '2025-12-25 20:22:18',
+      device: 'iPad Air',
+      ipAddress: '192.168.1.102'
+    },
+    {
+      id: 5,
+      loginTime: '2025-12-24 14:10:05',
+      device: 'iPhone 15 Pro',
+      ipAddress: '192.168.1.100'
+    }
+  ]
+
+  // 返回上一页
+  const handleBack = () => {
+    Taro.navigateBack()
+  }
+
+  return (
+    <View className="h-screen bg-gray-100">
+      {/* Navbar导航栏 - 非TabBar页面带返回按钮 */}
+      <Navbar
+        title="账号与安全"
+        leftIcon="i-heroicons-chevron-left-20-solid"
+        leftText=""
+        onClickLeft={handleBack}
+        backgroundColor="bg-white"
+        border={true}
+        fixed={true}
+        placeholder={true}
+      />
+
+      {/* 页面内容 */}
+      <ScrollView scrollY className="h-full">
+        {/* 登录日志标题 */}
+        <View className="bg-white px-4 py-3 border-b border-gray-200">
+          <Text className="text-sm font-medium text-gray-700">最近登录记录</Text>
+        </View>
+
+        {/* 登录日志列表 */}
+        <View className="bg-white">
+          {mockLoginLogs.map((log, index) => (
+            <View
+              key={log.id}
+              className={`flex flex-col px-4 py-3 ${
+                index < mockLoginLogs.length - 1 ? 'border-b border-gray-100' : ''
+              }`}
+            >
+              {/* 登录时间和设备 */}
+              <View className="flex flex-row justify-between items-center mb-2">
+                <View className="flex flex-row items-center">
+                  <View className="i-heroicons-device-phone-mobile-20-solid w-4 h-4 text-gray-500 mr-2" />
+                  <Text className="text-sm text-gray-800">{log.device}</Text>
+                </View>
+                <Text className="text-xs text-gray-400">{log.loginTime}</Text>
+              </View>
+
+              {/* IP地址 */}
+              <View className="flex flex-row items-center">
+                <View className="i-heroicons-globe-alt-20-solid w-4 h-4 text-gray-500 mr-2" />
+                <Text className="text-xs text-gray-500">IP: {log.ipAddress}</Text>
+              </View>
+            </View>
+          ))}
+        </View>
+
+        {/* 安全提示 */}
+        <View className="mx-4 mt-6 p-4 bg-blue-50 rounded-lg">
+          <View className="flex flex-row items-start">
+            <View className="i-heroicons-information-circle-20-solid w-5 h-5 text-blue-500 mr-2 mt-0.5" />
+            <View className="flex flex-col">
+              <Text className="text-sm font-medium text-blue-800 mb-1">安全提示</Text>
+              <Text className="text-xs text-blue-600">
+                如果发现异常登录记录,请立即修改密码并联系客服
+              </Text>
+            </View>
+          </View>
+        </View>
+      </ScrollView>
+    </View>
+  )
+}
 
 export default AccountSecurityPage

+ 121 - 2
mini-talent/src/pages/attendance/index.tsx

@@ -1,4 +1,123 @@
-import AttendancePage from '@d8d/rencai-attendance-ui/pages/AttendancePage/AttendancePage'
+/**
+ * 人才小程序考勤记录页
+ * TabBar页面 - 无返回按钮
+ * 原型参考: docs/小程序原型/rencai.html (行303-481)
+ */
+import React, { useState } from 'react'
+import { View } from '@tarojs/components'
+import { RencaiTabBarLayout } from '../../components/RencaiTabBarLayout'
+import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'
+import { useRequireAuth } from '../../hooks'
 
-export default AttendancePage
+// 组件导入
+import { MonthSelector } from '../../components/MonthSelector'
+import { AttendanceStats } from '../../components/AttendanceStats'
+import { AttendanceCalendar } from '../../components/AttendanceCalendar'
+import { AttendanceDetails } from '../../components/AttendanceDetails'
+
+// 工具函数导入
+import {
+  generateMockAttendanceData,
+  formatMonth,
+  getCurrentYearMonth,
+  getPreviousMonth,
+  getNextMonth
+} from '../../utils/mockAttendanceData'
+
+// 类型导入
+import { AttendanceStats as AttendanceStatsType, AttendanceRecord } from '../../types/attendance'
+
+const AttendancePage: React.FC = () => {
+  // 检查登录状态,未登录则重定向
+  useRequireAuth()
+
+  // 状态管理
+  const [currentYear, setCurrentYear] = useState<number>(() => getCurrentYearMonth().year)
+  const [currentMonth, setCurrentMonth] = useState<number>(() => getCurrentYearMonth().month)
+  const [stats, setStats] = useState<AttendanceStatsType>(() => {
+    const { year, month } = getCurrentYearMonth()
+    return generateMockAttendanceData(year, month).stats
+  })
+  const [records, setRecords] = useState<AttendanceRecord[]>([])
+
+  // 加载指定月份的考勤数据
+  const loadAttendanceData = (year: number, month: number) => {
+    const { stats: newStats, records: newRecords } = generateMockAttendanceData(year, month)
+    setStats(newStats)
+    setRecords(newRecords)
+  }
+
+  // 处理上个月点击
+  const handlePreviousMonth = () => {
+    const { year: prevYear, month: prevMonth } = getPreviousMonth(currentYear, currentMonth)
+    setCurrentYear(prevYear)
+    setCurrentMonth(prevMonth)
+    loadAttendanceData(prevYear, prevMonth)
+  }
+
+  // 处理下个月点击
+  const handleNextMonth = () => {
+    const { year: nextYear, month: nextMonth } = getNextMonth(currentYear, currentMonth)
+    setCurrentYear(nextYear)
+    setCurrentMonth(nextMonth)
+    loadAttendanceData(nextYear, nextMonth)
+  }
+
+  // 处理 Picker 选择变化
+  const handleMonthChange = (year: number, month: number) => {
+    setCurrentYear(year)
+    setCurrentMonth(month)
+    loadAttendanceData(year, month)
+  }
 
+  // 初始化加载当前月份数据
+  React.useEffect(() => {
+    loadAttendanceData(currentYear, currentMonth)
+  }, [])
+
+  const currentMonthDisplay = formatMonth(currentYear, currentMonth)
+
+  return (
+    <RencaiTabBarLayout activeKey="attendance">
+      <View className="h-screen bg-gray-100 flex flex-col">
+        {/* Navbar导航栏 - TabBar页面无返回按钮 */}
+        <Navbar
+          title="考勤记录"
+          leftIcon=""
+          leftText=""
+          onClickLeft={() => {}}
+          backgroundColor="bg-white"
+          border={true}
+          fixed={true}
+          placeholder={true}
+        />
+
+        {/* 页面内容 */}
+        <View className="flex-1 overflow-y-auto pb-16">
+          {/* 月份选择器 */}
+          <MonthSelector
+            currentMonth={currentMonthDisplay}
+            onPreviousMonth={handlePreviousMonth}
+            onNextMonth={handleNextMonth}
+            onMonthChange={handleMonthChange}
+          />
+
+          {/* 考勤统计卡片 */}
+          <AttendanceStats stats={stats} />
+
+          {/* 考勤日历 */}
+          <AttendanceCalendar
+            year={currentYear}
+            month={currentMonth}
+            attendanceRecords={records}
+          />
+
+          {/* 打卡明细列表 */}
+          <AttendanceDetails records={records} />
+        </View>
+      </View>
+    </RencaiTabBarLayout>
+  )
+}
+
+export default AttendancePage

+ 176 - 2
mini-talent/src/pages/employment/index.tsx

@@ -1,4 +1,178 @@
-import EmploymentPage from '@d8d/rencai-employment-ui/pages/EmploymentPage/EmploymentPage'
+/**
+ * 人才小程序就业信息页
+ * 非TabBar页面 - 带返回按钮
+ * 原型参考: docs/小程序原型/rencai.html (行630-768)
+ *
+ * API集成:
+ * - GET /api/v1/rencai/employment/status - 当前就业状态
+ * - GET /api/v1/rencai/employment/salary-records - 薪资记录
+ * - GET /api/v1/rencai/employment/history - 就业历史
+ */
+import React from 'react'
+import Taro from '@tarojs/taro'
+import { View, ScrollView } from '@tarojs/components'
+import { useQuery } from '@tanstack/react-query'
+import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'
+import { useRequireAuth } from '../../hooks'
 
-export default EmploymentPage
+// 组件导入
+import { CurrentEmploymentStatus } from '../../components/CurrentEmploymentStatus'
+import { SalaryRecords } from '../../components/SalaryRecords'
+import { EmploymentHistory } from '../../components/EmploymentHistory'
+
+// API客户端导入
+import { talentEmploymentClient } from '../../api'
+
+// 类型导入
+import {
+  CurrentEmploymentStatus as CurrentEmploymentStatusType,
+  SalaryRecord,
+  EmploymentHistoryItem,
+  WorkStatus
+} from '../../types/employment'
+
+const EmploymentPage: React.FC = () => {
+  // 检查登录状态,未登录则重定向
+  useRequireAuth()
+
+  // 获取当前就业状态
+  // 注意: 无就业记录时API返回null (200状态码),不是404错误
+  const { data: currentStatus, isLoading: statusLoading, error: statusError } = useQuery({
+    queryKey: ['employment-status'],
+    queryFn: async () => {
+      const res = await talentEmploymentClient.employment.status.$get()
+      if (!res.ok) {
+        throw new Error('获取就业状态失败')
+      }
+      const data = await res.json()
+      // API返回null表示无就业记录
+      if (!data) {
+        return null
+      }
+      return {
+        ...data,
+        workStatus: data.workStatus as WorkStatus
+      } as CurrentEmploymentStatusType
+    }
+  })
+
+  // 获取薪资记录
+  const { data: salaryRecordsData, isLoading: salaryLoading, error: salaryError } = useQuery({
+    queryKey: ['salary-records'],
+    queryFn: async () => {
+      // 计算上个月份(用于查询上个月的薪资记录)
+      const now = new Date()
+      const lastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1)
+      const monthStr = `${lastMonth.getFullYear()}-${String(lastMonth.getMonth() + 1).padStart(2, '0')}`
+
+      const res = await talentEmploymentClient.employment['salary-records'].$get({
+        query: { month: monthStr, take: 3 }
+      })
+      if (!res.ok) {
+        throw new Error('获取薪资记录失败')
+      }
+      const data = await res.json()
+      return (data.data || []) as SalaryRecord[]
+    }
+  })
+
+  // 获取就业历史
+  const { data: employmentHistoryData, isLoading: historyLoading, error: historyError } = useQuery({
+    queryKey: ['employment-history'],
+    queryFn: async () => {
+      const res = await talentEmploymentClient.employment.history.$get({
+        query: { take: 20 }
+      })
+      if (!res.ok) {
+        throw new Error('获取就业历史失败')
+      }
+      const data = await res.json()
+      return (data.data || []).map((item: any) => ({
+        ...item,
+        workStatus: item.workStatus as WorkStatus
+      })) as EmploymentHistoryItem[]
+    }
+  })
+
+  // 错误处理
+  React.useEffect(() => {
+    if (statusError) {
+      Taro.showToast({
+        title: statusError.message,
+        icon: 'none'
+      })
+    }
+  }, [statusError])
 
+  React.useEffect(() => {
+    if (salaryError) {
+      Taro.showToast({
+        title: salaryError.message,
+        icon: 'none'
+      })
+    }
+  }, [salaryError])
+
+  React.useEffect(() => {
+    if (historyError) {
+      Taro.showToast({
+        title: historyError.message,
+        icon: 'none'
+      })
+    }
+  }, [historyError])
+
+  // 处理查看全部薪资记录
+  const handleViewAllSalaryRecords = () => {
+    Taro.showToast({
+      title: '全部薪资记录功能开发中',
+      icon: 'none'
+    })
+  }
+
+  return (
+    <View className="h-screen bg-gray-100 flex flex-col">
+      {/* Navbar导航栏 - 非TabBar页面带返回按钮 */}
+      <Navbar
+        title="就业信息"
+        leftIcon="i-heroicons-chevron-left-20-solid"
+        leftText="返回"
+        onClickLeft={() => Taro.navigateBack()}
+        backgroundColor="bg-white"
+        border={true}
+        fixed={true}
+        placeholder={true}
+      />
+
+      {/* 页面内容 */}
+      <ScrollView
+        scrollY
+        className="flex-1"
+        refresherEnabled={true}
+        refresherTriggered={false}
+      >
+        {/* 当前就业状态卡片 */}
+        <View className="px-4 pt-4">
+          <CurrentEmploymentStatus status={currentStatus || null} loading={statusLoading} />
+        </View>
+
+        {/* 薪资记录卡片 */}
+        <View className="px-4">
+          <SalaryRecords
+            records={salaryRecordsData || []}
+            loading={salaryLoading}
+            onViewAll={handleViewAllSalaryRecords}
+            showViewAll={true}
+          />
+        </View>
+
+        {/* 就业历史时间线 */}
+        <View className="px-4 pb-4">
+          <EmploymentHistory history={employmentHistoryData || []} loading={historyLoading} />
+        </View>
+      </ScrollView>
+    </View>
+  )
+}
+
+export default EmploymentPage

+ 325 - 2
mini-talent/src/pages/index/index.tsx

@@ -1,3 +1,326 @@
-// 桥接文件:从 @d8d/rencai-dashboard-ui 包导Dashboard页面
-import Dashboard from '@d8d/rencai-dashboard-ui/pages/Dashboard/Dashboard'
+import React, { useEffect } from 'react'
+import { View, Text, ScrollView } from '@tarojs/components'
+import Taro from '@tarojs/taro'
+import { RencaiTabBarLayout } from '../../components/RencaiTabBarLayout'
+import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'
+import { useAuth, useRequireAuth } from '../../hooks'
+import { talentDashboardClient } from '../../api'
+import type { InferResponseType } from 'hono'
+
+/**
+ * 人才小程序首页/个人主页
+ * 原型参考: docs/小程序原型/rencai.html (行160-301)
+ */
+
+// 类型定义
+type PersonalInfoResponse = InferResponseType<typeof talentDashboardClient.personal.info.$get, 200>
+
+/**
+ * 人才用户信息类型
+ * 基于 TalentMeResponseSchema 定义(从后端Schema推断)
+ */
+interface TalentUserInfo {
+  id: number
+  username: string
+  userType: string
+  personId: number | null
+  phone: string | null
+  nickname: string | null
+  name: string | null
+  avatarFileId: number | null
+  personInfo: {
+    id: number
+    name: string
+    gender: string
+    idCard: string
+    disabilityId: string
+    disabilityType: string
+    disabilityLevel: string
+    phone: string
+    province: string
+    city: string
+    district: string | null
+    detailedAddress: string | null
+    jobStatus: number
+  } | null
+}
+
+// 模拟打卡数据(P2延期功能)
+interface ClockInData {
+  status: '已打卡' | '未打卡'
+  clockInTime?: string
+  clockOutTime?: string
+  displayTime?: string
+  date?: string
+}
+
+// 格式化当前时间
+const formatCurrentTime = (): string => {
+  const now = new Date()
+  return `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`
+}
+
+// 格式化当前日期
+const formatCurrentDate = (): string => {
+  const now = new Date()
+  const weekdays = ['日', '一', '二', '三', '四', '五', '六']
+  const year = now.getFullYear()
+  const month = now.getMonth() + 1
+  const date = now.getDate()
+  const weekday = weekdays[now.getDay()]
+  return `${year}年${month}月${date}日 星期${weekday}`
+}
+
+const Dashboard: React.FC = () => {
+  const { user: userFromAuth, refreshUser } = useAuth()
+  // 类型转换:因为 InferResponseType 在某些情况下推断为 never
+  const user = userFromAuth as TalentUserInfo | null
+  const [_personalInfo, _setPersonalInfo] = React.useState<PersonalInfoResponse | null>(null)
+  const [_loading, _setLoading] = React.useState(true)
+
+  // 添加认证保护
+  useRequireAuth()
+
+  // 模拟打卡数据
+  const clockInData: ClockInData = {
+    status: '已打卡',
+    clockInTime: '08:30',
+    clockOutTime: '--:--',
+    displayTime: formatCurrentTime(),
+    date: formatCurrentDate()
+  }
+
+  // 加载个人信息
+  useEffect(() => {
+    loadPersonalInfo()
+  }, [])
+
+  const loadPersonalInfo = async () => {
+    try {
+      _setLoading(true)
+      const response = await talentDashboardClient.personal.info.$get()
+
+      if (response.ok) {
+        const data = await response.json()
+        _setPersonalInfo(data)
+      } else {
+        Taro.showToast({
+          title: '加载个人信息失败',
+          icon: 'none'
+        })
+      }
+    } catch (_error) {
+      console.error('加载个人信息失败:', _error)
+      Taro.showToast({
+        title: '加载个人信息失败',
+        icon: 'none'
+      })
+    } finally {
+      _setLoading(false)
+    }
+  }
+
+  // 下拉刷新
+  const onRefresh = async () => {
+    try {
+      await Promise.all([
+        refreshUser(),
+        loadPersonalInfo()
+      ])
+      Taro.showToast({ title: '刷新成功', icon: 'success' })
+    } catch (_error) {
+      Taro.showToast({ title: '刷新失败', icon: 'none' })
+    }
+  }
+
+  // 页面加载时设置标题
+  useEffect(() => {
+    Taro.setNavigationBarTitle({
+      title: '首页'
+    })
+  }, [])
+
+  // 快捷功能点击处理
+  const handleQuickAction = (action: string) => {
+    switch (action) {
+      case 'personal-info':
+        Taro.navigateTo({ url: '/pages/personal-info/index' })
+        break
+      case 'attendance':
+        Taro.navigateTo({ url: '/pages/attendance/index' })
+        break
+      case 'employment':
+        Taro.navigateTo({ url: '/pages/employment/index' })
+        break
+      case 'company':
+        Taro.showToast({ title: '企业信息功能开发中', icon: 'none' })
+        break
+      default:
+        break
+    }
+  }
+
+  // 远程打卡处理(占位功能)
+  const handleClockIn = () => {
+    Taro.showToast({ title: '已打卡成功', icon: 'success' })
+  }
+
+  return (
+    <RencaiTabBarLayout activeKey="index">
+      <ScrollView
+        className="h-[calc(100%-60px)] overflow-y-auto bg-gray-100"
+        scrollY
+        refresherEnabled
+        onRefresherRefresh={onRefresh}
+      >
+        {/* Navbar导航栏 - TabBar页面无返回按钮 */}
+        <Navbar
+          title="首页"
+          leftIcon=""
+          leftText=""
+          onClickLeft={() => {}}
+          backgroundColor="bg-white"
+          border={true}
+          fixed={true}
+          placeholder={true}
+        />
+
+        <View className="px-4 pb-20">
+          {/* 个人概览卡片 - 蓝色渐变背景 */}
+          <View
+            className="rounded-2xl p-6 mb-4 shadow-md"
+            style={{
+              background: 'linear-gradient(135deg, #3b82f6 0%, #1e40af 100%)'
+            }}
+          >
+            <View className="flex items-center mb-4">
+              {/* 圆形头像显示(用户姓名首字) */}
+              <View className="w-15 h-15 rounded-full bg-white/20 border-2 border-white flex items-center justify-center mr-3">
+                <Text className="text-white text-xl font-semibold">
+                  {(user?.personInfo?.name || user?.name || '人才用户').charAt(0)}
+                </Text>
+              </View>
+              <View className="flex-1">
+                <Text className="text-white text-xl font-semibold block mb-1">
+                  {user?.personInfo?.name || user?.name || '人才用户'}
+                </Text>
+                <Text className="text-white/80 text-sm block">
+                  {user?.personInfo?.disabilityType || '残疾类型未填写'}
+                </Text>
+              </View>
+              {/* 右侧二维码按钮图标 */}
+              <View
+                className="w-10 h-10 rounded-full bg-white/20 flex items-center justify-center"
+                onClick={() => Taro.showToast({ title: '二维码功能开发中', icon: 'none' })}
+              >
+                <View className="i-heroicons-qr-code-20-solid text-white text-lg" />
+              </View>
+            </View>
+
+            {/* 3列统计数据 */}
+            <View className="flex justify-between mt-4">
+              <View className="flex flex-col items-center">
+                <Text className="text-white text-2xl font-bold">28</Text>
+                <Text className="text-white/80 text-xs">本月出勤</Text>
+              </View>
+              <View className="flex flex-col items-center">
+                <Text className="text-white text-2xl font-bold">0</Text>
+                <Text className="text-white/80 text-xs">异常记录</Text>
+              </View>
+              <View className="flex flex-col items-center">
+                <Text className="text-white text-2xl font-bold">¥4,800</Text>
+                <Text className="text-white/80 text-xs">本月薪资</Text>
+              </View>
+            </View>
+          </View>
+
+          {/* 打卡状态模块 */}
+          <View className="bg-white rounded-2xl p-5 mb-4 shadow-sm text-center">
+            {/* 打卡状态指示器 */}
+            <View className="flex items-center justify-center mb-4">
+              <View className="w-3 h-3 rounded-full bg-green-500 mr-2 animate-pulse" />
+              <Text className="text-green-500 font-medium">已打卡</Text>
+            </View>
+
+            {/* 大号时间显示和日期 - 垂直布局 */}
+            <View className="flex flex-col items-center mb-4">
+              <Text className="text-2xl font-bold text-gray-800 mb-2">
+                {clockInData.displayTime || '09:27'}
+              </Text>
+              <Text className="text-sm text-gray-600">
+                {clockInData.date || '2023年11月25日 星期六'}
+              </Text>
+            </View>
+
+            {/* 上班/下班卡片 */}
+            <View className="flex justify-between mb-4">
+              {/* 上班打卡 */}
+              <View className="flex-1 flex flex-col items-center">
+                <View className="w-12 h-12 rounded-full bg-blue-100 flex items-center justify-center mb-2">
+                  <View className="i-heroicons-arrow-right-on-rectangle-20-solid text-blue-500 text-xl" />
+                </View>
+                <Text className="text-xs text-gray-600">上班打卡</Text>
+                <Text className="text-sm font-semibold text-gray-800">{clockInData.clockInTime}</Text>
+              </View>
+
+              {/* 下班打卡 */}
+              <View className="flex-1 flex flex-col items-center">
+                <View className="w-12 h-12 rounded-full bg-gray-100 flex items-center justify-center mb-2">
+                  <View className="i-heroicons-arrow-left-on-rectangle-20-solid text-gray-400 text-xl" />
+                </View>
+                <Text className="text-xs text-gray-600">下班打卡</Text>
+                <Text className="text-sm font-semibold text-gray-400">{clockInData.clockOutTime}</Text>
+              </View>
+            </View>
+
+            {/* 远程打卡按钮 */}
+            <View
+              className="bg-blue-500 text-white text-center py-3 rounded-lg font-medium flex items-center justify-center"
+              onClick={handleClockIn}
+            >
+              <View className="i-heroicons-device-phone-mobile-20-solid text-lg mr-1" />
+              <Text>小程序远程打卡</Text>
+            </View>
+          </View>
+
+          {/* 快捷功能入口网格 */}
+          <View className="grid grid-cols-4 gap-3 mb-4">
+            <View
+              className="bg-blue-50 rounded-xl p-3 flex flex-col items-center justify-center"
+              onClick={() => handleQuickAction('personal-info')}
+            >
+              <View className="i-heroicons-user-20-solid text-blue-500 text-lg mb-1" />
+              <Text className="text-xs text-gray-700">个人信息</Text>
+            </View>
+
+            <View
+              className="bg-green-50 rounded-xl p-3 flex flex-col items-center justify-center"
+              onClick={() => handleQuickAction('attendance')}
+            >
+              <View className="i-heroicons-document-text-20-solid text-green-500 text-lg mb-1" />
+              <Text className="text-xs text-gray-700">考勤记录</Text>
+            </View>
+
+            <View
+              className="bg-purple-50 rounded-xl p-3 flex flex-col items-center justify-center"
+              onClick={() => handleQuickAction('employment')}
+            >
+              <View className="i-heroicons-chart-bar-20-solid text-purple-500 text-lg mb-1" />
+              <Text className="text-xs text-gray-700">薪资查询</Text>
+            </View>
+
+            <View
+              className="bg-yellow-50 rounded-xl p-3 flex flex-col items-center justify-center"
+              onClick={() => handleQuickAction('company')}
+            >
+              <View className="i-heroicons-building-office-2-20-solid text-yellow-600 text-lg mb-1" />
+              <Text className="text-xs text-gray-700">企业信息</Text>
+            </View>
+          </View>
+        </View>
+      </ScrollView>
+    </RencaiTabBarLayout>
+  )
+}
+
 export default Dashboard

+ 157 - 3
mini-talent/src/pages/login/index.tsx

@@ -1,3 +1,157 @@
-// 桥接文件:从 @d8d/rencai-auth-ui 包导入Login页面
-import Login from '@d8d/rencai-auth-ui/pages/LoginPage/LoginPage'
-export default Login
+import React, { useState, useEffect } from 'react'
+import { View, Text, Input, Button } from '@tarojs/components'
+import { useAuth } from '../../hooks'
+import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'
+import Taro from '@tarojs/taro'
+
+/**
+ * 人才用户登录页面
+ * 支持手机号/身份证号/残疾证号 + 密码登录
+ * 原型参考: docs/小程序原型/rencai.html (行115-158)
+ */
+export const LoginPage: React.FC = () => {
+  const [identifier, setIdentifier] = useState('')
+  const [password, setPassword] = useState('')
+  const [loading, setLoading] = useState(false)
+  const { login, isLoggedIn } = useAuth()
+
+  // 如果已登录,直接跳转到首页
+  useEffect(() => {
+    if (isLoggedIn) {
+      Taro.switchTab({ url: '/pages/index/index' })
+    }
+  }, [isLoggedIn])
+
+  const handleLogin = async () => {
+    // 表单验证
+    if (!identifier.trim()) {
+      Taro.showToast({ title: '请输入手机号/身份证号/残疾证号', icon: 'none' })
+      return
+    }
+
+    if (!password.trim()) {
+      Taro.showToast({ title: '请输入密码', icon: 'none' })
+      return
+    }
+
+    setLoading(true)
+    try {
+      await login(identifier, password)
+      Taro.showToast({ title: '登录成功', icon: 'success' })
+
+      // 跳转到首页
+      setTimeout(() => {
+        Taro.switchTab({ url: '/pages/index/index' })
+      }, 500)
+    } catch (error: any) {
+      Taro.showToast({
+        title: error.message || '登录失败',
+        icon: 'none',
+        duration: 2000
+      })
+    } finally {
+      setLoading(false)
+    }
+  }
+
+  const handleForgotPassword = () => {
+    // 占位功能
+    Taro.showToast({ title: '请联系管理员重置密码', icon: 'none' })
+  }
+
+  return (
+    <View className="min-h-screen" data-testid="talent-login-page">
+      {/* 导航栏 */}
+      <Navbar
+        title="人才登录"
+        leftIcon=""
+        backgroundColor="bg-transparent"
+        textColor="text-white"
+        border={false}
+      />
+
+      {/* 蓝色渐变背景 */}
+      <View
+        className="min-h-screen flex flex-col items-center justify-center px-6"
+        style={{
+          background: 'linear-gradient(135deg, #3b82f6 0%, #1e40af 100%)'
+        }}
+      >
+        {/* 标题区域 */}
+        <View className="mb-12 text-center flex flex-col">
+          <Text className="text-3xl font-bold text-white block mb-2" data-testid="talent-page-title">人才服务平台</Text>
+          <Text className="text-base text-white/80 block">欢迎回来</Text>
+        </View>
+
+        {/* 白色圆角卡片表单 */}
+        <View className="w-full bg-white rounded-2xl shadow-lg p-6">
+          {/* 表单标题 */}
+          <Text className="text-xl font-semibold text-gray-800 block mb-6 text-center">人才登录</Text>
+
+          {/* 身份证号/残疾证号输入框 */}
+          <View className="mb-4">
+            <Text className="text-sm text-gray-600 block mb-2">手机号/身份证号/残疾证号</Text>
+            <View className="border border-gray-300 rounded-lg px-4 py-3 bg-gray-50">
+              <Input
+                className="w-full text-base"
+                placeholder="请输入手机号/身份证号/残疾证号"
+                value={identifier}
+                onInput={(e) => setIdentifier(e.detail.value)}
+                disabled={loading}
+                data-testid="talent-identifier-input"
+              />
+            </View>
+          </View>
+
+          {/* 密码输入框 */}
+          <View className="mb-6">
+            <Text className="text-sm text-gray-600 block mb-2">密码</Text>
+            <View className="border border-gray-300 rounded-lg px-4 py-3 bg-gray-50">
+              <Input
+                className="w-full text-base"
+                placeholder="请输入密码"
+                value={password}
+                onInput={(e) => setPassword(e.detail.value)}
+                disabled={loading}
+                password
+                data-testid="talent-password-input"
+              />
+            </View>
+          </View>
+
+          {/* 登录按钮 */}
+          <Button
+            className="w-full rounded-lg text-white font-medium py-3 mb-4"
+            style={{
+              background: loading ? '#9ca3af' : 'linear-gradient(135deg, #3b82f6 0%, #1e40af 100%)'
+            }}
+            onClick={handleLogin}
+            disabled={loading}
+            data-testid="talent-login-button"
+          >
+            {loading ? '登录中...' : '登录'}
+          </Button>
+
+          {/* 忘记密码链接 */}
+          <View className="text-center">
+            <Text
+              className="text-sm text-blue-500"
+              onClick={handleForgotPassword}
+            >
+              忘记密码?
+            </Text>
+          </View>
+        </View>
+
+        {/* 底部说明 - 暂时注释掉以通过小程序审核 */}
+        {/* <View className="mt-8 text-center">
+          <Text className="text-xs text-white/60">
+            登录即表示您同意用户协议和隐私政策
+          </Text>
+        </View> */}
+      </View>
+    </View>
+  )
+}
+
+export default LoginPage

+ 145 - 2
mini-talent/src/pages/personal-info/index.tsx

@@ -1,4 +1,147 @@
-import PersonalInfoPage from '@d8d/rencai-personal-info-ui/pages/PersonalInfoPage/PersonalInfoPage'
+import React, { useEffect } from 'react'
+import { View, ScrollView, Text } from '@tarojs/components'
+import { useQuery } from '@tanstack/react-query'
+import Taro from '@tarojs/taro'
+import { RencaiTabBarLayout } from '../../components/RencaiTabBarLayout'
+import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'
+import { talentPersonalInfoClient } from '../../api'
+import { useRequireAuth } from '../../hooks'
+import UserInfoHeader from '../../components/UserInfoHeader'
+import PersonalBasicInfo, { PersonalInfoResponse } from '../../components/PersonalBasicInfo'
+import BankCardInfo from '../../components/BankCardInfo'
+import { BankCardInfo as BankCardInfoType } from '../../components/BankCardItem'
+import DocumentPhotos from '../../components/DocumentPhotos'
+import { PhotoInfo } from '../../components/DocumentPhotoItem'
 
-export default PersonalInfoPage
+/**
+ * 人才小程序个人信息页
+ * TabBar页面 - 无返回按钮
+ * 原型参考: docs/小程序原型/rencai.html (行483-628)
+ */
+const PersonalInfoPage: React.FC = () => {
+  // 检查登录状态,未登录则重定向
+  useRequireAuth()
+
+  // 获取个人信息
+  const { data: personalInfo, isLoading: personalInfoLoading, error: personalInfoError } = useQuery({
+    queryKey: ['talentPersonalInfo'],
+    queryFn: async () => {
+      const response = await talentPersonalInfoClient.personal.info.$get()
+      if (response.status !== 200) {
+        throw new Error('获取个人信息失败')
+      }
+      return response.json() as Promise<PersonalInfoResponse>
+    },
+    refetchOnWindowFocus: false
+  })
+
+  // 获取银行卡信息
+  const { data: bankCardsData, isLoading: bankCardsLoading, error: bankCardsError } = useQuery({
+    queryKey: ['talentBankCards'],
+    queryFn: async () => {
+      const response = await talentPersonalInfoClient.personal['bank-cards'].$get()
+      if (response.status !== 200) {
+        throw new Error('获取银行卡信息失败')
+      }
+      const data = await response.json()
+      return data.data as BankCardInfoType[]
+    },
+    refetchOnWindowFocus: false
+  })
+
+  // 获取证件照片
+  const { data: photosData, isLoading: photosLoading, error: photosError } = useQuery({
+    queryKey: ['talentPhotos'],
+    queryFn: async () => {
+      const response = await talentPersonalInfoClient.personal.photos.$get({
+        query: { skip: 0, take: 100 }
+      })
+      if (response.status !== 200) {
+        throw new Error('获取证件照片失败')
+      }
+      const data = await response.json()
+      return data.data as PhotoInfo[]
+    },
+    refetchOnWindowFocus: false
+  })
+
+  // 页面加载时设置标题
+  useEffect(() => {
+    Taro.setNavigationBarTitle({
+      title: '个人信息'
+    })
+  }, [])
+
+  // 显示错误提示
+  useEffect(() => {
+    if (personalInfoError) {
+      Taro.showToast({
+        title: '获取个人信息失败',
+        icon: 'none'
+      })
+    }
+    if (bankCardsError) {
+      Taro.showToast({
+        title: '获取银行卡信息失败',
+        icon: 'none'
+      })
+    }
+    if (photosError) {
+      Taro.showToast({
+        title: '获取证件照片失败',
+        icon: 'none'
+      })
+    }
+  }, [personalInfoError, bankCardsError, photosError])
+
+  return (
+    <RencaiTabBarLayout activeKey="personal-info">
+      <ScrollView
+        className="h-[calc(100%-60px)] overflow-y-auto bg-gray-100"
+        scrollY
+      >
+        {/* Navbar导航栏 - TabBar页面无返回按钮 */}
+        <Navbar
+          title="个人信息"
+          leftIcon=""
+          leftText=""
+          onClickLeft={() => {}}
+          backgroundColor="bg-white"
+          border={true}
+          fixed={true}
+          placeholder={true}
+        />
 
+        {/* 顶部用户信息区域 - 直接在Navbar下方,无padding */}
+        <UserInfoHeader
+          personalInfo={personalInfo || null}
+          loading={personalInfoLoading}
+        />
+
+        {/* 页面内容 */}
+        <View className="px-4 py-3 pb-8">
+
+          {/* 个人基本信息卡片 */}
+          <PersonalBasicInfo
+            personalInfo={personalInfo || null}
+            loading={personalInfoLoading}
+          />
+
+          {/* 银行卡信息卡片 */}
+          <BankCardInfo
+            bankCards={bankCardsData || null}
+            loading={bankCardsLoading}
+          />
+
+          {/* 证件照片卡片 */}
+          <DocumentPhotos
+            photos={photosData || null}
+            loading={photosLoading}
+          />
+        </View>
+      </ScrollView>
+    </RencaiTabBarLayout>
+  )
+}
+
+export default PersonalInfoPage

+ 253 - 2
mini-talent/src/pages/settings/index.tsx

@@ -1,4 +1,255 @@
-import SettingsPage from '@d8d/rencai-settings-ui/pages/SettingsPage/SettingsPage'
+import React, { useMemo } from 'react'
+import { View, ScrollView } from '@tarojs/components'
+import Taro from '@tarojs/taro'
+import { useQuery } from '@tanstack/react-query'
+import { RencaiTabBarLayout } from '../../components/RencaiTabBarLayout'
+import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'
+import { useRequireAuth, useAuth } from '../../hooks'
+import { UserProfileSummary } from '../../components/UserProfileSummary'
+import { MenuSection } from '../../components/MenuSection'
+import { LogoutButton } from '../../components/LogoutButton'
+import { talentSettingsClient } from '../../api'
+import type { MenuSection as MenuSectionType } from '../../types/settings'
 
-export default SettingsPage
+/**
+ * 人才小程序设置页
+ * TabBar页面 - 无返回按钮
+ * 原型参考: docs/小程序原型/rencai.html (行770-906)
+ */
+const SettingsPage: React.FC = () => {
+  // 检查登录状态,未登录则重定向
+  useRequireAuth()
+
+  // 使用 useAuth 的 logout 方法
+  const { logout } = useAuth()
+
+  // 查询用户信息(使用React Query)
+  const { data: profile, isLoading, error } = useQuery({
+    queryKey: ['user-profile'],
+    queryFn: async () => {
+      const res = await talentSettingsClient.me.$get()
+      if (!res.ok) {
+        throw new Error('获取用户信息失败')
+      }
+      return await res.json()
+    }
+  })
+
+  // 功能入口菜单配置
+  const menuSections = useMemo<MenuSectionType[]>(() => [
+    {
+      title: undefined,
+      items: [
+        {
+          id: 'personal-info',
+          title: '修改个人信息',
+          icon: 'i-heroicons-user-20-solid',
+          bgColor: 'bg-blue-100',
+          iconColor: 'text-blue-500',
+          onPress: () => {
+            Taro.navigateTo({ url: '/pages/personal-info/index' })
+          }
+        },
+        {
+          id: 'account-security',
+          title: '账号与安全',
+          icon: 'i-heroicons-shield-check-20-solid',
+          bgColor: 'bg-green-100',
+          iconColor: 'text-green-500',
+          onPress: () => {
+            Taro.navigateTo({ url: '/pages/account-security/index' })
+          }
+        },
+        {
+          id: 'notification-settings',
+          title: '消息通知设置',
+          icon: 'i-heroicons-bell-20-solid',
+          bgColor: 'bg-purple-100',
+          iconColor: 'text-purple-500',
+          onPress: () => {
+            Taro.showToast({
+              title: '功能开发中',
+              icon: 'none'
+            })
+          }
+        }
+      ]
+    },
+    {
+      title: undefined,
+      items: [
+        {
+          id: 'help-center',
+          title: '帮助中心',
+          icon: 'i-heroicons-question-mark-circle-20-solid',
+          bgColor: 'bg-yellow-100',
+          iconColor: 'text-yellow-600',
+          onPress: () => {
+            Taro.showToast({
+              title: '帮助中心开发中',
+              icon: 'none'
+            })
+          }
+        },
+        {
+          id: 'user-agreement',
+          title: '用户协议',
+          icon: 'i-heroicons-document-text-20-solid',
+          bgColor: 'bg-indigo-100',
+          iconColor: 'text-indigo-500',
+          onPress: () => {
+            Taro.showToast({
+              title: '用户协议开发中',
+              icon: 'none'
+            })
+          }
+        },
+        {
+          id: 'privacy-policy',
+          title: '隐私政策',
+          icon: 'i-heroicons-lock-closed-20-solid',
+          bgColor: 'bg-pink-100',
+          iconColor: 'text-pink-500',
+          onPress: () => {
+            Taro.showToast({
+              title: '隐私政策开发中',
+              icon: 'none'
+            })
+          }
+        }
+      ]
+    }
+  ], [])
+
+  // 退出登录处理
+  const handleLogout = () => {
+    Taro.showModal({
+      title: '提示',
+      content: '确定要退出登录吗?',
+      success: (res) => {
+        if (res.confirm) {
+          // 使用 useAuth 的 logout 方法
+          logout()
+        }
+      }
+    })
+  }
+
+  // 加载状态
+  if (isLoading) {
+    return (
+      <RencaiTabBarLayout activeKey="settings">
+        <ScrollView className="h-[calc(100%-60px)] overflow-y-auto bg-gray-100" scrollY>
+          <Navbar
+            title="更多"
+            leftIcon=""
+            leftText=""
+            onClickLeft={() => {}}
+            backgroundColor="bg-white"
+            border={true}
+            fixed={true}
+            placeholder={true}
+          />
+          <View className="flex items-center justify-center h-full">
+            <View className="text-gray-600">加载中...</View>
+          </View>
+        </ScrollView>
+      </RencaiTabBarLayout>
+    )
+  }
+
+  // 错误状态
+  if (error) {
+    return (
+      <RencaiTabBarLayout activeKey="settings">
+        <ScrollView className="h-[calc(100%-60px)] overflow-y-auto bg-gray-100" scrollY>
+          <Navbar
+            title="更多"
+            leftIcon=""
+            leftText=""
+            onClickLeft={() => {}}
+            backgroundColor="bg-white"
+            border={true}
+            fixed={true}
+            placeholder={true}
+          />
+          <View className="flex items-center justify-center h-full">
+            <View className="text-gray-600">加载失败,请稍后重试</View>
+          </View>
+        </ScrollView>
+      </RencaiTabBarLayout>
+    )
+  }
 
+  // 使用模拟数据(当API返回空数据时)
+  const mockProfile: {
+    id: number
+    name: string
+    disabilityType: string
+    disabilityLevel: string
+    stats: {
+      thisMonthAttendance: number
+      totalAttendance: number
+      thisMonthSalary: number
+    }
+  } = {
+    id: 1,
+    name: '张明',
+    disabilityType: '肢体残疾',
+    disabilityLevel: '三级',
+    stats: {
+      thisMonthAttendance: 28,
+      totalAttendance: 156,
+      thisMonthSalary: 4800
+    }
+  }
+
+  const displayProfile = profile ? {
+    id: profile.id,
+    name: profile.name || profile.nickname || '用户',
+    disabilityType: profile.personInfo?.disabilityType || '未知',
+    disabilityLevel: profile.personInfo?.disabilityLevel || '未知',
+    stats: {
+      thisMonthAttendance: 0,
+      totalAttendance: 0,
+      thisMonthSalary: 0
+    }
+  } : mockProfile
+
+  return (
+    <RencaiTabBarLayout activeKey="settings">
+      <ScrollView className="h-[calc(100%-60px)] overflow-y-auto bg-gray-100" scrollY>
+        {/* Navbar导航栏 - TabBar页面无返回按钮 */}
+        <Navbar
+          title="更多"
+          leftIcon=""
+          leftText=""
+          onClickLeft={() => {}}
+          backgroundColor="bg-white"
+          border={true}
+          fixed={true}
+          placeholder={true}
+        />
+
+        {/* 个人信息摘要 */}
+        <View className="mt-2">
+          <UserProfileSummary profile={displayProfile} />
+        </View>
+
+        {/* 功能入口列表 */}
+        <View className="px-2 mt-4">
+          {menuSections.map((section, index) => (
+            <MenuSection key={index} section={section} />
+          ))}
+        </View>
+
+        {/* 退出登录按钮 */}
+        <View className="px-2">
+          <LogoutButton onPress={handleLogout} />
+        </View>
+      </ScrollView>
+    </RencaiTabBarLayout>
+  )
+}
+
+export default SettingsPage

+ 76 - 0
mini-talent/src/types/attendance.ts

@@ -0,0 +1,76 @@
+/**
+ * 考勤相关类型定义
+ * 数据结构符合后续API接口规范
+ */
+
+/**
+ * 考勤状态枚举
+ */
+export enum AttendanceStatus {
+  NORMAL = 'normal',         // 正常
+  LATE = 'late',             // 迟到
+  EARLY_LEAVE = 'early',     // 早退
+  ABSENT = 'absent'          // 缺勤
+}
+
+/**
+ * 考勤统计数据
+ */
+export interface AttendanceStats {
+  attendanceRate: number    // 出勤率(如:100表示100%)
+  normalDays: number        // 正常出勤天数
+  lateCount: number         // 迟到次数
+  earlyLeaveCount: number   // 早退次数
+  absentCount: number       // 缺勤次数
+}
+
+/**
+ * 打卡记录
+ */
+export interface AttendanceRecord {
+  date: string              // 日期(如:2023-11-25)
+  weekday: string           // 星期(如:星期六)
+  checkInTime: string       // 上班打卡时间(如:08:30)
+  checkOutTime: string      // 下班打卡时间(如:17:30,未打卡为--:--)
+  status: AttendanceStatus  // 打卡状态
+}
+
+/**
+ * 月份选择器属性
+ */
+export interface MonthSelectorProps {
+  currentMonth: string      // 当前年月显示(如:2023年11月)
+  onPreviousMonth: () => void
+  onNextMonth: () => void
+  onMonthChange?: (year: number, month: number) => void  // Picker选择变化回调
+}
+
+/**
+ * 考勤日历属性
+ */
+export interface AttendanceCalendarProps {
+  year: number
+  month: number
+  attendanceRecords: AttendanceRecord[]
+}
+
+/**
+ * 考勤统计卡片属性
+ */
+export interface AttendanceStatsProps {
+  stats: AttendanceStats
+}
+
+/**
+ * 打卡明细列表属性
+ */
+export interface AttendanceDetailsProps {
+  records: AttendanceRecord[]
+}
+
+/**
+ * 打卡记录项属性
+ */
+export interface AttendanceRecordItemProps {
+  record: AttendanceRecord
+}

+ 86 - 0
mini-talent/src/types/employment.ts

@@ -0,0 +1,86 @@
+/**
+ * 就业信息类型定义
+ */
+
+// 工作状态枚举
+export enum WorkStatus {
+  PRE_WORKING = 'pre_working',      // 待入职
+  WORKING = 'working',              // 在职
+  RESIGNED = 'resigned'             // 已离职
+}
+
+// 当前就业状态
+export interface CurrentEmploymentStatus {
+  companyName: string          // 企业名称
+  orderId: number              // 订单ID
+  orderName: string | null     // 订单名称(岗位名称)
+  positionName: string | null  // 岗位名称
+  joinDate: string             // 入职日期 YYYY-MM-DD
+  workStatus: WorkStatus       // 工作状态
+  salaryLevel: number          // 薪资水平
+  actualStartDate: string | null  // 实际入职日期
+}
+
+// 薪资记录
+export interface SalaryRecord {
+  orderId: number              // 订单ID
+  orderName: string | null     // 订单名称
+  companyName: string | null   // 企业名称
+  salaryAmount: number         // 薪资金额
+  joinDate: string             // 入职日期
+  month: string                // 月份 YYYY-MM
+}
+
+// 就业历史项
+export interface EmploymentHistoryItem {
+  orderId: number              // 订单ID
+  orderName: string | null     // 订单名称
+  companyName: string | null   // 企业名称
+  positionName: string | null  // 岗位名称
+  joinDate: string             // 入职日期
+  leaveDate: string | null     // 离职日期
+  workStatus: WorkStatus       // 工作状态
+  salaryLevel: number          // 薪资水平
+}
+
+// 分页响应
+export interface PaginatedResponse<T> {
+  data: T[]
+  total: number
+}
+
+// 工作状态显示文本映射
+export const WorkStatusLabels: Record<WorkStatus, string> = {
+  [WorkStatus.PRE_WORKING]: '待入职',
+  [WorkStatus.WORKING]: '在职',
+  [WorkStatus.RESIGNED]: '离职'
+}
+
+// 格式化薪资金额
+export function formatSalary(amount: number): string {
+  return `¥${amount.toLocaleString('zh-CN', { minimumFractionDigits: 0, maximumFractionDigits: 2 })}`
+}
+
+// 格式化月份显示
+export function formatMonth(monthStr: string): string {
+  const [year, month] = monthStr.split('-')
+  return `${year}年${parseInt(month)}月`
+}
+
+// 格式化日期范围
+export function formatDateRange(startDate: string, endDate: string | null): string {
+  const formatDate = (date: string) => {
+    const [year, month, day] = date.split('-')
+    return `${year}-${month}-${day}`
+  }
+
+  if (!endDate) {
+    return `${formatDate(startDate)} 至今`
+  }
+  return `${formatDate(startDate)} 至 ${formatDate(endDate)}`
+}
+
+// 判断是否为当前工作
+export function isCurrentWork(status: WorkStatus): boolean {
+  return status === WorkStatus.WORKING
+}

+ 73 - 0
mini-talent/src/types/settings.ts

@@ -0,0 +1,73 @@
+/**
+ * 设置页相关类型定义
+ */
+
+/**
+ * 用户统计数据
+ */
+export interface UserStats {
+  /** 本月出勤天数 */
+  thisMonthAttendance: number
+  /** 累计出勤天数 */
+  totalAttendance: number
+  /** 本月薪资(元) */
+  thisMonthSalary: number
+}
+
+/**
+ * 用户信息摘要
+ */
+export interface UserProfile {
+  /** 用户ID */
+  id: number
+  /** 姓名 */
+  name: string
+  /** 残疾类型 */
+  disabilityType: string
+  /** 残疾等级 */
+  disabilityLevel: string
+  /** 用户统计数据 */
+  stats: UserStats
+}
+
+/**
+ * 登录日志
+ */
+export interface LoginLog {
+  /** 日志ID */
+  id: number
+  /** 登录时间 */
+  loginTime: string
+  /** 设备信息 */
+  device: string
+  /** IP地址 */
+  ipAddress: string
+}
+
+/**
+ * 菜单项类型
+ */
+export interface MenuItem {
+  /** 菜单项唯一标识 */
+  id: string
+  /** 菜单项标题 */
+  title: string
+  /** 图标类名(Heroicons) */
+  icon: string
+  /** 图标背景色类名 */
+  bgColor: string
+  /** 图标颜色类名 */
+  iconColor: string
+  /** 点击处理函数 */
+  onPress: () => void
+}
+
+/**
+ * 菜单分组
+ */
+export interface MenuSection {
+  /** 分组标题 */
+  title?: string
+  /** 菜单项列表 */
+  items: MenuItem[]
+}

+ 30 - 0
mini-talent/src/utils/maskUtils.ts

@@ -0,0 +1,30 @@
+/**
+ * 脱敏工具函数
+ */
+
+/**
+ * 脱敏身份证号
+ * @param idCard 完整身份证号
+ * @returns 脱敏后的身份证号(如:3301**********1234)
+ */
+export function maskIdCard(idCard: string): string {
+  if (!idCard || idCard.length < 8) {
+    return '********'
+  }
+  const prefix = idCard.slice(0, 4)
+  const suffix = idCard.slice(-4)
+  return `${prefix}**********${suffix}`
+}
+
+/**
+ * 脱敏银行卡号
+ * @param cardNumber 完整银行卡号
+ * @returns 脱敏后的银行卡号(如:**** **** **** 1234)
+ */
+export function maskCardNumber(cardNumber: string): string {
+  if (!cardNumber || cardNumber.length < 4) {
+    return '****'
+  }
+  const last4 = cardNumber.slice(-4)
+  return `**** **** **** ${last4}`
+}

+ 143 - 0
mini-talent/src/utils/mockAttendanceData.ts

@@ -0,0 +1,143 @@
+/**
+ * 前端模拟考勤数据
+ * 数据结构符合后续API接口规范,便于后续替换为真实API
+ */
+
+import { AttendanceStats, AttendanceRecord, AttendanceStatus } from '../types/attendance'
+
+/**
+ * 获取指定月份的所有日期
+ */
+function getDatesInMonth(year: number, month: number): Date[] {
+  const dates: Date[] = []
+  const lastDay = new Date(year, month, 0).getDate()
+
+  for (let day = 1; day <= lastDay; day++) {
+    dates.push(new Date(year, month - 1, day))
+  }
+
+  return dates
+}
+
+/**
+ * 格式化日期为 YYYY-MM-DD
+ */
+function formatDate(date: Date): string {
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
+/**
+ * 获取星期名称
+ */
+function getWeekday(date: Date): string {
+  const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
+  return weekdays[date.getDay()]
+}
+
+/**
+ * 判断是否为周末
+ */
+function isWeekend(date: Date): boolean {
+  const day = date.getDay()
+  return day === 0 || day === 6
+}
+
+/**
+ * 生成指定月份的模拟考勤数据
+ * 使用固定值:22天正常出勤,100%出勤率,无迟到早退
+ * @param year 年份
+ * @param month 月份 (1-12)
+ * @returns 考勤统计数据和打卡记录
+ */
+export function generateMockAttendanceData(year: number, month: number): {
+  stats: AttendanceStats
+  records: AttendanceRecord[]
+} {
+  const dates = getDatesInMonth(year, month)
+  const records: AttendanceRecord[] = []
+  let workDayCount = 0
+
+  // 从后向前生成记录(倒序)
+  for (let i = dates.length - 1; i >= 0; i--) {
+    const date = dates[i]
+    const weekday = getWeekday(date)
+    const weekend = isWeekend(date)
+
+    // 周末不打卡
+    if (weekend) {
+      records.push({
+        date: formatDate(date),
+        weekday,
+        checkInTime: '--:--',
+        checkOutTime: '--:--',
+        status: AttendanceStatus.NORMAL
+      })
+    } else {
+      // 工作日全部正常打卡
+      workDayCount++
+      records.push({
+        date: formatDate(date),
+        weekday,
+        checkInTime: '08:30',
+        checkOutTime: '17:30',
+        status: AttendanceStatus.NORMAL
+      })
+    }
+  }
+
+  // 固定统计数据:符合业务需求
+  const stats: AttendanceStats = {
+    attendanceRate: 100,
+    normalDays: workDayCount,
+    lateCount: 0,
+    earlyLeaveCount: 0,
+    absentCount: 0
+  }
+
+  return { stats, records }
+}
+
+/**
+ * 格式化月份显示
+ * @param year 年份
+ * @param month 月份 (1-12)
+ * @returns 格式化的月份字符串(如:2023年11月)
+ */
+export function formatMonth(year: number, month: number): string {
+  return `${year}年${month}月`
+}
+
+/**
+ * 获取当前年月
+ */
+export function getCurrentYearMonth(): { year: number; month: number } {
+  const now = new Date()
+  return {
+    year: now.getFullYear(),
+    month: now.getMonth() + 1
+  }
+}
+
+/**
+ * 获取上个月
+ */
+export function getPreviousMonth(year: number, month: number): { year: number; month: number } {
+  if (month === 1) {
+    return { year: year - 1, month: 12 }
+  }
+  return { year, month: month - 1 }
+}
+
+/**
+ * 获取下个月
+ */
+export function getNextMonth(year: number, month: number): { year: number; month: number } {
+  if (month === 12) {
+    return { year: year + 1, month: 1 }
+  }
+  return { year, month: month + 1 }
+}
+

+ 310 - 114
pnpm-lock.yaml

@@ -1161,22 +1161,22 @@ importers:
         version: 5.90.12(react@18.3.1)
       '@tarojs/components':
         specifier: 4.1.4
-        version: 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+        version: 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/helper':
         specifier: 4.1.4
         version: 4.1.4
       '@tarojs/plugin-framework-react':
         specifier: 4.1.4
-        version: 4.1.4(@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(react@18.3.1)(webpack@5.91.0(@swc/core@1.3.96))
+        version: 4.1.4(@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(react@18.3.1)(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/plugin-platform-alipay':
         specifier: 4.1.4
         version: 4.1.4(@tarojs/service@4.1.4)(@tarojs/shared@4.1.4)
       '@tarojs/plugin-platform-h5':
         specifier: 4.1.4
-        version: 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+        version: 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/plugin-platform-harmony-hybrid':
         specifier: 4.1.4
-        version: 4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+        version: 4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/plugin-platform-jd':
         specifier: 4.1.4
         version: 4.1.4(@tarojs/service@4.1.4)(@tarojs/shared@4.1.4)
@@ -1203,7 +1203,7 @@ importers:
         version: 4.1.4
       '@tarojs/taro':
         specifier: 4.1.4
-        version: 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+        version: 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@weapp-tailwindcss/merge':
         specifier: ^1.2.3
         version: 1.3.0(tailwindcss@4.1.15)
@@ -1255,7 +1255,7 @@ importers:
         version: 2.2.398
       '@pmmmwh/react-refresh-webpack-plugin':
         specifier: ^0.5.5
-        version: 0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+        version: 0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@tailwindcss/postcss':
         specifier: ^4.1.11
         version: 4.1.15
@@ -1267,10 +1267,10 @@ importers:
         version: 4.1.4(@types/node@18.19.130)
       '@tarojs/taro-loader':
         specifier: 4.1.4
-        version: 4.1.4(webpack@5.91.0(@swc/core@1.3.96))
+        version: 4.1.4(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/webpack5-runner':
         specifier: 4.1.4
-        version: 4.1.4(@babel/core@7.28.4)(@swc/core@1.3.96)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.3.96))
+        version: 4.1.4(@babel/core@7.28.4)(@swc/core@1.13.5)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.13.5))
       '@testing-library/jest-dom':
         specifier: ^6.8.0
         version: 6.9.1
@@ -1312,13 +1312,13 @@ importers:
         version: 4.6.2(eslint@8.57.1)
       html-webpack-plugin:
         specifier: ^5.6.3
-        version: 5.6.4(webpack@5.91.0(@swc/core@1.3.96))
+        version: 5.6.4(webpack@5.91.0(@swc/core@1.13.5))
       husky:
         specifier: ^9.1.7
         version: 9.1.7
       jest:
         specifier: ^30.2.0
-        version: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))
+        version: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))
       jest-environment-jsdom:
         specifier: ^29.7.0
         version: 29.7.0
@@ -1342,7 +1342,7 @@ importers:
         version: 4.1.15
       ts-jest:
         specifier: ^29.4.5
-        version: 29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)))(typescript@5.8.3)
+        version: 29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)))(typescript@5.8.3)
       tsconfig-paths-webpack-plugin:
         specifier: ^4.1.0
         version: 4.2.0
@@ -1354,10 +1354,10 @@ importers:
         version: 4.5.2(magicast@0.3.5)(tailwindcss@4.1.15)(typescript@5.8.3)
       webpack:
         specifier: 5.91.0
-        version: 5.91.0(@swc/core@1.3.96)
+        version: 5.91.0(@swc/core@1.13.5)
       webpack-plugin-iframe-communicator:
         specifier: ^0.0.10
-        version: 0.0.10(webpack@5.91.0(@swc/core@1.3.96))
+        version: 0.0.10(webpack@5.91.0(@swc/core@1.13.5))
 
   mini-talent:
     dependencies:
@@ -1367,27 +1367,6 @@ importers:
       '@d8d/mini-shared-ui-components':
         specifier: workspace:*
         version: link:../mini-ui-packages/mini-shared-ui-components
-      '@d8d/rencai-attendance-ui':
-        specifier: workspace:*
-        version: link:../mini-ui-packages/rencai-attendance-ui
-      '@d8d/rencai-auth-ui':
-        specifier: workspace:*
-        version: link:../mini-ui-packages/rencai-auth-ui
-      '@d8d/rencai-dashboard-ui':
-        specifier: workspace:*
-        version: link:../mini-ui-packages/rencai-dashboard-ui
-      '@d8d/rencai-employment-ui':
-        specifier: workspace:*
-        version: link:../mini-ui-packages/rencai-employment-ui
-      '@d8d/rencai-personal-info-ui':
-        specifier: workspace:*
-        version: link:../mini-ui-packages/rencai-personal-info-ui
-      '@d8d/rencai-settings-ui':
-        specifier: workspace:*
-        version: link:../mini-ui-packages/rencai-settings-ui
-      '@d8d/rencai-shared-ui':
-        specifier: workspace:*
-        version: link:../mini-ui-packages/rencai-shared-ui
       '@hookform/resolvers':
         specifier: ^5.2.1
         version: 5.2.2(react-hook-form@7.65.0(react@18.3.1))
@@ -1399,22 +1378,22 @@ importers:
         version: 5.90.12(react@18.3.1)
       '@tarojs/components':
         specifier: 4.1.4
-        version: 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+        version: 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/helper':
         specifier: 4.1.4
         version: 4.1.4
       '@tarojs/plugin-framework-react':
         specifier: 4.1.4
-        version: 4.1.4(@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(react@18.3.1)(webpack@5.91.0(@swc/core@1.13.5))
+        version: 4.1.4(@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(react@18.3.1)(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/plugin-platform-alipay':
         specifier: 4.1.4
         version: 4.1.4(@tarojs/service@4.1.4)(@tarojs/shared@4.1.4)
       '@tarojs/plugin-platform-h5':
         specifier: 4.1.4
-        version: 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+        version: 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/plugin-platform-harmony-hybrid':
         specifier: 4.1.4
-        version: 4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+        version: 4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/plugin-platform-jd':
         specifier: 4.1.4
         version: 4.1.4(@tarojs/service@4.1.4)(@tarojs/shared@4.1.4)
@@ -1441,7 +1420,7 @@ importers:
         version: 4.1.4
       '@tarojs/taro':
         specifier: 4.1.4
-        version: 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+        version: 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@weapp-tailwindcss/merge':
         specifier: ^1.2.3
         version: 1.3.0(tailwindcss@4.1.15)
@@ -1493,7 +1472,7 @@ importers:
         version: 2.2.398
       '@pmmmwh/react-refresh-webpack-plugin':
         specifier: ^0.5.5
-        version: 0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+        version: 0.5.17(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tailwindcss/postcss':
         specifier: ^4.1.11
         version: 4.1.15
@@ -1505,10 +1484,10 @@ importers:
         version: 4.1.4(@types/node@18.19.130)
       '@tarojs/taro-loader':
         specifier: 4.1.4
-        version: 4.1.4(webpack@5.91.0(@swc/core@1.13.5))
+        version: 4.1.4(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/webpack5-runner':
         specifier: 4.1.4
-        version: 4.1.4(@babel/core@7.28.4)(@swc/core@1.13.5)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.13.5))
+        version: 4.1.4(@babel/core@7.28.4)(@swc/core@1.3.96)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.3.96))
       '@testing-library/jest-dom':
         specifier: ^6.8.0
         version: 6.9.1
@@ -1550,13 +1529,13 @@ importers:
         version: 4.6.2(eslint@8.57.1)
       html-webpack-plugin:
         specifier: ^5.6.3
-        version: 5.6.4(webpack@5.91.0(@swc/core@1.13.5))
+        version: 5.6.4(webpack@5.91.0(@swc/core@1.3.96))
       husky:
         specifier: ^9.1.7
         version: 9.1.7
       jest:
         specifier: ^30.2.0
-        version: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3))
+        version: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))
       jest-environment-jsdom:
         specifier: ^29.7.0
         version: 29.7.0
@@ -1580,7 +1559,7 @@ importers:
         version: 4.1.15
       ts-jest:
         specifier: ^29.4.5
-        version: 29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3)))(typescript@5.9.3)
+        version: 29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)))(typescript@5.9.3)
       tsconfig-paths-webpack-plugin:
         specifier: ^4.1.0
         version: 4.2.0
@@ -1592,10 +1571,10 @@ importers:
         version: 4.5.2(magicast@0.3.5)(tailwindcss@4.1.15)(typescript@5.9.3)
       webpack:
         specifier: 5.91.0
-        version: 5.91.0(@swc/core@1.13.5)
+        version: 5.91.0(@swc/core@1.3.96)
       webpack-plugin-iframe-communicator:
         specifier: ^0.0.10
-        version: 0.0.10(webpack@5.91.0(@swc/core@1.13.5))
+        version: 0.0.10(webpack@5.91.0(@swc/core@1.3.96))
 
   mini-ui-packages/mini-charts:
     dependencies:
@@ -20485,6 +20464,42 @@ snapshots:
       jest-util: 30.2.0
       slash: 3.0.0
 
+  '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))':
+    dependencies:
+      '@jest/console': 30.2.0
+      '@jest/pattern': 30.0.1
+      '@jest/reporters': 30.2.0
+      '@jest/test-result': 30.2.0
+      '@jest/transform': 30.2.0
+      '@jest/types': 30.2.0
+      '@types/node': 22.19.1
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      ci-info: 4.3.1
+      exit-x: 0.2.2
+      graceful-fs: 4.2.11
+      jest-changed-files: 30.2.0
+      jest-config: 30.2.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))
+      jest-haste-map: 30.2.0
+      jest-message-util: 30.2.0
+      jest-regex-util: 30.0.1
+      jest-resolve: 30.2.0
+      jest-resolve-dependencies: 30.2.0
+      jest-runner: 30.2.0
+      jest-runtime: 30.2.0
+      jest-snapshot: 30.2.0
+      jest-util: 30.2.0
+      jest-validate: 30.2.0
+      jest-watcher: 30.2.0
+      micromatch: 4.0.8
+      pretty-format: 30.2.0
+      slash: 3.0.0
+    transitivePeerDependencies:
+      - babel-plugin-macros
+      - esbuild-register
+      - supports-color
+      - ts-node
+
   '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3))':
     dependencies:
       '@jest/console': 30.2.0
@@ -20521,7 +20536,7 @@ snapshots:
       - supports-color
       - ts-node
 
-  '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))':
+  '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))':
     dependencies:
       '@jest/console': 30.2.0
       '@jest/pattern': 30.0.1
@@ -20536,7 +20551,7 @@ snapshots:
       exit-x: 0.2.2
       graceful-fs: 4.2.11
       jest-changed-files: 30.2.0
-      jest-config: 30.2.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))
+      jest-config: 30.2.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))
       jest-haste-map: 30.2.0
       jest-message-util: 30.2.0
       jest-regex-util: 30.0.1
@@ -22577,12 +22592,12 @@ snapshots:
       - debug
       - supports-color
 
-  '@tarojs/components-react@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
+  '@tarojs/components-react@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
     dependencies:
       '@babel/runtime': 7.28.4
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       classnames: 2.5.1
       react: 18.3.1
       solid-js: 1.9.9
@@ -22599,12 +22614,12 @@ snapshots:
       - webpack-chain
       - webpack-dev-server
 
-  '@tarojs/components-react@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
+  '@tarojs/components-react@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
     dependencies:
       '@babel/runtime': 7.28.4
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       classnames: 2.5.1
       react: 18.3.1
       solid-js: 1.9.9
@@ -22621,6 +22636,30 @@ snapshots:
       - webpack-chain
       - webpack-dev-server
 
+  '@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
+    dependencies:
+      '@stencil/core': 2.22.3
+      '@tarojs/runtime': 4.1.4
+      '@tarojs/shared': 4.1.4
+      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      classnames: 2.5.1
+      hammerjs: 2.0.8
+      hls.js: 1.6.13
+      resolve-pathname: 3.0.0
+      swiper: 11.1.15
+      tslib: 2.8.1
+    optionalDependencies:
+      '@types/react': 18.3.26
+      vue: 3.5.22(typescript@5.8.3)
+    transitivePeerDependencies:
+      - '@tarojs/helper'
+      - html-webpack-plugin
+      - postcss
+      - rollup
+      - webpack
+      - webpack-chain
+      - webpack-dev-server
+
   '@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
     dependencies:
       '@stencil/core': 2.22.3
@@ -22645,12 +22684,12 @@ snapshots:
       - webpack-chain
       - webpack-dev-server
 
-  '@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
+  '@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
     dependencies:
       '@stencil/core': 2.22.3
       '@tarojs/runtime': 4.1.4
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       classnames: 2.5.1
       hammerjs: 2.0.8
       hls.js: 1.6.13
@@ -22659,7 +22698,7 @@ snapshots:
       tslib: 2.8.1
     optionalDependencies:
       '@types/react': 18.3.26
-      vue: 3.5.22(typescript@5.8.3)
+      vue: 3.5.22(typescript@5.9.3)
     transitivePeerDependencies:
       - '@tarojs/helper'
       - html-webpack-plugin
@@ -22794,16 +22833,16 @@ snapshots:
       '@tarojs/service': 4.1.4
       '@tarojs/shared': 4.1.4
 
-  '@tarojs/plugin-platform-h5@4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
+  '@tarojs/plugin-platform-h5@4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
     dependencies:
       '@babel/core': 7.28.4
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
-      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/helper': 4.1.4
       '@tarojs/runtime': 4.1.4
       '@tarojs/service': 4.1.4
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
+      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
       babel-plugin-transform-taroapi: 4.1.4(@babel/core@7.28.4)
       change-case: 4.1.2
       lodash-es: 4.17.21
@@ -22823,16 +22862,16 @@ snapshots:
       - webpack-chain
       - webpack-dev-server
 
-  '@tarojs/plugin-platform-h5@4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
+  '@tarojs/plugin-platform-h5@4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
     dependencies:
       '@babel/core': 7.28.4
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
-      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/helper': 4.1.4
       '@tarojs/runtime': 4.1.4
       '@tarojs/service': 4.1.4
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
+      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
       babel-plugin-transform-taroapi: 4.1.4(@babel/core@7.28.4)
       change-case: 4.1.2
       lodash-es: 4.17.21
@@ -22852,18 +22891,18 @@ snapshots:
       - webpack-chain
       - webpack-dev-server
 
-  '@tarojs/plugin-platform-harmony-hybrid@4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
+  '@tarojs/plugin-platform-harmony-hybrid@4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
     dependencies:
       '@tarojs/api': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
-      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       '@tarojs/helper': 4.1.4
-      '@tarojs/plugin-platform-h5': 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
-      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
+      '@tarojs/plugin-platform-h5': 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
       '@tarojs/runtime': 4.1.4
       '@tarojs/service': 4.1.4
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
+      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
       axios: 1.12.2(debug@4.4.3)
       babel-plugin-transform-taroapi: 4.1.4(@babel/core@7.28.4)
       base64-js: 1.5.1
@@ -22889,18 +22928,18 @@ snapshots:
       - webpack-chain
       - webpack-dev-server
 
-  '@tarojs/plugin-platform-harmony-hybrid@4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
+  '@tarojs/plugin-platform-harmony-hybrid@4.1.4(@babel/core@7.28.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
     dependencies:
       '@tarojs/api': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
-      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/components-react': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/helper': 4.1.4
-      '@tarojs/plugin-platform-h5': 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
-      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
+      '@tarojs/plugin-platform-h5': 4.1.4(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(react@18.3.1)(rollup@3.29.5)(solid-js@1.9.9)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
       '@tarojs/runtime': 4.1.4
       '@tarojs/service': 4.1.4
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
+      '@tarojs/taro-h5': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
       axios: 1.12.2(debug@4.4.3)
       babel-plugin-transform-taroapi: 4.1.4(@babel/core@7.28.4)
       base64-js: 1.5.1
@@ -22959,11 +22998,11 @@ snapshots:
       react: 18.3.1
       react-reconciler: 0.29.0(react@18.3.1)
 
-  '@tarojs/router@4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))':
+  '@tarojs/router@4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))':
     dependencies:
       '@tarojs/runtime': 4.1.4
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
       dingtalk-jsapi: 2.15.6
       history: 5.3.0
       mobile-detect: 1.4.5
@@ -22971,11 +23010,11 @@ snapshots:
       tslib: 2.8.1
       universal-router: 9.2.1
 
-  '@tarojs/router@4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))':
+  '@tarojs/router@4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))':
     dependencies:
       '@tarojs/runtime': 4.1.4
       '@tarojs/shared': 4.1.4
-      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/taro': 4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       dingtalk-jsapi: 2.15.6
       history: 5.3.0
       mobile-detect: 1.4.5
@@ -23014,11 +23053,11 @@ snapshots:
 
   '@tarojs/shared@4.1.4': {}
 
-  '@tarojs/taro-h5@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))':
+  '@tarojs/taro-h5@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))':
     dependencies:
       '@tarojs/api': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
-      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))
       '@tarojs/runtime': 4.1.4
       '@tarojs/shared': 4.1.4
       abortcontroller-polyfill: 1.7.8
@@ -23034,11 +23073,11 @@ snapshots:
     transitivePeerDependencies:
       - '@tarojs/taro'
 
-  '@tarojs/taro-h5@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))':
+  '@tarojs/taro-h5@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))':
     dependencies:
       '@tarojs/api': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
-      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/router': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)(@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))
       '@tarojs/runtime': 4.1.4
       '@tarojs/shared': 4.1.4
       abortcontroller-polyfill: 1.7.8
@@ -23072,6 +23111,24 @@ snapshots:
       - '@swc/helpers'
       - supports-color
 
+  '@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
+    dependencies:
+      '@tarojs/api': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))
+      '@tarojs/helper': 4.1.4
+      '@tarojs/runtime': 4.1.4
+      '@tarojs/shared': 4.1.4
+      '@types/postcss-url': 10.0.4
+      postcss: 8.5.6
+    optionalDependencies:
+      '@types/react': 18.3.26
+      html-webpack-plugin: 5.6.4(webpack@5.91.0(@swc/core@1.13.5))
+      rollup: 3.29.5
+      vue: 3.5.22(typescript@5.8.3)
+      webpack: 5.91.0(@swc/core@1.13.5)
+      webpack-chain: 6.5.1
+      webpack-dev-server: 4.15.2(webpack@5.91.0(@swc/core@1.13.5))
+
   '@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.13.5)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.13.5)))(webpack@5.91.0(@swc/core@1.13.5))':
     dependencies:
       '@tarojs/api': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)
@@ -23090,10 +23147,10 @@ snapshots:
       webpack-chain: 6.5.1
       webpack-dev-server: 4.15.2(webpack@5.91.0(@swc/core@1.13.5))
 
-  '@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
+  '@tarojs/taro@4.1.4(@tarojs/components@4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96)))(@tarojs/helper@4.1.4)(@tarojs/shared@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))':
     dependencies:
       '@tarojs/api': 4.1.4(@tarojs/runtime@4.1.4)(@tarojs/shared@4.1.4)
-      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.8.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
+      '@tarojs/components': 4.1.4(@tarojs/helper@4.1.4)(@types/react@18.3.26)(html-webpack-plugin@5.6.4(webpack@5.91.0(@swc/core@1.3.96)))(postcss@8.5.6)(rollup@3.29.5)(vue@3.5.22(typescript@5.9.3))(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.91.0(@swc/core@1.3.96)))(webpack@5.91.0(@swc/core@1.3.96))
       '@tarojs/helper': 4.1.4
       '@tarojs/runtime': 4.1.4
       '@tarojs/shared': 4.1.4
@@ -23103,7 +23160,7 @@ snapshots:
       '@types/react': 18.3.26
       html-webpack-plugin: 5.6.4(webpack@5.91.0(@swc/core@1.3.96))
       rollup: 3.29.5
-      vue: 3.5.22(typescript@5.8.3)
+      vue: 3.5.22(typescript@5.9.3)
       webpack: 5.91.0(@swc/core@1.3.96)
       webpack-chain: 6.5.1
       webpack-dev-server: 4.15.2(webpack@5.91.0(@swc/core@1.3.96))
@@ -23134,7 +23191,7 @@ snapshots:
       - '@swc/helpers'
       - supports-color
 
-  '@tarojs/webpack5-runner@4.1.4(@babel/core@7.28.4)(@swc/core@1.13.5)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.13.5))':
+  '@tarojs/webpack5-runner@4.1.4(@babel/core@7.28.4)(@swc/core@1.13.5)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.13.5))':
     dependencies:
       '@babel/core': 7.28.4
       '@tarojs/helper': 4.1.4
@@ -23168,7 +23225,7 @@ snapshots:
       postcss: 8.5.6
       postcss-html-transform: 4.1.4(postcss@8.5.6)
       postcss-import: 16.1.1(postcss@8.5.6)
-      postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.13.5))
+      postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.13.5))
       postcss-plugin-constparse: 4.1.4(postcss@8.5.6)
       postcss-pxtransform: 4.1.4(postcss@8.5.6)
       postcss-url: 10.1.3(postcss@8.5.6)
@@ -23209,7 +23266,7 @@ snapshots:
       - utf-8-validate
       - webpack-cli
 
-  '@tarojs/webpack5-runner@4.1.4(@babel/core@7.28.4)(@swc/core@1.3.96)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.3.96))':
+  '@tarojs/webpack5-runner@4.1.4(@babel/core@7.28.4)(@swc/core@1.3.96)(@tarojs/runtime@4.1.4)(less@4.5.1)(postcss@8.5.6)(sass@1.93.2)(stylus@0.64.0)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.3.96))':
     dependencies:
       '@babel/core': 7.28.4
       '@tarojs/helper': 4.1.4
@@ -23243,7 +23300,7 @@ snapshots:
       postcss: 8.5.6
       postcss-html-transform: 4.1.4(postcss@8.5.6)
       postcss-import: 16.1.1(postcss@8.5.6)
-      postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.3.96))
+      postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.3.96))
       postcss-plugin-constparse: 4.1.4(postcss@8.5.6)
       postcss-pxtransform: 4.1.4(postcss@8.5.6)
       postcss-url: 10.1.3(postcss@8.5.6)
@@ -28012,6 +28069,25 @@ snapshots:
       - babel-plugin-macros
       - supports-color
 
+  jest-cli@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)):
+    dependencies:
+      '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))
+      '@jest/test-result': 30.2.0
+      '@jest/types': 30.2.0
+      chalk: 4.1.2
+      exit-x: 0.2.2
+      import-local: 3.2.0
+      jest-config: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))
+      jest-util: 30.2.0
+      jest-validate: 30.2.0
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - esbuild-register
+      - supports-color
+      - ts-node
+
   jest-cli@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3)):
     dependencies:
       '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3))
@@ -28031,15 +28107,15 @@ snapshots:
       - supports-color
       - ts-node
 
-  jest-cli@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)):
+  jest-cli@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)):
     dependencies:
-      '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))
+      '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))
       '@jest/test-result': 30.2.0
       '@jest/types': 30.2.0
       chalk: 4.1.2
       exit-x: 0.2.2
       import-local: 3.2.0
-      jest-config: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))
+      jest-config: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))
       jest-util: 30.2.0
       jest-validate: 30.2.0
       yargs: 17.7.2
@@ -28050,6 +28126,39 @@ snapshots:
       - supports-color
       - ts-node
 
+  jest-config@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)):
+    dependencies:
+      '@babel/core': 7.28.4
+      '@jest/get-type': 30.1.0
+      '@jest/pattern': 30.0.1
+      '@jest/test-sequencer': 30.2.0
+      '@jest/types': 30.2.0
+      babel-jest: 30.2.0(@babel/core@7.28.4)
+      chalk: 4.1.2
+      ci-info: 4.3.1
+      deepmerge: 4.3.1
+      glob: 10.5.0
+      graceful-fs: 4.2.11
+      jest-circus: 30.2.0
+      jest-docblock: 30.2.0
+      jest-environment-node: 30.2.0
+      jest-regex-util: 30.0.1
+      jest-resolve: 30.2.0
+      jest-runner: 30.2.0
+      jest-util: 30.2.0
+      jest-validate: 30.2.0
+      micromatch: 4.0.8
+      parse-json: 5.2.0
+      pretty-format: 30.2.0
+      slash: 3.0.0
+      strip-json-comments: 3.1.1
+    optionalDependencies:
+      '@types/node': 18.19.130
+      ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)
+    transitivePeerDependencies:
+      - babel-plugin-macros
+      - supports-color
+
   jest-config@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3)):
     dependencies:
       '@babel/core': 7.28.4
@@ -28083,7 +28192,7 @@ snapshots:
       - babel-plugin-macros
       - supports-color
 
-  jest-config@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)):
+  jest-config@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)):
     dependencies:
       '@babel/core': 7.28.4
       '@jest/get-type': 30.1.0
@@ -28111,7 +28220,40 @@ snapshots:
       strip-json-comments: 3.1.1
     optionalDependencies:
       '@types/node': 18.19.130
-      ts-node: 10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)
+      ts-node: 10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)
+    transitivePeerDependencies:
+      - babel-plugin-macros
+      - supports-color
+
+  jest-config@30.2.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)):
+    dependencies:
+      '@babel/core': 7.28.4
+      '@jest/get-type': 30.1.0
+      '@jest/pattern': 30.0.1
+      '@jest/test-sequencer': 30.2.0
+      '@jest/types': 30.2.0
+      babel-jest: 30.2.0(@babel/core@7.28.4)
+      chalk: 4.1.2
+      ci-info: 4.3.1
+      deepmerge: 4.3.1
+      glob: 10.5.0
+      graceful-fs: 4.2.11
+      jest-circus: 30.2.0
+      jest-docblock: 30.2.0
+      jest-environment-node: 30.2.0
+      jest-regex-util: 30.0.1
+      jest-resolve: 30.2.0
+      jest-runner: 30.2.0
+      jest-util: 30.2.0
+      jest-validate: 30.2.0
+      micromatch: 4.0.8
+      parse-json: 5.2.0
+      pretty-format: 30.2.0
+      slash: 3.0.0
+      strip-json-comments: 3.1.1
+    optionalDependencies:
+      '@types/node': 22.19.1
+      ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)
     transitivePeerDependencies:
       - babel-plugin-macros
       - supports-color
@@ -28149,7 +28291,7 @@ snapshots:
       - babel-plugin-macros
       - supports-color
 
-  jest-config@30.2.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)):
+  jest-config@30.2.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)):
     dependencies:
       '@babel/core': 7.28.4
       '@jest/get-type': 30.1.0
@@ -28177,7 +28319,7 @@ snapshots:
       strip-json-comments: 3.1.1
     optionalDependencies:
       '@types/node': 22.19.1
-      ts-node: 10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)
+      ts-node: 10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)
     transitivePeerDependencies:
       - babel-plugin-macros
       - supports-color
@@ -28468,6 +28610,19 @@ snapshots:
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
+  jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)):
+    dependencies:
+      '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))
+      '@jest/types': 30.2.0
+      import-local: 3.2.0
+      jest-cli: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - esbuild-register
+      - supports-color
+      - ts-node
+
   jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3)):
     dependencies:
       '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3))
@@ -28481,12 +28636,12 @@ snapshots:
       - supports-color
       - ts-node
 
-  jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)):
+  jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)):
     dependencies:
-      '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))
+      '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))
       '@jest/types': 30.2.0
       import-local: 3.2.0
-      jest-cli: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))
+      jest-cli: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))
     transitivePeerDependencies:
       - '@types/node'
       - babel-plugin-macros
@@ -29850,25 +30005,25 @@ snapshots:
       '@csstools/utilities': 2.0.0(postcss@8.5.6)
       postcss: 8.5.6
 
-  postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.3.96)):
+  postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.91.0(@swc/core@1.13.5)):
     dependencies:
       cosmiconfig: 9.0.0(typescript@5.8.3)
       jiti: 2.6.1
       postcss: 8.5.6
       semver: 7.7.3
     optionalDependencies:
-      webpack: 5.91.0(@swc/core@1.3.96)
+      webpack: 5.91.0(@swc/core@1.13.5)
     transitivePeerDependencies:
       - typescript
 
-  postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.13.5)):
+  postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.91.0(@swc/core@1.3.96)):
     dependencies:
       cosmiconfig: 9.0.0(typescript@5.9.3)
       jiti: 2.6.1
       postcss: 8.5.6
       semver: 7.7.3
     optionalDependencies:
-      webpack: 5.91.0(@swc/core@1.13.5)
+      webpack: 5.91.0(@swc/core@1.3.96)
     transitivePeerDependencies:
       - typescript
 
@@ -31781,6 +31936,26 @@ snapshots:
     dependencies:
       typescript: 5.9.3
 
+  ts-jest@29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3)))(typescript@5.8.3):
+    dependencies:
+      bs-logger: 0.2.6
+      fast-json-stable-stringify: 2.1.0
+      handlebars: 4.7.8
+      jest: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3))
+      json5: 2.2.3
+      lodash.memoize: 4.1.2
+      make-error: 1.3.6
+      semver: 7.7.3
+      type-fest: 4.41.0
+      typescript: 5.8.3
+      yargs-parser: 21.1.1
+    optionalDependencies:
+      '@babel/core': 7.28.4
+      '@jest/transform': 30.2.0
+      '@jest/types': 30.2.0
+      babel-jest: 30.2.0(@babel/core@7.28.4)
+      jest-util: 30.2.0
+
   ts-jest@29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3)))(typescript@5.9.3):
     dependencies:
       bs-logger: 0.2.6
@@ -31801,18 +31976,18 @@ snapshots:
       babel-jest: 30.2.0(@babel/core@7.28.4)
       jest-util: 30.2.0
 
-  ts-jest@29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3)))(typescript@5.8.3):
+  ts-jest@29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3)))(typescript@5.9.3):
     dependencies:
       bs-logger: 0.2.6
       fast-json-stable-stringify: 2.1.0
       handlebars: 4.7.8
-      jest: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3))
+      jest: 30.2.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3))
       json5: 2.2.3
       lodash.memoize: 4.1.2
       make-error: 1.3.6
       semver: 7.7.3
       type-fest: 4.41.0
-      typescript: 5.8.3
+      typescript: 5.9.3
       yargs-parser: 21.1.1
     optionalDependencies:
       '@babel/core': 7.28.4
@@ -31826,6 +32001,27 @@ snapshots:
       '@ts-morph/common': 0.27.0
       code-block-writer: 13.0.3
 
+  ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.8.3):
+    dependencies:
+      '@cspotcode/source-map-support': 0.8.1
+      '@tsconfig/node10': 1.0.12
+      '@tsconfig/node12': 1.0.11
+      '@tsconfig/node14': 1.0.3
+      '@tsconfig/node16': 1.0.4
+      '@types/node': 18.19.130
+      acorn: 8.15.0
+      acorn-walk: 8.3.4
+      arg: 4.1.3
+      create-require: 1.1.1
+      diff: 4.0.2
+      make-error: 1.3.6
+      typescript: 5.8.3
+      v8-compile-cache-lib: 3.0.1
+      yn: 3.1.1
+    optionalDependencies:
+      '@swc/core': 1.13.5
+    optional: true
+
   ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.130)(typescript@5.9.3):
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
@@ -31930,7 +32126,7 @@ snapshots:
     optionalDependencies:
       '@swc/core': 1.13.5
 
-  ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.8.3):
+  ts-node@10.9.2(@swc/core@1.3.96)(@types/node@18.19.130)(typescript@5.9.3):
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.12
@@ -31944,7 +32140,7 @@ snapshots:
       create-require: 1.1.1
       diff: 4.0.2
       make-error: 1.3.6
-      typescript: 5.8.3
+      typescript: 5.9.3
       v8-compile-cache-lib: 3.0.1
       yn: 3.1.1
     optionalDependencies: