Browse Source

refactor: 移除uview-plus组件库及相关文件

删除uview-plus组件库的所有文件,包括组件、样式、工具函数和配置文件
清理相关的CSS和SCSS文件,优化项目结构
xuexiuyun 3 months ago
parent
commit
7b295d13a1
100 changed files with 3556 additions and 12026 deletions
  1. 80 76
      common/icon-map.ts
  2. 25 0
      pages.json
  3. 297 239
      pages/account/account.uvue
  4. 204 0
      pages/account/transfer.uvue
  5. 302 0
      pages/account/withdraw.uvue
  6. 135 41
      pages/homepage/serviceProject.uvue
  7. 14 2
      pages/map/map.uvue
  8. 165 0
      pages/myEdit/changePhone.uvue
  9. 177 0
      pages/myEdit/feedback.uvue
  10. 349 0
      pages/myEdit/level.uvue
  11. 190 0
      pages/myEdit/logout.uvue
  12. 347 328
      pages/myEdit/my.uvue
  13. 144 2
      pages/myEdit/myEdit.uvue
  14. 214 0
      pages/myEdit/offsiteSign.uvue
  15. 83 75
      pages/myEdit/setting.uvue
  16. 117 0
      pages/myEdit/sign.uvue
  17. 191 0
      pages/myEdit/terminate.uvue
  18. 70 70
      pages/order/order.uvue
  19. 1 0
      static/icons/hollowquery.svg
  20. 1 0
      static/icons/sync.svg
  21. 1 1
      static/icons/view_off.svg
  22. 2 1
      uni.css
  23. 9 1
      uni.css.map
  24. 2 1
      uni_modules/uni-list/components/uni-list-chat/uni-list-chat.css
  25. 9 1
      uni_modules/uni-list/components/uni-list-chat/uni-list-chat.css.map
  26. 197 119
      uni_modules/uni-scss/index.css
  27. 0 0
      uni_modules/uni-scss/index.css.map
  28. 197 119
      uni_modules/uni-scss/styles/index.css
  29. 0 0
      uni_modules/uni-scss/styles/index.css.map
  30. 1 1
      uni_modules/uni-scss/styles/tools/functions.css
  31. 9 1
      uni_modules/uni-scss/styles/tools/functions.css.map
  32. 1 1
      uni_modules/uni-scss/theme.css
  33. 9 1
      uni_modules/uni-scss/theme.css.map
  34. 2 1
      uni_modules/uni-scss/variables.css
  35. 11 1
      uni_modules/uni-scss/variables.css.map
  36. 0 21
      uni_modules/uview-plus/LICENSE
  37. 0 89
      uni_modules/uview-plus/README.md
  38. 0 1797
      uni_modules/uview-plus/changelog.md
  39. 0 109
      uni_modules/uview-plus/components/u-action-sheet-data/u-action-sheet-data.vue
  40. 0 28
      uni_modules/uview-plus/components/u-action-sheet/actionSheet.js
  41. 0 80
      uni_modules/uview-plus/components/u-action-sheet/props.js
  42. 0 302
      uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue
  43. 0 76
      uni_modules/uview-plus/components/u-agreement/u-agreement.vue
  44. 0 28
      uni_modules/uview-plus/components/u-album/album.js
  45. 0 95
      uni_modules/uview-plus/components/u-album/props.js
  46. 0 344
      uni_modules/uview-plus/components/u-album/u-album.vue
  47. 0 26
      uni_modules/uview-plus/components/u-alert/alert.js
  48. 0 75
      uni_modules/uview-plus/components/u-alert/props.js
  49. 0 293
      uni_modules/uview-plus/components/u-alert/u-alert.vue
  50. 0 23
      uni_modules/uview-plus/components/u-avatar-group/avatarGroup.js
  51. 0 54
      uni_modules/uview-plus/components/u-avatar-group/props.js
  52. 0 109
      uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue
  53. 0 28
      uni_modules/uview-plus/components/u-avatar/avatar.js
  54. 0 81
      uni_modules/uview-plus/components/u-avatar/props.js
  55. 0 61
      uni_modules/uview-plus/components/u-avatar/u-avatar.vue
  56. 0 27
      uni_modules/uview-plus/components/u-back-top/backtop.js
  57. 0 56
      uni_modules/uview-plus/components/u-back-top/props.js
  58. 0 132
      uni_modules/uview-plus/components/u-back-top/u-back-top.vue
  59. 0 27
      uni_modules/uview-plus/components/u-badge/badge.js
  60. 0 79
      uni_modules/uview-plus/components/u-badge/props.js
  61. 0 176
      uni_modules/uview-plus/components/u-badge/u-badge.vue
  62. 0 1000
      uni_modules/uview-plus/components/u-barcode/u-barcode.vue
  63. 0 24
      uni_modules/uview-plus/components/u-box/box.js
  64. 0 57
      uni_modules/uview-plus/components/u-box/props.js
  65. 0 106
      uni_modules/uview-plus/components/u-box/u-box.vue
  66. 0 43
      uni_modules/uview-plus/components/u-button/button.js
  67. 0 46
      uni_modules/uview-plus/components/u-button/nvue.scss
  68. 0 159
      uni_modules/uview-plus/components/u-button/props.js
  69. 0 503
      uni_modules/uview-plus/components/u-button/u-button.vue
  70. 0 81
      uni_modules/uview-plus/components/u-button/vue.scss
  71. 0 48
      uni_modules/uview-plus/components/u-calendar/calendar.js
  72. 0 109
      uni_modules/uview-plus/components/u-calendar/header.vue
  73. 0 616
      uni_modules/uview-plus/components/u-calendar/month.vue
  74. 0 169
      uni_modules/uview-plus/components/u-calendar/props.js
  75. 0 421
      uni_modules/uview-plus/components/u-calendar/u-calendar.vue
  76. 0 86
      uni_modules/uview-plus/components/u-calendar/util.js
  77. 0 423
      uni_modules/uview-plus/components/u-canvas/u-canvas.vue
  78. 0 15
      uni_modules/uview-plus/components/u-car-keyboard/carKeyboard.js
  79. 0 17
      uni_modules/uview-plus/components/u-car-keyboard/props.js
  80. 0 314
      uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue
  81. 0 40
      uni_modules/uview-plus/components/u-card/card.js
  82. 0 134
      uni_modules/uview-plus/components/u-card/props.js
  83. 0 184
      uni_modules/uview-plus/components/u-card/u-card.vue
  84. 0 345
      uni_modules/uview-plus/components/u-cascader/u-cascader.vue
  85. 0 391
      uni_modules/uview-plus/components/u-cate-tab/u-cate-tab.vue
  86. 0 17
      uni_modules/uview-plus/components/u-cell-group/cellGroup.js
  87. 0 16
      uni_modules/uview-plus/components/u-cell-group/props.js
  88. 0 66
      uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue
  89. 0 35
      uni_modules/uview-plus/components/u-cell/cell.js
  90. 0 112
      uni_modules/uview-plus/components/u-cell/props.js
  91. 0 267
      uni_modules/uview-plus/components/u-cell/u-cell.vue
  92. 0 29
      uni_modules/uview-plus/components/u-checkbox-group/checkboxGroup.js
  93. 0 93
      uni_modules/uview-plus/components/u-checkbox-group/props.js
  94. 0 136
      uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue
  95. 0 27
      uni_modules/uview-plus/components/u-checkbox/checkbox.js
  96. 0 76
      uni_modules/uview-plus/components/u-checkbox/props.js
  97. 0 389
      uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue
  98. 0 109
      uni_modules/uview-plus/components/u-choose/u-choose.vue
  99. 0 15
      uni_modules/uview-plus/components/u-circle-progress/circleProgress.js
  100. 0 10
      uni_modules/uview-plus/components/u-circle-progress/props.js

+ 80 - 76
common/icon-map.ts

@@ -1,78 +1,82 @@
-// node generate-icon-map.js
+
 // 由脚本自动生成,请勿手动修改
 export const iconMap = {
-	"alipay": "/static/icons/alipay.svg",
-	"arrow_down": "/static/icons/arrow_down.svg",
-	"arrow_left": "/static/icons/arrow_left.svg",
-	"arrow_right": "/static/icons/arrow_right.svg",
-	"arrow_up": "/static/icons/arrow_up.svg",
-	"calculator": "/static/icons/calculator.svg",
-	"cart": "/static/icons/cart.svg",
-	"cart_empty": "/static/icons/cart_empty.svg",
-	"caution": "/static/icons/caution.svg",
-	"caution_filled": "/static/icons/caution_filled.svg",
-	"check": "/static/icons/check.svg",
-	"check_filled": "/static/icons/check_filled.svg",
-	"close": "/static/icons/close.svg",
-	"close_filled": "/static/icons/close_filled.svg",
-	"copy": "/static/icons/copy.svg",
-	"customer-interests": "/static/icons/customer-interests.svg",
-	"customer_service": "/static/icons/customer_service.svg",
-	"discount": "/static/icons/discount.svg",
-	"download": "/static/icons/download.svg",
-	"down_to_bottom": "/static/icons/down_to_bottom.svg",
-	"edit": "/static/icons/edit.svg",
-	"email": "/static/icons/email.svg",
-	"ET": "/static/icons/ET.svg",
-	"filter": "/static/icons/filter.svg",
-	"flow": "/static/icons/flow.svg",
-	"forbidden": "/static/icons/forbidden.svg",
-	"forbidden_filled": "/static/icons/forbidden_filled.svg",
-	"help": "/static/icons/help.svg",
-	"help_filled": "/static/icons/help_filled.svg",
-	"image": "/static/icons/image.svg",
-	"info": "/static/icons/info.svg",
-	"info_filled": "/static/icons/info_filled.svg",
-	"international": "/static/icons/international.svg",
-	"like": "/static/icons/like.svg",
-	"like_filled": "/static/icons/like_filled.svg",
-	"link": "/static/icons/link.svg",
-	"list": "/static/icons/list.svg",
-	"location": "/static/icons/location.svg",
-	"lock": "/static/icons/lock.svg",
-	"message": "/static/icons/message.svg",
-	"message_unread": "/static/icons/message_unread.svg",
-	"navigation": "/static/icons/navigation.svg",
-	"notification": "/static/icons/notification.svg",
-	"notification_off": "/static/icons/notification_off.svg",
-	"order_unread": "/static/icons/order_unread.svg",
-	"page_first": "/static/icons/page_first.svg",
-	"page_last": "/static/icons/page_last.svg",
-	"page_turning_left": "/static/icons/page_turning_left.svg",
-	"page_turning_right": "/static/icons/page_turning_right.svg",
-	"partner": "/static/icons/partner.svg",
-	"phone": "/static/icons/phone.svg",
-	"phonecall": "/static/icons/phonecall.svg",
-	"phonecall_off": "/static/icons/phonecall_off.svg",
-	"play": "/static/icons/play.svg",
-	"record": "/static/icons/record.svg",
-	"refresh": "/static/icons/refresh.svg",
-	"region": "/static/icons/region.svg",
-	"search": "/static/icons/search.svg",
-	"setting": "/static/icons/setting.svg",
-	"share": "/static/icons/share.svg",
-	"show_less": "/static/icons/show_less.svg",
-	"show_more": "/static/icons/show_more.svg",
-	"social_wechat": "/static/icons/social_wechat.svg",
-	"star": "/static/icons/star.svg",
-	"star_filled": "/static/icons/star_filled.svg",
-	"store": "/static/icons/store.svg",
-	"sub_account": "/static/icons/sub_account.svg",
-	"time": "/static/icons/time.svg",
-	"unlock": "/static/icons/unlock.svg",
-	"upload": "/static/icons/upload.svg",
-	"up_to_top": "/static/icons/up_to_top.svg",
-	"user": "/static/icons/user.svg",
-	"view": "/static/icons/view.svg",
-	"view_off": "/static/icons/view_off.svg"
-};
+  "alipay": "/static/icons/alipay.svg",
+  "arrow_down": "/static/icons/arrow_down.svg",
+  "arrow_left": "/static/icons/arrow_left.svg",
+  "arrow_right": "/static/icons/arrow_right.svg",
+  "arrow_up": "/static/icons/arrow_up.svg",
+  "calculator": "/static/icons/calculator.svg",
+  "cart": "/static/icons/cart.svg",
+  "cart_empty": "/static/icons/cart_empty.svg",
+  "caution": "/static/icons/caution.svg",
+  "caution_filled": "/static/icons/caution_filled.svg",
+  "check": "/static/icons/check.svg",
+  "checkCircle": "/static/icons/checkCircle.svg",
+  "check_filled": "/static/icons/check_filled.svg",
+  "close": "/static/icons/close.svg",
+  "close_filled": "/static/icons/close_filled.svg",
+  "copy": "/static/icons/copy.svg",
+  "customer-interests": "/static/icons/customer-interests.svg",
+  "customerservice": "/static/icons/customerservice.svg",
+  "customer_service": "/static/icons/customer_service.svg",
+  "discount": "/static/icons/discount.svg",
+  "download": "/static/icons/download.svg",
+  "down_to_bottom": "/static/icons/down_to_bottom.svg",
+  "edit": "/static/icons/edit.svg",
+  "email": "/static/icons/email.svg",
+  "ET": "/static/icons/ET.svg",
+  "filter": "/static/icons/filter.svg",
+  "flow": "/static/icons/flow.svg",
+  "forbidden": "/static/icons/forbidden.svg",
+  "forbidden_filled": "/static/icons/forbidden_filled.svg",
+  "help": "/static/icons/help.svg",
+  "help_filled": "/static/icons/help_filled.svg",
+  "hollowquery": "/static/icons/hollowquery.svg",
+  "image": "/static/icons/image.svg",
+  "info": "/static/icons/info.svg",
+  "info_filled": "/static/icons/info_filled.svg",
+  "international": "/static/icons/international.svg",
+  "like": "/static/icons/like.svg",
+  "like_filled": "/static/icons/like_filled.svg",
+  "link": "/static/icons/link.svg",
+  "list": "/static/icons/list.svg",
+  "location": "/static/icons/location.svg",
+  "lock": "/static/icons/lock.svg",
+  "message": "/static/icons/message.svg",
+  "message_unread": "/static/icons/message_unread.svg",
+  "navigation": "/static/icons/navigation.svg",
+  "notification": "/static/icons/notification.svg",
+  "notification_off": "/static/icons/notification_off.svg",
+  "order_unread": "/static/icons/order_unread.svg",
+  "page_first": "/static/icons/page_first.svg",
+  "page_last": "/static/icons/page_last.svg",
+  "page_turning_left": "/static/icons/page_turning_left.svg",
+  "page_turning_right": "/static/icons/page_turning_right.svg",
+  "partner": "/static/icons/partner.svg",
+  "phone": "/static/icons/phone.svg",
+  "phonecall": "/static/icons/phonecall.svg",
+  "phonecall_off": "/static/icons/phonecall_off.svg",
+  "play": "/static/icons/play.svg",
+  "record": "/static/icons/record.svg",
+  "refresh": "/static/icons/refresh.svg",
+  "region": "/static/icons/region.svg",
+  "search": "/static/icons/search.svg",
+  "setting": "/static/icons/setting.svg",
+  "share": "/static/icons/share.svg",
+  "show_less": "/static/icons/show_less.svg",
+  "show_more": "/static/icons/show_more.svg",
+  "social_wechat": "/static/icons/social_wechat.svg",
+  "star": "/static/icons/star.svg",
+  "star_filled": "/static/icons/star_filled.svg",
+  "store": "/static/icons/store.svg",
+  "sub_account": "/static/icons/sub_account.svg",
+  "sync": "/static/icons/sync.svg",
+  "time": "/static/icons/time.svg",
+  "unlock": "/static/icons/unlock.svg",
+  "upload": "/static/icons/upload.svg",
+  "up_to_top": "/static/icons/up_to_top.svg",
+  "user": "/static/icons/user.svg",
+  "view": "/static/icons/view.svg",
+  "view_off": "/static/icons/view_off.svg"
+};

+ 25 - 0
pages.json

@@ -118,7 +118,32 @@
 			"style": {
 				"navigationBarTitleText": ""
 			}
+		},
+		{
+			"path": "pages/myEdit/terminate",
+			"style": {
+				"navigationBarTitleText": "解约"
+			}
+		},
+		{
+			"path": "pages/myEdit/logout",
+			"style": {
+				"navigationBarTitleText": "退出登录"
+			}
+		},
+		{
+			"path": "pages/myEdit/changePhone",
+			"style": {
+				"navigationBarTitleText": "修改手机号"
+			}
+		},
+		{
+			"path": "pages/myEdit/sign",
+			"style": {
+				"navigationBarTitleText": "签约"
+			}
 		}
+
 	],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",

+ 297 - 239
pages/account/account.uvue

@@ -2,57 +2,62 @@
 	<view class="page-container">
 
 		<!-- 1. 资产卡片区域 -->
-		<view class="asset-card">
-			<!-- 总资产 -->
-			<view class="total-asset-section row-between">
-				<text class="label">
-					我的资产(元)
-				</text>
-				<view class="amount-row row-start">
-					<!-- 修复:确保 totalAsset 已定义 -->
-					<text class="amount">
-						{{ totalAsset }}
-					</text>
-					<u-icon type="eye" :size="20" color="#333">
-					</u-icon>
-				</view>
-				<!-- 修复:确保 refreshData 已定义 -->
-				<view class="refresh-btn row-center" @click="refreshData">
-					<u-icon type="refresh" :size="18" color="#333">
-					</u-icon>
-					<text>
-						刷新
-					</text>
+		<view class="income-section ">
+			<view class="asset-card">
+				<!-- 总资产 -->
+				<view class="total-asset-section row-between">
+					<view>
+						<view class="row-start">
+							<text class="label">
+								我的资产(元)
+							</text>
+							<u-icon v-if="isShowAmount" name="view" :size="20" @click="toggleShowAmount" />
+							<u-icon v-else name="view_off" :size="20" @click="toggleShowAmount" />
+						</view>
+						<text class="amount" style="margin-top: 20rpx;">
+							{{ isShowAmount ? totalAsset : '***' }}
+						</text>
+					</view>
+					<view class="refresh-btn row-center" @click="refreshData">
+						<u-icon name="sync" :size="18" />
+
+						<text>
+							刷新
+						</text>
+					</view>
 				</view>
 			</view>
-
 			<!-- 累计收益 & 打车费 -->
-			<view class="income-section row-start">
+
+			<image class="bg-image" src="/static/imagesInfo/zh-bg.png">
+			</image>
+			<view class="detail-container row-start ">
 				<!-- 左侧:累计收益 -->
-				<view class="income-item column">
-					<view class="income-header row-start">
-						<text class="income-label">
-							累计收益(元)
-						</text>
-						<u-icon type="help" :size="16" color="#999">
-						</u-icon>
-					</view>
-					<view class="income-main row-between">
-						<!-- 修复:确保 cumulativeIncome 已定义 -->
-						<text class="income-value">
-							{{ cumulativeIncome }}
-						</text>
-						<!-- 修复:确保 handleWithdraw 已定义 -->
-						<view class="withdraw-btn" @click="handleWithdraw('income')">
-							提现
+				<view class="income-item column ">
+					<view class="income-header-content">
+						<view class="row-start" style="margin-top: 30rpx;">
+							<text class="income-label">
+								累计收益(元)
+							</text>
+							<u-icon name="hollowquery" :size="16" color="#999" @click="openIncomePopup" />
+						</view>
+
+						<view class="income-main row-between">
+							<text class="income-value">
+								{{ cumulativeIncome }}
+							</text>
+							<view class="withdraw-btn" @click="handleWithdraw('income')">
+								提现
+							</view>
 						</view>
 					</view>
 					<view class="income-detail row-start">
+						<image class="jine-bg" src="/static/imagesInfo/jine-bg.png" mode="widthFix">
+						</image>
 						<view class="detail-item column-center">
 							<text class="detail-label">
 								冻结(元)
 							</text>
-							<!-- 修复:确保 frozenIncome 已定义 -->
 							<text class="detail-value">
 								{{ frozenIncome }}
 							</text>
@@ -63,7 +68,7 @@
 							<text class="detail-label">
 								可提现(元)
 							</text>
-							<text class="detail-value highlight">
+							<text class="detail-value">
 								{{ availableIncome }}
 							</text>
 						</view>
@@ -71,13 +76,13 @@
 				</view>
 
 				<!-- 右侧:打车费 -->
-				<view class="income-item column">
-					<view class="income-header row-start">
+				<view class="income-item column " style="padding-left: 20rpx;">
+
+					<view class=" row-start" style="margin-top: 30rpx;">
 						<text class="income-label">
 							打车费(元)
 						</text>
-						<u-icon type="help" :size="16" color="#999">
-						</u-icon>
+						<u-icon name="hollowquery" :size="16" color="#999" @click="openTaxiPopup" />
 					</view>
 					<view class="income-main row-between">
 						<text class="income-value">
@@ -87,7 +92,10 @@
 							转出
 						</view>
 					</view>
+
 					<view class="income-detail row-start">
+						<image class="jine-bg" src="/static/imagesInfo/jine-bg.png" mode="widthFix">
+						</image>
 						<view class="detail-item column-center">
 							<text class="detail-label">
 								冻结(元)
@@ -102,96 +110,102 @@
 							<text class="detail-label">
 								可使用(元)
 							</text>
-							<text class="detail-value highlight">
+							<text class="detail-value">
 								{{ availableTaxi }}
 							</text>
 						</view>
 					</view>
 				</view>
 			</view>
-
-			<!-- 提现记录入口 -->
 			<view class="record-entry row-between" @click="viewWithdrawRecords">
 				<text>
 					提现记录
 				</text>
-				<u-icon type="arrowright" size="16" color="#999">
-				</u-icon>
-			</view>
-		</view>
-
-		<!-- 2. 本月账单标题 -->
-		<view class="bill-header row-between">
-			<text class="bill-title">
-				本月账单
-			</text>
-			<text class="view-all" @click="viewAllBills">
-				查看全部
-			</text>
-		</view>
-
-		<!-- 3. 账单列表 -->
-		<view class="bill-list column">
-			<view v-for="(bill, idx) in bills" :key="idx" class="bill-card column">
-
-				<!-- 订单号行 -->
-				<view class="order-id-row row-between">
-					<text class="order-id">
-						订单号:{{ bill.orderId }}
+				<text>
+					>
 					</text>
-					<u-icon type="arrowright" :size="16" color="#999">
-					</u-icon>
 				</view>
 
-				<!-- 项目与金额 -->
-				<view class="project-amount-row row-between">
-					<text class="project-name">
-						{{ bill.projectName }}
-					</text>
-					<text :class="['amount', bill.amount > 0 ? 'positive' : 'negative']">
-						{{ bill.amount > 0 ? '+' : '' }}{{ Math.abs(bill.amount).toFixed(2) }}
-					</text>
-				</view>
+			</view>
 
-				<!-- 分成说明 -->
-				<view class="split-info column">
-					<text class="split-type">
-						{{ bill.splitType }}
-					</text>
-					<text class="split-detail">
-						{{ bill.splitDetail }}
-					</text>
-				</view>
+			<!-- 提现记录入口 -->
 
-				<!-- 记录时间 -->
-				<view class="time-row row-between">
-					<text class="time-label">
-						记录时间
-					</text>
-					<text class="time-value">
-						{{ bill.recordTime }}
-					</text>
-				</view>
 
+			<!-- 2. 本月账单标题 -->
+			<view class="bill-header row-between">
+				<text class="bill-title">
+					本月账单
+				</text>
+				<text class="view-all" @click="viewAllBills">
+					查看全部
+				</text>
 			</view>
-		</view>
 
-	</view>
+			<!-- 3. 账单列表 -->
+			<view class="bill-list column">
+				<view v-for="(bill, idx) in bills" :key="idx" class="bill-card column">
+
+					<!-- 订单号行 -->
+					<view class="order-id-row row-between">
+						<text class="split-type">
+							订单号:{{ bill.orderId }}
+						</text>
+						<text>
+							>
+							</text>
+						</view>
+
+						<!-- 项目与金额 -->
+						<view class="project-amount-row row-between">
+							<text class="project-name">
+								{{ bill.projectName }}
+							</text>
+							<text :class="['amount', bill.amount > 0 ? 'positive' : 'negative']">
+								{{ bill.amount > 0 ? '+' : '' }}{{ Math.abs(bill.amount).toFixed(2) }}
+								</text>
+							</view>
+
+							<!-- 分成说明 -->
+							<view class="split-info row-between">
+								<text class="split-type">
+									{{ bill.splitType }}
+								</text>
+								<text class="split-type">
+									{{ bill.splitDetail }}
+								</text>
+							</view>
+
+							<!-- 记录时间 -->
+							<view class="time-row row-between">
+								<text class="split-type">
+									记录时间
+								</text>
+								<text class="split-type">
+									{{ bill.recordTime }}
+								</text>
+							</view>
+
+						</view>
+					</view>
+
+				</view>
+
 </template>
 
 <script setup lang="uts">
 	import { ref } from 'vue';
-
+	import { getCoachWallteInfo, getCoachTransRecords } from '@/utils/api/account'
 	// --- 数据定义 ---
-	const totalAsset = ref('1978.2');
-	const cumulativeIncome = ref('1889');
-	const frozenIncome = ref('1000');
-	const availableIncome = ref('889');
-	const taxiFee = ref('89.2');
-	const frozenTaxi = ref('50');
-	const availableTaxi = ref('49.2');
-
-	// ✅ 修复点 1: 定义类型 (可以用 interface 或 type)
+	const totalAsset = ref('0');
+	const cumulativeIncome = ref('0');
+	const frozenIncome = ref('0');
+	const availableIncome = ref('0');
+	const taxiFee = ref('0');
+	const frozenTaxi = ref('0');
+	const availableTaxi = ref('0');
+
+	const isShowAmount = ref(true);
+
 	type BillItem = {
 		orderId : string;
 		projectName : string;
@@ -201,42 +215,40 @@
 		recordTime : string;
 	};
 
-	// ✅ 修复点 2: 初始化时不写泛型 <BillItem[]>,让 TS 自动推断
-	// 或者写成: const bills = ref<BillItem[]>([]); 然后单独 push,但直接推断最方便
 	const bills = ref([
-		{
-			orderId: '202506091311123009874638',
-			projectName: '中式推拿',
-			amount: 170.00,
-			splitType: '首单分成',
-			splitDetail: '基本套餐车费收入 x90%=20\n项目套餐收入 x50%=150',
-			recordTime: '2025-06-09 13:58'
-		},
-		{
-			orderId: '202506091311123009874638',
-			projectName: '中式推拿',
-			amount: 150.00,
-			splitType: '加钟分成',
-			splitDetail: '项目套餐收入 x71%+(70%+等级v1)=150',
-			recordTime: '2025-06-09 13:58'
-		},
-		{
-			orderId: '202506091311123009874638',
-			projectName: '中式推拿订单退款',
-			amount: -150.00,
-			splitType: '首单分成',
-			splitDetail: '基本套餐车费收入 x90%=20\n项目套餐收入 x50%=150',
-			recordTime: '2025-06-09 13:58'
-		},
-		{
-			orderId: '',
-			projectName: '打车费转出',
-			amount: -50.00,
-			splitType: '分成',
-			splitDetail: '打车费转出刘大锤账户:45.00元\n费率:0.1 手续费:5.00元',
-			recordTime: '2025-06-09 13:58'
-		}
-	] as BillItem[]); // 如果自动推断不准,可以在末尾加 'as BillItem[]' 进行断言
+			{
+				orderId: '202506091311123009874638',
+				projectName: '中式推拿',
+				amount: 170.00,
+				splitType: '首单分成',
+				splitDetail: '基本套餐车费收入 x90%=20\n项目套餐收入 x50%=150',
+				recordTime: '2025-06-09 13:58'
+			},
+			{
+				orderId: '202506091311123009874638',
+				projectName: '中式推拿',
+				amount: 150.00,
+				splitType: '加钟分成',
+				splitDetail: '项目套餐收入 x71%+(70%+等级v1)=150',
+				recordTime: '2025-06-09 13:58'
+			},
+			{
+				orderId: '202506091311123009874638',
+				projectName: '中式推拿订单退款',
+				amount: -150.00,
+				splitType: '首单分成',
+				splitDetail: '基本套餐车费收入 x90%=20\n项目套餐收入 x50%=150',
+				recordTime: '2025-06-09 13:58'
+			},
+			{
+				orderId: '',
+				projectName: '打车费转出',
+				amount: -50.00,
+				splitType: '分成',
+				splitDetail: '打车费转出刘大锤账户:45.00元\n费率:0.1 手续费:5.00元',
+				recordTime: '2025-06-09 13:58'
+			}
+		] as BillItem[]); // 如果自动推断不准,可以在末尾加 'as BillItem[]' 进行断言
 
 	// --- 方法定义 ---
 	const walletInfo = ref<UTSJSONObject | null>(null)
@@ -248,76 +260,81 @@
 			const data = res["data"] as UTSJSONObject;
 			if (code === 200) {
 				walletInfo.value = data;
+				// 赋值到页面变量
+				totalAsset.value = data.total_balance as string ;
+				cumulativeIncome.value = data.total_income as string ;
+				frozenIncome.value = data.frozen_amount as string ;
+				availableIncome.value = data.available_balance as string;
+				taxiFee.value = data.travel_balance as string ;
+				frozenTaxi.value = data.travel_frozen_balance as string ;
+				availableTaxi.value = (parseFloat(data.travel_balance as string ) - parseFloat(data.travel_frozen_balance as string )).toFixed(2);
 			} else {
 				uni.showToast({
-					title: '获取钱包信息失败',
-					icon: 'none'
-				});
+						title: '获取钱包信息失败',
+						icon: 'none'
+					});
 			}
-		} catch (err: any) {
+		} catch (err : any) {
 			console.error('获取技师钱包信息异常', err);
 			uni.showToast({
-				title: '请求失败',
-				icon: 'none'
-			});
+					title: '请求失败',
+					icon: 'none'
+				});
 		}
 	};
 	// 获取本月账单接口
 	const billRecords = ref<any[]>([]);
 
-	const httpGetBillRecords = async (params = {}) => {
+	const httpGetBillRecords = async (params: UTSJSONObject) => {
 		try {
 			const res = await getCoachTransRecords(params) as UTSJSONObject;
 			const code = res["code"] as number;
 			const data = res["data"] as any[];
-			if (code === 200 && Array.isArray(data)) {
+			if (code == 200) {
 				billRecords.value = data;
 			} else {
 				uni.showToast({
-					title: '获取本月账单失败',
-					icon: 'none'
-				});
+						title: '获取本月账单失败',
+						icon: 'none'
+					});
 			}
-		} catch (err: any) {
+		} catch (err : any) {
 			console.error('获取本月账单异常', err);
 			uni.showToast({
-				title: '请求失败,请稍后重试',
-				icon: 'none'
-			});
+					title: '请求失败,请稍后重试',
+					icon: 'none'
+				});
 		}
 	};
 	const refreshData = () => {
 		uni.showLoading({ title: '刷新中...' });
 		setTimeout(() => {
-			uni.hideLoading();
-			uni.showToast({ title: '刷新成功', icon: 'success' });
-			totalAsset.value = (parseFloat(totalAsset.value) + 0.1).toFixed(1);
-		}, 800);
+				uni.hideLoading();
+				uni.showToast({ title: '刷新成功', icon: 'success' });
+				httpGetWalletInfo();
+				httpGetBillRecords({});
+			}, 800);
 	};
 
 	const handleWithdraw = (type : string) => {
 		const amount = type === 'income' ? availableIncome.value : '0';
 		uni.showModal({
-			title: '提现确认',
-			content: `确定要提现 ${amount} 元吗?`,
-			success: (res) => {
-				if (res.confirm) {
-					uni.showToast({ title: '提现申请已提交', icon: 'success' });
+				title: '提现确认',
+				content: `确定要提现 ${amount} 元吗?`,
+				success: (res) => {
+					if (res.confirm) {
+						uni.navigateTo({
+								url: '/pages/account/withdraw'
+							});
+					}
 				}
-			}
-		});
+			});
 	};
 
 	const handleTransfer = (type : string) => {
-		uni.showModal({
-			title: '转出确认',
-			content: '确定要将打车费转出到其他账户吗?',
-			success: (res) => {
-				if (res.confirm) {
-					uni.showToast({ title: '转出成功', icon: 'success' });
-				}
-			}
-		});
+		uni.navigateTo({
+				url: '/pages/account/transfer'
+			});
 	};
 
 	const viewWithdrawRecords = () => {
@@ -325,8 +342,40 @@
 	};
 
 	const viewAllBills = () => {
-		uni.showToast({ title: '查看全部账单', icon: 'none' });
+		uni.navigateTo({
+				url: '/pages/account/bill-list'
+			});
 	};
+
+
+	const toggleShowAmount = () => {
+		console.log('toggleShowAmount', isShowAmount.value);
+		isShowAmount.value = !isShowAmount.value;
+	};
+
+	const openIncomePopup = () => {
+		uni.showModal({
+				title: '我的收益',
+				content: '我的收益包含订单分成、加钟收益+佣金收益+红包收益+车费收益。\n\n特殊说明:\n1、红包收益是商户拉新用户时平台直接奖励的,直接进入可提现余额,无冻结情况。\n2、未到账、提现中等金额属于冻结余额。',
+				showCancel: false,
+				confirmText: '我知道了'
+			});
+	};
+
+	const openTaxiPopup = () => {
+		uni.showModal({
+				title: '车费说明',
+				content: '1、车费主要是用户在小叮当下支付的打车费(不包含公交车费)将会进入商户的打车收益中。\n\n2、打车费可以转到我的收益里提现,提现平台将收取10%的手续费。\n\n3、车费收入为100%商户个人收入,长期以来一直是平台代商户缴纳该部分的个人经营所得税,技师提现打车费余额,平台将会代收10%的税费扣款。\n\n4、当商户长时间不接单时,打车费余额存在负数时,将优先将技师的提现余额进行抵扣,达到冲正效果。\n\n5、单程车费不超过500元,超出部分需要技师个人承担车费。',
+				showCancel: false,
+				confirmText: '我知道了'
+			});
+	};
+
+	onLoad(() => {
+			httpGetWalletInfo();
+			httpGetBillRecords({});
+		});
+
 </script>
 
 <style>
@@ -349,7 +398,6 @@
 	.row-start {
 		flex-direction: row;
 		align-items: center;
-		/* gap: 10rpx; */
 	}
 
 	.row-center {
@@ -370,32 +418,34 @@
 
 	/* --- 页面容器 --- */
 	.page-container {
-		background-color: #f5f6f8;
-		/* */
+		background-color: rgba(246, 246, 244, 0.5);
 		padding-bottom: 40rpx;
+		padding: 20rpx;
 	}
 
 	/* --- 资产卡片 --- */
 	.asset-card {
-		background: linear-gradient(to right, rgba(255, 249, 225, 1), rgba(255, 241, 191, 1));
+		/* background: linear-gradient(to right, rgba(255, 249, 225, 1), rgba(255, 241, 191, 1));
 		margin: 20rpx;
 		border-radius: 16rpx;
 		padding: 30rpx;
 		box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
+		*/
+		padding: 0 20rpx;
 	}
 
 	.total-asset-section {
-		margin-bottom: 30rpx;
-	}
+		background: linear-gradient(to bottom, rgba(253, 252, 246, 1) ,rgba(254, 249, 234, 1));
+		padding: 30rpx 20rpx 20rpx;
+		border-radius: 16rpx 16rpx 0 0;
+		box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
+	} rgba(254, 249, 234, 1)
 
 	.label {
 		font-size: 26rpx;
 		color: #666;
 	}
 
-	.amount-row {
-		/* gap: 10rpx; */
-	}
 
 	.amount {
 		font-size: 48rpx;
@@ -405,7 +455,6 @@
 
 	.refresh-btn {
 		padding: 10rpx 20rpx;
-		background: #ffffff;
 		border-radius: 30rpx;
 		border: 1rpx solid #ddd;
 		font-size: 24rpx;
@@ -416,8 +465,19 @@
 	.income-section {
 		/* gap: 30rpx; */
 		margin-bottom: 20rpx;
+		position: relative;
 	}
 
+	.bg-image {
+		width: 100%;
+		height: 400rpx;
+		position: absolute;
+		top: 28%;
+		left: 0;
+	}
+	.detail-container{
+		padding:0 20rpx 20rpx;
+	}
 	.income-item {
 		flex: 1;
 		/* gap: 15rpx; */
@@ -425,12 +485,11 @@
 
 
 	.income-label {
-		font-size: 24rpx;
-		color: #666;
+		font-size: 26rpx;
 	}
 
 	.income-main {
-		/* 继承 row-between */
+		margin-top:20rpx;
 	}
 
 	.income-value {
@@ -441,50 +500,57 @@
 
 	.withdraw-btn,
 	.transfer-btn {
-		font-size: 24rpx;
-		padding: 8rpx 20rpx;
-		border-radius: 20rpx;
-		background: #ffffff;
+		font-size: 28rpx;
+		padding: 6rpx 22rpx;
+		border-radius: 26rpx;
+		background: #FFFCEE;
 		border: 1rpx solid;
 	}
 
 	.withdraw-btn {
-		color: #ff9900;
-		border-color: #ff9900;
+		color: #111111ff;
+		border-color: #fff;
 	}
 
+	.jine-bg {
+		width: 320rpx;
+		height: 100%;
+		position: absolute;
+		top: 0;
+		left: 0;
+
+	}
 	.transfer-btn {
-		color: #52c41a;
-		border-color: #52c41a;
+		color: #101010ff;
+		border-color: #fff;
 	}
 
 	/* 明细部分 */
 	.income-detail {
-		background: rgba(255, 255, 255, 0.6);
-		border-radius: 12rpx;
-		padding: 15rpx;
-		/* gap: 20rpx; */
+		padding: 20rpx;
+		position: relative;
+		margin-top: 10rpx;
+		justify-content: space-between;
 	}
 
-	.detail-item {
-		flex: 1;
-		/* gap: 4rpx; */
+	.income-header-content {
+
+		padding:  0 20rpx 0 10rpx;
+		border-right-width: 2rpx;
+		border-right-color: #979797;
+		border-right-style: solid;
 	}
 
 	.detail-label {
-		font-size: 22rpx;
-		color: #999;
+		font-size: 24rpx;
+		color: #666;
 	}
 
 	.detail-value {
-		font-size: 28rpx;
+		/* font-size: 28rpx; */
 		font-weight: bold;
-		color: #333;
 	}
 
-	.detail-value.highlight {
-		color: #ff9900;
-	}
 
 	.divider {
 		width: 1rpx;
@@ -494,23 +560,18 @@
 
 	/* 提现记录入口 */
 	.record-entry {
-		padding: 20rpx 0;
-		border-top: 1rpx solid rgba(0, 0, 0, 0.05);
+		padding: 20rpx 30rpx 30rpx ;
 		font-size: 28rpx;
 		color: #333;
+		/* background: #fff; */
 	}
 
 	/* --- 账单标题 --- */
 	.bill-header {
-		padding: 20rpx 30rpx;
-		margin-top: 20rpx;
+		padding: 0 30rpx;
+		/* margin-top: 20rpx; */
 	}
 
-	.bill-title {
-		font-size: 32rpx;
-		font-weight: bold;
-		color: #333;
-	}
 
 	.view-all {
 		font-size: 26rpx;
@@ -525,37 +586,34 @@
 
 	.bill-card {
 		background: #ffffff;
-		border-radius: 16rpx;
+		border-radius: 20rpx;
 		padding: 30rpx;
 		box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
-		/* gap: 15rpx; */
+		margin-top: 20rpx;
 	}
 
 	.order-id-row {
 		font-size: 26rpx;
-		color: #666;
+		padding: 10rpx 0 20rpx 0;
+		border-bottom: 1rpx solid #eee;
 	}
 
 	.project-amount-row {
-		/* 继承 row-between */
+		margin-top: 20rpx;
 	}
 
 	.project-name {
 		font-size: 30rpx;
-		font-weight: bold;
-		color: #333;
 	}
 
 	.amount.positive {
 		color: #ff4d4f;
 		font-size: 32rpx;
-		font-weight: bold;
 	}
 
 	.amount.negative {
 		color: #333;
 		font-size: 32rpx;
-		font-weight: bold;
 	}
 
 	.split-info {
@@ -565,12 +623,12 @@
 	}
 
 	.split-type {
-		font-weight: 400;
-		color: #666;
+		font-size: 26rpx;
+		color: #999;
 	}
 
 	.time-row {
-		font-size: 24rpx;
+		font-size: 26rpx;
 		color: #999;
 	}
 </style>

+ 204 - 0
pages/account/transfer.uvue

@@ -0,0 +1,204 @@
+<template>
+	<view class="page-container">
+		<!-- 顶部标题栏 -->
+		<view class="header">
+			<view class="header-left" @click="goBack">
+				<u-icon name="arrow-left" :size="24" />
+			</view>
+			<view class="header-title">转出</view>
+			<view class="header-right"></view>
+		</view>
+		
+		<!-- 转出至 -->
+		<view class="transfer-to">
+			<text class="transfer-label">转出至:</text>
+			<text class="transfer-target">我的收益</text>
+		</view>
+		
+		<!-- 可转出金额 -->
+		<view class="transfer-info">
+			<view class="amount-section">
+				<text class="amount-label">可转出金额</text>
+				<text class="amount-value">¥{{ availableAmount }}</text>
+			</view>
+			<view class="fee-section">
+				<view class="fee-item">
+					<text class="fee-label">实际转出金额</text>
+					<text class="fee-value">¥{{ actualAmount }}</text>
+				</view>
+				<view class="fee-item">
+					<text class="fee-label">服务费(10%)</text>
+					<text class="fee-value">¥{{ serviceFee }}</text>
+				</view>
+			</view>
+		</view>
+		
+		<!-- 确认转出按钮 -->
+		<view class="submit-section">
+			<button class="submit-btn" @click="confirmTransfer">确认转出</button>
+		</view>
+	</view>
+</template>
+
+<script setup lang="uts">
+	import { ref, computed } from 'vue';
+	
+	// 数据定义
+	const availableAmount = ref('49.2');
+	
+	// 计算属性
+	const serviceFee = computed(() => {
+		const amount = parseFloat(availableAmount.value);
+		return (amount * 0.1).toFixed(2);
+	});
+	
+	const actualAmount = computed(() => {
+		const amount = parseFloat(availableAmount.value);
+		return (amount * 0.9).toFixed(2);
+	});
+	
+	// 方法定义
+	const goBack = () => {
+		uni.navigateBack();
+	};
+	
+	const confirmTransfer = () => {
+		uni.showModal({
+			title: '转出确认',
+			content: `确定要转出 ${availableAmount.value} 元到我的收益吗?服务费为 ${serviceFee.value} 元,实际转出 ${actualAmount.value} 元`,
+			success: (res) => {
+				if (res.confirm) {
+					uni.showLoading({ title: '处理中...' });
+					setTimeout(() => {
+						uni.hideLoading();
+						uni.showToast({
+							title: '转出成功',
+							icon: 'success'
+						});
+						// 可以在这里添加跳转回账户页面的逻辑
+						setTimeout(() => {
+							uni.navigateBack();
+						}, 1500);
+					}, 1000);
+				}
+			}
+		});
+	};
+</script>
+
+<style>
+	/* 页面容器 */
+	.page-container {
+		background-color: #f5f6f8;
+		min-height: 100vh;
+		flex-direction: column;
+	}
+	
+	/* 标题栏 */
+	.header {
+		flex-direction: row;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+	}
+	
+	.header-left {
+		width: 60rpx;
+		height: 60rpx;
+		align-items: center;
+		justify-content: center;
+	}
+	
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333333;
+	}
+	
+	.header-right {
+		width: 60rpx;
+	}
+	
+	/* 转出至 */
+	.transfer-to {
+		background-color: #ffffff;
+		margin-top: 20rpx;
+		padding: 30rpx;
+		flex-direction: row;
+		align-items: center;
+	}
+	
+	.transfer-label {
+		font-size: 28rpx;
+		color: #666666;
+	}
+	
+	.transfer-target {
+		font-size: 28rpx;
+		color: #333333;
+		font-weight: bold;
+		margin-left: 10rpx;
+	}
+	
+	/* 可转出金额 */
+	.transfer-info {
+		background-color: #ffffff;
+		margin-top: 20rpx;
+		padding: 30rpx;
+	}
+	
+	.amount-section {
+		margin-bottom: 30rpx;
+	}
+	
+	.amount-label {
+		font-size: 28rpx;
+		color: #666666;
+		display: block;
+		margin-bottom: 10rpx;
+	}
+	
+	.amount-value {
+		font-size: 48rpx;
+		font-weight: bold;
+		color: #333333;
+	}
+	
+	.fee-section {
+		border-top: 1rpx solid #f0f0f0;
+		padding-top: 20rpx;
+	}
+	
+	.fee-item {
+		flex-direction: row;
+		justify-content: space-between;
+		margin-bottom: 10rpx;
+	}
+	
+	.fee-label {
+		font-size: 26rpx;
+		color: #666666;
+	}
+	
+	.fee-value {
+		font-size: 26rpx;
+		color: #333333;
+	}
+	
+	/* 确认转出按钮 */
+	.submit-section {
+		padding: 30rpx;
+		margin-top: 40rpx;
+	}
+	
+	.submit-btn {
+		background-color: #ffc107;
+		color: #333333;
+		font-size: 32rpx;
+		font-weight: bold;
+		border-radius: 40rpx;
+		height: 80rpx;
+		width: 100%;
+	}
+</style>

+ 302 - 0
pages/account/withdraw.uvue

@@ -0,0 +1,302 @@
+<template>
+	<view class="page-container">
+		<!-- 顶部标题栏 -->
+		<view class="header">
+			<view class="header-left" @click="goBack">
+				<u-icon name="arrow-left" :size="24" />
+			</view>
+			<view class="header-title">提现</view>
+			<view class="header-right"></view>
+		</view>
+		
+		<!-- 可提现金额 -->
+		<view class="available-balance">
+			<text class="balance-label">可提现金额(元)</text>
+			<text class="balance-amount">¥{{ availableBalance }}</text>
+		</view>
+		
+		<!-- 提现金额输入 -->
+		<view class="withdraw-section">
+			<view class="input-container">
+				<text class="input-prefix">¥</text>
+				<input class="withdraw-input" v-model="withdrawAmount" type="number" placeholder="请输入提现金额" />
+				<button class="all-withdraw-btn" @click="withdrawAll">全部提现</button>
+			</view>
+		</view>
+		
+		<!-- 提现说明 -->
+		<view class="withdraw-info">
+			<text class="info-title">提现说明</text>
+			<view class="info-item">
+				<text>1、每笔提现最低金额10元,最高金额200元</text>
+			</view>
+			<view class="info-item">
+				<text>2、每日累计最多可提现200元</text>
+			</view>
+			<view class="info-item">
+				<text>3、请输入正整数</text>
+			</view>
+			<view class="info-item">
+				<text>4、提现手续费为7%,例如:提现100元扣除7元实际到账93元</text>
+			</view>
+		</view>
+		
+		<!-- 提现方式 -->
+		<view class="withdraw-method">
+			<text class="method-title">提现方式</text>
+			<view class="method-item" @click="selectMethod">
+				<view class="method-left">
+					<u-icon name="wechat" :size="24" color="#07C160" />
+					<text class="method-name">提现至微信钱包</text>
+				</view>
+				<view class="method-right">
+					<u-icon name="checkmark-circle-fill" :size="20" color="#ffc107" />
+				</view>
+			</view>
+		</view>
+		
+		<!-- 申请提现按钮 -->
+		<view class="submit-section">
+			<button class="submit-btn" @click="submitWithdraw">申请提现</button>
+		</view>
+	</view>
+</template>
+
+<script setup lang="uts">
+	import { ref } from 'vue';
+	
+	// 数据定义
+	const availableBalance = ref('1000');
+	const withdrawAmount = ref('');
+	
+	// 方法定义
+	const goBack = () => {
+		uni.navigateBack();
+	};
+	
+	const withdrawAll = () => {
+		withdrawAmount.value = availableBalance.value;
+	};
+	
+	const selectMethod = () => {
+		// 这里可以添加选择其他提现方式的逻辑
+	};
+	
+	const submitWithdraw = () => {
+		// 验证提现金额
+		if (!withdrawAmount.value || parseFloat(withdrawAmount.value) <= 0) {
+			uni.showToast({
+				title: '请输入提现金额',
+				icon: 'none'
+			});
+			return;
+		}
+		
+		const amount = parseFloat(withdrawAmount.value);
+		const maxAmount = parseFloat(availableBalance.value);
+		
+		if (amount < 10) {
+			uni.showToast({
+				title: '提现金额不能低于10元',
+				icon: 'none'
+			});
+			return;
+		}
+		
+		if (amount > 200) {
+			uni.showToast({
+				title: '提现金额不能超过200元',
+				icon: 'none'
+			});
+			return;
+		}
+		
+		if (amount > maxAmount) {
+			uni.showToast({
+				title: '提现金额不能超过可提现金额',
+				icon: 'none'
+			});
+			return;
+		}
+		
+		// 提交提现申请
+		uni.showModal({
+			title: '提现确认',
+			content: `确定要提现 ${withdrawAmount.value} 元吗?手续费为 ${(amount * 0.07).toFixed(2)} 元,实际到账 ${(amount * 0.93).toFixed(2)} 元`,
+			success: (res) => {
+				if (res.confirm) {
+					uni.showLoading({ title: '处理中...' });
+					setTimeout(() => {
+						uni.hideLoading();
+						uni.showToast({
+							title: '提现申请已提交',
+							icon: 'success'
+						});
+						// 可以在这里添加跳转回账户页面的逻辑
+						setTimeout(() => {
+							uni.navigateBack();
+						}, 1500);
+					}, 1000);
+				}
+			}
+		});
+	};
+</script>
+
+<style>
+	/* 页面容器 */
+	.page-container {
+		background-color: #f5f6f8;
+		min-height: 100vh;
+		flex-direction: column;
+	}
+	
+	/* 标题栏 */
+	.header {
+		flex-direction: row;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+	}
+	
+	.header-left {
+		width: 60rpx;
+		height: 60rpx;
+		align-items: center;
+		justify-content: center;
+	}
+	
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333333;
+	}
+	
+	.header-right {
+		width: 60rpx;
+	}
+	
+	/* 可提现金额 */
+	.available-balance {
+		background-color: #ffc107;
+		padding: 40rpx 30rpx;
+		align-items: center;
+	}
+	
+	.balance-label {
+		font-size: 28rpx;
+		color: #333333;
+		margin-bottom: 20rpx;
+	}
+	
+	.balance-amount {
+		font-size: 56rpx;
+		font-weight: bold;
+		color: #ffffff;
+	}
+	
+	/* 提现金额输入 */
+	.withdraw-section {
+		background-color: #ffffff;
+		margin-top: 20rpx;
+		padding: 30rpx;
+	}
+	
+	.input-container {
+		flex-direction: row;
+		align-items: center;
+		border: 1rpx solid #e5e5e5;
+		border-radius: 12rpx;
+		padding: 20rpx;
+	}
+	
+	.input-prefix {
+		font-size: 32rpx;
+		color: #333333;
+		margin-right: 10rpx;
+	}
+	
+	.withdraw-input {
+		flex: 1;
+		font-size: 32rpx;
+		color: #333333;
+	}
+	
+	.all-withdraw-btn {
+		background-color: #f5f6f8;
+		color: #666666;
+		font-size: 26rpx;
+		padding: 10rpx 20rpx;
+		border-radius: 20rpx;
+		border: 1rpx solid #e5e5e5;
+	}
+	
+	/* 提现说明 */
+	.withdraw-info {
+		background-color: #ffffff;
+		margin-top: 20rpx;
+		padding: 30rpx;
+	}
+	
+	.info-title {
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #333333;
+		margin-bottom: 20rpx;
+	}
+	
+	.info-item {
+		font-size: 26rpx;
+		color: #666666;
+		line-height: 1.5;
+		margin-bottom: 10rpx;
+	}
+	
+	/* 提现方式 */
+	.withdraw-method {
+		background-color: #ffffff;
+		margin-top: 20rpx;
+		padding: 30rpx;
+	}
+	
+	.method-title {
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #333333;
+		margin-bottom: 20rpx;
+	}
+	
+	.method-item {
+		flex-direction: row;
+		align-items: center;
+		justify-content: space-between;
+	}
+	
+	.method-left {
+		flex-direction: row;
+		align-items: center;
+	}
+	
+	.method-name {
+		font-size: 28rpx;
+		color: #333333;
+		margin-left: 10rpx;
+	}
+	
+	/* 提交按钮 */
+	.submit-section {
+		padding: 30rpx;
+		margin-top: 40rpx;
+	}
+	
+	.submit-btn {
+		background-color: #ffc107;
+		color: #333333;
+		font-size: 32rpx;
+		font-weight: bold;
+		border-radius: 40rpx;
+		height: 80rpx;
+		width: 100%;
+	}
+</style>

+ 135 - 41
pages/homepage/serviceProject.uvue

@@ -1,98 +1,171 @@
 <template>
 	<!-- #ifdef APP -->
 	<scroll-view class="page-scroll">
-	<!-- #endif -->
+		<!-- #endif -->
 		<view class="page">
-			<view class="hero-card">
-				<text class="hero-title">服务项目设置</text>
-				<text class="hero-desc">按项目维度管理开关和路费规则,界面风格向旧业务页靠拢。</text>
-			</view>
 			<view v-for="service in serviceList" :key="service.id" class="service-card">
 				<view class="service-top">
-					<image class="service-image" :src="service.image" mode="aspectFill"></image>
+					<image
+					:src="(((service as UTSJSONObject).cover_urls as UTSArray<UTSJSONObject>)[0] as UTSJSONObject).url ?? ''"
+					class=" service-image" mode="aspectFill" />
 					<view class="service-info">
-						<text class="service-title">{{ service.title }}</text>
-						<text class="service-desc">{{ service.description }}</text>
-						<text class="service-price">{{ service.priceText }}</text>
+						<text class="service-title">
+							{{ service.title }}
+						</text>
+						<text class="service-desc">
+							服务时长:{{ service.duration }} 分钟
+						</text>
+						<text class="service-price">
+							{{ service.price }}
+						</text>
 					</view>
-					<switch :checked="service.enabled" color="#ffcf3a" @change="toggleService(service.id)"></switch>
+					<switch class="service-switch" :checked="service.is_opened== 1 ? true : false" color="#ffcf3a"
+					@change="toggleService(service.id as Number)">
+					</switch>
+
 				</view>
 
-				<view class="service-bottom">
-					<text class="service-bottom-label">路费设置</text>
+				<view class=" service-bottom">
+					<text class="service-bottom-label">
+						路费设置
+					</text>
 					<view class="fare-group">
-						<view class="fare-chip" :class="service.fareType == 'free' ? 'fare-chip-active' : 'fare-chip-idle'" @click="setFareType(service.id, 'free')">
-							<text class="fare-chip-text" :class="service.fareType == 'free' ? 'fare-chip-text-active' : 'fare-chip-text-idle'">免路费</text>
+						<view class="fare-chip"
+						:class="service.traffic_fee_type == 0 ? 'fare-chip-active' : 'fare-chip-idle'"
+						@click="setFareType(service.id as Number, 0)">
+							<text class="fare-chip-text"
+							:class="service.traffic_fee_type == 0 ? 'fare-chip-text-active' : 'fare-chip-text-idle'">
+								免路费
+							</text>
 						</view>
-						<view class="fare-chip" :class="service.fareType == 'single' ? 'fare-chip-active' : 'fare-chip-idle'" @click="setFareType(service.id, 'single')">
-							<text class="fare-chip-text" :class="service.fareType == 'single' ? 'fare-chip-text-active' : 'fare-chip-text-idle'">单程</text>
+						<view class="fare-chip"
+						:class="service.traffic_fee_type == 1 ? 'fare-chip-active' : 'fare-chip-idle'"
+						@click="setFareType(service.id as Number, 1)">
+							<text class="fare-chip-text"
+							:class="service.traffic_fee_type == 1 ? 'fare-chip-text-active' : 'fare-chip-text-idle'">
+								单程
+							</text>
 						</view>
-						<view class="fare-chip" :class="service.fareType == 'double' ? 'fare-chip-active' : 'fare-chip-idle'" @click="setFareType(service.id, 'double')">
-							<text class="fare-chip-text" :class="service.fareType == 'double' ? 'fare-chip-text-active' : 'fare-chip-text-idle'">双程</text>
+						<view class="fare-chip"
+						:class="service.traffic_fee_type == 2 ? 'fare-chip-active' : 'fare-chip-idle'"
+						@click="setFareType(service.id as Number, 2)">
+							<text class="fare-chip-text"
+							:class="service.traffic_fee_type == 2 ? 'fare-chip-text-active' : 'fare-chip-text-idle'">
+								双程
+							</text>
 						</view>
 					</view>
 				</view>
 			</view>
 
 			<view class="footer-button" @click="saveServiceSetting">
-				<text class="footer-button-text">保存设置</text>
+				<text class="footer-button-text">
+					保存设置
+				</text>
 			</view>
 		</view>
-	<!-- #ifdef APP -->
+		<!-- #ifdef APP -->
 	</scroll-view>
 	<!-- #endif -->
 </template>
 
 <script setup lang="uts">
 	import { ref } from 'vue'
-
+	import { getCoachItems, getAvailableProjects, toggleProject } from '@/utils/api/workbenches'
 	type FareType = 'free' | 'single' | 'double'
 
-	type ServiceItem = {
-		id: number
-		title: string
-		description: string
-		priceText: string
-		image: string
-		enabled: boolean
-		fareType: FareType
-	}
 
-	const serviceList = ref<ServiceItem[]>([
-		{ id: 1, title: '中式推拿', description: '服务时长 60 分钟', priceText: '¥199', image: '/static/imagesInfo/anmo.png', enabled: true, fareType: 'double' },
-		{ id: 2, title: '足疗按摩', description: '服务时长 45 分钟', priceText: '¥149', image: '/static/imagesInfo/anmo.png', enabled: false, fareType: 'single' },
-		{ id: 3, title: '肩颈放松', description: '服务时长 30 分钟', priceText: '¥99', image: '/static/imagesInfo/anmo.png', enabled: false, fareType: 'free' },
+	const serviceList = ref<UTSJSONObject[]>([
+		{ id: 1, title: '中式推拿', duration: 60, price: '¥199', cover_urls: [{ url: '/static/imagesInfo/anmo.png' }], is_opened: 1, traffic_fee_type: 2 },
+	{ id: 2, title: '足疗按摩', duration: 45, price: '¥149', cover_urls: [{ url: '/static/imagesInfo/anmo.png' }], is_opened: 1, traffic_fee_type: 2 },
+	{ id: 3, title: '肩颈放松', duration: 50, price: '¥99', cover_urls: [{ url: '/static/imagesInfo/anmo.png' }], is_opened: 1, traffic_fee_type: 2 },
 	])
 
 	const toggleService = (serviceId : number) : void => {
 		for (let i = 0; i < serviceList.value.length; i++) {
 			const item = serviceList.value[i]
 			if (item.id == serviceId) {
-				item.enabled = !item.enabled
+				item.is_opened = item.is_opened == 1 ? false : true
 				return
 			}
 		}
 	}
 
-	const setFareType = (serviceId : number, fareType : FareType) : void => {
+	const setFareType = (serviceId : number, fareType : Number) : void => {
 		for (let i = 0; i < serviceList.value.length; i++) {
 			const item = serviceList.value[i]
 			if (item.id == serviceId) {
-				item.fareType = fareType
+				item.traffic_fee_type = fareType
 				return
 			}
 		}
 	}
+	// 获取可开通服务项目接口
+	const httpGetServiceList = async () => {
+		try {
+			const response = await getAvailableProjects() as UTSJSONObject
+			const code = response["code"] as number
+			// const data = response["data"] as UTSJSONObject
+			if (code !== 200) return
+
+			serviceList.value = response["data"] as UTSArray<UTSJSONObject>;
+			console.log(serviceList.value, 'sssss');
 
-	const saveServiceSetting = () : void => {
-		uni.showToast({ title: '服务设置已保存', icon: 'none' })
+		} catch (err : any) {
+			console.error('获取服务项目接口异常', err)
+		}
 	}
+	// 获取技师服务项目接口
+	const httpGetCoachItems = async () => {
+		// try {
+		// 	const response = await getCoachItems() as UTSJSONObject
+		// 	const code = response["code"] as number
+		// 	const data = response["data"] as UTSJSONObject
+		// 	if (code !== 200) return
+		// } catch (err : any) {
+		// 	console.error('获取技师服务项目接口异常', err)
+		// }
+	}
+	// 保存服务设置
+	const saveServiceSetting = async () => {
+		// 构建保存参数
+		const params = serviceList.value.map((service) => {
+				// 检查路费设置是否为空
+				if (service["is_opened"] == true && service["traffic_fee_type"] == null) {
+					uni.showToast({ title: '请设置路费类型', icon: 'none' })
+					throw new Error('请设置路费类型')
+				}
+				return {
+					project_id: service["id"],
+					is_opened: service["is_opened"] == true ? 1 : 0,
+					traffic_fee_type: service["traffic_fee_type"]
+				} as UTSJSONObject
+			})
+		try {
+			const response = await toggleProject(params) as UTSJSONObject
+			const code = response["code"] as number
+			if (code !== 200) {
+				uni.showToast({ title: '保存失败', icon: 'none' })
+				return
+			}
+			uni.showToast({ title: '服务设置已保存', icon: 'success' })
+		} catch (err : any) {
+			console.error('保存服务设置接口异常', err)
+			uni.showToast({ title: '保存失败', icon: 'none' })
+		}
+	}
+	// 页面加载时获取服务项目
+	onLoad(() => {
+			httpGetServiceList();
+			httpGetCoachItems()
+		})
 </script>
 
 <style>
 	.page-scroll {
 		flex: 1;
 	}
+
 	.page {
 		min-height: 1000rpx;
 		padding: 24rpx;
@@ -100,6 +173,7 @@
 		background-color: #f5f1e9;
 		flex-direction: column;
 	}
+
 	.hero-card {
 		margin-bottom: 20rpx;
 		padding: 28rpx;
@@ -107,17 +181,20 @@
 		background-color: #fff0af;
 		flex-direction: column;
 	}
+
 	.hero-title {
 		font-size: 38rpx;
 		font-weight: 700;
 		color: #352f24;
 	}
+
 	.hero-desc {
 		margin-top: 10rpx;
 		font-size: 24rpx;
 		line-height: 34rpx;
 		color: #6c624f;
 	}
+
 	.service-card {
 		margin-bottom: 20rpx;
 		padding: 24rpx;
@@ -128,35 +205,42 @@
 		border-style: solid;
 		border-color: #f0eadf;
 	}
+
 	.service-top {
 		flex-direction: row;
 		align-items: center;
 	}
+
 	.service-image {
 		width: 120rpx;
 		height: 120rpx;
 		border-radius: 12rpx;
 	}
+
 	.service-info {
 		flex: 1;
 		margin-left: 20rpx;
 		flex-direction: column;
 	}
+
 	.service-title {
 		font-size: 32rpx;
 		font-weight: 700;
 		color: #333333;
 	}
+
 	.service-desc {
 		margin-top: 8rpx;
-		font-size: 24rpx;
+		font-size: 26rpx;
 		color: #7c7c7c;
 	}
+
 	.service-price {
 		margin-top: 8rpx;
 		font-size: 28rpx;
 		color: #f36b3d;
 	}
+
 	.service-bottom {
 		margin-top: 20rpx;
 		padding-top: 20rpx;
@@ -166,15 +250,18 @@
 		flex-direction: row;
 		align-items: center;
 	}
+
 	.service-bottom-label {
 		font-size: 26rpx;
 		color: #6f6f6f;
 	}
+
 	.fare-group {
 		flex: 1;
 		margin-left: 16rpx;
 		flex-direction: row;
 	}
+
 	.fare-chip {
 		flex: 1;
 		height: 62rpx;
@@ -184,24 +271,30 @@
 		justify-content: center;
 		align-items: center;
 	}
+
 	.fare-chip-active {
 		background-color: #ffcf3a;
 	}
+
 	.fare-chip-idle {
 		background-color: #f7f7f7;
 		border-width: 1px;
 		border-style: solid;
 		border-color: #dddddd;
 	}
+
 	.fare-chip-text {
 		font-size: 24rpx;
 	}
+
 	.fare-chip-text-active {
 		color: #ffffff;
 	}
+
 	.fare-chip-text-idle {
 		color: #666666;
 	}
+
 	.footer-button {
 		margin-top: 8rpx;
 		height: 96rpx;
@@ -211,9 +304,10 @@
 		justify-content: center;
 		align-items: center;
 	}
+
 	.footer-button-text {
 		font-size: 32rpx;
 		font-weight: 700;
 		color: #3d3528;
 	}
-</style>
+</style>

+ 14 - 2
pages/map/map.uvue

@@ -41,7 +41,6 @@
 
 <script setup lang="uts">
 	import { ref } from 'vue'
-	import { onLoad } from '@dcloudio/uni-app'
 	import { navigateToMobile } from '@/utils/api/tool.uts'
 
 	const addressText = ref<string>('暂无地址信息')
@@ -69,6 +68,7 @@
 	.page-scroll {
 		flex: 1;
 	}
+
 	.page {
 		min-height: 1000rpx;
 		padding: 24rpx;
@@ -76,27 +76,32 @@
 		background-color: #edf1ea;
 		flex-direction: column;
 	}
+
 	.hero-card {
 		padding: 28rpx;
 		border-radius: 24rpx;
 		background-color: #cfe7c7;
 		flex-direction: column;
 	}
+
 	.hero-title {
 		font-size: 36rpx;
 		font-weight: 700;
 		color: #233121;
 	}
+
 	.hero-desc {
 		margin-top: 10rpx;
 		font-size: 24rpx;
 		color: #4a5b48;
 	}
+
 	.summary-strip {
 		margin-top: 18rpx;
 		flex-direction: row;
 		justify-content: space-between;
 	}
+
 	.summary-pill {
 		width: 48%;
 		padding: 20rpx;
@@ -104,16 +109,19 @@
 		background-color: #ffffff;
 		flex-direction: column;
 	}
+
 	.summary-pill-label {
 		font-size: 22rpx;
 		color: #7c887a;
 	}
+
 	.summary-pill-value {
 		margin-top: 8rpx;
 		font-size: 28rpx;
 		font-weight: 700;
 		color: #233121;
 	}
+
 	.info-card {
 		margin-top: 18rpx;
 		padding: 24rpx;
@@ -121,16 +129,19 @@
 		background-color: #ffffff;
 		flex-direction: column;
 	}
+
 	.info-label {
 		font-size: 26rpx;
 		color: #7c887a;
 	}
+
 	.info-value {
 		margin-top: 12rpx;
 		font-size: 28rpx;
 		line-height: 40rpx;
 		color: #233121;
 	}
+
 	.action-button {
 		margin-top: 24rpx;
 		height: 92rpx;
@@ -140,9 +151,10 @@
 		justify-content: center;
 		align-items: center;
 	}
+
 	.action-button-text {
 		font-size: 30rpx;
 		font-weight: 700;
 		color: #ffffff;
 	}
-</style>
+</style>

+ 165 - 0
pages/myEdit/changePhone.uvue

@@ -0,0 +1,165 @@
+<template>
+	<view class="page-container">
+		<!-- 头部 -->
+		<view class="header">
+			<view class="header-left" @click="goBack">
+				<u-icon name="arrow-left" size="24" color="#333"/>
+			</view>
+			<view class="header-title">
+				修改手机号
+			</view>
+			<view class="header-right"></view>
+		</view>
+		
+		<!-- 内容区域 -->
+		<view class="content">
+			<text class="section-title">请验证以下信息</text>
+			
+			<!-- 当前手机号验证 -->
+			<view class="section">
+				<text class="section-subtitle">当前手机号验证</text>
+				<view class="form-group">
+					<view class="phone-display">18790654335</view>
+				</view>
+				<view class="form-group">
+					<input class="input" type="text" placeholder="请输入验证码" />
+					<button class="verify-btn">获取验证码</button>
+				</view>
+			</view>
+			
+			<!-- 新手机号绑定 -->
+			<view class="section">
+				<text class="section-subtitle">新手机号绑定</text>
+				<view class="form-group">
+					<input class="input" type="text" placeholder="请输入新手机号" />
+				</view>
+				<view class="form-group">
+					<input class="input" type="text" placeholder="请输入验证码" />
+					<button class="verify-btn disabled">58S</button>
+				</view>
+			</view>
+			
+			<!-- 确定按钮 -->
+			<button class="confirm-btn" @click="confirmChange">确定</button>
+		</view>
+	</view>
+</template>
+
+<script setup lang="ts">
+	const goBack = () => {
+		uni.navigateBack();
+	};
+	
+	const confirmChange = () => {
+		uni.showToast({ title: '修改手机号成功', icon: 'success' });
+		setTimeout(() => {
+			uni.navigateBack();
+		}, 1500);
+	};
+</script>
+
+<style scoped>
+	.page-container {
+		background-color: #f5f5f5;
+		min-height: 100vh;
+	}
+	
+	.header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+	
+	.header-left, .header-right {
+		width: 60rpx;
+	}
+	
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+	}
+	
+	.content {
+		padding: 30rpx;
+	}
+	
+	.section-title {
+		font-size: 36rpx;
+		font-weight: bold;
+		color: #333;
+		margin-bottom: 40rpx;
+		display: block;
+	}
+	
+	.section {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 20rpx;
+		margin-bottom: 30rpx;
+	}
+	
+	.section-subtitle {
+		font-size: 28rpx;
+		color: #333;
+		margin-bottom: 20rpx;
+		display: block;
+	}
+	
+	.form-group {
+		display: flex;
+		align-items: center;
+		margin-bottom: 20rpx;
+	}
+	
+	.form-group:last-child {
+		margin-bottom: 0;
+	}
+	
+	.phone-display {
+		flex: 1;
+		font-size: 28rpx;
+		color: #333;
+		padding: 20rpx;
+		background-color: #f5f5f5;
+		border-radius: 8rpx;
+	}
+	
+	.input {
+		flex: 1;
+		font-size: 28rpx;
+		color: #333;
+		padding: 20rpx;
+		background-color: #f5f5f5;
+		border-radius: 8rpx;
+		margin-right: 15rpx;
+	}
+	
+	.verify-btn {
+		font-size: 26rpx;
+		color: #ffc107;
+		padding: 15rpx 20rpx;
+		border: 1rpx solid #ffc107;
+		border-radius: 8rpx;
+		background-color: transparent;
+	}
+	
+	.verify-btn.disabled {
+		color: #999;
+		border-color: #d9d9d9;
+	}
+	
+	.confirm-btn {
+		width: 100%;
+		background-color: #ffc107;
+		color: #333;
+		font-size: 30rpx;
+		font-weight: bold;
+		border-radius: 50rpx;
+		padding: 20rpx;
+		border: none;
+	}
+</style>

+ 177 - 0
pages/myEdit/feedback.uvue

@@ -0,0 +1,177 @@
+<template>
+    <view class="page-container">
+        <!-- 头部 -->
+        <view class="header">
+            <view class="header-left" @click="goBack">
+                <u-icon name="arrow-left" size="24" color="#333"/>
+            </view>
+            <view class="header-title">
+                问题反馈
+            </view>
+            <view class="header-right">
+            </view>
+        </view>
+
+        <!-- 内容区域 -->
+        <view class="content">
+            <!-- 订单编号 -->
+            <view class="form-section">
+                <text class="section-label">
+                    订单编号
+                </text>
+                <input class="input" type="text" placeholder="请提供问题的订单编号" />
+            </view>
+
+            <!-- 问题说明 -->
+            <view class="form-section">
+                <text class="section-label">
+                    问题说明
+                </text>
+                <textarea class="textarea" placeholder="说说您遇到的问题,以便我们提供更好的服务(5个字以上)">
+                </textarea>
+            </view>
+
+            <!-- 上传凭证 -->
+            <view class="form-section">
+                <text class="section-label">
+                    上传凭证
+                </text>
+                <view class="upload-section">
+                    <view class="upload-btn" @click="uploadImage">
+                        <u-icon name="camera" size="40" color="#999"/>
+                        <text class="upload-text">
+                            上传照片
+                        </text>
+                    </view>
+                </view>
+            </view>
+
+            <!-- 提交按钮 -->
+            <button class="submit-btn" @click="submitFeedback">
+                提交
+            </button>
+        </view>
+    </view>
+</template>
+
+<script setup lang="ts">
+    const goBack = () => {
+        uni.navigateBack();
+    };
+
+    const uploadImage = () => {
+        uni.chooseImage({
+                count: 1,
+                sizeType: ['original',
+                'compressed'],
+                sourceType: ['album',
+                'camera'],
+                success: (res) => {
+                    uni.showToast({ title: '上传成功', icon: 'success' });
+                }
+            });
+    };
+
+    const submitFeedback = () => {
+        uni.showToast({ title: '提交成功', icon: 'success' });
+        setTimeout(() => {
+                uni.navigateBack();
+            }, 1500);
+    };
+</script>
+
+<style scoped>
+    .page-container {
+        background-color: #f5f5f5;
+        min-height: 100vh;
+    }
+
+    .header {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20rpx;
+        background-color: #ffffff;
+        border-bottom: 1rpx solid #f0f0f0;
+    }
+
+    .header-left, .header-right {
+        width: 60rpx;
+    }
+
+    .header-title {
+        font-size: 32rpx;
+        font-weight: bold;
+        color: #333;
+    }
+
+    .content {
+        padding: 30rpx;
+    }
+
+    .form-section {
+        margin-bottom: 30rpx;
+    }
+
+    .section-label {
+        font-size: 28rpx;
+        color: #333;
+        margin-bottom: 15rpx;
+        display: block;
+    }
+
+    .input {
+        width: 100%;
+        padding: 20rpx;
+        font-size: 28rpx;
+        color: #333;
+        background-color: #ffffff;
+        border-radius: 16rpx;
+    }
+
+    .textarea {
+        width: 100%;
+        min-height: 150rpx;
+        padding: 20rpx;
+        font-size: 28rpx;
+        color: #333;
+        background-color: #ffffff;
+        border-radius: 16rpx;
+        line-height: 1.5;
+    }
+
+    .upload-section {
+        background-color: #ffffff;
+        border-radius: 16rpx;
+        padding: 30rpx;
+    }
+
+    .upload-btn {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        width: 120rpx;
+        height: 120rpx;
+        border: 2rpx dashed #d9d9d9;
+        border-radius: 8rpx;
+    }
+
+    .upload-text {
+        font-size: 24rpx;
+        color: #999;
+        margin-top: 10rpx;
+    }
+
+    .submit-btn {
+        width: 100%;
+        background-color: #ffc107;
+        color: #333;
+        font-size: 30rpx;
+        font-weight: bold;
+        border-radius: 50rpx;
+        padding: 20rpx;
+        border: none;
+        margin-top: 40rpx;
+    }
+</style>

+ 349 - 0
pages/myEdit/level.uvue

@@ -0,0 +1,349 @@
+<template>
+	<view class="page-container">
+		<!-- 头部 -->
+		<view class="header">
+			<view class="header-left" @click="goBack">
+				<u-icon name="arrow-left" size="24" color="#333"/>
+			</view>
+			<view class="header-title">
+				我的等级
+			</view>
+			<view class="header-right"></view>
+		</view>
+		
+		<!-- 内容区域 -->
+		<view class="content">
+			<!-- 等级信息 -->
+			<view class="level-info">
+				<view class="growth-info">
+					<text class="growth-value">60</text>
+					<text class="growth-label">当前成长值</text>
+				</view>
+				
+				<view class="level-icon">
+					<view class="level-circle">
+						<text class="level-text">V</text>
+					</view>
+					<text class="level-title">当前等级 V1</text>
+				</view>
+				
+				<view class="daily-info">
+					<text class="daily-value">-12</text>
+					<text class="daily-label">每日成长值</text>
+				</view>
+			</view>
+			
+			<!-- 进度条 -->
+			<view class="progress-section">
+				<view class="progress-labels">
+					<text>V1</text>
+					<text>还差15成长值可升至V2</text>
+					<text>V2</text>
+				</view>
+				<view class="progress-bar">
+					<view class="progress-fill" :style="{ width: '60%' }"></view>
+				</view>
+				<view class="progress-values">
+					<text>0</text>
+					<text>65</text>
+				</view>
+			</view>
+			
+			<!-- 成长等级介绍 -->
+			<view class="section">
+				<view class="section-header">
+					<text class="section-title">成长等级介绍</text>
+				</view>
+				<text class="section-desc">
+					成长等级由有效成长值决定的,共分为30个等级,成长值越高,等级越高,享受的分成比例越多。
+				</text>
+			</view>
+			
+			<!-- 等级表格 -->
+			<view class="level-table">
+				<view class="table-header">
+					<text>等级</text>
+					<text>对应成长值</text>
+					<text>对应收益比例</text>
+					<u-icon name="info-o" size="20" color="#999"/>
+				</view>
+				
+				<view class="table-row">
+					<text>V1</text>
+					<text>50</text>
+					<text>1%</text>
+				</view>
+				
+				<view class="table-row">
+					<text>V2</text>
+					<text>65</text>
+					<text>2%</text>
+				</view>
+				
+				<view class="table-row">
+					<text>V3</text>
+					<text>85</text>
+					<text>3%</text>
+				</view>
+				
+				<view class="table-row">
+					<text>V4</text>
+					<text>111</text>
+					<text>4%</text>
+				</view>
+				
+				<view class="table-row">
+					<text>V5</text>
+					<text>144</text>
+					<text>5%</text>
+				</view>
+			</view>
+			
+			<!-- 表格底部说明 -->
+			<text class="table-note">注:其余等级需解锁后查看</text>
+			
+			<!-- 什么是成长值 -->
+			<view class="section">
+				<view class="section-header">
+					<text class="section-title">什么是成长值?</text>
+					<u-icon name="info-o" size="20" color="#999"/>
+				</view>
+				<text class="section-desc">
+					成长值是商户在小丁到家平台赚取实际金额(包含项目分成、佣金、车费、红包、加钟分成、用户评价、复购、转单、用户投诉)对相应比例算出的数值。成长值不能兑换,仅可用于成长等级提升。
+				</text>
+			</view>
+			
+			<!-- 如何获取成长值 -->
+			<view class="section">
+				<view class="section-header">
+					<text class="section-title">如何获取成长值?</text>
+				</view>
+				<view class="growth-rules">
+					<view class="rule-item">
+						<text class="rule-number">1.</text>
+						<text class="rule-text">使用小丁到家平台进行接单并完成,所获得的成长值均可计入有效成长值。</text>
+					</view>
+					<view class="rule-item">
+						<text class="rule-number">2.</text>
+						<text class="rule-text">若用户发生退款、取消订单、差评、投诉等行为,或识别到账户安全风险及其它违法行为,则扣除相应成长值,不计入有效成长值。</text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup lang="ts">
+	const goBack = () => {
+		uni.navigateBack();
+	};
+</script>
+
+<style scoped>
+	.page-container {
+		background-color: #f5f5f5;
+		min-height: 100vh;
+	}
+	
+	.header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+	
+	.header-left, .header-right {
+		width: 60rpx;
+	}
+	
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+	}
+	
+	.content {
+		padding: 30rpx;
+	}
+	
+	.level-info {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 30rpx;
+		margin-bottom: 30rpx;
+	}
+	
+	.growth-info, .daily-info {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+	
+	.growth-value, .daily-value {
+		font-size: 40rpx;
+		font-weight: bold;
+		color: #333;
+	}
+	
+	.growth-label, .daily-label {
+		font-size: 24rpx;
+		color: #666;
+		margin-top: 8rpx;
+	}
+	
+	.level-icon {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+	
+	.level-circle {
+		width: 100rpx;
+		height: 100rpx;
+		border-radius: 50rpx;
+		background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-bottom: 10rpx;
+	}
+	
+	.level-text {
+		font-size: 48rpx;
+		font-weight: bold;
+		color: #ffffff;
+	}
+	
+	.level-title {
+		font-size: 24rpx;
+		color: #333;
+		font-weight: bold;
+	}
+	
+	.progress-section {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 20rpx;
+		margin-bottom: 30rpx;
+	}
+	
+	.progress-labels {
+		display: flex;
+		justify-content: space-between;
+		font-size: 24rpx;
+		color: #666;
+		margin-bottom: 10rpx;
+	}
+	
+	.progress-bar {
+		width: 100%;
+		height: 12rpx;
+		background-color: #f0f0f0;
+		border-radius: 6rpx;
+		overflow: hidden;
+		margin-bottom: 5rpx;
+	}
+	
+	.progress-fill {
+		height: 100%;
+		background: linear-gradient(to right, #667eea, #764ba2);
+		border-radius: 6rpx;
+	}
+	
+	.progress-values {
+		display: flex;
+		justify-content: space-between;
+		font-size: 22rpx;
+		color: #999;
+	}
+	
+	.section {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 20rpx;
+		margin-bottom: 20rpx;
+	}
+	
+	.section-header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin-bottom: 15rpx;
+	}
+	
+	.section-title {
+		font-size: 28rpx;
+		color: #333;
+		font-weight: bold;
+	}
+	
+	.section-desc {
+		font-size: 26rpx;
+		color: #666;
+		line-height: 1.5;
+	}
+	
+	.level-table {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		overflow: hidden;
+		margin-bottom: 15rpx;
+	}
+	
+	.table-header, .table-row {
+		display: flex;
+		align-items: center;
+		padding: 15rpx 20rpx;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+	
+	.table-header {
+		background-color: #f5f5f5;
+		font-weight: bold;
+	}
+	
+	.table-header text, .table-row text {
+		flex: 1;
+		text-align: center;
+		font-size: 26rpx;
+		color: #333;
+	}
+	
+	.table-note {
+		font-size: 24rpx;
+		color: #999;
+		text-align: center;
+		margin-bottom: 30rpx;
+		display: block;
+	}
+	
+	.growth-rules {
+		display: flex;
+		flex-direction: column;
+		gap: 15rpx;
+	}
+	
+	.rule-item {
+		display: flex;
+		align-items: flex-start;
+	}
+	
+	.rule-number {
+		font-size: 26rpx;
+		color: #ff6b35;
+		font-weight: bold;
+		margin-right: 10rpx;
+	}
+	
+	.rule-text {
+		flex: 1;
+		font-size: 26rpx;
+		color: #666;
+		line-height: 1.5;
+	}
+</style>

+ 190 - 0
pages/myEdit/logout.uvue

@@ -0,0 +1,190 @@
+<template>
+	<view class="page-container">
+		<!-- 头部 -->
+		<view class="header">
+			<view class="header-left" @click="goBack">
+				<u-icon name="arrow-left" size="24" color="#333"/>
+			</view>
+			<view class="header-title">
+				注销账号
+			</view>
+			<view class="header-right"></view>
+		</view>
+		
+		<!-- 内容区域 -->
+		<view class="content">
+			<!-- 提示信息 -->
+			<view class="tip-text">
+				为保证你的账号安全,在你提交的注销申请生效前,需同时满足以下条件
+			</view>
+			
+			<!-- 条件列表 -->
+			<view class="conditions">
+				<view class="condition-item">
+					<text class="condition-number">1.</text>
+					<view class="condition-content">
+						<text class="condition-title">账号订单均已完成</text>
+						<text class="condition-desc">本账号在平台交易的订单均已完成,若存在未完成的订单状态将无法注销。</text>
+					</view>
+				</view>
+				
+				<view class="condition-item">
+					<text class="condition-number">2.</text>
+					<view class="condition-content">
+						<text class="condition-title">账号无任何纠纷</text>
+						<text class="condition-desc">包括投诉举报,均已处理完结</text>
+					</view>
+				</view>
+				
+				<view class="condition-item">
+					<text class="condition-number">3.</text>
+					<view class="condition-content">
+						<text class="condition-title">账号内的余额、资产自愿放弃</text>
+						<text class="condition-desc">若注销平台将视为你自愿放弃账户的余额、资产。</text>
+					</view>
+				</view>
+			</view>
+			
+			<!-- 确认注销按钮 -->
+			<button class="logout-btn" :disabled="!agree" @click="confirmLogout">确认注销</button>
+			
+			<!-- 协议勾选 -->
+			<view class="agreement">
+				<checkbox :value="agree" @change="agree = !agree"></checkbox>
+				<text class="agreement-text">我已同意阅读并同意《小丁到家注销协议》</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup lang="ts">
+	import { ref } from 'vue';
+	
+	const agree = ref(false);
+	
+	const goBack = () => {
+		uni.navigateBack();
+	};
+	
+	const confirmLogout = () => {
+		uni.showModal({
+			title: '确认注销',
+			content: '您确定要注销账号吗?注销后将无法恢复!',
+			success: (res) => {
+				if (res.confirm) {
+					uni.showToast({ title: '注销成功', icon: 'success' });
+					setTimeout(() => {
+						uni.navigateTo({ url: '/pages/login/login' });
+					}, 1500);
+				}
+			}
+		});
+	};
+</script>
+
+<style scoped>
+	.page-container {
+		background-color: #f5f5f5;
+		min-height: 100vh;
+	}
+	
+	.header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+	
+	.header-left, .header-right {
+		width: 60rpx;
+	}
+	
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+	}
+	
+	.content {
+		padding: 30rpx;
+	}
+	
+	.tip-text {
+		font-size: 28rpx;
+		color: #333;
+		line-height: 1.5;
+		margin-bottom: 40rpx;
+	}
+	
+	.conditions {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 30rpx;
+		margin-bottom: 40rpx;
+	}
+	
+	.condition-item {
+		display: flex;
+		margin-bottom: 30rpx;
+	}
+	
+	.condition-item:last-child {
+		margin-bottom: 0;
+	}
+	
+	.condition-number {
+		font-size: 28rpx;
+		font-weight: bold;
+		color: #ff6b35;
+		margin-right: 15rpx;
+	}
+	
+	.condition-content {
+		flex: 1;
+	}
+	
+	.condition-title {
+		font-size: 28rpx;
+		color: #333;
+		font-weight: bold;
+		display: block;
+		margin-bottom: 8rpx;
+	}
+	
+	.condition-desc {
+		font-size: 26rpx;
+		color: #666;
+		line-height: 1.4;
+	}
+	
+	.logout-btn {
+		width: 100%;
+		background-color: #ffc107;
+		color: #333;
+		font-size: 30rpx;
+		font-weight: bold;
+		border-radius: 50rpx;
+		padding: 20rpx;
+		border: none;
+		margin-bottom: 30rpx;
+	}
+	
+	.logout-btn[disabled] {
+		background-color: #d9d9d9;
+		color: #999;
+	}
+	
+	.agreement {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	
+	.agreement-text {
+		font-size: 26rpx;
+		color: #666;
+		margin-left: 10rpx;
+	}
+</style>

+ 347 - 328
pages/myEdit/my.uvue

@@ -3,28 +3,28 @@
 
 		<!-- 1. 用户信息头部 -->
 		<view class="user-header">
-			<image :src="userInfo['avatar']" class="avatar" mode="aspectFill" />
 			<view class="user-info">
+				<image class="avatar" :src="coachInfo['avatar']" mode="aspectFill" />
 				<text class="username">
-					{{ userInfo['name'] }}
+					{{ coachInfo['name'] }}
 				</text>
-				<view class="badge-row">
-					<text class="badge vip">
-						王牌
-					</text>
-				</view>
+				<image @click="jumpStarRating()" :src="'/static/testInfo/xx-x' + coachInfo?.star_leavl + '.png'"
+					style="width: 108rpx;height:40rpx;margin-left: 12rpx;" mode="aspectFit">
+				</image>
 			</view>
 			<view class="header-actions">
 				<view class="action-item" @click="contactService">
-					<u-icon name="customer-service" size="18" color="#666">
-					</u-icon>
+					<view class="icon-circle">
+						<u-icon name="customerService" size="30" color="#666" />
+					</view>
 					<text>
 						客服
 					</text>
 				</view>
-				<view class="action-item" @click="openSettings">
-					<u-icon name="setting" size="18" color="#666">
-					</u-icon>
+				<view class="action-item" style="margin-left: 20rpx;" @click="openSettings">
+					<view class="icon-circle">
+						<u-icon name="setting" size="22" color="#666" />
+					</view>
 					<text>
 						设置
 					</text>
@@ -32,164 +32,172 @@
 			</view>
 		</view>
 
+
 		<!-- 2. 等级卡片 -->
 		<view class="level-card">
-			<view class="level-main">
-				<text class="level-title">
-					V{{ userInfo['level'] }}
-				</text>
-				<text class="level-sub">
-					成长值 {{ userInfo['growthValue'] }}
-				</text>
-			</view>
-			<view class="level-progress">
-				<text class="progress-text">
-					还差{{ userInfo['nextLevelGap'] }}成长值可升至V{{ userInfo['nextLevel'] }}
-				</text>
-				<view class="progress-bar">
-					<view class="progress-fill" :style="{ width: progressWidth }">
-					</view>
-				</view>
-				<view class="progress-labels">
-					<text>
-						V1
+			<image src="/static/testInfo/l-bg.png" class="level-bg" mode="widthFix">
+			</image>
+			<view class="level-content">
+				<view class="level-main" style="width: 60%;">
+					<text class="level-title">
+						V{{ coachInfo['level'] }}
 					</text>
-					<text>
-						V2
+					<text style="margin: 0 20rpx;">
+						|
+					</text>
+					<text class="level-sub">
+						成长值 {{ coachInfo['growthValue'] }}
 					</text>
 				</view>
-			</view>
-			<view class="level-badge" @click="viewLevelDetail">
-				<u-icon type="vip" size="40" color="#ffffff">
-				</u-icon>
-				<text>
-					我的等级
-				</text>
-			</view>
-		</view>
-
-		<!-- 3. 我的档案 -->
-		<view class="section-title">
-			我的档案
-		</view>
-		<view class="profile-stats">
-			<view class="stat-item">
-				<text class="stat-value">
-					60
-				</text>
-				<text class="stat-label">
-					签约
-				</text>
-			</view>
-			<view class="stat-item">
-				<text class="stat-value">
-					21
-				</text>
-				<text class="stat-label">
-					解约
-				</text>
-			</view>
-			<view class="stat-item">
-				<u-icon type="location" size="24" color="#666">
-				</u-icon>
-				<text class="stat-label">
-					异地签到
-				</text>
-			</view>
-			<view class="stat-item">
-				<u-icon type="cart" size="24" color="#666">
-				</u-icon>
-				<text class="stat-label">
-					购买物料
+				<text class="progress-text">
+					还差{{ coachInfo['nextLevelGap'] }}成长值可升至V{{ coachInfo['nextLevel'] }}
 				</text>
+				<view class="level-progress-box">
+					<view class="level-progress">
+
+						<view class="progress-bar">
+							<!-- 	<view class="progress-fill" :style="{ width: progressWidth }">
+							</view> -->
+						</view>
+						<view class="progress-labels">
+							<text>
+								V1
+							</text>
+							<text>
+								V2
+							</text>
+						</view>
+					</view>
+					<view class="level-badge" @click="viewLevelDetail">
+						<text>
+							我的等级
+						</text>
+					</view>
+				</view>
 			</view>
-		</view>
 
-		<!-- 4. 我的工具 -->
-		<view class="section-title">
-			我的工具
-		</view>
-		<view class="tools-grid">
-			<view class="tool-item" v-for="(tool, idx) in tools" :key="idx" @click="handleToolClick(tool)">
-				<u-icon :type="tool.icon" size="32" :color="tool.color">
-				</u-icon>
-				<text class="tool-name">
-					{{ tool.name }}
-				</text>
-			</view>
-		</view>
 
-		<!-- 5. 推广卡片 -->
-		<view class="promo-cards">
-			<!-- 邀请好友 -->
-			<view class="promo-card invite" @click="inviteFriends">
-				<view class="promo-content">
-					<text class="promo-title">
-						邀请好友赚钱
-					</text>
-					<text class="promo-subtitle">
-						单次最高可奖200元
+			<!-- 3. 我的档案 -->
+			<view class="bs-box">
+				<view class="title-bg-box">
+					<text class="texnj-box">
+						我的档案
 					</text>
 				</view>
-				<u-icon type="gift" size="40" color="#ffd700">
-				</u-icon>
-			</view>
+				<view class="level-main">
+					<view class="action-item" @click="jumpQy">
+						<image src="/static/myImages/my-qy.png" style="width: 60rpx;height:60rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							签约
+						</text>
 
-			<!-- 我的团队 -->
-			<view class="promo-card team" @click="viewTeam">
-				<view class="promo-content">
-					<text class="promo-title">
-						我的团队
-					</text>
-					<text class="promo-subtitle">
-						团队成员100人
-					</text>
+					</view>
+
+					<view class="action-item" style="margin-left: 25rpx;" @click="jumpJiey">
+						<image src="/static/myImages/my-jiey.png" style="width: 60rpx;height:60rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							解约
+						</text>
+					</view>
+					<view class="action-item" @click="jumpQd">
+						<image src="/static/myImages/my-qd.png" style="width: 60rpx;height:60rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							店铺签到
+						</text>
+					</view>
+					<view class="action-item" @click="jumpGoum">
+						<image src="/static/myImages/my-goum.png" style="width: 60rpx;height:60rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							购买物料
+						</text>
+
+					</view>
+				</view>
+				<view class="title-bg-box">
+					<view class="texnj-box">
+						我的工具
+					</view>
+				</view>
+				<view class="level-main" style="justify-content: space-between; padding: 0 15rpx;">
+					<view class="action-item" @click="jumpXuexi">
+						<image src="/static/myImages/my-xux.png" style="width: 60rpx;height:60rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							学习园地
+						</text>
+					</view>
+					<view class="action-item">
+						<image src="/static/myImages/my-wt.png" style="width: 60rpx;height:60rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							申诉
+						</text>
+					</view>
+					<view class="action-item">
+						<image src="/static/myImages/my-yhj.png" style="width: 60rpx;height:60rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							定制优惠
+						</text>
+					</view>
+					<view class="action-item">
+						<image src="/static/myImages/vipIcon.png" style="width: 70rpx;height:70rpx;" mode="aspectFit">
+						</image>
+						<text class="dib-text">
+							VIP俱乐部
+						</text>
+					</view>
+				</view>
+				<view class="level-progress-box">
+					<view class="lef-bg-box" @click="jumpLaxin">
+						<image src="/static/myImages/my-lax.png" class="my-lax" mode="widthFix">
+						</image>
+						<view class="conm-box">
+							<text class="max-box">
+								邀请好友赚钱
+							</text>
+							<text class="min-box">
+								单次最高可奖200元
+							</text>
+						</view>
+					</view>
+					<view class="lef-bg-box" @click="jumpMyTeam">
+						<image src="/static/myImages/my-td.png" class="my-lax" mode="widthFix">
+						</image>
+						<view class="conm-box">
+							<text class="max-box">
+								我的团队
+							</text>
+							<text class="min-box">
+								团队成员数:100人
+							</text>
+						</view>
+					</view>
 				</view>
-				<u-icon type="person" size="40" color="#4a90e2">
-				</u-icon>
-			</view>
-		</view>
 
-		<!-- 6. 城市合伙人 banner -->
-		<view class="partner-banner" @click="joinPartner">
-			<view class="partner-content">
-				<text class="partner-title">
-					寻找城市合伙人
-				</text>
-				<text class="partner-subtitle">
-					全新盈利模式助你创业
-				</text>
-			</view>
-			<view class="partner-icon">
-				<u-icon type="person" size="50" color="#ffffff">
-				</u-icon>
-				<u-icon type="person" size="30" color="#ffffff" style="margin-left: -20rpx;">
-				</u-icon>
+				<image class="hhr-image" src="/static/yaoqInfo/hhr-image.png" mode="widthFix">
+				</image>
+
 			</view>
 		</view>
-
 	</view>
 </template>
 
 <script setup lang="ts">
 	import { ref, reactive } from 'vue';
-
+	import { getCoachDetaile } from '@/utils/api/masterInfoApi'
 	// --- 用户信息 ---
-
-	type UserInfo = {
-		name : string;
-		avatar : string;
-		level : number;
-		growthValue : number;
-		nextLevel : number;
-		nextLevelGap : number;
-		progressPercent : number;
-	}
-	const userInfo = reactive<UserInfo>({
+	const coachInfo = reactive<UTSJSONObject>({
 		name: '刘大锤',
-		avatar: 'https://via.placeholder.com/100x100/4a90e2/ffffff?text=LD', // 替换为实际头像
+		avatar: '/static/testInfo/boy-nickname.png', // 替换为实际头像
 		level: 30,
 		growthValue: 50,
+		star_leavl: 3,
+		star_score: 3.0,
 		nextLevel: 2,
 		nextLevelGap: 15,
 		progressPercent: 75 // (50 / (50+15)) * 100 ≈ 75%
@@ -197,7 +205,7 @@
 
 	// computed helpers to satisfy UTS inference rules
 	// convert percent to a fixed rpx width (assuming 750rpx full width)
-	const progressWidth = computed(() => `${userInfo.progressPercent * 7.5}rpx`);
+	// const progressWidth = computed(() => `${coachInfo.progressPercent * 7.5}rpx`);
 
 	// --- 工具列表 ---
 
@@ -217,6 +225,25 @@
 	] as ToolItem[]);
 
 	// --- 方法 ---
+	const httpGetCoachDetail = async () => {
+		const response = await getCoachDetaile() as UTSJSONObject
+		const code = response["code"] as number
+		const dataObj = response["data"] as UTSJSONObject | null
+		if (code != 200 || dataObj == null) {
+			return
+		}
+		coachInfo.name = dataObj["nickname"] as string
+		coachInfo.avatar = dataObj["avatar"] as string
+		coachInfo.level = dataObj["level"] as number
+		coachInfo.growthValue = dataObj["growthValue"] as number
+		coachInfo.nextLevel = dataObj["nextLevel"] as number
+		coachInfo.nextLevelGap = dataObj["nextLevelGap"] as number
+		coachInfo.progressPercent = dataObj["progressPercent"] as number
+		coachInfo.star_leavl = dataObj["star_leavl"] as number
+		coachInfo.star_score = dataObj["star_score"] as number
+
+	}
+
 	const contactService = () => {
 		uni.showToast({ title: '联系客服', icon: 'none' });
 	};
@@ -234,7 +261,80 @@
 	const handleToolClick = (tool : ToolItem) => {
 		uni.showToast({ title: `点击${tool.name}`, icon: 'none' });
 	};
+	// --- 跳转 ---
+	const jumpQy = () => {
+		uni.navigateTo({
+			url: '/pages/myEdit/sign'
+		});
+	};
+	const jumpJiey = () => {
+		uni.navigateTo({
+			url: '/pages/myEdit/terminate'
+		});
+	};
+	const jumpQd = () => {
+		uni.navigateTo({
+			url: '/pages/myEdit/signIn'
+		});
+	};
+	const jumpGoum = () => {
+		uni.navigateTo({
+			url: '/pages/myEdit/shoppingRecord'
+		});
+	};
+	const jumpLaxin = () => {
+		uni.navigateTo({
+			url: '/pages/myEdit/inviteRecord'
+		});
+	};
+	//跳转到我的团队
+	const jumpMyTeam = () => {
+		uni.navigateTo({
+			url: '/pages/myEdit/team'
+		});
+	};
+	const jumpYhj = () => {
+		uni.navigateTo({
+			url: '/pages/myEdit/setting'
+		});
+	};
+	//跳转到城市合伙人
+	const jumpPartner = async () => {
+		uni.navigateTo({
+			url: '/pages/masterProject/inviteInfo/partner/index'
+		})
+	}
 
+	//跳转到用户开通VIP
+	const goToOpenVip = async () => {
+		uni.navigateTo({
+			url: '/pages/masterProject/masterInfo/vipMember/index'
+		})
+	}
+	//跳转到问题反馈
+	const goToMyCourse = async () => {
+		uni.navigateTo({
+			url: '/pages/masterProject/masterInfo/problemFeedback/index'
+		})
+	}
+	//跳转到个人信息
+	const jumpMasterInfo = async () => {
+		uni.navigateTo({
+			url: '/pages/masterProject/masterInfo/index'
+		})
+	}
+	//跳转到我的星级
+	const jumpStarRating = async () => {
+		uni.navigateTo({
+			url: '/pages/masterProject/masterInfo/starRating/index?star_score'
+		})
+	}
+	//跳转到学习园地
+	const jumpXuexi = () => {
+		uni.navigateTo({
+			url: '/pages/masterProject/inviteInfo/learningCorner/index'
+		})
+	}
 	const inviteFriends = () => {
 		uni.showModal({
 			title: '邀请好友',
@@ -262,23 +362,19 @@
 			}
 		});
 	};
+	onLoad(() => {
+		httpGetCoachDetail()
+	})
 </script>
 
 <style scoped>
 	/*
-  UniApp X 默认 page 是 flex-direction: column
-  所以 .page-container 会自动垂直排列子元素
-  */
+	UniApp X 默认 page 是 flex-direction: column
+	所以 .page-container 会自动垂直排列子元素
+	*/
 
 	.page-container {
-		background-color: #f5f6f8;
-		/* min-height: 100vh unsupported */
-		min-height: 1000rpx;
-		/* width: 100%; default block behavior */
-		box-sizing: border-box;
-		padding: 20rpx;
-		/* gap: 20rpx; */
-		/* 各模块间间距 */
+		background-color: rgba(246, 246, 244, 0.5);
 	}
 
 	/* --- 用户头部 --- */
@@ -286,37 +382,32 @@
 		display: flex;
 		flex-direction: row;
 		align-items: center;
-		/* gap: 20rpx; */
-		padding: 20rpx;
-		background: #ffffff;
-		border-radius: 16rpx;
-		box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+		padding: 30rpx;
+		justify-content: space-between;
 	}
 
 	.avatar {
-		width: 100rpx;
-		height: 100rpx;
-		border-radius: 50rpx;
-		border: 2rpx solid #eee;
+		width: 124rpx;
+		height: 124rpx;
+		border-radius: 62rpx;
+		border: 2rpx solid #fff;
 	}
 
 	.user-info {
-		flex: 1;
-		display: flex;
-		flex-direction: column;
-		/*  */
+		flex-direction: row;
+		align-items: center;
 	}
 
 	.username {
 		font-size: 32rpx;
 		font-weight: bold;
 		color: #333;
+		margin: 0 10rpx;
 	}
 
 	.badge-row {
 		display: flex;
 		flex-direction: row;
-		/* gap: 10rpx; */
 	}
 
 	.badge {
@@ -327,73 +418,96 @@
 	}
 
 	.badge.vip {
-		/* background: linear-gradient(90deg, #4a90e2, #67b26f); */
 		color: #ffffff;
 	}
 
 	.header-actions {
 		display: flex;
 		flex-direction: row;
-		/* gap: 30rpx; */
 	}
 
 	.action-item {
 		display: flex;
-		flex-direction: column;
 		align-items: center;
-		/* gap: 4rpx; unsupported */
-		font-size: 22rpx;
-		color: #666;
+
 	}
 
+	.icon-circle {
+		width: 80rpx;
+		height: 80rpx;
+		border-radius: 40rpx;
+		background-color: #ffffff;
+		box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-bottom: 8rpx;
+	}
+
+
 	/* --- 等级卡片 --- */
 	.level-card {
-		/* background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); */
-		border-radius: 16rpx;
-		padding: 30rpx;
-		color: #ffffff;
+		/* padding:0 40rpx; */
 		position: relative;
-		overflow: hidden;
+		flex-direction: column;
+		align-items: center;
+	}
+
+	.level-bg {
+		position: absolute;
+		width: 90%;
+		z-index: 1;
+	}
+
+	.level-content {
+		position: absolute;
+		z-index: 2;
+		padding: 20rpx;
+		width: 90%;
 	}
 
 	.level-main {
 		display: flex;
 		flex-direction: row;
-		align-items: flex-start;
-		/* baseline unsupported */
-		/* gap: 15rpx; not supported by uvue */
-		margin-bottom: 20rpx;
+		align-items: center;
+		justify-content: space-around;
 	}
 
 	.level-title {
-		font-size: 48rpx;
-		font-weight: bold;
+		font-size: 86rpx;
+		color: #485575;
 	}
 
 	.level-sub {
-		font-size: 28rpx;
-		opacity: 0.9;
+		font-size: 36rpx;
+		color: #424C6C;
+	}
+
+	.level-progress-box {
+		display: flex;
+		flex-direction: row;
+		align-items: flex-start;
+		justify-content: space-between;
 	}
 
 	.level-progress {
 		margin-bottom: 20rpx;
+		width: 70%;
 	}
 
 	.progress-text {
-		font-size: 24rpx;
+		font-size: 28rpx;
 		opacity: 0.8;
 		margin-bottom: 10rpx;
-		/* display:block removed; inline text is fine */
 	}
 
 	.progress-bar {
-		/* width: 100%; */
-		/* 全宽默认,无需指定百分比 */
+
 		height: 12rpx;
 		background: rgba(255, 255, 255, 0.3);
 		border-radius: 6rpx;
 		overflow: hidden;
-		margin-bottom: 8rpx;
+		margin-top: 8rpx;
 	}
 
 	.progress-fill {
@@ -413,162 +527,67 @@
 	}
 
 	.level-badge {
-		position: absolute;
-		top: 20rpx;
-		right: 20rpx;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		/*  */
-		font-size: 24rpx;
-		opacity: 0.9;
+		background-color: #E9EEF7;
+		border-radius: 14px;
+		padding: 8rpx 16rpx;
 	}
 
 	/* --- 章节标题 --- */
-	.section-title {
-		font-size: 30rpx;
-		font-weight: bold;
-		color: #333;
-		margin-top: 10rpx;
-		margin-bottom: 15rpx;
-		padding-left: 10rpx;
-		border-left: 4rpx solid #4a90e2;
-	}
-
-	/* --- 档案统计 --- */
-	.profile-stats {
-		display: flex;
-		flex-direction: row;
-		justify-content: space-around;
-		background: #ffffff;
-		border-radius: 16rpx;
-		padding: 30rpx 20rpx;
-		box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
-	}
-
-	.stat-item {
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-
-	}
-
-	.stat-value {
-		font-size: 32rpx;
-		font-weight: bold;
-		color: #333;
-	}
-
-	.stat-label {
-		font-size: 24rpx;
-		color: #666;
-	}
-
-	/* --- 工具网格 --- */
-	.tools-grid {
-		display: flex;
-		flex-direction: row;
-		flex-wrap: wrap;
-		/* gap: 20rpx; */
-		background: #ffffff;
-		border-radius: 16rpx;
+	.bs-box {
+		background-color: #ffffff;
+		border-radius: 36rpx;
 		padding: 30rpx;
-		box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
-	}
-
-	.tool-item {
-		/* width: calc(25% - 15rpx); not supported */
-		width: 168rpx;
-		/* approximate quarter width */
-		/* 4列,减去gap */
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		/* gap: 10rpx; */
-		padding: 20rpx 0;
+		width: 100%;
+		margin-top: 30%;
 	}
 
-	.tool-name {
-		font-size: 24rpx;
-		color: #666;
-		text-align: center;
-	}
-
-	/* --- 推广卡片 --- */
-	.promo-cards {
+	.title-bg-box {
 		display: flex;
-		flex-direction: row;
-		/* gap: 20rpx; */
-	}
-
-	.promo-card {
-		flex: 1;
-		border-radius: 16rpx;
-		padding: 25rpx;
-		display: flex;
-		flex-direction: row;
-		justify-content: space-between;
-		align-items: center;
-		box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+		align-items: flex-start;
+		margin: 35rpx 0;
 	}
 
-	/*  .promo-card.invite {
-    background: linear-gradient(135deg, #fff9e6 0%, #ffeaa7 100%);
-  }
-
-  .promo-card.team {
-    background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);
-  } */
-
-	.promo-content {
-		display: flex;
-		flex-direction: column;
-		/*  */
+	.texnj-box {
+		font-size: 30rpx;
+		font-weight: 500;
+		background: linear-gradient(to right, #ffd95aff, #FFFFFF);
+		border-radius: 24rpx;
+		padding: 4rpx 10rpx;
+		background-size: 50% 100%;
+		background-repeat: no-repeat;
+		background-position: 0 50%;
 	}
 
-	.promo-title {
-		font-size: 28rpx;
-		font-weight: bold;
-		color: #333;
+	.lef-bg-box {
+		width: 49%;
+		position: relative;
+		margin: 20rpx 0;
 	}
 
-	.promo-subtitle {
-		font-size: 24rpx;
-		color: #666;
-	}
+	.my-lax {
+		width: 100%;
+		/* position: absolute; */
 
-	/* --- 合伙人 Banner --- */
-	.partner-banner {
-		background: linear-gradient(135deg, #ff9a9e 0%, #fad0c4 100%);
-		border-radius: 16rpx;
-		padding: 30rpx;
-		display: flex;
-		flex-direction: row;
-		justify-content: space-between;
-		align-items: center;
-		color: #ffffff;
-		box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
 	}
 
-	.partner-content {
-		display: flex;
-		flex-direction: column;
-		/* gap: 10rpx; */
+	.min-box {
+		font-size: 30rpx;
+		color: #a8a8a8ff;
 	}
 
-	.partner-title {
+	.max-box {
 		font-size: 32rpx;
+		color: #000000ff;
 		font-weight: bold;
 	}
 
-	.partner-subtitle {
-		font-size: 26rpx;
-		opacity: 0.9;
+	.conm-box {
+		position: absolute;
+		padding: 28rpx;
+
 	}
 
-	.partner-icon {
-		display: flex;
-		flex-direction: row;
-		align-items: center;
+	.hhr-image {
+		width: 100%;
 	}
 </style>

+ 144 - 2
pages/myEdit/myEdit.uvue

@@ -1,5 +1,5 @@
 <template>
-	<view class="container">
+	<view class="page-container">
 		<!-- 内容区 -->
 		<scroll-view class="content-box" scroll-y>
 			<!-- 头像+基础信息区 -->
@@ -40,7 +40,7 @@
 					<text class="info-label">
 						昵称
 					</text>
-					<view class="info-content" style="flex-direction: row;">
+					<view class="info-content" style="flex-direction: row;" @click="openNicknameContainer">
 						<text class="content-text">
 							熙熙
 						</text>
@@ -133,6 +133,23 @@
 				</view>
 			</view>
 		</scroll-view>
+
+		<page-container :show="containerShow" :position="containerPosition" :round="containerRound"
+		:overlay="containerOverlay" :overlay-style="containerOverlayStyle"
+		:close-on-slide-down="containerCloseOnSlideDown" @afterleave="onAfterLeave" class="pagecontainerpopup">
+			<view class="container">
+				<text class="container-title">
+					{{ containerTitle }}
+				</text>
+				<input class="nickname-input" v-model="nicknameInput" placeholder="请输入昵称" />
+				<text class="nickname-error" v-if="nicknameError">
+					{{ nicknameError }}
+				</text>
+				<button class="save-btn" @click="saveNickname">
+					确定
+				</button>
+			</view>
+		</page-container>
 	</view>
 </template>
 
@@ -140,6 +157,75 @@
 	import { ref } from 'vue';
 
 	const userAvatar = ref('/static/imagesInfo/avatar.png');
+
+	// page-container 组件所需变量
+	const containerShow = ref(false);
+	const containerPosition = ref('center');
+	const containerRound = ref(true);
+	const containerOverlay = ref(true);
+	const containerOverlayStyle = ref({
+			backgroundColor: 'rgba(0, 0, 0, 0.5)'
+		});
+	const containerCloseOnSlideDown = ref(true);
+
+	const containerTitle = ref('修改昵称');
+	const nicknameInput = ref('');
+	const nicknameError = ref('');
+
+	const closeContainer = () => {
+		containerShow.value = false;
+	};
+
+	const openNicknameContainer = () => {
+		nicknameInput.value = '熙熙';
+		containerShow.value = true;
+	};
+
+	const saveNickname = () => {
+		uni.showToast({ title: '昵称修改成功', icon: 'success' });
+		containerShow.value = false;
+	};
+	// 获取个人信息接口
+	const getUserInfo = async () => {
+		try {
+			const res = await uni.request({
+					url: '/api/user/info',
+					method: 'GET'
+				});
+			if (res.data.code === 200) {
+				const data = res.data.data;
+				userAvatar.value = data.avatar || '/static/imagesInfo/avatar.png';
+				// 更新其他个人信息...
+			}
+		} catch (error) {
+			console.error('获取用户信息失败', error);
+		}
+	};
+
+
+
+	// 修改头像接口
+	const updateAvatar = async (tempFilePath) => {
+		try {
+			const res = await uni.uploadFile({
+					url: '/api/user/avatar',
+					filePath: tempFilePath,
+					name: 'file'
+				});
+			const data = JSON.parse(res.data);
+			if (data.code === 200) {
+				userAvatar.value = data.data.url;
+				uni.showToast({ title: '头像上传成功', icon: 'success' });
+			}
+		} catch (error) {
+			console.error('上传头像失败', error);
+			uni.showToast({ title: '上传失败', icon: 'none' });
+		}
+	};
+
+	const onAfterLeave = () => {
+		console.log('容器关闭动画结束');
+	};
 </script>
 
 <style>
@@ -323,4 +409,60 @@
 		color: #fff;
 		background-color: #ff9900;
 	}
+
+	/* page-container 容器样式 */
+	.container {
+		padding: 40rpx 30rpx;
+		background-color: #ffffff;
+		border-radius: 36rpx;
+		/* width: 90%;
+		margin: 0 auto;
+		*/
+	}
+	.pagecontainerpopup{
+		border-radius: 40rpx;
+		width: 80%;
+	}
+	.container-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+		text-align: center;
+		margin-bottom: 30rpx;
+		background: linear-gradient(to right, #FFF9E6, #FFFFFF);
+		border-radius: 16rpx;
+		padding: 8rpx 20rpx;
+		display: block;
+		width: fit-content;
+		margin-left: auto;
+		margin-right: auto;
+	}
+
+	.nickname-input {
+		width: 100%;
+		padding: 20rpx;
+		font-size: 28rpx;
+		color: #333;
+		background-color: #f5f5f5;
+		border-radius: 12rpx;
+		margin-bottom: 30rpx;
+	}
+
+	.nickname-error {
+		font-size: 24rpx;
+		color: #ff4444;
+		margin-bottom: 20rpx;
+		display: block;
+	}
+
+	.save-btn {
+		width: 100%;
+		background-color: #ffc107;
+		color: #333;
+		font-size: 30rpx;
+		font-weight: bold;
+		border-radius: 50rpx;
+		padding: 20rpx;
+		border: none;
+	}
 </style>

+ 214 - 0
pages/myEdit/offsiteSign.uvue

@@ -0,0 +1,214 @@
+<template>
+	<view class="page-container">
+		<!-- 头部 -->
+		<view class="header">
+			<view class="header-left" @click="goBack">
+				<u-icon name="arrow-left" size="24" color="#333"/>
+			</view>
+			<view class="header-title">
+				异地签证
+			</view>
+			<view class="header-right"></view>
+		</view>
+		
+		<!-- 标签页 -->
+		<view class="tabs">
+			<view class="tab-item" :class="{ active: activeTab === 0 }" @click="activeTab = 0">签证申请</view>
+			<view class="tab-item" :class="{ active: activeTab === 1 }" @click="activeTab = 1">申请记录</view>
+		</view>
+		
+		<!-- 签证申请内容 -->
+		<view class="content" v-if="activeTab === 0">
+			<!-- 意向城市 -->
+			<view class="form-item">
+				<text class="label">意向城市</text>
+				<view class="value">请选择</view>
+				<u-icon name="arrow-right" size="16" color="#999"/>
+			</view>
+			
+			<!-- 开始日期 -->
+			<view class="form-item">
+				<text class="label">开始日期</text>
+				<view class="value">请选择</view>
+				<u-icon name="arrow-right" size="16" color="#999"/>
+			</view>
+			
+			<!-- 结束日期 -->
+			<view class="form-item">
+				<text class="label">结束日期</text>
+				<view class="value">请选择</view>
+				<u-icon name="arrow-right" size="16" color="#999"/>
+			</view>
+			
+			<!-- 签证理由 -->
+			<view class="reason-section">
+				<text class="section-title">签证理由</text>
+				<textarea class="reason-input" placeholder="请输入签证理由"></textarea>
+			</view>
+			
+			<!-- 按钮区域 -->
+			<view class="button-section">
+				<button class="submit-btn" @click="submitAudit">提交审核</button>
+				<button class="return-btn" @click="returnCity">回原城市</button>
+			</view>
+		</view>
+		
+		<!-- 申请记录内容 -->
+		<view class="content" v-if="activeTab === 1">
+			<view class="record-empty">暂无申请记录</view>
+		</view>
+	</view>
+</template>
+
+<script setup lang="ts">
+	import { ref } from 'vue';
+	
+	const activeTab = ref(0);
+	
+	const goBack = () => {
+		uni.navigateBack();
+	};
+	
+	const submitAudit = () => {
+		uni.showToast({ title: '提交审核成功', icon: 'success' });
+	};
+	
+	const returnCity = () => {
+		uni.showToast({ title: '返回原城市', icon: 'none' });
+	};
+</script>
+
+<style scoped>
+	.page-container {
+		background-color: #f5f5f5;
+		min-height: 100vh;
+	}
+	
+	.header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+	
+	.header-left, .header-right {
+		width: 60rpx;
+	}
+	
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+	}
+	
+	.tabs {
+		display: flex;
+		background-color: #ffffff;
+		padding: 0 30rpx;
+	}
+	
+	.tab-item {
+		flex: 1;
+		text-align: center;
+		padding: 20rpx;
+		font-size: 28rpx;
+		color: #666;
+		position: relative;
+	}
+	
+	.tab-item.active {
+		color: #ffc107;
+		font-weight: bold;
+	}
+	
+	.tab-item.active::after {
+		content: '';
+		position: absolute;
+		bottom: 0;
+		left: 50%;
+		transform: translateX(-50%);
+		width: 40rpx;
+		height: 4rpx;
+		background-color: #ffc107;
+		border-radius: 2rpx;
+	}
+	
+	.content {
+		padding: 30rpx;
+	}
+	
+	.form-item {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		margin-bottom: 20rpx;
+	}
+	
+	.label {
+		font-size: 28rpx;
+		color: #333;
+	}
+	
+	.value {
+		font-size: 28rpx;
+		color: #999;
+	}
+	
+	.reason-section {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 20rpx;
+		margin-bottom: 40rpx;
+	}
+	
+	.section-title {
+		font-size: 28rpx;
+		color: #333;
+		margin-bottom: 15rpx;
+	}
+	
+	.reason-input {
+		width: 100%;
+		min-height: 120rpx;
+		font-size: 26rpx;
+		color: #333;
+		line-height: 1.5;
+	}
+	
+	.button-section {
+		display: flex;
+		flex-direction: column;
+		gap: 20rpx;
+	}
+	
+	.submit-btn {
+		background-color: #ffc107;
+		color: #333;
+		font-size: 30rpx;
+		font-weight: bold;
+		border-radius: 50rpx;
+		padding: 20rpx;
+		border: none;
+	}
+	
+	.return-btn {
+		background-color: #ffffff;
+		color: #333;
+		font-size: 30rpx;
+		border-radius: 50rpx;
+		padding: 20rpx;
+		border: 1rpx solid #d9d9d9;
+	}
+	
+	.record-empty {
+		text-align: center;
+		color: #999;
+		font-size: 28rpx;
+		margin-top: 100rpx;
+	}
+</style>

+ 83 - 75
pages/myEdit/setting.uvue

@@ -2,97 +2,105 @@
   <view class="setting-page">
     <view class="setting-list">
       <view class="setting-item" @click="goToAccountSecurity">
-        <text class="item-text">账号安全</text>
+        <text class="item-text">
+          账号安全
+        </text>
         <u-icon name="arrow-right" size="18" color="#999" />
       </view>
       <view class="setting-item" @click="goToFeedback">
-        <text class="item-text">意见反馈</text>
+        <text class="item-text">
+          意见反馈
+        </text>
         <u-icon name="arrow-right" size="18" color="#999" />
       </view>
       <view class="setting-item" @click="goToAbout">
-        <text class="item-text">关于我们</text>
+        <text class="item-text">
+          关于我们
+        </text>
         <u-icon name="arrow-right" size="18" color="#999" />
       </view>
     </view>
     <view class="logout-section">
-      <button class="logout-btn" @click="doLogout">退出登录</button>
+      <button class="logout-btn" @click="doLogout">
+        退出登录
+      </button>
     </view>
   </view>
 </template>
 
 <script setup lang="ts">
-const goToAccountSecurity = () => {
-  uni.navigateTo({
-    url: '/pages/myEdit/account-security'
-  })
-}
-const goToFeedback = () => {
-  uni.navigateTo({
-    url: '/pages/myEdit/feedback'
-  })
-}
-const goToAbout = () => {
-  uni.navigateTo({
-    url: '/pages/myEdit/about'
-  })
-}
-const doLogout = () => {
-  // 清除本地 token 或其他信息
-  uni.removeStorageSync('token');
-  uni.showToast({ title: '已退出登录', icon: 'success' });
-  setTimeout(() => {
-    uni.reLaunch({
-      url: '/pages/login/login'
-    })
-  }, 500)
-}
+  const goToAccountSecurity = () => {
+    uni.navigateTo({
+        url: '/pages/myEdit/account-security'
+      })
+  }
+  const goToFeedback = () => {
+    uni.navigateTo({
+        url: '/pages/myEdit/feedback'
+      })
+  }
+  const goToAbout = () => {
+    uni.navigateTo({
+        url: '/pages/myEdit/about'
+      })
+  }
+  const doLogout = () => {
+    // 清除本地 token 或其他信息
+    uni.removeStorageSync('token');
+    uni.showToast({ title: '已退出登录', icon: 'success' });
+    setTimeout(() => {
+        uni.reLaunch({
+            url: '/pages/login/login'
+          })
+      }, 500)
+  }
 </script>
 
 <style>
-.setting-page {
- 
-  background: #f7f8fa;
-  padding-top: 20rpx;
-  display: flex;
-  flex-direction: column;
-  justify-content: space-between;
-}
-.setting-list {
-  background: #fff;
-  border-radius: 20rpx;
-  margin: 24rpx 24rpx 0 24rpx;
-  box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.03);
-  overflow: hidden;
-}
-.setting-item {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  padding: 32rpx 24rpx;
-  border-bottom: 1rpx solid #f1f1f1;
-  font-size: 30rpx;
-  color: #222;
-  background: #fff;
-}
-.setting-item:last-child {
-  border-bottom: none;
-}
-.item-text {
-}
-.logout-section {
-  margin-top: auto;
-  margin-bottom: 60rpx;
-  padding: 0 24rpx;
-}
-.logout-btn {
-  width: 100%;
-  background: #ff4949;
-  color: #fff;
-  border-radius: 48rpx;
-  font-size: 32rpx;
-  padding: 26rpx 0;
-  border: none;
-  box-shadow: 0 4rpx 10rpx rgba(255,73,73,0.10);
-  font-weight: bold;
-}
+  .setting-page {
+
+    background: #f7f8fa;
+    padding-top: 20rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+  }
+  .setting-list {
+    background: #fff;
+    border-radius: 20rpx;
+    margin: 24rpx 24rpx 0 24rpx;
+    box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.03);
+    overflow: hidden;
+  }
+  .setting-item {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 32rpx 24rpx;
+    border-bottom: 1rpx solid #f1f1f1;
+    font-size: 30rpx;
+    color: #222;
+    background: #fff;
+  }
+  .setting-item:last-child {
+    border-bottom: none;
+  }
+  .item-text {
+  }
+  .logout-section {
+    margin-top: auto;
+    margin-bottom: 60rpx;
+    padding: 0 24rpx;
+  }
+  .logout-btn {
+    width: 100%;
+    color: #000;
+    border-radius: 40rpx;
+    font-size: 32rpx;
+    padding: 26rpx 0;
+    border: none;
+    box-shadow: 0 4rpx 10rpx rgba(186, 171, 171, 0.1);
+    font-weight: bold;
+    border: 1rpx solid #000;
+  }
 </style>

+ 117 - 0
pages/myEdit/sign.uvue

@@ -0,0 +1,117 @@
+<template>
+    <view class="page-container">
+        <!-- 头部 -->
+        <view class="header">
+            <view class="header-left" @click="goBack">
+                <u-icon name="arrow-left" size="24" color="#333"/>
+            </view>
+            <view class="header-title">
+                签约
+            </view>
+            <view class="header-right">
+            </view>
+        </view>
+
+        <!-- 内容区域 -->
+        <view class="content">
+            <!-- 合同列表 -->
+            <view class="contract-item">
+                <text class="contract-name">
+                    特别承诺书
+                </text>
+                <view class="contract-status signed">
+                    已签约
+                </view>
+                <u-icon name="arrow-right" size="16" color="#999"/>
+            </view>
+
+            <view class="contract-item">
+                <text class="contract-name">
+                    保密协议
+                </text>
+                <view class="contract-status signed">
+                    已签约
+                </view>
+                <u-icon name="arrow-right" size="16" color="#999"/>
+            </view>
+
+            <view class="contract-item">
+                <text class="contract-name">
+                    代理合作合同
+                </text>
+                <view class="contract-status unsigned">
+                    未上传
+                </view>
+                <u-icon name="arrow-right" size="16" color="#999"/>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script setup lang="ts">
+    const goBack = () => {
+        uni.navigateBack();
+    };
+</script>
+
+<style scoped>
+    .page-container {
+        background-color: #f5f5f5;
+        min-height: 100vh;
+    }
+
+    .header {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20rpx;
+        background-color: #ffffff;
+        border-bottom: 1rpx solid #f0f0f0;
+    }
+
+    .header-left, .header-right {
+        width: 60rpx;
+    }
+
+    .header-title {
+        font-size: 32rpx;
+        font-weight: bold;
+        color: #333;
+    }
+
+    .content {
+        padding: 30rpx;
+    }
+
+    .contract-item {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20rpx;
+        background-color: #ffffff;
+        border-radius: 16rpx;
+        margin-bottom: 20rpx;
+    }
+
+    .contract-name {
+        font-size: 28rpx;
+        color: #333;
+    }
+
+    .contract-status {
+        font-size: 24rpx;
+        padding: 4rpx 12rpx;
+        border-radius: 12rpx;
+        margin-right: 20rpx;
+    }
+
+    .contract-status.signed {
+        background-color: #e6f7ee;
+        color: #52c41a;
+    }
+
+    .contract-status.unsigned {
+        background-color: #fff2e8;
+        color: #fa8c16;
+    }
+</style>

+ 191 - 0
pages/myEdit/terminate.uvue

@@ -0,0 +1,191 @@
+<template>
+	<view class="page-container">
+		<!-- 头部 -->
+		<view class="header">
+			<view class="header-left" @click="goBack">
+				<u-icon name="arrow-left" size="24" color="#333"/>
+			</view>
+			<view class="header-title">
+				解约
+			</view>
+			<view class="header-right"></view>
+		</view>
+		
+		<!-- 内容区域 -->
+		<view class="content">
+			<!-- 解约月份 -->
+			<view class="form-item">
+				<text class="label">解约月份</text>
+				<view class="value">2014-10</view>
+				<u-icon name="arrow-right" size="16" color="#999"/>
+			</view>
+			
+			<!-- 解约日期 -->
+			<view class="form-item">
+				<text class="label">解约日期</text>
+				<view class="value">20号</view>
+				<u-icon name="arrow-right" size="16" color="#999"/>
+			</view>
+			
+			<!-- 申请原因 -->
+			<view class="reason-section">
+				<text class="section-title">申请原因</text>
+				<textarea class="reason-input" placeholder="请填写解约原因(100字以内)"></textarea>
+			</view>
+			
+			<!-- 温馨提示 -->
+			<view class="tips-section">
+				<text class="tips-title">温馨提示:</text>
+				<view class="tips-list">
+					<text class="tips-item">1、需至少提前15天进行申请。</text>
+					<text class="tips-item">2、固定时间为每月5号和20号。</text>
+					<text class="tips-item">3、申请通过后,需在15天后到公司行政处办理解约手续。</text>
+					<text class="tips-item">4、申请通过后,解约日期之后开始不能接单。</text>
+				</view>
+			</view>
+			
+			<!-- 提交按钮 -->
+			<view class="button-section">
+				<button class="submit-btn" @click="submitApplication">提交申请</button>
+				<button class="record-btn" @click="viewRecords">解约记录</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup lang="ts">
+	const goBack = () => {
+		uni.navigateBack();
+	};
+	
+	const submitApplication = () => {
+		uni.showToast({ title: '提交申请成功', icon: 'success' });
+	};
+	
+	const viewRecords = () => {
+		uni.showToast({ title: '查看解约记录', icon: 'none' });
+	};
+</script>
+
+<style scoped>
+	.page-container {
+		background-color: #f5f5f5;
+		min-height: 100vh;
+	}
+	
+	.header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+	
+	.header-left, .header-right {
+		width: 60rpx;
+	}
+	
+	.header-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #333;
+	}
+	
+	.content {
+		padding: 30rpx;
+	}
+	
+	.form-item {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		margin-bottom: 20rpx;
+	}
+	
+	.label {
+		font-size: 28rpx;
+		color: #333;
+	}
+	
+	.value {
+		font-size: 28rpx;
+		color: #666;
+	}
+	
+	.reason-section {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 20rpx;
+		margin-bottom: 30rpx;
+	}
+	
+	.section-title {
+		font-size: 28rpx;
+		color: #333;
+		margin-bottom: 15rpx;
+	}
+	
+	.reason-input {
+		width: 100%;
+		min-height: 120rpx;
+		font-size: 26rpx;
+		color: #333;
+		line-height: 1.5;
+	}
+	
+	.tips-section {
+		background-color: #ffffff;
+		border-radius: 16rpx;
+		padding: 20rpx;
+		margin-bottom: 40rpx;
+	}
+	
+	.tips-title {
+		font-size: 28rpx;
+		color: #ff6b35;
+		font-weight: bold;
+		margin-bottom: 15rpx;
+		display: block;
+	}
+	
+	.tips-list {
+		display: flex;
+		flex-direction: column;
+		gap: 10rpx;
+	}
+	
+	.tips-item {
+		font-size: 26rpx;
+		color: #666;
+		line-height: 1.4;
+	}
+	
+	.button-section {
+		display: flex;
+		flex-direction: column;
+		gap: 20rpx;
+	}
+	
+	.submit-btn {
+		background-color: #ffc107;
+		color: #333;
+		font-size: 30rpx;
+		font-weight: bold;
+		border-radius: 50rpx;
+		padding: 20rpx;
+		border: none;
+	}
+	
+	.record-btn {
+		background-color: transparent;
+		color: #666;
+		font-size: 28rpx;
+		border-radius: 50rpx;
+		padding: 20rpx;
+		border: none;
+	}
+</style>

+ 70 - 70
pages/order/order.uvue

@@ -4,13 +4,13 @@
 		<!-- 1. 顶部标签栏 (Scroll View) -->
 		<scroll-view direction="horizontal" class="tab-scroll" show-scrollbar="false" :enable-flex="true">
 			<view class="tab-wrapper">
-				<view v-for="(tab, index) in tabs" :key="tab.value"
-				:class="['tab-item', currentTab === tab.value ? 'active' : '']" @click="handleTabClick(tab.value)">
+				<view v-for="(tab, index) in tabs" :key="tab?.['index']" :class="['tab-item', currentTab == tab?.['value']
+					? 'active' : '' ]" @click="handleTabClick((tab?.['value']) as number)">
 					<text>
-						{{ tab.label }}
+						{{ tab?.["label"] }}
 					</text>
 					<!-- 激活下的黄色短线 -->
-					<view v-if="currentTab === tab.value" class="tab-indicator">
+					<view v-if="currentTab == tab?.[' value']" class="tab-indicator">
 					</view>
 				</view>
 			</view>
@@ -34,8 +34,8 @@
 					<!-- Card Body: 服务信息 (左图右文) -->
 					<view class="service-section" @click="orderDetail(item.id as number)">
 						<image
-						:src="(((((item.project as UTSJSONObject).cover_urls ) as UTSArray<UTSJSONObject>)[0]) as UTSJSONObject).medium_url"
-						class=" service-image" mode="aspectFill" />
+							:src="(((((item.project as UTSJSONObject).cover_urls ) as UTSArray<UTSJSONObject>)[0]) as UTSJSONObject).medium_url"
+							class=" service-image" mode="aspectFill" />
 						<view class="service-details">
 							<view class="service-title-row">
 								<text class="service-name">
@@ -84,7 +84,7 @@
 					<!-- Card Actions: 按钮组 -->
 					<view class="action-section" v-if="currentTab==1">
 						<view class="btn btn-nav"
-						@click.stop="onNavigate((item.address as UTSJSONObject)?.address as String) ">
+							@click.stop="onNavigate((item.address as UTSJSONObject)?.address as String) ">
 							<u-icon name="navigation" :size="18" />
 							<text style="font-size:28rpx">
 								地址导航
@@ -101,7 +101,7 @@
 					</view>
 					<view class="action-section" v-else="currentTab==2">
 						<view class="btn btn-nav"
-						@click.stop="onNavigate((item.address as UTSJSONObject)?.address as String) ">
+							@click.stop="onNavigate((item.address as UTSJSONObject)?.address as String) ">
 							<u-icon name="navigation" :size="18" />
 							<text style="font-size:28rpx">
 								地址导航
@@ -142,8 +142,8 @@
 			<text style="font-size: 30rpx;color: #999999;letter-spacing: 2rpx;text-align: center;font-weight: 600;">
 				暂无订单</text>
 
-				</view>
-			</view>
+		</view>
+	</view>
 </template>
 
 <script setup lang="ts">
@@ -152,27 +152,27 @@
 
 	// --- 数据 ---
 	const tabs = ref([
-			{
-				label: '新订单',
-				value: 1
-			},
-			{
-				label: '进行中',
-				value: 2
-			},
-			{
-				label: '取消/售后',
-				value: 5
-			},
-			{
-				label: '已完成',
-				value: 3
-			},
-			{
-				label: '全部',
-				value: 0
-			},
-		])
+		{
+			label: '新订单',
+			value: 1
+		},
+		{
+			label: '进行中',
+			value: 2
+		},
+		{
+			label: '取消/售后',
+			value: 5
+		},
+		{
+			label: '已完成',
+			value: 3
+		},
+		{
+			label: '全部',
+			value: 0
+		},
+	])
 	const currentTab = ref(1);
 
 	type OrderTag = {
@@ -208,7 +208,7 @@
 			0.48,
 			0.5,
 			0.55,
-		0.58];
+			0.58];
 
 		let maneyInfo = 0;
 		//是否是vip订单
@@ -254,10 +254,10 @@
 		loading.value = true;
 		try {
 			const response = await getOrderList({
-					type: currentTab.value,
-					page: pageNo.value,
-					per_page: pageSize.value
-				}) as UTSJSONObject;
+				type: currentTab.value,
+				page: pageNo.value,
+				per_page: pageSize.value
+			}) as UTSJSONObject;
 			const code = response["code"] as number;
 			if (code !== 200) return;
 
@@ -300,8 +300,8 @@
 		try {
 
 			const res = await acceptOrder({
-					order_id: orderId
-				}) as UTSJSONObject;
+				order_id: orderId
+			}) as UTSJSONObject;
 			// const code = response["code"] as number
 			uni.hideLoading();
 			if (res?.code === 200) {
@@ -310,77 +310,77 @@
 				await httpGetOrderList(false);
 			} else {
 				uni.showToast({
-						title: (res?.msg) as String ?? '接单失败',
-						icon: 'none'
-					});
+					title: (res?.msg) as String ?? '接单失败',
+					icon: 'none'
+				});
 			}
 		} catch (err) {
 			uni.hideLoading();
 			console.error('接单异常', err);
 			uni.showToast({
-					title: '接单失败,请重试',
-					icon: 'none'
-				});
+				title: '接单失败,请重试',
+				icon: 'none'
+			});
 		}
 	};
 	const onConfirm = (orderId : number) => {
 		uni.showModal({
-				title: '接单确认',
-				content: '确定要接受该订单吗?',
-				success: (res) => { onConfirmOrder(orderId) }
-			});
+			title: '接单确认',
+			content: '确定要接受该订单吗?',
+			success: (res) => { onConfirmOrder(orderId) }
+		});
 	};
 	// 商户转单
 	const httptransferOrder = async (orderId : number,) => {
 		try {
 			const res = await transferOrder({
-					order_id: orderId,
-				}) as UTSJSONObject;
+				order_id: orderId,
+			}) as UTSJSONObject;
 			if (res?.code === 200) {
 				uni.showToast({ title: '转单成功', icon: 'success' });
 				await httpGetOrderList(false);
 			} else {
 				uni.showToast({
-						title: (res?.msg) as String ?? '转单失败',
-						icon: 'none'
-					});
+					title: (res?.msg) as String ?? '转单失败',
+					icon: 'none'
+				});
 			}
 		} catch (err) {
 			console.error('转单异常', err);
 			uni.showToast({
-					title: '转单失败,请重试',
-					icon: 'none'
-				});
+				title: '转单失败,请重试',
+				icon: 'none'
+			});
 		}
 	};
 	const onTransfer = (id : number) => {
 		uni.showModal({
-				title: '转单确认',
-				content: '确定将此订单转给其他技师吗?',
-				success: (res) => {
-					httptransferOrder(id);
-				}
-			});
+			title: '转单确认',
+			content: '确定将此订单转给其他技师吗?',
+			success: (res) => {
+				httptransferOrder(id);
+			}
+		});
 
 	};
 	const orderDetail = (orderId : number) => {
 		uni.navigateTo({
-				url: `/pages/order/orderDetail?orderId=${orderId}`
-			});
+			url: `/pages/order/orderDetail?orderId=${orderId}`
+		});
 	};
 	const onNavigate = (addr : string) => {
 		uni.showToast({ title: '启动导航', icon: 'none' });
 		uni.navigateTo({
-				url: '/pages/map/map'
-			});
+			url: '/pages/map/map'
+		});
 	};
 
 	onLoad(() => {
-			// httpGetOrderList();
-		})
+		// httpGetOrderList();
+	})
 	onReady(() => {
-			httpGetOrderList(false);
-		})
+		httpGetOrderList(false);
+	})
 </script>
 
 <style scoped>

+ 1 - 0
static/icons/hollowquery.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1774835497949" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3605" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 160a352 352 0 1 0 0 704 352 352 0 0 0 0-704zM96 512c0-229.76 186.24-416 416-416s416 186.24 416 416-186.24 416-416 416S96 741.76 96 512z" fill="#000000" fill-opacity=".8" p-id="3606"></path><path d="M364.8 408.789333a147.2 147.2 0 1 1 179.2 143.701334v48.298666a32 32 0 0 1-64 0v-76.8a32 32 0 0 1 32-32 83.2 83.2 0 1 0-83.2-83.2 32 32 0 0 1-64 0zM512 773.589333a48 48 0 1 0 0-96 48 48 0 0 0 0 96z" fill="#000000" fill-opacity=".8" p-id="3607"></path></svg>

+ 1 - 0
static/icons/sync.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1774835250470" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8705" data-spm-anchor-id="a313x.collections_detail.0.i4.28eb3a81cLNXxo" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M168 504.2c1-43.7 10-86.1 26.9-126 17.3-41 42.1-77.7 73.7-109.4S337 212.3 378 195c42.4-17.9 87.4-27 133.9-27s91.5 9.1 133.8 27c40.9 17.3 77.7 42.1 109.3 73.8 9.9 9.9 19.2 20.4 27.8 31.4l-60.2 47c-5.3 4.1-3.5 12.5 3 14.1l175.7 43c5 1.2 9.9-2.6 9.9-7.7l0.8-180.9c0-6.7-7.7-10.5-12.9-6.3l-56.4 44.1C765.8 155.1 646.2 92 511.8 92 282.7 92 96.3 275.6 92 503.8c-0.1 4.5 3.5 8.2 8 8.2h60c4.4 0 7.9-3.5 8-7.8zM924 512h-60c-4.4 0-7.9 3.5-8 7.8-1 43.7-10 86.1-26.9 126-17.3 41-42.1 77.8-73.7 109.4S687 811.7 646 829c-42.4 17.9-87.4 27-133.9 27s-91.5-9.1-133.9-27c-40.9-17.3-77.7-42.1-109.3-73.8-9.9-9.9-19.2-20.4-27.8-31.4l60.2-47c5.3-4.1 3.5-12.5-3-14.1l-175.7-43c-5-1.2-9.9 2.6-9.9 7.7l-0.7 181c0 6.7 7.7 10.5 12.9 6.3l56.4-44.1C258.2 868.9 377.8 932 512.2 932c229.2 0 415.5-183.7 419.8-411.8 0.1-4.5-3.5-8.2-8-8.2z" p-id="8706" fill="#000000"></path></svg>

+ 1 - 1
static/icons/view_off.svg

@@ -1 +1 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1772242989680" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3513" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 800c-66.112 0-128.32-24.896-182.656-60.096l94.976-94.976A156.256 156.256 0 0 0 512 672c88.224 0 160-71.776 160-160a156.256 156.256 0 0 0-27.072-87.68l101.536-101.536C837.28 398.624 896 493.344 896 512c0 32-171.936 288-384 288m96-288a96 96 0 0 1-96 96c-14.784 0-28.64-3.616-41.088-9.664l127.424-127.424c6.048 12.448 9.664 26.304 9.664 41.088M128 512c0-32 171.936-288 384-288 66.112 0 128.32 24.896 182.656 60.096L277.536 701.216C186.72 625.376 128 530.656 128 512m664.064-234.816l91.328-91.328-45.248-45.248-97.632 97.632C673.472 192.704 595.456 160 512 160 265.248 160 64 443.008 64 512c0 39.392 65.728 148.416 167.936 234.816l-91.328 91.328 45.248 45.248 97.632-97.632C350.528 831.296 428.544 864 512 864c246.752 0 448-283.008 448-352 0-39.392-65.728-148.416-167.936-234.816" fill="#000000" p-id="3514"></path><path d="M512 352c-88.224 0-160 71.776-160 160 0 15.328 2.848 29.856 6.88 43.872l58.592-58.592a95.616 95.616 0 0 1 79.808-79.808l58.592-58.592A157.76 157.76 0 0 0 512 352" fill="#000000" p-id="3515"></path></svg>
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1774835351849" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2605" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M660.8 680.4c-10.1 0-20-5.2-25.5-14.4l-59.4-99.1c-8.4-14.1-3.9-32.3 10.2-40.8 14.1-8.4 32.3-3.8 40.8 10.2l59.4 99.1c8.4 14.1 3.9 32.3-10.2 40.8-4.8 2.9-10.1 4.2-15.3 4.2zM819.1 581.3c-7.6 0-15.2-2.9-21-8.7l-79.2-79.3c-11.6-11.6-11.6-30.4 0-42 11.6-11.6 30.4-11.6 42 0l79.2 79.3c11.6 11.6 11.6 30.4 0 42-5.8 5.9-13.4 8.7-21 8.7zM363.2 680.4c-5.2 0-10.5-1.3-15.3-4.2-14.1-8.4-18.6-26.7-10.2-40.8l59.4-99.1c8.4-14.1 26.7-18.7 40.8-10.2 14.1 8.4 18.6 26.7 10.2 40.8L388.7 666c-5.6 9.3-15.4 14.4-25.5 14.4zM204.9 581.3c-7.6 0-15.2-2.9-21-8.7-11.6-11.6-11.6-30.4 0-42l79.2-79.3c11.6-11.6 30.4-11.6 42 0 11.6 11.6 11.6 30.4 0 42l-79.2 79.3c-5.8 5.9-13.4 8.7-21 8.7z" p-id="2606"></path><path d="M521.6 561.5c-82.8 0-204.7-28.4-314.9-163.5-1.3-1.6-2.3-2.8-3-3.6-10.9-10.8-11.8-28.4-1.7-40.3 10.6-12.5 29.4-14.1 41.9-3.5 1.3 1.1 4.4 4.3 8.9 9.8 95.5 117.1 198.9 141.7 268.8 141.7 120.7 0 258.1-124.6 271.6-144.4 9.1-13.2 27.3-17.5 40.9-8.8 13.5 8.6 18.1 25.8 10 39.6-14.1 23.7-168.8 173-322.5 173z" p-id="2607"></path></svg>

+ 2 - 1
uni.css

@@ -24,4 +24,5 @@
 /* 水平间距 */
 /* 垂直间距 */
 /* 透明度 */
-/* 文章场景相关 *//*# sourceMappingURL=uni.css.map */
+/* 文章场景相关 */
+/*# sourceMappingURL=uni.css.map */

+ 9 - 1
uni.css.map

@@ -1 +1,9 @@
-{"version":3,"sources":["uni.css","uni.scss"],"names":[],"mappings":"AAAA,gBAAgB;ACAhB;;;;;;EAAA;AAQA;;;;EAAA;AAKA,SAAA;AAEA,WAAA;AAMA,WAAA;AAOA,SAAA;AAMA,SAAA;AAGA,SAAA;AAEA,SAAA;AAKA,SAAA;AAKA,kBAAA;AAIkC,wCAAA;AAElC,SAAA;AAKA,SAAA;AAKA,QAAA;AAGA,WAAA","file":"uni.css"}
+{
+    "version": 3,
+    "mappings": ";AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,cAAc;AAEd,kBAAkB;AAMlB,kBAAkB;AAOlB,cAAc;AAMd,cAAc;AAGd,cAAc;AAEd,cAAc;AAKd,cAAc;AAKd,mBAAmB;AAIe,yCAAyC;AAE3E,cAAc;AAKd,cAAc;AAKd,YAAY;AAGZ,kBAAkB",
+    "sources": [
+        "uni.scss"
+    ],
+    "names": [],
+    "file": "uni.css"
+}

+ 2 - 1
uni_modules/uni-list/components/uni-list-chat/uni-list-chat.css

@@ -3,4 +3,5 @@
  * 这里是 uni-list 组件内置的常用样式变量
  * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码
  *
- *//*# sourceMappingURL=uni-list-chat.css.map */
+ */
+/*# sourceMappingURL=uni-list-chat.css.map */

+ 9 - 1
uni_modules/uni-list/components/uni-list-chat/uni-list-chat.css.map

@@ -1 +1,9 @@
-{"version":3,"sources":["uni-list-chat.css","uni-list-chat.scss"],"names":[],"mappings":"AAAA,gBAAgB;ACAhB;;;;EAAA","file":"uni-list-chat.css"}
+{
+    "version": 3,
+    "mappings": ";AAAA;;;;GAIG",
+    "sources": [
+        "uni-list-chat.scss"
+    ],
+    "names": [],
+    "file": "uni-list-chat.css"
+}

+ 197 - 119
uni_modules/uni-scss/index.css

@@ -13,19 +13,19 @@
 }
 
 .uni-primary-disable {
-  color: rgb(143, 184.8691588785, 255);
+  color: #8fb9ff;
 }
 
 .uni-primary-disable-bg {
-  background-color: rgb(143, 184.8691588785, 255);
+  background-color: #8fb9ff;
 }
 
 .uni-primary-light {
-  color: rgb(168.5, 200.8364485981, 255);
+  color: #a9c9ff;
 }
 
 .uni-primary-light-bg {
-  background-color: rgb(168.5, 200.8364485981, 255);
+  background-color: #a9c9ff;
 }
 
 .uni-success {
@@ -37,19 +37,19 @@
 }
 
 .uni-success-disable {
-  color: rgb(81.1886792453, 232.8113207547, 109.8490566038);
+  color: #51e96e;
 }
 
 .uni-success-disable-bg {
-  background-color: rgb(81.1886792453, 232.8113207547, 109.8490566038);
+  background-color: #51e96e;
 }
 
 .uni-success-light {
-  color: rgb(103.8018867925, 235.6981132075, 128.733490566);
+  color: #68ec81;
 }
 
 .uni-success-light-bg {
-  background-color: rgb(103.8018867925, 235.6981132075, 128.733490566);
+  background-color: #68ec81;
 }
 
 .uni-warning {
@@ -69,11 +69,11 @@
 }
 
 .uni-warning-light {
-  color: rgb(250.5, 222, 183);
+  color: #fbdeb7;
 }
 
 .uni-warning-light-bg {
-  background-color: rgb(250.5, 222, 183);
+  background-color: #fbdeb7;
 }
 
 .uni-error {
@@ -85,19 +85,19 @@
 }
 
 .uni-error-disable {
-  color: rgb(239.9220779221, 146.6623376623, 141.0779220779);
+  color: #f0938d;
 }
 
 .uni-error-disable-bg {
-  background-color: rgb(239.9220779221, 146.6623376623, 141.0779220779);
+  background-color: #f0938d;
 }
 
 .uni-error-light {
-  color: rgb(242.9025974026, 168.0779220779, 163.5974025974);
+  color: #f3a8a4;
 }
 
 .uni-error-light-bg {
-  background-color: rgb(242.9025974026, 168.0779220779, 163.5974025974);
+  background-color: #f3a8a4;
 }
 
 .uni-info {
@@ -109,19 +109,19 @@
 }
 
 .uni-info-disable {
-  color: rgb(197.1421800948, 199.2085308057, 203.8578199052);
+  color: #c5c7cc;
 }
 
 .uni-info-disable-bg {
-  background-color: rgb(197.1421800948, 199.2085308057, 203.8578199052);
+  background-color: #c5c7cc;
 }
 
 .uni-info-light {
-  color: rgb(210.6777251185, 212.2606635071, 215.8222748815);
+  color: #d3d4d8;
 }
 
 .uni-info-light-bg {
-  background-color: rgb(210.6777251185, 212.2606635071, 215.8222748815);
+  background-color: #d3d4d8;
 }
 
 .uni-main-color {
@@ -221,15 +221,18 @@
 }
 
 .uni-shadow-sm {
-  box-shadow: 0 0 5px rgba(216, 216, 216, 0.5);
+  -webkit-box-shadow: 0 0 5px rgba(216, 216, 216, 0.5);
+          box-shadow: 0 0 5px rgba(216, 216, 216, 0.5);
 }
 
 .uni-shadow-base {
-  box-shadow: 0 1px 8px 1px rgba(165, 165, 165, 0.2);
+  -webkit-box-shadow: 0 1px 8px 1px rgba(165, 165, 165, 0.2);
+          box-shadow: 0 1px 8px 1px rgba(165, 165, 165, 0.2);
 }
 
 .uni-shadow-lg {
-  box-shadow: 0px 1px 10px 2px rgba(165, 164, 164, 0.5);
+  -webkit-box-shadow: 0px 1px 10px 2px rgba(165, 164, 164, 0.5);
+          box-shadow: 0px 1px 10px 2px rgba(165, 164, 164, 0.5);
 }
 
 .uni-mask {
@@ -2670,358 +2673,433 @@
   background-color: #F9F9F9;
   overflow: visible;
 }
+
 .uni-btn::after {
   border: none;
 }
+
 .uni-btn:not([type]), .uni-btn[type=default] {
   color: #999;
 }
+
 .uni-btn:not([type])[loading], .uni-btn[type=default][loading] {
   background: none;
 }
+
 .uni-btn:not([type])[loading]::before, .uni-btn[type=default][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn:not([type])[disabled], .uni-btn[type=default][disabled] {
-  color: rgb(214.2, 214.2, 214.2);
+  color: #d6d6d6;
 }
+
 .uni-btn:not([type])[disabled], .uni-btn:not([type])[disabled][loading], .uni-btn:not([type])[disabled]:active, .uni-btn[type=default][disabled], .uni-btn[type=default][disabled][loading], .uni-btn[type=default][disabled]:active {
-  color: rgb(214.2, 214.2, 214.2);
-  background-color: rgb(249.9, 249.9, 249.9);
-  border-color: rgb(239.7, 239.7, 239.7);
+  color: #d6d6d6;
+  background-color: #fafafa;
+  border-color: #f0f0f0;
 }
+
 .uni-btn:not([type])[plain], .uni-btn[type=default][plain] {
   color: #999;
   background: none;
   border-color: #F0F0F0;
 }
+
 .uni-btn:not([type])[plain]:not([hover-class]):active, .uni-btn[type=default][plain]:not([hover-class]):active {
   background: none;
   color: #cccccc;
-  border-color: rgb(229.5, 229.5, 229.5);
+  border-color: #e6e6e6;
   outline: none;
 }
+
 .uni-btn:not([type])[plain][disabled], .uni-btn:not([type])[plain][disabled][loading], .uni-btn:not([type])[plain][disabled]:active, .uni-btn[type=default][plain][disabled], .uni-btn[type=default][plain][disabled][loading], .uni-btn[type=default][plain][disabled]:active {
   background: none;
-  color: rgb(214.2, 214.2, 214.2);
-  border-color: rgb(239.7, 239.7, 239.7);
+  color: #d6d6d6;
+  border-color: #f0f0f0;
 }
+
 .uni-btn:not([hover-class]):active {
-  color: rgb(127.5, 127.5, 127.5);
+  color: gray;
 }
+
 .uni-btn[size=mini] {
   font-size: 16px;
   font-weight: 200;
   border-radius: 8px;
 }
+
 .uni-btn.uni-btn-small {
   font-size: 14px;
 }
+
 .uni-btn.uni-btn-mini {
   font-size: 12px;
 }
+
 .uni-btn.uni-btn-radius {
   border-radius: 999px;
 }
+
 .uni-btn[type=primary] {
   color: #fff;
   background-color: #2979ff;
-  border-color: rgb(37.72, 111.32, 234.6);
+  border-color: #266feb;
 }
+
 .uni-btn[type=primary]:not([hover-class]):active {
-  background: rgb(36.9, 108.9, 229.5);
-  border-color: rgb(32.8, 96.8, 204);
+  background: #256de6;
+  border-color: #2161cc;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=primary][loading] {
   color: #fff;
   background-color: #2979ff;
-  border-color: rgb(37.72, 111.32, 234.6);
+  border-color: #266feb;
 }
+
 .uni-btn[type=primary][loading]:not([hover-class]):active {
-  background: rgb(36.9, 108.9, 229.5);
-  border-color: rgb(32.8, 96.8, 204);
+  background: #256de6;
+  border-color: #2161cc;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=primary][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=primary][disabled], .uni-btn[type=primary][disabled][loading], .uni-btn[type=primary][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(127.5, 173.2943925234, 250);
+  border-color: #80adfa;
   background-color: #94bcff;
 }
+
 .uni-btn[type=primary][plain] {
   color: #2979ff;
-  background-color: rgb(233.6, 241.6, 255);
-  border-color: rgb(190.8, 214.8, 255);
+  background-color: #eaf2ff;
+  border-color: #bfd7ff;
 }
+
 .uni-btn[type=primary][plain]:not([hover-class]):active {
-  background: rgb(212.2, 228.2, 255);
+  background: #d4e4ff;
   color: #2979ff;
   outline: none;
   border-color: #94bcff;
 }
+
 .uni-btn[type=primary][plain][loading] {
   color: #2979ff;
-  background-color: rgb(233.6, 241.6, 255);
-  border-color: rgb(190.8, 214.8, 255);
+  background-color: #eaf2ff;
+  border-color: #bfd7ff;
 }
+
 .uni-btn[type=primary][plain][loading]:not([hover-class]):active {
-  background: rgb(212.2, 228.2, 255);
+  background: #d4e4ff;
   color: #2979ff;
   outline: none;
   border-color: #94bcff;
 }
+
 .uni-btn[type=primary][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=primary][plain][disabled], .uni-btn[type=primary][plain][disabled]:active {
-  color: rgb(126.6, 174.6, 255);
-  background-color: rgb(233.6, 241.6, 255);
-  border-color: rgb(212.2, 228.2, 255);
+  color: #7fafff;
+  background-color: #eaf2ff;
+  border-color: #d4e4ff;
 }
+
 .uni-btn[type=success] {
   color: #fff;
   background-color: #18bc37;
-  border-color: rgb(22.08, 172.96, 50.6);
+  border-color: #16ad33;
 }
+
 .uni-btn[type=success]:not([hover-class]):active {
-  background: rgb(21.6, 169.2, 49.5);
-  border-color: rgb(19.2, 150.4, 44);
+  background: #16a932;
+  border-color: #13962c;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=success][loading] {
   color: #fff;
   background-color: #18bc37;
-  border-color: rgb(22.08, 172.96, 50.6);
+  border-color: #16ad33;
 }
+
 .uni-btn[type=success][loading]:not([hover-class]):active {
-  background: rgb(21.6, 169.2, 49.5);
-  border-color: rgb(19.2, 150.4, 44);
+  background: #16a932;
+  border-color: #13962c;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=success][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=success][disabled], .uni-btn[type=success][disabled][loading], .uni-btn[type=success][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(136.6132075472, 198.8867924528, 148.3844339623);
-  background-color: rgb(139.5, 221.5, 155);
+  border-color: #89c794;
+  background-color: #8cde9b;
 }
+
 .uni-btn[type=success][plain] {
   color: #18bc37;
-  background-color: rgb(231.9, 248.3, 235);
-  border-color: rgb(185.7, 234.9, 195);
+  background-color: #e8f8eb;
+  border-color: #baebc3;
 }
+
 .uni-btn[type=success][plain]:not([hover-class]):active {
-  background: rgb(208.8, 241.6, 215);
+  background: #d1f2d7;
   color: #18bc37;
   outline: none;
-  border-color: rgb(139.5, 221.5, 155);
+  border-color: #8cde9b;
 }
+
 .uni-btn[type=success][plain][loading] {
   color: #18bc37;
-  background-color: rgb(231.9, 248.3, 235);
-  border-color: rgb(185.7, 234.9, 195);
+  background-color: #e8f8eb;
+  border-color: #baebc3;
 }
+
 .uni-btn[type=success][plain][loading]:not([hover-class]):active {
-  background: rgb(208.8, 241.6, 215);
+  background: #d1f2d7;
   color: #18bc37;
   outline: none;
-  border-color: rgb(139.5, 221.5, 155);
+  border-color: #8cde9b;
 }
+
 .uni-btn[type=success][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=success][plain][disabled], .uni-btn[type=success][plain][disabled]:active {
-  color: rgb(116.4, 214.8, 135);
-  background-color: rgb(231.9, 248.3, 235);
-  border-color: rgb(208.8, 241.6, 215);
+  color: #74d787;
+  background-color: #e8f8eb;
+  border-color: #d1f2d7;
 }
+
 .uni-btn[type=error] {
   color: #fff;
   background-color: #e43d33;
-  border-color: rgb(209.76, 56.12, 46.92);
+  border-color: #d2382f;
 }
+
 .uni-btn[type=error]:not([hover-class]):active {
-  background: rgb(205.2, 54.9, 45.9);
-  border-color: rgb(182.4, 48.8, 40.8);
+  background: #cd372e;
+  border-color: #b63129;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=error][loading] {
   color: #fff;
   background-color: #e43d33;
-  border-color: rgb(209.76, 56.12, 46.92);
+  border-color: #d2382f;
 }
+
 .uni-btn[type=error][loading]:not([hover-class]):active {
-  background: rgb(205.2, 54.9, 45.9);
-  border-color: rgb(182.4, 48.8, 40.8);
+  background: #cd372e;
+  border-color: #b63129;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=error][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=error][disabled], .uni-btn[type=error][disabled][loading], .uni-btn[type=error][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(228.1753246753, 145.7597402597, 140.8246753247);
-  background-color: rgb(241.5, 158, 153);
+  border-color: #e4928d;
+  background-color: #f29e99;
 }
+
 .uni-btn[type=error][plain] {
   color: #e43d33;
-  background-color: rgb(252.3, 235.6, 234.6);
-  border-color: rgb(246.9, 196.8, 193.8);
+  background-color: #fceceb;
+  border-color: #f7c5c2;
 }
+
 .uni-btn[type=error][plain]:not([hover-class]):active {
-  background: rgb(249.6, 216.2, 214.2);
+  background: #fad8d6;
   color: #e43d33;
   outline: none;
-  border-color: rgb(241.5, 158, 153);
+  border-color: #f29e99;
 }
+
 .uni-btn[type=error][plain][loading] {
   color: #e43d33;
-  background-color: rgb(252.3, 235.6, 234.6);
-  border-color: rgb(246.9, 196.8, 193.8);
+  background-color: #fceceb;
+  border-color: #f7c5c2;
 }
+
 .uni-btn[type=error][plain][loading]:not([hover-class]):active {
-  background: rgb(249.6, 216.2, 214.2);
+  background: #fad8d6;
   color: #e43d33;
   outline: none;
-  border-color: rgb(241.5, 158, 153);
+  border-color: #f29e99;
 }
+
 .uni-btn[type=error][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=error][plain][disabled], .uni-btn[type=error][plain][disabled]:active {
-  color: rgb(238.8, 138.6, 132.6);
-  background-color: rgb(252.3, 235.6, 234.6);
-  border-color: rgb(249.6, 216.2, 214.2);
+  color: #ef8b85;
+  background-color: #fceceb;
+  border-color: #fad8d6;
 }
+
 .uni-btn[type=warning] {
   color: #fff;
   background-color: #f3a73f;
-  border-color: rgb(223.56, 153.64, 57.96);
+  border-color: #e09a3a;
 }
+
 .uni-btn[type=warning]:not([hover-class]):active {
-  background: rgb(218.7, 150.3, 56.7);
-  border-color: rgb(194.4, 133.6, 50.4);
+  background: #db9639;
+  border-color: #c28632;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=warning][loading] {
   color: #fff;
   background-color: #f3a73f;
-  border-color: rgb(223.56, 153.64, 57.96);
+  border-color: #e09a3a;
 }
+
 .uni-btn[type=warning][loading]:not([hover-class]):active {
-  background: rgb(218.7, 150.3, 56.7);
-  border-color: rgb(194.4, 133.6, 50.4);
+  background: #db9639;
+  border-color: #c28632;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=warning][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=warning][disabled], .uni-btn[type=warning][disabled][loading], .uni-btn[type=warning][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(247.5, 200, 135);
+  border-color: #f8c887;
   background-color: #f9d39f;
 }
+
 .uni-btn[type=warning][plain] {
   color: #f3a73f;
-  background-color: rgb(253.8, 246.2, 235.8);
-  border-color: rgb(251.4, 228.6, 197.4);
+  background-color: #fef6ec;
+  border-color: #fbe5c5;
 }
+
 .uni-btn[type=warning][plain]:not([hover-class]):active {
-  background: rgb(252.6, 237.4, 216.6);
+  background: #fdedd9;
   color: #f3a73f;
   outline: none;
   border-color: #f9d39f;
 }
+
 .uni-btn[type=warning][plain][loading] {
   color: #f3a73f;
-  background-color: rgb(253.8, 246.2, 235.8);
-  border-color: rgb(251.4, 228.6, 197.4);
+  background-color: #fef6ec;
+  border-color: #fbe5c5;
 }
+
 .uni-btn[type=warning][plain][loading]:not([hover-class]):active {
-  background: rgb(252.6, 237.4, 216.6);
+  background: #fdedd9;
   color: #f3a73f;
   outline: none;
   border-color: #f9d39f;
 }
+
 .uni-btn[type=warning][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=warning][plain][disabled], .uni-btn[type=warning][plain][disabled]:active {
-  color: rgb(247.8, 202.2, 139.8);
-  background-color: rgb(253.8, 246.2, 235.8);
-  border-color: rgb(252.6, 237.4, 216.6);
+  color: #f8ca8c;
+  background-color: #fef6ec;
+  border-color: #fdedd9;
 }
+
 .uni-btn[type=info] {
   color: #fff;
   background-color: #8f939c;
-  border-color: rgb(131.56, 135.24, 143.52);
+  border-color: #848790;
 }
+
 .uni-btn[type=info]:not([hover-class]):active {
-  background: rgb(128.7, 132.3, 140.4);
-  border-color: rgb(114.4, 117.6, 124.8);
+  background: #81848c;
+  border-color: #72767d;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=info][loading] {
   color: #fff;
   background-color: #8f939c;
-  border-color: rgb(131.56, 135.24, 143.52);
+  border-color: #848790;
 }
+
 .uni-btn[type=info][loading]:not([hover-class]):active {
-  background: rgb(128.7, 132.3, 140.4);
-  border-color: rgb(114.4, 117.6, 124.8);
+  background: #81848c;
+  border-color: #72767d;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=info][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=info][disabled], .uni-btn[type=info][disabled][loading], .uni-btn[type=info][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(185.6800947867, 188.0308056872, 193.3199052133);
-  background-color: rgb(199, 201, 205.5);
+  border-color: #babcc1;
+  background-color: #c7c9ce;
 }
+
 .uni-btn[type=info][plain] {
   color: #8f939c;
-  background-color: rgb(243.8, 244.2, 245.1);
-  border-color: rgb(221.4, 222.6, 225.3);
+  background-color: #f4f4f5;
+  border-color: #dddfe1;
 }
+
 .uni-btn[type=info][plain]:not([hover-class]):active {
-  background: rgb(232.6, 233.4, 235.2);
+  background: #e9e9eb;
   color: #8f939c;
   outline: none;
-  border-color: rgb(199, 201, 205.5);
+  border-color: #c7c9ce;
 }
+
 .uni-btn[type=info][plain][loading] {
   color: #8f939c;
-  background-color: rgb(243.8, 244.2, 245.1);
-  border-color: rgb(221.4, 222.6, 225.3);
+  background-color: #f4f4f5;
+  border-color: #dddfe1;
 }
+
 .uni-btn[type=info][plain][loading]:not([hover-class]):active {
-  background: rgb(232.6, 233.4, 235.2);
+  background: #e9e9eb;
   color: #8f939c;
   outline: none;
-  border-color: rgb(199, 201, 205.5);
+  border-color: #c7c9ce;
 }
+
 .uni-btn[type=info][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=info][plain][disabled], .uni-btn[type=info][plain][disabled]:active {
-  color: rgb(187.8, 190.2, 195.6);
-  background-color: rgb(243.8, 244.2, 245.1);
-  border-color: rgb(232.6, 233.4, 235.2);
+  color: #bcbec4;
+  background-color: #f4f4f5;
+  border-color: #e9e9eb;
 }
 
-/* #endif *//*# sourceMappingURL=index.css.map */
+/* #endif */
+/*# sourceMappingURL=index.css.map */

File diff suppressed because it is too large
+ 0 - 0
uni_modules/uni-scss/index.css.map


+ 197 - 119
uni_modules/uni-scss/styles/index.css

@@ -13,19 +13,19 @@
 }
 
 .uni-primary-disable {
-  color: rgb(143, 184.8691588785, 255);
+  color: #8fb9ff;
 }
 
 .uni-primary-disable-bg {
-  background-color: rgb(143, 184.8691588785, 255);
+  background-color: #8fb9ff;
 }
 
 .uni-primary-light {
-  color: rgb(168.5, 200.8364485981, 255);
+  color: #a9c9ff;
 }
 
 .uni-primary-light-bg {
-  background-color: rgb(168.5, 200.8364485981, 255);
+  background-color: #a9c9ff;
 }
 
 .uni-success {
@@ -37,19 +37,19 @@
 }
 
 .uni-success-disable {
-  color: rgb(81.1886792453, 232.8113207547, 109.8490566038);
+  color: #51e96e;
 }
 
 .uni-success-disable-bg {
-  background-color: rgb(81.1886792453, 232.8113207547, 109.8490566038);
+  background-color: #51e96e;
 }
 
 .uni-success-light {
-  color: rgb(103.8018867925, 235.6981132075, 128.733490566);
+  color: #68ec81;
 }
 
 .uni-success-light-bg {
-  background-color: rgb(103.8018867925, 235.6981132075, 128.733490566);
+  background-color: #68ec81;
 }
 
 .uni-warning {
@@ -69,11 +69,11 @@
 }
 
 .uni-warning-light {
-  color: rgb(250.5, 222, 183);
+  color: #fbdeb7;
 }
 
 .uni-warning-light-bg {
-  background-color: rgb(250.5, 222, 183);
+  background-color: #fbdeb7;
 }
 
 .uni-error {
@@ -85,19 +85,19 @@
 }
 
 .uni-error-disable {
-  color: rgb(239.9220779221, 146.6623376623, 141.0779220779);
+  color: #f0938d;
 }
 
 .uni-error-disable-bg {
-  background-color: rgb(239.9220779221, 146.6623376623, 141.0779220779);
+  background-color: #f0938d;
 }
 
 .uni-error-light {
-  color: rgb(242.9025974026, 168.0779220779, 163.5974025974);
+  color: #f3a8a4;
 }
 
 .uni-error-light-bg {
-  background-color: rgb(242.9025974026, 168.0779220779, 163.5974025974);
+  background-color: #f3a8a4;
 }
 
 .uni-info {
@@ -109,19 +109,19 @@
 }
 
 .uni-info-disable {
-  color: rgb(197.1421800948, 199.2085308057, 203.8578199052);
+  color: #c5c7cc;
 }
 
 .uni-info-disable-bg {
-  background-color: rgb(197.1421800948, 199.2085308057, 203.8578199052);
+  background-color: #c5c7cc;
 }
 
 .uni-info-light {
-  color: rgb(210.6777251185, 212.2606635071, 215.8222748815);
+  color: #d3d4d8;
 }
 
 .uni-info-light-bg {
-  background-color: rgb(210.6777251185, 212.2606635071, 215.8222748815);
+  background-color: #d3d4d8;
 }
 
 .uni-main-color {
@@ -221,15 +221,18 @@
 }
 
 .uni-shadow-sm {
-  box-shadow: 0 0 5px rgba(216, 216, 216, 0.5);
+  -webkit-box-shadow: 0 0 5px rgba(216, 216, 216, 0.5);
+          box-shadow: 0 0 5px rgba(216, 216, 216, 0.5);
 }
 
 .uni-shadow-base {
-  box-shadow: 0 1px 8px 1px rgba(165, 165, 165, 0.2);
+  -webkit-box-shadow: 0 1px 8px 1px rgba(165, 165, 165, 0.2);
+          box-shadow: 0 1px 8px 1px rgba(165, 165, 165, 0.2);
 }
 
 .uni-shadow-lg {
-  box-shadow: 0px 1px 10px 2px rgba(165, 164, 164, 0.5);
+  -webkit-box-shadow: 0px 1px 10px 2px rgba(165, 164, 164, 0.5);
+          box-shadow: 0px 1px 10px 2px rgba(165, 164, 164, 0.5);
 }
 
 .uni-mask {
@@ -2670,358 +2673,433 @@
   background-color: #F9F9F9;
   overflow: visible;
 }
+
 .uni-btn::after {
   border: none;
 }
+
 .uni-btn:not([type]), .uni-btn[type=default] {
   color: #999;
 }
+
 .uni-btn:not([type])[loading], .uni-btn[type=default][loading] {
   background: none;
 }
+
 .uni-btn:not([type])[loading]::before, .uni-btn[type=default][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn:not([type])[disabled], .uni-btn[type=default][disabled] {
-  color: rgb(214.2, 214.2, 214.2);
+  color: #d6d6d6;
 }
+
 .uni-btn:not([type])[disabled], .uni-btn:not([type])[disabled][loading], .uni-btn:not([type])[disabled]:active, .uni-btn[type=default][disabled], .uni-btn[type=default][disabled][loading], .uni-btn[type=default][disabled]:active {
-  color: rgb(214.2, 214.2, 214.2);
-  background-color: rgb(249.9, 249.9, 249.9);
-  border-color: rgb(239.7, 239.7, 239.7);
+  color: #d6d6d6;
+  background-color: #fafafa;
+  border-color: #f0f0f0;
 }
+
 .uni-btn:not([type])[plain], .uni-btn[type=default][plain] {
   color: #999;
   background: none;
   border-color: #F0F0F0;
 }
+
 .uni-btn:not([type])[plain]:not([hover-class]):active, .uni-btn[type=default][plain]:not([hover-class]):active {
   background: none;
   color: #cccccc;
-  border-color: rgb(229.5, 229.5, 229.5);
+  border-color: #e6e6e6;
   outline: none;
 }
+
 .uni-btn:not([type])[plain][disabled], .uni-btn:not([type])[plain][disabled][loading], .uni-btn:not([type])[plain][disabled]:active, .uni-btn[type=default][plain][disabled], .uni-btn[type=default][plain][disabled][loading], .uni-btn[type=default][plain][disabled]:active {
   background: none;
-  color: rgb(214.2, 214.2, 214.2);
-  border-color: rgb(239.7, 239.7, 239.7);
+  color: #d6d6d6;
+  border-color: #f0f0f0;
 }
+
 .uni-btn:not([hover-class]):active {
-  color: rgb(127.5, 127.5, 127.5);
+  color: gray;
 }
+
 .uni-btn[size=mini] {
   font-size: 16px;
   font-weight: 200;
   border-radius: 8px;
 }
+
 .uni-btn.uni-btn-small {
   font-size: 14px;
 }
+
 .uni-btn.uni-btn-mini {
   font-size: 12px;
 }
+
 .uni-btn.uni-btn-radius {
   border-radius: 999px;
 }
+
 .uni-btn[type=primary] {
   color: #fff;
   background-color: #2979ff;
-  border-color: rgb(37.72, 111.32, 234.6);
+  border-color: #266feb;
 }
+
 .uni-btn[type=primary]:not([hover-class]):active {
-  background: rgb(36.9, 108.9, 229.5);
-  border-color: rgb(32.8, 96.8, 204);
+  background: #256de6;
+  border-color: #2161cc;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=primary][loading] {
   color: #fff;
   background-color: #2979ff;
-  border-color: rgb(37.72, 111.32, 234.6);
+  border-color: #266feb;
 }
+
 .uni-btn[type=primary][loading]:not([hover-class]):active {
-  background: rgb(36.9, 108.9, 229.5);
-  border-color: rgb(32.8, 96.8, 204);
+  background: #256de6;
+  border-color: #2161cc;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=primary][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=primary][disabled], .uni-btn[type=primary][disabled][loading], .uni-btn[type=primary][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(127.5, 173.2943925234, 250);
+  border-color: #80adfa;
   background-color: #94bcff;
 }
+
 .uni-btn[type=primary][plain] {
   color: #2979ff;
-  background-color: rgb(233.6, 241.6, 255);
-  border-color: rgb(190.8, 214.8, 255);
+  background-color: #eaf2ff;
+  border-color: #bfd7ff;
 }
+
 .uni-btn[type=primary][plain]:not([hover-class]):active {
-  background: rgb(212.2, 228.2, 255);
+  background: #d4e4ff;
   color: #2979ff;
   outline: none;
   border-color: #94bcff;
 }
+
 .uni-btn[type=primary][plain][loading] {
   color: #2979ff;
-  background-color: rgb(233.6, 241.6, 255);
-  border-color: rgb(190.8, 214.8, 255);
+  background-color: #eaf2ff;
+  border-color: #bfd7ff;
 }
+
 .uni-btn[type=primary][plain][loading]:not([hover-class]):active {
-  background: rgb(212.2, 228.2, 255);
+  background: #d4e4ff;
   color: #2979ff;
   outline: none;
   border-color: #94bcff;
 }
+
 .uni-btn[type=primary][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=primary][plain][disabled], .uni-btn[type=primary][plain][disabled]:active {
-  color: rgb(126.6, 174.6, 255);
-  background-color: rgb(233.6, 241.6, 255);
-  border-color: rgb(212.2, 228.2, 255);
+  color: #7fafff;
+  background-color: #eaf2ff;
+  border-color: #d4e4ff;
 }
+
 .uni-btn[type=success] {
   color: #fff;
   background-color: #18bc37;
-  border-color: rgb(22.08, 172.96, 50.6);
+  border-color: #16ad33;
 }
+
 .uni-btn[type=success]:not([hover-class]):active {
-  background: rgb(21.6, 169.2, 49.5);
-  border-color: rgb(19.2, 150.4, 44);
+  background: #16a932;
+  border-color: #13962c;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=success][loading] {
   color: #fff;
   background-color: #18bc37;
-  border-color: rgb(22.08, 172.96, 50.6);
+  border-color: #16ad33;
 }
+
 .uni-btn[type=success][loading]:not([hover-class]):active {
-  background: rgb(21.6, 169.2, 49.5);
-  border-color: rgb(19.2, 150.4, 44);
+  background: #16a932;
+  border-color: #13962c;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=success][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=success][disabled], .uni-btn[type=success][disabled][loading], .uni-btn[type=success][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(136.6132075472, 198.8867924528, 148.3844339623);
-  background-color: rgb(139.5, 221.5, 155);
+  border-color: #89c794;
+  background-color: #8cde9b;
 }
+
 .uni-btn[type=success][plain] {
   color: #18bc37;
-  background-color: rgb(231.9, 248.3, 235);
-  border-color: rgb(185.7, 234.9, 195);
+  background-color: #e8f8eb;
+  border-color: #baebc3;
 }
+
 .uni-btn[type=success][plain]:not([hover-class]):active {
-  background: rgb(208.8, 241.6, 215);
+  background: #d1f2d7;
   color: #18bc37;
   outline: none;
-  border-color: rgb(139.5, 221.5, 155);
+  border-color: #8cde9b;
 }
+
 .uni-btn[type=success][plain][loading] {
   color: #18bc37;
-  background-color: rgb(231.9, 248.3, 235);
-  border-color: rgb(185.7, 234.9, 195);
+  background-color: #e8f8eb;
+  border-color: #baebc3;
 }
+
 .uni-btn[type=success][plain][loading]:not([hover-class]):active {
-  background: rgb(208.8, 241.6, 215);
+  background: #d1f2d7;
   color: #18bc37;
   outline: none;
-  border-color: rgb(139.5, 221.5, 155);
+  border-color: #8cde9b;
 }
+
 .uni-btn[type=success][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=success][plain][disabled], .uni-btn[type=success][plain][disabled]:active {
-  color: rgb(116.4, 214.8, 135);
-  background-color: rgb(231.9, 248.3, 235);
-  border-color: rgb(208.8, 241.6, 215);
+  color: #74d787;
+  background-color: #e8f8eb;
+  border-color: #d1f2d7;
 }
+
 .uni-btn[type=error] {
   color: #fff;
   background-color: #e43d33;
-  border-color: rgb(209.76, 56.12, 46.92);
+  border-color: #d2382f;
 }
+
 .uni-btn[type=error]:not([hover-class]):active {
-  background: rgb(205.2, 54.9, 45.9);
-  border-color: rgb(182.4, 48.8, 40.8);
+  background: #cd372e;
+  border-color: #b63129;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=error][loading] {
   color: #fff;
   background-color: #e43d33;
-  border-color: rgb(209.76, 56.12, 46.92);
+  border-color: #d2382f;
 }
+
 .uni-btn[type=error][loading]:not([hover-class]):active {
-  background: rgb(205.2, 54.9, 45.9);
-  border-color: rgb(182.4, 48.8, 40.8);
+  background: #cd372e;
+  border-color: #b63129;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=error][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=error][disabled], .uni-btn[type=error][disabled][loading], .uni-btn[type=error][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(228.1753246753, 145.7597402597, 140.8246753247);
-  background-color: rgb(241.5, 158, 153);
+  border-color: #e4928d;
+  background-color: #f29e99;
 }
+
 .uni-btn[type=error][plain] {
   color: #e43d33;
-  background-color: rgb(252.3, 235.6, 234.6);
-  border-color: rgb(246.9, 196.8, 193.8);
+  background-color: #fceceb;
+  border-color: #f7c5c2;
 }
+
 .uni-btn[type=error][plain]:not([hover-class]):active {
-  background: rgb(249.6, 216.2, 214.2);
+  background: #fad8d6;
   color: #e43d33;
   outline: none;
-  border-color: rgb(241.5, 158, 153);
+  border-color: #f29e99;
 }
+
 .uni-btn[type=error][plain][loading] {
   color: #e43d33;
-  background-color: rgb(252.3, 235.6, 234.6);
-  border-color: rgb(246.9, 196.8, 193.8);
+  background-color: #fceceb;
+  border-color: #f7c5c2;
 }
+
 .uni-btn[type=error][plain][loading]:not([hover-class]):active {
-  background: rgb(249.6, 216.2, 214.2);
+  background: #fad8d6;
   color: #e43d33;
   outline: none;
-  border-color: rgb(241.5, 158, 153);
+  border-color: #f29e99;
 }
+
 .uni-btn[type=error][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=error][plain][disabled], .uni-btn[type=error][plain][disabled]:active {
-  color: rgb(238.8, 138.6, 132.6);
-  background-color: rgb(252.3, 235.6, 234.6);
-  border-color: rgb(249.6, 216.2, 214.2);
+  color: #ef8b85;
+  background-color: #fceceb;
+  border-color: #fad8d6;
 }
+
 .uni-btn[type=warning] {
   color: #fff;
   background-color: #f3a73f;
-  border-color: rgb(223.56, 153.64, 57.96);
+  border-color: #e09a3a;
 }
+
 .uni-btn[type=warning]:not([hover-class]):active {
-  background: rgb(218.7, 150.3, 56.7);
-  border-color: rgb(194.4, 133.6, 50.4);
+  background: #db9639;
+  border-color: #c28632;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=warning][loading] {
   color: #fff;
   background-color: #f3a73f;
-  border-color: rgb(223.56, 153.64, 57.96);
+  border-color: #e09a3a;
 }
+
 .uni-btn[type=warning][loading]:not([hover-class]):active {
-  background: rgb(218.7, 150.3, 56.7);
-  border-color: rgb(194.4, 133.6, 50.4);
+  background: #db9639;
+  border-color: #c28632;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=warning][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=warning][disabled], .uni-btn[type=warning][disabled][loading], .uni-btn[type=warning][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(247.5, 200, 135);
+  border-color: #f8c887;
   background-color: #f9d39f;
 }
+
 .uni-btn[type=warning][plain] {
   color: #f3a73f;
-  background-color: rgb(253.8, 246.2, 235.8);
-  border-color: rgb(251.4, 228.6, 197.4);
+  background-color: #fef6ec;
+  border-color: #fbe5c5;
 }
+
 .uni-btn[type=warning][plain]:not([hover-class]):active {
-  background: rgb(252.6, 237.4, 216.6);
+  background: #fdedd9;
   color: #f3a73f;
   outline: none;
   border-color: #f9d39f;
 }
+
 .uni-btn[type=warning][plain][loading] {
   color: #f3a73f;
-  background-color: rgb(253.8, 246.2, 235.8);
-  border-color: rgb(251.4, 228.6, 197.4);
+  background-color: #fef6ec;
+  border-color: #fbe5c5;
 }
+
 .uni-btn[type=warning][plain][loading]:not([hover-class]):active {
-  background: rgb(252.6, 237.4, 216.6);
+  background: #fdedd9;
   color: #f3a73f;
   outline: none;
   border-color: #f9d39f;
 }
+
 .uni-btn[type=warning][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=warning][plain][disabled], .uni-btn[type=warning][plain][disabled]:active {
-  color: rgb(247.8, 202.2, 139.8);
-  background-color: rgb(253.8, 246.2, 235.8);
-  border-color: rgb(252.6, 237.4, 216.6);
+  color: #f8ca8c;
+  background-color: #fef6ec;
+  border-color: #fdedd9;
 }
+
 .uni-btn[type=info] {
   color: #fff;
   background-color: #8f939c;
-  border-color: rgb(131.56, 135.24, 143.52);
+  border-color: #848790;
 }
+
 .uni-btn[type=info]:not([hover-class]):active {
-  background: rgb(128.7, 132.3, 140.4);
-  border-color: rgb(114.4, 117.6, 124.8);
+  background: #81848c;
+  border-color: #72767d;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=info][loading] {
   color: #fff;
   background-color: #8f939c;
-  border-color: rgb(131.56, 135.24, 143.52);
+  border-color: #848790;
 }
+
 .uni-btn[type=info][loading]:not([hover-class]):active {
-  background: rgb(128.7, 132.3, 140.4);
-  border-color: rgb(114.4, 117.6, 124.8);
+  background: #81848c;
+  border-color: #72767d;
   color: #fff;
   outline: none;
 }
+
 .uni-btn[type=info][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=info][disabled], .uni-btn[type=info][disabled][loading], .uni-btn[type=info][disabled]:not([hover-class]):active {
   color: #fff;
-  border-color: rgb(185.6800947867, 188.0308056872, 193.3199052133);
-  background-color: rgb(199, 201, 205.5);
+  border-color: #babcc1;
+  background-color: #c7c9ce;
 }
+
 .uni-btn[type=info][plain] {
   color: #8f939c;
-  background-color: rgb(243.8, 244.2, 245.1);
-  border-color: rgb(221.4, 222.6, 225.3);
+  background-color: #f4f4f5;
+  border-color: #dddfe1;
 }
+
 .uni-btn[type=info][plain]:not([hover-class]):active {
-  background: rgb(232.6, 233.4, 235.2);
+  background: #e9e9eb;
   color: #8f939c;
   outline: none;
-  border-color: rgb(199, 201, 205.5);
+  border-color: #c7c9ce;
 }
+
 .uni-btn[type=info][plain][loading] {
   color: #8f939c;
-  background-color: rgb(243.8, 244.2, 245.1);
-  border-color: rgb(221.4, 222.6, 225.3);
+  background-color: #f4f4f5;
+  border-color: #dddfe1;
 }
+
 .uni-btn[type=info][plain][loading]:not([hover-class]):active {
-  background: rgb(232.6, 233.4, 235.2);
+  background: #e9e9eb;
   color: #8f939c;
   outline: none;
-  border-color: rgb(199, 201, 205.5);
+  border-color: #c7c9ce;
 }
+
 .uni-btn[type=info][plain][loading]::before {
   margin-right: 5px;
 }
+
 .uni-btn[type=info][plain][disabled], .uni-btn[type=info][plain][disabled]:active {
-  color: rgb(187.8, 190.2, 195.6);
-  background-color: rgb(243.8, 244.2, 245.1);
-  border-color: rgb(232.6, 233.4, 235.2);
+  color: #bcbec4;
+  background-color: #f4f4f5;
+  border-color: #e9e9eb;
 }
 
-/* #endif *//*# sourceMappingURL=index.css.map */
+/* #endif */
+/*# sourceMappingURL=index.css.map */

File diff suppressed because it is too large
+ 0 - 0
uni_modules/uni-scss/styles/index.css.map


+ 1 - 1
uni_modules/uni-scss/styles/tools/functions.css

@@ -1 +1 @@
-/*# sourceMappingURL=functions.css.map */
+/* No CSS *//*# sourceMappingURL=functions.css.map */

+ 9 - 1
uni_modules/uni-scss/styles/tools/functions.css.map

@@ -1 +1,9 @@
-{"version":3,"sources":[],"names":[],"mappings":"","file":"functions.css"}
+{
+    "version": 3,
+    "mappings": "",
+    "sources": [
+        "functions.scss"
+    ],
+    "names": [],
+    "file": "functions.css"
+}

+ 1 - 1
uni_modules/uni-scss/theme.css

@@ -1 +1 @@
-/*# sourceMappingURL=theme.css.map */
+/* No CSS *//*# sourceMappingURL=theme.css.map */

+ 9 - 1
uni_modules/uni-scss/theme.css.map

@@ -1 +1,9 @@
-{"version":3,"sources":[],"names":[],"mappings":"","file":"theme.css"}
+{
+    "version": 3,
+    "mappings": "",
+    "sources": [
+        "theme.scss"
+    ],
+    "names": [],
+    "file": "theme.css"
+}

+ 2 - 1
uni_modules/uni-scss/variables.css

@@ -1,3 +1,4 @@
 @charset "UTF-8";
 /* 水平间距 */
-/* 水平间距 *//*# sourceMappingURL=variables.css.map */
+/* 水平间距 */
+/*# sourceMappingURL=variables.css.map */

+ 11 - 1
uni_modules/uni-scss/variables.css.map

@@ -1 +1,11 @@
-{"version":3,"sources":["variables.css","styles/setting/_variables.scss","variables.scss"],"names":[],"mappings":"AAAA,gBAAgB;ACsIhB,SAAA;ACpFA,SAAA","file":"variables.css"}
+{
+    "version": 3,
+    "mappings": ";ACsIA,cAAc;ADpFd,cAAc",
+    "sources": [
+        "variables.scss",
+        "styles/setting/_variables.scss",
+        "styles/tools/functions.scss"
+    ],
+    "names": [],
+    "file": "variables.css"
+}

+ 0 - 21
uni_modules/uview-plus/LICENSE

@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2024 https://uiadmin.net/uview-plus
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

+ 0 - 89
uni_modules/uview-plus/README.md

@@ -1,89 +0,0 @@
-<p align="center">
-    <img alt="logo" src="https://uiadmin.net/uview-plus/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
-</p>
-<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uview-plus 3.0</h3>
-<h3 align="center">多平台快速开发的UI框架</h3>
-
-[![stars](https://img.shields.io/github/stars/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus)
-[![forks](https://img.shields.io/github/forks/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus)
-[![issues](https://img.shields.io/github/issues/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus/issues)
-[![release](https://img.shields.io/github/v/release/ijry/uview-plus?style=flat-square)](https://gitee.com/jry/uview-plus/releases)
-[![license](https://img.shields.io/github/license/ijry/uview-plus?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)
-
-## 说明
-
-【文档有广告,不喜勿入谢谢】
-
-uview-plus,是uni-app全面兼容vue3/nvue/鸿蒙/uni-app-x(已经发布https://ext.dcloud.net.cn/plugin?name=uview-ultra)的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水。uview-plus是基于uView2.x移植的支持vue3的版本,感谢uView。
-
-## 版本
-
-### uview-plus v3 (uni-app版本)
-1. 保持选项式API,尽可能兼容原有uview2各种API,比如mixins,方便大家升级更容易;
-2. 新手友好,保持原汁原味js,二次开发方便,未使用typescript重写,但带有独立的类型申明包;
-
-### uview-ultra v4 (uni-app-x版本)
-1. 尽可能保持原有组件的API一致,方便大家升级;
-2. 使用uts + 组合式API架构级全新重构,但仍然保持源码的简易,不封装过于复杂,便于修改。
-
-## 可视化设计
-
-uview-plus现已推出免费可视化设计,可以方便的进行页面可视化设计,导出源码即可使用。极大提高前端页面开发效率;如产品经理设计师直接使用更可作为高保真高可用原型制作工具,让设计稿即代码,无需传统的设计稿开发还原步骤。
-
-<img src="https://s3.bmp.ovh/imgs/2024/11/24/fd58d00071e6e5df.png" width="900" height="auto" >
-<img src="https://s3.bmp.ovh/imgs/2024/11/24/8e85a519fe627fb1.png" width="900" height="auto" >
-
-
-## 文档
-[官方文档:https://uview-plus.jiangruyi.com](https://uview-plus.jiangruyi.com)
-[备用文档:https://uiadmin.net/uview-plus](https://uiadmin.net/uview-plus)
-
-
-## 预览
-
-您可以通过**微信**扫码,查看最佳的演示效果。
-<br>
-<br>
-
-|  H5     |   微信小程序    |    安卓    |   鸿蒙Next(已上架)   | 
-| --- | --- | --- | --- |
-| <img src="https://uview-plus.jiangruyi.com/common/h5_qrcode.png" width="160" height="160" />   |     <img src="https://uview-plus.jiangruyi.com/common/weixin_mini_qrcode.jpg" width="160" height="160" /> | <img src="https://uview-plus.jiangruyi.com/common/android_qrcode.png" width="160" height="160" /> |    <img src="https://uview-plus.jiangruyi.com/common/hos_qrcode.jpg" width="160" height="160" /> |
-<br>
-<img src="https://uview-plus.jiangruyi.com/common/hos.png">
-
-
-## 链接
-
-- [官方文档](https://uview-plus.jiangruyi.com)
-- [更新日志](https://uview-plus.jiangruyi.com/components/changelog.html)
-- [升级指南](https://uview-plus.jiangruyi.com/components/changeGuide.html)
-- [关于我们](https://uview-plus.jiangruyi.com/cooperation/about.html)
-
-
-## 关于PR
-
-> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uview-plus是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。
-> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢!
-
-## 安装
-
-#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?name=uview-plus](https://ext.dcloud.net.cn/plugin?name=uview-plus)
-
-请通过[官网安装文档](https://uview-plus.jiangruyi.com/components/install.html)了解更详细的内容
-
-## 快速上手
-
-请通过[快速上手](https://uview-plus.jiangruyi.com/components/quickstart.html)了解更详细的内容
-
-## 使用方法
-配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
-
-```html
-<template>
-	<u-button text="按钮"></u-button>
-</template>
-```
-
-## 版权信息
-uview-plus遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uview-plus应用到您的产品中。
-

+ 0 - 1797
uni_modules/uview-plus/changelog.md

@@ -1,1797 +0,0 @@
-## 3.7.27(2026-03-12)
-improvment: 优化up-form的错误提示message字段类型
-
-## 3.7.26(2026-03-09)
-add: up-select增加禁用功能
-
-## 3.7.25(2026-03-07)
-fix: 优化up-coupon规范化scss
-
-## 3.7.24(2026-03-06)
-fix: 修复up-table2 组件在小程序不显示单元格内容的问题
-
-## 3.7.23(2026-03-06)
-fix: up-cascader在开启auto-close时最后层级选择后未触发confirm
-
-## 3.7.22(2026-03-05)
-improvment: floatButton组件示例改为组合式API
-
-## 3.7.21(2026-03-05)
-feat: 新增禁用 iOS Safari 下拉刷新工具类、移除 H5 端图标复制限制、优化 u-copy 组件注释
-
-## 3.7.20(2026-02-26)
-improvement:box组件示例改为组合式API
-
-## 3.7.19(2026-02-25)
-improvement:agreement组件示例改为组合式API
-
-## 3.7.18(2026-02-24)
-improvement:barcode组件示例改为组合式API
-
-## 3.7.17(2026-02-11)
-fix: 修复steps组件current失效
-
-## 3.7.16(2026-02-09)
-improvment: choose组件示例改为组合式API
-
-## 3.7.14(2026-02-08)
-refactor: up-signature组件改用up-canvas组件
-
-## 3.7.13(2026-02-07)
-add: 新增up-canvas组件
-
-## 3.7.12(2026-02-07)
-improvment: 优化签名组件兼容性修复微信小程序支持
-
-## 3.7.11(2026-02-06)
-add: action-sheet组件新增nameKey和subnameKey属性
-
-## 3.7.10(2026-02-06)
-add: checkbox-group组件的change事件增加第二个返回参数为当前触发变化的checkbox组件name信息等
-
-## 3.7.9(2026-02-06)
-fix: 修复align-self属性值缺少d导致样式不生效的问题
-
-## 3.7.8(2026-02-05)
-improvment: 优化card组件示例
-
-## 3.7.7(2026-02-05)
-add: select组件新增closeSelect方法用于自定义控制关闭
-
-
-## 3.7.6(2026-02-04)
-add: picker组件示例onLoad后加载数据
-
-## 3.7.5(2026-02-03)
-add: up-slider组件新增垂直模式
-
-## 3.7.4(2026-02-03)
-add: box组件props优化及新增leftIcon/leftTitle/rightTopIcon/rightTopTitle/rightBottomIcon/rightBottomTitle参数
-
-## 3.7.3(2026-02-03)
-improvment: city-locate组件示例改为组合式API
-
-## 3.7.2(2026-02-02)
-improvment: color-picker组件示例改为组合式API
-
-## 3.7.1(2026-02-02)
-fix:修复qrcode缺失的preview定义emit
-
-## 3.7.0(2026-02-01)
-fix: 修复up-qrcode二维码在微信小程序报错
-
-## 3.6.134(2026-01-30)
-chore: dragsort可通过参数控制是否可震动
-
-## 3.6.132(2026-01-30)
-feat: dragsort支持自定义拖动句柄
-
-## 3.6.131(2026-01-29)
-fix: 优化dragdort组件
-
-## 3.6.130(2026-01-28)
-improvment: cropper组件示例改为组合式API
-
-## 3.6.129(2026-01-28)
-improvment: drag组件示例改为组合式API
-
-## 3.6.128(2026-01-27)
-improvment: tooltip组件示例改为组合式API
-
-## 3.6.127(2026-01-27)
-improvment: textarea组件示例改为组合式API
-
-## 3.6.126(2026-01-27)
-improvment: text组件示例改为组合式API
-
-## 3.6.125(2026-01-27)
-fix: 修复Cascader级联选择器设置默认值显示问题
-
-修复在传入默认值时多列只会显示第一列bug
-
-## 3.6.124(2026-01-27)
-improvment: tabs组件示例改为组合式API
-
-## 3.6.123(2026-01-27)
-improvment: swiper组件示例改为组合式API
-
-## 3.6.122(2026-01-26)
-fix: 🐛 修复u-input在change事件里无法获取value的异常情况 #950
-
-## 3.6.120(2026-01-26)
-improvment: 增加Cascader级联选择器的取消事件
-
-## 3.6.119(2026-01-26)
-improvment: skeleton组件示例改为组合式API
-
-## 3.6.118(2026-01-26)
-improvment: steps组件示例改为组合式API
-
-## 3.6.117(2026-01-24)
-improvment: subsection组就示例改为组合式API
-
-## 3.6.116(2026-01-24)
-improvment: 优化Cascader级联选择器右上角关闭图标的显示控制
-
-如果在级联文本过长或者类目过多时关闭图标会与类目文字重合,现在增加控制关闭图标的控制可以控制是否需要显示关闭图标,底部有取消按钮,关闭图标不是必须的
-
-## 3.6.115(2026-01-23)
-improvment: scroll-list组就示例改为组合式API
-
-## 3.6.114(2026-01-23)
-improvment: readmore组就示例改为组合式API
-
-## 3.6.113(2026-01-23)
-improvment: popover组就示例改为组合式API
-
-## 3.6.112(2026-01-23)
-improvment: picker组件示例改为组合式API
-
-## 3.6.111(2026-01-23)
-improvment: no-network组件示例改为组合式API
-
-## 3.6.110(2026-01-22)
-improvment: navbar组件示例改为组合式API
-
-## 3.6.109(2026-01-22)
-improvment: modal组件示例改为组合式API
-
-## 3.6.108(2026-01-22)
-improvment: loadmore组件示例改为组合式API
-
-## 3.6.107(2026-01-21)
-improvment: list组件示例改为组合式API
-
-## 3.6.106(2026-01-21)
-improvment: index-list2组件示例改为组合式API
-
-## 3.6.105(2026-01-21)
-improvment: index-list组件示例改为组合式API
-
-## 3.6.104(2026-01-21)
-improvment: layout组件示例改为组合式API
-
-## 3.6.103(2026-01-21)
-improvment: input组件示例改为组合式API
-
-## 3.6.102(2026-01-20)
-fix: 修复cascader缺少emits申明
-
-## 3.6.101(2026-01-20)
-improvment: form组件示例改为组合式API
-
-## 3.6.100(2026-01-20)
-improvment: datetimepicker组件示例改为组合式API
-
-## 3.6.99(2026-01-20)
-fix: 修复cate-tab组件设置默认current不生效
-
-## 3.6.98(2026-01-20)
-improvment: code-input组件示例改为组合式API
-
-## 3.6.97(2026-01-20)
-improvment: calendar组件示例改为组合式API
-
-## 3.6.96(2026-01-20)
-improvment: avatar组件示例改为组合式API
-
-## 3.6.95(2026-01-20)
-improvment: album组件示例改为组合式API
-
-## 3.6.94(2026-01-19)
-improvment: waterfall组件示例改为组合式API
-
-## 3.6.93(2026-01-19)
-improvment: upload组件示例改为组合式API
-
-## 3.6.92(2026-01-17)
-improvment: toast组件示例改为组合式API
-
-## 3.6.91(2026-01-16)
-improvment: tag组件示例改为组合式API
-
-## 3.6.90(2026-01-16)
-improvment: table2组件示例改为组合式API
-
-## 3.6.89(2026-01-16)
-add: 增加鸿蒙Next已上架二维码
-
-## 3.6.88(2026-01-16)
-improvment: table组件示例改为组合式API
-
-## 3.6.87(2026-01-15)
-tabbar2组件示例改为组合式API
-## 3.6.86(2026-01-15)
-improvment: tabbar组件示例改为组合式API
-## 3.6.85(2026-01-15)
-improvment: switch组件示例改为组合式API
-
-## 3.6.84(2026-01-15)
-improvment: slider组件示例改为组合式API
-
-## 3.6.83(2026-01-15)
-improvment: search组件示例改为组合式API
-
-## 3.6.82(2026-01-15)
-improvment: progress组件示例改为组合式API
-
-## 3.6.81(2026-01-15)
-improvment: parse组件示例改为组合式API
-
-
-## 3.6.80(2026-01-15)
-improvment: number-box组件示例改为组合式API
-
-## 3.6.78(2026-01-15)
-improvment: notify组件示例改为组合式API
-
-## 3.6.77(2026-01-15)
-improvment: notice-bar组件示例改为组合式API
-
-## 3.6.76(2026-01-15)
- improvment: keyborad组件示例改为组合式API
-
-## 3.6.75(2026-01-15)
-improvment: dropdown组件示例改为组合式API
-
-## 3.6.74(2026-01-15)
-fix: 修复parse组件props缺少)
-
-## 3.6.73(2026-01-15)
-improvment: count-to组件示例改为组合式API
-
-## 3.6.72(2026-01-15)
-improvment: count-down组件示例改为组合式API
-
-## 3.6.71(2026-01-14)
-improvment: collapse组件示例改为组合式API
-
-## 3.6.70(2026-01-14)
-improvment: code组件示例改为组合式API
-
-## 3.6.69(2026-01-14)
-improvment: card组件示例改为组合式API
-
-## 3.6.68(2026-01-13)
-fix: 修复list组件在支付宝小程序下scrolltolower无法触发 #422
-## 3.6.67(2026-01-13)
-fix: 删除经典下拉框的打印
-
-## 3.6.66(2026-01-12)
-fix: 修正 RadioSlots 类型定义
-
-## 3.6.65(2026-01-12)
-fix: 修复u-picker在hasInput下回显异常和vue报错
-
-## 3.6.64(2026-01-12)
-fix: 解决cropper在ios小程序中底部操作栏被遮挡的问题
-
-## 3.6.63(2026-01-10)
-improvment: badge组建示例改为组合式API
-
-## 3.6.62(2026-01-10)
-improvment: alert组件示例改为组合式API
-
-## 3.6.61(2026-01-09)
-improvment: action-sheet组件示例改为组合式API
-
-## 3.6.60(2026-01-09)
-improvment: transition组件示例改为组合式API
-
-## 3.6.59(2026-01-09)
-improvment: swipe-action组件示例改为组合式API
-
-## 3.6.58(2026-01-09)
-improvment: sticky组件示例改为组合式API
-
-## 3.6.57(2026-01-08)
-improvment: 优化完善no-nerwork组件细节
-
-## 3.6.56(2026-01-08)
-fix: 修复signature的t方法
-
-## 3.6.55(2026-01-08)
-perf:补充多处TS声明提示信息 #953
-
-## 3.6.54(2026-01-08)
-fix: 修复slider示例页面变量重复
-## 3.6.53(2026-01-08)
-fix: 修复qrcode组件鸿蒙兼容
-
-## 3.6.52(2026-01-08)
-fix: nvue下采用webview支持二维码显示logo(因为gcanvas不支持图片渲染)
-
-## 3.6.51(2026-01-08)
-fix: 修复qrcode组件在App不显示logo
-
-improvment: qrcode逻辑优化封装
-
-## 3.6.50(2026-01-06)
-improvment: rate组件示例改为组合式API
-
-## 3.6.49(2026-01-06)
-improvment: radio组件示例改为组合式API
-
-## 3.6.48(2026-01-06)
-improvment: popup组件示例改为组合式API
-
-## 3.6.47(2026-01-06)
-improvment: overlay示例改为组合式API
-
-## 3.6.46(2026-01-05)
-improvment: loading-page组建示例改为组合式API
-
-## 3.6.45(2026-01-05)
-improvment: loading-icon组件示例改为组合式API
-
-## 3.6.44(2026-01-05)
-improvment: link组件示例改为组合式API
-
-## 3.6.43(2026-01-05)
-improvment: line组件示例改为组合式API
-
-## 3.6.42(2026-01-04)
-improvment: layzload组件示例改为组合式API
-
-## 3.6.41(2026-01-04)
-fix: 修复select组件缺少mixin
-
-## 3.6.40(2026-01-04)
-improvment: 去除ReadmeQQ群链接
-
-## 3.6.39(2026-01-04)
-improvment: image组件示例改为组合式API
-
-## 3.6.38(2026-01-03)
-improvment:  icon示例改为组合式API
-
-## 3.6.37(2025-12-31)
-improvment: 静态资源修复
-
-## 3.6.36(2025-12-30)
-improvment: grid示例改为组合式API
-
-## 3.6.35(2025-12-25)
-fix: 修复grid布局由于内容溢出导致形变
-
-## 3.6.34(2025-12-24)
-fix: modal组件asyncCloseTip多语言key未对应
-
-## 3.6.33(2025-12-23)
-fix: 提升$parent方法兼容性修复表单验证失效
-
-## 3.6.32(2025-12-21)
-improvment: 优化slider、search、steps等组件细节
-
-## 3.6.31(2025-12-19)
-improvment: 优化search组件等
-
-## 3.6.30(2025-12-19)
-improvment:  优化完善部分文件注释
-
-## 3.6.29(2025-12-18)
-fix: 修复语法错
-## 3.6.28(2025-12-18)
-fix: 优化$parent方法兼容性
-
-## 3.6.27(2025-12-17)
-add: datetimepicker增加maskClass和maskStyle属性
-
-## 3.6.26(2025-12-16)
-add: picker增加maskClass/maskStyle属性
-
-## 3.6.25(2025-12-15)
-fix: 修复cascader对列表数据层级差异的兼容问题
-
-## 3.6.24(2025-12-14)
-fix: 修复将empty组件的mode设置为wifi后图标不能显示的问题 #928
-
-## 3.6.23(2025-12-13)
-fix: 修复cascader已选中三级菜单后再选择二级菜单时tabs报错问题
-
-## 3.6.22(2025-12-12)
-fix: dragsort组件拖动抖动的问题
-
-## 3.6.21(2025-12-09)
- fix: form-item初始化时机优化
-
-## 3.6.20(2025-12-08)
-improvment: 优化form组件语法普适性
-
-## 3.6.19(2025-12-01)
-fix: 修复商品SKU组件i18n
-
-fix: Choose组件会有width警告提示 #915
-
-## 3.6.18(2025-11-30)
-feature: upload组件file模式支持微信小程序chooseMessageFile的extension属性 #913
-
-## 3.6.17(2025-11-18)
-add: picker-data支持表单验证
-
-## 3.6.16(2025-11-18)
-improvment: 优化下拉菜单示例
-
-## 3.6.15(2025-11-10)
-fix: 修复tabs添加activeStyle切换后滑块无法居中
-
-## 3.6.14(2025-11-07)
-fix: 修复引用拼写
-
-## 3.6.13(2025-11-06)
-improvment: 组合式API升级之gap示例改造
-
-## 3.6.12(2025-11-05)
-improvment: empty示例改为组合式API
-
-## 3.6.11(2025-11-05)
-improvment: divider示例改为组合式API
-
-## 3.6.10(2025-11-04)
-improvment: checkbox示例改为组合式API
-
-## 3.6.9(2025-10-21)
-improvment: cell示例改为组合式API
-
-## 3.6.8(2025-10-20)
-imporvment: button示例改为组合式API
-
-## 3.6.7(2025-10-17)
-fix: 优化picker当前列判断
-
-## 3.6.6(2025-10-13)
-fix: 修复getWindowInfo微信小程序下报警告
-
-## 3.6.5(2025-10-11)
-🐛fix: 修复picker双向绑定 #753
-
-## 3.6.4(2025-10-09)
-🐛fix: import rpx2px function and add to exports in index.js
-
-## 3.6.3(2025-10-09)
-fix: 修复getWindowInfo微信小程序下报警告
-
-## 3.6.2(2025-10-05)
-fix: 修复picker双向绑定 #753
-
-## 3.6.1(2025-10-01)
-fix: 修复poster海报组件微信小程序图片绘制失败
-
-## 3.6.0(2025-09-30)
-fix: 修复parse事件报错及统一事件名称小写
-
-## 3.5.57(2025-09-30)
-improvment: 更换部分资源域名提升访问速度
-
-## 3.5.56(2025-09-29)
-fix: 修复picker和datetime-picker在部分原生渲染时hasInput触发键盘弹起
-
-## 3.5.55(2025-09-29)
-feat: waterfall新增after-add-one和after-add-all事件
-
-## 3.5.54(2025-09-25)
-🐞 fix: 解决索引列表初始化时获取不到高度导致的字母列表异常
-
-## 3.5.53(2025-09-19)
-improvment: back-top示例组合式API改造
-
-## 3.5.52(2025-09-19)
-fix: 优化tabbar的borderColor优先级
-
-## 3.5.51(2025-09-19)
-fix: 微信小程序下u-transition包裹的内容因为没有默认flex column而出现布局错误
-
-## 3.5.50(2025-09-18)
-fix: 修复tabbar组件borderColor类型
-
-## 3.5.49(2025-09-18)
-fix: 修复action-sheet列表中第一个item的hover style
-
-## 3.5.48(2025-09-17)
-fix: 修复table2的fixedHeader参数生效
-
-## 3.5.47(2025-09-16)
-fix: 修复modelValue类型
-
-## 3.5.46(2025-09-15)
-feat: table2新增支持span-method合并单元格
-
-## 3.5.45(2025-09-13)
-fix: 修复数据分配时未等待获取元素后再执行下一次循环导致数据插入错误,addTime属性未使用修改。
-
-## 3.5.44(2025-09-12)
-fix: 单选快捷组件作为受控组件,当modelValue清除选择时,组件状态未被清除。
-
-## 3.5.43(2025-09-10)
-fix: 增加subsection兼容性索引转为数字
-
-## 3.5.42(2025-09-09)
-feat: index-list增加下边距高度
-
-## 3.5.41(2025-09-08)
-fix: 修复cascader方法引用位置
-
-## 3.5.40(2025-09-08)
-feat: goods-sku组件支持多语言
-
-## 3.5.39(2025-09-07)
-fix: 修复cascader多语言问题
-
-## 3.5.38(2025-09-07)
-improvment: 完善演示图标
-
-## 3.5.37(2025-09-05)
-feat: cascader支持多语言
-
-## 3.5.36(2025-09-04)
-improvment: 补充图标
-
-## 3.5.35(2025-09-04)
-feat: cascader级联组件增加垂直头部与单列选项支持
-
-## 3.5.34(2025-09-03)
-improvement: 优化steps-item
-
-## 3.5.33(2025-09-02)
-升级uni-app至最新版
-## 3.5.32(2025-09-01)
-feat: cate-tab支持非联动跟随的单一切换模式
-
-feat: choose组件示例使用cate-tab的单一切换模式
-
-
-## 3.5.31(2025-09-01)
-feat: 新增choose通用选项选择器组件
-
-## 3.5.30(2025-08-31)
-fix: 修复缺失cascader级联选择器
-
-## 3.5.29(2025-08-30)
-feat: 新增cascader级联选择器
-
-## 3.5.28(2025-08-29)
-feat: 多语言增加泰语
-
-## 3.5.27(2025-08-29)
-feat: 新增基于tooltip的popover组件
-
-## 3.5.26(2025-08-29)
-improvment: 增强多语言兼容性
-
-## 3.5.25(2025-08-28)
-fix: 修复左侧与右侧弹出时页面打开闪现问题
-
-## 3.5.24(2025-08-28)
-feat: 优化tooltip弹窗定位
-
-feat: tooltip组件新增forcePosition支持强制精确定位
-
-## 3.5.23(2025-08-28)
-improvment: 调整pdf阅读器默认高度
-
-## 3.5.22(2025-08-28)
-feat: 新增goods-sku商品SKU选购组件
-
-## 3.5.21(2025-08-27)
-fix: 修复popup组件手势控制参数注释
-
-## 3.5.20(2025-08-27)
-improvement: 提升checkbox条件编译兼容性
-
-## 3.5.19(2025-08-27)
-feat: popup新增iOS风格手势控制上下高度及下滑关闭
-
-## 3.5.18(2025-08-26)
-feat: 新增coupon优惠券组件
-
-## 3.5.17(2025-08-26)
-fix: 分支合并冲突修复
-
-feat: picker-data组件新增cancel/close/confirm事件支持
-
-## 3.5.16(2025-08-26)
-feat: tabbar新增支持中间凸起按钮
-
-## 3.5.15(2025-08-25)
-feat: 之前的color-picker颜色选择器按计划上线
-
-## 3.5.14(2025-08-25)
-feat: 新增PDF阅读器组件
-
-## 3.5.13(2025-08-24)
-fix: 修复短视频示例https
-
-## 3.5.12(2025-08-23)
-feat: short-video短视频组件增加视频播放示例
-
-## 3.5.11(2025-08-23)
-feat: 新增short-video短视频切换组件
-
-feat: tabbar支持backgroundColor和borderColor属性
-
-feat: slider支持innerStyle样式属性
-
-## 3.5.10(2025-08-22)
-feat: 新增poster海报生成组件
-
-
-## 3.5.9(2025-08-22)
-feat: 优化qrcode组件支持toTempFilePath方法
-
-## 3.5.8(2025-08-22)
-fix: 优化rpx下calendar高度计算强制px
-
-## 3.5.7(2025-08-22)
-feat: input和search新增onlyClearableOnFocused参数支持控制是否仅聚焦时显示清除按钮
-
-## 3.5.6(2025-08-21)
-feat: picker弹窗及datetime-picker组件支持页面内模式
-
-## 3.5.5(2025-08-21)
-feat: popup弹窗及canlendar组件支持页面内插入无弹窗模式
-
-## 3.5.4(2025-08-21)
-feat: popup弹窗及canlendar组件支持页面内插入无弹窗模式
-
-## 3.5.3(2025-08-21)
-fix: 修复下拉刷新多语言key
-
-## 3.5.2(2025-08-20)
-fix: 修复非cli模式下引入的三方库报An error occurred while trying to read the map file错误
-
-fix: 去除i18n多语言多余console
-
-## 3.5.1(2025-08-20)
-feat: calendar组件月份标题自动适配多语言
-
-## 3.5.0(2025-08-20)
-feat: 组件库新增多语言支持且无侵入无依赖内置八种语言
-
-## 3.4.107(2025-08-20)
-feat: input组件支持密码显示切换
-
-## 3.4.106(2025-08-20)
-feat: tooltip组件支持左右方向弹窗
-
-## 3.4.105(2025-08-19)
-feat: 增加markdown解析器组件AI对话流式响应示例
-
-## 3.4.104(2025-08-19)
-feat: tooltip支持自定义触发器
-
-feat: tooltip支持插槽自定义内容
-
-feat: tooltip支持单击触发
-
-feat: tooltip支持设置弹窗背景色
-
-## 3.4.103(2025-08-19)
-feat: 内置一份dayjs库
-
-fix: 删除个别组件多余重复方法
-
-fix: 修复marked库App打包时报错
-
-## 3.4.102(2025-08-19)
-fix: 小程序下cate-tab动态加载数据后尺寸获取及联动异常
-
-## 3.4.101(2025-08-18)
-improvment: 增加一些涉及触摸组件PC端需要仿真模式提示
-
-## 3.4.100(2025-08-18)
-feat: 新增markdown解析器组件
-
-## 3.4.99(2025-08-18)
-fix: 修复parse富文本组件可能导致无限循环的问题
-
-## 3.4.98(2025-08-17)
-feat: alert组件新增transitionMode/icon/duration/modelValue等参数
-
-improvment:  完善alert组件注释
-
-## 3.4.97(2025-08-16)
-improvment: 完善album组件注释
-
-## 3.4.96(2025-08-16)
-improvment: 完善action-sheet注释
-
-## 3.4.95(2025-08-16)
-del: 去除不再需要的重复组件
-
-## 3.4.94(2025-08-15)
-improvment: 组件库内部icon前缀统一
-
-## 3.4.93(2025-08-15)
-fix: 修复dropdown组件在打开下拉菜单时content高度为NANpx的问题
-
-## 3.4.92(2025-08-14)
-fix: 修复多余空格导致cropper编译出错 #830
-
-## 3.4.91(2025-08-14)
-feat: 新增agreement弹窗协议组件
-
-## 3.4.90(2025-08-13)
-feat: datetimepicker新增datehour类型
-
-## 3.4.89(2025-08-13)
-fix: 修复u-form-item组件缺少对labelPosition的判断
-
-## 3.4.88(2025-08-13)
-fix: subsection组件的disabled属性应为Boolean类型
-
-## 3.4.87(2025-08-12)
-improvment: 签名组件示例前缀改为up
-
-## 3.4.86(2025-08-12)
-feat: 新增signature签名签字组件
-
-## 3.4.85(2025-08-11)
-feat: 完善图片裁剪功能支持props及JS两种方式
-
-fix: 修复H5下裁剪后图片黑屏
-
-## 3.4.84(2025-08-11)
-feat: 新增cropper图片裁剪组件
-
-## 3.4.83(2025-08-11)
-feat: 新增barcode无三方依赖条码组
-
-## 3.4.82(2025-08-11)
-improvment: 优化table2递归组件逻辑
-
-feat: 支持树状列表复选框
-
-## 3.4.81(2025-08-10)
-feat: table2新增树状结构递归支持
-
-## 3.4.80(2025-08-10)
-feat: 新增table2固定列对树状支持
-
-## 3.4.79(2025-08-09)
-feat: table2组件支持左侧固定列功能
-
-## 3.4.78(2025-08-09)
-fix: 修复table2在popup弹窗中无法横向滚动
-
-## 3.4.77(2025-08-08)
-feat: 优化waterfall瀑布流组件逻辑
-
-feat: waterfall瀑布流组件支持多列
-
-feat: waterfall瀑布流组件支持响应式列数
-
-## 3.4.76(2025-08-08)
-feat: 取消props中tabs组件默认颜色影响主题色生效
-
-fix: 修复parse富文本组件报错$options
-
-feat: timeFormat时间格式化方法支持UTC格式时间 #596
-
-## 3.4.75(2025-08-07)
-feat: 新增loadFontOnce参数控制是否全局只加载一次字体图标
-
-## 3.4.74(2025-08-07)
-feat: input组件新增cursorColor属性
-
-## 3.4.73(2025-08-05)
-improvment: 优化下拉刷新默认图标
-
-## 3.4.72(2025-08-05)
-improvment: 优化virtual-list虚拟列表样式
-
-feat: 新增virtual-list虚拟列表演示
-
-## 3.4.71(2025-08-05)
-feat: 新增virtual-list虚拟列表组件
-
-feat: 新增pull-refresh下拉刷新结合虚拟列表使用
-
-## 3.4.70(2025-08-05)
-fix: 修复qrcode组件长按事件传入错误cid导致的报错
-
-fix: 修复index-list组件key为undefined导致的索引报错消失
-
-## 3.4.69(2025-08-04)
-feat: pull-refresh下拉刷新新增上拉加载特性
-
-## 3.4.68(2025-08-03)
-feat: 新增pull-refresh下拉刷新组件
-
-## 3.4.67(2025-08-02)
-feat: number-box支持disabledBgColor参数
-
-## 3.4.66(2025-08-01)
-improvment: 增加组件图标
-
-feat: table2组件新增列排序插槽
-
-fix: 分段器组件onWindowResize使用条件编译
-
-fix: 修复u-line-1单行省略样式
-
-## 3.4.65(2025-07-26)
-fix: 修复部分环境下字体图标全局加载问题
-
-## 3.4.64(2025-07-25)
-feat: 新增dragsort拖动排序组件
-
-## 3.4.63(2025-07-24)
-feat: count-down支持slot传递时间参数
-
-## 3.4.62(2025-07-24)
-feat: divider支持默认插槽
-
-## 3.4.61(2025-07-24)
-feat: divider支持默认插槽
-
-## 3.4.60(2025-07-23)
-fix: 修复use阶段全局加载图标引起App端不明$page报错
-
-## 3.4.59(2025-07-23)
-fix: 修复album组件和CateTab组件watch和emits重复
-
-fix: 修复样式优先级导致form表单labelPosition属性top失效
-
-## 3.4.58(2025-07-22)
-fix: 修复样式优先级影响grid宫格组件布局
-
-## 3.4.57(2025-07-22)
-feat: 新增title标题组件
-
-## 3.4.56(2025-07-21)
-fix: 去除多余hotCity参数
-
-## 3.4.55(2025-07-21)
-feat: 新增city-locate城市定位选择组件
-
-feat: 优化index-list组件索引
-
-## 3.4.54(2025-07-18)
-feat: dropdown组件的highlight方法支持同时高亮多个菜单项
-
-feat: 支持一次性全局加载icon字体
-
-## 3.4.53(2025-07-18)
-feat: dropdown组件的highlight方法支持同时高亮多个菜单项 感谢@keeplearning66
-
-## 3.4.52(2025-07-16)
-fix: 修复底部安全区域组件兼容性
-
-## 3.4.51(2025-07-14)
-fix: 修复u-slider在click后没有触发change事件
-
-## 3.4.50(2025-07-13)
-feat: subsection分段器添加禁用参数
-
-## 3.4.49(2025-07-11)
-feat: picker支持bgColor、round、duration和overlayOpacity属性
-
-## 3.4.48(2025-07-10)
-fix: 官方文档Card示例组件多行显示省略号样式异常
-
-feat: album组件支持自定义preview事件
-
-## 3.4.47(2025-07-09)
-fix: 修复datetime-picker打开时,数值可能出现对不上的问题
-
-feat: Subsection 分段器添加支持从 list中读取激活文字颜色和未激活文字颜色
-
-fix: 修复modal定义confirmButton
-
-fix: safe-bottom底部安全距离在小程序优先用JS计算
-
-feat: 新增tree树形组件
-
-## 3.4.46(2025-07-08)
-feat: 上传组件预览视频支持videoPreviewObjectFit参数
-
-feat: td增加多个样式props
-
-fix: 修复noticeBar字号增大时文字遮挡
-
-feat: 项目工程增加pinia
-
-## 3.4.45(2025-07-01)
-fix: 修复picker-data组件缺少name
-
-fix: 优化picker高度单位
-
-## 3.4.44(2025-06-30)
-fix: 修复indexList中stikcy属性写死的问题(always true)
-
-feat: 搜索框添加新的右侧插槽
-
-fix: 修复indexList中丢失的select event
-
-fix: 解决因为层级问题导致点击picker选择器无法正常弹出
-
-## 3.4.43(2025-06-16)
-feat: table2支持header插槽
-
-## 3.4.42(2025-06-12)
-fix: 修复qrcode中默认id问题及canvas2时App无法绘制二维码 感谢@jiaruiyan
-
-## 3.4.41(2025-06-11)
-feat: qrcode支持 新参数useRootHeightAndWidth 是否使用根节点的宽高 感谢@YJR
-
-feat: toast支持设置zIndex层级
-
-
-
-## 3.4.40(2025-06-06)
-fix: 升级二维码 canvas -> canvas2 感谢@yjr
-
-## 3.4.39(2025-05-31)
-fix: 修改步骤条微信小程序下的布局 感谢@jiaruiyan
-
-fix: u-tabs在屏幕尺寸发生变化时滑块位置没有发生变化 感谢@aqzhft
-
-fix: 鸿蒙平台不支持plus.runtime.openWeb 感谢@aqzhft
-
-## 3.4.38(2025-05-30)
-fix: 修复picker-data快捷组件缺少index
-
-fix: 修复picker组件双向绑定初始化及取消后复原再次打开后的当前项目
-
-## 3.4.37(2025-05-29)
-feat: modal支持设置动画时间
-
-fix: DatetimePicker v-model 绑定异步设置无效 (#803)
-
-## 3.4.36(2025-05-28)
-fix: lazy-load图片为空时显示错误
-
-## 3.4.35(2025-05-28)
-feat: 进度条支持从右往左加载
-
-## 3.4.34(2025-05-28)
-feat: table2支持自定义标题和单元格样式
-
-## 3.4.33(2025-05-27)
-fix: 修复小程序cate-tab第一次切换时没反应 感谢@jiaruiyan
-
-fix: 修复datetimepicker传入空字符串时导致组件崩溃 感谢@jiaruiyan
-
-fix: 修复album带单位的字符串参与计算导致的计算数据错误 感谢@jiaruiyan
-
-## 3.4.32(2025-05-26)
-feat: 增加状态栏独立颜色配置支持支付宝小程序状态栏对背景色识别的不友好的情况
-
-fix: 抖音二维码兼容修复
-
-feat: cate-tab组件增加rightTop插槽 #715
-
-fix: 修改 test.promise(res) 预期结果不一致
-
-## 3.4.31(2025-05-17)
-fix: 修复parse富文本组件导致鸿蒙运行白屏
-
-fix: 去除演示项目中uni.$u用法便于兼容鸿蒙
-
-feat: modal新增popupBottom插槽适用类似关闭按钮与内容区域分离的场景
-
-## 3.4.30(2025-05-16)
-feat: 新增pagination分页器组件
-
-feat: popup新增bottom插槽适用类似关闭按钮与内容区域分离的场景
-
-## 3.4.29(2025-05-15)
-fix: 修复table2横向滚动样式
-
-fix: 修复table2组件宽度兼容
-
-fix: 修复image显示png图片时默认背景色问题
-
-feat: cate-tab新增height参数便于设置组件高度
-
-feat: 在index.js种导出digit.js便于使用
-
-fix: 修复tag组件缺失iconColor属性
-
-fix: 优化index-list的setValueForTouch方法逻辑 #708
-
-feat: number-box支持change事件返回变动是点击了增加还是减少按钮
-
-fix: 修复table2在小程序下部分情形不显示表格
-
-## 3.4.28(2025-05-12)
-feat: 新增table表格组件
-
-feat: 新增element-plus风格的table2组件
-
-## 3.4.27(2025-05-06)
-fix: 修复card组件props
-
-## 3.4.26(2025-05-06)
-fix: 修复test工具引入
-
-feat: card组件支持全局设置props默认值
-
-fix: 修复image在加载错误情况下高度和宽度不正确问题
-
-fix: 修复picker-data快捷组件默认picker选中
-
-fix: 修复日历month子组件缺失emits定义
-
-## 3.4.25(2025-04-27)
-fix: up-form编译在微信小程序里样式缺失 #640
-
-fix: number-box输入为空时自动设为最小值
-
-feat: picker与datetimepicke组件hasInput模式支持inputProps属性
-
-## 3.4.24(2025-04-25)
-fix: 修复upload上传逻辑(感谢@semdy)
-
-## 3.4.23(2025-04-24)
-chore: 补全chooseFile TS类型(感谢@semdy)
-
-feat: u-search组件的图标支持显示在右边(感谢@semdy)
-
-chore: 修正chooseFile返回的数据TS类型(感谢@semdy)
-
-fix: PR导致缺失name影响uplad自动上传扩展名
-
-
-## 3.4.22(2025-04-22)
-fix: 修复自动上传偶发的success被覆盖为uploading
-
-fix: float-button缺少key #677
-
-fix: upload组件完善优化(感谢@semdy)
-
-fix: toolbar组件confirmColor属性默认改为空,以便默认使用主题色、标题字体加粗(感谢@semdy)
-
-## 3.4.21(2025-04-21)
-feat: subsection分段器支持双向绑定current
-
-feat: select组件支持maxHeight属性
-
-feat: datetime-picker支持inputBorder属性
-
-## 3.4.20(2025-04-17)
-fix: 修复navbar-mini提示border不存在
-
-feat: status-bar支持对外暴露状态栏高度值
-
-feat: upload支持自定义自动上传后处理逻辑便于对接不同规范后端
-
-feat: 优化tag组件插槽
-
-
-## 3.4.19(2025-04-14)
-fix: 修复model组件增加contentStyle带来的语法问题
-
-## 3.4.18(2025-04-14)
-fix: upload组件支持所有文件类型的onClickPreview事件
-
-## 3.4.17(2025-04-11)
-feat: select组件text插槽增加scope传递currentLabel
-
-## 3.4.16(2025-04-10)
-fix: 修复安卓新加载字体方式导致Cannot read property '$page' of undefined
-
-## 3.4.15(2025-04-10)
-improvment: 优化移步加载数据时swiper组件displayMultipleItems报错
-
-feat: modal增加contentStyle属性
-
-fix: 修复下拉菜单收起动画缺失
-
-fix: 修复sticky的offset属性值为响应式数据时失效 #237
-
-
-## 3.4.14(2025-04-09)
-feat: 支持自托管内置图标及扩展自定义图标
-
-## 3.4.13(2025-04-08)
-fix: tabs点击当前tab触发change事件
-
-## 3.4.12(2025-04-02)
-fix: dropdown关闭后遮挡页面内容 #653
-
-fix u-sticky.vue Uncaught TypeError: e.querySelector is not a function at uni-app-view.umd.js
-
-## 3.4.11(2025-03-31)
-fix: 优化upload组件预览视频的弹窗占位
-
-## 3.4.10(2025-03-28)
-feat: select组件新增多个props属性及优化
-
-fix: 修复cate-tab报错index is not defined #661
-
-
-## 3.4.9(2025-03-27)
-fix: 修复upload组件split报错
-
-fix: 修复float-button缺少flex样式
-
-## 3.4.8(2025-03-27)
-fix: 修复upload组件split报错
-
-fix: 移除mapState
-
-## 3.4.7(2025-03-26)
-fix: 修复action-sheet-data和picker-data数据回显
-
-fix:  优化upload组件视频封面兼容
-
-## 3.4.6(2025-03-25)
-feat: checkbox触发change时携带name参数
-
-feat: upload组件支持服务器本机和阿里云OSS自动上传功能及上传进度条
-
-feat: upload组件支持视频预览及oss上传时获取视频封面图
-
-feat: 新增up-action-sheet-data快捷组件
-
-feat: 新增up-picker-data快捷组件
-
-## 3.4.5(2025-03-24)
-feat: tag组件新增textSize/height/padding/borderRadius属性
-
-feat: 新增genLightColor自动计算浅色方法及tag组件支持autoBgColor自动计算背景色
-
-## 3.4.4(2025-03-13)
-feat: modal增加异步操作进行中点击取消弹出提示特性防止操作被中断
-
-fix: 修复toast组件show方法类型声明
-
-## 3.4.3(2025-03-12)
-fix: 修复textarea自动增高时在输入时高度异常
-
-## 3.4.2(2025-03-11)
-feat: step组件增加title插槽及增加辅助class便于自定义样式
-
-## 3.4.1(2025-03-11)
-feat: 新机制确保setConfig与http在nvue等环境下生效
-
-## 3.3.74(2025-03-06)
-fix: CateTab语法问题
-
-## 3.3.73(2025-03-06)
-feat: CateTab新增v-model:current属性
-
-## 3.3.72(2025-02-28)
-feat: tabs组件支持icon图标及插槽
-
-## 3.3.71(2025-02-27)
-feat: 折叠面板collapse增加titileStyle/iconStyle/rightIconStyle属性
-
-feat: 折叠面板组件新增cellCustomStyle/cellCustomClass属性
-
-fix: select组件盒模型
-
-## 3.3.70(2025-02-24)
-fix: 修改u-checkbox-group组件changes事件发生位置
-
-## 3.3.69(2025-02-19)
-picker允许传递禁用颜色props
-
-slider组件isRange状态下增加min max插槽分开显示内容
-
-feat: 新增经典下拉框组件up-select
-
-## 3.3.68(2025-02-12)
-fix: 修复weekText类型
-
-feat: 日历增加单选与多选指定禁止选中的日期功能
-
-fix: NumberBox删除数字时取值有误 #613
-
-## 3.3.67(2025-02-11)
-feat: navbar支持返回全局拦截器配置
-
-feat: 表单-校验-支持无提示-得到校验结果
-
-feat: picker传递hasInput属性时候,可以禁用输入框点击
-
-## 3.3.66(2025-02-09)
-feat: steps-item增加content插槽
-
-## 3.3.65(2025-02-05)
-feat: number-box组件新增按钮圆角/按钮宽度/数据框背景色/迷你模式
-## 3.3.64(2025-01-18)
-feat: 日历组件支持自定义星期文案
-
-## 3.3.63(2025-01-13)
-fix: cate-tab支持支付宝小程序
-
-fix: textarea 修复 placeholder-style
-
-fix: 修复在图片加载及加载失败时容器宽度
-
-fix: waterfall组件报错Maximum recursive updates
-
-## 3.3.62(2025-01-10)
-feat: sleder滑动选择器双滑块增加外层触发值的变动功能
-
-fix: picker支持hasInput优化
-
-## 3.3.61(2024-12-31)
-fix: 修复微信getSystemInfoSync接口废弃警告
-
-fix: 'u-status-bar' symbol missing
-
-## 3.3.60(2024-12-30)
-feat: 日期组件支持禁用
-
-fix: ts定义修复 #600
-
-feat: Tabs组件选中时增加一个active的class #595
-
-## 3.3.59(2024-12-30)
-fix: Property "isH5" was accessed during render
-
-## 3.3.58(2024-12-26)
-fix: slider组件change事件传参
-
-## 3.3.57(2024-12-23)
-fix: slider组件change事件传参
-
-feat: 更新u-picker组件增加当前选中class类名
-
-## 3.3.56(2024-12-18)
-feat: 在u-alert组件中添加关闭事件
-
-## 3.3.55(2024-12-17)
-add: swiper增加双向绑定
-
-## 3.3.54(2024-12-11)
-add: qrcode支持props控制是否开启点击预览
-
-add: 新增cate-tab垂直分类组件
-
-## 3.3.53(2024-12-10)
-fix: 修复popup居中模式点击内容区域触发关闭
-
-## 3.3.52(2024-12-09)
-add: notice-bar支持justifyContent属性
-
-## 3.3.51(2024-12-09)
-add: radio增加label插槽
-
-## 3.3.50(2024-12-05)
-fix: 优化popup等对禁止背景滚动机制
-
-add: slider在弹窗使用示例
-
-fix: card组件类名问题
-
-## 3.3.49(2024-12-02)
-fix: 去除album多余的$u引用
-
-fix: 优化图片组件兼容性
-
-add: picker组件增加zIndex属性
-
-add: text增加是否占满剩余空间属性
-
-add: input颜色示例
-
-## 3.3.48(2024-11-29)
-add: 文本行数限制样式提高到10行
-
-del: 去除不跨端的inputmode
-## 3.3.47(2024-11-28)
-fix: 时间选择器在hasInput模式下部分机型键盘弹出
-
-## 3.3.46(2024-11-26)
-fix: 修复text传递事件参数
-
-## 3.3.45(2024-11-24)
-add: navbar组件支持配置标题颜色
-
-fix: 边框按钮警告类型下颜色变量使用错误
-
-## 3.3.43(2024-11-18)
-fix: 支持瀑布流组件v-model置为[]
-
-add: 新增字符串路径访问工具方法getValueByPath
-
-add: 新增float-button悬浮按钮组件
-
-## 3.3.42(2024-11-15)
-add: button组件支持stop参数阻止冒泡
-
-## 3.3.41(2024-11-13)
-fix: u-radio-group invalid import
-
-improvement: 优化图片组件宽高及修复事件event传递
-
-## 3.3.40(2024-11-11)
-add: 组件radioGroup增加gap属性用于设置item间隔 
-
-fix: 修复H5全局导入
-
-## 3.3.39(2024-11-04)
-fix: 修复相册组件
-
-## 3.3.38(2024-11-04)
-fix: 修复视频预览报错 #510
-
-add: album组件增加stop参数支持阻止事件冒泡
-
-## 3.3.37(2024-10-21)
-fix: 修复因为修改组件名称前缀,导致h5打包后$parent方法内找不到父组件的问题
-
-fix: 修复datetime-picker选择2000年以前日期出错
-
-## 3.3.36(2024-10-09)
-fix: toast 自动关闭
-
-feat: 增加微信小程序用户昵称审核完毕回调及修改 ts 定义文件
-
-## 3.3.35(2024-10-08)
-feat: modal和picker支持v-model:show双向绑定
-
-feat: 支持checkbox使用slot自定义label后自带点击事件 #522
-
-feat: swipe-action支持自动关闭特性及初始化打开状态
-
-## 3.3.34(2024-09-23)
-feat: 支持toast设置duration值为-1时不自动关闭
-
-## 3.3.33(2024-09-18)
-fix: 修复test.date('008')等验证结果不准确
-
-## 3.3.32(2024-09-09)
-fix: u-keyboard名称冲突warning
-
-## 3.3.31(2024-08-31)
-feat: qrcode初步支持nvue
-
-## 3.3.30(2024-08-30)
-fix: slider兼容step为字符串类型
-
-## 3.3.29(2024-08-30)
-fix: 修复tabs组件current参数为字符串处理逻辑
-
-## 3.3.28(2024-08-26)
-fix: list组件滑动偏移量不一样取绝对值导致iOS下拉偏移量计算错误
-
-## 3.3.27(2024-08-22)
-fix: 修复up-datetime-picker组件toolbarRightSlot定义缺失
-
-fix: 修复FormItem的rules更新错误的问题
-
-## 3.3.26(2024-08-22)
-fix: 批量注册全局组件优化
-
-## 3.3.25(2024-08-21)
-fix: 修复slider在app-vue下样式问题
-
-## 3.3.24(2024-08-19)
-fix: 修复时间选择器hasInput模式小程序不生效
-
-feat: 支持H5导入所有组件
-
-## 3.3.23(2024-08-17)
-feat: swipe-action增加closeAll方法
-
-fix: 兼容tabs在某些场景下index小于0时自动设置为0
-
-add: 通用mixin新增navTo页面跳转方法
-
-## 3.3.21(2024-08-15)
-improvement: 优化二维码组件loading及支持预览与长按事件 #351
-
-fix: 修复swipe-action自动关闭其它功能及组件卸载自动关闭
-
-## 3.3.20(2024-08-15)
-refactor: props默认值文件移至组件文件夹内便于查找
-## 3.3.19(2024-08-14)
-fix: 修复2被rpx兼容处理只在数字值生效
-
-add: 增加swiper自定义插槽示例
-
-## 3.3.18(2024-08-13)
-feat: 新增支持datetime-picker工具栏插槽及picker插槽支持修复
-## 3.3.17(2024-08-12)
-feat: swiper组件增加默认slot便于自定义
-
-feat: grid新增间隔参数
-
-feat: picker新增toolbar-right和toolbar-bottom插槽
-
-## 3.3.16(2024-08-12)
-fix: 解决swiper中title换行后多余的内容未被遮挡问题
-
-fix: 修复迷你导航适配异形屏
-
-## 3.3.15(2024-08-09)
-fix: 修复默认单位设置为rpx时一些组件高度间距异常
-
-fix: 修复日历在rpx单位下布局异常
-
-feat: code-input支持App端展示输入光标
-
-## 3.3.14(2024-08-09)
-add: 增加box组件
-
-add: 增加card卡片组件
-
-
-## 3.3.13(2024-08-08)
-feat: input支持调用原生组件的focus和blur方法
-
-improvement: grid-item条件编译优化
-
-add: 新增迷你导航组件
-
-## 3.3.12(2024-08-06)
-improvement: $u挂载时机调整便于打包分离chunk
-
-fix: steps新增itemStyle属性名称冲突
-
-## 3.3.11(2024-08-05)
-feat: 新增支持upload组件的deletable/maxCount/accept变更监听 #333
-
-feat: 新增支持tabs在swiper中使用
-
-feat: 新增FormItem支持独立设置验证规则rules
-
-fix: 修复index-list未设置$slots.header时索引高亮失效
-
-## 3.3.10(2024-08-02)
-fix: 修复index-list偶发的滑动最后一个索引报错top不存在
-
-fix: 修复gird在QQ、抖音小程序下布局
-
-feat: 优化step支持自定义样式prop
-
-feat: action-sheet组件支持v-model:show双向绑定
-
-fix: 小程序下steps和grid都统一采用grid布局
-
-fix: 修复支付宝小程序下input类型为数字时双向绑定失效
-
-feat : form 表单 validate 校验不通过后 error增加字段prop信息  #304
-
-fix: form组件异步校异常验问题 #393
-
-## 3.3.9(2024-08-01)
-fix: 优化获取nvue元素
-
-feat: modal新增contentTextAlign设置文案对齐方式
-
-fix: 修复NVUE下tabbar文字不显示  #458
-
-feat: loading-page增加zIndex属性
-
-fix: 相册在宽度较小时换行问题
-
-feat: album相册增加自适应自动换行模式
-
-feat: album相册增加图片尺寸单位prop
-
-fix: 修复calendar日历月份居中
-
-## 3.3.8(2024-07-31)
-feat: slider支持进度条任意位置触发按钮拖动
-
-fix: 修复app-vue下modal标题不居中
-
-fix: #459 TS setConfig 声明异常
-
-feat: tabs组件增加longPress长按事件
-
-feat: 新增showRight属性控制collapse右侧图标显隐
-
-fix: 优化nvue下css警告
-
-## 3.3.7(2024-07-29)
-feat: 支持IndexList组件支持在弹窗等场景下使用及联动优化
-
-feat: popup组件支持v-model:show双向绑定
-
-feat: 优化tabs的current双向绑定
-
-fix: checkbox独立使用时checked赋初始值可以,但是手动切换时值没有做双向绑定! #455
-
-feat: slider组件支持区间双滑块
-
-fix: toast 支持自定义图标?可传入了决对路径的 icon也没有用 #409
-
-feat: form-item校验失败时 增加class方便自定义显示错误的展示方式 #394
-
-fix: up-cell的required配置不生效 #395
-
-fix: 横向滚动组件,微信小程序编译后会有警告 #415
-
-fix: u-picker内部对默认值defaultIndex的监听 #425
-
-feat: toast 组件支持遮掩层穿透  #417
-
-fix: 兼容vue的slot编译bug #423
-
-fix: upload 微信小程序 点击预览视频报错 #424
-
-fix: u-number-box 组件修改【integer, decimalLength, min, max 】props时没有触发绑定值更新 #429
-
-feat: Tabs组件能否支持自定义插槽 #439
-
-feat: ActionSheet 可以配置最大高度吗, 我当做select使用了。 #445
-
-fix: cursor-pointer优化
-
-feat: 新版slider组件兼容NVUE改造
-
-feat: 新增slider组件手动实现以支持样式自定义
-
-perf:补充TS声明提示信息
-
-修复:ActionSheet 操作菜单cancelText属性为空DOM节点还存在并且可以点击问题
-
-fix: 去除预留的beforeDestroy兼容容易在某些sdk下不识别条件编译
-
-## 3.3.6(2024-07-23)
-feat: u-album组件添加radius,shape参数,定义参考当前u-image参数
-
-fix: 修复了calendar组件title和日期title未垂直居中的问题
-
-fix: update:modelValue缺失emit定义
-
-## 3.3.5(2024-07-10)
-picker组件支持hasInput模式
-
-## 3.3.4(2024-07-07)
-fix: input组件双向绑定问题 #419
-
-lazy-load完善emit
-
-优化通用小程序分享
-
-## 3.3.2(2024-06-27)
-fix: 在Nvue环境中编译,出现大量警告 #406
-## 3.3.1(2024-06-27)
-u-button组件报错,找不到button mixins #407
-## 3.3.0(2024-06-27)
-feat: checkbox支持label设置slot
-
-feat: modal增加customClass
-
-feat: navbar、popup、tabs、text支持customClass
-
-fix: cell组建缺少flex布局
-
-fix: 修复微信小程序真机调试时快速输入出现文本回退问题
-
-feat: tag增加默认slot
-
-公共mixin改造为按需导入语法
-
-refactor: 组件props混入mixin改造为按需导入语法
-
-fix: u-tabbar 安卓手机点击按钮变蓝问题 #396
-
-feat: upload组建增加extension属性
-
-fix: upload组件参数mode添加left
-
-fix: 修复阴影在非nvue时白色背景色不显示
-
-## 3.2.24(2024-06-11)
-fix: 修复时间选择器confirm事件触发时机导致2次才会触发v-model更新
-## 3.2.23(2024-05-30)
-fix: #378 H5 u-input 在表单中初始值为空也会触发一次 formValidate(this,"change")事件导致进入页面直接校验了一次
-
-fix: #373 搜索组件up-search的@clear事件无效
-
-fix: #372 ActionSheet 组件的取消按钮触发区域太小
-
-## 3.2.22(2024-05-13)
-上传组件支持微信小程序预览视频
-
-修复折叠面板右侧箭头不显示
-
-修复uxp2px
-
-## 3.2.21(2024-05-10)
-fix: loading-icon修复flex布局
-## 3.2.20(2024-05-10)
-修复瀑布流大小写#355
-## 3.2.19(2024-05-10)
-去除意外的文件引入
-## 3.2.18(2024-05-09)
-fix: 349 popup 组件设置 zIndex 属性后,组件渲染异常#
-feat: 搜索框增加adjustPosition属性
-fix: #331增加u-action-sheet__cancel
-优化mixin兼容性
-feat: #326 up-list增加下拉刷新功能
-fix: #319 优化up-tabs参数与定义匹配
-fix: index-list组件微信小程序端使用自定义导航栏异常
-fix: #285 pickerimmediateChange 写死为true
-fix: #111 u-scroll-list组件,隐藏指示器后报错, 提示找不到ref
-list增加微信小程序防抖配置
-
-## 3.2.17(2024-05-08)
-fix: 支付宝小程序二维码渲染
-## 3.2.16(2024-05-06)
-修复tabs中,当前激活样式的undefined bug
-
-fix: #341u-code 倒计时没结束前退出,再次进入结束后退出界面,再次进入重新开始倒计时bug
-
-受到uni-app内置text样式影响修复
-
-## 3.2.15(2024-04-28)
-优化时间选择器hasInput模式初始化值
-## 3.2.14(2024-04-24)
-去除pleaseSetTranspileDependencies
-
-http采用useStore
-
-## 3.2.13(2024-04-22)
-修复modal标题样式
-
-优化日期选择器hasInput模式宽度
-
-## 3.2.12(2024-04-22)
-修复color应用
-## 3.2.11(2024-04-18)
-修复import化带来的问题
-## 3.2.10(2024-04-17)
-完善input清空事件App端失效的兼容性
-
-修复日历组件二次打开后当前月份显示不正确
-
-## 3.2.9(2024-04-16)
-组件内uni.$u用法改为import引入
-
-规范化及兼容性增强
-
-## 3.2.8(2024-04-15)
-修复up-tag语法错
-## 3.2.7(2024-04-15)
-修复下拉菜单背景色在支付宝小程序无效
-
-setConfig改为浅拷贝解决无法用import导入代替uni.$u.props设置
-
-## 3.2.6(2024-04-14)
-修复某些情况下滑动单元格默认右侧按钮是展开的问题
-## 3.2.5(2024-04-13)
-调整分段器尺寸及修复窗口大小改变时重新计算尺寸
-
-多个组件支持cursor-pointer增强PC端体验
-
-## 3.2.4(2024-04-12)
-初步支持typescript
-## 3.2.3(2024-04-12)
-fix: 修复square属性在小程序下无效问题
-
-fix:修复lastIndex异常导致的column异常问题
-
-fix: alipayapp picker style
-
-feat(button): 添加用户同意隐私协议事件回调
-
-fix: input switch password
-
-fix: 修复u-code组件keepRuning失效问题
-
-feat: form-item添加labelPosition属性
-
-新增dropdown组件
-
-分段器支持内部current值
-
-优化cell和action-sheet视觉大小
-
-修复tabs文字换行
-
-## 3.2.2(2024-04-11)
-修复换行符问题
-## 3.2.1(2024-04-11)
-修复演示H5二维码
-
-fix: #270 ReadMore 展开阅读更多内容变化兼容
-
-fix: #238Calendar组件maxDate修改为不能小于minDate
-
-checkbox支持独立使用
-
-修复popup中在微信小程序中真机调试滚动失效
-
-## 3.2.0(2024-04-10)
-修复轮播图在nvue显示
-修复疑似u-slider名称被占用导致slider在App下不显示
-解决微信小程序提示 Some selectors are not allowed in component wxss
-示例中u-前缀统一为up-
-增加瀑布流与图片懒加载组件
-fix: #308修复tag组件缺失iconColor参数
-fix: #297使用grid布局解决目前编译为抖音小程序无法开启virtualHost
-## 3.1.52(2024-04-07)
-工具类方法调用import化改造
-新增up-copy复制组件
-## 3.1.51(2024-04-07)
-优化时间选择器自带输入框格式化显示
-防止按钮文字换行
-修复订单列表模板滑动
-增加u-qrcode二维码组件
-## 3.1.49(2024-03-27)
-日期时间组件支持自带输入框
-fix: popup弹窗滚动穿透问题
-fix: 修复小程序numberbox bug
-## 3.1.48(2024-03-18)
-fix:[plugin:uni:pre-css] Unbalanced delimiter found in string
-## 3.1.47(2024-03-18)
-fix: setConfig设置组件默认参数无效问题
-fix: 修复自定义图标无效问题
-feat: 增加u-form-item单独设置规则变量
-fix:#293小程序是自定义导航栏的时候即传了customNavHeight的时候会出现跳转偏移的情况
-
-## 3.1.46(2024-01-29)
-beforeUnmount
-## 3.1.45(2024-01-24)
-fix: #262ext组件为超链接的情况下size属性不生效
-fix: #263最新版本3.1.42中微信小程序u-swipe-action-item报错
-fix: #224最新版本3.1.42中微信小程序u-swipe-action-item报错
-fix: #263支持支付宝小程序
-fix: #261u-input在直接修改v-model的绑定值时,每隔一次会无法出发change事件
-优化折叠面板兼容微信小程序
-## 3.1.42(2024-01-15)
-修复u-number-box默认值0时在小程序不显示值
-优化u-code的timer判断
-优化支付宝小程序下textarea字数统计兼容
-优化u-calendar
-## 3.1.41(2023-11-18)
-#215优化u-cell图标容器间距问题
-## 3.1.40(2023-11-16)
-修复u-slider双向绑定
-## 3.1.39(2023-11-10)
-修复头条小程序不支持env(safe-area-inset-bottom)
-优化#201u-grid 指定列数导致闪烁
-#193IndexList 索引列表 高度错误
-其他优化
-## 3.1.38(2023-10-08)
-修复u-slider
-## 3.1.37(2023-09-13)
-完善emits定义及修复code-input双向数据绑定
-## 3.1.36(2023-08-08)
-修复富文本事件名称大小写
-## 3.1.35(2023-08-02)
-修复编译到支付宝小程序u-form报错
-## 3.1.34(2023-07-27)
-修复App打包uni.$u.mpMixin方式sdk暂时不支持导致报错
-## 3.1.33(2023-07-13)
-修复弹窗进入动画、模板页面样式等
-## 3.1.31(2023-07-11)
-修复dayjs引用
-## 3.0.8(2022-07-12)
-修复u-tag默认宽度撑满容器
-## 3.0.7(2022-07-12)
-修复u-navbar自定义插槽演示示例
-## 3.0.6(2022-07-11)
-修复u-image缺少emits申明
-## 3.0.5(2022-07-11)
-修复u-upload缺少emits申明
-## 3.0.4(2022-07-10)
-修复u-textarea/u-input/u-datetime-picker/u-number-box/u-radio-group/u-switch/u-rate在vue3下数据绑定
-## 3.0.3(2022-07-09)
-启用自建演示二维码
-## 3.0.2(2022-07-09)
-修复dayjs/clipboard等导致打包报错
-## 3.0.1(2022-07-09)
-增加插件市场地址
-## 3.0.0(2022-07-09)
-# uview-plus(vue3)初步发布

+ 0 - 109
uni_modules/uview-plus/components/u-action-sheet-data/u-action-sheet-data.vue

@@ -1,109 +0,0 @@
-<template>
-	<view class="u-action-sheet-data">
-		<view class="u-action-sheet-data__trigger">
-			<slot name="trigger"></slot>
-			<up-input
-				v-if="!$slots['trigger']"
-				:modelValue="current"
-				disabled
-				disabledColor="#ffffff"
-				:placeholder="title"
-				border="none"
-			></up-input>
-			<view @click="show = true"
-				class="u-action-sheet-data__trigger__cover"></view>
-		</view>
-		<up-action-sheet
-			:show="show"
-			:actions="options"
-			:title="title"
-			safeAreaInsetBottom
-			:description="description"
-			@close="show = false"
-			@select="select"
-		>
-		</up-action-sheet>
-	</view>
-</template>
-
-<script>
-export default {
-    props: {
-		modelValue: {
-			type: [String, Number],
-			default: ''
-		},
-		title: {
-			type: String,
-			default: ''
-		},
-		description: {
-			type: String,
-			default: ''
-		},
-		options: {
-			type: Array,
-			default: () => {
-				return []
-			}
-		},
-		valueKey: {
-			type: String,
-			default: 'value'
-		},
-		labelKey: {
-			type: String,
-			default: 'name'
-		}
-    },
-    data() {
-        return {
-			show: false,
-			current: '',
-        }
-    },
-    created() {
-		if (this.modelValue) {
-			this.options.forEach((ele) => {
-				if (ele[this.valueKey] == this.modelValue) {
-					this.current = ele[this.labelKey]
-				}
-			})
-		}
-    },
-    emits: ['update:modelValue'],
-	watch: {
-		modelValue() {
-			this.options.forEach((ele) => {
-				if (ele[this.valueKey] == this.modelValue) {
-					this.current = ele[this.labelKey]
-				}
-			})
-		}
-	},
-    methods: {
-        hideKeyboard() {
-            uni.hideKeyboard()
-        },
-        select(e) {
-            this.$emit('update:modelValue', e[this.valueKey])
-			this.current = e[this.labelKey]
-        },
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-	.u-action-sheet-data {
-		&__trigger {
-			position: relative;
-			&__cover {
-				position: absolute;
-				top: 0;
-				left: 0;
-				right: 0;
-				bottom: 0;
-			}
-		}
-	}
-</style>

+ 0 - 28
uni_modules/uview-plus/components/u-action-sheet/actionSheet.js

@@ -1,28 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-08-16 10:52:35
- * @FilePath     : /uview-plus/libs/config/props/actionSheet.js
- */
-export default {
-    // action-sheet组件
-    actionSheet: {
-        show: false,
-        title: '',
-        description: '',
-        actions: [],
-        nameKey: 'name',
-        subnameKey: 'subnameKey',
-        index: '',
-        cancelText: '',
-        closeOnClickAction: true,
-        safeAreaInsetBottom: true,
-        openType: '',
-        closeOnClickOverlay: true,
-        round: 0,
-        wrapMaxHeight: '600px'
-    }
-}

+ 0 - 80
uni_modules/uview-plus/components/u-action-sheet/props.js

@@ -1,80 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @LastAuthor   : jry
- * @lastTime     : 2025-08-16 10:52:35
- * @FilePath     : /uview-plus/libs/config/props/props.js
- */
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const props = defineMixin({
-    props: {
-        // 操作菜单是否展示 (默认false)
-        show: {
-            type: Boolean,
-            default: () => defProps.actionSheet.show
-        },
-        // 标题
-        title: {
-            type: String,
-            default: () => defProps.actionSheet.title
-        },
-        // 选项上方的描述信息
-        description: {
-            type: String,
-            default: () => defProps.actionSheet.description
-        },
-        // 数据
-        actions: {
-            type: Array,
-            default: () => defProps.actionSheet.actions
-        },
-        // 选项名称key
-        nameKey: {
-            type: String,
-            default: () => defProps.actionSheet.nameKey
-        },
-        // 选项子名称key
-        subnameKey: {
-            type: String,
-            default: () => defProps.actionSheet.subnameKey
-        },
-        // 取消按钮的文字,不为空时显示按钮
-        cancelText: {
-            type: String,
-            default: () => defProps.actionSheet.cancelText
-        },
-        // 点击某个菜单项时是否关闭弹窗
-        closeOnClickAction: {
-            type: Boolean,
-            default: () => defProps.actionSheet.closeOnClickAction
-        },
-        // 处理底部安全区(默认true)
-        safeAreaInsetBottom: {
-            type: Boolean,
-            default: () => defProps.actionSheet.safeAreaInsetBottom
-        },
-        // 小程序的打开方式
-        openType: {
-            type: String,
-            default: () => defProps.actionSheet.openType
-        },
-        // 点击遮罩是否允许关闭 (默认true)
-        closeOnClickOverlay: {
-            type: Boolean,
-            default: () => defProps.actionSheet.closeOnClickOverlay
-        },
-        // 圆角值
-        round: {
-            type: [Boolean, String, Number],
-            default: () => defProps.actionSheet.round
-        },
-        // 选项区域最大高度
-        wrapMaxHeight: {
-            type: [String],
-            default: () => defProps.actionSheet.wrapMaxHeight
-        },
-    }
-})

+ 0 - 302
uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue

@@ -1,302 +0,0 @@
-<template>
-	<u-popup
-	    :show="show"
-	    mode="bottom"
-	    @close="closeHandler"
-	    :safeAreaInsetBottom="safeAreaInsetBottom"
-	    :round="round"
-	>
-		<view class="u-action-sheet">
-			<!-- 顶部标题区域 -->
-			<view
-			    class="u-action-sheet__header"
-			    v-if="title"
-			>
-				<text class="u-action-sheet__header__title u-line-1">{{title}}</text>
-				<view
-				    class="u-action-sheet__header__icon-wrap"
-				    @tap.stop="cancel"
-				>
-					<up-icon
-					    name="close"
-					    size="17"
-					    color="#c8c9cc"
-					    bold
-					></up-icon>
-				</view>
-			</view>
-			<!-- 描述信息 -->
-			<text
-			    class="u-action-sheet__description"
-				:style="[{
-					marginTop: `${title && description ? 0 : '18px'}`
-				}]"
-			    v-if="description"
-			>{{description}}</text>
-			<slot>
-				<!-- 分割线 -->
-				<u-line v-if="description"></u-line>
-				<!-- 操作项列表 -->
-				<scroll-view scroll-y class="u-action-sheet__item-wrap" :style="{maxHeight: wrapMaxHeight}">
-					<view :key="index" v-for="(item, index) in actions">
-						<!-- #ifdef MP -->
-						<button
-						    class="u-reset-button"
-						    :openType="item.openType"
-						    @getuserinfo="onGetUserInfo"
-						    @contact="onContact"
-						    @getphonenumber="onGetPhoneNumber"
-						    @error="onError"
-						    @launchapp="onLaunchApp"
-						    @opensetting="onOpenSetting"
-						    :lang="lang"
-						    :session-from="sessionFrom"
-						    :send-message-title="sendMessageTitle"
-						    :send-message-path="sendMessagePath"
-						    :send-message-img="sendMessageImg"
-						    :show-message-card="showMessageCard"
-						    :app-parameter="appParameter"
-						    @tap="selectHandler(index)"
-						    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
-						>
-							<!-- #endif -->
-							<view
-							    class="u-action-sheet__item-wrap__item"
-							    @tap.stop="selectHandler(index)"
-							    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
-							    :hover-stay-time="150"
-							    :style="getItemHoverStyle(index)"
-							>
-								<template v-if="!item.loading">
-									<text
-									    class="u-action-sheet__item-wrap__item__name"
-									    :style="[itemStyle(index)]"
-									>{{ item[nameKey] }}</text>
-									<text
-									    v-if="item[subnameKey]"
-									    class="u-action-sheet__item-wrap__item__subname"
-									>{{ item[subnameKey] }}</text>
-								</template>
-								<!-- 加载状态图标 -->
-								<u-loading-icon
-								    v-else
-								    custom-class="van-action-sheet__loading"
-								    size="18"
-								    mode="circle"
-								/>
-							</view>
-							<!-- #ifdef MP -->
-						</button>
-						<!-- #endif -->
-						<!-- 选项间分割线 -->
-						<u-line v-if="index !== actions.length - 1"></u-line>
-					</view>
-				</scroll-view>
-			</slot>
-			<!-- 取消按钮前的分割区域 -->
-			<u-gap
-			    bgColor="#eaeaec"
-			    height="6"
-			    v-if="cancelText"
-			></u-gap>
-			<!-- 取消按钮 -->
-			<view class="u-action-sheet__item-wrap__item u-action-sheet__cancel"
-				hover-class="u-action-sheet--hover" @tap="cancel" v-if="cancelText">
-				<text
-				    @touchmove.stop.prevent
-				    :hover-stay-time="150"
-				    class="u-action-sheet__cancel-text"
-				>{{cancelText}}</text>
-			</view>
-		</view>
-	</u-popup>
-</template>
-
-<script>
-	import { openType } from '../../libs/mixin/openType'
-	import { buttonMixin } from '../../libs/mixin/button'
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addUnit } from '../../libs/function/index';
-	/**
-	 * ActionSheet 操作菜单
-	 * @description 本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheetAPI,配置更加灵活,所有平台都表现一致。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/actionSheet.html
-	 * 
-	 * @property {Boolean}			show				操作菜单是否展示 (默认 false )
-	 * @property {String}			title				操作菜单标题
-	 * @property {String}			description			选项上方的描述信息
-	 * @property {Array<Object>}	actions				按钮的文字数组,见官方文档示例
-	 * @property {String}			cancelText			取消按钮的提示文字,不为空时显示按钮
-	 * @property {Boolean}			closeOnClickAction	点击某个菜单项时是否关闭弹窗 (默认 true )
-	 * @property {Boolean}			safeAreaInsetBottom	处理底部安全区 (默认 true )
-	 * @property {String}			openType			小程序的打开方式 (contact | launchApp | getUserInfo | openSetting |getPhoneNumber |error )
-	 * @property {Boolean}			closeOnClickOverlay	点击遮罩是否允许关闭  (默认 true )
-	 * @property {Number|String}	round				圆角值,默认无圆角  (默认 0 )
-	 * @property {String}			lang				指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文
-	 * @property {String}			sessionFrom			会话来源,openType="contact"时有效
-	 * @property {String}			sendMessageTitle	会话内消息卡片标题,openType="contact"时有效
-	 * @property {String}			sendMessagePath		会话内消息卡片点击跳转小程序路径,openType="contact"时有效
-	 * @property {String}			sendMessageImg		会话内消息卡片图片,openType="contact"时有效
-	 * @property {Boolean}			showMessageCard		是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效 (默认 false )
-	 * @property {String}			appParameter		打开 APP 时,向 APP 传递的参数,openType=launchApp 时有效
-	 * 
-	 * @event {Function} select			点击ActionSheet列表项时触发 
-	 * @event {Function} close			点击取消按钮时触发
-	 * @event {Function} getuserinfo	用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与 wx.getUserInfo 返回的一致,openType="getUserInfo"时有效
-	 * @event {Function} contact		客服消息回调,openType="contact"时有效
-	 * @event {Function} getphonenumber	获取用户手机号回调,openType="getPhoneNumber"时有效
-	 * @event {Function} error			当使用开放能力时,发生错误的回调,openType="error"时有效
-	 * @event {Function} launchapp		打开 APP 成功的回调,openType="launchApp"时有效
-	 * @event {Function} opensetting	在打开授权设置页后回调,openType="openSetting"时有效
-	 * @example <u-action-sheet :actions="list" :title="title" :show="show"></u-action-sheet>
-	 */
-	export default {
-		name: "u-action-sheet",
-		// 一些props参数和methods方法,通过mixin混入,因为其他文件也会用到
-		mixins: [openType, buttonMixin, mixin, props],
-		data() {
-			return {
-
-			}
-		},
-		computed: {
-			// 操作项目的样式
-			itemStyle() {
-				return (index) => {
-					let style = {};
-					if (this.actions[index].color) style.color = this.actions[index].color
-					if (this.actions[index].fontSize) style.fontSize = addUnit(this.actions[index].fontSize)
-					// 选项被禁用的样式
-					if (this.actions[index].disabled) style.color = '#c0c4cc'
-					return style;
-				}
-			},
-		},
-		emits: ["close", "select", "update:show"],
-		methods: {
-			// 关闭操作菜单事件处理
-			closeHandler() {
-				// 允许点击遮罩关闭时,才发出close事件
-				if(this.closeOnClickOverlay) {
-					this.$emit('update:show', false)
-					this.$emit('close')
-				}
-			},
-			// 点击取消按钮
-			cancel() {
-				this.$emit('update:show', false)
-				this.$emit('close')
-			},
-			// 选择操作项处理
-			selectHandler(index) {
-				const item = this.actions[index]
-				if (item && !item.disabled && !item.loading) {
-					this.$emit('select', item)
-					if (this.closeOnClickAction) {
-						this.$emit('update:show', false)
-						this.$emit('close')
-					}
-				}
-			},
-			// 动态处理Hover时候第一个item的圆角
-			getItemHoverStyle(index) {
-				if (index === 0 && this.round && !this.title && !this.description) {
-					return {
-						borderTopLeftRadius: `${this.round}px`,
-						borderTopRightRadius: `${this.round}px`,
-					}
-				}
-				return {}
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	$u-action-sheet-reset-button-width:100% !default;
-	$u-action-sheet-title-font-size: 16px !default;
-	$u-action-sheet-title-padding: 12px 30px !default;
-	$u-action-sheet-title-color: $u-main-color !default;
-	$u-action-sheet-header-icon-wrap-right:15px !default;
-	$u-action-sheet-header-icon-wrap-top:15px !default;
-	$u-action-sheet-description-font-size:13px !default;
-	$u-action-sheet-description-color:14px !default;
-	$u-action-sheet-description-margin: 18px 15px !default;
-	$u-action-sheet-item-wrap-item-padding:17px !default;
-	$u-action-sheet-item-wrap-name-font-size:16px !default;
-	$u-action-sheet-item-wrap-subname-font-size:13px !default;
-	$u-action-sheet-item-wrap-subname-color: #c0c4cc !default;
-	$u-action-sheet-item-wrap-subname-margin-top:10px !default;
-	$u-action-sheet-cancel-text-font-size:16px !default;
-	$u-action-sheet-cancel-text-color:$u-content-color !default;
-	$u-action-sheet-cancel-text-font-size:15px !default;
-	$u-action-sheet-cancel-text-hover-background-color:rgb(242, 243, 245) !default;
-
-	.u-reset-button {
-		width: $u-action-sheet-reset-button-width;
-	}
-
-	.u-action-sheet {
-		text-align: center;
-		&__header {
-			position: relative;
-			padding: $u-action-sheet-title-padding;
-			&__title {
-				font-size: $u-action-sheet-title-font-size;
-				color: $u-action-sheet-title-color;
-				font-weight: bold;
-				text-align: center;
-			}
-
-			&__icon-wrap {
-				position: absolute;
-				right: $u-action-sheet-header-icon-wrap-right;
-				top: $u-action-sheet-header-icon-wrap-top;
-			}
-		}
-
-		&__description {
-			font-size: $u-action-sheet-description-font-size;
-			color: $u-tips-color;
-			margin: $u-action-sheet-description-margin;
-			text-align: center;
-		}
-
-		&__item-wrap {
-
-			&__item {
-				padding: $u-action-sheet-item-wrap-item-padding;
-				@include flex;
-				align-items: center;
-				justify-content: center;
-				flex-direction: column;
-
-				&__name {
-					font-size: $u-action-sheet-item-wrap-name-font-size;
-					color: $u-main-color;
-					text-align: center;
-				}
-
-				&__subname {
-					font-size: $u-action-sheet-item-wrap-subname-font-size;
-					color: $u-action-sheet-item-wrap-subname-color;
-					margin-top: $u-action-sheet-item-wrap-subname-margin-top;
-					text-align: center;
-				}
-			}
-		}
-
-		&__cancel-text {
-			font-size: $u-action-sheet-cancel-text-font-size;
-			color: $u-action-sheet-cancel-text-color;
-			text-align: center;
-			// padding: $u-action-sheet-cancel-text-font-size;
-		}
-
-		&--hover {
-			background-color: $u-action-sheet-cancel-text-hover-background-color;
-		}
-	}
-</style>

+ 0 - 76
uni_modules/uview-plus/components/u-agreement/u-agreement.vue

@@ -1,76 +0,0 @@
-<style scoped lang="scss">
-    .agreement-content {
-        width: 100%;;
-        display: inline-block;
-        flex-direction: column;
-        .agreement-url {
-            display: inline-block;
-            color: blue;
-            // #ifdef H5
-            cursor: pointer;
-            // #endif
-        }
-    }
-</style>
-
-<template>
-    <view class="up-agreement">
-        <up-modal v-model:show="show" showCancelButton @confirm="confirm" @cancel="close" confirmText="阅读并同意">
-            <view class="agreement-content">
-                <slot>
-                    我们非常重视您的个人信息和隐私保护。为了更好地保障您的个人权益,在您使用我们的产品前,
-                    请务必审慎阅读《<text class="agreement-url" @click="urlClick('urlProtocol')">用户协议</text>》
-                    和《<text class="agreement-url" @click="urlClick('urlPrivacy')">隐私政策</text>》内的所有条款,
-                    尤其是:1.我们对您的个人信息的收集/保存/使用/对外提供/保护等规则条款,以及您的用户权利等条款;2. 约定我们的限制责任、免责
-                    条款;3.其他以颜色或加粗进行标识的重要条款。如您对以上协议有任何疑问,请先不要同意,您点击“同意并继续”的行为即表示您已阅读
-                    完毕并同意以上协议的全部内容。
-                </slot>
-            </view>
-        </up-modal>
-    </view>
-</template>
-
-<script>
-    export default {
-        name: 'up-agreement',
-        props: {
-            urlProtocol: {
-                type: String,
-                default: '/pages/user_agreement/agreement/info?title=用户协议'
-            },
-            urlPrivacy: {
-                type: String,
-                default: '/pages/user_agreement/agreement/info?title=隐私政策'
-            },
-        },
-        emits: ['confirm'],
-        data() {
-            return {
-                show: false
-            }
-        },
-        methods: {
-            close() {
-                // #ifdef H5
-                window.opener = null;
-                window.close();
-                // #endif
-                // #ifdef APP-PLUS
-                plus.runtime.quit();
-                // #endif
-            },
-            confirm() {
-                this.show = false;
-                this.$emit('confirm', 1);
-            },
-            showModal() {
-                this.show = true;
-            },
-            urlClick(type) {
-                uni.navigateTo({
-                    url: this[type]
-                });
-            }
-        }
-    }
-</script>

+ 0 - 28
uni_modules/uview-plus/components/u-album/album.js

@@ -1,28 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-08-16 16:32:24
- * @FilePath     : /uview-plus/libs/config/props/album.js
- */
-export default {
-    // album 组件
-    album: {
-        urls: [],
-        keyName: '',
-        singleSize: 180,
-        multipleSize: 70,
-        space: 6,
-        singleMode: 'scaleToFill',
-        multipleMode: 'aspectFill',
-        maxCount: 9,
-        previewFullImage: true,
-        rowCount: 3,
-        showMore: true,
-        autoWrap: false,
-        unit: 'px',
-        stop: true,
-    }
-}

+ 0 - 95
uni_modules/uview-plus/components/u-album/props.js

@@ -1,95 +0,0 @@
-/*
- * @Author       : jry
- * @Description  :
- * @version      : 3.0
- * @LastAuthor   : jry
- * @lastTime     : 2025-08-16 16:35:24
- * @FilePath     : /uview-plus/components/u-album/props.js
- */
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const props = defineMixin({
-    props: {
-        // 图片地址,Array<String>|Array<Object>形式
-        urls: {
-            type: Array,
-            default: () => defProps.album.urls
-        },
-        // 指定从数组的对象元素中读取哪个属性作为图片地址
-        keyName: {
-            type: String,
-            default: () => defProps.album.keyName
-        },
-        // 单图时,图片长边的长度
-        singleSize: {
-            type: [String, Number],
-            default: () => defProps.album.singleSize
-        },
-        // 多图时,图片边长
-        multipleSize: {
-            type: [String, Number],
-            default: () => defProps.album.multipleSize
-        },
-        // 多图时,图片水平和垂直之间的间隔
-        space: {
-            type: [String, Number],
-            default: () => defProps.album.space
-        },
-        // 单图时,图片缩放裁剪的模式
-        singleMode: {
-            type: String,
-            default: () => defProps.album.singleMode
-        },
-        // 多图时,图片缩放裁剪的模式
-        multipleMode: {
-            type: String,
-            default: () => defProps.album.multipleMode
-        },
-        // 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量
-        maxCount: {
-            type: [String, Number],
-            default: () => defProps.album.maxCount
-        },
-        // 是否可以预览图片
-        previewFullImage: {
-            type: Boolean,
-            default: () => defProps.album.previewFullImage
-        },
-        // 每行展示图片数量,如设置,singleSize和multipleSize将会无效
-        rowCount: {
-            type: [String, Number],
-            default: () => defProps.album.rowCount
-        },
-        // 超出maxCount时是否显示查看更多的提示
-        showMore: {
-            type: Boolean,
-            default: () => defProps.album.showMore
-        },
-        // 图片形状,circle-圆形,square-方形
-        shape: {
-            type: String,
-            default: () => defProps.image.shape
-        },
-        // 圆角,单位任意
-        radius: {
-            type: [String, Number],
-            default: () => defProps.image.radius
-        },
-        // 自适应换行
-        autoWrap: {
-            type: Boolean,
-            default: () => defProps.album.autoWrap
-        },
-        // 单位
-        unit: {
-            type: [String],
-            default: () => defProps.album.unit
-        },
-        // 阻止点击冒泡
-        stop: {
-            type: Boolean,
-            default: () => defProps.album.stop
-        }
-    }
-})

+ 0 - 344
uni_modules/uview-plus/components/u-album/u-album.vue

@@ -1,344 +0,0 @@
-<template>
-    <view class="u-album">
-        <!-- 相册行容器,每行显示 rowCount 个图片 -->
-        <view
-            class="u-album__row"
-            ref="u-album__row"
-            v-for="(arr, index) in showUrls"
-            :forComputedUse="albumWidth"
-            :key="index"
-            :style="{flexWrap: autoWrap ? 'wrap' : 'nowrap'}"
-        >
-            <!-- 图片包装容器 -->
-            <view
-                class="u-album__row__wrapper"
-                v-for="(item, index1) in arr"
-                :key="index1"
-                :style="[imageStyle(index + 1, index1 + 1)]"
-                @tap="onPreviewTap($event, getSrc(item))"
-            >
-                <!-- 图片显示 -->
-                <image
-                    :src="getSrc(item)"
-                    :mode="
-                        urls.length === 1
-                            ? imageHeight > 0
-                                ? singleMode
-                                : 'widthFix'
-                            : multipleMode
-                    "
-                    :style="[
-                        {
-                            width: imageWidth,
-                            height: imageHeight,
-                            borderRadius: shape == 'circle' ? '10000px' : addUnit(radius)
-                        }
-                    ]"
-                ></image>
-                <!-- 超出最大显示数量时的更多提示 -->
-                <view
-                    v-if="
-                        showMore &&
-                        urls.length > rowCount * showUrls.length &&
-                        index === showUrls.length - 1 &&
-                        index1 === showUrls[showUrls.length - 1].length - 1
-                    "
-                    class="u-album__row__wrapper__text"
-                    :style="{
-					    borderRadius: shape == 'circle' ? '50%' : addUnit(radius),
-				    }"
-                >
-                    <up-text
-                        :text="`+${urls.length - maxCount}`"
-                        color="#fff"
-                        :size="multipleSize * 0.3"
-                        align="center"
-                        customStyle="justify-content: center"
-                    ></up-text>
-                </view>
-            </view>
-        </view>
-    </view>
-</template>
-
-<script>
-import { props } from './props';
-import { mpMixin } from '../../libs/mixin/mpMixin';
-import { mixin } from '../../libs/mixin/mixin';
-import { addUnit, sleep } from '../../libs/function/index';
-import test from '../../libs/function/test';
-// #ifdef APP-NVUE
-// 不支持百分比单位,这里需要通过dom查询组件的宽度
-const dom = uni.requireNativePlugin('dom')
-// #endif
-
-/**
- * Album 相册
- * @description 本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。减少重复的模板代码
- * @tutorial https://uview-plus.jiangruyi.com/components/album.html
- *
- * @property {Array}           urls             图片地址列表 Array<String>|Array<Object>形式
- * @property {String}          keyName          指定从数组的对象元素中读取哪个属性作为图片地址
- * @property {String | Number} singleSize       单图时,图片长边的长度  (默认 180 )
- * @property {String | Number} multipleSize     多图时,图片边长 (默认 70 )
- * @property {String | Number} space            多图时,图片水平和垂直之间的间隔 (默认 6 )
- * @property {String}          singleMode       单图时,图片缩放裁剪的模式 (默认 'scaleToFill' )
- * @property {String}          multipleMode     多图时,图片缩放裁剪的模式 (默认 'aspectFill' )
- * @property {String | Number} maxCount         取消按钮的提示文字 (默认 9 )
- * @property {Boolean}         previewFullImage 是否可以预览图片 (默认 true )
- * @property {String | Number} rowCount         每行展示图片数量,如设置,singleSize和multipleSize将会无效	(默认 3 )
- * @property {Boolean}         showMore         超出maxCount时是否显示查看更多的提示 (默认 true )
- * @property {String}          shape            图片形状,circle-圆形,square-方形 (默认 'square' )
- * @property {String | Number} radius           圆角值,单位任意,如果为数值,则为px单位 (默认 0 )
- * @property {Boolean}         autoWrap         自适应换行模式,不受rowCount限制,图片会自动换行 (默认 false )
- * @property {String}          unit             图片单位 (默认 px )
- * @event    {Function}        albumWidth       某些特殊的情况下,需要让文字与相册的宽度相等,这里事件的形式对外发送  (回调参数 width )
- * @example <u-album :urls="urls2" @albumWidth="width => albumWidth = width" multipleSize="68" ></u-album>
- */
-export default {
-    name: 'u-album',
-    mixins: [mpMixin, mixin, props],
-    data() {
-        return {
-            // 单图的宽度
-            singleWidth: 0,
-            // 单图的高度
-            singleHeight: 0,
-            // 单图时,如果无法获取图片的尺寸信息,让图片宽度默认为容器的一定百分比
-            singlePercent: 0.6
-        }
-    },
-    watch: {
-        urls: {
-            immediate: true,
-            handler(newVal) {
-                // 当只有一张图片时,获取图片尺寸信息
-                if (newVal.length === 1) {
-                    this.getImageRect()
-                }
-            }
-        }
-    },
-    computed: {
-        /**
-         * 计算图片样式
-         * @param {Number} index1 - 行索引
-         * @param {Number} index2 - 列索引
-         * @returns {Object} 图片样式对象
-         */
-        imageStyle() {
-            return (index1, index2) => {
-                const { space, rowCount, multipleSize, urls } = this,
-                    rowLen = this.showUrls.length,
-                    allLen = this.urls.length
-                const style = {
-                    marginRight: addUnit(space),
-                    marginBottom: addUnit(space)
-                }
-                // 如果为最后一行,则每个图片都无需下边框
-                if (index1 === rowLen && !this.autoWrap) style.marginBottom = 0
-                // 每行的最右边一张和总长度的最后一张无需右边框
-                if (!this.autoWrap) {
-                    if (
-                        index2 === rowCount ||
-                        (index1 === rowLen &&
-                            index2 === this.showUrls[index1 - 1].length)
-                    )
-                        style.marginRight = 0
-                }
-                return style
-            }
-        },
-        /**
-         * 将图片地址数组划分为二维数组,用于按行显示
-         * @returns {Array} 二维数组,每个子数组代表一行图片
-         */
-        showUrls() {
-            if (this.autoWrap) {
-                // 自动换行模式下,所有图片放在一行中显示
-                return [ this.urls.slice(0, this.maxCount) ];
-            } else {
-                // 固定行数模式下,按 rowCount 分割图片
-                const arr = []
-                this.urls.map((item, index) => {
-                    // 限制最大展示数量
-                    if (index + 1 <= this.maxCount) {
-                        // 计算该元素为第几个素组内
-                        const itemIndex = Math.floor(index / this.rowCount)
-                        // 判断对应的索引是否存在
-                        if (!arr[itemIndex]) {
-                            arr[itemIndex] = []
-                        }
-                        arr[itemIndex].push(item)
-                    }
-                })
-                return arr
-            }
-        },
-        /**
-         * 计算图片宽度
-         * @returns {String} 图片宽度样式值
-         */
-        imageWidth() {
-            return addUnit(
-                this.urls.length === 1 ? this.singleWidth : this.multipleSize, this.unit
-            )
-        },
-        /**
-         * 计算图片高度
-         * @returns {String} 图片高度样式值
-         */
-        imageHeight() {
-            return addUnit(
-                this.urls.length === 1 ? this.singleHeight : this.multipleSize, this.unit
-            )
-        },
-        /**
-         * 计算相册总宽度,用于外部组件对齐
-         * 此变量无实际用途,仅仅是为了利用computed特性,让其在urls长度等变化时,重新计算图片的宽度
-         * @returns {Number} 相册宽度
-         */
-        albumWidth() {
-            let width = 0
-            if (this.urls.length === 1) {
-                width = this.singleWidth
-            } else {
-                width =
-                    this.showUrls[0].length * this.multipleSize +
-                    this.space * (this.showUrls[0].length - 1)
-            }
-            this.$emit('albumWidth', width)
-            return width
-        }
-    },
-    emits: ['preview', 'albumWidth'],
-    methods: {
-        addUnit,
-        /**
-         * 点击图片预览
-         * @param {Event} e - 点击事件对象
-         * @param {String} url - 当前点击图片的地址
-         */
-        onPreviewTap(e, url) {
-            // 获取所有图片地址
-            const urls = this.urls.map((item) => {
-                return this.getSrc(item)
-            })
-            if (this.previewFullImage) {
-                // 使用系统默认预览图片功能
-                uni.previewImage({
-                    current: url,
-                    urls
-                })
-                // 是否阻止事件传播
-                this.stop && this.preventEvent(e)
-            } else {
-                // 发送自定义预览事件
-                this.$emit('preview', {
-                    urls,
-                    currentIndex: urls.indexOf(url)
-                })
-            }
-        },
-        /**
-         * 获取图片地址
-         * @param {String|Object} item - 图片项,可以是字符串或对象
-         * @returns {String} 图片地址
-         */
-        getSrc(item) {
-            return test.object(item)
-                ? (this.keyName && item[this.keyName]) || item.src
-                : item
-        },
-        /**
-         * 单图时,获取图片的尺寸
-         * 在小程序中,需要将网络图片的的域名添加到小程序的download域名才可能获取尺寸
-         * 在没有添加的情况下,让单图宽度默认为盒子的一定宽度(singlePercent)
-         */
-        getImageRect() {
-            const src = this.getSrc(this.urls[0])
-            uni.getImageInfo({
-                src,
-                success: (res) => {
-                    let singleSize = this.singleSize;
-                    // 单位
-                    let unit = '';
-                    if (Number.isNaN(Number(this.singleSize))) {
-                        // 大小中有字符 则记录字符
-                        unit = this.singleSize.replace(/\d+/g, ''); // 单位
-                        singleSize = Number(this.singleSize.replace(/\D+/g, ''), 10); // 具体值
-                    }
-
-                    // 判断图片横向还是竖向展示方式
-                    const isHorizotal = res.width >= res.height
-                    this.singleWidth = isHorizotal
-                        ? singleSize
-                        : (res.width / res.height) * singleSize
-                    this.singleHeight = !isHorizotal
-                        ? singleSize
-                        : (res.height / res.width) * this.singleWidth
-
-                    // 如果有单位统一设置单位
-                    if(unit != null && unit !== ''){
-                        this.singleWidth = this.singleWidth + unit
-                        this.singleHeight = this.singleHeight + unit
-                    }
-                },
-                fail: () => {
-                    // 获取图片信息失败时,通过组件宽度计算
-                    this.getComponentWidth()
-                }
-            })
-        },
-        /**
-         * 获取组件的宽度,用于计算单图显示尺寸
-         */
-        async getComponentWidth() {
-            // 延时一定时间,以获取dom尺寸
-            await sleep(30)
-            // #ifndef APP-NVUE
-            // H5、小程序等平台通过 $uGetRect 获取组件宽度
-            this.$uGetRect('.u-album__row').then((size) => {
-                this.singleWidth = size.width * this.singlePercent
-            })
-            // #endif
-
-            // #ifdef APP-NVUE
-            // NVUE 平台通过 dom 插件获取组件宽度
-            // 这里ref="u-album__row"所在的标签为通过for循环出来,导致this.$refs['u-album__row']是一个数组
-            const ref = this.$refs['u-album__row'][0]
-            ref &&
-                dom.getComponentRect(ref, (res) => {
-                    this.singleWidth = res.size.width * this.singlePercent
-                })
-            // #endif
-        }
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-.u-album {
-    @include flex(column);
-
-    &__row {
-        @include flex(row);
-
-        &__wrapper {
-            position: relative;
-
-            &__text {
-                position: absolute;
-                top: 0;
-                left: 0;
-                right: 0;
-                bottom: 0;
-                background-color: rgba(0, 0, 0, 0.3);
-                @include flex(row);
-                justify-content: center;
-                align-items: center;
-            }
-        }
-    }
-}
-</style>

+ 0 - 26
uni_modules/uview-plus/components/u-alert/alert.js

@@ -1,26 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-08-17 17:23:53
- * @FilePath     : /uview-plus/libs/config/props/alert.js
- */
-export default {
-    // alert警告组件
-    alert: {
-        title: '',
-        type: 'warning',
-        description: '',
-        closable: false,
-        showIcon: false,
-        effect: 'light',
-        center: false,
-        fontSize: 14,
-        transitionMode: 'fade',
-        duration: 0,
-        icon: '',
-        value: true
-    }
-}

+ 0 - 75
uni_modules/uview-plus/components/u-alert/props.js

@@ -1,75 +0,0 @@
-/*
- * @Author       : jry
- * @Description  :
- * @version      : 3.0
- * @LastAuthor   : jry
- * @lastTime     : 2025-08-17 17:23:53
- * @FilePath     : /uview-plus/libs/config/props/props.js
- */
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const props = defineMixin({
-    props: {
-        // 显示文字
-        title: {
-            type: String,
-            default: () => defProps.alert.title
-        },
-        // 主题,success/warning/info/error
-        type: {
-            type: String,
-            default: () => defProps.alert.type
-        },
-        // 辅助性文字
-        description: {
-            type: String,
-            default: () => defProps.alert.description
-        },
-        // 是否可关闭
-        closable: {
-            type: Boolean,
-            default: () => defProps.alert.closable
-        },
-        // 是否显示图标
-        showIcon: {
-            type: Boolean,
-            default: () => defProps.alert.showIcon
-        },
-        // 浅或深色调,light-浅色,dark-深色
-        effect: {
-            type: String,
-            default: () => defProps.alert.effect
-        },
-        // 文字是否居中
-        center: {
-            type: Boolean,
-            default: () => defProps.alert.center
-        },
-        // 字体大小
-        fontSize: {
-            type: [String, Number],
-            default: () => defProps.alert.fontSize
-        },
-        // 动画类型
-        transitionMode: {
-            type: [String],
-            default: () => defProps.alert.transitionMode
-        },
-        // 自动定时关闭毫秒
-        duration: {
-            type: [Number],
-            default: () => defProps.alert.duration
-        },
-        // 自定义图标
-        icon: {
-            type: [String],
-            default: () => defProps.alert.icon
-        },
-        // 是否显示
-        modelValue: {
-            type: [Boolean],
-            default: () => defProps.alert.value
-        }
-    }
-})

+ 0 - 293
uni_modules/uview-plus/components/u-alert/u-alert.vue

@@ -1,293 +0,0 @@
-<template>
-	<up-transition
-	    :mode="transitionMode"
-	    :show="show"
-	>
-		<view
-		    class="u-alert"
-		    :class="[`u-alert--${type}--${effect}`]"
-		    @tap.stop="clickHandler"
-		    :style="[addStyle(customStyle)]"
-		>
-			<!-- 左侧图标 -->
-			<view
-			    class="u-alert__icon"
-			    v-if="showIcon"
-			>
-				<up-icon
-				    :name="iconName"
-				    size="18"
-				    :color="iconColor"
-				></up-icon>
-			</view>
-			<!-- 内容区域 -->
-			<view
-			    class="u-alert__content"
-			    :style="[{
-					paddingRight: closable ? '20px' : 0
-				}]"
-			>
-				<!-- 标题 -->
-				<text
-				    class="u-alert__content__title"
-				    v-if="title"
-					:style="[{
-						fontSize: addUnit(fontSize),
-						textAlign: center ? 'center' : 'left'
-					}]"
-				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
-				>{{ title }}</text>
-				<!-- 描述信息 -->
-				<text
-				    class="u-alert__content__desc"
-					v-if="description"
-					:style="[{
-						fontSize: addUnit(fontSize),
-						textAlign: center ? 'center' : 'left'
-					}]"
-				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
-				>{{ description }}</text>
-			</view>
-			<!-- 关闭按钮 -->
-			<view
-			    class="u-alert__close"
-			    v-if="closable"
-			    @tap.stop="closeHandler"
-			>
-				<slot name="close">
-					<up-icon
-					    name="close"
-					    :color="iconColor"
-					    size="15"
-					></up-icon>
-				</slot>
-			</view>
-		</view>
-	</up-transition>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addUnit, addStyle } from '../../libs/function/index';
-	/**
-	 * Alert  警告提示
-	 * @description 警告提示,展现需要关注的信息。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/alertTips.html
-	 * 
-	 * @property {String}			title       显示的文字 
-	 * @property {String}			type        使用预设的颜色 (默认 'warning' )
-	 * @property {String}			description 辅助性文字,颜色比title浅一点,字号也小一点,可选  
-	 * @property {Boolean}			closable    关闭按钮(默认为叉号icon图标)  (默认 false )
-	 * @property {Boolean}			showIcon    是否显示左边的辅助图标   ( 默认 false )
-	 * @property {String}			effect      多图时,图片缩放裁剪的模式  (默认 'light' )
-	 * @property {Boolean}			center		文字是否居中  (默认 false )
-	 * @property {String | Number}	fontSize    字体大小  (默认 14 )
-	 * @property {Object}			customStyle	定义需要用到的外部样式
-	 * @property {String}			transitionMode 过渡动画模式 (默认 'fade' )
-	 * @property {String | Number}	duration	自动关闭延时(毫秒),设置为0或负数则不自动关闭 (默认 0 )
-	 * @property {String}			icon		自定义图标名称,优先级高于type默认图标
-	 * @property {Boolean}			modelValue/v-model	绑定值,控制是否显示 (默认 true )
-	 * @event    {Function}        click       点击组件时触发
-	 * @event    {Function}        close       点击关闭按钮时触发
-	 * @event    {Function}        closed      关闭动画结束时触发
-	 * @example  <up-alert :title="title"  type = "warning" :closable="closable" :description = "description"></up-alert>
-	 */
-	export default {
-		name: 'u-alert',
-		mixins: [mpMixin, mixin, props],
-		data() {
-			return {
-				// 控制组件显示隐藏
-				show: true
-			}
-		},
-		computed: {
-			// 根据不同的主题类型返回对应的图标颜色
-			iconColor() {
-				return this.effect === 'light' ? this.type : '#fff'
-			},
-			// 不同主题对应不同的图标
-			iconName() {
-				// 如果用户自定义了图标,则优先使用自定义图标
-				if (this.icon) return this.icon;
-				
-				switch (this.type) {
-					case 'success':
-						return 'checkmark-circle-fill';
-						break;
-					case 'error':
-						return 'close-circle-fill';
-						break;
-					case 'warning':
-						return 'error-circle-fill';
-						break;
-					case 'info':
-						return 'info-circle-fill';
-						break;
-					case 'primary':
-						return 'more-circle-fill';
-						break;
-					default: 
-						return 'error-circle-fill';
-				}
-			}
-		},
-		emits: ["click","close", "closed", "update:modelValue"],
-		watch: {
-			modelValue: {
-				handler(newVal) {
-					this.show = newVal;
-				},
-				immediate: true
-			},
-			show: {
-				handler(newVal) {
-					this.$emit('update:modelValue', newVal);
-					
-					// 如果是从显示到隐藏,且启用了自动关闭功能
-					if (!newVal && this.duration > 0) {
-						this.$emit('closed');
-					}
-				}
-			}
-		},
-		mounted() {
-			// 如果设置了自动关闭时间,则在指定时间后自动关闭
-			if (this.duration > 0) {
-				setTimeout(() => {
-					this.closeHandler();
-				}, this.duration);
-			}
-		},
-		methods: {
-			addUnit,
-			addStyle,
-			// 点击内容区域触发click事件
-			clickHandler() {
-				this.$emit('click')
-			},
-			// 点击关闭按钮触发close事件并隐藏组件
-			closeHandler() {
-				this.show = false   
-				this.$emit('close');
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	.u-alert {
-		position: relative;
-		background-color: $u-primary;
-		padding: 8px 10px;
-		@include flex(row);
-		align-items: center;
-		border-top-left-radius: 4px;
-		border-top-right-radius: 4px;
-		border-bottom-left-radius: 4px;
-		border-bottom-right-radius: 4px;
-
-		&--primary--dark {
-			background-color: $u-primary;
-		}
-
-		&--primary--light {
-			background-color: #ecf5ff;
-		}
-
-		&--error--dark {
-			background-color: $u-error;
-		}
-
-		&--error--light {
-			background-color: #FEF0F0;
-		}
-
-		&--success--dark {
-			background-color: $u-success;
-		}
-
-		&--success--light {
-			background-color: #f5fff0;
-		}
-
-		&--warning--dark {
-			background-color: $u-warning;
-		}
-
-		&--warning--light {
-			background-color: #FDF6EC;
-		}
-
-		&--info--dark {
-			background-color: $u-info;
-		}
-
-		&--info--light {
-			background-color: #f4f4f5;
-		}
-
-		&__icon {
-			margin-right: 5px;
-		}
-
-		&__content {
-			@include flex(column);
-			flex: 1;
-
-			&__title {
-				color: $u-main-color;
-				font-size: 14px;
-				font-weight: bold;
-				color: #fff;
-				margin-bottom: 2px;
-			}
-
-			&__desc {
-				color: $u-main-color;
-				font-size: 14px;
-				flex-wrap: wrap;
-				color: #fff;
-			}
-		}
-
-		&__title--dark,
-		&__desc--dark {
-			color: #FFFFFF;
-		}
-
-		&__text--primary--light,
-		&__text--primary--light {
-			color: $u-primary;
-		}
-
-		&__text--success--light,
-		&__text--success--light {
-			color: $u-success;
-		}
-
-		&__text--warning--light,
-		&__text--warning--light {
-			color: $u-warning;
-		}
-
-		&__text--error--light,
-		&__text--error--light {
-			color: $u-error;
-		}
-
-		&__text--info--light,
-		&__text--info--light {
-			color: $u-info;
-		}
-
-		&__close {
-			position: absolute;
-			top: 11px;
-			right: 10px;
-		}
-	}
-</style>

+ 0 - 23
uni_modules/uview-plus/components/u-avatar-group/avatarGroup.js

@@ -1,23 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/avatarGroup.js
- */
-export default {
-    // avatarGroup 组件
-    avatarGroup: {
-        urls: [],
-        maxCount: 5,
-        shape: 'circle',
-        mode: 'scaleToFill',
-        showMore: true,
-        size: 40,
-        keyName: '',
-        gap: 0.5,
-		extraValue: 0
-    }
-}

+ 0 - 54
uni_modules/uview-plus/components/u-avatar-group/props.js

@@ -1,54 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        // 头像图片组
-        urls: {
-            type: Array,
-            default: () => defProps.avatarGroup.urls
-        },
-        // 最多展示的头像数量
-        maxCount: {
-            type: [String, Number],
-            default: () => defProps.avatarGroup.maxCount
-        },
-        // 头像形状
-        shape: {
-            type: String,
-            default: () => defProps.avatarGroup.shape
-        },
-        // 图片裁剪模式
-        mode: {
-            type: String,
-            default: () => defProps.avatarGroup.mode
-        },
-        // 超出maxCount时是否显示查看更多的提示
-        showMore: {
-            type: Boolean,
-            default: () => defProps.avatarGroup.showMore
-        },
-        // 头像大小
-        size: {
-            type: [String, Number],
-            default: () => defProps.avatarGroup.size
-        },
-        // 指定从数组的对象元素中读取哪个属性作为图片地址
-        keyName: {
-            type: String,
-            default: () => defProps.avatarGroup.keyName
-        },
-		// 头像之间的遮挡比例
-        gap: {
-            type: [String, Number],
-            validator(value) {
-                return value >= 0 && value <= 1
-            },
-            default: () => defProps.avatarGroup.gap
-        },
-		// 需额外显示的值
-		extraValue: {
-			type: [Number, String],
-			default: () => defProps.avatarGroup.extraValue
-		}
-    }
-})

+ 0 - 109
uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue

@@ -1,109 +0,0 @@
-<template>
-	<view class="u-avatar-group">
-		<view
-		    class="u-avatar-group__item"
-		    v-for="(item, index) in showUrl"
-		    :key="index"
-		    :style="{
-				marginLeft: index === 0 ? 0 : addUnit(-size * gap)
-			}"
-		>
-			<u-avatar
-			    :size="size"
-			    :shape="shape"
-			    :mode="mode"
-			    :src="testObject(item) ? keyName && item[keyName] || item.url : item"
-			></u-avatar>
-			<view
-			    class="u-avatar-group__item__show-more"
-			    v-if="showMore && index === showUrl.length - 1 && (urls.length > maxCount || extraValue > 0)"
-				@tap="clickHandler"
-			>
-				<up-text
-				    color="#ffffff"
-				    :size="size * 0.4"
-				    :text="`+${extraValue || urls.length - showUrl.length}`"
-					align="center"
-					customStyle="justify-content: center"
-				></up-text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addUnit } from '../../libs/function/index';
-	import test from '../../libs/function/test';
-	/**
-	 * AvatarGroup  头像组
-	 * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/avatar.html
-	 * 
-	 * @property {Array}           urls     头像图片组 (默认 [] )
-	 * @property {String | Number} maxCount 最多展示的头像数量 ( 默认 5 )
-	 * @property {String}          shape    头像形状( 'circle' (默认) | 'square' )
-	 * @property {String}          mode     图片裁剪模式(默认 'scaleToFill' )
-	 * @property {Boolean}         showMore 超出maxCount时是否显示查看更多的提示 (默认 true )
-	 * @property {String | Number} size      头像大小 (默认 40 )
-	 * @property {String}          keyName  指定从数组的对象元素中读取哪个属性作为图片地址 
-	 * @property {String | Number} gap      头像之间的遮挡比例(0.4代表遮挡40%)  (默认 0.5 )
-	 * @property {String | Number} extraValue  需额外显示的值
-	 * @event    {Function}        showMore 头像组更多点击
-	 * @example  <u-avatar-group:urls="urls" size="35" gap="0.4" ></u-avatar-group:urls=>
-	 */
-	export default {
-		name: 'u-avatar-group',
-		mixins: [mpMixin, mixin, props],
-		data() {
-			return {
-
-			}
-		},
-		computed: {
-			showUrl() {
-				return this.urls.slice(0, this.maxCount)
-			}
-		},
-		emits: ["showMore"],
-		methods: {
-			addUnit,
-			testObject: test.object,
-			clickHandler() {
-				this.$emit('showMore')
-			}
-		},
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	.u-avatar-group {
-		@include flex;
-
-		&__item {
-			margin-left: -10px;
-			position: relative;
-
-			&--no-indent {
-				// 如果你想质疑作者不会使用:first-child,说明你太年轻,因为nvue不支持
-				margin-left: 0;
-			}
-
-			&__show-more {
-				position: absolute;
-				top: 0;
-				bottom: 0;
-				left: 0;
-				right: 0;
-				background-color: rgba(0, 0, 0, 0.3);
-				@include flex;
-				align-items: center;
-				justify-content: center;
-				border-radius: 100px;
-			}
-		}
-	}
-</style>

+ 0 - 28
uni_modules/uview-plus/components/u-avatar/avatar.js

@@ -1,28 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/avatar.js
- */
-export default {
-    // avatar 组件
-    avatar: {
-        src: '',
-        shape: 'circle',
-        size: 40,
-        mode: 'scaleToFill',
-        text: '',
-        bgColor: '#c0c4cc',
-        color: '#ffffff',
-        fontSize: 18,
-        icon: '',
-        mpAvatar: false,
-        randomBgColor: false,
-        defaultUrl: '',
-        colorIndex: '',
-        name: ''
-    }
-}

+ 0 - 81
uni_modules/uview-plus/components/u-avatar/props.js

@@ -1,81 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-import test from '../../libs/function/test';
-export const props = defineMixin({
-    props: {
-        // 头像图片路径(不能为相对路径)
-        src: {
-            type: String,
-            default: () => defProps.avatar.src
-        },
-        // 头像形状,circle-圆形,square-方形
-        shape: {
-            type: String,
-            default: () => defProps.avatar.shape
-        },
-        // 头像尺寸
-        size: {
-            type: [String, Number],
-            default: () => defProps.avatar.size
-        },
-        // 裁剪模式
-        mode: {
-            type: String,
-            default: () => defProps.avatar.mode
-        },
-        // 显示的文字
-        text: {
-            type: String,
-            default: () => defProps.avatar.text
-        },
-        // 背景色
-        bgColor: {
-            type: String,
-            default: () => defProps.avatar.bgColor
-        },
-        // 文字颜色
-        color: {
-            type: String,
-            default: () => defProps.avatar.color
-        },
-        // 文字大小
-        fontSize: {
-            type: [String, Number],
-            default: () => defProps.avatar.fontSize
-        },
-        // 显示的图标
-        icon: {
-            type: String,
-            default: () => defProps.avatar.icon
-        },
-        // 显示小程序头像,只对百度,微信,QQ小程序有效
-        mpAvatar: {
-            type: Boolean,
-            default: () => defProps.avatar.mpAvatar
-        },
-        // 是否使用随机背景色
-        randomBgColor: {
-            type: Boolean,
-            default: () => defProps.avatar.randomBgColor
-        },
-        // 加载失败的默认头像(组件有内置默认图片)
-        defaultUrl: {
-            type: String,
-            default: () => defProps.avatar.defaultUrl
-        },
-        // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
-        colorIndex: {
-            type: [String, Number],
-            // 校验参数规则,索引在0-19之间
-            validator(n) {
-                return test.range(n, [0, 19]) || n === ''
-            },
-            default: () => defProps.avatar.colorIndex
-        },
-        // 组件标识符
-        name: {
-            type: String,
-            default: () => defProps.avatar.name
-        }
-    }
-})

File diff suppressed because it is too large
+ 0 - 61
uni_modules/uview-plus/components/u-avatar/u-avatar.vue


+ 0 - 27
uni_modules/uview-plus/components/u-back-top/backtop.js

@@ -1,27 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/backtop.js
- */
-export default {
-    // backtop组件
-    backtop: {
-        mode: 'circle',
-        icon: 'arrow-upward',
-        text: '',
-        duration: 100,
-        scrollTop: 0,
-        top: 400,
-        bottom: 100,
-        right: 20,
-        zIndex: 9,
-        iconStyle: {
-            color: '#909399',
-            fontSize: '19px'
-        }
-    }
-}

+ 0 - 56
uni_modules/uview-plus/components/u-back-top/props.js

@@ -1,56 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        // 返回顶部的形状,circle-圆形,square-方形
-        mode: {
-            type: String,
-            default: () => defProps.backtop.mode
-        },
-        // 自定义图标
-        icon: {
-            type: String,
-            default: () => defProps.backtop.icon
-        },
-        // 提示文字
-        text: {
-            type: String,
-            default: () => defProps.backtop.text
-        },
-        // 返回顶部滚动时间
-        duration: {
-            type: [String, Number],
-            default: () => defProps.backtop.duration
-        },
-        // 滚动距离
-        scrollTop: {
-            type: [String, Number],
-            default: () => defProps.backtop.scrollTop
-        },
-        // 距离顶部多少距离显示,单位px
-        top: {
-            type: [String, Number],
-            default: () => defProps.backtop.top
-        },
-        // 返回顶部按钮到底部的距离,单位px
-        bottom: {
-            type: [String, Number],
-            default: () => defProps.backtop.bottom
-        },
-        // 返回顶部按钮到右边的距离,单位px
-        right: {
-            type: [String, Number],
-            default: () => defProps.backtop.right
-        },
-        // 层级
-        zIndex: {
-            type: [String, Number],
-            default: () => defProps.backtop.zIndex
-        },
-        // 图标的样式,对象形式
-        iconStyle: {
-            type: Object,
-            default: () => defProps.backtop.iconStyle
-        }
-    }
-})

+ 0 - 132
uni_modules/uview-plus/components/u-back-top/u-back-top.vue

@@ -1,132 +0,0 @@
-<template>
-	<u-transition
-	    mode="fade"
-	    :customStyle="backTopStyle"
-	    :show="show"
-	>
-		<view
-		    class="u-back-top"
-			:style="[contentStyle]"
-		    v-if="!$slots.default && !$slots.$default"
-			@click="backToTop"
-		>
-			<up-icon
-			    :name="icon"
-			    :custom-style="iconStyle"
-			></up-icon>
-			<text
-			    v-if="text"
-			    class="u-back-top__text"
-			>{{text}}</text>
-		</view>
-		<slot v-else />
-	</u-transition>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addUnit, addStyle, getPx, deepMerge, error } from '../../libs/function/index';
-	// #ifdef APP-NVUE
-	const dom = weex.requireModule('dom')
-	// #endif
-	/**
-	 * backTop 返回顶部
-	 * @description 本组件一个用于长页面,滑动一定距离后,出现返回顶部按钮,方便快速返回顶部的场景。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/backTop.html
-	 * 
-	 * @property {String}			mode  		返回顶部的形状,circle-圆形,square-方形 (默认 'circle' )
-	 * @property {String} 			icon 		自定义图标 (默认 'arrow-upward' ) 见官方文档示例
-	 * @property {String} 			text 		提示文字 
-	 * @property {String | Number}  duration	返回顶部滚动时间 (默认 100)
-	 * @property {String | Number}  scrollTop	滚动距离 (默认 0 )
-	 * @property {String | Number}  top  		距离顶部多少距离显示,单位px (默认 400 )
-	 * @property {String | Number}  bottom  	返回顶部按钮到底部的距离,单位px (默认 100 )
-	 * @property {String | Number}  right  		返回顶部按钮到右边的距离,单位px (默认 20 )
-	 * @property {String | Number}  zIndex 		层级   (默认 9 )
-	 * @property {Object<Object>}  	iconStyle 	图标的样式,对象形式   (默认 {color: '#909399',fontSize: '19px'})
-	 * @property {Object}			customStyle	定义需要用到的外部样式
-	 * 
-	 * @example <u-back-top :scrollTop="scrollTop"></u-back-top>
-	 */
-	export default {
-		name: 'u-back-top',
-		mixins: [mpMixin, mixin, props],
-		computed: {
-			backTopStyle() {
-				// 动画组件样式
-				const style = {
-					bottom: addUnit(this.bottom),
-					right: addUnit(this.right),
-					width: '40px',
-					height: '40px',
-					position: 'fixed',
-					zIndex: 10,
-				}
-				return style
-			},
-			show() {
-				return getPx(this.scrollTop) > getPx(this.top)
-			},
-			contentStyle() {
-				const style = {}
-				let radius = 0
-				// 是否圆形
-				if(this.mode === 'circle') {
-					radius = '100px'
-				} else {
-					radius = '4px'
-				}
-				// 为了兼容安卓nvue,只能这么分开写
-				style.borderTopLeftRadius = radius
-				style.borderTopRightRadius = radius
-				style.borderBottomLeftRadius = radius
-				style.borderBottomRightRadius = radius
-				return deepMerge(style, addStyle(this.customStyle))
-			}
-		},
-		emits: ["click"],
-		methods: {
-			backToTop() {
-				// #ifdef APP-NVUE
-				if (!this.$parent.$refs['u-back-top']) {
-					error(`nvue页面需要给页面最外层元素设置"ref='u-back-top'`)
-				}
-				dom.scrollToElement(this.$parent.$refs['u-back-top'], {
-					offset: 0
-				})
-				// #endif
-				
-				// #ifndef APP-NVUE
-				uni.pageScrollTo({
-					scrollTop: 0,
-					duration: this.duration
-				});
-				// #endif
-				this.$emit('click')
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-     $u-back-top-flex:1 !default;
-     $u-back-top-height:100% !default;
-     $u-back-top-background-color:#E1E1E1 !default;
-     $u-back-top-tips-font-size:12px !default;
-	.u-back-top {
-		@include flex;
-		flex-direction: column;
-		align-items: center;
-		flex:$u-back-top-flex;
-		height: $u-back-top-height;
-		justify-content: center;
-		background-color: $u-back-top-background-color;
-
-		&__tips {
-			font-size:$u-back-top-tips-font-size;
-			transform: scale(0.8);
-		}
-	}
-</style>

+ 0 - 27
uni_modules/uview-plus/components/u-badge/badge.js

@@ -1,27 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/badge.js
- */
-export default {
-    // 徽标数组件
-    badge: {
-        isDot: false,
-        value: '',
-        show: true,
-        max: 999,
-        type: 'error',
-        showZero: false,
-        bgColor: null,
-        color: null,
-        shape: 'circle',
-        numberType: 'overflow',
-        offset: [],
-        inverted: false,
-        absolute: false
-    }
-}

+ 0 - 79
uni_modules/uview-plus/components/u-badge/props.js

@@ -1,79 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        // 是否显示圆点
-        isDot: {
-            type: Boolean,
-            default: () => defProps.badge.isDot
-        },
-        // 显示的内容
-        value: {
-            type: [Number, String],
-            default: () => defProps.badge.value
-        },
-        // 显示的内容
-        modelValue: {
-            type: [Number, String],
-            default: () => defProps.badge.modelValue
-        },
-        // 是否显示
-        show: {
-            type: Boolean,
-            default: () => defProps.badge.show
-        },
-        // 最大值,超过最大值会显示 '{max}+'
-        max: {
-            type: [Number, String],
-            default: () => defProps.badge.max
-        },
-        // 主题类型,error|warning|success|primary
-        type: {
-            type: String,
-            default: () => defProps.badge.type
-        },
-        // 当数值为 0 时,是否展示 Badge
-        showZero: {
-            type: Boolean,
-            default: () => defProps.badge.showZero
-        },
-        // 背景颜色,优先级比type高,如设置,type参数会失效
-        bgColor: {
-            type: [String, null],
-            default: () => defProps.badge.bgColor
-        },
-        // 字体颜色
-        color: {
-            type: [String, null],
-            default: () => defProps.badge.color
-        },
-        // 徽标形状,circle-四角均为圆角,horn-左下角为直角
-        shape: {
-            type: String,
-            default: () => defProps.badge.shape
-        },
-        // 设置数字的显示方式,overflow|ellipsis|limit
-        // overflow会根据max字段判断,超出显示`${max}+`
-        // ellipsis会根据max判断,超出显示`${max}...`
-        // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数
-        numberType: {
-            type: String,
-            default: () => defProps.badge.numberType
-        },
-        // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效
-        offset: {
-            type: Array,
-            default: () => defProps.badge.offset
-        },
-        // 是否反转背景和字体颜色
-        inverted: {
-            type: Boolean,
-            default: () => defProps.badge.inverted
-        },
-        // 是否绝对定位
-        absolute: {
-            type: Boolean,
-            default: () => defProps.badge.absolute
-        }
-    }
-})

+ 0 - 176
uni_modules/uview-plus/components/u-badge/u-badge.vue

@@ -1,176 +0,0 @@
-<template>
-	<text
-		v-if="show && ((Number(value) === 0 ? showZero : true) || isDot)"
-		:class="[isDot ? 'u-badge--dot' : 'u-badge--not-dot', inverted && 'u-badge--inverted', shape === 'horn' && 'u-badge--horn', `u-badge--${type}${inverted ? '--inverted' : ''}`]"
-		:style="[addStyle(customStyle), badgeStyle]"
-		class="u-badge"
-	>{{ isDot ? '' :showValue }}</text>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addStyle, addUnit } from '../../libs/function/index';
-	/**
-	 * badge 徽标数
-	 * @description 该组件一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/badge.html
-	 * 
-	 * @property {Boolean} 			isDot 		是否显示圆点 (默认 false )
-	 * @property {String | Number} 	value 		显示的内容
-	 * @property {Boolean} 			show 		是否显示 (默认 true )
-	 * @property {String | Number} 	max 		最大值,超过最大值会显示 '{max}+'  (默认999)
-	 * @property {String} 			type 		主题类型,error|warning|success|primary (默认 'error' )
-	 * @property {Boolean} 			showZero	当数值为 0 时,是否展示 Badge (默认 false )
-	 * @property {String} 			bgColor 	背景颜色,优先级比type高,如设置,type参数会失效
-	 * @property {String} 			color 		字体颜色 (默认 '#ffffff' )
-	 * @property {String} 			shape 		徽标形状,circle-四角均为圆角,horn-左下角为直角 (默认 'circle' )
-	 * @property {String} 			numberType	设置数字的显示方式,overflow|ellipsis|limit  (默认 'overflow' )
-	 * @property {Array}} 			offset		设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效
-	 * @property {Boolean} 			inverted	是否反转背景和字体颜色(默认 false )
-	 * @property {Boolean} 			absolute	是否绝对定位(默认 false )
-	 * @property {Object}			customStyle	定义需要用到的外部样式
-	 * @example <u-badge :type="type" :count="count"></u-badge>
-	 */
-	export default {
-		name: 'u-badge',
-		mixins: [mpMixin, props, mixin],
-		computed: {
-			// 是否将badge中心与父组件右上角重合
-			boxStyle() {
-				let style = {};
-				return style;
-			},
-			// 整个组件的样式
-			badgeStyle() {
-				const style = {}
-				if(this.color) {
-					style.color = this.color
-				}
-				if (this.bgColor && !this.inverted) {
-					style.backgroundColor = this.bgColor
-				}
-				if (this.absolute) {
-					style.position = 'absolute'
-					// 如果有设置offset参数
-					if(this.offset.length) {
-						// top和right分为为offset的第一个和第二个值,如果没有第二个值,则right等于top
-						const top = this.offset[0]
-						const right = this.offset[1] || top
-						style.top = addUnit(top)
-						style.right = addUnit(right)
-					}
-				}
-				return style
-			},
-			showValue() {
-				switch (this.numberType) {
-					case "overflow":
-						return Number(this.value) > Number(this.max) ? this.max + "+" : this.value
-						break;
-					case "ellipsis":
-						return Number(this.value) > Number(this.max) ? "..." : this.value
-						break;
-					case "limit":
-						return Number(this.value) > 999 ? Number(this.value) >= 9999 ?
-							Math.floor(this.value / 1e4 * 100) / 100 + "w" : Math.floor(this.value /
-								1e3 * 100) / 100 + "k" : this.value
-						break;
-					default:
-						return Number(this.value)
-				}
-			},
-		},
-		methods: {
-			addStyle
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	$u-badge-primary: $u-primary !default;
-	$u-badge-error: $u-error !default;
-	$u-badge-success: $u-success !default;
-	$u-badge-info: $u-info !default;
-	$u-badge-warning: $u-warning !default;
-	$u-badge-dot-radius: 100px !default;
-	$u-badge-dot-size: 8px !default;
-	$u-badge-dot-right: 4px !default;
-	$u-badge-dot-top: 0 !default;
-	$u-badge-text-font-size: 11px !default;
-	$u-badge-text-right: 10px !default;
-	$u-badge-text-padding: 2px 5px !default;
-	$u-badge-text-align: center !default;
-	$u-badge-text-color: #FFFFFF !default;
-
-	.u-badge {
-		border-top-right-radius: $u-badge-dot-radius;
-		border-top-left-radius: $u-badge-dot-radius;
-		border-bottom-left-radius: $u-badge-dot-radius;
-		border-bottom-right-radius: $u-badge-dot-radius;
-		@include flex;
-		line-height: $u-badge-text-font-size;
-		text-align: $u-badge-text-align;
-		font-size: $u-badge-text-font-size;
-		color: $u-badge-text-color;
-
-		&--dot {
-			height: $u-badge-dot-size;
-			width: $u-badge-dot-size;
-		}
-		
-		&--inverted {
-			font-size: 13px;
-		}
-		
-		&--not-dot {
-			padding: $u-badge-text-padding;
-		}
-
-		&--horn {
-			border-bottom-left-radius: 0;
-		}
-
-		&--primary {
-			background-color: $u-badge-primary;
-		}
-		
-		&--primary--inverted {
-			color: $u-badge-primary;
-		}
-
-		&--error {
-			background-color: $u-badge-error;
-		}
-		
-		&--error--inverted {
-			color: $u-badge-error;
-		}
-
-		&--success {
-			background-color: $u-badge-success;
-		}
-		
-		&--success--inverted {
-			color: $u-badge-success;
-		}
-
-		&--info {
-			background-color: $u-badge-info;
-		}
-		
-		&--info--inverted {
-			color: $u-badge-info;
-		}
-
-		&--warning {
-			background-color: $u-badge-warning;
-		}
-		
-		&--warning--inverted {
-			color: $u-badge-warning;
-		}
-	}
-</style>

+ 0 - 1000
uni_modules/uview-plus/components/u-barcode/u-barcode.vue

@@ -1,1000 +0,0 @@
-<template>
-  <view class="u-barcode" v-if="calcSizeDone">
-    <canvas 
-      v-if="showCanvas && !error" 
-      :id="canvasId" 
-      :canvas-id="canvasId" 
-      :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px' }"
-    ></canvas>
-    <image 
-      v-else-if="!showCanvas && !error"
-      :src="barcodeImage" 
-      :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px' }"
-      mode="aspectFit"
-    />
-    <view 
-      v-else
-      class="error-container"
-      :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px' }"
-    >
-      <text class="error-text">{{ error }}</text>
-    </view>
-  </view>
-</template>
-
-<script>
-import { nextTick } from 'vue'
-import { t } from '../../libs/i18n'
-
-export default {
-  name: 'u-barcode',
-  props: {
-    // 条码值
-    value: {
-      type: [String, Number],
-      required: true
-    },
-    // 条码格式
-    format: {
-      type: String,
-      default: 'auto',
-      validator: function (value) {
-        return [
-          'auto', 
-          'CODE128', 'CODE128A', 'CODE128B', 'CODE128C',
-          'EAN13', 'EAN8', 'EAN5', 'EAN2',
-          'UPC', 'UPCA', 'UPCE',
-          'CODE39',
-          'ITF', 'ITF14',
-          'MSI', 'MSI10', 'MSI11', 'MSI1010', 'MSI1110',
-          'pharmacode',
-          'codabar'
-        ].includes(value)
-      }
-    },
-    // 宽度
-    width: {
-      type: Number,
-      default: 200
-    },
-    // 高度
-    height: {
-      type: Number,
-      default: 80
-    },
-    // 是否显示文本
-    displayValue: {
-      type: Boolean,
-      default: true
-    },
-    // 文本内容
-    text: {
-      type: String,
-      default: undefined
-    },
-    // 字体选项
-    fontOptions: {
-      type: String,
-      default: ''
-    },
-    // 字体
-    font: {
-      type: String,
-      default: 'monospace'
-    },
-    // 文本对齐方式
-    textAlign: {
-      type: String,
-      default: 'center'
-    },
-    // 文本位置
-    textPosition: {
-      type: String,
-      default: 'bottom'
-    },
-    // 文本边距
-    textMargin: {
-      type: Number,
-      default: 2
-    },
-    // 字体大小
-    fontSize: {
-      type: Number,
-      default: 14
-    },
-    // 背景色
-    background: {
-      type: String,
-      default: '#ffffff'
-    },
-    // 条码颜色
-    lineColor: {
-      type: String,
-      default: '#000000'
-    },
-    // 边距
-    margin: {
-      type: Number,
-      default: 10
-    },
-    // 上边距
-    marginTop: {
-      type: Number,
-      default: undefined
-    },
-    // 下边距
-    marginBottom: {
-      type: Number,
-      default: undefined
-    },
-    // 左边距
-    marginLeft: {
-      type: Number,
-      default: undefined
-    },
-    // 右边距
-    marginRight: {
-      type: Number,
-      default: undefined
-    },
-    // 使用canvas还是生成图片
-    useCanvas: {
-      type: Boolean,
-      default: true
-    }
-  },
-  data() {
-    return {
-      canvasId: 'barcode-' + Math.random().toString(36).substr(2, 9),
-      barcodeImage: '',
-      showCanvas: false,
-      canvasWidth: 0,
-      canvasHeight: 0,
-      calcSizeDone: false,
-      error: ''
-    }
-  },
-  watch: {
-    value() {
-      this.generateBarcode()
-    },
-    format() {
-      this.generateBarcode()
-    },
-    width() {
-      this.generateBarcode()
-    },
-    height() {
-      this.generateBarcode()
-    },
-    displayValue() {
-      this.generateBarcode()
-    },
-    text() {
-      this.generateBarcode()
-    },
-    font() {
-      this.generateBarcode()
-    },
-    textAlign() {
-      this.generateBarcode()
-    },
-    textPosition() {
-      this.generateBarcode()
-    },
-    textMargin() {
-      this.generateBarcode()
-    },
-    fontSize() {
-      this.generateBarcode()
-    },
-    background() {
-      this.generateBarcode()
-    },
-    lineColor() {
-      this.generateBarcode()
-    },
-    margin() {
-      this.generateBarcode()
-    }
-  },
-  mounted() {
-    /**
-     * @author jry <ijry@qq.com>
-     */
-    this.$nextTick(() => {
-      this.generateBarcode()
-    })
-  },
-  methods: {
-    /**
-     * 生成条形码
-     * @author jry <ijry@qq.com>
-     * @param {String|Number} value - 条码值
-     * @param {Object} options - 条码配置选项
-     */
-    generateBarcode() {
-      // 统一处理默认值
-      const margin = this.margin
-      const options = {
-        format: this.format || 'auto',
-        width: this.width,
-        height: this.height,
-        displayValue: this.displayValue,
-        text: this.text,
-        fontOptions: this.fontOptions || '',
-        font: this.font || 'monospace',
-        textAlign: this.textAlign || 'center',
-        textPosition: this.textPosition || 'bottom',
-        textMargin: this.textMargin !== undefined ? this.textMargin : 2,
-        fontSize: this.fontSize || 20,
-        background: this.background || '#ffffff',
-        lineColor: this.lineColor || '#000000',
-        margin: margin,
-        marginTop: this.marginTop !== undefined ? this.marginTop : margin,
-        marginBottom: this.marginBottom !== undefined ? this.marginBottom : margin,
-        marginLeft: this.marginLeft !== undefined ? this.marginLeft : margin,
-        marginRight: this.marginRight !== undefined ? this.marginRight : margin
-      }
-      
-      // 清理未定义的选项
-      Object.keys(options).forEach(key => {
-        if (options[key] === undefined) {
-          delete options[key]
-        }
-      })
-      
-      if (this.useCanvas) {
-        // 使用canvas渲染
-        this.showCanvas = true
-        this.$nextTick(() => {
-          this.renderToCanvas(options)
-        })
-      } else {
-        // 生成图片
-        this.showCanvas = false
-        this.renderToImage(options)
-      }
-    },
-    
-    /**
-     * 渲染条形码到canvas
-     * @author jry <ijry@qq.com>
-     * @param {Object} options - 条码配置选项
-     */
-    async renderToCanvas(options) {
-      try {
-        // 计算canvas尺寸
-        this.calculateCanvasSize(options)
-
-        await nextTick()
-
-        // 获取canvas上下文
-        const ctx = uni.createCanvasContext(this.canvasId, this)
-        
-        // 清空画布
-        ctx.setFillStyle(options.background)
-        ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight)
-        
-        // 生成条形码数据
-        const barcodeData = this.encodeBarcode(this.value, options.format)
-        
-        if (barcodeData) {
-          // 绘制条形码
-          this.drawBarcode(ctx, barcodeData, options)
-        }
-        
-        // 绘制到canvas
-        ctx.draw(false, () => {
-          // 绘制完成回调
-          this.$emit('rendered', { type: 'canvas', id: this.canvasId })
-        })
-      } catch (error) {
-        console.error('生成条码失败:', error)
-        this.error = error.message || t('up.barcode.error')
-        this.$emit('error', error)
-      }
-    },
-    
-    /**
-     * 渲染条形码为图片
-     * @author jry <ijry@qq.com>
-     * @param {Object} options - 条码配置选项
-     */
-    renderToImage(options) {
-      try {
-        // 计算canvas尺寸
-        this.calculateCanvasSize(options)
-        
-        // 创建临时canvas用于生成图片
-        const tempCanvasId = 'temp-' + this.canvasId
-        const ctx = uni.createCanvasContext(tempCanvasId, this)
-        
-        // 清空画布
-        ctx.setFillStyle(options.background)
-        ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight)
-        
-        // 生成条形码数据
-        const barcodeData = this.encodeBarcode(this.value, options.format)
-        
-        if (barcodeData) {
-          // 绘制条形码
-          this.drawBarcode(ctx, barcodeData, options)
-        }
-        
-        // 绘制到临时canvas并生成图片
-        ctx.draw(false, () => {
-          // 延迟一小段时间确保canvas绘制完成
-          setTimeout(() => {
-            // 将canvas转换为图片
-            uni.canvasToTempFilePath({
-              canvasId: tempCanvasId,
-              success: (res) => {
-                this.barcodeImage = res.tempFilePath
-                this.$emit('rendered', { type: 'image', value: this.value, path: res.tempFilePath })
-              },
-              fail: (error) => {
-                console.error('生成条码图片失败:', error)
-                this.$emit('error', error)
-              }
-            }, this)
-          }, 100)
-        })
-      } catch (error) {
-        console.error('生成条码图片失败:', error)
-        this.$emit('error', error)
-      }
-    },
-    
-    /**
-     * 计算canvas尺寸
-     * @author jry <ijry@qq.com>
-     * @param {Object} options - 条码配置选项
-     */
-    calculateCanvasSize(options) {
-      // 基础宽度计算
-      let width = options.width
-      let height = options.height
-      
-      // 考虑边距
-      const marginLeft = options.marginLeft
-      const marginRight = options.marginRight
-      const marginTop = options.marginTop
-      const marginBottom = options.marginBottom
-      
-      // 考虑文本高度
-      let textHeight = 0
-      if (options.displayValue !== false) {
-        textHeight = options.fontSize + options.textMargin
-      }
-      
-      // 根据文本位置调整高度
-      if (options.textPosition === 'top' || options.textPosition === 'bottom') {
-        height += textHeight
-      }
-      
-      // 添加边距
-      width += marginLeft + marginRight
-      height += marginTop + marginBottom
-      
-      this.canvasWidth = Math.max(width, 100)
-      this.canvasHeight = Math.max(height, 60 + textHeight)
-
-      this.calcSizeDone = true
-    },
-    
-    /**
-     * 编码条形码数据
-     * @author jry <ijry@qq.com>
-     * @param {String|Number} value - 条码值
-     * @param {String} format - 条码格式
-     * @returns {String|null} 条形码编码数据
-     */
-    encodeBarcode(value, format) {
-      try {
-        switch (format) {
-          case 'CODE128':
-          case 'auto':
-            return this.encodeCode128(value)
-          case 'CODE39':
-            return this.encodeCode39(value)
-          case 'EAN13':
-            return this.encodeEAN13(value)
-          case 'EAN8':
-            return this.encodeEAN8(value)
-          case 'EAN5':
-          case 'EAN2':
-            return this.encodeEAN52(value, format)
-          case 'UPC':
-          case 'UPCA':
-            return this.encodeUPCA(value)
-          case 'UPCE':
-            return this.encodeUPCE(value)
-          default:
-            // 默认使用CODE128
-            return this.encodeCode128(value)
-        }
-      } catch (error) {
-        console.error('条码编码失败:', error)
-        throw error
-      }
-    },
-
-    /**
-     * 添加右侧安静区(至少2个模块宽度的空白)
-     * @author jry <ijry@qq.com>
-     * @param {String} data - 要编码的数据
-     * @returns {String|null} 编码后的条形码数据
-     */
-    encodeCode128(data) {
-      const CODE128_START_CODE_B = 104
-      const CODE128_STOP = 106
-      
-      // CODE128 Code B 字符集
-      const CODE128_CODE_B_CHARS = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
-      
-      // 条形码模式 (B 模式)
-      const codes = []
-      let checksum = CODE128_START_CODE_B
-      
-      // 添加起始字符
-      codes.push(CODE128_START_CODE_B)
-      
-      // 编码每个字符
-      for (let i = 0; i < data.length; i++) {
-        const char = data[i]
-        const code = CODE128_CODE_B_CHARS.indexOf(char)
-        
-        if (code === -1) {
-          throw new Error('Invalid character in CODE128: ' + char)
-        }
-        
-        codes.push(code)
-        checksum += code * (i + 1)
-      }
-      
-      // 添加校验字符
-      codes.push(checksum % 103)
-      
-      // 添加结束字符
-      codes.push(CODE128_STOP)
-      
-      // 转换为条形码模式 (1 = 黑条, 0 = 白条)
-      let barcode = ''
-      for (let i = 0; i < codes.length; i++) {
-        const code = codes[i]
-        barcode += this.getCode128Pattern(code)
-      }
-      
-      // 添加右侧安静区(至少2个模块宽度的空白)
-      barcode += '00000'
-      
-      return barcode
-    },
-    
-    /**
-     * 获取CODE128编码模式
-     * @author jry <ijry@qq.com>
-     * @param {Number} code - 字符编码
-     * @returns {String} 条形码二进制模式
-     */
-    getCode128Pattern(code) {
-      // CODE128编码表
-      const patterns = [
-        "11011001100", "11001101100", "11001100110", "10010011000", 
-        "10010001100", "10001001100", "10011001000", "10011000100", 
-        "10001100100", "11001001000", "11001000100", "11000100100", 
-        "10110011100", "10011011100", "10011001110", "10111001100", 
-        "10011101100", "10011100110", "11001110010", "11001011100", 
-        "11001001110", "11011100100", "11001110100", "11101101110", 
-        "11101001100", "11100101100", "11100100110", "11101100100", 
-        "11100110100", "11100110010", "11011011000", "11011000110", 
-        "11000110110", "10100011000", "10001011000", "10001000110", 
-        "10110001000", "10001101000", "10001100010", "11010001000", 
-        "11000101000", "11000100010", "10110111000", "10110001110", 
-        "10001101110", "10111011000", "10111000110", "10001110110", 
-        "11101110110", "11010001110", "11000101110", "11011101000", 
-        "11011100010", "11011101110", "11101011000", "11101000110", 
-        "11100010110", "11101101000", "11101100010", "11100011010", 
-        "11101111010", "11001000010", "11110001010", "10100110000", 
-        "10100001100", "10010110000", "10010000110", "10000101100", 
-        "10000100110", "10110010000", "10110000100", "10011010000", 
-        "10011000010", "10000110100", "10000110010", "11000010010", 
-        "11001010000", "11110111010", "11000010100", "10001111010", 
-        "10100111100", "10010111100", "10010011110", "10111100100", 
-        "10011110100", "10011110010", "11110100100", "11110010100", 
-        "11110010010", "11011011110", "11011110110", "11110110110", 
-        "10101111000", "10100011110", "10001011110", "10111101000", 
-        "10111100010", "11110101000", "11110100010", "10111011110", 
-        "10111101110", "11101011110", "11110101110", "11010000100", 
-        "11010010000", "11010011100", "11000111010"
-      ];
-      
-      return patterns[code] || "";
-    },
-    
-    /**
-     * CODE39编码实现
-     * @author jry <ijry@qq.com>
-     * @param {String} data - 要编码的数据
-     * @returns {String|null} 编码后的条形码数据
-     */
-    encodeCode39(data) {
-      const codes = {
-        '0': '101000111011101',
-        '1': '111010001010111',
-        '2': '101110001010111',
-        '3': '111011100010101',
-        '4': '101000111010111',
-        '5': '111010001110101',
-        '6': '101110001110101',
-        '7': '101000101110111',
-        '8': '111010001011101',
-        '9': '101110001011101',
-        'A': '111010100010111',
-        'B': '101110100010111',
-        'C': '111011101000101',
-        'D': '101011100010111',
-        'E': '111010111000101',
-        'F': '101110111000101',
-        'G': '101010001110111',
-        'H': '111010100011101',
-        'I': '101110100011101',
-        'J': '101011100011101',
-        'K': '111010101000111',
-        'L': '101110101000111',
-        'M': '111011101010001',
-        'N': '101011101000111',
-        'O': '111010111010001',
-        'P': '101110111010001',
-        'Q': '101010111000111',
-        'R': '111010101110001',
-        'S': '101110101110001',
-        'T': '101011101110001',
-        'U': '111000101010111',
-        'V': '100011101010111',
-        'W': '111000111010101',
-        'X': '100010111010111',
-        'Y': '111000101110101',
-        'Z': '100011101110101',
-        '-': '100010101110111',
-        '.': '111000101011101',
-        ' ': '100011101011101',
-        '*': '100010111011101', // 起始和终止字符
-        '$': '100010001000101',
-        '/': '100010001010001',
-        '+': '100010100010001',
-        '%': '101000100010001'
-      }
-      
-      // 转为大写
-      data = data.toUpperCase()
-      
-      // 添加起始和终止字符
-      let barcode = codes['*']
-      
-      // 添加数据字符
-      for (let i = 0; i < data.length; i++) {
-        const char = data[i]
-        if (codes[char]) {
-          barcode += '0' // 字符间隔
-          barcode += codes[char]
-        } else {
-          throw new Error('Invalid character in CODE39: ' + char)
-        }
-      }
-      
-      // 添加终止字符
-      barcode += '0' // 字符间隔
-      barcode += codes['*']
-      
-      return barcode
-    },
-    
-    /**
-     * EAN13编码实现
-     * @author jry <ijry@qq.com>
-     * @param {String} data - 13位数字字符串
-     * @returns {String|null} 编码后的条形码数据
-     */
-    encodeEAN13(data) {
-      // 确保数据是13位数字
-      if (!/^\d{13}$/.test(data)) {
-        throw new Error('EAN13 must be 13 digits')
-      }
-      
-      // 验证校验位
-      let sum = 0
-      for (let i = 0; i < 12; i++) {
-        const digit = parseInt(data[i])
-        sum += (i % 2 === 0) ? digit : digit * 3
-      }
-      const checkDigit = (10 - (sum % 10)) % 10
-      if (parseInt(data[12]) !== checkDigit) {
-        throw new Error('Invalid EAN13 check digit')
-      }
-      
-      // 左侧数据
-      const leftData = data.substring(1, 7)
-      const rightData = data.substring(7, 13)
-      
-      // 起始符
-      let barcode = '101'
-      
-      // 左侧数据编码 (根据第一位数字决定编码方式)
-      const firstDigit = parseInt(data[0])
-      const leftPatterns = [
-        ['LLLLLL', 'LLGLGG', 'LLGGLG', 'LLGGGL', 'LGLLGG', 
-         'LGGLLG', 'LGGGLL', 'LGLGLG', 'LGLGGL', 'LGGLGL']
-      ]
-      
-      const pattern = leftPatterns[0][firstDigit]
-      
-      // 左侧奇偶编码模式
-      const leftOdd = [
-        '0001101', '0011001', '0010011', '0111101', '0100011',
-        '0110001', '0101111', '0111011', '0110111', '0001011'
-      ]
-      
-      const leftEven = [
-        '0100111', '0110011', '0011011', '0100001', '0011101',
-        '0111001', '0000101', '0010001', '0001001', '0010111'
-      ]
-      
-      // 编码左侧数据
-      for (let i = 0; i < leftData.length; i++) {
-        const digit = parseInt(leftData[i])
-        if (pattern[i] === 'L') {
-          barcode += leftOdd[digit]
-        } else {
-          barcode += leftEven[digit]
-        }
-      }
-      
-      // 中间分隔符
-      barcode += '01010'
-      
-      // 右侧数据编码 (始终使用右编码)
-      const rightCodes = [
-        '1110010', '1100110', '1101100', '1000010', '1011100',
-        '1001110', '1010000', '1000100', '1001000', '1110100'
-      ]
-      
-      for (let i = 0; i < rightData.length; i++) {
-        const digit = parseInt(rightData[i])
-        barcode += rightCodes[digit]
-      }
-      
-      // 结束符
-      barcode += '101'
-      
-      return barcode
-    },
-    
-    /**
-     * EAN8编码实现
-     * @author jry <ijry@qq.com>
-     * @param {String} data - 8位数字字符串
-     * @returns {String|null} 编码后的条形码数据
-     */
-    encodeEAN8(data) {
-      // 确保数据是8位数字
-      if (!/^\d{8}$/.test(data)) {
-        throw new Error('EAN8 must be 8 digits')
-      }
-      
-      // 验证校验位
-      let sum = 0
-      for (let i = 0; i < 7; i++) {
-        const digit = parseInt(data[i])
-        sum += digit * (i % 2 === 0 ? 3 : 1)
-      }
-      const checkDigit = (10 - (sum % 10)) % 10
-      if (parseInt(data[7]) !== checkDigit) {
-        throw new Error('Invalid EAN8 check digit')
-      }
-      
-      // 左侧数据(4位)
-      const leftData = data.substring(0, 4)
-      // 右侧数据(4位)
-      const rightData = data.substring(4, 8)
-      
-      // 起始符
-      let barcode = '101'
-      
-      // 左侧奇偶编码模式
-      const leftOdd = [
-        '0001101', '0011001', '0010011', '0111101', '0100011',
-        '0110001', '0101111', '0111011', '0110111', '0001011'
-      ]
-      
-      // 编码左侧数据
-      for (let i = 0; i < leftData.length; i++) {
-        const digit = parseInt(leftData[i])
-        barcode += leftOdd[digit]
-      }
-      
-      // 中间分隔符
-      barcode += '01010'
-      
-      // 右侧数据编码 (始终使用右编码)
-      const rightCodes = [
-        '1110010', '1100110', '1101100', '1000010', '1011100',
-        '1001110', '1010000', '1000100', '1001000', '1110100'
-      ]
-      
-      // 编码右侧数据
-      for (let i = 0; i < rightData.length; i++) {
-        const digit = parseInt(rightData[i])
-        barcode += rightCodes[digit]
-      }
-      
-      // 结束符
-      barcode += '101'
-      
-      return barcode
-    },
-    
-    /**
-     * EAN5/EAN2编码实现
-     * @author jry <ijry@qq.com>
-     * @param {String} data - 2位或5位数字字符串
-     * @param {String} format - 格式类型(EAN5或EAN2)
-     * @returns {String|null} 编码后的条形码数据
-     */
-    encodeEAN52(data, format) {
-      const length = format === 'EAN5' ? 5 : 2
-      // 确保数据是相应位数的数字
-      if (!new RegExp(`^\\d{${length}}$`).test(data)) {
-        throw new Error(`${format} must be ${length} digits`)
-      }
-      
-      // EAN5/2编码表
-      const codes = [
-        '0001101', '0011001', '0010011', '0111101', '0100011',
-        '0110001', '0101111', '0111011', '0110111', '0001011'
-      ]
-      
-      // 计算校验和
-      let checksum = 0
-      for (let i = 0; i < data.length; i++) {
-        checksum += parseInt(data[i]) * (i % 2 === 0 ? 3 : 1)
-      }
-      
-      // 根据校验和确定编码模式
-      const patterns = format === 'EAN5' ? 
-        ['00001', '00010', '00100', '01000', '10000', // 0-4
-         '00000', '00011', '00101', '00110', '01001', // 5-9
-         '01010', '01100', '10001', '10010', '10100', // 10-14
-         '11000', '11001', '11010', '11100'] : // 15-18
-        ['00', '01', '10', '11'] // EAN2只有4种模式
-      
-      const pattern = format === 'EAN5' ? 
-        patterns[checksum % 10] : 
-        patterns[parseInt(data) % 4]
-      
-      // 起始符
-      let barcode = '1011'
-      
-      // 编码数据
-      for (let i = 0; i < data.length; i++) {
-        // 添加分隔符(除了第一个字符)
-        if (i > 0) {
-          barcode += '01' // 字符间分隔符
-        }
-        
-        // 根据模式确定编码方式
-        const digit = parseInt(data[i])
-        const code = codes[digit]
-        
-        barcode += code
-      }
-      
-      return barcode
-    },
-    
-    /**
-     * UPCA编码实现
-     * @author jry <ijry@qq.com>
-     * @param {String} data - 11位或12位数字字符串
-     * @returns {String|null} 编码后的条形码数据
-     */
-    encodeUPCA(data) {
-      // 如果是11位,计算校验位
-      if (/^\d{11}$/.test(data)) {
-        let sum = 0
-        for (let i = 0; i < 11; i++) {
-          const digit = parseInt(data[i])
-          sum += (i % 2 === 0) ? digit * 3 : digit
-        }
-        const checkDigit = (10 - (sum % 10)) % 10
-        data += checkDigit
-      }
-      
-      // 确保数据是12位数字
-      if (!/^\d{12}$/.test(data)) {
-        throw new Error('UPC-A must be 11 or 12 digits')
-      }
-      
-      // UPCA实际上是EAN13的第一个数字为0的特殊情况
-      return this.encodeEAN13('0' + data)
-    },
-    
-    /**
-     * UPCE编码实现
-     * @author jry <ijry@qq.com>
-     * @param {String} data - 6位或8位数字字符串
-     * @returns {String|null} 编码后的条形码数据
-     */
-    encodeUPCE(data) {
-      // 如果是7位,计算校验位
-      if (/^\d{7}$/.test(data)) {
-        let sum = 0
-        for (let i = 0; i < 7; i++) {
-          const digit = parseInt(data[i])
-          sum += (i % 2 === 0) ? digit * 3 : digit
-        }
-        const checkDigit = (10 - (sum % 10)) % 10
-        data += checkDigit
-      }
-      
-      // 确保数据是8位数字
-      if (!/^\d{8}$/.test(data)) {
-        throw new Error('UPC-E must be 7 or 8 digits')
-      }
-      
-      // 检查是否是有效的UPC-E格式
-      if (data[0] !== '0' && data[0] !== '1') {
-        throw new Error('UPC-E must start with 0 or 1')
-      }
-      
-      // UPCE编码表
-      const leftOdd = [
-        '0001101', '0011001', '0010011', '0111101', '0100011',
-        '0110001', '0101111', '0111011', '0110111', '0001011'
-      ]
-      
-      const leftEven = [
-        '0100111', '0110011', '0011011', '0100001', '0011101',
-        '0111001', '0000101', '0010001', '0001001', '0010111'
-      ]
-      
-      // 根据系统数字确定编码模式
-      const systemDigit = data[0]
-      const checkDigit = data[7]
-      
-      // 提取中间6位
-      const middleData = data.substring(1, 7)
-      
-      // 确定编码模式
-      let pattern
-      if (checkDigit === '0' || checkDigit === '1' || checkDigit === '2') {
-        pattern = 'EEEEOO' // 0,1,2
-      } else if (checkDigit === '3') {
-        pattern = 'EEEEOO' // 3
-      } else if (checkDigit === '4') {
-        pattern = 'EEEOOO' // 4
-      } else {
-        pattern = 'EEOOOO' // 5,6,7,8,9
-      }
-      
-      // 起始符
-      let barcode = '101'
-      
-      // 编码中间6位数据
-      for (let i = 0; i < middleData.length; i++) {
-        const digit = parseInt(middleData[i])
-        if (pattern[i] === 'E') {
-          barcode += leftEven[digit]
-        } else {
-          barcode += leftOdd[digit]
-        }
-      }
-      
-      // 中间分隔符
-      barcode += '010101'
-      
-      // 结束符
-      barcode += '101'
-      
-      return barcode
-    },
-    
-    /**
-     * 绘制条形码
-     * @author jry <ijry@qq.com>
-     * @param {Object} ctx - canvas上下文
-     * @param {String} barcodeData - 条形码数据
-     * @param {Object} options - 条码配置选项
-     */
-    drawBarcode(ctx, barcodeData, options) {
-      if (!barcodeData) return
-      
-      const marginLeft = options.marginLeft
-      const marginTop = options.marginTop
-      const marginBottom = options.marginBottom
-      const textHeight = options.displayValue !== false ? options.fontSize + options.textMargin : 0
-      const height = options.height
-      // 恢复: 根据总长度计算模块宽度
-      const moduleWidth = Math.max(1, (this.canvasWidth - marginLeft - (options.marginRight || 10)) / barcodeData.length)
-      
-      ctx.setFillStyle(options.lineColor)
-      
-      // 计算条形码绘制的Y坐标
-      let barcodeY = marginTop
-      // 如果文本在顶部,需要调整条形码绘制位置
-      if (options.displayValue !== false && options.textPosition === 'top') {
-        barcodeY += textHeight
-      }
-      
-      // 恢复: 使用计算出的模块宽度绘制条形码
-      let x = marginLeft
-      for (let i = 0; i < barcodeData.length; i++) {
-        if (barcodeData[i] === '1') {
-          // 使用计算的模块宽度绘制每个条
-          ctx.fillRect(x, barcodeY, moduleWidth, height)
-        }
-        // 每个条/空都占用一个模块宽度
-        x += moduleWidth
-      }
-      
-      // 绘制文本
-      if (options.displayValue !== false) {
-        const text = options.text || this.value
-        let textY
-        
-        ctx.setFillStyle(options.lineColor)
-        ctx.setFontSize(options.fontSize)
-        ctx.setTextAlign(options.textAlign)
-        
-        let textX
-        switch (options.textAlign) {
-          case 'left':
-            textX = marginLeft
-            break
-          case 'right':
-            textX = this.canvasWidth - options.marginRight
-            break
-          default: // center
-            textX = this.canvasWidth / 2
-        }
-        
-        // 根据文本位置确定Y坐标
-        if (options.textPosition === 'top') {
-          textY = marginTop + options.fontSize - 3
-        } else { // bottom
-          // 修复:正确计算底部文本位置,确保文本完全显示
-          textY = barcodeY + height + options.textMargin + options.fontSize
-          // 确保文本不会超出画布边界
-          if (textY > this.canvasHeight - marginBottom) {
-            textY = this.canvasHeight - marginBottom - 2
-          }
-        }
-        
-        ctx.fillText(text, textX, textY)
-      }
-    }
-  }
-}
-</script>
-
-<style scoped>
-.u-barcode {
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.error-container {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  background-color: #f0f0f0;
-  color: #ff0000;
-}
-
-.error-text {
-  font-size: 14px;
-}
-</style>

+ 0 - 24
uni_modules/uview-plus/components/u-box/box.js

@@ -1,24 +0,0 @@
-/*
- * @Author       : ly
- * @Description  :
- * @version      : 4.0
- * @Date         : 2026-02-02 23:54:58
- * @LastAuthor   : ly
- * @lastTime     : 2026-02-02 23:54:58
- * @FilePath     : /uview-ultra/components/up-box/box.js
- */
-export default {
-    // box 组件
-    box: {
-        bgColors: ['#EEFCFF', '#FCF8FF', '#FDF8F2'],
-        height: '160px',
-        borderRadius: '6px',
-        gap: '15px',
-        leftIcon: '',
-        leftTitle: '左',
-        rightTopIcon: '',
-        rightTopTitle: '右上',
-        rightBottomIcon: '',
-        rightBottomTitle: '右下'
-    }
-}

+ 0 - 57
uni_modules/uview-plus/components/u-box/props.js

@@ -1,57 +0,0 @@
-import { defineMixin } from '../../libs/vue.js'
-import defProps from './box.js'
-
-export const propsBox = defineMixin({
-    props: {
-        // 背景色
-        bgColors: {
-            type: [Array],
-            default: () => defProps.box.bgColors
-        },
-        // 高度
-        height: {
-            type: [String],
-            default: () => defProps.box.height
-        },
-        // 圆角
-        borderRadius: {
-            type: [String],
-            default: () => defProps.box.borderRadius
-        },
-        // 间隔
-        gap: {
-            type: [String],
-            default: () => defProps.box.gap
-        },
-        // 左侧图标
-        leftIcon: {
-            type: [String],
-            default: () => defProps.box.leftIcon
-        },
-        // 左侧文案
-        leftTitle: {
-            type: [String],
-            default: () => defProps.box.leftTitle
-        },
-        // 右上图标
-        rightTopIcon: {
-            type: [String],
-            default: () => defProps.box.rightTopIcon
-        },
-        // 右上文案
-        rightTopTitle: {
-            type: [String],
-            default: () => defProps.box.rightTopTitle
-        },
-        // 右下图标
-        rightBottomIcon: {
-            type: [String],
-            default: () => defProps.box.rightBottomIcon
-        },
-        // 右下文案
-        rightBottomTitle: {
-            type: [String],
-            default: () => defProps.box.rightBottomTitle
-        },
-    }
-})

+ 0 - 106
uni_modules/uview-plus/components/u-box/u-box.vue

@@ -1,106 +0,0 @@
-<template>
-	<view class="u-box" :style="[{height: height}, addStyle(customStyle)]">
-	    <view class="u-box__left" :style="{borderRadius: borderRadius, backgroundColor: bgColors[0]}">
-	        <slot name="left">
-	            <view class="flex flex-row items-center justify-center">
-	                <u-icon size="36" :name="leftIcon"></u-icon>
-	                <text class="ml-2 text-16px">{{leftTitle}}</text>
-	            </view>
-	        </slot>
-	    </view>
-	    <view class="u-box__gap" :style="{width: gap, height: height}"></view>
-	    <view class="u-box__right">
-	        <view class="u-box__right-top" :style="{borderRadius: borderRadius, backgroundColor: bgColors[1]}">
-	            <slot name="rightTop">
-	                <view class="flex flex-row items-center justify-center">
-	                    <u-icon size="36" :name="rightTopIcon"></u-icon>
-	                    <text class="ml-2 text-15px">{{rightTopTitle}}</text>
-	                </view>
-	            </slot>
-	        </view>
-	        <view class="u-box__right-gap" :style="{height: gap}"></view>
-	        <view class="u-box__right-bottom" :style="{borderRadius: borderRadius, backgroundColor: bgColors[2]}">
-	            <slot name="rightBottom">
-	                <view class="flex flex-row items-center justify-center">
-	                    <u-icon size="36" :name="rightBottomIcon"></u-icon>
-	                    <text class="ml-2 text-15px">{{rightBottomTitle}}</text>
-	                </view>
-	            </slot>
-	        </view>
-	    </view>
-	</view>
-</template>
-
-<script>
-	import { propsBox } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addStyle } from '../../libs/function/index';
-	import test from '../../libs/function/test';
-	/**
-	 * box 盒子
-	 * @description box盒子一般为左边一个盒子,右侧两个等高的半盒组成,常用于App首页座位重点突出。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/box.html
-	 * @property {Array}	bgColors			背景色
-	 * @property {String}	height			    高度
-     * @property {String}	borderRadius		圆角
-	 * @property {Object}   customStyle		    定义需要用到的外部样式
-	 * 
-	 * @event {Function}			click			点击cell列表时触发
-	 * @example <up-box colors=['blue', 'red', 'yellow'] height="200px"></up-box>
-	 */
-	export default {
-		name: 'up-box',
-		data() {
-			return {
-			}
-		},
-		mixins: [mpMixin, mixin, propsBox],
-		computed: {
-		},
-		emits: [],
-		methods: {
-			addStyle,
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	.u-box {
-        /* #ifndef APP-NVUE */
-        /* #endif */
-        @include flex();
-        flex: 1;
-
-		&__left {
-            @include flex();
-            justify-content: center;
-            align-items: center;
-            flex: 1;
-        }
-        &__gap {
-            @include flex();
-            flex-direction: column;
-        }
-        &__right {
-            @include flex();
-            flex-direction: column;
-            flex: 1;
-        }
-
-        &__right-top {
-            @include flex();
-            flex: 1;
-            justify-content: center;
-            align-items: center;
-        }
-
-        &__right-bottom {
-            @include flex();
-            flex: 1;
-            justify-content: center;
-            align-items: center;
-        }
-	}
-</style>

+ 0 - 43
uni_modules/uview-plus/components/u-button/button.js

@@ -1,43 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/button.js
- */
-export default {
-    // button组件
-    button: {
-        hairline: false,
-        type: 'info',
-        size: 'normal',
-        shape: 'square',
-        plain: false,
-        disabled: false,
-        loading: false,
-        loadingText: '',
-        loadingMode: 'spinner',
-        loadingSize: 15,
-        openType: '',
-        formType: '',
-        appParameter: '',
-        hoverStopPropagation: true,
-        lang: 'en',
-        sessionFrom: '',
-        sendMessageTitle: '',
-        sendMessagePath: '',
-        sendMessageImg: '',
-        showMessageCard: false,
-        dataName: '',
-        throttleTime: 0,
-        hoverStartTime: 0,
-        hoverStayTime: 200,
-        text: '',
-        icon: '',
-        iconColor: '',
-        color: '',
-        stop: true,
-    }
-}

+ 0 - 46
uni_modules/uview-plus/components/u-button/nvue.scss

@@ -1,46 +0,0 @@
-$u-button-active-opacity:0.75 !default;
-$u-button-loading-text-margin-left:4px !default;
-$u-button-text-color: #FFFFFF !default;
-$u-button-text-plain-error-color:$u-error !default;
-$u-button-text-plain-warning-color:$u-warning !default;
-$u-button-text-plain-success-color:$u-success !default;
-$u-button-text-plain-info-color:$u-info !default;
-$u-button-text-plain-primary-color:$u-primary !default;
-.u-button {
-	&--active {
-		opacity: $u-button-active-opacity;
-	}
-	
-	&--active--plain {
-		background-color: rgb(217, 217, 217);
-	}
-	
-	&__loading-text {
-		margin-left:$u-button-loading-text-margin-left;
-	}
-	
-	&__text,
-	&__loading-text {
-		color:$u-button-text-color;
-	}
-	
-	&__text--plain--error {
-		color:$u-button-text-plain-error-color;
-	}
-	
-	&__text--plain--warning {
-		color:$u-button-text-plain-warning-color;
-	}
-	
-	&__text--plain--success{
-		color:$u-button-text-plain-success-color;
-	}
-	
-	&__text--plain--info {
-		color:$u-button-text-plain-info-color;
-	}
-	
-	&__text--plain--primary {
-		color:$u-button-text-plain-primary-color;
-	}
-}

+ 0 - 159
uni_modules/uview-plus/components/u-button/props.js

@@ -1,159 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        // 是否细边框
-        hairline: {
-            type: Boolean,
-            default: () => defProps.button.hairline
-        },
-        // 按钮的预置样式,info,primary,error,warning,success
-        type: {
-            type: String,
-            default: () => defProps.button.type
-        },
-        // 按钮尺寸,large,normal,small,mini
-        size: {
-            type: String,
-            default: () => defProps.button.size
-        },
-        // 按钮形状,circle(两边为半圆),square(带圆角)
-        shape: {
-            type: String,
-            default: () => defProps.button.shape
-        },
-        // 按钮是否镂空
-        plain: {
-            type: Boolean,
-            default: () => defProps.button.plain
-        },
-        // 是否禁止状态
-        disabled: {
-            type: Boolean,
-            default: () => defProps.button.disabled
-        },
-        // 是否加载中
-        loading: {
-            type: Boolean,
-            default: () => defProps.button.loading
-        },
-        // 加载中提示文字
-        loadingText: {
-            type: [String, Number],
-            default: () => defProps.button.loadingText
-        },
-        // 加载状态图标类型
-        loadingMode: {
-            type: String,
-            default: () => defProps.button.loadingMode
-        },
-        // 加载图标大小
-        loadingSize: {
-            type: [String, Number],
-            default: () => defProps.button.loadingSize
-        },
-        // 开放能力,具体请看uniapp稳定关于button组件部分说明
-        // https://uniapp.dcloud.io/component/button
-        openType: {
-            type: String,
-            default: () => defProps.button.openType
-        },
-        // 用于 <form> 组件,点击分别会触发 <form> 组件的 submit/reset 事件
-        // 取值为submit(提交表单),reset(重置表单)
-        formType: {
-            type: String,
-            default: () => defProps.button.formType
-        },
-        // 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效
-        // 只微信小程序、QQ小程序有效
-        appParameter: {
-            type: String,
-            default: () => defProps.button.appParameter
-        },
-        // 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效
-        hoverStopPropagation: {
-            type: Boolean,
-            default: () => defProps.button.hoverStopPropagation
-        },
-        // 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效
-        lang: {
-            type: String,
-            default: () => defProps.button.lang
-        },
-        // 会话来源,open-type="contact"时有效。只微信小程序有效
-        sessionFrom: {
-            type: String,
-            default: () => defProps.button.sessionFrom
-        },
-        // 会话内消息卡片标题,open-type="contact"时有效
-        // 默认当前标题,只微信小程序有效
-        sendMessageTitle: {
-            type: String,
-            default: () => defProps.button.sendMessageTitle
-        },
-        // 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效
-        // 默认当前分享路径,只微信小程序有效
-        sendMessagePath: {
-            type: String,
-            default: () => defProps.button.sendMessagePath
-        },
-        // 会话内消息卡片图片,open-type="contact"时有效
-        // 默认当前页面截图,只微信小程序有效
-        sendMessageImg: {
-            type: String,
-            default: () => defProps.button.sendMessageImg
-        },
-        // 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,
-        // 用户点击后可以快速发送小程序消息,open-type="contact"时有效
-        showMessageCard: {
-            type: Boolean,
-            default: () => defProps.button.showMessageCard
-        },
-        // 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取
-        dataName: {
-            type: String,
-            default: () => defProps.button.dataName
-        },
-        // 节流,一定时间内只能触发一次
-        throttleTime: {
-            type: [String, Number],
-            default: () => defProps.button.throttleTime
-        },
-        // 按住后多久出现点击态,单位毫秒
-        hoverStartTime: {
-            type: [String, Number],
-            default: () => defProps.button.hoverStartTime
-        },
-        // 手指松开后点击态保留时间,单位毫秒
-        hoverStayTime: {
-            type: [String, Number],
-            default: () => defProps.button.hoverStayTime
-        },
-        // 按钮文字,之所以通过props传入,是因为slot传入的话
-        // nvue中无法控制文字的样式
-        text: {
-            type: [String, Number],
-            default: () => defProps.button.text
-        },
-        // 按钮图标
-        icon: {
-            type: String,
-            default: () => defProps.button.icon
-        },
-        // 按钮图标
-        iconColor: {
-            type: String,
-            default: () => defProps.button.icon
-        },
-        // 按钮颜色,支持传入linear-gradient渐变色
-        color: {
-            type: String,
-            default: () => defProps.button.color
-        },
-        // 停止冒泡
-        stop: {
-            type: Boolean,
-            default: () => defProps.button.stop
-        },
-    }
-})

+ 0 - 503
uni_modules/uview-plus/components/u-button/u-button.vue

@@ -1,503 +0,0 @@
-<template>
-    <!-- #ifndef APP-NVUE -->
-    <button
-        :hover-start-time="Number(hoverStartTime)"
-        :hover-stay-time="Number(hoverStayTime)"
-        :form-type="formType"
-        :open-type="openType"
-        :app-parameter="appParameter"
-        :hover-stop-propagation="hoverStopPropagation"
-        :send-message-title="sendMessageTitle"
-        :send-message-path="sendMessagePath"
-        :lang="lang"
-        :data-name="dataName"
-        :session-from="sessionFrom"
-        :send-message-img="sendMessageImg"
-        :show-message-card="showMessageCard"
-        @getphonenumber="getphonenumber"
-        @getuserinfo="getuserinfo"
-        @error="error"
-        @opensetting="opensetting"
-        @launchapp="launchapp"
-        @agreeprivacyauthorization="agreeprivacyauthorization"
-        :hover-class="!disabled && !loading ? 'u-button--active' : ''"
-        class="u-button u-reset-button"
-        :style="[baseColor, addStyle(customStyle)]"
-        @tap="clickHandler"
-        :class="bemClass"
-    >
-        <template v-if="loading">
-            <u-loading-icon
-                :mode="loadingMode"
-                :size="loadingSize * 1.15"
-                :color="loadingColor"
-            ></u-loading-icon>
-            <text
-                class="u-button__loading-text"
-                :style="[{ fontSize: textSize + 'px' }]"
-                >{{ loadingText || text }}</text
-            >
-        </template>
-        <template v-else>
-            <up-icon
-                v-if="icon"
-                :name="icon"
-                :color="iconColorCom"
-                :size="textSize * 1.35"
-                :customStyle="{ marginRight: '2px' }"
-            ></up-icon>
-            <slot>
-                <text
-                    class="u-button__text"
-                    :style="[{ fontSize: textSize + 'px' }]"
-                    >{{ text }}</text
-                >
-            </slot>
-        </template>
-    </button>
-    <!-- #endif -->
-
-    <!-- #ifdef APP-NVUE -->
-    <view
-        :hover-start-time="Number(hoverStartTime)"
-        :hover-stay-time="Number(hoverStayTime)"
-        class="u-button"
-        :hover-class="
-            !disabled && !loading && !color && (plain || type === 'info')
-                ? 'u-button--active--plain'
-                : !disabled && !loading && !plain
-                ? 'u-button--active'
-                : ''
-        "
-        @tap="clickHandler"
-        :class="bemClass"
-        :style="[baseColor, addStyle(customStyle)]"
-    >
-        <template v-if="loading">
-            <u-loading-icon
-                :mode="loadingMode"
-                :size="loadingSize * 1.15"
-                :color="loadingColor"
-            ></u-loading-icon>
-            <text
-                class="u-button__loading-text"
-                :style="[nvueTextStyle]"
-                :class="[plain && `u-button__text--plain--${type}`]"
-                >{{ loadingText || text }}</text
-            >
-        </template>
-        <template v-else>
-            <up-icon
-                v-if="icon"
-                :name="icon"
-                :color="iconColorCom"
-                :size="textSize * 1.35"
-            ></up-icon>
-            <text
-                class="u-button__text"
-                :style="[
-                    {
-                        marginLeft: icon ? '2px' : 0,
-                    },
-                    nvueTextStyle,
-                ]"
-                :class="[plain && `u-button__text--plain--${type}`]"
-                >{{ text }}</text
-            >
-        </template>
-    </view>
-    <!-- #endif -->
-</template>
-
-<script lang="ts">
-import { buttonMixin } from "../../libs/mixin/button";
-import { openType } from "../../libs/mixin/openType";
-import { mpMixin } from '../../libs/mixin/mpMixin';
-import { mixin } from '../../libs/mixin/mixin';
-import { props } from "./props";
-import { addStyle } from '../../libs/function/index';
-import { throttle } from '../../libs/function/throttle';
-import color from '../../libs/config/color';
-/**
- * button 按钮
- * @description Button 按钮
- * @tutorial https://uview-plus.jiangruyi.com/components/button.html
- *
- * @property {Boolean}			hairline				是否显示按钮的细边框 (默认 true )
- * @property {String}			type					按钮的预置样式,info,primary,error,warning,success (默认 'info' )
- * @property {String}			size					按钮尺寸,large,normal,mini (默认 normal)
- * @property {String}			shape					按钮形状,circle(两边为半圆),square(带圆角) (默认 'square' )
- * @property {Boolean}			plain					按钮是否镂空,背景色透明 (默认 false)
- * @property {Boolean}			disabled				是否禁用 (默认 false)
- * @property {Boolean}			loading					按钮名称前是否带 loading 图标(App-nvue 平台,在 ios 上为雪花,Android上为圆圈) (默认 false)
- * @property {String | Number}	loadingText				加载中提示文字
- * @property {String}			loadingMode				加载状态图标类型 (默认 'spinner' )
- * @property {String | Number}	loadingSize				加载图标大小 (默认 15 )
- * @property {String}			openType				开放能力,具体请看uniapp稳定关于button组件部分说明
- * @property {String}			formType				用于 <form> 组件,点击分别会触发 <form> 组件的 submit/reset 事件
- * @property {String}			appParameter			打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 (注:只微信小程序、QQ小程序有效)
- * @property {Boolean}			hoverStopPropagation	指定是否阻止本节点的祖先节点出现点击态,微信小程序有效(默认 true )
- * @property {String}			lang					指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文(默认 en )
- * @property {String}			sessionFrom				会话来源,openType="contact"时有效
- * @property {String}			sendMessageTitle		会话内消息卡片标题,openType="contact"时有效
- * @property {String}			sendMessagePath			会话内消息卡片点击跳转小程序路径,openType="contact"时有效
- * @property {String}			sendMessageImg			会话内消息卡片图片,openType="contact"时有效
- * @property {Boolean}			showMessageCard			是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效(默认false)
- * @property {String}			dataName				额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取
- * @property {String | Number}	throttleTime			节流,一定时间内只能触发一次 (默认 0 )
- * @property {String | Number}	hoverStartTime			按住后多久出现点击态,单位毫秒 (默认 0 )
- * @property {String | Number}	hoverStayTime			手指松开后点击态保留时间,单位毫秒 (默认 200 )
- * @property {String | Number}	text					按钮文字,之所以通过props传入,是因为slot传入的话(注:nvue中无法控制文字的样式)
- * @property {String}			icon					按钮图标
- * @property {String}			iconColor				按钮图标颜色
- * @property {String}			color					按钮颜色,支持传入linear-gradient渐变色
- * @property {Object}			customStyle				定义需要用到的外部样式
- *
- * @event {Function}	click			非禁止并且非加载中,才能点击
- * @event {Function}	getphonenumber	open-type="getPhoneNumber"时有效
- * @event {Function}	getuserinfo		用户点击该按钮时,会返回获取到的用户信息,从返回参数的detail中获取到的值同uni.getUserInfo
- * @event {Function}	error			当使用开放能力时,发生错误的回调
- * @event {Function}	opensetting		在打开授权设置页并关闭后回调
- * @event {Function}	launchapp		打开 APP 成功的回调
- * @event {Function}	agreeprivacyauthorization	用户同意隐私协议事件回调
- * @example <u-button>月落</u-button>
- */
-export default {
-    name: "u-button",
-    // #ifdef MP
-    mixins: [mpMixin, mixin, buttonMixin, openType, props],
-    // #endif
-    // #ifndef MP
-    mixins: [mpMixin, mixin, props],
-    // #endif
-    data() {
-        return {};
-    },
-    computed: {
-        // 生成bem风格的类名
-        bemClass() {
-            // this.bem为一个computed变量,在mixin中
-            if (!this.color) {
-                return this.bem(
-                    "button",
-                    ["type", "shape", "size"],
-                    ["disabled", "plain", "hairline"]
-                );
-            } else {
-                // 由于nvue的原因,在有color参数时,不需要传入type,否则会生成type相关的类型,影响最终的样式
-                return this.bem(
-                    "button",
-                    ["shape", "size"],
-                    ["disabled", "plain", "hairline"]
-                );
-            }
-        },
-        loadingColor() {
-            if (this.plain) {
-                // 如果有设置color值,则用color值,否则使用type主题颜色
-                return this.color
-                    ? this.color
-                    : color[`u-${this.type}`];
-            }
-            if (this.type === "info") {
-                return "#c9c9c9";
-            }
-            return "rgb(200, 200, 200)";
-        },
-        iconColorCom() {
-            // 如果是镂空状态,设置了color就用color值,否则使用主题颜色,
-            // up-icon的color能接受一个主题颜色的值
-			if (this.iconColor) return this.iconColor;
-			if (this.plain) {
-                return this.color ? this.color : this.type;
-            } else {
-                return this.type === "info" ? "#000000" : "#ffffff";
-            }
-        },
-        baseColor() {
-            let style = {};
-            if (this.color) {
-                // 针对自定义了color颜色的情况,镂空状态下,就是用自定义的颜色
-                style.color = this.plain ? this.color : "white";
-                if (!this.plain) {
-                    // 非镂空,背景色使用自定义的颜色
-                    style["background-color"] = this.color;
-                }
-                if (this.color.indexOf("gradient") !== -1) {
-                    // 如果自定义的颜色为渐变色,不显示边框,以及通过backgroundImage设置渐变色
-                    // weex文档说明可以写borderWidth的形式,为什么这里需要分开写?
-                    // 因为weex是阿里巴巴为了部门业绩考核而做的你懂的东西,所以需要这么写才有效
-                    style.borderTopWidth = 0;
-                    style.borderRightWidth = 0;
-                    style.borderBottomWidth = 0;
-                    style.borderLeftWidth = 0;
-                    if (!this.plain) {
-                        style.backgroundImage = this.color;
-                    }
-                } else {
-                    // 非渐变色,则设置边框相关的属性
-                    style.borderColor = this.color;
-                    style.borderWidth = "1px";
-                    style.borderStyle = "solid";
-                }
-            }
-            return style;
-        },
-        // nvue版本按钮的字体不会继承父组件的颜色,需要对每一个text组件进行单独的设置
-        nvueTextStyle() {
-            let style = {};
-            // 针对自定义了color颜色的情况,镂空状态下,就是用自定义的颜色
-            if (this.type === "info") {
-                style.color = "#323233";
-            }
-            if (this.color) {
-                style.color = this.plain ? this.color : "white";
-            }
-            style.fontSize = this.textSize + "px";
-            return style;
-        },
-        // 字体大小
-        textSize() {
-            let fontSize = 14,
-                { size } = this;
-            if (size === "large") fontSize = 16;
-            if (size === "normal") fontSize = 14;
-            if (size === "small") fontSize = 12;
-            if (size === "mini") fontSize = 10;
-            return fontSize;
-        },
-    },
-	emits: ['click', 'getphonenumber', 'getuserinfo',
-		'error', 'opensetting', 'launchapp', 'agreeprivacyauthorization'],
-    methods: {
-        addStyle,
-        clickHandler(e: any) {
-            // 非禁止并且非加载中,才能点击
-            if (!this.disabled && !this.loading) {
-				// 进行节流控制,每this.throttle毫秒内,只在开始处执行
-				throttle(() => {
-					this.$emit("click", e);
-				}, this.throttleTime);
-            }
-            // 是否阻止事件传播
-            this.stop && this.preventEvent(e)
-        },
-        // 下面为对接uniapp官方按钮开放能力事件回调的对接
-        getphonenumber(res: any) {
-            this.$emit("getphonenumber", res);
-        },
-        getuserinfo(res: any) {
-            this.$emit("getuserinfo", res);
-        },
-        error(res: any) {
-            this.$emit("error", res);
-        },
-        opensetting(res: any) {
-            this.$emit("opensetting", res);
-        },
-        launchapp(res: any) {
-            this.$emit("launchapp", res);
-        },
-        agreeprivacyauthorization(res) {
-            this.$emit("agreeprivacyauthorization", res);
-        },
-    },
-};
-</script>
-
-<style lang="scss" scoped>
-/* #ifndef APP-NVUE */
-@import "./vue.scss";
-/* #endif */
-
-/* #ifdef APP-NVUE */
-@import "./nvue.scss";
-/* #endif */
-
-$u-button-u-button-height: 40px !default;
-$u-button-text-font-size: 15px !default;
-$u-button-loading-text-font-size: 15px !default;
-$u-button-loading-text-margin-left: 4px !default;
-$u-button-large-width: 100% !default;
-$u-button-large-height: 50px !default;
-$u-button-normal-padding: 0 12px !default;
-$u-button-large-padding: 0 15px !default;
-$u-button-normal-font-size: 14px !default;
-$u-button-small-min-width: 60px !default;
-$u-button-small-height: 30px !default;
-$u-button-small-padding: 0px 8px !default;
-$u-button-mini-padding: 0px 8px !default;
-$u-button-small-font-size: 12px !default;
-$u-button-mini-height: 22px !default;
-$u-button-mini-font-size: 10px !default;
-$u-button-mini-min-width: 50px !default;
-$u-button-disabled-opacity: 0.5 !default;
-$u-button-info-color: #323233 !default;
-$u-button-info-background-color: #fff !default;
-$u-button-info-border-color: #ebedf0 !default;
-$u-button-info-border-width: 1px !default;
-$u-button-info-border-style: solid !default;
-$u-button-success-color: #fff !default;
-$u-button-success-background-color: $u-success !default;
-$u-button-success-border-color: $u-button-success-background-color !default;
-$u-button-success-border-width: 1px !default;
-$u-button-success-border-style: solid !default;
-$u-button-primary-color: #fff !default;
-$u-button-primary-background-color: $u-primary !default;
-$u-button-primary-border-color: $u-button-primary-background-color !default;
-$u-button-primary-border-width: 1px !default;
-$u-button-primary-border-style: solid !default;
-$u-button-error-color: #fff !default;
-$u-button-error-background-color: $u-error !default;
-$u-button-error-border-color: $u-button-error-background-color !default;
-$u-button-error-border-width: 1px !default;
-$u-button-error-border-style: solid !default;
-$u-button-warning-color: #fff !default;
-$u-button-warning-background-color: $u-warning !default;
-$u-button-warning-border-color: $u-button-warning-background-color !default;
-$u-button-warning-border-width: 1px !default;
-$u-button-warning-border-style: solid !default;
-$u-button-block-width: 100% !default;
-$u-button-circle-border-top-right-radius: 100px !default;
-$u-button-circle-border-top-left-radius: 100px !default;
-$u-button-circle-border-bottom-left-radius: 100px !default;
-$u-button-circle-border-bottom-right-radius: 100px !default;
-$u-button-square-border-top-right-radius: 3px !default;
-$u-button-square-border-top-left-radius: 3px !default;
-$u-button-square-border-bottom-left-radius: 3px !default;
-$u-button-square-border-bottom-right-radius: 3px !default;
-$u-button-icon-min-width: 1em !default;
-$u-button-plain-background-color: #fff !default;
-$u-button-hairline-border-width: 0.5px !default;
-
-.u-button {
-    height: $u-button-u-button-height;
-    position: relative;
-    align-items: center;
-    justify-content: center;
-    @include flex;
-    /* #ifndef APP-NVUE */
-    box-sizing: border-box;
-    /* #endif */
-    flex-direction: row;
-
-    &__text {
-        font-size: $u-button-text-font-size;
-    }
-
-    &__loading-text {
-        font-size: $u-button-loading-text-font-size;
-        margin-left: $u-button-loading-text-margin-left;
-    }
-
-    &--large {
-        /* #ifndef APP-NVUE */
-        width: $u-button-large-width;
-        /* #endif */
-        height: $u-button-large-height;
-        padding: $u-button-large-padding;
-    }
-
-    &--normal {
-        padding: $u-button-normal-padding;
-        font-size: $u-button-normal-font-size;
-    }
-
-    &--small {
-        /* #ifndef APP-NVUE */
-        min-width: $u-button-small-min-width;
-        /* #endif */
-        height: $u-button-small-height;
-        padding: $u-button-small-padding;
-        font-size: $u-button-small-font-size;
-    }
-
-    &--mini {
-        height: $u-button-mini-height;
-        font-size: $u-button-mini-font-size;
-        /* #ifndef APP-NVUE */
-        min-width: $u-button-mini-min-width;
-        /* #endif */
-        padding: $u-button-mini-padding;
-    }
-
-    &--disabled {
-        opacity: $u-button-disabled-opacity;
-    }
-
-    &--info {
-        color: $u-button-info-color;
-        background-color: $u-button-info-background-color;
-        border-color: $u-button-info-border-color;
-        border-width: $u-button-info-border-width;
-        border-style: $u-button-info-border-style;
-    }
-
-    &--success {
-        color: $u-button-success-color;
-        background-color: $u-button-success-background-color;
-        border-color: $u-button-success-border-color;
-        border-width: $u-button-success-border-width;
-        border-style: $u-button-success-border-style;
-    }
-
-    &--primary {
-        color: $u-button-primary-color;
-        background-color: $u-button-primary-background-color;
-        border-color: $u-button-primary-border-color;
-        border-width: $u-button-primary-border-width;
-        border-style: $u-button-primary-border-style;
-    }
-
-    &--error {
-        color: $u-button-error-color;
-        background-color: $u-button-error-background-color;
-        border-color: $u-button-error-border-color;
-        border-width: $u-button-error-border-width;
-        border-style: $u-button-error-border-style;
-    }
-
-    &--warning {
-        color: $u-button-warning-color;
-        background-color: $u-button-warning-background-color;
-        border-color: $u-button-warning-border-color;
-        border-width: $u-button-warning-border-width;
-        border-style: $u-button-warning-border-style;
-    }
-
-    &--block {
-        @include flex;
-        width: $u-button-block-width;
-    }
-
-    &--circle {
-        border-top-right-radius: $u-button-circle-border-top-right-radius;
-        border-top-left-radius: $u-button-circle-border-top-left-radius;
-        border-bottom-left-radius: $u-button-circle-border-bottom-left-radius;
-        border-bottom-right-radius: $u-button-circle-border-bottom-right-radius;
-    }
-
-    &--square {
-        border-bottom-left-radius: $u-button-square-border-top-right-radius;
-        border-bottom-right-radius: $u-button-square-border-top-left-radius;
-        border-top-left-radius: $u-button-square-border-bottom-left-radius;
-        border-top-right-radius: $u-button-square-border-bottom-right-radius;
-    }
-
-    &__icon {
-        /* #ifndef APP-NVUE */
-        min-width: $u-button-icon-min-width;
-        line-height: inherit !important;
-        vertical-align: top;
-        /* #endif */
-    }
-
-    &--plain {
-        background-color: $u-button-plain-background-color;
-    }
-
-    &--hairline {
-        border-width: $u-button-hairline-border-width !important;
-    }
-}
-</style>

+ 0 - 81
uni_modules/uview-plus/components/u-button/vue.scss

@@ -1,81 +0,0 @@
-// nvue下hover-class无效
-$u-button-before-top:50% !default;
-$u-button-before-left:50% !default;
-$u-button-before-width:100% !default;
-$u-button-before-height:100% !default;
-$u-button-before-transform:translate(-50%, -50%) !default;
-$u-button-before-opacity:0 !default;
-$u-button-before-background-color:#000 !default;
-$u-button-before-border-color:#000 !default;
-$u-button-active-before-opacity:.15 !default;
-$u-button-icon-margin-left:4px !default;
-$u-button-plain-u-button-info-color:$u-info;
-$u-button-plain-u-button-success-color:$u-success;
-$u-button-plain-u-button-error-color:$u-error;
-$u-button-plain-u-button-warning-color:$u-warning;
-
-.u-button {
-	width: 100%;
-	white-space: nowrap;
-	
-	&__text {
-		white-space: nowrap;
-		line-height: 1;
-	}
-	
-	&:before {
-		position: absolute;
-		top:$u-button-before-top;
-		left:$u-button-before-left;
-		width:$u-button-before-width;
-		height:$u-button-before-height;
-		border: inherit;
-		border-radius: inherit;
-		transform:$u-button-before-transform;
-		opacity:$u-button-before-opacity;
-		content: " ";
-		background-color:$u-button-before-background-color;
-		border-color:$u-button-before-border-color;
-	}
-	
-	&--active {
-		&:before {
-			opacity: .15
-		}
-	}
-	
-	&__icon+&__text:not(:empty),
-	&__loading-text {
-		margin-left:$u-button-icon-margin-left;
-	}
-	
-	&--plain {
-		&.u-button--primary {
-			color: $u-primary;
-		}
-	}
-	
-	&--plain {
-		&.u-button--info {
-			color:$u-button-plain-u-button-info-color;
-		}
-	}
-	
-	&--plain {
-		&.u-button--success {
-			color:$u-button-plain-u-button-success-color;
-		}
-	}
-	
-	&--plain {
-		&.u-button--error {
-			color:$u-button-plain-u-button-error-color;
-		}
-	}
-	
-	&--plain {
-		&.u-button--warning {
-			color:$u-button-plain-u-button-warning-color;
-		}
-	}
-}

+ 0 - 48
uni_modules/uview-plus/components/u-calendar/calendar.js

@@ -1,48 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/calendar.js
- */
-import { t } from '../../libs/i18n'
-export default {
-    // calendar 组件
-    calendar: {
-        title: t("up.calendar.chooseDates"),
-        showTitle: true,
-        showSubtitle: true,
-        mode: 'single',
-        startText: t("up.common.start"),
-        endText: t("up.common.end"),
-        customList: [],
-        color: '#3c9cff',
-        minDate: 0,
-        maxDate: 0,
-        defaultDate: null,
-        maxCount: Number.MAX_SAFE_INTEGER, // Infinity
-        rowHeight: 56,
-        formatter: null,
-        showLunar: false,
-        showMark: true,
-        confirmText: t("up.common.confirm"),
-        confirmDisabledText: t("up.common.confirm"),
-        show: false,
-        closeOnClickOverlay: false,
-        readonly: false,
-        showConfirm: true,
-        maxRange: Number.MAX_SAFE_INTEGER, // Infinity
-        rangePrompt: '',
-        showRangePrompt: true,
-        allowSameDay: false,
-		round: 0,
-		monthNum: 3,
-        weekText: [t("up.week.one"), t("up.week.two"), t("up.week.three"), t("up.week.four"), t("up.week.five"), t("up.week.six"), t("up.week.seven")],
-        forbidDays: [],
-        forbidDaysToast: t("up.calendar.disabled"),
-        monthFormat: '',
-        pageInline: false
-    }
-}

+ 0 - 109
uni_modules/uview-plus/components/u-calendar/header.vue

@@ -1,109 +0,0 @@
-<template>
-	<view class="u-calendar-header u-border-bottom">
-		<text
-			class="u-calendar-header__title"
-			v-if="showTitle"
-		>{{ title }}</text>
-		<text
-			class="u-calendar-header__subtitle"
-			v-if="showSubtitle"
-		>{{ subtitle }}</text>
-		<view class="u-calendar-header__weekdays">
-			<text class="u-calendar-header__weekdays__weekday">{{ weekText[0] }}</text>
-			<text class="u-calendar-header__weekdays__weekday">{{ weekText[1] }}</text>
-			<text class="u-calendar-header__weekdays__weekday">{{ weekText[2] }}</text>
-			<text class="u-calendar-header__weekdays__weekday">{{ weekText[3] }}</text>
-			<text class="u-calendar-header__weekdays__weekday">{{ weekText[4] }}</text>
-			<text class="u-calendar-header__weekdays__weekday">{{ weekText[5] }}</text>
-			<text class="u-calendar-header__weekdays__weekday">{{ weekText[6] }}</text>
-		</view>
-	</view>
-</template>
-
-<script>
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	export default {
-		name: 'u-calendar-header',
-		mixins: [mpMixin, mixin],
-		props: {
-			// 标题
-			title: {
-				type: String,
-				default: ''
-			},
-			// 副标题
-			subtitle: {
-				type: String,
-				default: ''
-			},
-			// 是否显示标题
-			showTitle: {
-				type: Boolean,
-				default: true
-			},
-			// 是否显示副标题
-			showSubtitle: {
-				type: Boolean,
-				default: true
-			},
-			// 星期文本
-			weekText: {
-				type: Array,
-				default: () => {
-					return []
-				}
-			},
-		},
-		data() {
-			return {
-
-			}
-		},
-		methods: {
-			name() {
-
-			}
-		},
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	.u-calendar-header {
-		display: flex;
-		flex-direction: column;
-		padding-bottom: 4px;
-
-		&__title {
-			font-size: 16px;
-			color: $u-main-color;
-			text-align: center;
-			height: 42px;
-			line-height: 42px;
-			font-weight: bold;
-		}
-
-		&__subtitle {
-			font-size: 14px;
-			color: $u-main-color;
-			height: 40px;
-			text-align: center;
-			line-height: 40px;
-			font-weight: bold;
-		}
-
-		&__weekdays {
-			@include flex;
-			justify-content: space-between;
-
-			&__weekday {
-				font-size: 13px;
-				color: $u-main-color;
-				line-height: 30px;
-				flex: 1;
-				text-align: center;
-			}
-		}
-	}
-</style>

+ 0 - 616
uni_modules/uview-plus/components/u-calendar/month.vue

@@ -1,616 +0,0 @@
-<template>
-	<view class="u-calendar-month-wrapper" ref="u-calendar-month-wrapper">
-		<view v-for="(item, index) in months" :key="index" :class="[`u-calendar-month-${index}`]"
-			:ref="`u-calendar-month-${index}`" :id="`month-${index}`">
-			<text v-if="index !== 0" class="u-calendar-month__title">{{ monthTitle(item) }}</text>
-			<view class="u-calendar-month__days">
-				<view v-if="showMark" class="u-calendar-month__days__month-mark-wrapper">
-					<text class="u-calendar-month__days__month-mark-wrapper__text">{{ item.month }}</text>
-				</view>
-				<view class="u-calendar-month__days__day" v-for="(item1, index1) in item.date" :key="index1"
-					:style="[dayStyle(index, index1, item1)]" @tap="clickHandler(index, index1, item1)"
-					:class="[item1.selected && 'u-calendar-month__days__day__select--selected']">
-					<view class="u-calendar-month__days__day__select" :style="[daySelectStyle(index, index1, item1)]">
-						<text class="u-calendar-month__days__day__select__info"
-							:class="[(item1.disabled || isForbid(item1) ) ? 'u-calendar-month__days__day__select__info--disabled' : '']"
-							:style="[textStyle(item1)]">{{ item1.day }}</text>
-						<text v-if="getBottomInfo(index, index1, item1)"
-							class="u-calendar-month__days__day__select__buttom-info"
-							:class="[(item1.disabled || isForbid(item1) ) ? 'u-calendar-month__days__day__select__buttom-info--disabled' : '']"
-							:style="[textStyle(item1)]">{{ getBottomInfo(index, index1, item1) }}</text>
-						<text v-if="item1.dot" class="u-calendar-month__days__day__select__dot"></text>
-					</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	// #ifdef APP-NVUE
-	// 由于nvue不支持百分比单位,需要查询宽度来计算每个日期的宽度
-	const dom = uni.requireNativePlugin('dom')
-	// #endif
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addUnit, deepClone, toast, sleep } from '../../libs/function/index';
-	import { colorGradient } from '../../libs/function/colorGradient';
-	import test from '../../libs/function/test';
-	import defProps from '../../libs/config/props';
-	import dayjs from '../u-datetime-picker/dayjs.esm.min.js';
-	import { t } from '../../libs/i18n'
-	export default {
-		name: 'u-calendar-month',
-		mixins: [mpMixin, mixin],
-		props: {
-			// 是否显示月份背景色
-			showMark: {
-				type: Boolean,
-				default: true
-			},
-			// 主题色,对底部按钮和选中日期有效
-			color: {
-				type: String,
-				default: '#3c9cff'
-			},
-			// 月份数据
-			months: {
-				type: Array,
-				default: () => []
-			},
-			// 日期选择类型
-			mode: {
-				type: String,
-				default: 'single'
-			},
-			// 日期行高
-			rowHeight: {
-				type: [String, Number],
-				default: 58
-			},
-			// mode=multiple时,最多可选多少个日期
-			maxCount: {
-				type: [String, Number],
-				default: Infinity
-			},
-			// mode=range时,第一个日期底部的提示文字
-			startText: {
-				type: String,
-				default: '开始'
-			},
-			// mode=range时,最后一个日期底部的提示文字
-			endText: {
-				type: String,
-				default: '结束'
-			},
-			// 默认选中的日期,mode为multiple或range是必须为数组格式
-			defaultDate: {
-				type: [Array, String, Date],
-				default: null
-			},
-			// 最小的可选日期
-			minDate: {
-				type: [String, Number],
-				default: 0
-			},
-			// 最大可选日期
-			maxDate: {
-				type: [String, Number],
-				default: 0
-			},
-			// 如果没有设置maxDate,则往后推多少个月
-			maxMonth: {
-				type: [String, Number],
-				default: 2
-			},
-			// 是否为只读状态,只读状态下禁止选择日期
-			readonly: {
-				type: Boolean,
-				default: () => defProps.calendar.readonly
-			},
-			// 日期区间最多可选天数,默认无限制,mode = range时有效
-			maxRange: {
-				type: [Number, String],
-				default: Infinity
-			},
-			// 范围选择超过最多可选天数时的提示文案,mode = range时有效
-			rangePrompt: {
-				type: String,
-				default: ''
-			},
-			// 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效
-			showRangePrompt: {
-				type: Boolean,
-				default: true
-			},
-			// 是否允许日期范围的起止时间为同一天,mode = range时有效
-			allowSameDay: {
-				type: Boolean,
-				default: false
-			},
-			forbidDays: {
-				type: Array,
-				default: () => []
-			},
-			forbidDaysToast: {
-				type: String,
-				default: ''
-			}
-		},
-		data() {
-			return {
-				// 每个日期的宽度
-				width: 0,
-				// 当前选中的日期item
-				item: {},
-				selected: []
-			}
-		},
-		watch: {
-			selectedChange: {
-				immediate: true,
-				handler(n) {
-					this.setDefaultDate()
-				}
-			}
-		},
-		computed: {
-			// 多个条件的变化,会引起选中日期的变化,这里统一管理监听
-			selectedChange() {
-				return [this.minDate, this.maxDate, this.defaultDate]
-			},
-			dayStyle(index1, index2, item) {
-				return (index1, index2, item) => {
-					const style = {}
-					let week = item.week
-					// 不进行四舍五入的形式保留2位小数
-					const dayWidth = Number(parseFloat(this.width / 7).toFixed(3).slice(0, -1))
-					// 得出每个日期的宽度
-					// #ifdef APP-NVUE
-					style.width = addUnit(dayWidth, 'px')
-					// #endif
-					style.height = addUnit(this.rowHeight, 'px')
-					if (index2 === 0) {
-						// 获取当前为星期几,如果为0,则为星期天,减一为每月第一天时,需要向左偏移的item个数
-						week = (week === 0 ? 7 : week) - 1
-						style.marginLeft = addUnit(week * dayWidth, 'px')
-					}
-					if (this.mode === 'range') {
-						// 之所以需要这么写,是因为DCloud公司的iOS客户端导致的bug
-						style.paddingLeft = 0
-						style.paddingRight = 0
-						style.paddingBottom = 0
-						style.paddingTop = 0
-					}
-					return style
-				}
-			},
-			daySelectStyle() {
-				return (index1, index2, item) => {
-					let date = dayjs(item.date).format("YYYY-MM-DD"),
-						style = {}
-					// 判断date是否在selected数组中,因为月份可能会需要补0,所以使用dateSame判断,而不用数组的includes判断
-					if (this.selected.some(item => this.dateSame(item, date))) {
-						style.backgroundColor = this.color
-					}
-					if (this.mode === 'single') {
-						if (date === this.selected[0]) {
-							// 因为需要对nvue的兼容,只能这么写,无法缩写,也无法通过类名控制等等
-							style.borderTopLeftRadius = '3px'
-							style.borderBottomLeftRadius = '3px'
-							style.borderTopRightRadius = '3px'
-							style.borderBottomRightRadius = '3px'
-						}
-					} else if (this.mode === 'range') {
-						if (this.selected.length >= 2) {
-							const len = this.selected.length - 1
-							// 第一个日期设置左上角和左下角的圆角
-							if (this.dateSame(date, this.selected[0])) {
-								style.borderTopLeftRadius = '3px'
-								style.borderBottomLeftRadius = '3px'
-							}
-							// 最后一个日期设置右上角和右下角的圆角
-							if (this.dateSame(date, this.selected[len])) {
-								style.borderTopRightRadius = '3px'
-								style.borderBottomRightRadius = '3px'
-							}
-							// 处于第一和最后一个之间的日期,背景色设置为浅色,通过将对应颜色进行等分,再取其尾部的颜色值
-							if (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this
-									.selected[len]))) {
-								style.backgroundColor = colorGradient(this.color, '#ffffff', 100)[90]
-								// 增加一个透明度,让范围区间的背景色也能看到底部的mark水印字符
-								style.opacity = 0.7
-							}
-						} else if (this.selected.length === 1) {
-							// 之所以需要这么写,是因为uni-app的iOS客户端的bug
-							// 进行还原操作,否则在nvue的iOS,uni-app有bug,会导致诡异的表现
-							style.borderTopLeftRadius = '3px'
-							style.borderBottomLeftRadius = '3px'
-						}
-					} else {
-						if (this.selected.some(item => this.dateSame(item, date))) {
-							style.borderTopLeftRadius = '3px'
-							style.borderBottomLeftRadius = '3px'
-							style.borderTopRightRadius = '3px'
-							style.borderBottomRightRadius = '3px'
-						}
-					}
-					return style
-				}
-			},
-			// 某个日期是否被选中
-			textStyle() {
-				return (item) => {
-					const date = dayjs(item.date).format("YYYY-MM-DD"),
-						style = {}
-					// 选中的日期,提示文字设置白色
-					if (this.selected.some(item => this.dateSame(item, date))) {
-						style.color = '#ffffff'
-					}
-					if (this.mode === 'range') {
-						const len = this.selected.length - 1
-						// 如果是范围选择模式,第一个和最后一个之间的日期,文字颜色设置为高亮的主题色
-						if (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this
-								.selected[len]))) {
-							style.color = this.color
-						}
-					}
-					return style
-				}
-			},
-			// 获取底部的提示文字
-			getBottomInfo() {
-				return (index1, index2, item) => {
-					const date = dayjs(item.date).format("YYYY-MM-DD")
-					const bottomInfo = item.bottomInfo
-					// 当为日期范围模式时,且选择的日期个数大于0时
-					if (this.mode === 'range' && this.selected.length > 0) {
-						if (this.selected.length === 1) {
-							// 选择了一个日期时,如果当前日期为数组中的第一个日期,则显示底部文字为“开始”
-							if (this.dateSame(date, this.selected[0])) return this.startText
-							else return bottomInfo
-						} else {
-							const len = this.selected.length - 1
-							// 如果数组中的日期大于2个时,第一个和最后一个显示为开始和结束日期
-							if (this.dateSame(date, this.selected[0]) && this.dateSame(date, this.selected[1]) &&
-								len === 1) {
-								// 如果长度为2,且第一个等于第二个日期,则提示语放在同一个item中
-								return `${this.startText}/${this.endText}`
-							} else if (this.dateSame(date, this.selected[0])) {
-								return this.startText
-							} else if (this.dateSame(date, this.selected[len])) {
-								return this.endText
-							} else {
-								return bottomInfo
-							}
-						}
-					} else {
-						return bottomInfo
-					}
-				}
-			}
-		},
-		mounted() {
-			this.init()
-		},
-		emits: ['monthSelected', 'updateMonthTop'],
-		methods: {
-			init() {
-				// 初始化默认选中
-				this.$emit('monthSelected', this.selected)
-				this.$nextTick(() => {
-					// 这里需要另一个延时,因为获取宽度后,会进行月份数据渲染,只有渲染完成之后,才有真正的高度
-					// 因为nvue下,$nextTick并不是100%可靠的
-					sleep(10).then(() => {
-						this.getWrapperWidth()
-						this.getMonthRect()
-					})
-				})
-			},
-			monthTitle(item) {
-				if (uni.getLocale() == 'zh-Hans' || uni.getLocale() == 'zh-Hant') {
-					return item.year + '年' + (item.month < 10 ? '0' + item.month : item.month) + '月'
-				} else {
-					return (item.month < 10 ? '0' + item.month : item.month) + '/' + item.year
-				}
-			},
-			isForbid(item) {
-				let date = dayjs(item.date).format("YYYY-MM-DD")
-				if (this.mode !== 'range' && this.forbidDays.includes(date)) {
-					return true
-				}
-				return false
-			},
-			// 判断两个日期是否相等
-			dateSame(date1, date2) {
-				return dayjs(date1).isSame(dayjs(date2))
-			},
-			// 获取月份数据区域的宽度,因为nvue不支持百分比,所以无法通过css设置每个日期item的宽度
-			getWrapperWidth() {
-				// #ifdef APP-NVUE
-				dom.getComponentRect(this.$refs['u-calendar-month-wrapper'], res => {
-					this.width = res.size.width
-				})
-				// #endif
-				// #ifndef APP-NVUE
-				this.$uGetRect('.u-calendar-month-wrapper').then(size => {
-					this.width = size.width
-				})
-				// #endif
-			},
-			getMonthRect() {
-				// 获取每个月份数据的尺寸,用于父组件在scroll-view滚动事件中,监听当前滚动到了第几个月份
-				const promiseAllArr = this.months.map((item, index) => this.getMonthRectByPromise(
-					`u-calendar-month-${index}`))
-				// 一次性返回
-				Promise.all(promiseAllArr).then(
-					sizes => {
-						let height = 1
-						const topArr = []
-						for (let i = 0; i < this.months.length; i++) {
-							// 添加到months数组中,供scroll-view滚动事件中,判断当前滚动到哪个月份
-							topArr[i] = height
-							height += sizes[i].height
-						}
-						// 由于微信下,无法通过this.months[i].top的形式(引用类型)去修改父组件的month的top值,所以使用事件形式对外发出
-						this.$emit('updateMonthTop', topArr)
-					})
-			},
-			// 获取每个月份区域的尺寸
-			getMonthRectByPromise(el) {
-				// #ifndef APP-NVUE
-				// $uGetRect为uView自带的节点查询简化方法,详见文档介绍:https://uview-plus.jiangruyi.com/js/getRect.html
-				// 组件内部一般用this.$uGetRect,对外的为uni.$u.getRect,二者功能一致,名称不同
-				return new Promise(resolve => {
-					this.$uGetRect(`.${el}`).then(size => {
-						resolve(size)
-					})
-				})
-				// #endif
-
-				// #ifdef APP-NVUE
-				// nvue下,使用dom模块查询元素高度
-				// 返回一个promise,让调用此方法的主体能使用then回调
-				return new Promise(resolve => {
-					dom.getComponentRect(this.$refs[el][0], res => {
-						resolve(res.size)
-					})
-				})
-				// #endif
-			},
-			// 点击某一个日期
-			clickHandler(index1, index2, item) {
-				if (this.readonly) {
-					return;
-				}
-				this.item = item
-				const date = dayjs(item.date).format("YYYY-MM-DD")
-				if (item.disabled) return
-				if (this.isForbid(item)) {
-					uni.showToast({
-						title: this.forbidDaysToast
-					})
-					return
-				}
-				// 对上一次选择的日期数组进行深度克隆
-				let selected = deepClone(this.selected)
-				if (this.mode === 'single') {
-					// 单选情况下,让数组中的元素为当前点击的日期
-					selected = [date]
-				} else if (this.mode === 'multiple') {
-					if (selected.some(item => this.dateSame(item, date))) {
-						// 如果点击的日期已在数组中,则进行移除操作,也就是达到反选的效果
-						const itemIndex = selected.findIndex(item => item === date)
-						selected.splice(itemIndex, 1)
-					} else {
-						// 如果点击的日期不在数组中,且已有的长度小于总可选长度时,则添加到数组中去
-						if (selected.length < this.maxCount) selected.push(date)
-					}
-				} else {
-					// 选择区间形式
-					if (selected.length === 0 || selected.length >= 2) {
-						// 如果原来就为0或者大于2的长度,则当前点击的日期,就是开始日期
-						selected = [date]
-					} else if (selected.length === 1) {
-						// 如果已经选择了开始日期
-						const existsDate = selected[0]
-						// 如果当前选择的日期小于上一次选择的日期,则当前的日期定为开始日期
-						if (dayjs(date).isBefore(existsDate)) {
-							selected = [date]
-						} else if (dayjs(date).isAfter(existsDate)) {
-							// 当前日期减去最大可选的日期天数,如果大于起始时间,则进行提示
-							if(dayjs(dayjs(date).subtract(this.maxRange, 'day')).isAfter(dayjs(selected[0])) && this.showRangePrompt) {
-								if(this.rangePrompt) {
-									toast(this.rangePrompt)
-								} else {
-									toast(t("up.calendar.daysExceed", { days: this.maxRange }))
-								}
-								return
-							}
-							// 如果当前日期大于已有日期,将当前的添加到数组尾部
-							selected.push(date)
-							const startDate = selected[0]
-							const endDate = selected[1]
-							const arr = []
-							let i = 0
-							do {
-								// 将开始和结束日期之间的日期添加到数组中
-								arr.push(dayjs(startDate).add(i, 'day').format("YYYY-MM-DD"))
-								i++
-								// 累加的日期小于结束日期时,继续下一次的循环
-							} while (dayjs(startDate).add(i, 'day').isBefore(dayjs(endDate)))
-							// 为了一次性修改数组,避免computed中多次触发,这里才用arr变量一次性赋值的方式,同时将最后一个日期添加近来
-							arr.push(endDate)
-							selected = arr
-						} else {
-							// 选择区间时,只有一个日期的情况下,且不允许选择起止为同一天的话,不允许选择自己
-							if (selected[0] === date && !this.allowSameDay) return
-							selected.push(date)
-						}
-					}
-				}
-				this.setSelected(selected)
-			},
-			// 设置默认日期
-			setDefaultDate() {
-				if (!this.defaultDate) {
-					// 如果没有设置默认日期,则将当天日期设置为默认选中的日期
-					const selected = [dayjs().format("YYYY-MM-DD")]
-					return this.setSelected(selected, false)
-				}
-				let defaultDate = []
-				const minDate = this.minDate || dayjs().format("YYYY-MM-DD")
-				const maxDate = this.maxDate || dayjs(minDate).add(this.maxMonth - 1, 'month').format("YYYY-MM-DD")
-				if (this.mode === 'single') {
-					// 单选模式,可以是字符串或数组,Date对象等
-					if (!test.array(this.defaultDate)) {
-						defaultDate = [dayjs(this.defaultDate).format("YYYY-MM-DD")]
-					} else {
-						defaultDate = [this.defaultDate[0]]
-					}
-				} else {
-					// 如果为非数组,则不执行
-					if (!test.array(this.defaultDate)) return
-					defaultDate = this.defaultDate
-				}
-				// 过滤用户传递的默认数组,取出只在可允许最大值与最小值之间的元素
-				defaultDate = defaultDate.filter(item => {
-					return dayjs(item).isAfter(dayjs(minDate).subtract(1, 'day')) && dayjs(item).isBefore(dayjs(
-						maxDate).add(1, 'day'))
-				})
-				this.setSelected(defaultDate, false)
-			},
-			setSelected(selected, event = true) {
-				this.selected = selected
-				event && this.$emit('monthSelected', this.selected,'tap')
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	.u-calendar-month-wrapper {
-		margin-top: 4px;
-	}
-
-	.u-calendar-month {
-
-		&__title {
-			display: flex;
-			flex-direction: column;
-			font-size: 14px;
-			line-height: 42px;
-			height: 42px;
-			color: $u-main-color;
-			text-align: center;
-			font-weight: bold;
-		}
-
-		&__days {
-			position: relative;
-			@include flex;
-			flex-wrap: wrap;
-
-			&__month-mark-wrapper {
-				position: absolute;
-				top: 0;
-				bottom: 0;
-				left: 0;
-				right: 0;
-				@include flex;
-				justify-content: center;
-				align-items: center;
-
-				&__text {
-					font-size: 155px;
-					color: rgba(231, 232, 234, 0.83);
-				}
-			}
-
-			&__day {
-				@include flex;
-				padding: 2px;
-				/* #ifndef APP-NVUE */
-				// vue下使用css进行宽度计算,因为某些安卓机会无法进行js获取父元素宽度进行计算得出,会有偏移
-				width: calc(100% / 7);
-				box-sizing: border-box;
-				/* #endif */
-
-				&__select {
-					flex: 1;
-					@include flex;
-					align-items: center;
-					justify-content: center;
-					position: relative;
-
-					&__dot {
-						width: 7px;
-						height: 7px;
-						border-radius: 100px;
-						background-color: $u-error;
-						position: absolute;
-						top: 12px;
-						right: 7px;
-					}
-
-					&__buttom-info {
-						color: $u-content-color;
-						text-align: center;
-						position: absolute;
-						bottom: 5px;
-						font-size: 10px;
-						text-align: center;
-						left: 0;
-						right: 0;
-
-						&--selected {
-							color: #ffffff;
-						}
-
-						&--disabled {
-							color: #cacbcd;
-						}
-					}
-
-					&__info {
-						text-align: center;
-						font-size: 16px;
-
-						&--selected {
-							color: #ffffff;
-						}
-
-						&--disabled {
-							color: #cacbcd;
-						}
-					}
-
-					&--selected {
-						background-color: $u-primary;
-						@include flex;
-						justify-content: center;
-						align-items: center;
-						flex: 1;
-						border-radius: 3px;
-					}
-
-					&--range-selected {
-						opacity: 0.3;
-						border-radius: 0;
-					}
-
-					&--range-start-selected {
-						border-top-right-radius: 0;
-						border-bottom-right-radius: 0;
-					}
-
-					&--range-end-selected {
-						border-top-left-radius: 0;
-						border-bottom-left-radius: 0;
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 169
uni_modules/uview-plus/components/u-calendar/props.js

@@ -1,169 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const props = defineMixin({
-    props: {
-        // 日历顶部标题
-        title: {
-            type: String,
-            default: () => defProps.calendar.title
-        },
-        // 是否显示标题
-        showTitle: {
-            type: Boolean,
-            default: () => defProps.calendar.showTitle
-        },
-        // 是否显示副标题
-        showSubtitle: {
-            type: Boolean,
-            default: () => defProps.calendar.showSubtitle
-        },
-        // 日期类型选择,single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围
-        mode: {
-            type: String,
-            default: () => defProps.calendar.mode
-        },
-        // mode=range时,第一个日期底部的提示文字
-        startText: {
-            type: String,
-            default: () => defProps.calendar.startText
-        },
-        // mode=range时,最后一个日期底部的提示文字
-        endText: {
-            type: String,
-            default: () => defProps.calendar.endText
-        },
-        // 自定义列表
-        customList: {
-            type: Array,
-            default: () => defProps.calendar.customList
-        },
-        // 主题色,对底部按钮和选中日期有效
-        color: {
-            type: String,
-            default: () => defProps.calendar.color
-        },
-        // 最小的可选日期
-        minDate: {
-            type: [String, Number],
-            default: () => defProps.calendar.minDate
-        },
-        // 最大可选日期
-        maxDate: {
-            type: [String, Number],
-            default: () => defProps.calendar.maxDate
-        },
-        // 默认选中的日期,mode为multiple或range是必须为数组格式
-        defaultDate: {
-            type: [Array, String, Date, null],
-            default: () => defProps.calendar.defaultDate
-        },
-        // mode=multiple时,最多可选多少个日期
-        maxCount: {
-            type: [String, Number],
-            default: () => defProps.calendar.maxCount
-        },
-        // 日期行高
-        rowHeight: {
-            type: [String, Number],
-            default: () => defProps.calendar.rowHeight
-        },
-        // 日期格式化函数
-        formatter: {
-            type: [Function, null],
-            default: () => defProps.calendar.formatter
-        },
-        // 是否显示农历
-        showLunar: {
-            type: Boolean,
-            default: () => defProps.calendar.showLunar
-        },
-        // 是否显示月份背景色
-        showMark: {
-            type: Boolean,
-            default: () => defProps.calendar.showMark
-        },
-        // 确定按钮的文字
-        confirmText: {
-            type: String,
-            default: () => defProps.calendar.confirmText
-        },
-        // 确认按钮处于禁用状态时的文字
-        confirmDisabledText: {
-            type: String,
-            default: () => defProps.calendar.confirmDisabledText
-        },
-        // 是否显示日历弹窗
-        show: {
-            type: Boolean,
-            default: () => defProps.calendar.show
-        },
-        // 是否允许点击遮罩关闭日历
-        closeOnClickOverlay: {
-            type: Boolean,
-            default: () => defProps.calendar.closeOnClickOverlay
-        },
-        // 是否为只读状态,只读状态下禁止选择日期
-        readonly: {
-            type: Boolean,
-            default: () => defProps.calendar.readonly
-        },
-        // 	是否展示确认按钮
-        showConfirm: {
-            type: Boolean,
-            default: () => defProps.calendar.showConfirm
-        },
-        // 日期区间最多可选天数,默认无限制,mode = range时有效
-        maxRange: {
-            type: [Number, String],
-            default: () => defProps.calendar.maxRange
-        },
-        // 范围选择超过最多可选天数时的提示文案,mode = range时有效
-        rangePrompt: {
-            type: String,
-            default: () => defProps.calendar.rangePrompt
-        },
-        // 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效
-        showRangePrompt: {
-            type: Boolean,
-            default: () => defProps.calendar.showRangePrompt
-        },
-        // 是否允许日期范围的起止时间为同一天,mode = range时有效
-        allowSameDay: {
-            type: Boolean,
-            default: () => defProps.calendar.allowSameDay
-        },
-		// 圆角值
-		round: {
-		    type: [Boolean, String, Number],
-		    default: () => defProps.calendar.round
-		},
-		// 最多展示月份数量
-		monthNum: {
-			type: [Number, String],
-			default: 3
-		},
-        // 星期文案
-        weekText: {
-			type: Array,
-			default: defProps.calendar.weekText
-		},
-        forbidDays: {
-			type: Array,
-			default: defProps.calendar.forbidDays
-		},
-        forbidDaysToast:{
-			type: String,
-			default: defProps.calendar.forbidDaysToast
-		},
-        monthFormat:{
-			type: String,
-			default: defProps.calendar.monthFormat
-		},
-        // 是否页面内展示
-        pageInline:{
-			type: Boolean,
-			default: defProps.calendar.pageInline
-		}
-    }
-})

+ 0 - 421
uni_modules/uview-plus/components/u-calendar/u-calendar.vue

@@ -1,421 +0,0 @@
-<template>
-	<u-popup
-		:show="show"
-		mode="bottom"
-		:closeable="!pageInline"
-		@close="close"
-		:round="round"
-		:pageInline="pageInline"
-		:closeOnClickOverlay="closeOnClickOverlay"
-	>
-		<view class="u-calendar">
-			<uHeader
-				:title="title"
-				:subtitle="subtitle"
-				:showSubtitle="showSubtitle"
-				:showTitle="showTitle"
-				:weekText="weekText"
-			></uHeader>
-			<scroll-view
-				:style="{
-                    height: addUnit(listHeight, 'px')
-                }"
-				scroll-y
-				@scroll="onScroll"
-				:scroll-top="scrollTop"
-				:scrollIntoView="scrollIntoView"
-			>
-				<uMonth
-					:color="color"
-					:rowHeight="rowHeight"
-					:showMark="showMark"
-					:months="months"
-					:mode="mode"
-					:maxCount="maxCount"
-					:startText="startText"
-					:endText="endText"
-					:defaultDate="defaultDate"
-					:minDate="innerMinDate"
-					:maxDate="innerMaxDate"
-					:maxMonth="monthNum"
-					:readonly="readonly"
-					:maxRange="maxRange"
-					:rangePrompt="rangePrompt"
-					:showRangePrompt="showRangePrompt"
-					:allowSameDay="allowSameDay"
-					:forbidDays="forbidDays"
-					:forbidDaysToast="forbidDaysToast"
-					:monthFormat="monthFormat"
-					ref="month"
-					@monthSelected="monthSelected"
-					@updateMonthTop="updateMonthTop"
-				></uMonth>
-			</scroll-view>
-			<slot name="footer" v-if="showConfirm">
-				<view class="u-calendar__confirm">
-					<u-button
-						shape="circle"
-						:text="
-                            buttonDisabled ? confirmDisabledText : confirmText
-                        "
-						:color="color"
-						@click="confirm"
-						:disabled="buttonDisabled"
-					></u-button>
-				</view>
-			</slot>
-		</view>
-	</u-popup>
-</template>
-
-<script>
-import uHeader from './header.vue'
-import uMonth from './month.vue'
-import { props } from './props.js'
-import util from './util.js'
-import dayjs from '../u-datetime-picker/dayjs.esm.min.js';
-import Calendar from '../../libs/util/calendar.js'
-import { mpMixin } from '../../libs/mixin/mpMixin.js'
-import { mixin } from '../../libs/mixin/mixin.js'
-import { addUnit, getPx, range, error, padZero } from '../../libs/function/index';
-import test from '../../libs/function/test';
-/**
- * Calendar 日历
- * @description  此组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中.
- * @tutorial https://uview-plus.jiangruyi.com/components/calendar.html
- *
- * @property {String}				title				标题内容 (默认 日期选择 )
- * @property {Boolean}				showTitle			是否显示标题  (默认 true )
- * @property {Boolean}				showSubtitle		是否显示副标题	(默认 true )
- * @property {String}				mode				日期类型选择  single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围 ( 默认 'single' )
- * @property {String}				startText			mode=range时,第一个日期底部的提示文字  (默认 '开始' )
- * @property {String}				endText				mode=range时,最后一个日期底部的提示文字 (默认 '结束' )
- * @property {Array}				customList			自定义列表
- * @property {String}				color				主题色,对底部按钮和选中日期有效  (默认 ‘#3c9cff' )
- * @property {String | Number}		minDate				最小的可选日期	 (默认 0 )
- * @property {String | Number}		maxDate				最大可选日期  (默认 0 )
- * @property {Array | String| Date}	defaultDate			默认选中的日期,mode为multiple或range是必须为数组格式
- * @property {String | Number}		maxCount			mode=multiple时,最多可选多少个日期  (默认 	Number.MAX_SAFE_INTEGER  )
- * @property {String | Number}		rowHeight			日期行高 (默认 56 )
- * @property {Function}				formatter			日期格式化函数
- * @property {Boolean}				showLunar			是否显示农历  (默认 false )
- * @property {Boolean}				showMark			是否显示月份背景色 (默认 true )
- * @property {String}				confirmText			确定按钮的文字 (默认 '确定' )
- * @property {String}				confirmDisabledText	确认按钮处于禁用状态时的文字 (默认 '确定' )
- * @property {Boolean}				show				是否显示日历弹窗 (默认 false )
- * @property {Boolean}				closeOnClickOverlay	是否允许点击遮罩关闭日历 (默认 false )
- * @property {Boolean}				readonly	        是否为只读状态,只读状态下禁止选择日期 (默认 false )
- * @property {String | Number}		maxRange	        日期区间最多可选天数,默认无限制,mode = range时有效
- * @property {String}				rangePrompt	        范围选择超过最多可选天数时的提示文案,mode = range时有效
- * @property {Boolean}				showRangePrompt	    范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效 (默认 true )
- * @property {Boolean}				allowSameDay	    是否允许日期范围的起止时间为同一天,mode = range时有效 (默认 false )
- * @property {Number|String}	    round				圆角值,默认无圆角  (默认 0 )
- * @property {Number|String}	    monthNum			最多展示的月份数量  (默认 3 )
- * @property {Array}	            weekText			星期文案  (默认 ['一', '二', '三', '四', '五', '六', '日'] )
- *
- * @event {Function()} confirm 		点击确定按钮时触发		选择日期相关的返回参数
- * @event {Function()} close 		日历关闭时触发			可定义页面关闭时的回调事件
- * @example <u-calendar  :defaultDate="defaultDateMultiple" :show="show" mode="multiple" @confirm="confirm">
-	</u-calendar>
- * */
-export default {
-	name: 'u-calendar',
-	mixins: [mpMixin, mixin, props],
-	components: {
-		uHeader,
-		uMonth
-	},
-	data() {
-		return {
-			// 需要显示的月份的数组
-			months: [],
-			// 在月份滚动区域中,当前视图中月份的index索引
-			monthIndex: 0,
-			// 月份滚动区域的高度
-			listHeight: 0,
-			// month组件中选择的日期数组
-			selected: [],
-			scrollIntoView: '',
-			scrollIntoViewScroll: '',
-			scrollTop:0,
-			// 过滤处理方法
-			innerFormatter: (value) => value
-		}
-	},
-	watch: {
-		scrollIntoView: {
-			immediate: true,
-			handler(n) {
-				// console.log('scrollIntoView', n)
-			}
-		},
-		selectedChange: {
-			immediate: true,
-			handler(n) {
-				this.setMonth()
-			}
-		},
-		// 打开弹窗时,设置月份数据
-		show: {
-			immediate: true,
-			handler(n) {
-				if (n) {
-					this.setMonth()
-				} else {
-					// 关闭时重置scrollIntoView,否则会出现二次打开日历,当前月份数据显示不正确。
-					// scrollIntoView需要有一个值变动过程,才会产生作用。
-					this.scrollIntoView = ''
-				}
-			}
-		}
-	},
-	computed: {
-		// 由于maxDate和minDate可以为字符串(2021-10-10),或者数值(时间戳),但是dayjs如果接受字符串形式的时间戳会有问题,这里进行处理
-		innerMaxDate() {
-			return test.number(this.maxDate)
-				? Number(this.maxDate)
-				: this.maxDate
-		},
-		innerMinDate() {
-			return test.number(this.minDate)
-				? Number(this.minDate)
-				: this.minDate
-		},
-		// 多个条件的变化,会引起选中日期的变化,这里统一管理监听
-		selectedChange() {
-			return [this.innerMinDate, this.innerMaxDate, this.defaultDate]
-		},
-		subtitle() {
-			// 初始化时,this.months为空数组,所以需要特别判断处理
-			if (this.months.length) {
-				if (uni.getLocale() == 'zh-Hans' || uni.getLocale() == 'zh-Hant') {
-					return this.months[this.monthIndex].year + '年' + (this.months[this.monthIndex].month < 10 ? '0' + this.months[this.monthIndex].month : this.months[this.monthIndex].month) + '月'
-				} else {
-					return (this.months[this.monthIndex].month < 10 ? '0' + this.months[this.monthIndex].month : this.months[this.monthIndex].month) + '/' + this.months[this.monthIndex].year
-				}
-			} else {
-				return ''
-			}
-		},
-		buttonDisabled() {
-			// 如果为range类型,且选择的日期个数不足1个时,让底部的按钮出于disabled状态
-			if (this.mode === 'range') {
-				if (this.selected.length <= 1) {
-					return true
-				} else {
-					return false
-				}
-			} else {
-				return false
-			}
-		}
-	},
-	mounted() {
-		this.start = Date.now()
-		this.init()
-	},
-	emits: ["confirm", "close"],
-	methods: {
-		addUnit,
-		// 在微信小程序中,不支持将函数当做props参数,故只能通过ref形式调用
-		setFormatter(e) {
-			this.innerFormatter = e
-		},
-		// month组件内部选择日期后,通过事件通知给父组件
-		monthSelected(e,scene ='init') {
-			this.selected = e
-			if (!this.showConfirm) {
-				// 在不需要确认按钮的情况下,如果为单选,或者范围多选且已选长度大于2,则直接进行返还
-				if (
-					this.mode === 'multiple' ||
-					this.mode === 'single' ||
-					(this.mode === 'range' && this.selected.length >= 2)
-				) {
-				   if( scene === 'init'){
-					 return
-				   }
-				   if( scene === 'tap') {
-					 this.$emit('confirm', this.selected)
-				   }
-				}
-			}
-		},
-		init() {
-			// 校验maxDate,不能小于minDate。
-			if (
-				this.innerMaxDate &&
-                this.innerMinDate &&
-				new Date(this.innerMaxDate).getTime() < new Date(this.innerMinDate).getTime()
-			) {
-				return error('maxDate不能小于minDate时间')
-			}
-			// 滚动区域的高度
-			let bottomPadding = 0;
-			if (this.pageInline) {
-				bottomPadding = 0
-			} else {
-				bottomPadding = 30
-			}
-			this.listHeight = this.rowHeight * 5 + bottomPadding
-			this.setMonth()
-		},
-		close() {
-			this.$emit('close')
-		},
-		// 点击确定按钮
-		confirm() {
-			if (!this.buttonDisabled) {
-				this.$emit('confirm', this.selected)
-			}
-		},
-		// 获得两个日期之间的月份数
-		getMonths(minDate, maxDate) {
-			const minYear = dayjs(minDate).year()
-			const minMonth = dayjs(minDate).month() + 1
-			const maxYear = dayjs(maxDate).year()
-			const maxMonth = dayjs(maxDate).month() + 1
-			return (maxYear - minYear) * 12 + (maxMonth - minMonth) + 1
-		},
-		// 设置月份数据
-		setMonth() {
-			// 最小日期的毫秒数
-			const minDate = this.innerMinDate || dayjs().valueOf()
-			// 如果没有指定最大日期,则往后推3个月
-			const maxDate =
-				this.innerMaxDate ||
-				dayjs(minDate)
-					.add(this.monthNum - 1, 'month')
-					.valueOf()
-			// 最大最小月份之间的共有多少个月份,
-			const months = range(
-				1,
-				this.monthNum,
-				this.getMonths(minDate, maxDate)
-			)
-			// 先清空数组
-			this.months = []
-			for (let i = 0; i < months; i++) {
-				this.months.push({
-					date: new Array(
-						dayjs(minDate).add(i, 'month').daysInMonth()
-					)
-						.fill(1)
-						.map((item, index) => {
-							// 日期,取值1-31
-							let day = index + 1
-							// 星期,0-6,0为周日
-							const week = dayjs(minDate)
-								.add(i, 'month')
-								.date(day)
-								.day()
-							const date = dayjs(minDate)
-								.add(i, 'month')
-								.date(day)
-								.format('YYYY-MM-DD')
-							let bottomInfo = ''
-							if (this.showLunar) {
-								// 将日期转为农历格式
-								const lunar = Calendar.solar2lunar(
-									dayjs(date).year(),
-									dayjs(date).month() + 1,
-									dayjs(date).date()
-								)
-								bottomInfo = lunar.IDayCn
-							}
-							let config = {
-								day,
-								week,
-								// 小于最小允许的日期,或者大于最大的日期,则设置为disabled状态
-								disabled:
-									dayjs(date).isBefore(
-										dayjs(minDate).format('YYYY-MM-DD')
-									) ||
-									dayjs(date).isAfter(
-										dayjs(maxDate).format('YYYY-MM-DD')
-									),
-								// 返回一个日期对象,供外部的formatter获取当前日期的年月日等信息,进行加工处理
-								date: new Date(date),
-								bottomInfo,
-								dot: false,
-								month:
-									dayjs(minDate).add(i, 'month').month() + 1
-							}
-							const formatter =
-								this.formatter || this.innerFormatter
-							return formatter(config)
-						}),
-					// 当前所属的月份
-					month: dayjs(minDate).add(i, 'month').month() + 1,
-					// 当前年份
-					year: dayjs(minDate).add(i, 'month').year()
-				})
-			}
-		},
-		// 滚动到默认设置的月份
-		scrollIntoDefaultMonth(selected) {
-			// 查询默认日期在可选列表的下标
-			const _index = this.months.findIndex(({
-				  year,
-				  month
-			  }) => {
-				month = padZero(month)
-				return `${year}-${month}` === selected
-			})
-			if (_index !== -1) {
-				// #ifndef MP-WEIXIN
-				this.$nextTick(() => {
-					this.scrollIntoView = `month-${_index}`
-					this.scrollIntoViewScroll = this.scrollIntoView
-				})
-				// #endif
-				// #ifdef MP-WEIXIN
-				this.scrollTop = this.months[_index].top || 0;
-				// #endif
-			}
-		},
-		// scroll-view滚动监听
-		onScroll(event) {
-			// 不允许小于0的滚动值,如果scroll-view到顶了,继续下拉,会出现负数值
-			const scrollTop = Math.max(0, event.detail.scrollTop)
-			// 将当前滚动条数值,除以滚动区域的高度,可以得出当前滚动到了哪一个月份的索引
-			for (let i = 0; i < this.months.length; i++) {
-				if (scrollTop >= (this.months[i].top || this.listHeight)) {
-					this.monthIndex = i
-					this.scrollIntoViewScroll = `month-${i}`
-				}
-			}
-		},
-		// 更新月份的top值
-		updateMonthTop(topArr = []) {
-			// 设置对应月份的top值,用于onScroll方法更新月份
-			topArr.map((item, index) => {
-				this.months[index].top = item
-			})
-
-			// 获取默认日期的下标
-			if (!this.defaultDate) {
-				// 如果没有设置默认日期,则将当天日期设置为默认选中的日期
-				const selected = dayjs().format("YYYY-MM")
-				this.scrollIntoDefaultMonth(selected)
-				return
-			}
-			let selected = dayjs().format("YYYY-MM");
-			// 单选模式,可以是字符串或数组,Date对象等
-			if (!test.array(this.defaultDate)) {
-				selected = dayjs(this.defaultDate).format("YYYY-MM")
-			} else {
-				selected = dayjs(this.defaultDate[0]).format("YYYY-MM");
-			}
-			this.scrollIntoDefaultMonth(selected)
-		}
-	}
-}
-</script>
-
-<style lang="scss" scoped>
-.u-calendar {
-	&__confirm {
-		padding: 7px 18px;
-	}
-}
-</style>

+ 0 - 86
uni_modules/uview-plus/components/u-calendar/util.js

@@ -1,86 +0,0 @@
-import dayjs from '../u-datetime-picker/dayjs.esm.min.js';
-export default {
-    methods: {
-        // 设置月份数据
-        setMonth() {
-            // 月初是周几
-            const day = dayjs(this.date).date(1).day()
-            const start = day == 0 ? 6 : day - 1
-
-            // 本月天数
-            const days = dayjs(this.date).endOf('month').format('D')
-
-            // 上个月天数
-            const prevDays = dayjs(this.date).endOf('month').subtract(1, 'month').format('D')
-
-            // 日期数据
-            const arr = []
-            // 清空表格
-            this.month = []
-
-            // 添加上月数据
-            arr.push(
-                ...new Array(start).fill(1).map((e, i) => {
-                    const day = prevDays - start + i + 1
-
-                    return {
-                        value: day,
-                        disabled: true,
-                        date: dayjs(this.date).subtract(1, 'month').date(day).format('YYYY-MM-DD')
-                    }
-                })
-            )
-
-            // 添加本月数据
-            arr.push(
-                ...new Array(days - 0).fill(1).map((e, i) => {
-                    const day = i + 1
-
-                    return {
-                        value: day,
-                        date: dayjs(this.date).date(day).format('YYYY-MM-DD')
-                    }
-                })
-            )
-
-            // 添加下个月
-            arr.push(
-                ...new Array(42 - days - start).fill(1).map((e, i) => {
-                    const day = i + 1
-
-                    return {
-                        value: day,
-                        disabled: true,
-                        date: dayjs(this.date).add(1, 'month').date(day).format('YYYY-MM-DD')
-                    }
-                })
-            )
-
-            // 分割数组
-            for (let n = 0; n < arr.length; n += 7) {
-                this.month.push(
-                    arr.slice(n, n + 7).map((e, i) => {
-                        e.index = i + n
-
-                        // 自定义信息
-                        const custom = this.customList.find((c) => c.date == e.date)
-
-                        // 农历
-                        if (this.lunar) {
-                            const {
-                                IDayCn,
-                                IMonthCn
-                            } = this.getLunar(e.date)
-                            e.lunar = IDayCn == '初一' ? IMonthCn : IDayCn
-                        }
-
-                        return {
-                            ...e,
-                            ...custom
-                        }
-                    })
-                )
-            }
-        }
-    }
-}

+ 0 - 423
uni_modules/uview-plus/components/u-canvas/u-canvas.vue

@@ -1,423 +0,0 @@
-<template>
-    <view class="u-canvas"
-        :id="rootId"
-        :style="{
-            width: useRootHeightAndWidth ? '100%' : 'auto',
-            height: useRootHeightAndWidth ? '100%' : 'auto',
-        }">
-        <!-- #ifdef MP || H5 -->
-        <canvas
-            class="u-canvas__canvas"
-            :id="canvasId"
-            :canvas-id="canvasId"
-            type="2d"
-            :style="{ width: width + unit, height: height + unit }"
-            @touchstart="onTouchStart"
-            @touchmove="onTouchMove"
-            @touchend="onTouchEnd"/>
-        <!-- #endif -->
-
-        <!-- #ifdef APP-PLUS -->
-        <canvas
-            class="u-canvas__canvas"
-            :id="canvasId"
-            :canvas-id="canvasId"
-            :style="{ width: width + unit, height: height + unit }" 
-            @touchstart="onTouchStart"
-            @touchmove="onTouchMove"
-            @touchend="onTouchEnd"/>
-        <!-- #endif -->
-
-        <!-- #ifdef APP-NVUE -->
-        <gcanvas class="u-canvas__canvas" ref="gcanvess"
-            :style="{ width: width + unit, height: height + unit }"
-            @touchstart="onTouchStart"
-            @touchmove="onTouchMove"
-            @touchend="onTouchEnd">
-        </gcanvas>
-        <!-- #endif -->
-    </view>
-</template>
-
-<script>
-// #ifdef APP-NVUE
-// https://github.com/dcloudio/NvueCanvasDemo/blob/master/README.md
-import {
-    enable,
-    WeexBridge,
-	Image as GImage
-} from '../../libs/util/gcanvas/index.js';
-// #endif
-let canvasNode = null;
-export default {
-    name: "u-canvas",
-    props: {
-        canvasId: {
-            type: String,
-            default: () => {
-				return `u-canvas${Math.floor(Math.random() * 1000000)}`
-			}
-        },
-        width: {
-            type: [String, Number],
-            default: 300
-        },
-        height: {
-            type: [String, Number],
-            default: 300
-        },
-        unit: {
-            type: String,
-            default: 'px'
-        },
-        useRootHeightAndWidth: {
-            type: Boolean,
-            default: false
-        },
-        // 背景色
-        bgColor: {
-            type: String,
-            default: '#ffffff'
-        }
-    },
-    data() {
-        return {
-            rootId: `rootId${Number(Math.random() * 100).toFixed(0)}`,
-            ganvas: null,
-            canvasContext: null,
-            widthLocal: this.width,
-            heightLocal: this.height,
-            ctx: null
-        };
-    },
-    computed: {
-        // 计算实际画布尺寸
-        actualWidth() {
-            return this.useRootHeightAndWidth ? this.widthLocal : Number(this.width);
-        },
-        actualHeight() {
-            return this.useRootHeightAndWidth ? this.heightLocal : Number(this.height);
-        }
-    },
-    methods: {
-        // 添加触摸事件处理方法
-        onTouchStart(e) {
-            this.$emit('touchstart', e);
-        },
-        onTouchMove(e) {
-            this.$emit('touchmove', e);
-        },
-        onTouchEnd(e) {
-            this.$emit('touchend', e);
-        },
-
-        /**
-         * 获取节点
-         * @param id 节点id
-         * @param isCanvas 是否为Canvas节点
-         * @return {Promise<unknown>}
-         */
-        async getCanvasNode(id, isCanvas = true) {
-			let that = this
-        	return new Promise((resolve, reject) => {
-        		try {
-        			// #ifdef APP-NVUE
-        			setTimeout(() => {
-        				/*获取元素引用*/
-        				this.ganvas = this.$refs["gcanvess"]
-        				/*通过元素引用获取canvas对象*/
-        				let canvasNode = enable(this.ganvas, {
-        				    bridge: WeexBridge
-        				})
-        				resolve(canvasNode)
-        			}, 200)
-        			// #endif
-        			// #ifndef APP-PLUS-NVUE
-                    const query = uni.createSelectorQuery().in(that).select(`#${id}`);
-                    query.fields({
-                            node: true,
-                            size: true
-                        })
-                        .exec((res) => {
-                            if (isCanvas) {
-                                if (res[0]?.node) {
-                                    resolve(res[0].node)
-                                } else {
-                                    resolve(false)
-                                    console.error("获取节点出错", res)
-                                }
-                            } else {
-                                resolve(res[0])
-                            }
-                        })
-        			// #endif
-        		} catch (e) {
-        			console.error("获取节点失败", e)
-        		}
-        	})
-        },
-		
-        /**
-         * 获取Canvas上下文
-         */
-        getCanvasContext() {
-            // #ifdef APP-PLUS
-            return uni.createCanvasContext(this.canvasId, this);
-            // #endif
-            // #ifdef APP-PLUS-NVUE || MP || H5
-            return canvasNode.getContext('2d');
-            // #endif
-        },
-
-        /**
-         * 初始化Canvas
-         */
-        async initCanvas() {
-            try {
-                canvasNode = await this.getCanvasNode(this.canvasId);
-                
-                // #ifdef MP-WEIXIN
-                // 在微信小程序中,为了提高清晰度,需要考虑设备像素比
-                const dpr = uni.getSystemInfoSync().pixelRatio;
-                if(canvasNode) {
-                    // 设置canvas实际绘制尺寸为显示尺寸的dpr倍
-                    canvasNode.width = this.actualWidth * dpr;
-                    canvasNode.height = this.actualHeight * dpr;
-                }
-                // #endif
-                
-                this.ctx = this.getCanvasContext();
-                
-                // #ifdef MP-WEIXIN
-                if(this.ctx) {
-                    this.ctx.scale(dpr, dpr);
-                }
-                // #endif
-                
-                // 初始化背景,但不在微信小程序中调用draw
-                this.clearCanvas();
-            } catch (error) {
-                console.error("初始化Canvas失败:", error);
-            }
-        },
-
-        /**
-         * 清空画布
-         */
-        clearCanvas() {
-            if (!this.ctx) return;
-
-            this.clearRect(0, 0, this.actualWidth, this.actualHeight);
-
-            // 填充背景色
-            this.beginPath();
-            this.rect(0, 0, this.actualWidth, this.actualHeight);
-
-            this.setFillStyle(this.bgColor);
-            this.fill();
-            
-            this.draw();
-        },
-        rect(x, y, width, height) {
-            if (!this.ctx) return;
-            this.ctx.rect(x, y, width, height);
-        },
-        clearRect(x, y, width, height) {
-            if (!this.ctx) return;
-            this.ctx.clearRect(x, y, width, height);
-        },
-        fill() {
-            if (!this.ctx) return;
-            this.ctx.fill();
-        },
-        setFillStyle(color) {
-            if (!this.ctx) return;
-
-            // #ifndef APP-PLUS-NVUE
-            if (this.ctx.setFillStyle) {
-                this.ctx.setFillStyle(color);
-            } else {
-                this.ctx.fillStyle = color;
-            }
-            // #endif
-            // #ifdef APP-PLUS-NVUE
-            this.ctx.setFillStyle(color);
-            // #endif
-        },
-
-        /**
-         * 设置线条样式
-         */
-        setLineStyle(lineColor, lineWidth) {
-            if (!this.ctx) return;
-            this.setLineCap('round');
-            this.setLineJoin('round');
-            this.setStrokeStyle(lineColor);
-            this.setLineWidth(lineWidth);
-        },
-        setLineCap(lineCap = 'round') {
-            if (!this.ctx) return;
-            if (this.ctx.setLineCap) {
-                this.ctx.setLineCap(lineCap);
-            } else {
-                this.ctx.lineCap = lineCap;
-            }
-        },
-        setLineJoin(lineJoin = 'round') {
-            if (!this.ctx) return;
-            if (this.ctx.setLineJoin) {
-                this.ctx.setLineJoin(lineJoin);
-            } else {
-                this.ctx.lineJoin = lineJoin;
-            }
-        },
-        setStrokeStyle(color) {
-            if (!this.ctx) return;
-            if (this.ctx.setStrokeStyle) {
-                this.ctx.setStrokeStyle(color);
-            } else {
-                this.ctx.strokeStyle = color;
-            }
-        },
-        setLineWidth(width) {
-            if (!this.ctx) return;
-            if (this.ctx.setLineWidth) {
-                this.ctx.setLineWidth(width);
-            } else {
-                this.ctx.lineWidth = width;
-            }
-        },
-
-        /**
-         * 开始路径
-         */
-        beginPath() {
-            if (!this.ctx) return;
-            this.ctx.beginPath();
-        },
-
-        /**
-         * 移动到某点
-         */
-        moveTo(x, y) {
-            if (!this.ctx) return;
-            this.ctx.moveTo(x, y);
-        },
-
-        /**
-         * 画线到某点
-         */
-        lineTo(x, y) {
-            if (!this.ctx) return;
-            this.ctx.lineTo(x, y);
-        },
-
-        /**
-         * 描边
-         */
-        stroke() {
-            if (!this.ctx) return;
-            this.ctx.stroke();
-        },
-
-        /**
-         * 关闭路径
-         */
-        closePath() {
-            if (!this.ctx) return;
-            this.ctx.closePath();
-        },
-
-        /**
-         * 绘制操作
-         */
-        draw(isLastDraw = false) {
-            // #ifndef MP-WEIXIN
-            if (this.ctx && typeof this.ctx.draw === 'function') {
-                this.ctx.draw(isLastDraw);
-            }
-            // #endif
-        },
-
-        /**
-         * 导出图片
-         */
-        exportImage(fileType = 'png', quality = 1) {
-            return new Promise((resolve, reject) => {
-                // #ifdef MP-WEIXIN
-                // 微信小程序中需要先完成绘制,然后导出图片
-                setTimeout(() => {
-                    uni.canvasToTempFilePath({
-                        x: 0,
-                        y: 0,
-                        width: this.actualWidth,
-                        height: this.actualHeight,
-                        destWidth: this.actualWidth * 2, // 使用双倍尺寸以提高清晰度
-                        destHeight: this.actualHeight * 2,
-                        canvas: canvasNode, // 2d必须
-                        canvasId: this.canvasId,
-                        fileType: fileType,
-                        quality: quality,
-                        success: (res) => {
-                            resolve(res.tempFilePath);
-                        },
-                        fail: (err) => {
-                            console.error('导出图片失败:', err);
-                            reject(err);
-                        }
-                    }, this);
-                }, 50); // 等待50毫秒确保绘制完成
-                // #endif
-
-                // #ifndef MP-WEIXIN
-                uni.canvasToTempFilePath({
-                    canvas: canvasNode, // 2d必须
-                    canvasId: this.canvasId,
-                    fileType: fileType,
-                    quality: quality,
-                    success: (res) => {
-                        resolve(res.tempFilePath);
-                    },
-                    fail: (err) => {
-                        console.error('导出图片失败:', err);
-                        reject(err);
-                    }
-                }, this);
-                // #endif
-            });
-        },
-
-        /**
-         * 使用根节点宽高 设置新的size
-         * @return {Promise<void>}
-         */
-        async setNewSize(){
-            const rootNode = await this.getCanvasNode(this.rootId, false);
-            const { width , height } = rootNode;
-            this.widthLocal = height;
-            this.heightLocal = width;
-        }
-    },
-    
-    async mounted() {
-        // 如果使用根节点的宽高 则 重新设置 size
-        if(this.useRootHeightAndWidth){
-            await this.setNewSize();
-        }
-        
-        // 初始化Canvas
-        await this.initCanvas();
-    }
-};
-</script>
-
-<style lang="scss" scoped>
-    .u-canvas {
-        position: relative;
-        overflow: hidden;
-    }
-
-    .u-canvas__canvas {
-        display: block;
-    }
-</style>

+ 0 - 15
uni_modules/uview-plus/components/u-car-keyboard/carKeyboard.js

@@ -1,15 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/carKeyboard.js
- */
-export default {
-    // 车牌号键盘
-    carKeyboard: {
-        random: false
-    }
-}

+ 0 - 17
uni_modules/uview-plus/components/u-car-keyboard/props.js

@@ -1,17 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const props = defineMixin({
-    props: {
-        // 是否打乱键盘按键的顺序
-        random: {
-            type: Boolean,
-            default: false
-        },
-        // 输入一个中文后,是否自动切换到英文
-        autoChange: {
-            type: Boolean,
-            default: false
-        }
-    }
-})

+ 0 - 314
uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue

@@ -1,314 +0,0 @@
-<template>
-	<view
-		class="u-keyboard"
-		@touchmove.stop.prevent="noop"
-	>
-		<view
-			v-for="(group, i) in abc ? engKeyBoardList : areaList"
-			:key="i"
-			class="u-keyboard__button"
-			:index="i"
-			:class="[i + 1 === 4 && 'u-keyboard__button--center']"
-		>
-			<view
-				v-if="i === 3"
-				class="u-keyboard__button__inner-wrapper"
-			>
-				<view
-					class="u-keyboard__button__inner-wrapper__left"
-					hover-class="u-hover-class"
-					:hover-stay-time="200"
-					@tap="changeCarInputMode"
-				>
-					<text
-						class="u-keyboard__button__inner-wrapper__left__lang"
-						:class="[!abc && 'u-keyboard__button__inner-wrapper__left__lang--active']"
-					>中</text>
-					<text class="u-keyboard__button__inner-wrapper__left__line">/</text>
-					<text
-						class="u-keyboard__button__inner-wrapper__left__lang"
-						:class="[abc && 'u-keyboard__button__inner-wrapper__left__lang--active']"
-					>英</text>
-				</view>
-			</view>
-			<view
-				class="u-keyboard__button__inner-wrapper"
-				v-for="(item, j) in group"
-				:key="j"
-			>
-				<view
-					class="u-keyboard__button__inner-wrapper__inner"
-					:hover-stay-time="200"
-					@tap="carInputClick(i, j)"
-					hover-class="u-hover-class"
-				>
-					<text class="u-keyboard__button__inner-wrapper__inner__text">{{ item }}</text>
-				</view>
-			</view>
-			<view
-				v-if="i === 3"
-				@touchstart="backspaceClick"
-				@touchend="clearTimer"
-				class="u-keyboard__button__inner-wrapper"
-			>
-				<view
-					class="u-keyboard__button__inner-wrapper__right"
-					hover-class="u-hover-class"
-					:hover-stay-time="200"
-				>
-					<up-icon
-						size="28"
-						name="backspace"
-						color="#303133"
-					></up-icon>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { randomArray, sleep } from '../../libs/function/index';
-	/**
-	 * keyboard 键盘组件
-	 * @description 此为uview-plus自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/keyboard.html
-	 * @property {Boolean} random 是否打乱键盘的顺序
-	 * @event {Function} change 点击键盘触发
-	 * @event {Function} backspace 点击退格键触发
-	 * @example <u-keyboard ref="uKeyboard" mode="car" v-model="show"></u-keyboard>
-	 */
-	export default {
-		name: "u-car-keyboard",
-		mixins: [mpMixin, mixin, props],
-		data() {
-			return {
-				// 车牌输入时,abc=true为输入车牌号码,bac=false为输入省份中文简称
-				abc: false
-			};
-		},
-		computed: {
-			areaList() {
-				let data = [
-					'京',
-					'沪',
-					'粤',
-					'津',
-					'冀',
-					'豫',
-					'云',
-					'辽',
-					'黑',
-					'湘',
-					'皖',
-					'鲁',
-					'苏',
-					'浙',
-					'赣',
-					'鄂',
-					'桂',
-					'甘',
-					'晋',
-					'陕',
-					'蒙',
-					'吉',
-					'闽',
-					'贵',
-					'渝',
-					'川',
-					'青',
-					'琼',
-					'宁',
-					'挂',
-					'藏',
-					'港',
-					'澳',
-					'新',
-					'使',
-					'学'
-				];
-				let tmp = [];
-				// 打乱顺序
-				if (this.random) data = randomArray(data);
-				// 切割成二维数组
-				tmp[0] = data.slice(0, 10);
-				tmp[1] = data.slice(10, 20);
-				tmp[2] = data.slice(20, 30);
-				tmp[3] = data.slice(30, 36);
-				return tmp;
-			},
-			engKeyBoardList() {
-				let data = [
-					1,
-					2,
-					3,
-					4,
-					5,
-					6,
-					7,
-					8,
-					9,
-					0,
-					'Q',
-					'W',
-					'E',
-					'R',
-					'T',
-					'Y',
-					'U',
-					'I',
-					'O',
-					'P',
-					'A',
-					'S',
-					'D',
-					'F',
-					'G',
-					'H',
-					'J',
-					'K',
-					'L',
-					'Z',
-					'X',
-					'C',
-					'V',
-					'B',
-					'N',
-					'M'
-				];
-				let tmp = [];
-				if (this.random) data = randomArray(data);
-				tmp[0] = data.slice(0, 10);
-				tmp[1] = data.slice(10, 20);
-				tmp[2] = data.slice(20, 30);
-				tmp[3] = data.slice(30, 36);
-				return tmp;
-			}
-		},
-		emits: ["change", "backspace"],
-		methods: {
-			// 点击键盘按钮
-			carInputClick(i, j) {
-				let value = '';
-				// 不同模式,获取不同数组的值
-				if (this.abc) value = this.engKeyBoardList[i][j];
-				else value = this.areaList[i][j];
-				// 如果允许自动切换,则将中文状态切换为英文
-				if (!this.abc && this.autoChange) sleep(200).then(() => this.abc = true)
-				this.$emit('change', value);
-			},
-			// 修改汽车牌键盘的输入模式,中文|英文
-			changeCarInputMode() {
-				this.abc = !this.abc;
-			},
-			// 点击退格键
-			backspaceClick() {
-				this.$emit('backspace');
-				clearInterval(this.timer); //再次清空定时器,防止重复注册定时器
-				this.timer = null;
-				this.timer = setInterval(() => {
-					this.$emit('backspace');
-				}, 250);
-			},
-			clearTimer() {
-				clearInterval(this.timer);
-				this.timer = null;
-			},
-		}
-	};
-</script>
-
-<style lang="scss" scoped>
-	$u-car-keyboard-background-color: rgb(224, 228, 230) !default;
-	$u-car-keyboard-padding:6px 0 6px !default;
-	$u-car-keyboard-button-inner-width:64rpx !default;
-	$u-car-keyboard-button-inner-background-color:#FFFFFF !default;
-	$u-car-keyboard-button-height:80rpx !default;
-	$u-car-keyboard-button-inner-box-shadow:0 1px 0px #999992 !default;
-	$u-car-keyboard-button-border-radius:4px !default;
-	$u-car-keyboard-button-inner-margin:8rpx 5rpx !default;
-	$u-car-keyboard-button-text-font-size:16px !default;
-	$u-car-keyboard-button-text-color:$u-main-color !default;
-	$u-car-keyboard-center-inner-margin: 0 4rpx !default;
-	$u-car-keyboard-special-button-width:134rpx !default;
-	$u-car-keyboard-lang-font-size:16px !default;
-	$u-car-keyboard-lang-color:$u-main-color !default;
-	$u-car-keyboard-active-color:$u-primary !default;
-	$u-car-keyboard-line-font-size:15px !default;
-	$u-car-keyboard-line-color:$u-main-color !default;
-	$u-car-keyboard-line-margin:0 1px !default;
-	$u-car-keyboard-u-hover-class-background-color:#BBBCC6 !default;
-
-	.u-keyboard {
-		@include flex(column);
-		justify-content: space-around;
-		background-color: $u-car-keyboard-background-color;
-		align-items: stretch;
-		padding: $u-car-keyboard-padding;
-
-		&__button {
-			@include flex;
-			justify-content: center;
-			flex: 1;
-			/* #ifndef APP-NVUE */
-			/* #endif */
-
-			&__inner-wrapper {
-				box-shadow: $u-car-keyboard-button-inner-box-shadow;
-				margin: $u-car-keyboard-button-inner-margin;
-				border-radius: $u-car-keyboard-button-border-radius;
-
-				&__inner {
-					@include flex;
-					justify-content: center;
-					align-items: center;
-					width: $u-car-keyboard-button-inner-width;
-					background-color: $u-car-keyboard-button-inner-background-color;
-					height: $u-car-keyboard-button-height;
-					border-radius: $u-car-keyboard-button-border-radius;
-
-					&__text {
-						font-size: $u-car-keyboard-button-text-font-size;
-						color: $u-car-keyboard-button-text-color;
-					}
-				}
-
-				&__left,
-				&__right {
-					border-radius: $u-car-keyboard-button-border-radius;
-					width: $u-car-keyboard-special-button-width;
-					height: $u-car-keyboard-button-height;
-					background-color: $u-car-keyboard-u-hover-class-background-color;
-					@include flex;
-					justify-content: center;
-					align-items: center;
-					box-shadow: $u-car-keyboard-button-inner-box-shadow;
-				}
-
-				&__left {
-					&__line {
-						font-size: $u-car-keyboard-line-font-size;
-						color: $u-car-keyboard-line-color;
-						margin: $u-car-keyboard-line-margin;
-					}
-
-					&__lang {
-						font-size: $u-car-keyboard-lang-font-size;
-						color: $u-car-keyboard-lang-color;
-
-						&--active {
-							color: $u-car-keyboard-active-color;
-						}
-					}
-				}
-			}
-		}
-	}
-
-	.u-hover-class {
-		background-color: $u-car-keyboard-u-hover-class-background-color;
-	}
-</style>

+ 0 - 40
uni_modules/uview-plus/components/u-card/card.js

@@ -1,40 +0,0 @@
-/*
- * @Author       : jry
- * @Description  :
- * @version      : 3.0
- * @Date         : 2025-04-26 16:37:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-04-26 16:37:21
- * @FilePath     : /uview-plus/libs/config/props/card.js
- */
-export default {
-	// card组件的props
-	card: {
-		full: false,
-		title: '',
-		titleColor: '#303133',
-		titleSize: '15px',
-		subTitle: '',
-		subTitleColor: '#909399',
-		subTitleSize: '13px',
-		border: true,
-		index: '',
-		margin: '15px',
-		borderRadius: '8px',
-		headStyle: {},
-		bodyStyle: {},
-		footStyle: {},
-		headBorderBottom: true,
-		footBorderTop: true,
-		thumb: '',
-		thumbWidth: '30px',
-		thumbCircle: false,
-		padding: '15px',
-		paddingHead: '',
-        paddingBody: '',
-        paddingFoot: '',
-        showHead: true,
-        showFoot: true,
-        boxShadow: 'none'
-	}
-}

+ 0 - 134
uni_modules/uview-plus/components/u-card/props.js

@@ -1,134 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const propsCard = defineMixin({
-    props: {
-        // 与屏幕两侧是否留空隙
-		full: {
-			type: Boolean,
-			default: () => defProps.card.full
-		},
-		// 标题
-		title: {
-			type: String,
-			default: () => defProps.card.title
-		},
-		// 标题颜色
-		titleColor: {
-			type: String,
-			default: () => defProps.card.titleColor
-		},
-		// 标题字体大小
-		titleSize: {
-			type: [Number, String],
-			default: () => defProps.card.titleSize
-		},
-		// 副标题
-		subTitle: {
-			type: String,
-			default: () => defProps.card.subTitle
-		},
-		// 副标题颜色
-		subTitleColor: {
-			type: String,
-			default: () => defProps.card.subTitleColor
-		},
-		// 副标题字体大小
-		subTitleSize: {
-			type: [Number, String],
-			default: () => defProps.card.subTitleSize
-		},
-		// 是否显示外部边框,只对full=false时有效(卡片与边框有空隙时)
-		border: {
-			type: Boolean,
-			default: () => defProps.card.border
-		},
-		// 用于标识点击了第几个
-		index: {
-			type: [Number, String, Object],
-			default: () => defProps.card.index
-		},
-		// 用于隔开上下左右的边距,带单位的写法,如:"30px 30px","20px 20px 30px 30px"
-		margin: {
-			type: String,
-			default: () => defProps.card.margin
-		},
-		// card卡片的圆角
-		borderRadius: {
-			type: [Number, String],
-			default: () => defProps.card.borderRadius
-		},
-		// 头部自定义样式,对象形式
-		headStyle: {
-			type: Object,
-			default: () => defProps.card.headStyle
-		},
-		// 主体自定义样式,对象形式
-		bodyStyle: {
-			type: Object,
-			default: () => defProps.card.bodyStyle
-		},
-		// 底部自定义样式,对象形式
-		footStyle: {
-			type: Object,
-			default: () => defProps.card.footStyle
-		},
-		// 头部是否下边框
-		headBorderBottom: {
-			type: Boolean,
-			default: () => defProps.card.headBorderBottom
-		},
-		// 底部是否有上边框
-		footBorderTop: {
-			type: Boolean,
-			default: () => defProps.card.footBorderTop
-		},
-		// 标题左边的缩略图
-		thumb: {
-			type: String,
-			default: () => defProps.card.thumb
-		},
-		// 缩略图宽高
-		thumbWidth: {
-			type: [String, Number],
-			default: () => defProps.card.thumbWidth
-		},
-		// 缩略图是否为圆形
-		thumbCircle: {
-			type: Boolean,
-			default: () => defProps.card.thumbCircle
-		},
-		// 给head,body,foot的内边距
-		padding: {
-			type: [String, Number],
-			default: () => defProps.card.padding
-		},
-		paddingHead: {
-			type: [String, Number],
-			default: () => defProps.card.paddingHead
-		},
-		paddingBody: {
-			type: [String, Number],
-			default: () => defProps.card.paddingBody
-		},
-		paddingFoot: {
-			type: [String, Number],
-			default: () => defProps.card.paddingFoot
-		},
-		// 是否显示头部
-		showHead: {
-			type: Boolean,
-			default: () => defProps.card.showHead
-		},
-		// 是否显示尾部
-		showFoot: {
-			type: Boolean,
-			default: () => defProps.card.showFoot
-		},
-		// 卡片外围阴影,字符串形式
-		boxShadow: {
-			type: String,
-			default: () => defProps.card.boxShadow
-		}
-    }
-})

+ 0 - 184
uni_modules/uview-plus/components/u-card/u-card.vue

@@ -1,184 +0,0 @@
-<template>
-	<view
-		class="u-card"
-		@tap.stop="click"
-		:class="{ 'u-border': border, 'u-card-full': full, 'u-card--border': getPx(borderRadius) > 0 }"
-		:style="{
-			borderRadius: addUnit(borderRadius),
-			margin: margin,
-			boxShadow: boxShadow
-		}"
-	>
-		<view
-			v-if="showHead"
-			class="u-card__head"
-			:style="[{padding: addUnit(paddingHead || padding)}, headStyle]"
-			:class="{
-				'u-border-bottom': headBorderBottom
-			}"
-			@tap="headClick"
-		>
-			<view v-if="!$slots.head" class="u-flex u-flex-between">
-				<view class="u-card__head--left u-flex u-line-1" v-if="title">
-					<image
-						:src="thumb"
-						class="u-card__head--left__thumb"
-						mode="aspectFill"
-						v-if="thumb"
-						:style="{ 
-							height: addUnit(thumbWidth), 
-							width: addUnit(thumbWidth), 
-							borderRadius: thumbCircle ? '50px' : '4px' 
-						}"
-					></image>
-					<text
-						class="u-card__head--left__title u-line-1"
-						:style="{
-							fontSize: addUnit(titleSize),
-							color: titleColor
-						}"
-					>
-						{{ title }}
-					</text>
-				</view>
-				<view class="u-card__head--right u-line-1" v-if="subTitle">
-					<text
-						class="u-card__head__title__text"
-						:style="{
-							fontSize: addUnit(subTitleSize),
-							color: subTitleColor
-						}"
-					>
-						{{ subTitle }}
-					</text>
-				</view>
-			</view>
-			<slot name="head" v-else />
-		</view>
-		<view @tap="bodyClick" class="u-card__body"
-			:style="[{padding: addUnit(paddingBody || padding)}, bodyStyle]"><slot name="body" /></view>
-		<view
-			v-if="showFoot"
-			class="u-card__foot"
-			 @tap="footClick"
-			:style="[{padding: $slots.foot ? addUnit(paddingFoot || padding) : 0}, footStyle]"
-			:class="{
-				'u-border-top': footBorderTop
-			}"
-		>
-			<slot name="foot" />
-		</view>
-	</view>
-</template>
-
-<script>
-    import { propsCard } from './props';
-    import { mpMixin } from '../../libs/mixin/mpMixin';
-    import { mixin } from '../../libs/mixin/mixin';
-    import { addStyle, addUnit, getPx } from '../../libs/function/index';
-    /**
-     * card 卡片
-     * @description 卡片组件一般用于多个列表条目,且风格统一的场景
-     * @tutorial https://uview-plus.jiangruyi.com/components/card.html
-     * @property {Boolean} full 卡片与屏幕两侧是否留空隙(默认false)
-     * @property {String} title 头部左边的标题
-     * @property {String} title-color 标题颜色(默认#303133)
-     * @property {String | Number} title-size 标题字体大小,单位rpx(默认15px)
-     * @property {String} sub-title 头部右边的副标题
-     * @property {String} sub-title-color 副标题颜色(默认#909399)
-     * @property {String | Number} sub-title-size 副标题字体大小(默认13px
-     * @property {Boolean} border 是否显示边框(默认true)
-     * @property {String | Number} index 用于标识点击了第几个卡片
-     * @property {String} box-shadow 卡片外围阴影,字符串形式(默认none)
-     * @property {String} margin 卡片与屏幕两边和上下元素的间距,需带单位,如"30px 20px"(默认15px)
-     * @property {String | Number} border-radius 卡片整体的圆角值,单位rpx(默认8px)
-     * @property {Object} head-style 头部自定义样式,对象形式
-     * @property {Object} body-style 中部自定义样式,对象形式
-     * @property {Object} foot-style 底部自定义样式,对象形式
-     * @property {Boolean} head-border-bottom 是否显示头部的下边框(默认true)
-     * @property {Boolean} foot-border-top 是否显示底部的上边框(默认true)
-     * @property {Boolean} show-head 是否显示头部(默认true)
-     * @property {Boolean} show-foot 是否显示尾部(默认true)
-     * @property {String} thumb 缩略图路径,如设置将显示在标题的左边,不建议使用相对路径
-     * @property {String | Number} thumb-width 缩略图的宽度,高等于宽,单位px(默认30px)
-     * @property {Boolean} thumb-circle 缩略图是否为圆形(默认false)
-     * @event {Function} click 整个卡片任意位置被点击时触发
-     * @event {Function} head-click 卡片头部被点击时触发
-     * @event {Function} body-click 卡片主体部分被点击时触发
-     * @event {Function} foot-click 卡片底部部分被点击时触发
-     * @example <u-card paddingFoot="2px 15px" title="card"></u-card>
-     */
-    export default {
-        name: 'up-card',
-        data() {
-            return {};
-        },
-        mixins: [mpMixin, mixin, propsCard],
-        emits: ['click', 'head-click', 'body-click', 'foot-click'],
-        methods: {
-			addStyle,
-			addUnit,
-			getPx,
-            click() {
-                this.$emit('click', this.index);
-            },
-            headClick() {
-                this.$emit('head-click', this.index);
-            },
-            bodyClick() {
-                this.$emit('body-click', this.index);
-            },
-            footClick() {
-                this.$emit('foot-click', this.index);
-            }
-        }
-    };
-</script>
-
-<style lang="scss" scoped>
-.u-card {
-	position: relative;
-	overflow: hidden;
-	font-size: 28rpx;
-	background-color: #ffffff;
-	box-sizing: border-box;
-	
-	&-full {
-		// 如果是与屏幕之间不留空隙,应该设置左右边距为0
-		margin-left: 0 !important;
-		margin-right: 0 !important;
-		width: 100%;
-	}
-	
-	&--border:after {
-		border-radius: 16rpx;
-	}
-
-	&__head {
-		&--left {
-			color: $u-main-color;
-			
-			&__thumb {
-				margin-right: 16rpx;
-			}
-			
-			&__title {
-				max-width: 400rpx;
-			}
-		}
-
-		&--right {
-			color: $u-tips-color;
-			margin-left: 6rpx;
-		}
-	}
-
-	&__body {
-		color: $u-content-color;
-	}
-
-	&__foot {
-		color: $u-tips-color;
-	}
-}
-</style>

+ 0 - 345
uni_modules/uview-plus/components/u-cascader/u-cascader.vue

@@ -1,345 +0,0 @@
-<template>
-	<up-popup :show="popupShow" mode="bottom" :popup="false"
-		:mask="true" :closeable="closeable" :safe-area-inset-bottom="true"
-		close-icon-color="#ffffff" :z-index="uZIndex"
-		:maskCloseAble="maskCloseAble" @close="close">
-		<view class="up-p-t-30 up-p-l-20 up-m-b-10" v-if="headerDirection =='column'">
-			<up-steps v-if="popupShow" dot direction="column" v-model:current="tabsIndex">
-				<up-steps-item  v-for="(item, index) in genTabsList"
-					@click="tabsIndex = index" :title="item.name"></up-steps-item>
-			</up-steps>
-		</view>
-		<view class="up-p-t-20 up-m-b-10" v-else>
-			<up-tabs v-if="popupShow" :list="genTabsList"
-				:scrollable="true" v-model:current="tabsIndex" @change="tabsChange" ref="tabs"></up-tabs>
-		</view>
-		<view class="area-box">
-			<view class="u-flex" :class="{ 'change':isChange }"
-				:style="{transform: optionsCols == 2 && isChange ? 'translateX(-33.3333333%)' : ''}">
-				<template v-for="(levelData, levelIndex) in levelList" :key="levelIndex">
-					<view v-if="optionsCols == 2 || levelIndex == tabsIndex" class="area-item"
-						:style="{ width: optionsCols == 2 ? '33.33333%' : '750rpx'}">
-						<view class="u-padding-10 u-bg-gray" style="height: 100%;">
-							<scroll-view :scroll-y="true" style="height: 100%">
-								<up-cell-group v-if="levelIndex === 0 || selectedValueIndexs[levelIndex - 1] !== undefined">
-									<up-cell v-for="(item,index) in levelData"
-										:title="item[labelKey]" :arrow="false"
-										:index="index" :key="index"
-										@click="levelChange(levelIndex, index)">
-										<template v-slot:right-icon>
-											<up-icon v-if="selectedValueIndexs[levelIndex] === index"
-												size="17" name="checkbox-mark"></up-icon>
-										</template>
-									</up-cell>
-								</up-cell-group>
-							</scroll-view>
-						</view>
-					</view>
-				</template>
-			</view>
-		</view>
-		<!-- 添加按钮区域 -->
-		<view class="u-cascader-action up-flex up-flex-between">
-			<view class="u-padding-20 up-flex-fill">
-				<up-button @click="handleCancel" type="default">{{ t("up.common.cancel") }}</up-button>
-			</view>
-			<view class="u-padding-20 up-flex-fill">
-				<up-button @click="handleConfirm" type="primary">{{ t("up.common.confirm") }}</up-button>
-			</view>
-		</view>
-	</up-popup>
-</template>
-
-<script>
-	/**
-	 * u-cascader 通用无限级联选择器
-	 * @property {String Number} z-index 弹出时的z-index值(默认1075)
-	 * @property {Boolean} mask-close-able 是否允许通过点击遮罩关闭Picker(默认true)
-	 * @property {Array} data 级联数据
-	 * @property {Array} default-value 默认选中的值
-	 * @property {String} valueKey 指定选项的值为选项对象中的哪个属性值
-	 * @property {String} labelKey 指定选项标签为选项对象中的哪个属性值
-	 * @property {String} childrenKey 指定选项的子选项为选项对象中的哪个属性值
-	 * @property {Boolean} autoClose 是否在选择最后一级时自动关闭并触发confirm(默认false)
-	 * @property {Boolean} closeable 是否显示关闭图标(默认true)
-	 */
-	import { t } from '../../libs/i18n'
-	export default {
-		name: 'up-cascader',
-		props: {
-			// 通过双向绑定控制组件的弹出与收起
-			show: {
-				type: Boolean,
-				default: false
-			},
-			// 级联数据
-			data: {
-				type: Array,
-				default() {
-					return [];
-				}
-			},
-			// 默认选中的值
-			modelValue: {
-				type: Array,
-				default() {
-					return [];
-				}
-			},
-			// 指定选项的值为选项对象中的哪个属性值
-			valueKey: {
-				type: String,
-				default: 'value'
-			},
-			// 指定选项标签为选项对象中的哪个属性值
-			labelKey: {
-				type: String,
-				default: 'label'
-			},
-			// 指定选项的子选项为选项对象中的哪个属性值
-			childrenKey: {
-				type: String,
-				default: 'children'
-			},
-			// 是否允许通过点击遮罩关闭Picker
-			maskCloseAble: {
-				type: Boolean,
-				default: true
-			},
-			// 弹出的z-index值
-			zIndex: {
-				type: [String, Number],
-				default: 0
-			},
-			// 是否在选择最后一级时自动关闭并触发confirm
-			autoClose: {
-				type: Boolean,
-				default: false
-			},
-			// 选中项目的展示方向direction垂直方向适合文字长度过长
-			headerDirection: {
-				type: String,
-				default: 'row'
-			},
-			// 选项区域列数,支持1列和2列,默认为2列
-			optionsCols: {
-				type: [Number],
-				default: 2
-			},
-			// 是否显示关闭图标
-			closeable: {
-				type: Boolean,
-				default: true
-			}
-		},
-		data() {
-			return {
-				// 存储每一级的数据
-				levelList: [],
-				// 存储每一级选中的索引
-				selectedValueIndexs: [],
-				tabsIndex: 0,
-				popupShow: false,
-				// 新增confirmValues用于存储确认的值
-				confirmValues: []
-			}
-		},
-		watch: {
-			data: {
-				handler() {
-					this.initLevelList();
-					this.setDefaultValue();
-				},
-				immediate: true
-			},
-			show() {
-				this.popupShow = this.show;
-			},
-			modelValue: {
-				handler() {
-					// 初始化选中值
-					this.setDefaultValue();
-				},
-				immediate: true
-			}
-		},
-		computed: {
-			isChange() {
-				return this.tabsIndex > 1;
-			},
-			genTabsList() {
-				let tabsList = [{
-					name: "请选择"
-				}];
-				
-				// 根据选中的值动态生成tabs
-				for (let i = 0; i < this.selectedValueIndexs.length; i++) {
-					if (this.selectedValueIndexs[i] !== undefined && this.levelList[i]) {
-						const selectedItem = this.levelList[i][this.selectedValueIndexs[i]];
-						if (selectedItem) {
-							tabsList[i] = {
-								name: selectedItem[this.labelKey]
-							};
-							// 如果还有下一级,则添加"请选择"
-							if (i === this.selectedValueIndexs.length - 1 && 
-								selectedItem[this.childrenKey] && 
-								selectedItem[this.childrenKey].length > 0) {
-								tabsList.push({
-									name: "请选择"
-								});
-							}
-						}
-					}
-				}
-				
-				return tabsList;
-			},
-			uZIndex() {
-				// 如果用户有传递z-index值,优先使用
-				return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
-			}
-		},
-		// 新增confirm事件
-		emits: ['update:modelValue', 'update:show', 'change', 'confirm', 'cancel'],
-		methods: {
-			t,
-			initLevelList() {
-				// 初始化第一级数据
-				if (this.data && this.data.length > 0) {
-					this.levelList = [this.data];
-					this.selectedValueIndexs = [];
-				}
-			},
-			setDefaultValue() {
-				// 检查data是否为空
-				if (!this.data || this.data.length == 0) return;
-				// 检查modelValue是否为空
-				if (!this.modelValue || this.modelValue.length == 0) return;
-				// 根据默认值设置选中项
-				// 根据modelValue获取indexs给selectedValueIndexs
-				this.selectedValueIndexs = [];
-				this.levelList = []; // 设置层级数据为空
-				let currentLevelData = this.data;
-				
-				for (let i = 0; i < this.modelValue.length; i++) {
-					const value = this.modelValue[i];
-					const index = currentLevelData.findIndex(item => item[this.valueKey] === value);
-					this.levelList[i] = currentLevelData; // 设置每一层级的数据
-					
-					if (index !== -1) {
-						this.selectedValueIndexs.push(index);
-						// 更新下一级的数据
-						if (currentLevelData[index][this.childrenKey]) {
-							currentLevelData = currentLevelData[index][this.childrenKey];
-						} else {
-							// 如果没有子级数据,则停止处理
-							break;
-						}
-					} else {
-						// 如果找不到匹配项,则停止处理
-						break;
-					}
-				}
-			},
-			close() {
-				this.$emit('cancel');
-				this.$emit('update:show', false);
-			},
-			tabsChange(item) {
-			},
-			levelChange(levelIndex, index) {
-				// 设置当前级的选中值
-				this.$set(this.selectedValueIndexs, levelIndex, index);
-				
-				// 清除后续级别的选中值
-				this.selectedValueIndexs.splice(levelIndex + 1);
-				this.tabsIndex = Math.min(this.tabsIndex, levelIndex);
-				
-				// 清除后续级别的列表
-				this.levelList.splice(levelIndex + 1);
-				
-				// 获取当前选中项
-				const currentItem = this.levelList[levelIndex][index];
-				
-				// 如果有子级数据,则初始化下一级
-				if (currentItem && currentItem[this.childrenKey] && currentItem[this.childrenKey].length > 0) {
-					// 确保levelList数组足够长
-					if (this.levelList.length <= levelIndex + 1) {
-						this.levelList.push(currentItem[this.childrenKey]);
-					} else {
-						this.$set(this.levelList, levelIndex + 1, currentItem[this.childrenKey]);
-					}
-					// 切换到下一级tab
-					this.tabsIndex = levelIndex + 1;
-				} else {
-					// 没有子级数据,说明是最后一级
-					if (this.autoClose) {
-						// 如果启用自动关闭,则触发change事件并关闭
-						this.emitChange();
-						this.handleConfirm();
-					} else {
-						// 否则只触发change事件,不关闭
-						this.emitChange(false);
-					}
-				}
-			},
-			// 修改emitChange方法,增加closePopup参数
-			emitChange(closePopup = true) {
-				// 构造选中结果
-				const result = [];
-				for (let i = 0; i < this.selectedValueIndexs.length; i++) {
-					if (this.selectedValueIndexs[i] !== undefined && this.levelList[i]) {
-						result.push(this.levelList[i][this.selectedValueIndexs[i]][this.valueKey]);
-					}
-				}
-				
-				// 更新confirmValues
-				this.confirmValues = [...result];
-				
-				// 触发change事件,返回value数组
-				this.$emit('change', this.confirmValues);
-				
-				// 根据参数决定是否关闭弹窗
-				if (closePopup) {
-					this.close();
-				}
-			},
-			handleCancel() {
-				this.close();
-			},
-			handleConfirm() {
-				// 确认时触发confirm事件
-				this.$emit('update:modelValue', this.confirmValues);
-				this.$emit('confirm', this.confirmValues);
-				this.close();
-			}
-		}
-	}
-</script>
-<style lang="scss">
-	.area-box {
-		width: 100%;
-		overflow: hidden;
-		height: 800rpx;
-
-		>view {
-			width: 150%;
-			transition: transform 0.3s ease-in-out 0s;
-			transform: translateX(0);
-
-			&.change {
-				// transform: translateX(-33.3333333%);
-			}
-		}
-
-		.area-item {
-			// width: 750rpx;
-			height: 800rpx;
-		}
-	}
-	
-	// 添加按钮区域样式
-	.u-cascader-action {
-		border-top: 1px solid #eee;
-	}
-</style>

+ 0 - 391
uni_modules/uview-plus/components/u-cate-tab/u-cate-tab.vue

@@ -1,391 +0,0 @@
-<template>
-	<view class="u-cate-tab" :style="{ height: addUnit(height) }">
-		<view class="u-cate-tab__wrap">
-			<scroll-view class="u-cate-tab__view u-cate-tab__menu-scroll-view"
-                scroll-y scroll-with-animation :scroll-top="scrollTop"
-			    :scroll-into-view="itemId">
-				<view v-for="(item, index) in tabList" :key="index" class="u-cate-tab__item"
-                    :class="[innerCurrent == index ? 'u-cate-tab__item-active' : '']"
-				 @tap.stop="swichMenu(index)">
-					<slot name="tabItem" :item="item">
-                    </slot>
-                    <text v-if="!$slots['tabItem']" class="u-line-1">{{item[tabKeyName]}}</text>
-				</view>
-			</scroll-view>
-			<scroll-view :scroll-top="scrollRightTop" scroll-with-animation :scroll-into-view="scrollIntoView"
-				scroll-y class="u-cate-tab__right-box" @scroll="rightScroll">
-				<view class="u-cate-tab__right-top">
-					<slot name="rightTop" :tabList="tabList">
-                	</slot>
-				</view>
-				<view class="u-cate-tab__page-view">
-					<template :key="index" v-for="(item , index) in tabList">
-						<view v-if="mode == 'follow' || ( mode == 'tab' && index == innerCurrent)"
-							class="u-cate-tab__page-item" :id="'item' + index">
-							<slot name="itemList" :item="item">
-							</slot>
-							<template v-if="!$slots['itemList']">
-								<view class="item-title">
-									<text>{{item[tabKeyName]}}</text>
-								</view>
-								<view class="item-container">
-									<template v-for="(item1, index1) in item.children" :key="index1">
-										<slot name="pageItem" :pageItem="item1">
-											<view class="thumb-box" >
-												<image class="item-menu-image" :src="item1.icon" mode=""></image>
-												<view class="item-menu-name">{{item1[itemKeyName]}}</view>
-											</view>
-										</slot>
-									</template>
-								</view>
-							</template>
-						</view>
-					</template>
-				</view>
-			</scroll-view>
-		</view>
-	</view>
-</template>
-<script>
-	import { addUnit, sleep } from '../../libs/function/index';
-	export default {
-		name: 'up-cate-tab',
-        props: {
-			mode: {
-                type: String,
-                default: 'follow' // follo跟随联动, tab单一显示。
-            },
-			height: {
-                type: String,
-                default: '100%'
-            },
-            tabList: {
-                type: Array,
-                default: () => {
-                    return []
-                }
-            },
-            tabKeyName: {
-                type: String,
-                default: 'name'
-            },
-            itemKeyName: {
-                type: String,
-                default: 'name'
-            },
-			current: {
-                type: Number,
-                default: 0
-            }
-        },
-        watch: {
-			tabList: {
-				deep: true,
-				handler(newVal, oldVal) {
-					// this.observer();
-					sleep(30).then(() => {
-						this.getMenuItemTop();
-						this.leftMenuStatus(this.innerCurrent);
-					})
-				}
-			},
-			current(nval) {
-				this.innerCurrent = nval;
-				this.leftMenuStatus(this.innerCurrent);
-				sleep(30).then(() => {
-					this.swichMenu(this.innerCurrent)
-				})
-			},
-			height() {
-				// console.log('height change');
-				this.getMenuItemTop();
-				this.leftMenuStatus(this.innerCurrent);
-			}
-        },
-		emits: ['update:current'],
-		data() {
-			return {
-				scrollTop: 0, //tab标题的滚动条位置
-				scrollIntoView: '', // 滚动至哪个元素
-				oldScrollTop: 0,
-				innerCurrent: 0, // 预设当前项的值
-				menuHeight: 0, // 左边菜单的高度
-				menuItemHeight: 0, // 左边菜单item的高度
-				itemId: '', // 栏目右边scroll-view用于滚动的id
-				menuItemPos: [],
-                rects: [],
-				arr: [],
-				scrollRightTop: 0, // 右边栏目scroll-view的滚动条高度
-				timer: null, // 定时器
-			}
-		},
-		mounted() {
-			// this.observer();
-			this.innerCurrent = this.current;
-			this.leftMenuStatus(this.innerCurrent);
-			this.getMenuItemTop()
-			// 设置默认index
-			sleep(50).then(() => {
-				this.swichMenu(this.innerCurrent)
-			})
-		},
-		methods: {
-			addUnit,
-			// 点击左边的栏目切换
-			async swichMenu(index) {
-				if (this.mode == 'follow') {
-					if(this.arr.length == 0) {
-						await this.getMenuItemTop();
-					}
-					if (this.scrollIntoView != 'item' + index) {
-						this.scrollIntoView = 'item' + index;
-					}
-				}
-
-				if (index == this.innerCurrent) return;
-				this.$nextTick(function(){
-					this.innerCurrent = index;
-					this.$emit('update:current', index);
-				})
-			},
-			// 获取一个目标元素的高度
-			getElRect(elClass, dataVal) {
-				return new Promise((resolve, reject) => {
-					const query = uni.createSelectorQuery().in(this);
-					query.select('.' + elClass).fields({
-						size: true
-					}, res => {
-						// 如果节点尚未生成,res值为null,循环调用执行
-						if (!res) {
-							setTimeout(() => {
-								this.getElRect(elClass);
-							}, 10);
-							return;
-						}
-						this[dataVal] = res.height;
-						resolve();
-					}).exec();
-				})
-			},
-			// 观测元素相交状态
-			async observer() {
-				await this.$nextTick();
-				// 清除之前的观察器
-				if (this._observerList) {
-					this._observerList.forEach(observer => {
-						observer.disconnect();
-					});
-				}
-				this._observerList = [];
-				
-				this.tabList.map((val, index) => {
-					let observer = uni.createIntersectionObserver(this);
-					this._observerList.push(observer);
-					// 检测相交状态
-					observer.relativeTo('.u-cate-tab__right-box', {
-						top: 10
-					}).observe('#item' + index, (res) => {
-						if (res.intersectionRatio > 0) {
-							console.log('res', res);
-							// 修复:确保正确获取索引
-							let id = res.id ? res.id.substring(4) : index;
-							this.leftMenuStatus(parseInt(id));
-						}
-					})
-				})
-			},
-			// 设置左边菜单的滚动状态
-			async leftMenuStatus(index) {
-				this.innerCurrent = index;
-				this.$emit('update:current', index);
-				// 如果为0,意味着尚未初始化
-				if (this.menuHeight == 0 || this.menuItemHeight == 0) {
-					await this.getElRect('u-cate-tab__menu-scroll-view', 'menuHeight');
-					await this.getElRect('u-cate-tab__item', 'menuItemHeight');
-				}
-				// console.log(this.menuHeight, this.menuItemHeight)
-				// 将菜单活动item垂直居中
-				this.scrollTop = index * this.menuItemHeight + this.menuItemHeight / 2 - this.menuHeight / 2;
-			},
-			// 获取右边菜单每个item到顶部的距离
-			async getMenuItemTop() {
-				// await this.$nextTick();
-				// console.log('getMenuItemTop')
-				return new Promise(resolve => {
-					let selectorQuery = uni.createSelectorQuery().in(this);
-					selectorQuery.selectAll('.u-cate-tab__page-item').boundingClientRect((rects) => {
-						// 如果节点尚未生成,rects值为[](因为用selectAll,所以返回的是数组),循环调用执行
-						if(!rects.length) {
-							setTimeout(() => {
-								this.getMenuItemTop();
-							}, 100);
-							return ;
-						}
-						// console.log(rects)
-                        this.rects = rects;
-						this.arr = [];
-						rects.forEach((rect) => {
-							// 这里减去rects[0].top,是因为第一项顶部可能不是贴到导航栏(比如有个搜索框的情况)
-							this.arr.push(rect.top - rects[0].top);
-						})
-						// console.log(this.arr)
-                        resolve();
-					}).exec()
-				})
-			},
-			// 右边菜单滚动
-			async rightScroll(e) {
-				if (this.mode !== 'follow') return;
-				this.oldScrollTop = e.detail.scrollTop;
-                // console.log(e.detail.scrollTop)
-                // console.log(JSON.stringify(this.arr))
-				if(this.arr.length == 0) {
-					await this.getMenuItemTop();
-				}
-				if(this.timer) return ;
-				if(!this.menuHeight) {
-					await this.getElRect('u-cate-tab__menu-scroll-view', 'menuHeight');
-				}
-				setTimeout(() => { // 节流
-					this.timer = null;
-					// scrollHeight为右边菜单垂直中点位置
-					let scrollHeight = e.detail.scrollTop + 1;
-                    // console.log(e.detail.scrollTop)
-					for (let i = 0; i < this.arr.length; i++) {
-						let height1 = this.arr[i];
-						let height2 = this.arr[i + 1];
-                        // console.log('i', i)
-                        // console.log('height1', height1)
-                        // console.log('height2', height2)
-						// 如果不存在height2,意味着数据循环已经到了最后一个,设置左边菜单为最后一项即可
-						if (!height2 || scrollHeight >= height1 && scrollHeight <= height2) {
-                            // console.log('scrollHeight', scrollHeight)
-                            // console.log('height1', height1)
-                            // console.log('height2', height2)
-							this.leftMenuStatus(i);
-							return ;
-						}
-					}
-				}, 100)
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.u-cate-tab {
-		display: flex;
-		flex-direction: column;
-	}
-
-	.u-cate-tab__wrap {
-		flex: 1;
-		display: flex;
-		flex-direction: row;
-		overflow: hidden;
-	}
-
-	.u-search-inner {
-		background-color: rgb(234, 234, 234);
-		border-radius: 100rpx;
-		display: flex;
-		align-items: center;
-		padding: 10rpx 16rpx;
-	}
-
-	.u-search-text {
-		font-size: 26rpx;
-		color: $u-tips-color;
-		margin-left: 10rpx;
-	}
-
-	.u-cate-tab__view {
-		width: 200rpx;
-		height: 100%;
-	}
-
-	.u-cate-tab__item {
-		height: 110rpx;
-		background: #f6f6f6;
-		box-sizing: border-box;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		font-size: 26rpx;
-		color: #444;
-		font-weight: 400;
-		line-height: 1;
-	}
-
-	.u-cate-tab__item-active {
-		position: relative;
-		color: #000;
-		font-size: 30rpx;
-		font-weight: 600;
-		background: #fff;
-	}
-
-	.u-cate-tab__item-active::before {
-		content: "";
-		position: absolute;
-		border-left: 4px solid $u-primary;
-		height: 32rpx;
-		left: 0;
-		top: 39rpx;
-	}
-
-	.u-cate-tab__view {
-		height: 100%;
-	}
-
-	.u-cate-tab__right-box {
-		flex: 1;
-		background-color: rgb(250, 250, 250);
-	}
-
-	.u-cate-tab__page-view {
-		padding: 16rpx;
-	}
-
-	.u-cate-tab__page-item {
-		margin-bottom: 30rpx;
-		background-color: #fff;
-		padding: 16rpx;
-		border-radius: 8rpx;
-	}
-
-	.u-cate-tab__page-item:last-child {
-		min-height: 100vh;
-	}
-
-	.item-title {
-		font-size: 26rpx;
-		color: $u-main-color;
-		font-weight: bold;
-	}
-
-	.item-menu-name {
-		font-weight: normal;
-		font-size: 24rpx;
-		color: $u-main-color;
-	}
-
-	.item-container {
-		display: flex;
-		flex-wrap: wrap;
-	}
-
-	.thumb-box {
-		width: 33.333333%;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		flex-direction: column;
-		margin-top: 20rpx;
-	}
-
-	.item-menu-image {
-		width: 120rpx;
-		height: 120rpx;
-	}
-</style>

+ 0 - 17
uni_modules/uview-plus/components/u-cell-group/cellGroup.js

@@ -1,17 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/cellGroup.js
- */
-export default {
-    // cell-group组件的props
-    cellGroup: {
-        title: '',
-        border: true,
-        customStyle: {}
-    }
-}

+ 0 - 16
uni_modules/uview-plus/components/u-cell-group/props.js

@@ -1,16 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        // 分组标题
-        title: {
-            type: String,
-            default: () => defProps.cellGroup.title
-        },
-        // 是否显示外边框
-        border: {
-            type: Boolean,
-            default: () => defProps.cellGroup.border
-        }
-    }
-})

+ 0 - 66
uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue

@@ -1,66 +0,0 @@
-<template>
-    <view :style="[addStyle(customStyle)]" :class="[customClass]" class="u-cell-group">
-        <view v-if="title" class="u-cell-group__title">
-            <slot name="title">
-				<text class="u-cell-group__title__text">{{ title }}</text>
-			</slot>
-        </view>
-        <view class="u-cell-group__wrapper">
-			<u-line v-if="border"></u-line>
-            <slot />
-        </view>
-    </view>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addStyle } from '../../libs/function/index';
-	/**
-	 * cellGroup  单元格
-	 * @description cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/cell.html
-	 * 
-	 * @property {String}	title		分组标题
-	 * @property {Boolean}	border		是否显示外边框 (默认 true )
-	 * @property {Object}	customStyle	定义需要用到的外部样式
-	 * 
-	 * @event {Function} click 	点击cell列表时触发
-	 * @example <u-cell-group title="设置喜好">
-	 */
-	export default {
-		name: 'u-cell-group',
-		mixins: [mpMixin, mixin, props],
-		methods: {
-			addStyle
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	
-	$u-cell-group-title-padding: 16px 16px 8px !default;
-	$u-cell-group-title-font-size: 15px !default;
-	$u-cell-group-title-line-height: 16px !default;
-	$u-cell-group-title-color: $u-main-color !default;
-
-    .u-cell-group {
-		flex: 1;
-		
-        &__title {
-            padding: $u-cell-group-title-padding;
-
-            &__text {
-                font-size: $u-cell-group-title-font-size;
-                line-height: $u-cell-group-title-line-height;
-                color: $u-cell-group-title-color;
-            }
-        }
-		
-		&__wrapper {
-			position: relative;
-		}
-    }
-</style>
-

+ 0 - 35
uni_modules/uview-plus/components/u-cell/cell.js

@@ -1,35 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/cell.js
- */
-export default {
-	// cell组件的props
-	cell: {
-		customClass: '',
-		title: '',
-		label: '',
-		value: '',
-		icon: '',
-		disabled: false,
-		border: true,
-		center: false,
-		url: '',
-		linkType: 'navigateTo',
-		clickable: false,
-		isLink: false,
-		required: false,
-		arrowDirection: '',
-		iconStyle: {},
-		rightIconStyle: {},
-		rightIcon: 'arrow-right',
-		titleStyle: {},
-		size: '',
-		stop: true,
-		name: ''
-	}
-}

+ 0 - 112
uni_modules/uview-plus/components/u-cell/props.js

@@ -1,112 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        // 标题
-        title: {
-            type: [String, Number],
-            default: () => defProps.cell.title
-        },
-        // 标题下方的描述信息
-        label: {
-            type: [String, Number],
-            default: () => defProps.cell.label
-        },
-        // 右侧的内容
-        value: {
-            type: [String, Number],
-            default: () => defProps.cell.value
-        },
-        // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址)
-        icon: {
-            type: String,
-            default: () => defProps.cell.icon
-        },
-        // 是否禁用cell
-        disabled: {
-            type: Boolean,
-            default: () => defProps.cell.disabled
-        },
-        // 是否显示下边框
-        border: {
-            type: Boolean,
-            default: () => defProps.cell.border
-        },
-        // 内容是否垂直居中(主要是针对右侧的value部分)
-        center: {
-            type: Boolean,
-            default: () => defProps.cell.center
-        },
-        // 点击后跳转的URL地址
-        url: {
-            type: String,
-            default: () => defProps.cell.url
-        },
-        // 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作
-        linkType: {
-            type: String,
-            default: () => defProps.cell.linkType
-        },
-        // 是否开启点击反馈(表现为点击时加上灰色背景)
-        clickable: {
-            type: Boolean,
-            default: () => defProps.cell.clickable
-        },
-        // 是否展示右侧箭头并开启点击反馈
-        isLink: {
-            type: Boolean,
-            default: () => defProps.cell.isLink
-        },
-        // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件)
-        required: {
-            type: Boolean,
-            default: () => defProps.cell.required
-        },
-        // 右侧的图标箭头
-        rightIcon: {
-            type: String,
-            default: () => defProps.cell.rightIcon
-        },
-        // 右侧箭头的方向,可选值为:left,up,down
-        arrowDirection: {
-            type: String,
-            default: () => defProps.cell.arrowDirection
-        },
-        // 左侧图标样式
-        iconStyle: {
-            type: [Object, String],
-            default: () => {
-				return defProps.cell.iconStyle
-			}
-        },
-        // 右侧箭头图标的样式
-        rightIconStyle: {
-            type: [Object, String],
-            default: () => {
-				return defProps.cell.rightIconStyle
-			}
-        },
-        // 标题的样式
-        titleStyle: {
-            type: [Object, String],
-			default: () => {
-				return defProps.cell.titleStyle
-			}
-        },
-        // 单位元的大小,可选值为large
-        size: {
-            type: String,
-            default: () => defProps.cell.size
-        },
-        // 点击cell是否阻止事件传播
-        stop: {
-            type: Boolean,
-            default: () => defProps.cell.stop
-        },
-        // 标识符,cell被点击时返回
-        name: {
-            type: [Number, String],
-            default: () => defProps.cell.name
-        }
-    }
-})

+ 0 - 267
uni_modules/uview-plus/components/u-cell/u-cell.vue

@@ -1,267 +0,0 @@
-<template>
-	<view class="u-cell" :class="[customClass]" :style="[addStyle(customStyle)]"
-		:hover-class="(!disabled && (clickable || isLink)) ? 'u-cell--clickable' : ''" :hover-stay-time="250"
-		@tap="clickHandler">
-		<view class="u-cell__body" :class="[ center && 'u-cell--center', size === 'large' && 'u-cell__body--large']">
-			<view class="u-cell__body__content">
-				<view class="u-cell__left-icon-wrap" v-if="$slots.icon || icon">
-					<slot name="icon" v-if="$slots.icon">
-					</slot>
-					<up-icon v-else :name="icon"
-						:custom-style="iconStyle"
-						:size="size === 'large' ? 22 : 18"></up-icon>
-				</view>
-				<view class="u-cell__title">
-                    <!-- 将slot与默认内容用if/else分开主要是因为微信小程序不支持slot嵌套传递,这样才能解决collapse组件的slot不失效问题,label暂时未用到。 -->
-					<slot name="title" v-if="$slots.title || !title">
-					</slot>
-                    <text v-else class="u-cell__title-text" :style="[titleTextStyle]"
-                        :class="[required && 'u-cell--required', disabled && 'u-cell--disabled', size === 'large' && 'u-cell__title-text--large']">{{ title }}</text>
-					<slot name="label">
-						<text class="u-cell__label" v-if="label"
-							:class="[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__label--large']">{{ label }}</text>
-					</slot>
-				</view>
-			</view>
-			<slot name="value">
-				<text class="u-cell__value"
-					:class="[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__value--large']"
-					v-if="!testEmpty(value)">{{ value }}</text>
-			</slot>
-			<view class="u-cell__right-icon-wrap" v-if="$slots['right-icon'] || isLink"
-				:class="[`u-cell__right-icon-wrap--${arrowDirection}`]">
-				<up-icon v-if="rightIcon && !$slots['right-icon']" :name="rightIcon"
-					:custom-style="rightIconStyle" :color="disabled ? '#c8c9cc' : 'info'"
-					:size="size === 'large' ? 18 : 16"></up-icon>
-				<slot v-else name="right-icon">
-				</slot>
-			</view>
-			<view class="u-cell__right-icon-wrap" v-if="$slots['righticon']"
-				:class="[`u-cell__right-icon-wrap--${arrowDirection}`]">
-				<slot name="righticon">
-				</slot>
-			</view>
-		</view>
-		<u-line v-if="border"></u-line>
-	</view>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addStyle } from '../../libs/function/index';
-	import test from '../../libs/function/test';
-	/**
-	 * cell  单元格
-	 * @description cell单元格一般用于一组列表的情况,比如个人中心页,设置页等。
-	 * @tutorial https://uview-plus.jiangruyi.com/components/cell.html
-	 * @property {String | Number}	title			标题
-	 * @property {String | Number}	label			标题下方的描述信息
-	 * @property {String | Number}	value			右侧的内容
-	 * @property {String}			icon			左侧图标名称,或者图片链接(本地文件建议使用绝对地址)
-	 * @property {Boolean}			disabled		是否禁用cell	
-	 * @property {Boolean}			border			是否显示下边框 (默认 true )
-	 * @property {Boolean}			center			内容是否垂直居中(主要是针对右侧的value部分) (默认 false )
-	 * @property {String}			url				点击后跳转的URL地址
-	 * @property {String}			linkType		链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作 (默认 'navigateTo' )
-	 * @property {Boolean}			clickable		是否开启点击反馈(表现为点击时加上灰色背景) (默认 false ) 
-	 * @property {Boolean}			isLink			是否展示右侧箭头并开启点击反馈 (默认 false )
-	 * @property {Boolean}			required		是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) (默认 false )
-	 * @property {String}			rightIcon		右侧的图标箭头 (默认 'arrow-right')
-	 * @property {String}			arrowDirection	右侧箭头的方向,可选值为:left,up,down
-	 * @property {Object | String}			rightIconStyle	右侧箭头图标的样式
-	 * @property {Object | String}			titleStyle		标题的样式
-	 * @property {Object | String}			iconStyle		左侧图标样式
-	 * @property {String}			size			单位元的大小,可选值为 large,normal,mini 
-	 * @property {Boolean}			stop			点击cell是否阻止事件传播 (默认 true )
-	 * @property {Object}			customStyle		定义需要用到的外部样式
-	 * 
-	 * @event {Function}			click			点击cell列表时触发
-	 * @example 该组件需要搭配cell-group组件使用,见官方文档示例
-	 */
-	export default {
-		name: 'u-cell',
-		data() {
-			return {
-
-			}
-		},
-		mixins: [mpMixin, mixin, props],
-		computed: {
-			titleTextStyle() {
-				return addStyle(this.titleStyle)
-			}
-		},
-		emits: ['click'],
-		methods: {
-			addStyle,
-			testEmpty: test.empty,
-			// 点击cell
-			clickHandler(e) {
-				if (this.disabled) return
-				this.$emit('click', {
-					name: this.name
-				})
-				// 如果配置了url(此props参数通过mixin引入)参数,跳转页面
-				this.openPage()
-				// 是否阻止事件传播
-				this.stop && this.preventEvent(e)
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	$u-cell-padding: 13px 15px !default;
-	$u-cell-font-size: 15px !default;
-	$u-cell-line-height: 24px !default;
-	$u-cell-color: $u-main-color !default;
-	$u-cell-icon-size: 16px !default;
-	$u-cell-title-font-size: 15px !default;
-	$u-cell-title-line-height: 22px !default;
-	$u-cell-title-color: $u-main-color !default;
-	$u-cell-label-font-size: 12px !default;
-	$u-cell-label-color: $u-tips-color !default;
-	$u-cell-label-line-height: 18px !default;
-	$u-cell-value-font-size: 14px !default;
-	$u-cell-value-color: $u-content-color !default;
-	$u-cell-clickable-color: $u-bg-color !default;
-	$u-cell-disabled-color: #c8c9cc !default;
-	$u-cell-padding-top-large: 13px !default;
-	$u-cell-padding-bottom-large: 13px !default;
-	$u-cell-value-font-size-large: 15px !default;
-	$u-cell-label-font-size-large: 14px !default;
-	$u-cell-title-font-size-large: 16px !default;
-	$u-cell-left-icon-wrap-margin-right: 4px !default;
-	$u-cell-right-icon-wrap-margin-left: 4px !default;
-	$u-cell-title-flex:1 !default;
-	$u-cell-label-margin-top:5px !default;
-
-
-	.u-cell {
-		&__body {
-			@include flex();
-			/* #ifndef APP-NVUE */
-			box-sizing: border-box;
-			/* #endif */
-			padding: $u-cell-padding;
-			font-size: $u-cell-font-size;
-			color: $u-cell-color;
-			// line-height: $u-cell-line-height;
-			align-items: center;
-
-			&__content {
-				@include flex(row);
-				align-items: center;
-				flex: 1;
-			}
-
-			&--large {
-				padding-top: $u-cell-padding-top-large;
-				padding-bottom: $u-cell-padding-bottom-large;
-			}
-		}
-
-		&__left-icon-wrap,
-		&__right-icon-wrap {
-			@include flex();
-			align-items: center;
-			// height: $u-cell-line-height;
-			font-size: $u-cell-icon-size;
-		}
-
-		&__left-icon-wrap {
-			margin-right: $u-cell-left-icon-wrap-margin-right;
-		}
-
-		&__right-icon-wrap {
-			margin-left: $u-cell-right-icon-wrap-margin-left;
-			transition: transform 0.3s;
-
-			&--up {
-				transform: rotate(-90deg);
-			}
-
-			&--down {
-				transform: rotate(90deg);
-			}
-		}
-
-		&__title {
-			flex: $u-cell-title-flex;
-			display: flex;
-			flex-direction: column;
-
-			&-text {
-				font-size: $u-cell-title-font-size;
-				line-height: $u-cell-title-line-height;
-				color: $u-cell-title-color;
-
-				&--large {
-					font-size: $u-cell-title-font-size-large;
-				}
-			}
-
-		}
-
-		&__label {
-			margin-top: $u-cell-label-margin-top;
-			font-size: $u-cell-label-font-size;
-			color: $u-cell-label-color;
-			line-height: $u-cell-label-line-height;
-
-			&--large {
-				font-size: $u-cell-label-font-size-large;
-			}
-		}
-
-		&__value {	
-			text-align: right;
-			/* #ifndef APP-NVUE */
-			margin-left: auto;
-			/* #endif */	
-			font-size: $u-cell-value-font-size;
-			line-height: $u-cell-line-height;
-			color: $u-cell-value-color;
-			&--large {
-				font-size: $u-cell-value-font-size-large;
-			}
-		}
-
-		&--required {
-			/* #ifndef APP-NVUE */
-			overflow: visible;
-			/* #endif */
-			@include flex;
-			align-items: center;
-		}
-
-		&--required:before {
-			position: absolute;
-			/* #ifndef APP-NVUE */
-			content: '*';
-			/* #endif */
-			left: -8px;
-			margin-top: 4rpx;
-			font-size: 14px;
-			color: $u-error;
-		}
-
-		&--clickable {
-			background-color: $u-cell-clickable-color;
-		}
-
-		&--disabled {
-			color: $u-cell-disabled-color;
-			/* #ifndef APP-NVUE */
-			cursor: not-allowed;
-			/* #endif */
-		}
-
-		&--center {
-			align-items: center;
-		}
-	}
-</style>

+ 0 - 29
uni_modules/uview-plus/components/u-checkbox-group/checkboxGroup.js

@@ -1,29 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/checkboxGroup.js
- */
-export default {
-    // checkbox-group组件
-    checkboxGroup: {
-        name: '',
-        value: [],
-        shape: 'square',
-        disabled: false,
-        activeColor: '#2979ff',
-        inactiveColor: '#c8c9cc',
-        size: 18,
-        placement: 'row',
-        labelSize: 14,
-        labelColor: '#303133',
-        labelDisabled: false,
-        iconColor: '#ffffff',
-        iconSize: 12,
-        iconPlacement: 'left',
-        borderBottom: false
-    }
-}

+ 0 - 93
uni_modules/uview-plus/components/u-checkbox-group/props.js

@@ -1,93 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const props = defineMixin({
-    props: {
-        // 标识符
-        name: {
-            type: String,
-            default: () => defProps.checkboxGroup.name
-        },
-		// #ifdef VUE3
-		// 绑定的值
-		modelValue: {
-		    type: Array,
-		    default: () => defProps.checkboxGroup.value
-		},
-		// #endif
-		// #ifdef VUE2
-		// 绑定的值
-		value: {
-		    type: Array,
-		    default: () => defProps.checkboxGroup.value
-		},
-		// #endif
-        // 形状,circle-圆形,square-方形
-        shape: {
-            type: String,
-            default: () => defProps.checkboxGroup.shape
-        },
-        // 是否禁用全部checkbox
-        disabled: {
-            type: Boolean,
-            default: () => defProps.checkboxGroup.disabled
-        },
-
-        // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
-        activeColor: {
-            type: String,
-            default: () => defProps.checkboxGroup.activeColor
-        },
-        // 未选中的颜色
-        inactiveColor: {
-            type: String,
-            default: () => defProps.checkboxGroup.inactiveColor
-        },
-
-        // 整个组件的尺寸,默认px
-        size: {
-            type: [String, Number],
-            default: () => defProps.checkboxGroup.size
-        },
-        // 布局方式,row-横向,column-纵向
-        placement: {
-            type: String,
-            default: () => defProps.checkboxGroup.placement
-        },
-        // label的字体大小,px单位
-        labelSize: {
-            type: [String, Number],
-            default: () => defProps.checkboxGroup.labelSize
-        },
-        // label的字体颜色
-        labelColor: {
-            type: [String],
-            default: () => defProps.checkboxGroup.labelColor
-        },
-        // 是否禁止点击文本操作
-        labelDisabled: {
-            type: Boolean,
-            default: () => defProps.checkboxGroup.labelDisabled
-        },
-        // 图标颜色
-        iconColor: {
-            type: String,
-            default: () => defProps.checkboxGroup.iconColor
-        },
-        // 图标的大小,单位px
-        iconSize: {
-            type: [String, Number],
-            default: () => defProps.checkboxGroup.iconSize
-        },
-        // 勾选图标的对齐方式,left-左边,right-右边
-        iconPlacement: {
-            type: String,
-            default: () => defProps.checkboxGroup.iconPlacement
-        },
-        // 竖向配列时,是否显示下划线
-        borderBottom: {
-            type: Boolean,
-            default: () => defProps.checkboxGroup.borderBottom
-        }
-    }
-})

+ 0 - 136
uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue

@@ -1,136 +0,0 @@
-<template>
-	<view
-	    class="u-checkbox-group"
-	    :class="bemClass"
-	>
-		<slot></slot>
-	</view>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	/**
-	 * checkboxGroup 复选框组
-	 * @description 复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便
-	 * @tutorial https://uview-plus.jiangruyi.com/components/checkbox.html
-	 * @property {String}			name			标识符 
-	 * @property {Array}			value			绑定的值
-	 * @property {String}			shape			形状,circle-圆形,square-方形 (默认 'square' )
-	 * @property {Boolean}			disabled		是否禁用全部checkbox (默认 false )
-	 * @property {String}			activeColor		选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 (默认 '#2979ff' )
-	 * @property {String}			inactiveColor	未选中的颜色 (默认 '#c8c9cc' )
-	 * @property {String | Number}	size			整个组件的尺寸 单位px (默认 18 )
-	 * @property {String}			placement		布局方式,row-横向,column-纵向 (默认 'row' )
-	 * @property {String | Number}	labelSize		label的字体大小,px单位  (默认 14 )
-	 * @property {String}			labelColor		label的字体颜色 (默认 '#303133' )
-	 * @property {Boolean}			labelDisabled	是否禁止点击文本操作 (默认 false )
-	 * @property {String}			iconColor		图标颜色 (默认 '#ffffff' )
-	 * @property {String | Number}	iconSize		图标的大小,单位px (默认 12 )
-	 * @property {String}			iconPlacement	勾选图标的对齐方式,left-左边,right-右边  (默认 'left' )
-	 * @property {Boolean}			borderBottom	placement为row时,是否显示下边框 (默认 false )
-	 * @event {Function}	change	任一个checkbox状态发生变化时触发,回调为一个对象
-	 * @event {Function}	input	修改通过v-model绑定的值时触发,回调为一个对象
-	 * @example <u-checkbox-group></u-checkbox-group>
-	 */
-	export default {
-		name: 'u-checkbox-group',
-		mixins: [mpMixin, mixin,props],
-		computed: {
-			// 这里computed的变量,都是子组件u-checkbox需要用到的,由于头条小程序的兼容性差异,子组件无法实时监听父组件参数的变化
-			// 所以需要手动通知子组件,这里返回一个parentData变量,供watch监听,在其中去通知每一个子组件重新从父组件(u-checkbox-group)
-			// 拉取父组件新的变化后的参数
-			parentData() {
-			  return [
-				// #ifdef VUE2
-				this.value,
-				// #endif
-				// #ifdef VUE3
-				this.modelValue,
-				// #endif
-				this.disabled,
-				this.inactiveColor,
-				this.activeColor,
-				this.size,
-				this.labelDisabled,
-				this.shape,
-				this.iconSize,
-				this.borderBottom,
-				this.placement,
-			  ];
-			},
-			bemClass() {
-				// this.bem为一个computed变量,在mixin中
-				return this.bem('checkbox-group', ['placement'])
-			},
-		},
-		watch: {
-			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
-			parentData: {
-			  handler() {
-				if (this.children.length) {
-				  this.children.map((child) => {
-					// 判断子组件(u-checkbox)如果有init方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
-					typeof child.init === "function" && child.init();
-				  });
-				}
-			  },
-			  deep: true,
-			},
-		},
-		data() {
-			return {
-
-			}
-		},
-		created() {
-			this.children = []
-		},
-		// #ifdef VUE3
-		emits: ['update:modelValue', 'change'],
-		// #endif
-		methods: {
-			// 将其他的checkbox设置为未选中的状态
-			unCheckedOther(childInstance) {
-				const values = []
-				this.children.map(child => {
-					// 将被选中的checkbox,放到数组中返回
-					if (child.isChecked) {
-						values.push(child.name)
-					}
-				})
-			
-				// 修改通过v-model绑定的值
-				// #ifdef VUE3
-				this.$emit("update:modelValue", values);
-				// #endif
-				// #ifdef VUE2
-				this.$emit("input", values);
-				// #endif
-       			// 放在最后更新,否则change事件传出去的values不会更新
-				this.$emit('change', values, {
-					isChecked: childInstance.$data['isChecked'],
-					name: childInstance.$props['name'] // 当前变动的checkbox的name值
-				})
-			},
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-
-	.u-checkbox-group {
-
-		&--row {
-			/* #ifndef APP-NVUE */
-			display: flex;
-			/* #endif */
-			flex-flow: row wrap;
-		}
-
-		&--column {
-			@include flex(column);
-		}
-	}
-</style>

+ 0 - 27
uni_modules/uview-plus/components/u-checkbox/checkbox.js

@@ -1,27 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/checkbox.js
- */
-export default {
-    // checkbox组件
-    checkbox: {
-        name: '',
-        shape: '',
-        size: '',
-        checkbox: false,
-        disabled: '',
-        activeColor: '',
-        inactiveColor: '',
-        iconSize: '',
-        iconColor: '',
-        label: '',
-        labelSize: '',
-        labelColor: '',
-        labelDisabled: ''
-    }
-}

+ 0 - 76
uni_modules/uview-plus/components/u-checkbox/props.js

@@ -1,76 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        // checkbox的名称
-        name: {
-            type: [String, Number, Boolean],
-            default: () => defProps.checkbox.name
-        },
-        // 形状,square为方形,circle为圆型
-        shape: {
-            type: String,
-            default: () => defProps.checkbox.shape
-        },
-        // 整体的大小
-        size: {
-            type: [String, Number],
-            default: () => defProps.checkbox.size
-        },
-        // 是否默认选中
-        checked: {
-            type: Boolean,
-            default: () => defProps.checkbox.checked
-        },
-        // 是否禁用
-        disabled: {
-            type: [String, Boolean],
-            default: () => defProps.checkbox.disabled
-        },
-        // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
-        activeColor: {
-            type: String,
-            default: () => defProps.checkbox.activeColor
-        },
-        // 未选中的颜色
-        inactiveColor: {
-            type: String,
-            default: () => defProps.checkbox.inactiveColor
-        },
-        // 图标的大小,单位px
-        iconSize: {
-            type: [String, Number],
-            default: () => defProps.checkbox.iconSize
-        },
-        // 图标颜色
-        iconColor: {
-            type: String,
-            default: () => defProps.checkbox.iconColor
-        },
-        // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
-        label: {
-            type: [String, Number],
-            default: () => defProps.checkbox.label
-        },
-        // label的字体大小,px单位
-        labelSize: {
-            type: [String, Number],
-            default: () => defProps.checkbox.labelSize
-        },
-        // label的颜色
-        labelColor: {
-            type: String,
-            default: () => defProps.checkbox.labelColor
-        },
-        // 是否禁止点击提示语选中复选框
-        labelDisabled: {
-            type: [String, Boolean],
-            default: () => defProps.checkbox.labelDisabled
-        },
-		// 是否独立使用
-        usedAlone: {
-            type: [Boolean],
-            default: () => false
-        }
-    }
-})

+ 0 - 389
uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue

@@ -1,389 +0,0 @@
-<template>
-	<view
-	    class="u-checkbox cursor-pointer"
-	    :style="[checkboxStyle]"
-	    @tap.stop="wrapperClickHandler"
-	    :class="[`u-checkbox-label--${parentData.iconPlacement}`, parentData.borderBottom && parentData.placement === 'column' && 'u-border-bottom']"
-	>
-		<view
-		    class="u-checkbox__icon-wrap cursor-pointer"
-		    @tap.stop="iconClickHandler"
-		    :class="iconClasses"
-		    :style="[iconWrapStyle]"
-		>
-			<slot name="icon" :elIconSize="elIconSize" :elIconColor="elIconColor">
-				<up-icon
-				    class="u-checkbox__icon-wrap__icon"
-				    name="checkbox-mark"
-				    :size="elIconSize"
-				    :color="elIconColor"
-				/>
-			</slot>
-		</view>
-		<view class="u-checkbox__label-wrap cursor-pointer" @tap.stop="labelClickHandler">
-			<slot name="label" :label="label" :elDisabled="elDisabled">
-				<text
-					:style="{
-						color: elDisabled ? elInactiveColor : elLabelColor,
-						fontSize: elLabelSize,
-						lineHeight: elLabelSize
-					}"
-				>{{label}}</text>
-			</slot>
-		</view>
-	</view>
-</template>
-
-<script>
-	import { props } from './props';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	import { addStyle, addUnit, deepMerge, formValidate, error } from '../../libs/function/index';
-	import test from '../../libs/function/test';
-	/**
-	 * checkbox  复选框
-	 * @description 复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便
-	 * @tutorial https://uview-plus.jiangruyi.com/components/checkbox.html
-	 * @property {String | Number | Boolean}	name			checkbox组件的标示符
-	 * @property {String}						shape			形状,square为方形,circle为圆型
-	 * @property {String | Number}				size			整体的大小
-	 * @property {Boolean}						checked			是否默认选中
-	 * @property {String | Boolean}				disabled		是否禁用
-	 * @property {String}						activeColor		选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值
-	 * @property {String}						inactiveColor	未选中的颜色
-	 * @property {String | Number}				iconSize		图标的大小,单位px
-	 * @property {String}						iconColor		图标颜色
-	 * @property {String | Number}				label			label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式
-	 * @property {String}						labelColor 		label的颜色
-	 * @property {String | Number}				labelSize		label的字体大小,px单位
-	 * @property {String | Boolean}				labelDisabled	是否禁止点击提示语选中复选框
-	 * @property {Object}						customStyle		定义需要用到的外部样式
-	 * 
-	 * @event {Function}	change	任一个checkbox状态发生变化时触发,回调为一个对象
-	 * @example <u-checkbox v-model="checked" :disabled="false">天涯</u-checkbox>
-	 */
-	export default {
-		name: "u-checkbox",
-		mixins: [mpMixin, mixin, props],
-		data() {
-			return {
-				isChecked: false,
-				// 父组件的默认值,因为头条小程序不支持在computed中使用this.parent.shape的形式
-				// 故只能使用如此方法
-				parentData: {
-					iconSize: 12,
-					labelDisabled: null,
-					disabled: null,
-					shape: 'square',
-					activeColor: null,
-					inactiveColor: null,
-					size: 18,
-					// #ifdef VUE2
-					value: null,
-					// #endif
-					// #ifdef VUE3
-					modelValue: null,
-					// #endif
-					iconColor: null,
-					placement: 'row',
-					borderBottom: false,
-					iconPlacement: 'left'
-				}
-			}
-		},
-		computed: {
-			// 是否禁用,如果父组件u-radios-group禁用的话,将会忽略子组件的配置
-			elDisabled() {
-				return this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData.disabled : false;
-			},
-			// 是否禁用label点击
-			elLabelDisabled() {
-				return this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this.parentData.labelDisabled :
-					false;
-			},
-			// 组件尺寸,对应size的值,默认值为21px
-			elSize() {
-				return this.size ? this.size : (this.parentData.size ? this.parentData.size : 21);
-			},
-			// 组件的勾选图标的尺寸,默认12px
-			elIconSize() {
-				return this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 12);
-			},
-			// 组件选中激活时的颜色
-			elActiveColor() {
-				return this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor : '#2979ff');
-			},
-			// 组件选未中激活时的颜色
-			elInactiveColor() {
-				return this.inactiveColor ? this.inactiveColor : (this.parentData.inactiveColor ? this.parentData.inactiveColor :
-					'#c8c9cc');
-			},
-			// label的颜色
-			elLabelColor() {
-				return this.labelColor ? this.labelColor : (this.parentData.labelColor ? this.parentData.labelColor : '#606266')
-			},
-			// 组件的形状
-			elShape() {
-				return this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');
-			},
-			// label大小
-			elLabelSize() {
-				return addUnit(this.labelSize ? this.labelSize : (this.parentData.labelSize ? this.parentData.labelSize :
-					'15'))
-			},
-			elIconColor() {
-				const iconColor = this.iconColor ? this.iconColor : (this.parentData.iconColor ? this.parentData.iconColor :
-					'#ffffff');
-				// 图标的颜色
-				if (this.elDisabled) {
-					// disabled状态下,已勾选的checkbox图标改为elInactiveColor
-					return this.isChecked ? this.elInactiveColor : 'transparent'
-				} else {
-					return this.isChecked ? iconColor : 'transparent'
-				}
-			},
-			iconClasses() {
-				let classes = []
-				// 组件的形状
-				classes.push('u-checkbox__icon-wrap--' + this.elShape)
-				if (this.elDisabled) {
-					classes.push('u-checkbox__icon-wrap--disabled')
-				}
-				if (this.isChecked && this.elDisabled) {
-					classes.push('u-checkbox__icon-wrap--disabled--checked')
-				}
-				// 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
-				// #ifdef MP-ALIPAY || MP-TOUTIAO
-				classes = classes.join(' ')
-				// #endif
-				return classes
-			},
-			iconWrapStyle() {
-				// checkbox的整体样式
-				const style = {}
-				style.backgroundColor = this.isChecked && !this.elDisabled ? this.elActiveColor : '#ffffff'
-				style.borderColor = this.isChecked && !this.elDisabled ? this.elActiveColor : this.elInactiveColor
-				style.width = addUnit(this.elSize)
-				style.height = addUnit(this.elSize)
-				// 如果是图标在右边的话,移除它的右边距
-				if (!this.usedAlone) {
-					if (this.parentData.iconPlacement === 'right') {
-						style.marginRight = 0
-					}
-				}
-				return style
-			},
-			checkboxStyle() {
-				const style = {}
-				if (!this.usedAlone) {
-					if (this.parentData.borderBottom && this.parentData.placement === 'row') {
-						error('检测到您将borderBottom设置为true,需要同时将up-checkbox-group的placement设置为column才有效')
-					}
-					// 当父组件设置了显示下边框并且排列形式为纵向时,给内容和边框之间加上一定间隔
-					if (this.parentData.borderBottom && this.parentData.placement === 'column') {
-						style.paddingBottom = '8px'
-					}
-				}
-				return deepMerge(style, addStyle(this.customStyle))
-			}
-		},
-		mounted() {
-			this.init()
-		},
-		emits: ["change", "update:checked"],
-		methods: {
-			init() {
-				if (!this.usedAlone) {
-					// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环引用
-					this.updateParentData()
-					if (!this.parent) {
-						error('up-checkbox必须搭配up-checkbox-group组件使用')
-					}
-					let value = '';
-					// #ifdef VUE2
-					value = this.parentData.value
-					// #endif
-					// #ifdef VUE3
-					value = this.parentData.modelValue
-					// #endif
-					// 设置初始化时,是否默认选中的状态,父组件u-checkbox-group的value可能是array,所以额外判断
-					if (this.checked) {
-						this.isChecked = true
-					} else if (!this.usedAlone && test.array(value)) {
-						// 查找数组是是否存在this.name元素值
-						this.isChecked = value.some(item => {
-							return item === this.name
-						})
-					}
-				} else {
-					if (this.checked) {
-						this.isChecked = true
-					}
-				}
-			},
-			updateParentData() {
-				this.getParentData('u-checkbox-group')
-			},
-			// 横向两端排列时,点击组件即可触发选中事件
-			wrapperClickHandler(e) {
-				if (!this.usedAlone) {
-					this.parentData.iconPlacement === 'right' && this.iconClickHandler(e)
-				} else {
-					this.iconClickHandler(e)
-				}
-			},
-			// 点击图标
-			iconClickHandler(e) {
-				this.preventEvent(e)
-				// 如果整体被禁用,不允许被点击
-				if (!this.elDisabled) {
-					this.setRadioCheckedStatus()
-				}
-			},
-			// 点击label
-			labelClickHandler(e) {
-				this.preventEvent(e)
-				// 如果按钮整体被禁用或者label被禁用,则不允许点击文字修改状态
-				if (!this.elLabelDisabled && !this.elDisabled) {
-					this.setRadioCheckedStatus()
-				}
-			},
-			emitEvent() {
-				this.$emit('change', this.isChecked, {
-					name: this.name
-				})
-				// 双向绑定
-				if (this.usedAlone) {
-					this.$emit('update:checked', this.isChecked)
-				}
-				// 尝试调用u-form的验证方法,进行一定延迟,否则微信小程序更新可能会不及时
-				this.$nextTick(() => {
-					formValidate(this, 'change')
-				})
-			},
-			// 改变组件选中状态
-			// 这里的改变的依据是,更改本组件的checked值为true,同时通过父组件遍历所有u-checkbox实例
-			// 将本组件外的其他u-checkbox的checked都设置为false(都被取消选中状态),因而只剩下一个为选中状态
-			setRadioCheckedStatus() {
-				// 将本组件标记为与原来相反的状态
-				this.isChecked = !this.isChecked
-				this.emitEvent()
-				if (!this.usedAlone) {
-					typeof this.parent.unCheckedOther === 'function' && this.parent.unCheckedOther(this)
-				}
-			}
-		},
-		watch:{
-			checked(newValue, oldValue){
-				if (newValue !== this.isChecked) {
-					this.isChecked = newValue
-				}
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	$u-checkbox-icon-wrap-margin-right:6px !default;
-	$u-checkbox-icon-wrap-font-size:6px !default;
-	$u-checkbox-icon-wrap-border-width:1px !default;
-	$u-checkbox-icon-wrap-border-color:#c8c9cc !default;
-	$u-checkbox-icon-wrap-icon-line-height:0 !default;
-	$u-checkbox-icon-wrap-circle-border-radius:100% !default;
-	$u-checkbox-icon-wrap-square-border-radius:3px !default;
-	$u-checkbox-icon-wrap-checked-color:#fff !default;
-	$u-checkbox-icon-wrap-checked-background-color:red !default;
-	$u-checkbox-icon-wrap-checked-border-color:#2979ff !default;
-	$u-checkbox-icon-wrap-disabled-background-color:#ebedf0 !default;
-	$u-checkbox-icon-wrap-disabled-checked-color:#c8c9cc !default;
-	$u-checkbox-label-margin-left:5px !default;
-	$u-checkbox-label-margin-right:12px !default;
-	$u-checkbox-label-color:$u-content-color !default;
-	$u-checkbox-label-font-size:15px !default;
-	$u-checkbox-label-disabled-color:#c8c9cc !default;
-
-	.u-checkbox {
-		/* #ifndef APP-NVUE */
-		@include flex(row);
-		/* #endif */
-		overflow: hidden;
-		flex-direction: row;
-		align-items: center;
-		margin-bottom: 5px;
-		margin-top: 5px;
-
-		&-label--left {
-			flex-direction: row
-		}
-
-		&-label--right {
-			flex-direction: row-reverse;
-			justify-content: space-between
-		}
-
-		&__icon-wrap {
-			/* #ifndef APP-NVUE */
-			box-sizing: border-box;
-			// nvue下,border-color过渡有问题
-			transition-property: border-color, background-color, color;
-			transition-duration: 0.2s;
-			/* #endif */
-			color: $u-content-color;
-			@include flex;
-			align-items: center;
-			justify-content: center;
-			color: transparent;
-			text-align: center;
-			margin-right: $u-checkbox-icon-wrap-margin-right;
-
-			font-size: $u-checkbox-icon-wrap-font-size;
-			border-width: $u-checkbox-icon-wrap-border-width;
-			border-color: $u-checkbox-icon-wrap-border-color;
-			border-style: solid;
-
-			/* #ifdef MP-TOUTIAO */
-			// 头条小程序兼容性问题,需要设置行高为0,否则图标偏下
-			&__icon {
-				line-height: $u-checkbox-icon-wrap-icon-line-height;
-			}
-
-			/* #endif */
-
-			&--circle {
-				border-radius: $u-checkbox-icon-wrap-circle-border-radius;
-			}
-
-			&--square {
-				border-radius: $u-checkbox-icon-wrap-square-border-radius;
-			}
-
-			&--checked {
-				color: $u-checkbox-icon-wrap-checked-color;
-				background-color: $u-checkbox-icon-wrap-checked-background-color;
-				border-color: $u-checkbox-icon-wrap-checked-border-color;
-			}
-
-			&--disabled {
-				background-color: $u-checkbox-icon-wrap-disabled-background-color !important;
-			}
-
-			&--disabled--checked {
-				color: $u-checkbox-icon-wrap-disabled-checked-color !important;
-			}
-		}
-
-		&__label {
-			/* #ifndef APP-NVUE */
-			word-wrap: break-word;
-			/* #endif */
-			margin-left: $u-checkbox-label-margin-left;
-			margin-right: $u-checkbox-label-margin-right;
-			color: $u-checkbox-label-color;
-			font-size: $u-checkbox-label-font-size;
-
-			&--disabled {
-				color: $u-checkbox-label-disabled-color;
-			}
-		}
-	}
-</style>

+ 0 - 109
uni_modules/uview-plus/components/u-choose/u-choose.vue

@@ -1,109 +0,0 @@
-<style scoped lang="scss">
-	.up-choose {
-		::v-deep .up-tag {
-		    font-weight: 600;
-		}
-		&:last-child {
-			margin-right: 0;
-		}
-	}
-	
-	.up-choose-wrap {
-		flex-wrap: wrap;
-	}
-	
-	.up-choose-nowrap {
-		flex-wrap: nowrap;
-		white-space: nowrap;
-	}
-</style>
-
-<template>
-	<scroll-view 
-		:scroll-x="wrap === false" 
-		:class="['up-choose', wrap ? 'up-choose-wrap' : 'up-choose-nowrap']">
-        <template :key="item.id"  v-for="(item,index) in options">
-            <view :style="{width: itemWidth, display: 'inline-block'}">
-                <slot :item="item" :index="index">
-                    <up-tag :type="index == currentIndex ? 'primary' : 'info'"
-                        size="large" :plain="index == currentIndex ? false : true"
-                        :class="currentIndex === index ? 'active': ''" :height="itemHeight"
-                        :style="{width: itemWidth, padding: itemPadding}"
-                        @click="change(index)">
-                        {{item[labelName]}}
-                    </up-tag>
-                </slot>
-            </view>
-        </template>
-	</scroll-view>
-</template>
-
-<script>
-	export default {
-	    name: 'up-choose',
-	    props: {
-			options:{
-				type: Array,
-				default: ()=>{
-					return [];
-				}
-			},
-			modelValue: {
-				type: [Number,String,Array],
-				default: false
-			},
-			type: {
-			    type: [String],
-			    default: 'radio'
-			},
-			itemWidth: {
-			    type: [String],
-			    default: 'auto'
-			},
-			itemHeight: {
-			    type: [String],
-			    default: '50px'
-			},
-            itemPadding: {
-                type: [String],
-			    default: '8px'
-            },
-			labelName: {
-			    type: String,
-			    default: 'title'
-			},
-			valueName: {
-			    type: String,
-			    default: 'value'
-			},
-			customClick: {
-			    type: Boolean,
-			    default: false
-			},
-			// 是否换行
-			wrap: {
-				type: Boolean,
-				default: true
-			}
-	    },
-	    data() {
-	        return {
-				currentIndex: ''
-	        }
-	    },
-	    created: function () {
-			this.currentIndex = this.modelValue;
-	    },
-        emits: ['update:modelValue', 'custom-click'],
-	    methods: {
-	        change(index){
-				if (this.customClick) {
-					this.$emit('custom-click', index);
-				} else {
-					this.currentIndex = index;
-					this.$emit('update:modelValue', index);
-				}
-			}
-	    }
-	}
-</script>

+ 0 - 15
uni_modules/uview-plus/components/u-circle-progress/circleProgress.js

@@ -1,15 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 3.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : jry
- * @lastTime     : 2025-12-19 08:55:21
- * @FilePath     : /uview-plus/libs/config/props/circleProgress.js
- */
-export default {
-    // circleProgress 组件
-    circleProgress: {
-        percentage: 30
-    }
-}

+ 0 - 10
uni_modules/uview-plus/components/u-circle-progress/props.js

@@ -1,10 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-export const props = defineMixin({
-    props: {
-        percentage: {
-            type: [String, Number],
-            default: () => defProps.circleProgress.percentage
-        }
-    }
-})

Some files were not shown because too many files changed in this diff