apple 1 месяц назад
Родитель
Сommit
b2ca9de920
100 измененных файлов с 4824 добавлено и 35620 удалено
  1. BIN
      .DS_Store
  2. 3 1
      .gitignore
  3. 32 24
      App.vue
  4. 0 10131
      alf/Main.css
  5. 0 6842
      alf/base.css
  6. 0 1133
      alf/commonValidator.js
  7. 0 1462
      alf/ext_lf_inp.jsp
  8. 0 257
      alf/ext_lf_lfryMine.jsp
  9. 0 814
      alf/input.jsp
  10. 0 750
      alf/kqjl_bzrDm.ss.jsp
  11. 0 338
      alf/mp_excelRcXcdjl_edit.ss.jsp
  12. 0 5832
      alf/ss-components.js
  13. 0 1562
      alf/validation.js
  14. 87 0
      api/clyy.js
  15. 94 0
      api/common.js
  16. 139 0
      api/device.js
  17. 90 0
      api/grfw.js
  18. 65 15
      api/kqjl.js
  19. 174 0
      api/payment.js
  20. 8 0
      api/student.js
  21. 116 0
      api/todo.js
  22. 112 68
      api/user.js
  23. 36 36
      api/xuncha.js
  24. 97 97
      components/Form/index.vue
  25. 163 0
      components/LoginConfirmModal/index.vue
  26. 112 112
      components/SsBottom/index.vue
  27. 196 0
      components/SsCarCard/index.vue
  28. 238 22
      components/SsCard/index.vue
  29. 198 0
      components/SsConfirm/index.vue
  30. 380 337
      components/SsDatetimePicker/index.vue
  31. 85 85
      components/SsInput/index.vue
  32. 188 177
      components/SsOnoffButton/index.vue
  33. 329 169
      components/SsSearchButton/index.vue
  34. 357 352
      components/SsSelect/index.vue
  35. 18 18
      components/SsTableTitle/index.vue
  36. 155 0
      components/SsUploadAvatar/index.vue
  37. 245 245
      components/Td/index.vue
  38. 226 226
      components/agreement/AgreementPopup.vue
  39. 120 0
      components/custom-modal.vue
  40. 54 52
      components/icon/index.vue
  41. 470 470
      components/login/LoginPopup.vue
  42. 0 133
      components/tabbar/index.vue
  43. 143 143
      composables/useFormValidation.js
  44. 3 2
      config/env.js
  45. 21 20
      index.html
  46. 13 13
      main.js
  47. 8 1
      manifest.json
  48. 2 2
      node_modules/.bin/lessc
  49. 2 2
      node_modules/.modules.yaml
  50. 2 2
      node_modules/.pnpm/@vue+compiler-core@3.5.18/node_modules/@vue/compiler-core/node_modules/.bin/parser
  51. 2 2
      node_modules/.pnpm/@vue+compiler-sfc@3.5.18/node_modules/@vue/compiler-sfc/node_modules/.bin/parser
  52. 2 2
      node_modules/.pnpm/less-loader@12.3.0_less@4.4.0/node_modules/less-loader/node_modules/.bin/lessc
  53. 4 4
      node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/errno
  54. 4 4
      node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/image-size
  55. 4 4
      node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/mime
  56. 4 4
      node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/needle
  57. 5 5
      node_modules/.pnpm/lock.yaml
  58. 2 2
      node_modules/.pnpm/make-dir@2.1.0/node_modules/make-dir/node_modules/.bin/semver
  59. 2 2
      node_modules/.pnpm/node_modules/.bin/errno
  60. 2 2
      node_modules/.pnpm/node_modules/.bin/image-size
  61. 2 2
      node_modules/.pnpm/node_modules/.bin/mime
  62. 2 2
      node_modules/.pnpm/node_modules/.bin/nanoid
  63. 2 2
      node_modules/.pnpm/node_modules/.bin/needle
  64. 2 2
      node_modules/.pnpm/node_modules/.bin/parser
  65. 2 2
      node_modules/.pnpm/node_modules/.bin/semver
  66. 2 2
      node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/node_modules/.bin/nanoid
  67. 0 21
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/LICENSE
  68. 0 74
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/README.md
  69. 0 966
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/changelog.md
  70. 0 85
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--form/u--form.vue
  71. 0 50
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--image/u--image.vue
  72. 0 74
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--input/u--input.vue
  73. 0 45
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--text/u--text.vue
  74. 0 47
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--textarea/u--textarea.vue
  75. 0 109
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-action-sheet-data/u-action-sheet-data.vue
  76. 0 26
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-action-sheet/actionSheet.js
  77. 0 62
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-action-sheet/props.js
  78. 0 282
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue
  79. 0 28
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-album/album.js
  80. 0 86
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-album/props.js
  81. 0 299
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-album/u-album.vue
  82. 0 22
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-alert/alert.js
  83. 0 46
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-alert/props.js
  84. 0 250
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-alert/u-alert.vue
  85. 0 23
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar-group/avatarGroup.js
  86. 0 54
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar-group/props.js
  87. 0 109
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue
  88. 0 28
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar/avatar.js
  89. 0 81
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar/props.js
  90. 0 61
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar/u-avatar.vue
  91. 0 27
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-back-top/backtop.js
  92. 0 56
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-back-top/props.js
  93. 0 132
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-back-top/u-back-top.vue
  94. 0 27
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-badge/badge.js
  95. 0 79
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-badge/props.js
  96. 0 176
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-badge/u-badge.vue
  97. 0 27
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-box/props.js
  98. 0 91
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-box/u-box.vue
  99. 0 43
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-button/button.js
  100. 0 46
      node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-button/nvue.scss

+ 3 - 1
.gitignore

@@ -1 +1,3 @@
-node_modules
+node_modules
+unpackage/*
+alf

+ 32 - 24
App.vue

@@ -1,6 +1,4 @@
 <script>
-import { userApi } from '@/api/user.js'
-
 export default {
 	onLaunch: function() {
 		// 获取并保存设备信息
@@ -9,32 +7,42 @@ export default {
 			uni.setStorageSync("deviceInfo", deviceInfo)
 			console.log("初始化设备信息", deviceInfo)
 		}
+
+		// ⚠️ 在小程序启动时立即设置通话结束页(关键:处理被叫接听场景)
+		this.setupVoipEndPage()
 	},
-	onShow: async function() {
-		// 检查是否有token,有则自动登录
-		const userInfo = uni.getStorageSync("userInfo")
-		if (userInfo?.yhsbToken) {
-			try {
-				console.log("自动登录", userInfo.yhsbToken)
-				const res = await userApi.autoLogin({
-					mdToken: userInfo.yhsbToken
-				})
-				console.log("自动登录", res.data)
-				// 更新整个 userInfo 对象,主要更新yhsbToken
-				
-				uni.setStorageSync("userInfo", res.data)
-				
-			} catch (error) {
-				console.error("自动登录失败", error)
-				// 可以在这里处理登录失败的情况,比如清除token
-				// uni.removeStorageSync("userInfo")
-			}
-		} else {
-			console.log("无token,跳过自动登录")
-		}
+	onShow: function() {
+		// 每次小程序显示时也设置通话结束页(确保被唤起时也生效)
+		this.setupVoipEndPage()
 	},
 	onHide: function() {
 		console.log('App Hide')
+	},
+	methods: {
+		// 设置 VoIP 通话结束页面
+		setupVoipEndPage() {
+			try {
+				// 判断是否在 WMPF 环境
+				if (typeof wmpf === 'undefined') {
+					// 非 WMPF 环境,直接返回
+					return
+				}
+
+				// 尝试获取插件(开发环境可能不可用)
+				const wmpfVoip = requirePlugin('wmpf-voip')?.default
+				if (wmpfVoip && typeof wmpfVoip.setVoipEndPagePath === 'function') {
+					wmpfVoip.setVoipEndPagePath({
+						url: '/pages/device/index',  // 通话结束直接返回首页
+						key: 'Call',
+						routeType: 'redirectTo'
+					})
+					console.log('✅ [App.vue] 已设置通话结束跳转到首页')
+				}
+			} catch (e) {
+				// 开发环境插件不可用,静默忽略
+				// console.error('❌ [App.vue] 设置通话结束页失败:', e)
+			}
+		}
 	}
 }
 </script>

+ 0 - 10131
alf/Main.css

@@ -1,10131 +0,0 @@
-/*-----------------start 20240708 样式--------------*/
-/*
-* {
-    cursor: url(image/cur.ico), default;
-}
-*/
-html,
-body {
-    height: 100%;
-}
-
-body,
-div,
-span,
-iframe,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p,
-pre,
-em,
-a,
-img,
-ul,
-li,
-form,
-b,
-u,
-i,
-fieldset,
-form,
-label,
-tbody,
-thead,
-tr,
-th,
-td,
-canvas,
-audio,
-textarea,
-video {
-    font-size: 100%;
-    margin: 0;
-    padding: 0;
-    vertical-align: baseline;
-    border: none;
-    font-weight: normal;
-    text-decoration: none;
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
-    outline: none;
-}
-
-body {
-    font-size: 14px;
-    -webkit-touch-callout: none;
-    -webkit-user-select: none;
-    -khtml-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-    cursor: url(image/cur.ico), default;
-
-    -webkit-text-size-adjust: none;
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-hr {
-    margin: 0px;
-    height: 0px;
-    border: none;
-    border-bottom: 1px solid #cccccc;
-}
-
-body,
-input,
-button,
-select {
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
-    margin: 0;
-    padding: 0;
-}
-
-strong span {
-    font-weight: bold;
-}
-
-input {
-    background: none;
-}
-
-ul {
-    list-style: none;
-}
-
-textarea {
-    background-color: transparent;
-    outline: none;
-}
-
-input[type='text'],
-input[type='number'],
-input[type='password'] {
-    width: 160px;
-    height: 30px;
-    color: #000000;
-    border: none;
-    vertical-align: middle;
-    margin-right: 2px;
-    padding-left: 12px;
-    box-sizing: border-box;
-    border-radius: 2px;
-    font-size: 16px;
-    outline: none;
-    background: none;
-}
-
-input[type='text']:focus,
-input[type='number']:focus,
-input[type='password']:focus {
-    border: 1px solid #6c9ed7;
-    /* box-shadow: 0 0 5px #6c9ed7; */
-    outline: none;
-}
-
-input[type='text']::-webkit-input-placeholder,
-input[type='number']::-webkit-input-placeholder,
-input[type='password']::-webkit-input-placeholder {
-    color: #ccc;
-    font-family: "SimHei", Georgia, Serif !important;
-    font-size: 14px;
-}
-
-
-
-
-
-
-/*-------锁屏样式-------*/
-
-.lock-screen {
-    background: url(image/SuoPin1.jpg) !important;
-    background-repeat: no-repeat !important;
-    background-position: center center !important;
-    background-attachment: fixed !important;
-    background-size: cover !important;
-
-
-}
-
-/*----------------线样式-----------------*/
-/*hLine*/
-/*普通hLine*/
-.hLine {
-    border-bottom: 1px solid #d9d9d9;
-}
-
-/*上边框浅色实线*/
-.hLine-top {
-    border-top: 1px solid #d9d9d9;
-}
-
-/*浅色hLine*/
-.hLine-dim {
-    border-bottom: 1px solid #e5e8e9;
-}
-
-/*hLine高亮*/
-.hLine-highlight {
-    border-bottom: 1px solid #6c9ed7;
-}
-
-/*hLine高亮加粗*/
-.hLine-highlightBlod {
-    border-bottom: 2px solid #6c9ed7;
-}
-
-.hLine-dashed {
-    border-bottom: 1px dashed #ededed;
-}
-
-/* 拖拉界面的红线 */
-.hLine-warning {
-    width: calc(100% - 4px);
-    height: 2px;
-    background-color: red;
-    display: inline-block;
-    vertical-align: top;
-}
-
-/*vLine*/
-/*普通vLine*/
-.vLine {
-    border-right: 1px solid #d9d9d9;
-}
-
-/*左边框浅色实线*/
-.vLine-left {
-    border-left: 1px solid #d9d9d9;
-}
-
-/*vLine虚线*/
-.vLine-dashed {
-    border-right: 1px dashed #cacfd9;
-}
-
-/*非空校验的样式*/
-.vLine-leftWarning {
-    border-left: 2px solid red;
-    height: 100%;
-    position: absolute;
-    left: -1px;
-    top: 0px;
-}
-
-.vLine-warning {
-    border-left: 2px solid red;
-    height: 20px;
-    display: inline-block;
-    float: left;
-}
-
-.vline-dim {
-    border-right: 1px solid #c3c3c3;
-}
-
-/* .menu-vLine {
-    border-right: 1px solid rgba(30, 39, 105, 1);
-    box-shadow: 1px 0px 0px rgba(60, 74, 185, 1);
-} */
-
-.vLine-leftHighlight {
-    border-left: 2px solid #71a0ce;
-}
-
-/*-------------------线样式结束----------------------*/
-
-/* ------------------鼠标样式 -----------------------*/
-/* 向左拖一个 */
-.cursor-hDrag {
-    cursor: url(image/cursor-hDrag.ico), default !important;
-}
-
-.cursor-hDrag * {
-    cursor: url(image/cursor-hDrag.ico), default !important;
-}
-
-/* 向左拖多个 */
-.cursor-hDragMultiple {
-    cursor: url(image/cursor-hDragMultiple.ico), default !important;
-}
-
-.cursor-hDragMultiple * {
-    cursor: url(image/cursor-hDragMultiple.ico), default !important;
-}
-
-/* 手形(点击打开) */
-.cursor-click {
-    cursor: url(image/cursor-click.ico), default !important;
-}
-
-.cursor-click * {
-    cursor: url(image/cursor-click.ico), default !important;
-}
-
-/* 向上拖一个 */
-.cursor-vDrag {
-    cursor: url(image/cursor-vDrag.ico), default !important;
-}
-
-.cursor-vDrag * {
-    cursor: url(image/cursor-vDrag.ico), default !important;
-}
-
-/* 向上拖多个 */
-.cursor-vDragMultiple {
-    cursor: url(image/cursor-vDragMultiple.ico), default !important;
-}
-
-.cursor-vDragMultiple * {
-    cursor: url(image/cursor-vDragMultiple.ico), default !important;
-}
-
-/* 可点击带帮助 */
-.cursor-clickHelp {
-    cursor: url(image/cursor-clickHelp.ico), default !important;
-}
-
-/* 带帮助 */
-.cursor-help {
-    cursor: url(image/cursor-help.ico), default !important;
-}
-
-/* 普通 */
-.cursor {
-    cursor: url(image/cur.ico), default !important;
-}
-
-/* 倒计时 */
-.cursor-timing1 * {
-    cursor: url(image/ready1.ico), default !important;
-}
-
-.cursor-timing2 * {
-    cursor: url(image/ready2.ico), default !important;
-}
-
-.cursor-timing3 * {
-    cursor: url(image/ready3.ico), default !important;
-}
-
-.cursor-timing4 * {
-    cursor: url(image/ready4.ico), default !important;
-}
-
-.cursor-timing5 * {
-    cursor: url(image/ready5.ico), default !important;
-}
-
-.cursor-timing6 * {
-    cursor: url(image/ready6.ico), default !important;
-}
-
-.cursor-timing7 * {
-    cursor: url(image/ready7.ico), default !important;
-}
-
-.cursor-timing8 * {
-    cursor: url(image/ready8.ico), default !important;
-}
-
-.cursor-timing9 * {
-    cursor: url(image/ready9.ico), default !important;
-}
-
-.cursor-timing10 * {
-    cursor: url(image/ready10.ico), default !important;
-}
-
-.cursor-timing11 * {
-    cursor: url(image/ready11.ico), default !important;
-}
-
-.cursor-timing12 * {
-    cursor: url(image/ready12.ico), default !important;
-}
-
-/*忙(转圈圈)*/
-.cursor-loading {
-    width: 34px;
-    height: 34px;
-    background: url(image/cursor-loading.gif) center center no-repeat;
-}
-
-/*------------------鼠标样式结束--------------------*/
-
-/*--------------------滚动条样式--------------------*/
-/*大滚动条*/
-div.nicescroll-rails {
-    /*background-color: inherit !important;*/
-}
-
-/*大滚动条样式*/
-/* .scrollbar{} */
-
-/*小滚动条样式*/
-/* .smallScrollbar {} */
-/*---------------------滚动条样式结束----------------*/
-
-/*----------------------背景颜色样式-------------*/
-/*主体背景颜色*/
-.home-div {
-    background-color: #f5f5f5;
-
-
-}
-
-/*内容*/
-.background-content {
-    background-color: #fff;
-}
-
-/*应用首页操作区底色*/
-.sysbar-div {
-    background-color: #fff;
-}
-
-.cms-background {
-    background-color: #f5f5f5;
-}
-
-/*---------------------背景颜色样式结束------------*/
-
-/*---------------------按钮样式-------------------*/
-/* 搜索按钮 */
-.content-invertButton {
-    font-size: 14px;
-    color: #fff;
-    padding: 0px 13px;
-    height: 28px;
-    line-height: 28px;
-    background-color: #393d51;
-    box-sizing: border-box;
-    border: 1px solid #393d51;
-    vertical-align: middle;
-    border-radius: 3px;
-    outline: none;
-    margin-right: 2px;
-}
-
-.content-invertButton:hover {
-    border: 1px solid #c4c7cc;
-    color: #c4c7cc;
-    background-color: transparent;
-}
-
-.content-invertButton:active {
-    border: 1px solid #000;
-    color: #fff;
-    background: #000;
-}
-
-/* 管理按钮 */
-.content-button {
-    font-size: 14px;
-    color: #999999;
-    padding: 0px 13px;
-    height: 29px;
-    line-height: 28px;
-    box-sizing: border-box;
-    border: 1px solid #c4c7cc;
-    vertical-align: middle;
-    border-radius: 3px;
-    outline: none;
-    margin-right: 2px;
-    background: none;
-}
-
-.content-button:hover {
-    background-color: #393d51;
-    border: 1px solid #393d51;
-    color: #fff;
-    /* background-color: #6b9fd3; */
-}
-
-.content-button:active {
-    border: 1px solid #000;
-    color: #fff;
-    background-color: #000;
-}
-
-/*底部按钮样式*/
-.bottom-button {
-    width: 161px;
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-    font-size: 16px;
-    font-weight: normal;
-    clear: both;
-    /* height: 37px; */
-    box-sizing: border-box;
-    padding: 5px 20px;
-    line-height: 33px;
-    /* margin: 0 12.5px; */
-    color: #333333;
-    border: none;
-    border-radius: 5px;
-    background: #FFFFFF;
-    border-radius: 4px 4px 4px 4px;
-    border: 1px solid #A6ABB3;
-    outline: none;
-    letter-spacing: unset !important;
-}
-
-.bottom-button:hover {
-    color: #fff;
-    background-color: #575D6D;
-}
-
-.bottom-button:active {
-    color: #fff;
-    background-color: #575D6D;
-}
-
-/*on按钮*/
-.content-onButton {
-    display: inline-block;
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-    font-size: 16px;
-    min-width: 80px;
-    font-weight: normal;
-    height: 28px;
-    line-height: 28px;
-    outline: none;
-    color: #393d51;
-    background: url(image/svg_icon/gouxuan.svg) right bottom no-repeat;
-    background-color: #ffffff;
-    overflow: hidden;
-    padding: 5px 10px;
-    vertical-align: middle;
-    position: relative;
-    box-sizing: border-box;
-    border-radius: 2px;
-    border: 1px solid #393d51;
-    background-size: 24px;
-}
-
-.content-onButton:hover {
-    color: #fff;
-    background: #393d51 url(image/svg_icon/gouxuan.svg) right bottom no-repeat;
-}
-
-/*off按钮*/
-.content-offButton {
-    display: inline-block;
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-    font-size: 16px;
-    min-width: 80px;
-    font-weight: normal;
-    padding: 5px 10px;
-    outline: none;
-    color: #c3c6ca;
-    background: url(image/svg_icon/bugouxuan.svg) right bottom no-repeat;
-    background-color: #ffffff;
-    border-radius: 4px;
-    overflow: hidden;
-    /* padding: 0px 13px; */
-    vertical-align: middle;
-    border: 1px solid #bfc1c6;
-    box-sizing: border-box;
-    background-size: 24px;
-}
-
-.content-offButton:hover {
-    border-radius: 4px;
-    color: #fff;
-    background: #393d51 url(image/svg_icon/bugouxuan.svg) right bottom no-repeat;
-}
-
-/*label按钮*/
-.label-button {
-    font-size: 14px;
-    padding: 0px 13px;
-    background-color: #6c9ed7;
-    box-sizing: border-box;
-    border: 1px solid #fff;
-    height: 28px;
-    line-height: 28px;
-    vertical-align: middle;
-    color: #fff;
-    border-radius: 4px;
-    outline: none;
-    cursor: pointer;
-    margin-right: 2px;
-}
-
-.label-button:hover {
-    border-radius: 4px;
-    color: #6c9ed7;
-    background-color: #fff;
-}
-
-.smallButton {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background-color: #f7f7f7;
-    color: #6c9ddb;
-    text-align: center;
-    line-height: 22px;
-    box-shadow: -1px 1px 1px rgba(108, 158, 215, .4);
-    border-radius: 2px;
-    outline: none;
-    border: none;
-    background-position: center center;
-    background-repeat: no-repeat;
-}
-
-.smallButton:hover {
-    color: #fff;
-    background-color: #6c9ed7;
-}
-
-.smallButton:active {
-    color: #fff;
-    background-color: #415f7f;
-}
-
-.button {
-    width: 50px;
-    background-color: #f7f7f7;
-    border-radius: 2px;
-    color: #6c9ed7;
-    text-align: center;
-    outline: none;
-    border: none;
-    display: inline-block;
-    box-shadow: -1px 1px 1px rgba(108, 158, 215, .4);
-    background-position-x: center;
-    background-position-y: calc(50% - 10px);
-    font-size: 13px;
-    background-repeat: no-repeat;
-}
-
-.button:hover {
-    background-color: #6c9ed7;
-    color: #fff;
-}
-
-.button:active {
-    background-color: #415f7f;
-    color: #fff;
-}
-
-.builtinButton {
-    width: 50px;
-    background-color: #f7f7f7;
-    border-radius: 2px;
-    color: #6c9ed7;
-    text-align: center;
-    outline: none;
-    border: none;
-    display: inline-block;
-    box-shadow: -1px 0px 1px rgba(108, 158, 215, .4);
-    background-position-x: center;
-    background-position-y: calc(50% - 10px);
-    font-size: 13px;
-    background-repeat: no-repeat;
-}
-
-.builtinButton:hover {
-    background-color: #6c9ed7;
-    color: #fff;
-}
-
-.builtinButton:active {
-    background-color: #415f7f;
-    color: #fff;
-}
-
-/*--------------------按钮样式结束----------------------*/
-
-/*--------------------icon图标样式-----------------------*/
-/*附件*/
-.icon-attachment {
-    background-image: url(image/icon-attachment.png);
-}
-
-.icon-attachment:hover {
-    background-image: url(image/icon-attachment-hover.png);
-}
-
-.icon-attachment:active {
-    background-image: url(image/icon-attachment-hover.png);
-}
-
-/*常用语*/
-.icon-phrase {
-    background-image: url(image/icon-phrase.png);
-}
-
-.icon-phrase:hover {
-    background-image: url(image/icon-phrase-hover.png);
-}
-
-.icon-phrase:active {
-    background-image: url(image/icon-phrase-hover.png);
-}
-
-/*手写*/
-.icon-pen {
-    background-image: url(image/icon-pen.png);
-}
-
-.icon-pen:hover {
-    background-image: url(image/icon-pen-hover.png);
-}
-
-.icon-pen:active {
-    background-image: url(image/icon-pen-hover.png);
-}
-
-/*待办小I*/
-.icon-i {
-    vertical-align: middle;
-    background-image: url(image/smallButton-i.png);
-    cursor: url(image/cur.ico), default !important;
-    float: left;
-    margin-top: 10px !important;
-    margin-left: 8px;
-}
-
-.smallButton.icon-i:hover {
-    background-image: url(image/smallButton-i-hover.png);
-}
-
-.smallButton.icon-i:active {
-    background-image: url(image/smallButton-i-hover.png);
-}
-
-/*待办大I按钮*/
-.icon-bigI {
-    vertical-align: middle;
-    background-image: url(image/smallButton-bigIbutton.png);
-    float: left;
-    cursor: url(image/cur.ico), default !important;
-    margin-top: 10px;
-    margin-left: 10px;
-}
-
-.smallButton.icon-bigI:hover {
-    background-image: url(image/smallButton-bigIbutton-hover.png);
-}
-
-.smallButton.icon-bigI:active {
-    background-image: url(image/smallButton-bigIbutton-hover.png);
-}
-
-/*增加*/
-.icon-add {
-    background-image: url(image/addIcon.png);
-    background-position-x: center;
-    background-repeat: no-repeat;
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-}
-
-input.icon-add {
-    
-    border: none;
-    outline: none;
-    float: left;
-    margin-right: 8px;
-    
-}
-
-.button.icon-add:hover {
-    background-image: url(image/addIcon-hover.png);
-    background-position-x: center;
-    background-repeat: no-repeat;
-}
-
-/*删除*/
-.icon-del {
-    background-image: url(image/icon-del.png);
-}
-
-input.icon-del {
-    width: 22px;
-    height: 22px;
-    border: none;
-    outline: none;
-    float: left;
-    margin-right: 8px;
-    display: inline-block;
-}
-
-.button.icon-del:hover {
-    background-image: url(image/icon-del-hover.png);
-}
-
-
-/* 变动 */
-.icon-change {
-    background-image: url(image/changeIcon.png);
-}
-
-input.icon-change {
-    width: 22px;
-    height: 22px;
-    border: none;
-    outline: none;
-    float: left;
-    margin-right: 8px;
-    display: inline-block;
-}
-
-/* 停用 */
-.icon-disable {
-    background-image: url(image/disableIcon.png);
-}
-
-input.icon-disable {
-    width: 22px;
-    height: 22px;
-    border: none;
-    outline: none;
-    float: left;
-    margin-right: 8px;
-    display: inline-block;
-}
-
-/* 启用 */
-.icon-enable {
-    background-image: url(image/icon-enable.png);
-}
-
-input.icon-enable {
-    width: 22px;
-    height: 22px;
-    border: none;
-    outline: none;
-    float: left;
-    margin-right: 8px;
-    display: inline-block;
-}
-
-/*数量*/
-.icon-num {
-    display: inline-block;
-    height: 19px;
-    line-height: 19px;
-    font-size: 14px;
-    color: #6c9ed7;
-    background-color: #fff;
-    padding: 0px 5px;
-    border: 1px solid #6c9ed7;
-    vertical-align: middle;
-}
-
-/* 总数超过9的图标 */
-.icon-fullNum {
-    height: 19px;
-    width: 19px;
-    box-sizing: border-box;
-    border: 1px solid #6c9ed7;
-    background: url(image/icon-num-9p.png) center center;
-    background-color: #fff;
-    background-color: #6c9ed7;
-}
-
-/*objectpicker不可输入时下拉图标*/
-.icon-down {
-    display: inline-block;
-    vertical-align: middle;
-    width: 26px;
-    height: 26px;
-    background: url(image/dialog-select-icon.png) center center no-repeat;
-    /* border: 1px solid rgb(195 199 203); */
-    position: absolute;
-    right: 2px;
-    border-radius: 2px;
-    box-shadow: none;
-    /* top: 8px; */
-    /* transform: translateY(-50%); */
-}
-
-/*objectpicker可输入时下拉图标*/
-.smallButton.icon-down {
-    position: absolute;
-    right: -1px;
-    top: -1px;
-    background-image: url(image/svg_icon/xiangxiajiantou.svg);
-    background-position: center !important;
-    background-size: 80%;
-    border-radius: 2px;
-    border: 1px solid rgb(195 199 203);
-}
-
-.smallButton.icon-down:hover {
-    background-color: #393d51;
-    background-image: url(image/svg_icon/xiangxiajiantou.svg);
-}
-
-.smallButton.icon-down:active {
-    background-color: rgb(0 0 0);
-    background-image: url(image/svg_icon/xiangxiajiantou.svg);
-}
-
-/*实心闭合文件夹icon*/
-.icon-fullFolder {
-    display: inline-block;
-    width: 22px;
-    height: 40px;
-    background: url(image/list-fullGroupIcon.png) center calc(50% - 2px) no-repeat;
-    color: #333;
-    font-size: 0px;
-    text-align: center;
-    line-height: 40px;
-    vertical-align: middle;
-    float: left;
-    margin-right: 6px;
-    cursor: url(image/cursor-click.ico), default;
-}
-
-.icon-fullFolder:hover {
-    background: url(image/list-fullGroupIcon-hover.png) center calc(50% - 2px) no-repeat;
-    color: #fff;
-}
-
-.icon-fullFolder:active {
-    color: #fff;
-    background: url(image/list-fullGroupIcon-active.png) center calc(50% - 2px) no-repeat;
-}
-
-.icon-fullFolder a {
-    color: #333;
-    vertical-align: middle;
-    display: inline-block;
-    width: 100%;
-    height: 100%;
-    cursor: url(image/cursor-click.ico), default;
-    line-height: inherit;
-}
-
-.icon-fullFolder:hover a {
-    color: #fff;
-}
-
-.icon-fullFolder:active a {
-    color: #fff;
-}
-
-/*实心展开文件夹icon*/
-.icon-openFullFolder {
-    display: inline-block;
-    width: 22px;
-    height: 40px;
-    background: url(image/list-expandedFullGroupIcon.png) center calc(50% - 2px) no-repeat;
-    color: #333;
-    font-size: 0px;
-    text-align: center;
-    vertical-align: middle;
-    float: left;
-    margin-right: 6px;
-    cursor: url(image/cursor-click.ico), default;
-    line-height: 40px;
-}
-
-.icon-openFullFolder:hover {
-    background: url(image/list-expandedFullGroupIcon-hover.png) center calc(50% - 2px) no-repeat;
-    color: #fff;
-}
-
-.icon-openFullFolder:active {
-    color: #fff;
-    background: url(image/list-expandedFullGroupIcon-active.png) center calc(50% - 2px) no-repeat;
-}
-
-.icon-openFullFolder a {
-    color: #333;
-    vertical-align: middle;
-    display: inline-block;
-    width: 100%;
-    height: 40px;
-    cursor: url(image/cursor-click.ico), default;
-    line-height: inherit;
-}
-
-.icon-openFullFolder:hover a {
-    color: #fff;
-}
-
-.icon-openFullFolder:active a {
-    color: #fff;
-}
-
-/*闭合文件夹icon*/
-.icon-folder {
-    display: inline-block;
-    width: 22px;
-    height: 40px;
-    background: url(image/svg_icon/folderShare.svg) center calc(50% - 2px) no-repeat;
-    color: #333;
-    font-size: 13px;
-    text-align: center;
-    line-height: 40px;
-    vertical-align: middle;
-    float: left;
-    margin-right: 6px;
-    letter-spacing: 0.5px;
-    cursor: url(image/cur.ico), default !important;
-}
-
-/* .icon-folder:hover {
-    background: url(image/list-groupIcon-hover.png) center calc(50% - 2px) no-repeat;
-    color: #fff;
-}
-
-.icon-folder:active {
-    color: #fff;
-    background: url(image/list-groupIcon-active.png) center calc(50% - 2px) no-repeat;
-} */
-
-.icon-folder a {
-    color: #fff;
-    vertical-align: middle;
-    display: inline-block;
-    width: 100%;
-    height: 100%;
-    line-height: inherit;
-    cursor: url(image/cur.ico), default !important;
-}
-
-.icon-folder:hover a {
-    color: #fff;
-}
-
-.icon-folder:active a {
-    color: #fff;
-}
-
-/*展开文件夹icon*/
-.icon-openFolder {
-    font-size: 13px;
-    letter-spacing: 0.5px;
-    color: #fff;
-    display: inline-block;
-    width: 22px;
-    height: 40px;
-    background: url(image/svg_icon/olderOpen.svg) center calc(50% - 2px) no-repeat;
-    text-align: center;
-    line-height: inherit;
-    vertical-align: middle;
-    float: left;
-    margin-right: 6px;
-    cursor: url(image/cur.ico), default !important;
-}
-
-/* .icon-openFolder:hover {
-    color: #fff;
-    background: url(image/list-expandedGroupIcon-hover.png) center calc(50% - 2px) no-repeat;
-}
-
-.icon-openFolder:active {
-    color: #fff;
-    background: url(image/list-expandedGroupIcon-active.png) center calc(50% - 2px) no-repeat;
-} */
-
-.icon-openFolder a {
-    color: #fff;
-    font-size: 12px;
-    vertical-align: middle;
-    display: inline-block;
-    width: 100%;
-    height: 100%;
-    line-height: inherit;
-    cursor: url(image/cur.ico), default !important;
-}
-
-.icon-openFolder:hover a {
-    color: #fff;
-}
-
-.icon-openFolder:active a {
-    color: #fff;
-}
-
-/*子文件icon*/
-.icon-point {
-    display: inline-block;
-    width: 22px;
-    height: 40px;
-    vertical-align: middle;
-    /* background: url(image/list-itemIcon.png) right center no-repeat; */
-    float: left;
-    margin-right: 6px;
-    cursor: url(image/cur.ico), default !important;
-    position: relative;
-}
-
-.icon-point::after {
-    content: '';
-    width: 6px;
-    height: 6px;
-    border-radius: 50%;
-    background-color: #666;
-    display: block;
-    position: absolute;
-    top: 50%;
-    transform: translateY(-50%);
-    right: 0;
-}
-
-/*单文件icon*/
-.icon-doc {
-    width: 22px;
-    height: 40px;
-    display: inline-block;
-    vertical-align: middle;
-    background: url(image/list-icon.png) center center no-repeat;
-    float: left;
-    margin-right: 6px;
-    cursor: url(image/cur.ico), default !important;
-}
-
-/*草稿单文件*/
-.icon-writingDoc {
-    width: 22px;
-    /* height:40px; */
-    height: 100%;
-    display: inline-block;
-    vertical-align: middle;
-    background: url(image/icon-writingDoc.png) center center no-repeat;
-    float: left;
-    margin-right: 6px;
-    cursor: url(image/cur.ico), default !important;
-}
-
-.icon-writingDoc:hover {
-    background: url(image/icon-writingDoc-hover.png) center center no-repeat;
-}
-
-.icon-writingDoc:active {
-    background: url(image/icon-writingDoc-active.png) center center no-repeat;
-}
-
-/*代理icon*/
-.icon-proxy {
-    width: 22px;
-    height: 40px;
-    display: inline-block;
-    vertical-align: middle;
-    background: url(image/icon-proxy.png) center center no-repeat;
-    float: left;
-    margin-right: 6px;
-    cursor: url(image/cur.ico), default !important;
-}
-
-/*带下划线的附件*/
-.underlineIcon-attachment {
-    width: 25px;
-    height: 40px;
-    border: none;
-    outline: none;
-    background: url(image/underlineIcon-attachment.png) center center no-repeat;
-}
-
-.toolbar-button.underlineIcon-attachment:hover {
-    background-image: url(image/underlineIcon-attachment-hover.png);
-}
-
-.toolbar-button.underlineIcon-attachment:active {
-    background-image: url(image/underlineIcon-attachment-hover.png);
-}
-
-/*带下划线的媒体*/
-.underlineIcon-media {
-    width: 25px;
-    height: 40px;
-    border: none;
-    outline: none;
-    background: url(image/icon-image.png) center center no-repeat;
-}
-
-/* 转换 */
-.icon-translate {
-    width: 22px;
-    height: 40px;
-    display: inline-block;
-    vertical-align: middle;
-    background: url(image/icon-translate.png) center center no-repeat;
-    float: left;
-    margin-right: 6px;
-}
-
-/* 关闭按钮 */
-.icon-close {
-    display: inline-block;
-    width: 15px;
-    height: 15px;
-    background: url(image/svg_icon/guanbi.svg) center center no-repeat;
-    position: absolute;
-    top: 9px;
-    right: 10px;
-}
-
-/* 复制帮助代码按钮 */
-.icon-key {
-    display: inline-block;
-    width: 15px;
-    height: 15px;
-    background: url(image/help-keyButton.png) center center no-repeat;
-    /* position: absolute;*/
-    /* right: 45px;*/
-    top: 9px;
-}
-
-/*退格图标*/
-.icon-backspace {
-    background-image: url(image/icon-backspace.png);
-}
-
-.icon-backspace:hover {
-    background-image: url(image/icon-backspace-hover.png);
-}
-
-.icon-backspace:active {
-    background-image: url(image/icon-backspace-hover.png);
-}
-
-/* 选项卡灰色圆点 */
-.icon-dimPoint {
-    display: inline-block;
-    width: 6px;
-    height: 6px;
-    background-color: #acacac;
-    border-radius: 50%;
-    float: right;
-    margin-right: -20px;
-    margin-top: 4px;
-}
-
-/* 选项卡高亮圆点 */
-.icon-highlightPoint {
-    display: inline-block;
-    width: 6px;
-    height: 6px;
-    background-color: #fa8c00;
-    border-radius: 50%;
-    float: right;
-    margin-right: -22px;
-    margin-top: 3px;
-}
-
-/* 撤销 */
-.icon-undo {
-    background-image: url(image/icon-undo.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-undo:hover {
-    background-image: url(image/icon-undo-hover.png);
-}
-
-.icon-undo:active {
-    background-image: url(image/icon-undo-hover.png);
-}
-
-/* 重做 */
-.icon-redo {
-    background-image: url(image/icon-redo.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-redo:hover {
-    background-image: url(image/icon-redo-hover.png);
-}
-
-.icon-redo:active {
-    background-image: url(image/icon-redo-hover.png);
-}
-
-/* 加粗 */
-.icon-bold {
-    background-image: url(image/icon-bold.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-bold:hover {
-    background-image: url(image/icon-bold-hover.png);
-}
-
-.icon-bold:active {
-    background-image: url(image/icon-bold-hover.png);
-}
-
-/* 颜色 */
-.icon-color {
-    background-image: url(image/icon-color.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-/* 插入图片 */
-.icon-image {
-    background-image: url(image/icon-image.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-image:hover {
-    background-image: url(image/icon-image-hover.png);
-}
-
-.icon-image:active {
-    background-image: url(image/icon-image-hover.png);
-}
-
-/* 插入表格 */
-.icon-table {
-    background-image: url(image/icon-table.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-table:hover {
-    background-image: url(image/icon-table-hover.png);
-}
-
-.icon-table:active {
-    background-image: url(image/icon-table-hover.png);
-}
-
-/* 插入分隔线 */
-.icon-hLine {
-    background-image: url(image/icon-hLine.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-hLine:hover {
-    background-image: url(image/icon-hLine-hover.png);
-}
-
-.icon-hLine:active {
-    background-image: url(image/icon-hLine-hover.png);
-}
-
-/* 查找 */
-.icon-search {
-    background-image: url(image/icon-search1.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-search:hover {
-    background-image: url(image/icon-search-hover.png);
-}
-
-.icon-search:active {
-    background-image: url(image/icon-search-hover.png);
-}
-
-/* 下划线 */
-.icon-underline {
-    background-image: url(image/icon-underline.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-underline:hover {
-    background-image: url(image/icon-underline-hover.png);
-}
-
-.icon-underline:active {
-    background-image: url(image/icon-underline-hover.png);
-}
-
-/* 更多 */
-.icon-more {
-    background-image: url(image/icon-more.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-more:hover {
-    background-image: url(image/icon-more-hover.png);
-}
-
-.icon-more:active {
-    background-image: url(image/icon-more-hover.png);
-}
-
-/* 斜体 */
-.icon-italic {
-    background-image: url(image/icon-italic.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-italic:hover {
-    background-image: url(image/icon-italic-hover.png);
-}
-
-.icon-italic:active {
-    background-image: url(image/icon-italic-hover.png);
-}
-
-/* 删除线 */
-.icon-strikethrough {
-    background-image: url(image/icon-strikethrough.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-strikethrough:hover {
-    background-image: url(image/icon-strikethrough-hover.png);
-}
-
-.icon-strikethrough:active {
-    background-image: url(image/icon-strikethrough-hover.png);
-}
-
-/* 上标 */
-.icon-superScript {
-    background-image: url(image/icon-superScript.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-superScript:hover {
-    background-image: url(image/icon-superScript-hover.png);
-}
-
-.icon-superScript:active {
-    background-image: url(image/icon-superScript-hover.png);
-}
-
-/* 下标 */
-.icon-subScript {
-    background-image: url(image/icon-subScript.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-subScript:hover {
-    background-image: url(image/icon-subScript-hover.png);
-}
-
-.icon-subScript:active {
-    background-image: url(image/icon-subScript-hover.png);
-}
-
-/* 居左 */
-.icon-justifyLeft {
-    background-image: url(image/icon-justifyLeft.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-justifyLeft:hover {
-    background-image: url(image/icon-justifyLeft-hover.png);
-}
-
-.icon-justifyLeft:active {
-    background-image: url(image/icon-justifyLeft-hover.png);
-}
-
-.toolbar-button-selected.icon-justifyLeft {
-    background-image: url(image/icon-justifyLeft-hover.png);
-}
-
-/* 右对齐 */
-.icon-justifyRight {
-    background-image: url(image/icon-justifyRight.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-justifyRight:hover {
-    background-image: url(image/icon-justifyRight-hover.png);
-}
-
-.icon-justifyRight:active {
-    background-image: url(image/icon-justifyRight-hover.png);
-}
-
-.toolbar-button-selected.icon-justifyRight {
-    background-image: url(image/icon-justifyRight-hover.png);
-}
-
-/* 居中 */
-.icon-justifyCenter {
-    background-image: url(image/icon-justifyCenter.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-justifyCenter:hover {
-    background-image: url(image/icon-justifyCenter-hover.png);
-}
-
-.icon-justifyCenter:active {
-    background-image: url(image/icon-justifyCenter-hover.png);
-}
-
-.toolbar-button-selected.icon-justifyCenter {
-    background-image: url(image/icon-justifyCenter-hover.png);
-}
-
-/* 首行缩进 */
-.icon-indent {
-    background-image: url(image/icon-indent.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-indent:hover {
-    background-image: url(image/icon-indent-hover.png);
-}
-
-.icon-indent:active {
-    background-image: url(image/icon-indent-hover.png);
-}
-
-/* 段前距 */
-.icon-rowSpacingTop {
-    background-image: url(image/icon-rowSpacingTop.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-rowSpacingTop:hover {
-    background-image: url(image/icon-rowSpacingTop-hover.png);
-}
-
-.icon-rowSpacingTop:active {
-    background-image: url(image/icon-rowSpacingTop-hover.png);
-}
-
-/* 段后距 */
-.icon-rowSpacingBottom {
-    background-image: url(image/icon-rowSpacingBottom.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-rowSpacingBottom:hover {
-    background-image: url(image/icon-rowSpacingBottom-hover.png);
-}
-
-.icon-rowSpacingBottom:active {
-    background-image: url(image/icon-rowSpacingBottom-hover.png);
-}
-
-/* 行间距 */
-.icon-lineHeight {
-    background-image: url(image/icon-lineHeight.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-lineHeight:hover {
-    background-image: url(image/icon-lineHeight-hover.png);
-}
-
-.icon-lineHeight:active {
-    background-image: url(image/icon-lineHeight-hover.png);
-}
-
-/* 地图 */
-.icon-map {
-    background-image: url(image/icon-map.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-map:hover {
-    background-image: url(image/icon-map-hover.png);
-}
-
-.icon-map:active {
-    background-image: url(image/icon-map-hover.png);
-}
-
-/* 插入word */
-.icon-word {
-    background-image: url(image/icon-word.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-word:hover {
-    background-image: url(image/icon-word-hover.png);
-}
-
-.icon-word:active {
-    background-image: url(image/icon-word-hover.png);
-}
-
-/* 插入excel */
-.icon-excel {
-    background-image: url(image/icon-excel.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-excel:hover {
-    background-image: url(image/icon-excel-hover.png);
-}
-
-.icon-excel:active {
-    background-image: url(image/icon-excel-hover.png);
-}
-
-/* 快捷图标 */
-.icon-shortcut {
-    background-image: url(image/icon-shortcut.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-shortcut:hover {
-    background-image: url(image/icon-shortcut-hover.png);
-}
-
-.icon-shortcut:active {
-    background-image: url(image/icon-shortcut-hover.png);
-}
-
-/* 超链接 */
-.icon-link {
-    background-image: url(image/icon-link.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-link:hover {
-    background-image: url(image/icon-link-hover.png);
-}
-
-.icon-link:active {
-    background-image: url(image/icon-link-hover.png);
-}
-
-.icon-backColor {
-    background-image: url(image/icon-backgroundColor.png);
-}
-
-/* 全部往右移 */
-.icon-allRight {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/rightYi1.png) center center no-repeat;
-    position: absolute;
-    left: 50%;
-    top: 10px;
-}
-
-.icon-allRight:hover {
-    background: url(image/rightYi3.png) center center no-repeat;
-}
-
-.icon-allRight:active {
-    background: url(image/rightYi3.png) center center no-repeat;
-}
-
-/* 全部往左移 */
-.icon-allLeft {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/leftYi1.png) center center no-repeat;
-    position: absolute;
-    left: 50%;
-    top: 10px;
-}
-
-.icon-allLeft:hover {
-    background: url(image/leftYi3.png) center center no-repeat;
-}
-
-.icon-allLeft:active {
-    background: url(image/leftYi3.png) center center no-repeat;
-}
-
-/* 播放按钮 */
-.icon-play {
-    background: url(image/play-button.png) center center no-repeat;
-}
-
-.icon-play:hover {
-    background: url(image/play-button-hover.png) center center no-repeat;
-}
-
-/* 暂停按钮 */
-.icon-pause {
-    background: url(image/pause-button.png) center center no-repeat;
-}
-
-.icon-pause:hover {
-    background: url(image/pause-button-hover.png) center center no-repeat;
-}
-
-/*批示录入框中的喇叭图标*/
-.icon-voiceMsg {
-    display: inline-block;
-    width: 110px;
-    height: 40px;
-    background: url(image/mobileIcon-voiceMsg.png) center center no-repeat;
-    box-sizing: border-box;
-    margin-top: 5px;
-    margin-bottom: 5px;
-}
-
-/*批示录入框中的播放录音图标*/
-.icon-playVoice {
-    display: inline-block;
-    background: url(image/mobileIcon-playVoice.gif) center center no-repeat;
-    box-sizing: border-box;
-    border: none;
-    width: 110px;
-    height: 40px;
-}
-
-/*批示录入框中的播放录音图标*/
-.icon-pauseVoice {
-    display: inline-block;
-    background: url(image/stop-msg.png) center center no-repeat;
-    box-sizing: border-box;
-    width: 110px;
-    height: 40px;
-    background-size: 40px 40px;
-}
-
-.icon-copy {
-    width: 22px;
-    height: 22px;
-    box-sizing: border-box;
-    z-index: 99999;
-    background: url(image/smallButton-timechecked.png) center center no-repeat;
-}
-
-/* 切换一二次登录页图标 */
-.icon-replace {
-    background: url('image/svg_icon/qiehuanyonghu.svg');
-}
-
-/*登录页用户名图标*/
-.icon-user {
-    color: #fff;
-    background: url("image/svg_icon/yonghuming.svg") no-repeat #575D6D;
-
-}
-
-
-/*登录页密码图标 */
-.icon-password {
-    color: #fff;
-    background: url("image/svg_icon/mima.svg") no-repeat #575D6D;
-}
-
-/*登录页验证码图标*/
-.icon-captcha {
-    color: #fff;
-    background: url("image/svg_icon/yanzhengma.svg") no-repeat #575D6D;
-}
-
-/*登录页锁屏时间图标*/
-.icon-timer {
-    color: #fff;
-    background: url("image/svg_icon/shijian.svg") no-repeat #575D6D;
-}
-
-/*密码框小眼睛*/
-/* .icon-eye {
-    background-image: url("image/ksmm.png");
-    background-size: 100%;
-}
-
-.icon-eye:hover {
-    background-image: url("image/ksmm-hover.png");
-    background-size: 100%;
-} */
-
-/*按钮左边的小手机图标*/
-.icon-mobile {
-    background-image: url(image/bottom-buttonIcon.png);
-    background-position: 10px 5px;
-    background-repeat: no-repeat;
-    padding: 0px 10px;
-    text-indent: 25px;
-}
-
-.icon-mobile:hover {
-    background-image: url(image/bottom-buttonIcon-hover.png);
-}
-
-/*按钮左边的二维码扫码图标*/
-.icon-qrcode {
-    background: url('image/svg_icon/yaoyiyaocu.svg') no-repeat 30px center;
-    background-size: 15%;
-    padding-left: 40px;
-    /* 给图标预留空间 */
-    letter-spacing: unset !important;
-}
-
-.icon-qrcode:hover {
-    background: url('image/svg_icon/yaoyiyaocu_hover.svg') no-repeat 30px center #575D6D;
-    background-size: 15%;
-    padding-left: 40px;
-    /* 给图标预留空间 */
-    letter-spacing: unset !important;
-}
-
-/* 登录按钮的图标 */
-.icon-login {
-    background: url('image/svg_icon/denglu.svg') no-repeat 45px center;
-    background-size: 10%;
-    text-indent: 20px;
-    padding: 0px 25px;
-    padding-left: 40px;
-    /* 给图标预留空间 */
-    letter-spacing: unset !important;
-}
-
-.icon-login:hover {
-    background: url('image/svg_icon/denglu_hover.svg') no-repeat 45px center #575D6D;
-    background-size: 10%;
-    text-indent: 20px;
-    padding: 0px 25px;
-    padding-left: 40px;
-    /* 给图标预留空间 */
-}
-
-/*锁屏页倒计时按钮*/
-.icon-countdownButton {
-    color: #fff;
-    background: #3e5d7c;
-}
-
-/*锁屏页评论图标*/
-.icon-forum {
-    background: url(image/icon_comment.png);
-}
-
-/*锁屏页点赞图标*/
-.icon-like {
-    background: url(image/icon-like-alt.png);
-}
-
-.icon-like:active {
-    background: url(image/icon_like_alt-red.png);
-}
-
-/*锁屏页i图标*/
-.icon-info {
-    background: url(image/icon-error-circle-alt.png);
-}
-
-.icon-setHelpButton {
-    display: none;
-    width: 36px;
-    height: 36px;
-    background: url(image/home-plugin-editWdHelpButton.png) center center no-repeat;
-    background-size: 24px;
-}
-
-.icon-setHelpButton:hover {
-    background: #383d50 url(image/home-plugin-editWdHelpButton.png) center center no-repeat;
-    background-size: 24px;
-    border-radius: 4px;
-}
-
-.icon-setHelpButton:active {
-    background: #000 url(image/home-plugin-editWdHelpButton.png) center center no-repeat;
-    background-size: 24px;
-    border-radius: 4px;
-}
-
-.icon-helpButton {
-    display: none;
-    width: 22px;
-    height: 22px;
-    background: url(image/home-plugin-WdHelpButton.png) center center no-repeat;
-}
-
-.icon-helpButton:hover {
-    background: url(image/home-plugin-WdHelpButton-hover.png) center center no-repeat;
-}
-
-.icon-helpButton:active {
-    background: url(image/home-plugin-WdHelpButton-active.png) center center no-repeat;
-}
-
-.hugeIcon-help {
-    width: 42px;
-    height: 42px;
-    background: url(image/download-document.png) center center no-repeat;
-    background-size: 100% 100%;
-}
-
-/*变动按钮*/
-.icon-change {
-    float: right;
-    background-image: url(image/list-change-button.png);
-}
-
-.icon-change:hover {
-    background-image: url(image/icon-change-hover.png);
-}
-
-.icon-change-hover {
-    width: 22px;
-    height: 22px;
-    background-image: url(image/icon-change-hover.png);
-    border: none;
-    outline: none;
-    display: inline-block;
-}
-
-.button.icon-change:hover {
-    background-image: url(image/list-change-button-hover.png);
-}
-
-.button.icon-change:active {
-    background-image: url(image/list-change-button-hover.png);
-}
-
-.toolbar-button.icon-change:hover {
-    background-image: url(image/list-change-button-hover.png);
-}
-
-.toolbar-button.icon-change:active {
-    background-image: url(image/list-change-button-hover.png);
-}
-
-/*  办理按钮图标 */
-.icon-do {
-    background-image: url(image/icon-do.png);
-    /* width: 22px;
-	height: 22px; */
-    border: none;
-    outline: none;
-    float: right;
-    margin-right: 8px;
-    display: inline-block;
-}
-
-.icon-do:hover {
-    background-image: url(image/icon-do-hover.png);
-}
-
-.icon-do:active {
-    background-image: url(image/icon-do-hover.png);
-}
-
-/*启用按钮*/
-.icon-enable {
-    background-image: url(image/button-enable.png);
-    float: right;
-}
-
-.button.icon-enable:hover {
-    background-image: url(image/button-enable-hover.png);
-}
-
-.button.icon-enable:active {
-    background-image: url(image/button-enable-hover.png);
-}
-
-/*改稿按钮*/
-.icon-revise {
-    background-image: url(image/button-rewrite.png);
-    float: right;
-}
-
-.button.icon-revise:hover {
-    background-image: url(image/button-rewrite-hover.png);
-}
-
-.button.icon-revise:active {
-    background-image: url(image/button-rewrite-hover.png);
-}
-
-/*原由按钮*/
-.icon-reason {
-    background-image: url(image/list-reasonButton.png);
-    float: right;
-}
-
-.button.icon-reason:hover {
-    background-image: url(image/list-reasonButton-hover.png);
-}
-
-.button.icon-reason:active {
-    background-image: url(image/list-reasonButton-hover.png);
-}
-
-/*报名按钮*/
-.icon-register {
-    background-image: url("image/icon-register.png");
-    float: right;
-}
-
-.button.icon-register:hover {
-    background-image: url("image/icon-register-hover.png");
-}
-
-.button.icon-register:active {
-    background-image: url("image/icon-register-hover.png");
-}
-
-.icon-vLine-dashed {
-    display: block;
-    min-height: 30px !important;
-    background: url(image/icon-vLine-dashed.png) -3px top repeat-y !important;
-}
-
-.icon-TLine-dashed {
-    display: inline-block !important;
-    width: 22px !important;
-    height: 30px !important;
-    background: url(image/icon-TLine-dashed.png) left center no-repeat !important;
-    /* background-color: #fff !important;*/
-}
-
-.icon-LLine-dashed {
-    display: inline-block !important;
-    width: 22px !important;
-    height: 30px !important;
-    background: url(image/icon-LLine-dashed.png) left center no-repeat !important;
-    /* background-color: #fff !important;*/
-}
-
-/*已打钩*/
-.icon-checked {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-checked.png) center center no-repeat;
-}
-
-.icon-checked:hover {
-    background: url(image/icon-checked-hover.png) center center no-repeat !important;
-}
-
-/*未钩*/
-.icon-unchecked {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-unchecked.png) center center no-repeat;
-}
-
-.icon-unchecked:hover {
-    background: url(image/icon-unchecked-hover.png) center center no-repeat !important;
-}
-
-.list .icon-unchecked {
-    background: none;
-}
-
-.list:hover .icon-unchecked {
-    background: url(image/icon-unchecked.png) center center no-repeat;
-}
-
-.cardList-div .icon-unchecked {
-    background: none;
-}
-
-.cardList-div:hover .icon-unchecked {
-    background: url(image/icon-unchecked.png) center center no-repeat;
-}
-
-.iconList-div .icon-unchecked {
-    background: none;
-}
-
-.iconList-div:hover .icon-unchecked {
-    background: url(image/icon-unchecked.png) center center no-repeat;
-}
-
-
-/* 截图功能放大按钮 */
-.icon-zoomIn {
-    background-image: url(image/icon-zoomIn.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-zoomIn:hover {
-    background-image: url(image/icon-zoomIn-hover.png);
-}
-
-.icon-zoomIn:active {
-    background-image: url(image/icon-zoomIn-hover.png);
-}
-
-.disableIcon-zoomIn {
-    background-image: url(image/disableIcon-zoomIn.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-/* 截图功能缩小按钮 */
-.icon-zoomOut {
-    background-image: url(image/icon-zoomOut.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-zoomOut:hover {
-    background-image: url(image/icon-zoomOut-hover.png);
-}
-
-.icon-zoomOut:active {
-    background-image: url(image/icon-zoomOut-hover.png);
-}
-
-/* 截图功能顺时针选择按钮 */
-.icon-rightRotation {
-    background-image: url(image/icon-rightRotation.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-rightRotation:hover {
-    background-image: url(image/icon-rightRotation-hover.png);
-}
-
-.icon-rightRotation:active {
-    background-image: url(image/icon-rightRotation-hover.png);
-}
-
-/* 截图功能逆时针旋转按钮 */
-.icon-leftRotation {
-    background-image: url(image/icon--leftRotation.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-leftRotation:hover {
-    background-image: url(image/icon--leftRotation-hover.png);
-}
-
-.icon-leftRotation:active {
-    background-image: url(image/icon--leftRotation-hover.png);
-}
-
-/*编辑选项卡按钮*/
-.icon-set {
-    display: inline-block;
-    width: 36px;
-    height: 36px;
-
-    background: url(image/svg_icon/shezhi.svg) center center no-repeat;
-    background-size: 24px;
-}
-
-.icon-set:hover {
-    background: #383d50 url(image/svg_icon/shezhi.svg) center center no-repeat;
-    background-size: 24px;
-    border-radius: 4px;
-}
-
-.icon-set:active {
-    background: #000 url(image/svg_icon/shezhi.svg) center center no-repeat;
-    background-size: 24px;
-    border-radius: 4px;
-}
-
-/* 打钩按钮 */
-.invertIcon-save {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background-image: url(image/icon-ok.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.invertIcon-save:hover {
-    background-image: url(image/icon-ok-hover.png);
-}
-
-.invertIcon-save:active {
-    background-image: url(image/icon-ok-hover.png);
-}
-
-/* 收藏按钮 */
-.icon-favorite {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-favorite.png) center center no-repeat;
-}
-
-.icon-favorite:hover {
-    background: url(image/icon-favorite-hover.png) center center no-repeat;
-}
-
-.icon-favorite:active {
-    background: url(image/icon-favorite-active.png) center center no-repeat;
-}
-
-/* 帮助按钮 */
-.icon-help {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-help.png) center center no-repeat;
-}
-
-.icon-help:hover {
-    background: url(image/icon-help-hover.png) center center no-repeat;
-}
-
-.icon-help:active {
-    background: url(image/icon-help-active.png) center center no-repeat;
-}
-
-/* 下载按钮 */
-.icon-download {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-download.png) center center no-repeat;
-}
-
-.icon-download:hover {
-    background: url(image/icon-download-hover.png) center center no-repeat;
-}
-
-.icon-download:active {
-    background: url(image/icon-download-active.png) center center no-repeat;
-}
-
-/* 锁定按钮 */
-.icon-lock {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-lock.png) center center no-repeat;
-}
-
-.icon-lock:hover {
-    background: url(image/icon-lock-hover.png) center center no-repeat;
-}
-
-.icon-lock:active {
-    background: url(image/icon-lock-active.png) center center no-repeat;
-}
-
-/* 编辑个人选值按钮 */
-.icon-setValue {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-setValue.png) center center no-repeat;
-}
-
-.icon-setValue:hover {
-    background: url(image/icon-setValue-hover.png) center center no-repeat;
-}
-
-.icon-setValue:active {
-    background: url(image/icon-setValue-active.png) center center no-repeat;
-}
-
-/* 编辑帮助按钮 */
-.icon-editHelp {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-setHelp.png) center center no-repeat;
-}
-
-.icon-editHelp:hover {
-    background: url(image/icon-setHelp-hover.png) center center no-repeat;
-}
-
-.icon-editHelp:active {
-    background: url(image/icon-setHelp-active.png) center center no-repeat;
-}
-
-/* (内容)属性按钮 */
-.icon-property {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-property.png) center center no-repeat;
-}
-
-.icon-property:hover {
-    background: url(image/icon-property-hover.png) center center no-repeat;
-}
-
-.icon-property:active {
-    background: url(image/icon-property-active.png) center center no-repeat;
-}
-
-/* 变动查看-关按钮 */
-.icon-history {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-history.png) center center no-repeat;
-}
-
-.icon-history:hover {
-    background: url(image/icon-history-hover.png) center center no-repeat;
-}
-
-.icon-history:active {
-    background: url(image/icon-history-active.png) center center no-repeat;
-}
-
-/* 变动查看-开按钮 */
-.icon-historyOn {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-historyOn.png) center center no-repeat;
-}
-
-.icon-historyOn:hover {
-    background: url(image/icon-historyOn-hover.png) center center no-repeat;
-}
-
-.icon-historyOn:active {
-    background: url(image/icon-historyOn-active.png) center center no-repeat;
-}
-
-/* 已收藏按钮 */
-.icon-favoriteOn {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-favoriteOn.png) center center no-repeat;
-}
-
-.icon-favoriteOn:hover {
-    background: url(image/icon-favoriteOn-hover.png) center center no-repeat;
-}
-
-.icon-favoriteOn:active {
-    background: url(image/icon-favoriteOn-active.png) center center no-repeat;
-}
-
-/* 已收藏按钮 */
-.largeIcon-close {
-    display: inline-block;
-    width: 32px;
-    height: 32px;
-    background: url(image/largeIcon-close.png) center 2px no-repeat;
-}
-
-.largeIcon-close:hover {
-    background: url(image/largeIcon-close-hover.png) center 2px no-repeat;
-}
-
-.largeIcon-close:active {
-    background: url(image/largeIcon-close-active.png) center 2px no-repeat;
-}
-
-/* 全屏按钮 */
-.icon-fullscreen {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-fullscreen.png) center center no-repeat;
-}
-
-.icon-fullscreen:hover {
-    background: url(image/icon-fullscreen-hover.png) center center no-repeat;
-}
-
-.icon-fullscreen:active {
-    background: url(image/icon-fullscreen-active.png) center center no-repeat;
-}
-
-/* 退出全屏按钮 */
-.icon-restore {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-restore.png) center center no-repeat;
-}
-
-.icon-restore:hover {
-    background: url(image/icon-restore-hover.png) center center no-repeat;
-}
-
-.icon-restore:active {
-    background: url(image/icon-restore-active.png) center center no-repeat;
-}
-
-/* 退出全屏按钮(大) */
-.largeIcon-restore {
-    display: inline-block;
-    width: 42px;
-    height: 42px;
-    background: url(image/largeIcon-restore.png) center center no-repeat;
-}
-
-.largeIcon-restore:hover {
-    background: url(image/largeIcon-restore-hover.png) center center no-repeat;
-}
-
-.largeIcon-restore:active {
-    background: url(image/largeIcon-restore-active.png) center center no-repeat;
-}
-
-/*删除表格*/
-.icon-deleteTable {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-deleteTable.png) center center no-repeat;
-}
-
-.icon-deleteTable:hover {
-    background-image: url(image/icon-deleteTable-hover.png);
-}
-
-.icon-deleteTable:active {
-    background-image: url(image/icon-deleteTable-hover.png);
-}
-
-/*插入行*/
-.icon-insertRow {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-insertRow.png) center center no-repeat;
-    padding: 0px;
-    margin-right: 3px;
-}
-
-.icon-insertRow:hover {
-    background-image: url(image/icon-insertRow-hover.png);
-}
-
-.icon-insertRow:active {
-    background-image: url(image/icon-insertRow-hover.png);
-}
-
-/*插入列*/
-.icon-insertCol {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-insertCol.png) center center no-repeat;
-    padding: 0px;
-    margin-right: 3px;
-}
-
-.icon-insertCol:hover {
-    background-image: url(image/icon-insertCol-hover.png);
-}
-
-.icon-insertCol:active {
-    background-image: url(image/icon-insertCol-hover.png);
-}
-
-/*删除行*/
-.icon-deleteRow {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-deleteRow.png) center center no-repeat;
-    padding: 0px;
-    margin-right: 3px;
-}
-
-.icon-deleteRow:hover {
-    background-image: url(image/icon-deleteRow-hover.png);
-}
-
-.icon-deleteRow:active {
-    background-image: url(image/icon-deleteRow-hover.png);
-}
-
-/*删除列*/
-.icon-deleteCol {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-deleteCol.png) center center no-repeat;
-    padding: 0px;
-    margin-right: 3px;
-}
-
-.icon-deleteCol:hover {
-    background-image: url(image/icon-deleteCol-hover.png);
-}
-
-.icon-deleteCol:active {
-    background-image: url(image/icon-deleteCol-hover.png);
-}
-
-/*右合并*/
-.icon-mergeRight {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-mergeRight.png) center center no-repeat;
-    padding: 0px;
-    margin-right: 3px;
-}
-
-.icon-mergeRight:hover {
-    background-image: url(image/icon-mergeRight-hover.png);
-}
-
-.icon-mergeRight:active {
-    background-image: url(image/icon-mergeRight-hover.png);
-}
-
-/*向下合并*/
-.icon-mergeDown {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-mergeDown.png) center center no-repeat;
-    padding: 0px;
-    margin-right: 3px;
-}
-
-.icon-mergeDown:hover {
-    background-image: url(image/icon-mergeDown-hover.png);
-}
-
-.icon-mergeDown:active {
-    background-image: url(image/icon-mergeDown-hover.png);
-}
-
-/*选中合并*/
-.icon-mergeCells {
-    width: 60px;
-    height: 45px;
-    background: url(image/icon-mergeCells.png) center center no-repeat;
-    padding: 0px;
-    margin-right: 3px;
-}
-
-.icon-mergeCells:hover {
-    background-image: url(image/icon-mergeCells-hover.png);
-}
-
-.icon-mergeCells:active {
-    background-image: url(image/icon-mergeCells-hover.png);
-}
-
-/* 附件 */
-.invertIcon-fullscreen {
-    background-image: url(image/invertIcon-fullscreen.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.invertIcon-fullscreen:hover {
-    background-image: url(image/invertIcon-fullscreen-hover.png);
-}
-
-.invertIcon-fullscreen:active {
-    background-image: url(image/invertIcon-fullscreen-hover.png);
-}
-
-.toolbar-button-selected.invertIcon-fullscreen {
-    background-image: url(image/invertIcon-fullscreen-hover.png);
-}
-
-/*顺排*/
-.icon-justifyDefault {
-    background-image: url(image/icon-justifyDefault.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-justifyDefault:hover {
-    background-image: url(image/icon-justifyDefault-hover.png);
-}
-
-.icon-justifyDefault:active {
-    background-image: url(image/icon-justifyDefault-hover.png);
-}
-
-/*左环绕*/
-.icon-imageLeft {
-    background-image: url(image/icon-imageLeft.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-imageLeft:hover {
-    background-image: url(image/icon-imageLeft-hover.png);
-}
-
-.icon-imageLeft:active {
-    background-image: url(image/icon-imageLeft-hover.png);
-}
-
-/*右环绕*/
-.icon-imageRight {
-    background-image: url(image/icon-imageRight.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-imageRight:hover {
-    background-image: url(image/icon-imageRight-hover.png);
-}
-
-.icon-imageRight:active {
-    background-image: url(image/icon-imageRight-hover.png);
-}
-
-/*不环绕*/
-.icon-imageCenter {
-    background-image: url(image/icon-imageCenter.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-imageCenter:hover {
-    background-image: url(image/icon-imageCenter-hover.png);
-}
-
-.icon-imageCenter:active {
-    background-image: url(image/icon-imageCenter-hover.png);
-}
-
-.icon-pin {
-    display: inline-block;
-    width: 15px;
-    height: 15px;
-    background: url(image/icon-pin.png) center center no-repeat;
-}
-
-.icon-unpin {
-    display: inline-block;
-    width: 15px;
-    height: 15px;
-    background: url(image/icon-unpin.png) center center no-repeat;
-}
-
-/* 打印按钮 */
-.icon-print {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/icon-print.png) center center no-repeat;
-}
-
-.icon-print:hover {
-    background: url(image/icon-print-hover.png) center center no-repeat;
-}
-
-.icon-print:active {
-    background: url(image/icon-print-active.png) center center no-repeat;
-}
-
-/*统计图标*/
-.icon-chart {
-    background: url(image/icon-chart.png) center center no-repeat;
-}
-
-/*统计刷新图标*/
-.icon-loadingChart {
-    background: url(image/icon-chart.gif) center center no-repeat;
-}
-
-/*课程表图标*/
-.icon-schedule {
-    background: url(image/icon-schedule.png) center center no-repeat;
-}
-
-/*清除按钮*/
-.icon-clear {
-    background-image: url(image/icon-clear.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-clear:hover {
-    background-image: url(image/icon-clear-hover.png);
-}
-
-.icon-clear:active {
-    background-image: url(image/icon-clear-hover.png);
-}
-
-/*--------------------icon图标样式结束--------------------*/
-
-/*--------------------选项卡样式------------------------*/
-.tab-div {
-    position: relative;
-    float: left;
-    width: 100%;
-    display: inline-block;
-    background-color: #fff;
-    box-sizing: border-box;
-    border-bottom: 1px solid #e0e0e0;
-    padding-top: 1px;
-}
-
-.tab-div ul {
-    list-style: none;
-}
-
-.tab-div ul li ul {
-    margin-left: -26px;
-}
-
-.tab-div ul:after {
-    display: block;
-    visibility: hidden;
-    clear: both;
-    width: 0;
-    height: 0;
-    content: '';
-}
-
-/*默认选项卡样式*/
-.tab {
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
-    font-size: 16px;
-    height: 30px;
-    line-height: 30px;
-    padding: 0 25px;
-    margin-left: 8px;
-    margin-bottom: -1px;
-    float: left;
-    border-top-left-radius: 3px;
-    border-top-right-radius: 3px;
-    color: #808080;
-    border: 1px solid #becacc;
-    background: top -webkit-linear-gradient(#e1e5e7, #cfd4d7);
-    cursor: url(image/cursor-click.ico), default !important;
-}
-
-/*选项卡鼠标悬停样式*/
-.tab:hover {
-    color: #fff;
-    border: 1px solid #6b9fd3;
-    border-bottom: 1px solid #e0e0e0;
-    background: #6b9fd3;
-}
-
-/*选项卡选中样式*/
-.tab-selected {
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
-    font-size: 16px;
-    height: 30px;
-    line-height: 30px;
-    padding: 0 25px;
-    margin-left: 8px;
-    margin-bottom: -1px;
-    float: left;
-    border-top-left-radius: 3px;
-    border-top-right-radius: 3px;
-    color: #5f81b3;
-    border: 1px solid #e0e0e0;
-    border-bottom: 1px solid #fff;
-    background: #fff;
-    /*cursor: url(image/cursor-click.ico), default !important;*/
-    cursor: url(image/cursor-click.ico), default;
-}
-
-/*选项卡下的打钩区域不显示*/
-.tab .icon-unchecked,
-.tab-selected .icon-unchecked {
-    display: none !important;
-}
-
-.tab .icon-checked,
-.tab-selected .icon-checked {
-    display: none !important;
-}
-
-.lightTab-selected .icon-checked,
-.lightTab .icon-checked {
-    display: none !important;
-}
-
-.lightTab-selected .icon-unchecked,
-.lightTab .icon-unchecked {
-    display: none !important;
-}
-
-/*查询页面管理区域选项卡样式默认样式*/
-.lightTab {
-    display: inline-block;
-    color: #808080;
-    font-size: 14px;
-    padding: 0px 10px;
-    height: 37px;
-    line-height: 37px;
-    box-sizing: border-box;
-    cursor: url(image/cursor-click.ico), default !important;
-}
-
-/*查询页面管理区域选项卡样式鼠标滑过样式*/
-.lightTab:hover {
-    color: #6b9fd3;
-    border-bottom: 2px solid #6b9fd3;
-}
-
-/*查询页面管理区域选项卡样式选中样式*/
-.lightTab-selected {
-    border-bottom: 2px solid #6b9fd3;
-    display: inline-block;
-    color: #000;
-    font-size: 14px;
-    padding: 0px 10px;
-    height: 37px;
-    line-height: 37px;
-    box-sizing: border-box;
-}
-
-/*左侧选项卡*/
-.leftTab {
-    width: calc(100% - 10px);
-    box-sizing: border-box;
-    background-color: #f5f5f5;
-    margin: 0 auto;
-    padding: 0 5px;
-    font-size: 14px;
-    color: #666666;
-    overflow: hidden;
-}
-
-.leftTab-selected {
-    width: 100%;
-    background: #FFF;
-    padding: 0px 11px 0px 10px;
-    border-top: 1px solid #6c9ed7;
-    border-bottom: 1px solid #6c9ed7;
-    margin-top: -1px;
-    font-size: 14px;
-    color: #000;
-}
-
-.leftTab-dim {
-    font-size: 13px;
-    color: #666666;
-}
-
-/*右侧选项卡*/
-.rightTab {
-    width: calc(100% - 10px);
-    box-sizing: border-box;
-    background-color: #fff;
-    margin: 0 auto;
-    padding: 0 5px;
-    font-size: 14px;
-    color: #666666;
-    overflow: hidden;
-}
-
-.rightTab-selected {
-    width: 100%;
-    background: #f5f5f5;
-    padding: 0px 11px 0px 10px;
-    border-top: 1px solid #6c9ed7;
-    border-bottom: 1px solid #6c9ed7;
-    margin-top: -1px;
-    font-size: 14px;
-    color: #000;
-}
-
-.rightTab-dim {
-    font-size: 13px;
-    color: #666666;
-}
-
-/*-----------------------------选项卡样式结束--------------------------*/
-
-/*-----------------------------largeIcon样式-----------------------------*/
-.largeIcon-home {
-    background: url(image/svg_icon/home.svg) no-repeat center;
-    background-size: 24px 24px;
-}
-
-/* .largeIcon-home:hover {
-    background: url(image/svg_icon/home.svg) no-repeat center;
-    width: 34px !important;
-    height: 34px !important;
-    background-size: 24px 24px;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-}
-
-.largeIcon-home:active {
-    background: url(image/svg_icon/home.svg) no-repeat center;
-} */
-
-/*退出按钮*/
-.largeIcon-exit {
-    width: 48px !important;
-    height: 48px !important;
-
-    background: url(image/svg_icon/tuichu.svg) no-repeat center;
-    background-size: 36px 36px;
-}
-
-.largeIcon-exit:hover {
-    width: 46px !important;
-    height: 46px !important;
-    background: #242835 url(image/svg_icon/tuichu.svg) no-repeat center;
-    background-size: 36px 36px;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-}
-
-.largeIcon-exit:active {
-    width: 46px !important;
-    height: 46px !important;
-    background: #000 url(image/svg_icon/tuichu.svg) no-repeat center;
-    background-size: 36px 36px;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-}
-
-/*换肤按钮*/
-.largeIcon-skin {
-    background: url(image/svg_icon/huanfu.svg) no-repeat center;
-    background-size: 24px 24px;
-}
-
-.largeIcon-skin:hover {
-    width: 34px !important;
-    height: 34px !important;
-    background: #242835 url(image/svg_icon/huanfu.svg) no-repeat center;
-    background-size: 24px 24px;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-}
-
-.largeIcon-skin:active {
-    width: 34px !important;
-    height: 34px !important;
-    background: #000 url(image/svg_icon/huanfu.svg) no-repeat center;
-    background-size: 24px 24px;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-}
-
-/*锁定按钮*/
-.largeIcon-lock {
-    background: url(image/svg_icon/suoping.svg) no-repeat center;
-    background-size: 24px 24px;
-}
-
-.largeIcon-lock:hover {
-    width: 34px !important;
-    height: 34px !important;
-    background: #242835 url(image/svg_icon/suoping.svg) no-repeat center;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-    background-size: 24px 24px;
-}
-
-.largeIcon-lock:active {
-    width: 34px !important;
-    height: 34px !important;
-    background: #000 url(image/svg_icon/suoping.svg) no-repeat center;
-    background-size: 24px 24px;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-}
-
-/*帮助按钮*/
-.largeIcon-help {
-    background: url(image/svg_icon/zaixianbangzhu.svg) no-repeat center;
-    background-size: 24px 24px;
-}
-
-.largeIcon-help:hover {
-    width: 34px !important;
-    height: 34px !important;
-    background: #242835 url(image/svg_icon/zaixianbangzhu.svg) no-repeat center;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-    background-size: 24px 24px;
-}
-
-.largeIcon-help:active {
-    width: 34px !important;
-    height: 34px !important;
-    background: #000 url(image/svg_icon/zaixianbangzhu.svg) no-repeat center;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-    background-size: 24px 24px;
-}
-
-/*下载按钮*/
-.largeIcon-download {
-    background: url(image/svg_icon/xiazai.svg) no-repeat center;
-    background-size: 24px 24px;
-}
-
-.largeIcon-download:hover {
-    width: 34px !important;
-    height: 34px !important;
-    background: #242835 url(image/svg_icon/xiazai.svg) no-repeat center;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-    background-size: 24px 24px;
-}
-
-.largeIcon-download:active {
-    width: 34px !important;
-    height: 34px !important;
-    background: #000 url(image/svg_icon/xiazai.svg) no-repeat center;
-    border: 1px solid #EDF1F5;
-    border-radius: 4px;
-    background-size: 24px 24px;
-}
-
-/*编辑首页按钮*/
-.largeIcon-set {
-    background: url(image/svg_icon/shouyeshezhi.svg) no-repeat center;
-    background-size: 24px 24px;
-    /* box-sizing: border-box; */
-}
-
-.largeIcon-set:hover {
-    width: 34px !important;
-    height: 34px !important;
-    border: 1px solid white;
-    border-radius: 4px;
-    background: #242835 url(image/svg_icon/shouyeshezhi.svg) no-repeat center;
-    background-size: 24px 24px;
-}
-
-.largeIcon-set:active {
-    width: 34px !important;
-    height: 34px !important;
-    border: 1px solid white;
-    border-radius: 4px;
-    background: #000 url(image/svg_icon/shouyeshezhi.svg) no-repeat center;
-    background-size: 24px 24px;
-}
-
-/* 首页添加删除时的 部件居中 */
-.gridster>ul {
-    margin-top: 5px;
-    margin-bottom: 30px;
-    margin-left: 0px;
-    width: 100%;
-    height: 100%;
-    background-color: rgba(255, 255, 255, 0);
-    margin: 0 auto;
-}
-
-/* 首页部件编辑状态 关闭按钮 */
-.gridster .close {
-    background-image: url("image/svg_icon/shanchujiaobiao.svg");
-    cursor: pointer;
-    right: 0px;
-    top: 0px;
-    position: absolute;
-    width: 36px;
-    height: 36px;
-    font-size: 0;
-    z-index: 2;
-    transform: rotate(270deg);
-}
-
-/* 首页部件编辑状态 右下角拖拽图标 */
-.gs-resize-handle-both {
-    width: 36px !important;
-    height: 36px !important;
-    bottom: 0px !important;
-    right: 0px !important;
-    /* position: relative !important; */
-    /* background-color: red; */
-    background-image: url(image/svg_icon/guangbiao-tuozhuai.svg) !important;
-    background-position: center !important;
-    transform: rotate(-45deg);
-}
-
-/* .gs-resize-handle-both::after{
-    content: '';
-    position: absolute;
-    left: 0;
-    bottom: 0;
-    display: block;
-    width:100%;
-    height:3px;
-    background:green;
-    transform: rotate(45deg);
-}
-.gs-resize-handle-both::before{
-    content: '';
-    position: absolute;
-    right:  0;
-    bottom: 0;
-    display: block;
-    width:3px;
-    height:100%;
-    background:green;
-    transform: rotate(45deg);
-} */
-/*编辑帮助*/
-.largeIcon-setHelp {
-    background-image: url(image/editWdHelp.png);
-}
-
-.largeIcon-setHelp:hover {
-    background-image: url(image/editWdHelp-hover.png);
-}
-
-.largeIcon-setHelp:active {
-    background-image: url(image/editWdHelp-active.png);
-}
-
-/*菜单开始按钮*/
-.largeIcon-start {
-    width: 28px;
-    height: 28px;
-    cursor: url(image/cursor-click.ico), default;
-    background: url(image/menu-startButton.png) center center no-repeat;
-}
-
-/*菜单查询按钮*/
-.largeIcon-search {
-    width: 28px;
-    height: 28px;
-    background: url(image/menu-searchButton.png) center center no-repeat;
-    cursor: url(image/cursor-click.ico), default;
-}
-
-/*-----------------------------largeIcon样式结束-----------------------------*/
-
-/*---------------------------------翻页样式--------------------------*/
-.icon-prevPage {
-    background: url('image/prevPage.png') 0px center no-repeat;
-    cursor: url(image/cursor-click.ico), default !important;
-}
-
-.icon-prevPage:hover {
-    background: url('image/prevPage.png') 0px center no-repeat;
-}
-
-.icon-nextPage {
-    background: url('image/nextPage.png') 0px center no-repeat;
-    cursor: url(image/cursor-click.ico), default !important;
-}
-
-.icon-nextPage:hover {
-    background: url('image/nextPage.png') 0px center no-repeat;
-}
-
-/*-----------------------------翻页样式结束--------------------*/
-
-/*----------------------------底部区域样式--------------------*/
-/* 外框 */
-.bottom-div {
-    position: fixed;
-    bottom: 0px;
-    left: 0px;
-    z-index: 100;
-    width: 100%;
-    background-color: rgba(231, 234, 234, 1);
-}
-
-/*底部区域上部*/
-.bottom-up-div {
-    height: 110px;
-    background-color: rgba(246, 249, 249, 1);
-    border-top: 3px solid #4863a4;
-}
-
-/* 底部区域下部 */
-.bottom-down-div {
-    padding: 10px 10px 9px 0px;
-    text-align: right;
-    border-top: 1px solid #e2e4ec;
-    box-shadow: 0px -1px 1px rgba(241, 241, 241, 1);
-    font-size: 18px;
-    gap: 20px;
-    color: #333;
-    background: #fafbfe;
-}
-
-.bottom-div .input-div {
-    background-color: #fff;
-    border: 1px solid #e1e1e1;
-}
-
-/* 其中一格手写区域 */
-.write-div {
-    background: url(image/input-write-div.png) center center no-repeat;
-}
-
-/*----------------------------底部区域样式结束--------------------*/
-
-/*----------------------------popup样式----------------------*/
-.popup-div {
-    box-shadow: 4px 4px 9px rgba(0, 0, 0, .13);
-    box-sizing: border-box;
-    background-color: #393d51;
-    border-left: 1px solid #e1e1e1;
-    border-right: 1px solid #e1e1e1;
-    border-bottom: 1px solid #e1e1e1;
-    border-radius: 4px;
-    z-index: 1013;
-    position: absolute;
-    width: auto;
-    /* border-top: 1px solid #6c9ed7; */
-    min-width: max-content;
-}
-
-.popupList {
-    text-indent: 12px;
-    height: 30px;
-    padding-left: 6px;
-    /*padding-right: 28px;*/
-    line-height: 30px;
-    font-size: 14px;
-    color: #fff;
-    text-align: left;
-    text-overflow: ellipsis;
-    overflow: hidden;
-    white-space: nowrap;
-    position: relative;
-}
-
-.popupList.selected::before {
-    content: '';
-    position: absolute;
-    width: 14px;
-    height: 14px;
-    background: url(image/svg_icon/baocun.svg) no-repeat center;
-    left: 2px;
-    top: 50%;
-    transform: translateY(-50%);
-}
-
-.popupList:hover {
-    color: #393d51;
-    background: #fff;
-}
-
-/* 向上长的 */
-.popupUp-Div {
-    box-shadow: 4px 4px 9px rgba(0, 0, 0, .13);
-    padding-right: 4px;
-    box-sizing: border-box;
-    background-color: #fff;
-    border-left: 1px solid #e1e1e1;
-    border-bottom: 1px solid #e1e1e1;
-    z-index: 1013;
-    position: absolute;
-    width: auto;
-}
-
-/*-------------------------------popup样式结束---------------------*/
-
-/*------------------------------form区域样式--------------------------*/
-.form {
-    width: 100%;
-    height: auto;
-    /* border-collapse: collapse;*/
-    border-collapse: separate;
-    border-spacing: 0px;
-    border-left: 1px solid #E2E4EC;
-    border-top: 1px solid #E2E4EC;
-    overflow: auto;
-}
-
-.form tr {
-    height: 55px;
-
-}
-
-.form th {
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-    font-size: 14px;
-    color: #666666;
-    height: 55px;
-    text-align: right;
-    background-color: #f8f9fb;
-    border-right: 1px solid #E2E4EC;
-    border-bottom: 1px solid #E2E4EC;
-    word-break: break-word;
-    position: relative;
-    vertical-align: middle;
-    padding: 0px 10px 0px 48px;
-    box-sizing: border-box;
-}
-
-.form td {
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-    font-size: 14px;
-    color: #333;
-    height: 55px;
-    background: #fff;
-    vertical-align: middle;
-    word-break: break-word;
-    border-right: 1px solid #e8eaed;
-    border-bottom: 1px solid #d4d6d9;
-    position: relative;
-    box-sizing: border-box;
-    padding: 0px 12px 0px 12px;
-    line-height: 28px;
-}
-
-.form .tdWidth {
-    width: 11.6rem !important
-}
-
-/*----------------------------------form区域样式结束-----------------------*/
-
-/*-----------------------------------objectpicker样式-------------------------*/
-.form .input-div {
-    margin-left: -6px;
-}
-
-.input-div {
-    border: 1px solid transparent;
-    outline: none;
-    border-radius: 2px;
-    font-size: 14px;
-    color: #000;
-    line-height: 22.8px;
-    background-color: transparent;
-    box-sizing: border-box;
-    position: relative;
-    min-height: 28px;
-    display: inline-block;
-    vertical-align: middle;
-}
-
-.input-div textarea,
-.input-div textarea:disabled {
-    border: none;
-    outline: none;
-    border-radius: 2px;
-    line-height: 19px;
-    color: #000;
-    vertical-align: middle;
-    box-sizing: border-box;
-}
-
-.search-div .input-div {
-    border: 1px solid #c4c7cc;
-}
-
-.search-div .input-div textarea {
-    padding-left: 11px !important;
-}
-
-/* 选中状态的文本框蓝色边框 */
-.input-div-selected {
-    border: 1px solid rgb(195 199 203) !important;
-    box-shadow: 2px 2px 2px #dedede;
-    box-sizing: border-box;
-    word-break: break-all;
-    z-index: 9999 !important;
-}
-
-.input-underlineDiv {
-    font-size: 14px;
-    color: #276bab;
-    letter-spacing: 2px;
-    border: none;
-    outline: none;
-    position: relative;
-    border-bottom: 1px solid #5482b8;
-    display: inline-block;
-    padding-right: 21px;
-}
-
-.input-underlineDiv::after {
-    content: "";
-    width: 14px;
-    height: 8px;
-    background: url(image/uditor-select.png) center center no-repeat;
-    position: absolute;
-    right: 0px;
-    top: 11px;
-}
-
-.input-div {}
-
-.input-div textarea::-webkit-input-placeholder {
-    color: #ccc;
-}
-
-.input-div textarea::-moz-placeholder {
-    color: #ccc;
-}
-
-.input-div textarea:-moz-placeholder {
-    color: #ccc;
-}
-
-.input-div textarea:-ms-input-placeholder {
-    color: #ccc;
-}
-
-/*时间输入框外层div*/
-.input-inside {
-    display: inline-block;
-    position: relative;
-}
-
-/*-----------------------------------objectpicker样式结束-------------------------*/
-
-/*--------------------------------------search-div区域样式------------------------*/
-.search-div {
-    font-size: 14px;
-    color: #808080;
-    overflow: hidden;
-    box-sizing: border-box;
-
-}
-
-/*-----------------------------------search-div区域样式结束------------------------*/
-
-/*-----------------------------------list样式------------------------------*/
-.list-div {
-    position: relative;
-    overflow: auto;
-    box-sizing: border-box;
-}
-
-.list {
-    font-size: 14px;
-    color: #000;
-}
-
-.list:nth-child(odd) {
-    background-color: #ffffff;
-}
-
-.list:nth-child(even) {
-    background-color: #fafafa;
-}
-
-span.list:hover {
-    background-color: #c7e3fc;
-}
-
-div.list:hover {
-    background-color: #c7e3fc;
-}
-
-.list a {
-    color: #000;
-}
-
-table.list {
-    width: calc(100% - 60px) !important;
-    height: auto;
-    border-collapse: separate;
-    border-top-left-radius: 5px;
-    border-top-right-radius: 5px;
-    border-spacing: 0px;
-    overflow: hidden;
-    box-sizing: border-box;
-    border: 1px solid #e0e0e0;
-    margin-left: 30px;
-}
-
-.list tr {
-    height: 40px;
-}
-
-.list tr:nth-child(odd) {
-    background-color: #ffffff;
-}
-
-.list tr:nth-child(even) {
-    background-color: #fafafa;
-}
-
-.list th {
-    background-color: #6c9ed7;
-    font-size: 14px;
-    height: 40px;
-    padding: 0px 30px 0px 12px;
-    color: #fff;
-    min-width: 50px;
-    max-width: 250px;
-    text-align: left;
-    border-right: 1px solid #f2f2f2;
-    box-sizing: border-box;
-    word-break: break-word;
-    vertical-align: middle;
-    position: relative;
-}
-
-.list th:last-child {
-    border-right: none;
-}
-
-.list tr td {
-    font-size: 14px;
-    color: #747474;
-    box-sizing: border-box;
-    word-break: break-word;
-    position: relative;
-    line-height: 42px;
-    overflow: hidden;
-    font-weight: normal;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    padding: 0px 30px 0px 12px;
-    border-right: 1px solid #f2f2f2;
-    vertical-align: middle;
-    max-width: 370px;
-}
-
-.list tr td:last-child {
-    border-right: none;
-}
-
-/*闭合文件夹样式*/
-.list-highlight {
-    color: #333;
-    font-size: 14px;
-}
-
-/* 次要的(待办列表灰色时间) */
-.list-smallDim {
-    color: #969696;
-    font-size: 12px;
-    display: inline-block;
-    vertical-align: middle;
-    /* box-sizing: border-box; */
-    height: 40px;
-    cursor: url(image/cur.ico), default !important;
-}
-
-/* 警告的(待办列表红色时间) */
-.list-warning {
-    color: #ff0000;
-    font-size: 12px;
-    display: inline-block;
-    vertical-align: middle;
-    box-sizing: border-box;
-    cursor: url(image/cur.ico), default !important;
-}
-
-.list-dim {
-    font-size: 14px;
-    color: #666666;
-    width: 130px;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    margin-right: 5px;
-    height: 41px;
-}
-
-/*列表按钮样式*/
-.list-button {
-    font-size: 14px;
-    height: 26px;
-    line-height: 26px;
-    text-align: center;
-    color: rgba(108, 158, 215, 1);
-    background-color: rgba(255, 255, 255, 1);
-    border-radius: 2px;
-    padding: 0px 13px;
-    outline: none;
-    border: 1px solid rgba(108, 158, 215, 1);
-    cursor: pointer;
-}
-
-.list-button:hover {
-    background-color: rgba(108, 158, 215, 1);
-    color: rgba(255, 255, 255, 1);
-}
-
-/*-----------------------------------list样式结束------------------------------*/
-
-/*----------------------------------longCardList-div区域样式-------------------------------*/
-.longCardList-div {
-    background: #fff;
-    margin-bottom: 10px;
-}
-
-.longCardList-div table {
-    border-collapse: collapse;
-    display: block;
-}
-
-.longCardList-div table tbody {
-    display: block;
-}
-
-.longCardList-div table tr {
-    display: block;
-    width: 100%;
-}
-
-.longCardList-div table tr td {
-    position: relative;
-    display: block;
-    width: 100%;
-    padding: 16px 10px 11px 14px;
-    box-sizing: border-box;
-    zoom: 1;
-}
-
-.longCardList-div table tr td:hover {
-    background: #c7e3fc;
-}
-
-.longCardList-div table tr td::after {
-    clear: both;
-    content: "";
-    display: block;
-    width: 0px;
-    height: 0px;
-}
-
-.longCardList-div .longCardList-thumbnail {
-    max-width: 141px;
-    max-height: 80px;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    border-radius: 3px;
-    overflow: hidden;
-    box-sizing: border-box;
-    float: left;
-}
-
-.longCardList-div .longCardList-thumbnail img {
-    max-width: 139px;
-    max-height: 78px;
-    border: 1px solid #ededed;
-}
-
-.longCardList-dim {
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-    font-size: 13px;
-    color: #666;
-    line-height: 20px;
-    min-height: 20px;
-    max-height: 40px;
-    overflow: hidden;
-    max-width: 100%;
-    margin-bottom: 6px;
-}
-
-.longCardList {
-    font-size: 13px;
-    color: #010101;
-    line-height: 18px;
-    height: 18px;
-    margin-top: 3px;
-}
-
-.longCardList span {
-    margin-right: 8px;
-    vertical-align: middle;
-}
-
-.longCardList-highlight {
-    width: 100%;
-    height: 20px;
-    line-height: 20px;
-    font-size: 16px !important;
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-    display: inline-block;
-    color: #273495 !important;
-}
-
-.longCardList-highlight a {
-    text-decoration: none;
-    color: #273495;
-    font-size: 16px;
-}
-
-/* 滤镜-黑白 */
-.filter {
-    -webkit-filter: grayscale(100%);
-    filter: grayscale(100%);
-    /*background-color: #f7f7f7 !important;*/
-}
-
-/*----------------------------------longCardList-div区域样式结束-------------------------------*/
-
-/*----------------------------------box样式-------------------------------*/
-.box {
-    border: 1px solid #a9c5e1;
-    box-sizing: border-box;
-    border-radius: 3px;
-    font-size: 18px;
-    color: #4c4c4c;
-}
-
-/* 左侧盒子边框(左边圆角,右边直角) */
-.leftBox-dim {
-    position: relative;
-    float: left;
-    overflow: auto;
-    width: 761px;
-    border: 1px solid #c2c2c2;
-    font-size: 0px;
-    box-sizing: border-box;
-    font-size: 0px;
-    background: #fff;
-    border-radius: 3px 0px 0px 3px;
-}
-
-/* rightBox  右侧栏边框(左边直角,右边圆角) */
-.rightBox {
-    border: 1px solid #a9c5e1;
-    box-sizing: border-box;
-    border-radius: 0px 3px 3px 0px;
-}
-
-/*----------------------------------box样式结束-------------------------------*/
-
-/*---------------------------------cardList-div区域样式----------------------------------*/
-.cardList-div {
-    display: inline-block;
-    color: #333;
-    box-sizing: border-box;
-    position: relative;
-}
-
-.cardList-div:hover:before {
-    content: "";
-    display: inline-block;
-    position: absolute;
-    height: 90%;
-    right: 0px;
-    bottom: 0px;
-    width: 2px;
-    background-color: #6c9ed7;
-}
-
-.cardList-div:hover:after {
-    content: "";
-    display: inline-block;
-    position: absolute;
-    width: 90%;
-    right: 0px;
-    bottom: 0px;
-    height: 2px;
-    background-color: #6c9ed7;
-}
-
-.cardList-thumbnail {
-    padding: 2px 2px 2px 2px;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    box-sizing: border-box;
-}
-
-.cardList-thumbnail img {
-    max-width: 100%;
-    max-height: 100%;
-}
-
-.cardList-highlight {
-    font-size: 14px;
-    color: #000;
-}
-
-.cardList-smallDim {
-    font-size: 12px;
-    color: #666;
-    word-break: break-all;
-}
-
-.cardList {
-    position: relative;
-    float: left;
-    overflow: auto;
-    width: 761px;
-    border: 1px solid #c2c2c2;
-    font-size: 0px;
-    height: 516px;
-    border-radius: 3px;
-    box-sizing: border-box;
-    font-size: 0px;
-    background: #fff;
-}
-
-.cardList-dim {
-    font-size: 14px;
-    color: #666;
-    line-height: 14px;
-    margin-left: 5px;
-    box-sizing: border-box;
-}
-
-/*---------------------------------cardList-div区域样式结束----------------------------------*/
-
-/*---------------------------------iconlist区域样式------------------------------------------*/
-.iconList-div {
-    display: inline-block;
-    color: #333;
-    box-sizing: border-box;
-    position: relative;
-}
-
-.iconList-div:hover:before {
-    content: "";
-    display: inline-block;
-    position: absolute;
-    height: 90%;
-    right: 0px;
-    bottom: 0px;
-    width: 2px;
-    background-color: #6c9ed7;
-    z-index: 1;
-}
-
-.iconList-div:hover:after {
-    content: "";
-    display: inline-block;
-    position: absolute;
-    width: 90%;
-    right: 0px;
-    bottom: 0px;
-    height: 2px;
-    background-color: #6c9ed7;
-}
-
-.iconList-thumbnail {
-    padding: 2px 2px 2px 2px;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    box-sizing: border-box;
-}
-
-.iconList-thumbnail img {
-    max-width: 100%;
-    max-height: 100%;
-}
-
-.iconList-smallDim {
-    font-size: 12px;
-    color: #666;
-    line-height: 14px;
-    margin-left: 5px;
-    box-sizing: border-box;
-}
-
-.icon-status {
-    position: absolute;
-    width: 26px;
-    height: 26px;
-    box-sizing: border-box;
-}
-
-/* 绿色 */
-.mainState-green {
-    background-color: #cdecdf;
-}
-
-/*黄色*/
-.mainState-yellow {
-    background-color: #fef6dc;
-}
-
-/*红色*/
-.mainState-red {
-    background-color: #f9dcdb;
-}
-
-/*橙色*/
-.mainState-orange {
-    background-color: #f8d7ae;
-}
-
-/*灰色*/
-.mainState-gray {
-    background-color: #e3e3e3;
-}
-
-/*---------------------------------iconlist区域样式结束------------------------------------------*/
-
-/*---------------------------------contextMenu右键菜单样式---------------------------------------*/
-.contextMenu-div {
-    background-color: #f5f5f5;
-    border-radius: 2px;
-    overflow: hidden;
-    position: absolute;
-    z-index: 999999;
-    display: none;
-    box-shadow: 1px 1px 1px rgba(0, 0, 0, .3);
-    padding: 3px 8px;
-    font-size: 0px;
-}
-
-.contextMenu-button {
-    font-size: 13px;
-    font-weight: normal;
-    line-height: 15px;
-    padding: 5px 8px;
-    margin-right: 2px;
-    letter-spacing: 2px;
-    color: #FFf;
-    border: 1px solid #6c94d7;
-    background-color: #6c94d7;
-    border-radius: 4px;
-}
-
-/*---------------------------------contextMenu右键菜单样式结束--------------------------------------*/
-
-/*--------------------------------dragList拖拽区域样式---------------------------------------------*/
-.dragList-div {
-    overflow: hidden;
-}
-
-.dragList-div .box {
-    overflow: hidden;
-    width: 48.5%;
-    box-sizing: border-box;
-}
-
-.dragList-div .box:first-child {
-    float: left;
-    margin-left: 7px;
-}
-
-.dragList-div .box:last-child {
-    float: right;
-    margin-right: 7px;
-}
-
-.label {
-    margin: 0;
-    background-color: #6c9ddb;
-    text-indent: 15px;
-    height: 42px;
-    text-overflow: ellipsis;
-    box-sizing: border-box;
-    overflow: hidden;
-    white-space: nowrap;
-    vertical-align: middle;
-    font-weight: bold;
-    color: #fff;
-    line-height: 42px;
-    font-size: 16px;
-    position: relative;
-}
-
-/*--------------------------------dragList拖拽区域样式结束---------------------------------------------*/
-
-/*--------------------------------smallList区域样式------------------------------------------------------*/
-.smallList-div {
-    position: relative;
-    width: auto;
-    margin: 0 auto;
-    box-sizing: border-box;
-    box-shadow: 2px 2px 2px rgba(0, 0, 0, .13);
-}
-
-.smallList-div table {
-    width: auto;
-    height: auto;
-    border-collapse: separate;
-    text-decoration: none;
-    color: #000000;
-    background-color: #fafafa;
-    border: 1px solid #e1e1e1;
-    border-spacing: 0px;
-    box-sizing: border-box;
-}
-
-.smallList-div th {
-    background-color: #6c9ed7;
-    font-size: 14px;
-    height: 28px;
-    line-height: 28px;
-    padding: 0px 30px 0px 12px;
-    color: #fff;
-    text-align: left;
-    border-right: 1px solid #f0f0f0;
-    border-bottom: 1px solid #cccccc;
-}
-
-.smallList-div td {
-    font-size: 14px;
-    box-sizing: border-box;
-    word-break: break-word;
-    position: relative;
-    height: 25px;
-    line-height: 25px;
-    overflow: hidden;
-    font-weight: normal;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    padding: 0px 30px 0px 12px;
-    border-right: 1px solid #f0f0f0;
-    border-bottom: 1px solid #cccccc;
-    max-width: 350px;
-}
-
-/*--------------------------------smallList区域样式结束-------------------------------------------------*/
-
-/*----------------------------------------个人首页样式--------------------------------------------------*/
-.plugin-div {
-    overflow: hidden;
-    border: 1px solid #ededed;
-    border-radius: 4px;
-    list-style: none;
-    box-shadow: 1px 1px 1px #e6e6e6;
-    background-color: #fff;
-    font-size: 14px;
-    color: #333;
-}
-
-.plugin-largeText {
-    font-size: 14px;
-    color: #333;
-}
-
-.plugin-boldText {
-    font-size: 14px;
-    color: #1a1a1a;
-}
-
-.plugin-title {
-    font-weight: bold;
-    height: 55px;
-    line-height: 55px;
-    position: relative;
-    width: 100%;
-    margin: 0px;
-    color: #1a1a1a;
-    font-size: 16px;
-}
-
-/*个人首页部件图标共用样式*/
-.plugin-icon {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    margin-left: 15px;
-    vertical-align: middle;
-    cursor: url(image/cursor-click.ico), default !important;
-}
-
-/* 个人首页部件右边那些按钮应该鼠标进入部件才显示 */
-.todoPlugin-title-right,
-.infoPlugin-title-right {
-    visibility: hidden;
-}
-
-.ContainerForLoad:hover .todoPlugin-title-right,
-.ContainerForLoad:hover .infoPlugin-title-right {
-    visibility: visible;
-}
-
-/*待办图标*/
-.todoPlugin-icon {
-    background: url(image/svg_icon/daiban.svg) center center no-repeat;
-}
-
-.todoPlugin-icon:hover {
-    background: url(image/svg_icon/shaugxin.svg) center center no-repeat;
-}
-
-/*待办刷新图标*/
-.todoPlugin-loadingIcon {
-    background: url(image/home-todoPlugin-icon.gif) center center no-repeat;
-}
-
-/* 待办 一级文件夹,一级文件背景颜色 */
-.folder1:hover,
-.file1:hover {
-    background-color: #edf1f5;
-}
-
-/* 待办 二级文件颜色和底部边框*/
-.file2::after {
-    display: block;
-    content: '';
-    width: calc(100% - 52px);
-    height: 100%;
-    background-color: transparent;
-    position: absolute;
-    left: 43px;
-    bottom: 0;
-    border-bottom: 1px solid #eee;
-    z-index: 0;
-}
-
-/* 待办 二级文件鼠标经过背景颜色 */
-.file2:hover:after {
-    background-color: #edf1f5;
-}
-
-/*催办图标*/
-.urgePlugin-icon {
-    background: url(image/home-urgePlugin-icon.png) center center no-repeat;
-}
-
-/*催办刷新图标*/
-.urgePlugin-loadingIcon {
-    background: url(image/urgePlugin-loadingIcon.gif) center center no-repeat;
-}
-
-/*公告图标*/
-.noticePlugin-icon {
-    background: url(image/noticePlugin-icon.png) center center no-repeat;
-}
-
-/*公告刷新图标*/
-.noticePlugin-loadingIcon {
-    background: url(image/noticePlugin-loadingIcon.gif) center center no-repeat;
-}
-
-/*快捷图标*/
-.shortcutPlugin-icon {
-    background: url(image/home-shortcutPlugin-icon.png) center center no-repeat;
-}
-
-/*分隔符,分隔菜单组左右两边*/
-.menu-seperator {
-    width: 36px;
-    height: 36px;
-    background: url(image/menu-separator.png) center center no-repeat;
-    visibility: hidden;
-}
-
-.menu-seperator:hover {
-    background: url(image/menu-draggingSplit.png) center center no-repeat;
-}
-
-/*催办梯形按钮*/
-.listProgress-button {
-    float: right;
-    background-color: #edeff0;
-    height: 27px;
-    display: inline-block;
-    line-height: 32px;
-    border-top-right-radius: 2px;
-    border-bottom-right-radius: 2px;
-    font-size: 0px;
-    color: #333;
-    position: relative;
-    border-top-left-radius: 3px;
-}
-
-/*催办梯形按钮三角形*/
-.listProgress-button:before {
-    content: "";
-    width: 0px;
-    height: 0px;
-    border-top: 27px solid transparent;
-    border-bottom: 27px solid #edeff0;
-    border-left: 24px solid transparent;
-    border-right: none;
-    position: absolute;
-    top: -27px;
-    left: -23px;
-}
-
-.listProgress-button:hover {
-    background-color: #6c9fd3;
-    color: #fff;
-}
-
-.listProgress-button:hover:before {
-    border-bottom: 27px solid #6c9fd3;
-}
-
-.listProgress-button:hover .list-smallDim {
-    color: #fff;
-}
-
-.listProgress-button:hover .vLine-dashed {
-    border-right: 1px dashed #fff;
-}
-
-/*催办进度条外围的DIV*/
-.listProgress-div {
-    height: 5px;
-    background: #f0f0f0;
-    border-top-left-radius: 2.5px;
-    border-bottom-left-radius: 2.5px;
-    border-bottom-right-radius: 2.5px;
-}
-
-/*进度条进度*/
-.listProgress-done {
-    height: 100%;
-    background-color: #6c9ed7;
-    border-radius: 2.5px;
-}
-
-/*快捷部件-快捷部件搜索小图标*/
-.miniIcon-search {
-    position: absolute;
-    left: 0px;
-    bottom: 0px;
-    width: 19px;
-    height: 19px;
-    background: url(image/icon-search.png) center center no-repeat;
-    z-index: 10;
-}
-
-/*快捷部件-快捷部件开始小图标*/
-.miniIcon-start {
-    position: absolute;
-    left: 0px;
-    bottom: 0px;
-    width: 19px;
-    height: 19px;
-    background: url(image/icon-start.png) center center no-repeat;
-    z-index: 10;
-}
-
-/*个人信息进度条外围的DIV*/
-.progress-div {
-    height: 20px;
-    background: #edeff0;
-    border-radius: 10px;
-    /* box-shadow: 0px 1px 1px #959595; */
-}
-
-/*个人信息进度条进度*/
-.progress-done {
-    height: 5px;
-    background: #759acf;
-    border-radius: 2px;
-    position: relative;
-    width: 0px;
-}
-
-/*个人信息梯形*/
-.progress-button {
-    float: right;
-    background-color: rgba(237, 239, 240, 1);
-    height: 18px;
-    display: inline-block;
-    line-height: 18px;
-    border-top-right-radius: 2px;
-    border-bottom-right-radius: 2px;
-    font-size: 14px;
-    color: #333;
-    position: relative;
-    text-align: center;
-    padding: 0 8px;
-    box-sizing: border-box;
-    border-top-left-radius: 2px;
-}
-
-/*个人信息三角形*/
-.progress-button:before {
-    content: "";
-    width: 0px;
-    height: 0px;
-    border-top: 31px solid transparent;
-    border-bottom: 31px solid rgba(237, 239, 240, 1);
-    border-left: 24px solid transparent;
-    border-right: none;
-    position: absolute;
-    top: -30px;
-    left: -24px;
-}
-
-.progress-button:hover {
-    background-color: #6c9fd3;
-    color: #fff;
-}
-
-.progress-button:hover:before {
-    border-bottom: 31px solid #6c9fd3;
-}
-
-/* 小文本 */
-.plugin-smallText {
-    color: #1a1a1a;
-    font-size: 14px;
-    padding-top: 11px;
-}
-
-/* 搜索录入框 */
-.home-input {
-    height: 28px;
-    color: #000000;
-    border: 1px solid #6c9ed7 !important;
-    vertical-align: middle;
-    margin-right: 2px;
-    box-sizing: border-box;
-    padding-left: 12px;
-    border-radius: 2px;
-    font-size: 14px;
-    outline: none;
-}
-
-.plugin-dragHeight {
-    display: block;
-    width: 100%;
-    height: 1px;
-    background-color: transparent;
-    border-radius: 1px;
-    vertical-align: bottom;
-    position: relative;
-}
-
-.plugin-dragHeight span {
-    width: 35px;
-    height: 11px;
-    position: absolute;
-    right: 1px;
-    bottom: 1px;
-    background: url(image/handlebtn.png) center center no-repeat;
-    z-index: 9999999999;
-}
-
-.plugin-dragHeight span:hover::after {
-    content: "";
-    display: inline-block;
-    width: 12px;
-    height: 18px;
-    background: url(image/handlebtn-cursor.png);
-    position: absolute;
-    top: -4px;
-    right: 8px;
-}
-
-/*拖动调节大小按钮*/
-.plugin-drag {
-    display: inline-block;
-    width: 22px;
-    height: 22px;
-    background: url(image/plugin-drag.png) center center no-repeat;
-}
-
-.plugin-drag:hover::after {
-    content: "";
-    display: inline-block;
-    width: 16px;
-    height: 16px;
-    background: url(image/plugin-drag-cursor.png) center center no-repeat;
-    position: absolute;
-    right: 4px;
-    bottom: 3px;
-}
-
-.plugin-invertDiv {
-    display: inline-block;
-    background-color: #f3f3f3;
-}
-
-/*----------------------------------------个人首页样式结束--------------------------------------------------*/
-
-/*-----------------------------------------反色图标样式----------------------------------------------------*/
-/*场地*/
-.invertIcon-place {
-    display: inline-block;
-    height: 100%;
-    width: 40px;
-    background: url(image/field.png) center center no-repeat;
-    vertical-align: top;
-}
-
-/*人员*/
-.invertIcon-person {
-    display: inline-block;
-    height: 100%;
-    width: 40px;
-    background: url(image/ycd-ry.png) center center no-repeat;
-    vertical-align: top;
-}
-
-/*服务*/
-.invertIcon-service {
-    display: inline-block;
-    height: 100%;
-    width: 40px;
-    background: url(image/ycd-fw.png) center center no-repeat;
-    vertical-align: top;
-}
-
-/* 复制帮助代码按钮 */
-.invertIcon-key {
-    display: inline-block;
-    width: 15px;
-    height: 15px;
-    background: url(image/smallHelp-keyButton.png) center center no-repeat;
-    display: inline-block;
-    position: absolute;
-    right: 23px;
-    top: 4px;
-}
-
-/*信息框固定按钮*/
-.invertIcon-unpin {
-    display: inline-block;
-    width: 15px;
-    height: 15px;
-    background: url(image/smallHelp-fixButton.png) center center no-repeat;
-    position: absolute;
-    top: 4px;
-    right: -8px;
-}
-
-/* 信息框关闭按钮 */
-.invertIcon-close {
-    display: inline-block;
-    width: 15px;
-    height: 15px;
-    background: url(image/smallHelp-closeButton.png) center center no-repeat;
-    position: absolute;
-    right: -8px;
-    top: 4px;
-}
-
-.invertIcon-mobile {
-    background-image: url(image/bottom-buttonIcon-hover.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.invertIcon-mobile:hover {
-    background-image: url(image/bottom-buttonIcon.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-/*-----------------------------------------反色图标样式结束----------------------------------------------------*/
-
-/*-----------------------------------------分隔线样式---------------------------------------------------*/
-/*拖拉分隔线*/
-.content-hSeperator {
-    position: relative;
-    z-index: 99;
-    width: 100%;
-    height: 7px;
-    background-color: #6c9ed7;
-    border-radius: 4px;
-    box-shadow: 0px 2px 1px #415e7f;
-}
-
-.content-hSeperator span {
-    right: 0px;
-    position: absolute;
-    top: -26px;
-    background-image: url(image/dragmask.png);
-    width: 109px;
-    height: 32px;
-    display: inline-block;
-}
-
-.content-hSeperator span:hover {
-    background-image: url(image/dragmask-hover.png);
-}
-
-/*-----------------------------------------分隔线样式结束------------------------------------------------*/
-
-/*-------------------------------------自动消失的信息框-------------------------------------------------*/
-.flashMsg-div {
-    display: inline-block;
-    background-color: #6c9ed7;
-    padding: 5px 16px;
-    line-height: 20px;
-    position: absolute;
-    border-radius: 3px;
-    color: #fff;
-    font-size: 14px;
-    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
-    max-width: 260px;
-    display: none;
-}
-
-/* 向下箭头 */
-.flashMsg-down {
-    display: inline-block;
-    width: 0px;
-    height: 0px;
-    border-style: solid;
-    border-width: 10px 7px 0px 0px;
-    border-color: #6c9ed7 transparent transparent transparent;
-    position: absolute;
-    bottom: -10px;
-    left: 7px;
-}
-
-.flashMsg-up {
-    display: inline-block;
-    width: 0px;
-    height: 0px;
-    border-style: solid;
-    border-width: 0px 7px 10px 0px;
-    border-color: transparent transparent #6c9ed7 transparent;
-    position: absolute;
-    top: -10px;
-    left: 7px;
-}
-
-.flashMsg-title {
-    height: 23px;
-    position: relative;
-
-}
-
-/*登录提示框*/
-.warningFlashMsg-div {
-    background-color: #ffffff;
-    color: #ff0000;
-    box-shadow: 1px 1px 1px #dddddd;
-    padding: 8px 16px;
-    border-radius: 3px;
-}
-
-/*登录页提示框向上箭头 */
-.warningFlashMsg-up::before {
-    border-width: 1px 11px 18px 8px;
-    border-style: solid;
-    border-color: transparent transparent #ffffff transparent;
-}
-
-/*登录页提示框向下箭头*/
-.warningFlashMsg-down::before {
-    border-width: 17px 8px 1px 4px;
-    border-style: solid;
-    border-color: #ffffff transparent transparent transparent;
-}
-
-/*烽火台登录页提示框向上箭头*/
-.loginFlashMsg-up {
-    display: inline-block;
-    width: 0px;
-    height: 0px;
-    border-style: solid;
-    border-width: 0px 7px 10px 0px;
-    border-color: transparent transparent #6c9ed7 transparent;
-    position: absolute;
-}
-
-/*烽火台登录页提示框向下箭头*/
-.loginFlashMsg-down {
-    display: inline-block;
-    width: 0px;
-    height: 0px;
-    border-style: solid;
-    border-width: 10px 7px 0px 0px;
-    border-color: #6c9ed7 transparent transparent transparent;
-    position: absolute;
-}
-
-/*-------------------------------------自动消失的信息框结束--------------------------------------------*/
-
-/*-------------------------------------menu样式------------------------------------------------------*/
-.menu-div {
-    /* border: 1px solid #e6e6e6; */
-    box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.8);
-    display: inline-block;
-    position: relative;
-    background-color: #393d51;
-    border-radius: 4px;
-}
-
-/* 下拉菜单中的菜单项 */
-.menu-item {
-    /* background-color: #393d51; */
-    height: 30px;
-    line-height: 30px;
-    color: #FFFDFD;
-    font-size: 14px;
-    padding-right: 15px;
-}
-
-.menu-item:hover {
-    background-color: rgb(245, 245, 245);
-    font-size: 14px;
-    color: #393d51;
-}
-
-/* 打横菜单上面的菜单项 */
-.menu-group {
-    position: relative;
-    float: left;
-    font-family: "Microsoft YaHei";
-    font-size: 14px;
-    font-weight: bolder;
-    white-space: nowrap;
-    -moz-user-select: none;
-    height: 33px;
-    line-height: 33px;
-    vertical-align: middle;
-    margin-top: 0px;
-    margin-left: 0px;
-    margin-right: 0px;
-    padding-top: 0px;
-    padding-left: 0px;
-    padding-right: 0px;
-    background: none;
-    color: #ffffff;
-}
-
-.menu-group:hover {
-    background-color: rgb(245, 245, 245);
-    color: rgb(58, 62, 81);
-}
-
-/*--------------------------------------menu样式结束------------------------------------------------*/
-
-/*--------------------------------------照片样式----------------------------------------------------*/
-/* 工作照 */
-.photo {
-    width: 102px;
-    height: 142px;
-    border: 1px solid #cccccc;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    box-sizing: border-box;
-    overflow: hidden;
-    float: left;
-}
-
-.photo img {
-    max-height: 100%;
-    max-width: 100%;
-}
-
-/*个性照*/
-.personalPhoto {
-    width: 100px;
-    height: 100px;
-    border: 1px solid #cccccc;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    box-sizing: border-box;
-    overflow: hidden;
-    border-radius: 50%;
-    background: #fff;
-}
-
-.personalPhoto img {
-    max-width: 100%;
-    max-height: 100%;
-}
-
-/* 小个性照*/
-.personalPhoto-small {
-    width: 60px;
-    height: 60px;
-    overflow: hidden;
-    border-radius: 50%;
-    border: 1px solid #ccc;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    float: left;
-    margin-left: 11px;
-    margin-top: 8px;
-    box-sizing: border-box;
-    background: #fff;
-}
-
-.personalPhoto-small img {
-    max-height: 100%;
-    max-width: 100%;
-}
-
-/*--------------------------------------照片样式结束------------------------------------------------*/
-
-/*--------------------------------------content样式------------------------------------------------*/
-.content-div {
-    position: relative;
-    overflow: auto;
-    box-sizing: border-box;
-    padding: 12px 8px 17px 8px;
-    color: #666;
-    font-size: 14px;
-}
-
-.content-div input[type='text'],
-.content-div input[type='number'] {
-    border: 1px solid transparent;
-    padding-left: 0px;
-}
-
-/*-------------------------------------content样式结束--------------------------------------------*/
-
-/*------------------------------------轻量级弹窗-------------------------------*/
-.lightDialog-div {
-    background: #f7f7f7;
-    box-sizing: border-box;
-    border: 1px solid #ebebeb;
-    border-radius: 3px;
-}
-
-.lightDialog-title {
-    height: 37px;
-    line-height: 37px;
-    padding-left: 10px;
-    position: relative;
-    box-sizing: border-box;
-    background-color: #f2f2f2;
-}
-
-/*------------------------------------轻量级弹窗结束----------------------------*/
-
-/*------------------------------------帮助弹窗样式------------------------------*/
-.help-div {
-    background: #e6f2ff;
-    border-radius: 3px;
-    color: #fff;
-}
-
-.help {
-    font-size: 14px;
-    color: #686868;
-    line-height: 20px;
-    margin-top: 5px;
-    margin-bottom: 5px;
-}
-
-.help-title {
-    display: block;
-    padding-bottom: 20px;
-    font-size: 20px;
-    color: #000;
-    text-align: center;
-    margin-top: 15px;
-}
-
-.help-title1 {
-    font-size: 18px;
-    color: #001111;
-    line-height: 30px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-}
-
-.help-title2 {
-    font-size: 16px;
-    color: #111;
-    line-height: 24px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-}
-
-.help-item {
-    font-size: 14px;
-    color: #111;
-    background: url(image/item-text.png) 29px 11px no-repeat;
-    padding-left: 38px;
-    box-sizing: border-box;
-    line-height: 22px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-}
-
-.help-highlight {
-    font-size: 14px;
-    color: #2b368f;
-    line-height: 20px;
-    margin-top: 5px;
-    margin-bottom: 5px;
-}
-
-.help-highlightTitle {
-    display: block;
-    padding-bottom: 20px;
-    font-size: 20px;
-    color: #2b368f;
-    text-align: center;
-    margin-top: 15px;
-}
-
-.help-highlightTitle1 {
-    font-size: 18px;
-    color: #2b368f;
-    line-height: 30px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-}
-
-.help-highlightTitle2 {
-    font-size: 16px;
-    color: #2b368f;
-    line-height: 24px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-}
-
-.help-highlightItem {
-    font-size: 14px;
-    color: #2b368f;
-    background: url(image/item-text.png) 29px 11px no-repeat;
-    padding-left: 38px;
-    box-sizing: border-box;
-    line-height: 22px;
-    margin-bottom: 5px;
-    margin-top: 5px;
-}
-
-/* 帮助窗口边框、背景色 */
-.smallHelp-div {
-    background: #6c9ddb;
-    border-radius: 3px;
-    padding-bottom: 16px;
-    padding-left: 18px;
-    padding-right: 18px;
-    color: #fff;
-}
-
-.smallHelp-div::before {
-    content: "";
-    width: 0px;
-    height: 0px;
-    border-top: none;
-    border-bottom: 15px solid #6c9ddb;
-    border-left: 0px solid transparent;
-    border-right: 15px solid transparent;
-    position: absolute;
-    top: -12px;
-    left: 15px;
-}
-
-.smallHelp {
-    font-size: 14px;
-    color: #fff;
-    margin-top: 5px;
-}
-
-/* 帮助标题(文章顶部居中的那个) */
-.smallHelp-title {
-    font-size: 20px;
-    color: #fff;
-    height: 48px;
-    line-height: 48px;
-    text-align: center;
-}
-
-/* 一级标题 */
-.smallHelp-title1 {
-    font-size: 18px;
-    color: #fff;
-}
-
-/* 二级标题 */
-.smallHelp-title2 {
-    font-size: 16px;
-    color: #fff;
-}
-
-/* 项目 */
-.smallHelp-item {
-    font-size: 14px;
-    color: #fff;
-    background: url(image/item-text.png) 29px 5px no-repeat;
-    padding-left: 38px;
-}
-
-.smallHelp-highlight {
-    font-size: 14px;
-    color: #2b368f;
-    margin-top: 5px;
-}
-
-/* 帮助标题(文章顶部居中的那个) */
-.smallHelp-highlightTitle {
-    font-size: 20px;
-    color: #2b368f;
-    height: 48px;
-    line-height: 48px;
-    text-align: center;
-}
-
-/* 一级标题 */
-.smallHelp-highlightTitle1 {
-    font-size: 18px;
-    color: #2b368f;
-}
-
-/* 二级标题 */
-.smallHelp-highlightTitle2 {
-    font-size: 16px;
-    color: #2b368f;
-}
-
-/*------------------------------------帮助弹窗样式结束--------------------------*/
-
-/*------------------------------------弹窗样式-------------------------------*/
-/*关闭按钮*/
-.dialog-closeButton {
-    background: url(image/dialog-closeButton.png) center center no-repeat;
-}
-
-.dialog-closeButton:hover {
-    background: url(image/dialog-closeButton-hover.png) center center no-repeat;
-}
-
-.dialog-closeButton:active {
-    background: url(image/dialog-closeButton-active.png) center center no-repeat;
-}
-
-/* 帮助按钮 */
-.dialog-helpButton {
-    background: url(image/dialog-helpButton.png) center center no-repeat;
-}
-
-.dialog-helpButton:hover {
-    background: url(image/dialog-helpButton-hover.png) center center no-repeat;
-}
-
-.dialog-helpButton:active {
-    background: url(image/dialog-helpButton-active.png) center center no-repeat;
-}
-
-/* 下载按钮 */
-.dialog-downloadButton {
-    background: url(image/dialog-downloadButton.png) center center no-repeat;
-}
-
-.dialog-downloadButton:hover {
-    background: url(image/dialog-downloadButton-hover.png) center center no-repeat;
-}
-
-.dialog-downloadButton:active {
-    background: url(image/dialog-downloadButton-active.png) center center no-repeat;
-}
-
-/* 打钩按钮 */
-.dialog-okButton {
-    background: url(image/dialog-okButton.png) center center no-repeat;
-}
-
-.dialog-okButton:hover {
-    background: url(image/dialog-okButton-hover.png) center center no-repeat;
-}
-
-.dialog-okButton:active {
-    background: url(image/dialog-okButton-active.png) center center no-repeat;
-}
-
-/* 编辑选项卡按钮 */
-.dialog-setButton {
-    background: url(image/dialog-setButton.png) center center no-repeat;
-}
-
-.dialog-setButton:hover {
-    background: url(image/dialog-setButton-hover.png) center center no-repeat;
-}
-
-.dialog-setButton:active {
-    background: url(image/dialog-setButton-active.png) center center no-repeat;
-}
-
-/* 编辑个人选值按钮 */
-.dialog-setValueButton {
-    background: url(image/dialog-setValueButton.png) center center no-repeat;
-}
-
-.dialog-setValueButton:hover {
-    background: url(image/dialog-setValueButton-hover.png) center center no-repeat;
-}
-
-.dialog-setValueButton:active {
-    background: url(image/dialog-setValueButton-active.png) center center no-repeat;
-}
-
-/* 编辑帮助按钮 */
-.dialog-setHelpButton {
-    background: url(image/dialog-setHelpButton.png) center center no-repeat;
-}
-
-.dialog-setHelpButton:hover {
-    background: url(image/dialog-setHelpButton-hover.png) center center no-repeat;
-}
-
-.dialog-setHelpButton:active {
-    background: url(image/dialog-setHelpButton-active.png) center center no-repeat;
-}
-
-/* 收藏按钮 */
-.dialog-favoriteButton {
-    background: url(image/dialog-favoriteButton.png) center center no-repeat;
-}
-
-.dialog-favoriteButton:hover {
-    background: url(image/dialog-favoriteButton-hover.png) center center no-repeat;
-}
-
-.dialog-favoriteButton:active {
-    background: url(image/dialog-favoriteButton-active.png) center center no-repeat;
-}
-
-/* 已收藏按钮 */
-.dialog-favoriteOnButton {
-    background: url(image/dialog-favoriteButton-hover.png) center center no-repeat;
-}
-
-.dialog-favoriteOnButton:hover {
-    background: url(image/dialog-favoriteButton-hover.png) center center no-repeat;
-}
-
-.dialog-favoriteOnButton:hover {
-    background: url(image/dialog-favoriteButton.png) center center no-repeat;
-}
-
-/*弹窗遮罩层*/
-.dialog-mask {
-    position: absolute;
-    top: 0%;
-    left: 0%;
-    width: 100%;
-    height: 100%;
-    -moz-opacity: 0.2;
-    opacity: .20;
-    filter: alpha(opacity=20);
-    background-color: rgba(0, 0, 0, 1);
-}
-
-/*------------------------------------弹窗样式结束-------------------------------*/
-
-/*------------------------------------toolbar样式------------------------*/
-.toolbar-button {
-    border: none;
-    outline: none;
-    display: inline-block;
-    width: 28px;
-    height: 28px;
-    border-radius: 2px;
-    overflow: hidden;
-    font-size: 12px;
-    color: #276bab;
-    text-align: center;
-}
-
-.toolbar-button:hover {
-    background-color: #6c9ed7;
-    color: #fff;
-}
-
-.toolbar-button:active {
-    background-color: #276ab0;
-    color: #fff;
-}
-
-.toolbar-button-selected {
-    border: none;
-    outline: none;
-    display: inline-block;
-    width: 28px;
-    height: 28px;
-    background-color: #276ab0;
-    color: #fff;
-    overflow: hidden;
-    border-radius: 2px;
-}
-
-/*div加背景颜色*/
-.toolbar-div {
-    background-color: #f7f7f7;
-    border-radius: 2px;
-    font-size: 14px;
-    color: #6c9ed7;
-}
-
-.floatToolbar-div {
-    background-color: rgba(255, 255, 255, .7);
-    border-radius: 2px;
-    font-size: 14px;
-    color: #666;
-    box-shadow: none;
-    border: none;
-}
-
-/*------------------------------------toolbar样式结束------------------------*/
-
-/*------------------------------------large样式-------------------------------*/
-.largeVWarningProgress-div {
-    width: 15px;
-    background-color: #e1e1e1;
-}
-
-.largeVWarningProgress-done {
-    width: 15px;
-    background-color: #ff0000;
-}
-
-/*------------------------------------large样式结束-------------------------------*/
-
-/*------------------------------------warningProgress样式------------------------*/
-.warningProgress-div {
-    background-color: #ebebeb;
-    height: 3px;
-    border-radius: 1px;
-}
-
-.warningProgress-done {
-    background-color: #f00;
-    height: 3px;
-    border-radius: 1px;
-}
-
-/*------------------------------------warningProgress样式结束------------------------*/
-
-/*---------------------------------------login样式-----------------------------------*/
-
-.login-wrapper-top {
-    width: 510px;
-    height: 100%;
-    position: absolute;
-    right: 0;
-    background-size: 100% 100%;
-    background-color: rgba(255, 255, 255, 0.2);
-}
-
-.login-div {
-    width: 434px;
-    height: 496px;
-    position: absolute;
-    left: 50%;
-    top: 50%;
-    transform: translate(-50%, -50%);
-    box-shadow: 5px 0px 5px 0px #000000;
-    background: #f7f7f7;
-    border-radius: 4px;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-}
-
-.logo {
-    float: left;
-    margin-top: 41px;
-    margin-bottom: 41px;
-    /* margin-left: 52px; */
-    width: 348px;
-    height: 98px;
-    background-size: 100% !important;
-}
-
-.form-wrapper {
-    display: inline-block;
-    float: right;
-    /* width: 383px;
-    height: 267px; */
-    /* position: relative; */
-    box-sizing: border-box;
-    /* padding-top: 27px;
-    padding-left: 44px; */
-}
-
-.form-wrapper form {
-    width: 100%;
-    height: 100%;
-    /* position: relative; */
-}
-
-.form-wrapper .form-wrapper-row {
-    display: block;
-    width: 359px;
-    height: 37px;
-    position: relative;
-    overflow: hidden;
-    margin-bottom: 16px;
-}
-
-/*登录页输入框的*/
-.login-div input[type="text"],
-.login-div input[type="password"],
-.login-div .goon {
-    width: calc(100% - 48px);
-    height: 37px;
-    box-sizing: border-box;
-    margin-right: 0px;
-    /* padding-left: 12px; */
-    /* outline: none; */
-    background: #fff;
-    font-size: 14px;
-    border: 1px solid #575D6D !important;
-    border-radius: 0 4px 4px 0;
-    color: #999999;
-    box-sizing: border-box;
-    outline: none;
-}
-
-/* 登录页验证码输入框 */
-.login-div .login-yzm_input {
-    text-indent: 120px;
-}
-
-.login-div .goon {
-    text-indent: 10px;
-}
-
-.login-div .form-icon {
-    display: inline-block;
-    width: 46px;
-    height: 36px;
-    float: left;
-    border-radius: 4px 0 0 4px;
-    background-size: 40%;
-    background-position: center;
-    border: 1px solid #575D6D;
-    /* margin-right: 13px; */
-}
-
-.login-div .loginScanCodeBox {
-    display: flex !important;
-    position: relative !important;
-    justify-content: space-between !important;
-}
-
-.ksmm {
-    width: 17px;
-    height: 11px;
-    display: inline-block;
-    position: absolute;
-    right: 8px;
-    top: 8px;
-}
-
-.header_yzmimg {
-    position: absolute;
-    left: 48px;
-    top: 1px;
-    width: 120px;
-    height: 35px;
-}
-
-.login-div .bottom-button {
-    margin: 0px;
-}
-
-.zdspDiv {
-    position: absolute;
-}
-
-.ic {
-    z-index: 2
-}
-
-select {
-    appearance: none;
-    -moz-appearance: none;
-    -webkit-appearance: none;
-}
-
-.goon {
-    /* border: 1px solid rgba(0, 0, 0, 0);
-    width: calc(100% - 48px);
-    height: 37px;
-    box-sizing: border-box;
-    margin-right: 0px;
-
-    outline: none;
-    font-size: 14px;
-    color: #999;
-    border-radius: 2px;
-    appearance: none;
-    background: rgba(0, 0, 0, 0); */
-}
-
-.sp {
-    position: relative;
-    padding-left: 33px;
-    bottom: 21px;
-    width: 240px;
-}
-
-
-.bottom-container {
-    width: 1000px;
-    height: 2px;
-    position: absolute;
-    left: 50% !important;
-    top: 50% !important;
-    margin-left: -500px;
-    margin-top: 155px;
-}
-
-
-.resetpwddiv,
-.phonelogindiv {
-    display: inline-block;
-    position: relative;
-
-}
-
-.login {
-    position: relative;
-    width: 80px;
-    text-align: center !important;
-}
-
-.phoneloginmask,
-.resetpwdmask {
-    width: 100%;
-    text-align: center;
-    line-height: 33px;
-    outline: medium;
-    /* color: rgb(72, 99, 164); */
-    font-size: 16px;
-
-    border-radius: 5px;
-    position: absolute;
-    top: 0;
-}
-
-/*登录次数*/
-.login-sca {
-
-    display: inline-block;
-    position: absolute;
-    left: 14px;
-    bottom: 10px;
-    display: flex;
-    flex-direction: column;
-
-}
-
-.login-sc {
-    margin-bottom: 5px;
-}
-
-.link_gs a {
-    position: fixed;
-    right: 40px;
-    bottom: 30px;
-}
-
-.link_bbh {
-    position: fixed;
-    right: 40px;
-    bottom: 60px;
-}
-
-#msgDiv::before {
-    position: absolute;
-    content: '';
-    top: -12px;
-    right: 13px;
-    z-index: 9999;
-}
-
-.Start-banben {
-    color: #fff;
-    font-size: 18px;
-    text-align: right;
-    position: fixed;
-    bottom: 7%;
-    right: 3%;
-    width: 100%;
-    font-family: "SIL Hei";
-}
-
-.Start-copyright {
-    color: #fff;
-    font-size: 18px;
-    text-align: right;
-    position: fixed;
-    right: 3%;
-    bottom: 3%;
-    width: 100%;
-    font-family: "黑体";
-}
-
-#trianglebottomright {
-    width: 40px;
-    height: 40px;
-}
-
-.bottomright {
-    width: 100%;
-    height: 100%;
-    box-sizing: border-box;
-    position: absolute;
-    right: 0;
-    background-color: #FFF;
-    border-radius: 5px;
-    bottom: 0;
-    padding: 8px;
-}
-
-.bottomright-small {
-    position: absolute;
-    right: 8px;
-    bottom: 8px;
-}
-
-.qrcode-text {
-    font-family: "SIL Hei";
-    font-size: 14px;
-    line-height: 24px;
-}
-
-/*整个大的背景图*/
-.login-pageBackground {
-    width: 100vw;
-    height: 100vh;
-    position: fixed;
-    left: 0px;
-    top: 0px;
-    background: url(image/bgpic.png) center center no-repeat;
-    background-size: 100% 100%;
-}
-
-/*中间(线)左边部份*/
-.login-pageLeftLine {
-    background: linear-gradient(to right, rgba(108, 157, 192, 0), rgba(108, 157, 192, 1));
-    width: 500px;
-    height: 2px;
-    display: inline-block;
-
-}
-
-/*中间(线)右边部份*/
-.login-pageRightLine {
-    background: linear-gradient(to left, rgba(108, 157, 192, 0), rgba(108, 157, 192, 1));
-    width: 500px;
-    height: 2px;
-    display: inline-block;
-    float: right;
-}
-
-/*倒影*/
-.login-pageShadow {
-    width: 668px;
-    height: 65px;
-    background: linear-gradient(180deg, rgb(145, 165, 195, 0.15), rgba(145, 165, 195, 0));
-    border-radius: 3px;
-    position: absolute;
-    left: 50% !important;
-    top: 50% !important;
-    margin-left: -333px;
-    margin-top: 180px;
-}
-
-/*二次登录页登录区域*/
-.login-translucentDiv {
-    background: #f7f7f7;
-    border-radius: 4px;
-    box-shadow: 5px 0px 5px 0px #000000;
-    font-size: 16px;
-    color: #000;
-    font-weight: 400;
-}
-
-/*登录页登录区域*/
-.login-div {
-    /* background: url(image/login-div.png) center center no-repeat; */
-}
-
-/*登录页版权信息*/
-.login-copyright {
-    color: #fff;
-    font-size: 20px;
-}
-
-/*登录错误次数*/
-.login-used {
-    border: 1px solid #cacbcc;
-}
-
-.login-unused {
-    width: 10px !important;
-    height: 10px !important;
-    border: none !important;
-    background-color: #EF5D0C;
-}
-
-/*登录页版本信息*/
-.login-version {
-    color: #fff;
-    font-size: 20px;
-}
-
-/*锁屏页登录区域*/
-.login-unlockDiv {
-    background: url(image/sp-bg.png);
-}
-
-/*锁屏页输入框字体颜色*/
-.login-unlockInput {
-    color: #4f83b2;
-}
-
-/*锁屏页箭头图标*/
-.icon-enter {
-    /* background: url(image/icon-enter.png); */
-    background-image: url(image/icon-enter.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.icon-enter:hover {
-    background-image: url(image/icon-enter-hover.png);
-    background-repeat: no-repeat;
-    background-position: center;
-}
-
-/*锁屏页时间*/
-.desktop-time {
-    font-size: 60px;
-    color: #fff;
-}
-
-
-.login-translucentDiv input[type='text'],
-.login-translucentDiv input[type='password'] {
-    background: #fff;
-    font-size: 14px;
-    border: 1px solid #575D6D !important;
-    border-radius: 4px;
-    color: #999999;
-    outline: none;
-}
-
-/*------------------------------------login样式结束---------------------------------*/
-
-/*--------------------------content-vSeperator样式---------------------------------------*/
-.content-vSeperator-left {
-    width: 1px;
-    height: 100%;
-    position: relative;
-    background-color: #6c9ed7;
-    display: inline-block;
-    position: relative;
-    vertical-align: top;
-}
-
-.content-vSeperator-left span {
-    width: 11px;
-    height: 35px;
-    background: url(image/handlevbtn.png) center center no-repeat;
-    position: absolute;
-    bottom: 0px;
-    right: 0px;
-    z-index: 99999999999;
-}
-
-.content-vSeperator-left span:hover::after {
-    content: "";
-    width: 23px;
-    height: 12px;
-    display: inline-block;
-    background: url(image/handlevbtn-cursor.png) center center no-repeat;
-    position: absolute;
-    bottom: 6px;
-    left: -5px;
-}
-
-.content-vSeperator {
-    width: 1px;
-    height: 100%;
-    position: relative;
-    background-color: #6c9ed7;
-    display: inline-block;
-    position: relative;
-    vertical-align: top;
-}
-
-.content-vSeperator span {
-    width: 11px;
-    height: 35px;
-    background: url(image/handlevbtn-r.png) center center no-repeat;
-    position: absolute;
-    bottom: 0px;
-    left: 0px;
-    z-index: 99999999999;
-}
-
-.content-vSeperator span:hover::after {
-    content: "";
-    width: 23px;
-    height: 12px;
-    display: inline-block;
-    background: url(image/handlevbtn-cursor.png) center center no-repeat;
-    position: absolute;
-    bottom: 6px;
-    left: -5px;
-}
-
-/*--------------------------content-vSeperator样式结束---------------------------------------*/
-
-/*--------------------------sideList样式---------------------------------------*/
-.sideList {
-    color: #333;
-    font-size: 14px;
-    height: 30px;
-    line-height: 30px;
-}
-
-.sideList:hover {
-    background-color: #c7e4fa;
-}
-
-/*--------------------------sideList样式结束---------------------------------------*/
-
-/*--------------------------iconList样式------------------------------------------*/
-.iconList-dim {
-    font-size: 14px;
-    color: #666;
-    line-height: 14px;
-    margin-left: 5px;
-    box-sizing: border-box;
-}
-
-.iconList-highlight {
-    color: #6c9ddb;
-    font-weight: bold;
-    font-size: 12px;
-}
-
-.iconList-boxDiv {
-    border: 1px solid #c2c2c2 !important;
-    border-radius: 2px;
-    font-size: 12px;
-    color: #000;
-}
-
-.iconList {
-    position: relative;
-    float: left;
-    overflow: auto;
-    width: 761px;
-    border: 1px solid #c2c2c2;
-    font-size: 0px;
-    height: 516px;
-    box-sizing: border-box;
-    font-size: 0px;
-    background: transparent;
-    border-top-left-radius: 3px;
-    border-bottom-left-radius: 3px;
-}
-
-/*--------------------------iconList样式结束------------------------------------------*/
-
-/*--------------------------滚动条箭头样式----------------------------------------------*/
-/* 滚动条上箭头 */
-.scrollbar-up {
-    border-top: none;
-    border-right: 5px solid transparent;
-    border-left: 5px solid transparent;
-    border-bottom: 8px solid #c4c4c4;
-}
-
-/* 滚动条下箭头 */
-.scrollbar-down {
-    border-top: 8px solid #c4c4c4;
-    border-right: 5px solid transparent;
-    border-left: 5px solid transparent;
-    border-bottom: none;
-}
-
-/* 滚动条左箭头 */
-.scrollbar-left {
-    border-top: 5px solid transparent;
-    border-right: 8px solid #c4c4c4;
-    border-bottom: 5px solid transparent;
-    border-left: none;
-}
-
-/* 滚动条右箭头 */
-.scrollbar-right {
-    border-top: 5px solid transparent;
-    border-left: 8px solid #c4c4c4;
-    border-bottom: 5px solid transparent;
-    border-right: none;
-}
-
-/*--------------------------滚动条箭头样式结束-----------------------------------------*/
-
-/* 录入框内嵌标签 2019.9.11  */
-.builtinLabel-focus {
-    border: 1px solid #6b9ed6 !important;
-    box-shadow: 2px 2px 2px #dedede;
-    word-break: break-all;
-    z-index: 9999 !important;
-    border-radius: 3px;
-    display: inline-block;
-}
-
-.builtinLabel {
-    border: 1px solid #ebebeb;
-    border-radius: 3px;
-    z-index: 9999;
-    display: inline-block;
-    vertical-align: middle;
-
-}
-
-.builtinLabel span {
-    background: #ebebeb;
-    float: left;
-    color: #999;
-    text-align: center;
-    line-height: 26px;
-    font-size: 14px;
-    border-radius: 2px 0 0 2px;
-    display: inline-block;
-}
-
-.builtinLabel-focus span {
-    background: #ebebeb;
-    float: left;
-    color: #999;
-    text-align: center;
-    line-height: 26px;
-    font-size: 14px;
-    border-radius: 2px 0 0 2px;
-    display: inline-block;
-}
-
-.builtinLabel input {
-    border: none;
-    color: #000;
-    outline: none;
-    background: white;
-    font-size: 14px;
-}
-
-.builtinLabel-focus input {
-    border: none;
-    color: #000;
-    outline: none;
-    background: white;
-    font-size: 14px;
-}
-
-/************************************************************************mobile样式开始*****************************************************************************/
-/*-------------------------------mobileVWarning样式---------------*/
-.mobileLargeVWarningProgress-div {
-    width: 0.75rem;
-    background-color: #e1e1e1;
-}
-
-.mobileLargeVWarningProgress-done {
-    width: 0.75rem;
-    background-color: #ff0000;
-}
-
-.mobileSmallWarningProgress-div {
-    height: 0.15rem;
-    background-color: #e1e1e1;
-}
-
-.mobileSmallWarningProgress-done {
-    height: 0.15rem;
-    background-color: #ff0000;
-}
-
-/*-------------------------------mobileVWarning样式结束---------------*/
-
-/*------------------------------mobileIcon样式----------------------*/
-/* 菜单图标 */
-/* .mobileIcon-menu{
-    background: #6c9ed7 url(image/meun.png) center center no-repeat;
-    width: 2.25rem;
-    height: 2.25rem;
-    float: right;
-    position: relative;
-    background-size: 1.4rem 1.0rem;
-} */
-/* 菜单图标底部按钮 */
-.mobileList-invertButton {
-    background: #6c9ed7;
-    width: 2.25rem;
-    height: 2.25rem;
-    float: right;
-    position: relative;
-    /* background-size: 1.4rem 1.0rem; */
-}
-
-/* 菜单图标白色三横 */
-.mobileInvertIcon-menu {
-    width: 100%;
-    height: 100%;
-    display: inline-block;
-    background: url(image/mobileInvertIcon-menu.png) no-repeat center center;
-    background-size: 70%;
-}
-
-.mobileSmallIcon-add {
-    width: .9rem;
-    height: .9rem;
-    background: url(image/icon-add.png) center center no-repeat;
-    background-size: contain;
-    border: none;
-    outline: none;
-}
-
-.mobileSmallIcon-change {
-    width: .9rem;
-    height: .9rem;
-    background: url(image/changeIcon.png) center center no-repeat;
-    background-size: contain;
-    border: none;
-    outline: none;
-}
-
-.mobileSmallIcon-disable {
-    width: .9rem;
-    height: .9rem;
-    background: url(image/disableIcon.png) center center no-repeat;
-    background-size: contain;
-    border: none;
-    outline: none;
-}
-
-.mobileSmallIcon-enable {
-    width: .9rem;
-    height: .9rem;
-    background: url(image/icon-enable.png) center center no-repeat;
-    background-size: contain;
-    border: none;
-    outline: none;
-}
-
-.mobileIcon-down {
-    display: inline-block;
-    width: 0.825rem;
-    height: 0.45rem;
-    background: url(image/mobileIcon-down.png) center center no-repeat;
-    background-size: contain;
-    vertical-align: middle;
-    float: right;
-    margin: 0rem;
-    /* 原来的值 */
-    top: 0.8rem;
-
-    /* margin-top: 0.9rem;   杨文俊10/14有改动 
-    margin-right: -5.5rem;   杨文俊10/14有改动*/
-
-    position: absolute;
-    right: 0.8rem;
-    pointer-events: none;
-}
-
-.mobileLargeIcon-playVoice {
-    width: 3.325rem;
-    height: 3.425rem;
-    background: url("image/voice-big.gif") center center no-repeat;
-    background-size: contain;
-}
-
-/*手写按钮*/
-.mobileIcon-pen {
-    width: 3.15rem;
-    height: 1.5rem;
-    background: url(image/mobileButton-pen.png) center center no-repeat;
-    background-size: 3.15rem 1.5rem;
-    margin-left: 0.625rem;
-}
-
-.mobileIcon-pen:active {
-    background: url(image/mobileButton-pen-active.png) center center no-repeat;
-    background-size: 3.15rem 1.5rem;
-}
-
-/*语音按钮*/
-.mobileIcon-voice {
-    width: 4.7rem;
-    height: 1.5rem;
-    background: url(image/mobileButton-voice.png) center center no-repeat;
-    background-size: 4.7rem 1.5rem;
-    margin-left: 0.625rem;
-}
-
-.mobileIcon-voice:active {
-    background: url(image/mobileButton-voice-active.png) center center no-repeat;
-    background-size: 4.7rem 1.5rem;
-}
-
-/*常用语*/
-.mobileIcon-phrase {
-    width: 4.075rem;
-    height: 1.5rem;
-    background: url(image/mobileButton-phrase.png) center center no-repeat;
-    background-size: 4.075rem 1.5rem;
-    margin-left: 0.625rem;
-}
-
-.mobileIcon-phrase:active {
-    background: url(image/mobileButton-phrase-active.png) center center no-repeat;
-    background-size: 4.075rem 1.5rem;
-}
-
-/*删除按钮*/
-.mobileIcon-backspace {
-    width: 1.5rem;
-    height: 1.5rem;
-    background: url(image/mobileButton-backspace.png) center center no-repeat;
-    background-size: 1.5rem 1.5rem;
-    position: absolute;
-    right: 0rem;
-    top: 0rem;
-}
-
-.mobileIcon-backspace:active {
-    background: url(image/mobileButton-backspace-active.png) center center no-repeat;
-}
-
-/*批示录入框中的喇叭图标*/
-.mobileIcon-voiceMsg {
-    display: inline-block;
-    height: 1.5rem;
-    width: 1.8rem;
-    background: url(image/mobileIcon-voiceMsg.png) center center no-repeat;
-    background-size: 1.8rem 1.5rem;
-    box-sizing: border-box;
-    border: none;
-}
-
-/*批示录入框中的播放录音图标*/
-.mobileIcon-playVoice {
-    display: inline-block;
-    height: 1.5rem;
-    width: 1.8rem;
-    background: url(image/mobileIcon-playVoice.gif) center center no-repeat;
-    background-size: 1rem 1rem;
-    box-sizing: border-box;
-    border: none;
-}
-
-/*删除按钮*/
-.mobileIcon-backspace {
-    background-image: url(image/mobileButton-backspace-big.png);
-    background-size: 1.175rem 1.45rem;
-}
-
-.mobileIcon-backspace:active {
-    background-image: url(image/mobileButton-backspace-big-active.png);
-    background-size: 1.175rem 1.45rem;
-}
-
-/*灰色小圆点*/
-.mobileIcon-dimPoint {
-    width: 0.25rem;
-    height: 0.25rem;
-    display: inline-block;
-    background-color: #acacac;
-    float: right;
-    margin-top: 0.625rem;
-    margin-right: -0.25rem;
-    border-radius: 50%;
-}
-
-/* 高亮小圆点 */
-.mobileIcon-highlightPoint {
-    width: 0.25rem;
-    height: 0.25rem;
-    display: inline-block;
-    background-color: #f99138;
-    margin-top: 0.625rem;
-    float: right;
-    border-radius: 50%;
-    margin-right: -0.25rem;
-}
-
-.mobileIcon-media {
-    display: inline-block;
-    width: 0.875rem;
-    height: 1.075rem;
-    background: url(image/mobileIcon-media.png) center center no-repeat;
-    background-size: 0.875rem 1.075rem;
-    float: left;
-}
-
-.mobileIcon-attachment {
-    display: inline-block;
-    width: 0.875rem;
-    height: 1.075rem;
-    background: url(image/mobileIcon-attachment.png) center center no-repeat;
-    background-size: 0.875rem 1.075rem;
-    float: left;
-}
-
-.mobileIcon-checked {
-    background: url(image/mobileIcon-checked.png) center center no-repeat;
-    background-size: contain;
-    display: inline-block;
-    width: 0.7rem;
-    height: 0.45rem;
-}
-
-/*移动端待办i图标*/
-.mobileIcon-i {
-    vertical-align: middle;
-    background: url(image/mobileSmallButton-i.png)center center no-repeat;
-    width: 1.25rem;
-    height: 1.25rem;
-    cursor: url(image/cur.ico), default !important;
-    background-size: 88%;
-}
-
-/*------------------------------mobileIcon样式结束----------------------*/
-
-/*-----------------------------mobile选项卡样式--------------------------*/
-.mobileTab-div {
-    background-color: #ebebeb;
-    height: 2.25rem;
-    width: 100%;
-    box-sizing: border-box;
-    padding: 0 0.375rem;
-    overflow-x: auto;
-    position: absolute;
-}
-
-.mobileTab-div::after {
-    content: "";
-    display: inline-block;
-    width: 1.25rem;
-    height: 2.125rem;
-    /* background: -webkit-linear-gradient(left, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1));
-    background: -o-linear-gradient(right, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1));
-    background: -moz-linear-gradient(right, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1));
-    background: linear-gradient(to right, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1)); */
-    position: fixed;
-    right: 0rem;
-    top: 0rem;
-}
-
-.mobileTab-selected {
-    display: inline-block;
-    padding: 0 0.875rem;
-    height: 100%;
-    font-size: 0.75rem;
-    color: #2b368f;
-    box-sizing: border-box;
-    height: 2.25rem;
-    line-height: 2.25rem;
-    border-bottom: 0.125rem solid #6c9ed7;
-    /* margin: 0 0.25rem; */
-    float: left;
-}
-
-.mobileTab {
-    display: inline-block;
-    padding: 0 0.875rem;
-    height: 100%;
-    font-size: 0.75rem;
-    color: #2b368f;
-    box-sizing: border-box;
-    height: 2.25rem;
-    line-height: 2.25rem;
-    /* margin: 0 0.25rem; */
-    color: #000000;
-    float: left;
-}
-
-.mobileSearchTab-selected {
-    font-size: 0.75rem;
-    color: #2b368f;
-    display: inline-block;
-    height: 100%;
-    box-sizing: border-box;
-    border-bottom: 0.125rem solid #6c9ed7;
-    line-height: 2.25rem;
-    padding: 0 0.65rem;
-    margin: 0 0.45rem;
-}
-
-.mobileSearchTab {
-    font-size: 0.75rem;
-    color: #000;
-    display: inline-block;
-    height: 100%;
-    box-sizing: border-box;
-    line-height: 2.25rem;
-    padding: 0 0.65rem;
-    margin: 0 0.45rem;
-}
-
-.mobileTab-content {
-    margin-top: 2.25rem;
-    height: calc(100% - 2.25rem);
-    box-sizing: border-box;
-}
-
-/*-----------------------------mobile选项卡样式结束--------------------------*/
-
-.mobileDelete-button,
-.mobileAdd-button {
-    width: 1.5rem;
-    height: 1.5rem;
-    background: #999999;
-    color: #fff;
-    text-align: center;
-    line-height: 1.5rem;
-    border-radius: 50%;
-    display: block;
-
-}
-
-.mobileAdd-button {
-    position: relative;
-}
-
-.mobileAdd-button::after {
-    content: "";
-    /* 生成一个空内容 */
-    display: block;
-    /* 使伪元素成为块元素 */
-    width: 100%;
-    /* 适应父元素宽度 */
-    height: 100%;
-    /* 适应父元素高度 */
-    background: url(image/svg_icon/xinzeng.svg) no-repeat center;
-    /* 使用 SVG 作为背景 */
-    background-size: 70%;
-    position: absolute;
-    /* 绝对定位 */
-    top: 0;
-    /* 位置在顶部 */
-    left: 0;
-    /* 位置在左边 */
-    filter: brightness(0) invert(1);
-    /* 将 SVG 颜色改为白色 */
-}
-
-.mobileDelete-button {
-    position: relative;
-
-}
-
-.mobileDelete-button::after {
-    content: "";
-    width: 1rem;
-    height: 2px;
-    display: block;
-    background: white;
-    background-size: 70%;
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    transform: translate(-50%, -50%);
-
-}
-
-.mobileDelete-button:active,
-.mobileAdd-button:active {
-    background-color: #585e6e;
-}
-
-.mobileApply-bg {
-    background-color: #f2f3f4;
-}
-
-/*----------------------------mobileForm样式-------------------------------*/
-.mobileForm-title {
-    font-size: 1rem;
-    width: calc(100% - 20px);
-    margin: 0 auto;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-}
-
-.mobileForm {
-    width: 100%;
-
-}
-
-.mobileForm table {
-    width: calc(100% - 20px);
-    margin: 0.5rem auto 0.5rem auto;
-    border-collapse: collapse;
-    border: 0.05rem solid #d4d6d9;
-    margin-bottom: 1rem;
-}
-
-.mobileForm table tr {
-    border: 0.05rem solid #e6e6e6;
-}
-
-.mobileForm table th {
-    border: 0.05rem solid #e6e6e6;
-    box-sizing: border-box;
-    color: #000;
-    font-size: 1rem;
-    text-align: right;
-    background-color: #fafafa;
-    padding: 0.4rem 0.65rem 0.4rem 1rem;
-    line-height: 1.2rem;
-    vertical-align: middle;
-    word-break: break-all;
-    white-space: normal;
-}
-
-.mobileForm table td {
-    border: 0.05rem solid #e6e6e6;
-    background-color: #fff;
-    box-sizing: border-box;
-    color: #000000;
-    font-size: 1rem;
-    text-align: left;
-    padding: 0.4rem 0.75rem 0.4rem 1rem;
-    line-height: 1.2rem;
-    vertical-align: middle;
-    position: relative;
-}
-
-.mobileForm input {
-    padding-left: 0;
-}
-
-/*----------------------------mobileForm样式结束-------------------------------*/
-
-/*-----------------------------mobile图片样式---------------------------------*/
-.mobilePhoto {
-    width: 3.75rem;
-    height: 5.25rem;
-    border: 0.025rem solid #d1d1d1;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    overflow: hidden;
-}
-
-.mobilePhoto img {
-    max-height: 100%;
-    max-width: 100%;
-}
-
-.mobilePersonalPhoto {
-    width: 4rem;
-    height: 4rem;
-    border: 1px solid #d1d1d1;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    box-sizing: border-box;
-    overflow: hidden;
-    border-radius: 50%;
-    background: #fff;
-    margin: 0.35rem 0.525rem 0 0.525rem;
-}
-
-.mobilePersonalPhoto img {
-    max-height: 100%;
-    max-width: 100%;
-
-}
-
-/*-----------------------------mobile图片样式---------------------------------*/
-
-/*-----------------------------mobile底部区域----------------------------------*/
-.mobileBottom-div {
-    position: fixed;
-    bottom: 0px;
-    left: 0px;
-    z-index: 100;
-    width: 100%;
-}
-
-.mobileBottom-down-div {
-    display: flex;
-    background-color: #e6e6e6;
-    border-top: 0.075rem solid #e6e6e6;
-    overflow: hidden;
-}
-
-.mobileBottom-button {
-    border: none;
-    outline: none;
-    width: 0;
-    /* width: calc(50% - 0.075rem); */
-    flex: 1;
-    height: 3rem;
-    color: #000;
-    font-size: 1rem;
-    box-sizing: border-box;
-    background-color: #fafafb;
-    -webkit-appearance: none;
-    border-radius: 0rem;
-    border-left: 0.075rem solid #e6e6e6;
-    border-right: 0.075rem solid #e6e6e6;
-}
-
-.mobileBottom-button:first-child {
-    border-left: none !important;
-}
-
-.mobileBottom-button:last-child {
-    border-right: none !important;
-}
-
-.mobileBottom-button:active {
-    color: #fff;
-    background-color: #585e6e;
-}
-.mobileBottom-active-button{
-    color: #659af1;
-}
-
-/*-----------------------------mobile底部区域结束------------------------------*/
-
-/*----------------------------mobile分隔线样式----------------------------*/
-.mobileContent-hSeperator {
-    position: relative;
-    z-index: 99;
-    width: 100%;
-    height: 0.2rem;
-    background-color: #6c9ed7;
-    border-radius: 4px;
-    box-shadow: 0px 2px 1px #415e7f;
-}
-
-.mobileContent-hSeperator span {
-    right: 0px;
-    position: absolute;
-    top: -0.875rem;
-    background-image: url(image/mobileContent-hSeperator.png);
-    width: 3.45rem;
-    height: 1.075rem;
-    display: inline-block;
-    background-size: cover;
-}
-
-.mobileContent-vSeperator {
-    display: inline-block;
-    width: .15rem;
-    height: 100%;
-    background-color: #6c9ed7;
-    border-radius: 0.1rem;
-    position: relative;
-}
-
-.mobileContent-vSeperator span {
-    display: inline-block;
-    width: 0.6rem;
-    height: 1.6rem;
-    background: url(image/mobileContent-vSeperator.gif) no-repeat;
-    background-size: contain;
-    background-position-y: bottom;
-    margin-left: -0.6rem;
-    position: absolute;
-    left: 0rem;
-    bottom: 0rem;
-}
-
-/*----------------------------mobile分隔线样式结束----------------------------*/
-
-/*----------------------------mobileButton样式---------------------------*/
-/* 批示历史意见列表聚合行右面点击可展开折叠行的按钮 */
-.mobileFreeButton {
-    width: 3.2rem;
-    height: 3.2rem;
-    background-color: #f2f2f2;
-    float: right;
-    box-shadow: -0.025rem -0.05rem 0 0.025rem #c8daee;
-    font-size: 0px;
-}
-
-/* (左滑拉出的)更多按钮 */
-.mobileMoreButton {
-    width: 3.15rem;
-    background-color: #6ca0d3;
-    float: left;
-    font-size: .75rem;
-    color: #fff;
-    line-height: 100%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    margin-left: -1px
-}
-
-/*20200410新增样式-begin*-by 杨文俊/
-/*列表左滑拉出红色更多按钮*/
-.mobileList-warningInvertButton {
-    width: 3.15rem;
-    background-color: red;
-    float: left;
-    font-size: .75rem;
-    color: #fff;
-    line-height: 100%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    margin-left: -1px
-}
-
-/*相片图标(附件)*/
-.mobileIcon-camera {
-    width: 2.75rem;
-    height: 2.15rem;
-    background-image: url(image/mobileIcon-camera.png);
-    background-position: center center;
-    background-repeat: no-repeat;
-    background-size: 50%;
-    display: inline-block;
-}
-
-/*录像图标(附件)*/
-.mobileIcon-videocamera {
-    width: 2.75rem;
-    height: 2.15rem;
-    background-image: url(image/mobileIcon-videocamera.png);
-    background-position: center center;
-    background-repeat: no-repeat;
-    background-size: 50%;
-    display: inline-block;
-}
-
-/*麦克风图标(附件)*/
-.mobileIcon-mike {
-    width: 2.75rem;
-    height: 2.15rem;
-    background-image: url(image/mobileIcon-mike.png);
-    background-position: center center;
-    background-repeat: no-repeat;
-    background-size: 44%;
-    display: inline-block;
-}
-
-/*文件图标(附件)*/
-.mobileIcon-file {
-    width: 2.75rem;
-    height: 2.15rem;
-    background-image: url(image/mobileIcon-file.png);
-    background-position: center center;
-    background-repeat: no-repeat;
-    background-size: 50%;
-    display: inline-block;
-}
-
-/*(分隔图标的)浅色纵向分隔线*/
-.mobileVLine-dim {
-    width: 0.1rem;
-    height: 1.725rem;
-    background: #ebf0f2;
-    display: inline-block;
-    vertical-align: super;
-}
-
-/*20200410新增样式-end*/
-
-.mobileButton {
-    border-radius: 0.05rem;
-    box-shadow: -0.05rem 0.05rem 0.025rem rgba(108, 158, 215, .4);
-    -webkit-appearance: none;
-    background-size: contain;
-    background-color: #f2f2f2;
-}
-
-.mobileButton:active {
-    background-color: #6c9fd3;
-}
-
-.mobileBuiltinButton {
-    background-color: #f2f2f2;
-    border-radius: 0.05rem;
-    box-shadow: -0.05rem 0rem 0.025rem rgba(108, 158, 215, .4);
-    -webkit-appearance: none;
-}
-
-.mobileBuiltinButton:active {
-    background-color: #6c9fd3;
-}
-
-/*----------------------------mobileButton样式结束-----------------------*/
-
-/*----------------------------mobileList样式----------------------------------*/
-.mobileList-largeHighlight {
-    font-size: 1.35rem;
-    color: #6c9ed7;
-}
-
-.mobileList-highlight {
-    font-size: 0.75rem;
-    color: #2b368f;
-    height: 2rem;
-    line-height: 2rem;
-}
-
-.mobileList {
-    height: 2rem;
-    line-height: 2rem;
-    font-size: 0.75rem;
-    color: #4c4c4c;
-}
-
-/*----------------------------mobileList样式结束----------------------------------*/
-
-/*-----------------------------mobileIcon样式-------------------------------------*/
-.mobileIcon-openFolder {
-    width: 0.75rem;
-    height: 0.675rem;
-    float: left;
-    margin: 0.425rem 0.425rem 0 0.35rem;
-    display: inline-block;
-    background: url(image/mobileList-expandedGroupIcon.png) center center no-repeat;
-    background-size: cover;
-}
-
-.mobileIcon-folder {
-    width: 0.75rem;
-    height: 0.675rem;
-    float: left;
-    margin: 0.425rem 0.425rem 0 0.35rem;
-    display: inline-block;
-    background: url(image/mobileList-groupIcon.png) center center no-repeat;
-    background-size: cover;
-}
-
-.mobileIcon-point {
-    width: 0.75rem;
-    height: 0.675rem;
-    float: left;
-    margin: 0.425rem 0.425rem 0 0.35rem;
-    display: inline-block;
-    background: url(image/mobileList-itemIcon.png) center center no-repeat;
-    background-size: cover;
-}
-
-.mobileIcon-doc {
-    width: 0.75rem;
-    height: 0.675rem;
-    float: left;
-    margin: 0.425rem 0.425rem 0 0.35rem;
-    display: inline-block;
-    background: url(image/mobileList-icon.png) center center no-repeat;
-    background-size: cover;
-}
-
-/*-----------------------------mobileIcon样式结束-------------------------------------*/
-
-
-/*----------------------------mobile底部区域样式-------------------------------------*/
-.mobileBottom-up-div {
-    border-top: 0.075rem solid #e6e6e6;
-    background: #e6e6e6;
-    height: 3rem;
-    box-sizing: border-box;
-    background-color: #e1e1e1;
-    display: flex;
-
-
-}
-
-.mobileBottom-up-left-div {
-    flex: 1;
-    height: 100%;
-    display: flex;
-    align-items: center;
-    font-size: 1rem;
-    justify-content: center;
-}
-
-.mobileBottom-up-right-div {
-    flex: 3;
-    background: #fff;
-    height: 100%;
-}
-
-.mobileBottom-up-right-div input {
-    width: 100%;
-    height: 100%;
-    padding-left: 12px;
-    font-size: 1rem;
-}
-
-.mobileBottom-up-right-div input:focus {
-    border: none;
-}
-
-.mobileBottom-up-right-div input::placeholder {
-    font-size: 1rem;
-}
-
-/*----------------------------mobile底部区域样式-------------------------------------*/
-
-
-/*---------------------------mobileLongCardList样式----------------------------------*/
-.mobileLongCardList-div {}
-
-.mobileLongCardList-highlight {
-    color: #2b368f;
-    font-size: 0.75rem;
-    line-height: 1rem;
-}
-
-li.mobileLongCardList-highlight {
-    margin-bottom: .8rem;
-}
-
-.mobileLongCardList-dim {
-    font-size: 0.65rem;
-    color: #666666;
-    float: left;
-    line-height: 0.9rem;
-    max-height: 2.7rem;
-    overflow: hidden;
-}
-
-.mobileLongCardList {
-    font-size: 0.65rem;
-    line-height: 0.9rem;
-    color: #000;
-    margin-top: 0.175rem;
-}
-
-.mobileLongCardList-thumbnail {
-    max-width: 5.5rem;
-    max-height: 3.1rem;
-    height: 4rem;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    border: 0.05rem solid #edeff2;
-    overflow: hidden;
-    border-radius: 0.125rem;
-    float: left;
-    margin-right: 0.3rem;
-}
-
-.mobileLongCardList-thumbnail img {
-    max-width: 100%;
-    max-height: 100%;
-}
-
-/*---------------------------mobileLongCardList样式结束----------------------------------*/
-
-/*-------------------------mobileList样式-----------------------*/
-.mobileList-background:nth-child(odd) {
-    background-color: #fff;
-}
-
-.mobileList-background:nth-child(even) {
-    background-color: #fafafa;
-}
-
-/*-------------------------mobileList样式结束-----------------------*/
-
-/*------------------------mobile线样式------------------------------*/
-.mobileHLine {
-    border-bottom: 0.05rem solid #edeff2;
-}
-
-.mobileHLine-bold {
-    border-bottom: 0.25rem solid #edeff2;
-}
-
-.mobileHLine-highlight {
-    border-bottom: 0.05rem solid #6c9ed7;
-}
-
-.mobileVLine-highlight {
-    border-right: 0.2rem solid #6ca0d3;
-}
-
-.mobileVline-leftHighlight {
-    border-left: 0.2rem solid #71a0ce;
-}
-
-.mobileVLine-warning {
-    border-right: 0.25rem solid #ff0000;
-    border-top-right-radius: 0.05rem;
-    /*杨文俊10.24新增*/
-    border-bottom-right-radius: 0.05rem;
-    /*杨文俊10.24新增*/
-}
-
-.mobileVLine-dashed {
-    border-right: 0.025rem dashed #c2c2c2;
-}
-
-.mobileVLine-leftDashed {
-    border-left: 0.05rem dashed #c2c2c2;
-}
-
-/*------------------------mobile线样式------------------------------*/
-
-/*-----------------------mobileSearch样式--------------------------*/
-.mobileSearch-div {
-    box-sizing: border-box;
-    margin-left: 0.675rem;
-    margin-right: 0.825rem;
-    width: 95%;
-    display: flex;
-    /* justify-content: space-between; */
-    gap: 5px;
-}
-.mobileSearch-input-div{
-    position: relative;
-    flex: 1;
-    border: 1px solid #eceded;
-    background: white;
-    border-radius: 4px;
-}
-.mobileSearch-div input[type="text"] {
-    border: none;
-    font-size: 1rem;
-    width: calc(100% - 3rem - 2px);
-    box-sizing: border-box;
-    padding-left: 0.75rem;
-    height: 2rem;
-    line-height: 2rem;
-    color: #000;
-    
-    
-}
-
-.mobileSearch-div input[type='text']::-webkit-input-placeholder,
-.mobileSearch-div input[type='number']::-webkit-input-placeholder {
-    color: #999;
-    font-family: "SimHei", Georgia, Serif !important;
-    font-size: 0.75rem;
-}
-
-.mobileSearch-div input[type='text']::-moz-placeholder,
-.mobileSearch-div input[type='number']::-moz-placeholder {
-    font-size: 0.75rem;
-    font-family: "SimHei", Georgia, Serif !important;
-    color: #999;
-}
-
-.mobileSearch-div input[type='text']:-moz-placeholder,
-.mobileSearch-div input[type='number']:-moz-placeholder {
-    font-size: 0.75rem;
-    font-family: "SimHei", Georgia, Serif !important;
-    color: #999;
-}
-
-.mobileSearch-div input[type='text']:-ms-input-placeholder,
-.mobileSearch-div input[type='number']:-ms-input-placeholder {
-    font-size: 0.75rem;
-    font-family: "SimHei", Georgia, Serif !important;
-    color: #999;
-}
-.mobileSearch-icon{
-    width: calc(3rem - 2px);
-    height: calc(2rem - 2px);
-    display: block;
-    background: #fff url(image/svg_icon/chazhao.svg) no-repeat center;
-    background-size: 35%;
-    position: absolute;
-    right: 1px;
-    top: 1px;
-    border-radius: 4px;
-}
-.mobileSearch-icon::before{
-    display:block;
-    content: '';
-    width: 1px;
-    height: 1rem;
-    background-color: #c3c6ca;
-    position: absolute;
-    top: 50%;
-    transform: translateY(-50%);
-}
-/* 移动端搜索上的二维码区域 */
-.mobileSearch-qrcode{
-    background-size: 90%;
-    border-radius:  4px;
-    border: 1px solid #eceded;
-    width: 2rem;
-    height: 2rem;
-}
-.mobileSearch-button {
-    width: auto;
-    height: auto;
-    padding: 0 1rem;
-    border: 1px solid #eceded;
-    outline: none;
-    background-color: #fff;
-    text-align: center;
-    /* line-height: 1.375rem; */
-    font-size: 1rem;
-    color: #585d6e;
-    letter-spacing: 0.1rem;
-    border-radius: 4px;
-    margin: unset;
-    display: flex;
-    align-items: center;
-    -webkit-appearance: none;
-}
-.mobileSearch-button:active {
-    background-color: #eceded;
-    color: #fff;
-}
-/*-----------------------mobileSearch样式结束--------------------------*/
-
-/*-----------------------mobilePopup样式--------------------------------*/
-.mobilePopup-div {
-    border: 0.05rem solid #b7b7b7;
-    border-top: 0.125rem solid #6d9edb;
-    display: inline-block;
-    max-height: 12.957rem;
-    overflow: auto;
-
-    box-shadow: 0.1rem 0.1rem 0.225rem rgba(0, 0, 0, .13);
-    box-sizing: border-box;
-    background-color: #fff;
-    position: absolute;
-}
-
-.mobilePopup-div select {
-    width: 100%;
-}
-
-.mobilePopupList {
-    height: 1.95rem;
-    line-height: 1.95rem;
-    padding: 0 1.4rem;
-    font-size: 0.75rem;
-    color: #000;
-    background: #fff;
-    position: relative;
-}
-
-/*-----------------------mobilePopup样式结束--------------------------------*/
-
-/*------------------------mobileBox样式---------------------------------*/
-.mobileBox {
-    border: .05rem solid #75a3dd;
-    border-radius: 0.325rem;
-}
-
-.mobileBox-dim {
-    border: 0.05rem solid #c2c8cc !important;
-    border-radius: 0.5rem !important;
-    box-sizing: border-box;
-}
-
-/* 校验码边框 */
-.mobileDownBox {
-    border-radius: 0rem 0rem .3rem .3rem;
-    border: 0.1rem solid #6c9ddb;
-    height: 4.5rem;
-    position: absolute;
-    padding: .1rem 0.1rem;
-    box-sizing: border-box;
-    top: 0px;
-    /* left: 0px; */
-    width: calc(100% - 0.25rem);
-    background: #fff;
-    font-size: 0.8rem;
-    color: #4b4b4b;
-    transform: translate(-50%, 0%);
-    left: 50%;
-}
-
-.mobileBox-dashed {
-    border: 0.025rem dashed #6c9ed7;
-    border-radius: .1rem;
-}
-
-.iconList-boxDiv-selected {
-    border: 1px solid rgba(255, 0, 0, 1);
-}
-
-.mobileBox-highlight {
-    border: .05rem solid #6c9ed7;
-    border-radius: 0.325rem;
-}
-
-/*------------------------mobileBox样式结束---------------------------------*/
-
-/*------------------------smallFlashMsg样式----------------------------------*/
-.smallFlashMsg-div {
-    background: #7ca6cc;
-    color: #fff;
-    font-size: 14px;
-    border-radius: 1px;
-}
-
-.smallFlashMsg-div::after {
-    content: "";
-    display: inline-block;
-    width: 0px;
-    height: 0px;
-    position: absolute;
-    left: 18px;
-    bottom: -3px;
-    border-top: 3px solid #7ca6cc;
-    border-right: 3px solid transparent;
-    border-left: 3px solid transparent;
-    border-bottom: none;
-}
-
-/* ------------------------smallFlashMsg样式结束---------------------------------- */
-
-/*-------------------------mobile按钮样式---------------------------------*/
-/*on按钮*/
-.mobileContent-onButton {
-    display: inline-block;
-    font-size: 0.75rem;
-    height: 1.3rem;
-    line-height: 1.3rem;
-    outline: none;
-    color: #6c9ddb;
-    background: url(image/true.png) right bottom no-repeat;
-    background-size: 0.7rem 0.7rem;
-    background-color: #ebebeb;
-    border-radius: 0.1rem;
-    overflow: hidden;
-    padding: 0rem 0.5rem;
-    vertical-align: middle;
-    border: none;
-    box-sizing: border-box;
-    border-bottom: 0.08rem solid #6c9ddb;
-}
-
-/*off按钮*/
-.mobileContent-offButton {
-    display: inline-block;
-    font-size: 0.75rem;
-    height: 1.3rem;
-    line-height: 1.3rem;
-    outline: none;
-    color: #999999;
-    background: url(image/false.png) right bottom no-repeat;
-    background-size: 0.7rem 0.7rem;
-    background-color: #ebebeb;
-    border-radius: 0.1rem;
-    overflow: hidden;
-    padding: 0px 0.5rem;
-    vertical-align: middle;
-    border: none;
-    box-sizing: border-box;
-}
-
-/*-------------------------mobile按钮样式结束---------------------------------*/
-
-/*-------------------------启动页样式-----------------------------------------*/
-/* 右下角的公司链接文字 */
-.mobileStart-copyright {
-    color: #fff;
-    font-size: .7rem;
-    text-align: center;
-    position: fixed;
-    bottom: 2.3%;
-    width: 100%;
-    font-family: "宋体";
-}
-
-/* 登录页背景 */
-.mobileStart-background {
-    width: 100%;
-    height: 100%;
-    background: url(image/mobilestartbg.jpg) center center no-repeat;
-}
-
-/* 登录页小图标 */
-.mobileIcon-user {
-    width: 1rem;
-    height: 1.05rem;
-    position: absolute;
-    top: 0.95rem;
-    left: 2rem;
-    background-image: url(image/app-login/account.png);
-    background-size: 100%;
-}
-
-.mobileIcon-password {
-    width: 1rem;
-    height: 1.2rem;
-    position: absolute;
-    top: 0.95rem;
-    left: 2rem;
-    background-image: url(image/app-login/lock.png);
-    background-size: 100% 98%;
-}
-
-.mobileLogin-button {
-    font-size: 0.85rem;
-    border: none;
-    background: #6c9bdf;
-    color: white;
-    border-radius: 0.3rem;
-}
-
-/*-------------------------启动页样式结束-----------------------------------------*/
-
-
-/*--------------------------mobileHelp样式---------------------------------------*/
-.mobileHelp-bottomDiv {
-    height: 2.65rem;
-    position: fixed;
-    bottom: 0rem;
-    left: 0rem;
-    border-top: 0.025rem solid #a6b7dc;
-    width: 100%;
-    background-color: #d8ecff;
-    display: flex;
-    flex-direction: row;
-    justify-content: center;
-    align-items: center;
-}
-
-.mobileHelp-bottomButton {
-    width: 7.175rem;
-    height: 1.8rem;
-    outline: none;
-    -webkit-appearance: none;
-    border: none;
-    background-color: #6c9dda;
-    color: #fff;
-    border-radius: 0.1rem;
-    margin: 0 0.45rem;
-    font-size: 0.75rem;
-}
-
-.mobileHelp-div {
-    width: 100%;
-    box-sizing: border-box;
-    padding: 0 0.25rem;
-    background-color: #e6f2ff;
-    margin-bottom: 2.65rem;
-    height: 100%;
-}
-
-.mobileHelp-titleText {
-    /*新增加*/
-    line-height: 2.375rem;
-    color: #000;
-    font-family: "黑体";
-    font-size: 0.9rem;
-}
-
-.mobileHelp-title1Text {
-    /*原mobileHelp-title1重命名*/
-    font-size: 0.75rem;
-    color: #000;
-    font-family: "黑体";
-    line-height: 1.25rem;
-}
-
-.mobileHelp-text {
-    /*原mobileHelp重命名*/
-    font-size: 0.75rem;
-    font-family: "宋体";
-    line-height: 1rem;
-}
-
-.mobileLightDialog-title {
-    width: 100%;
-    text-align: center;
-    height: 2.375rem;
-}
-
-/*--------------------------mobileHelp样式---------------------------------------*/
-
-/*-------------------------------mobileObjectpicker样式--------------------------*/
-.mobileInput-div {
-    border: 1px solid transparent;
-    outline: none;
-    border-radius: 2px;
-    font-size: 0.75rem;
-    color: #000;
-    /*  line-height: 1.1rem;*/
-    background-color: transparent;
-    box-sizing: border-box;
-    position: relative;
-    min-height: 1.4rem;
-    /* min-height: 28px;*/
-    display: inline-block;
-    vertical-align: middle;
-    width: 100%;
-    overflow: hidden;
-    /* vertical-align: top; */
-    /*left: 10px;*/
-    /*margin-left: :;em;*/
-    height: 1.4rem;
-    /*min-height: unset !important;*/
-}
-
-.mobileInput-div textarea {
-    line-height: 1.4rem;
-}
-
-.mobileInput-selectedDiv {
-    border: 1px solid #6b9ed6 !important;
-    box-shadow: 2px 2px 2px #dedede;
-    box-sizing: border-box;
-    word-break: break-all;
-    z-index: 9999 !important;
-    margin-left: 0.4rem;
-    height: 1.4rem !important;
-    /*height:28px !important;*/
-    /*min-height: unset !important;*/
-}
-
-/*-------------------------------mobileObjectpicker样式结束--------------------------*/
-
-/*-------------------------------mobileList样式----------------------------*/
-.mobileList-smallDim {
-    font-size: 0.7rem;
-    line-height: 0.7rem;
-    color: #666666;
-}
-
-.mobileLargeIcon-smile {
-    background: url(image/smile.png) no-repeat;
-    display: block;
-    width: 2.6rem;
-    height: 2.6rem;
-    margin: 0 auto;
-    background-size: 100%;
-}
-
-/*-------------------------------mobileList样式结束----------------------------*/
-
-/*-----------------------------叶老大说先不改的代码------------------------*/
-.form-model {
-    position: absolute;
-    width: 98%;
-    height: 68%;
-    left: 0px;
-    top: 0px;
-    border: 1px solid #e4e4e4;
-    overflow-y: auto
-}
-
-.operate-div {
-    width: 100%;
-    z-index: 1000;
-    position: fixed;
-    _position: absolute;
-    bottom: 110px;
-}
-
-#app {
-    display: flex;
-    flex-direction: column;
-    /* position:absolute */
-    position: fixed;
-    overflow: auto;
-    top: 0px;
-    left: 0px;
-    right: 0px;
-    bottom: 0px;
-    background: rgb(255, 255, 255);
-    /* -webkit-touch-callout: none !important;
-    -webkit-user-select: ​none !important;
-    -webkit-touch-callout: none !important;
-    user-select: none !important;
-    user-select: none;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none; */
-}
-
-#app *::-webkit-scrollbar {
-    display: none
-}
-
-#app * {
-    user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-
-    /* -webkit-touch-callout: none; 
-	-webkit-user-select: none;
-	-khtml-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	 user-select: none; */
-}
-
-/* #app div,input,textarea {
-		  -webkit-user-select: auto;
-		  margin: 0px;
-		  padding: 0px;
-		  outline: none;
-		} */
-
-#app iframe {
-    width: 100%;
-    min-height: 0px;
-    height: 100vh;
-    border: none;
-}
-
-/*文字输入框*/
-.cms-editor .content_edit1 {
-    min-height: 1.5rem;
-    max-height: 3.25rem;
-    display: block;
-    width: 8.3rem;
-    border-radius: 0.05rem;
-    -webkit-user-select: text;
-    -webkit-appearance: none;
-    background-color: #fafafa;
-    margin-left: 0.625rem;
-    box-sizing: border-box;
-    padding-right: 1.5rem;
-    padding-top: 0.07rem;
-    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
-    line-height: 1.5rem;
-    font-size: 1rem;
-}
-
-.cms-editor .content_edit {
-    min-height: 1.5rem;
-    max-height: 3.25rem;
-    display: block;
-    width: 12.75rem;
-    border-radius: 0.05rem;
-    -webkit-user-select: text;
-    -webkit-appearance: none;
-    background-color: #fafafa;
-    margin-left: 0.625rem;
-    box-sizing: border-box;
-    padding-right: 1.5rem;
-    padding-top: 0.07rem;
-    overflow: hidden;
-    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
-    line-height: 1.5rem;
-    font-size: 1rem;
-}
-
-.cms-editor .content_div {
-    min-height: 1.5rem;
-    max-height: 3.24rem;
-    display: block;
-    width: 13.7rem;
-    border-radius: 0.05rem;
-    -webkit-user-select: text;
-    -webkit-appearance: none;
-    background-color: #fafafa;
-    margin-left: 0.625rem;
-    box-sizing: border-box;
-    padding-right: 1.5rem;
-    overflow: hidden;
-    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
-    line-height: 1.5rem;
-    font-size: 1rem;
-    overflow: auto;
-}
-
-.cms-editor .content_start {
-    min-height: 1.5rem;
-    max-height: 3.25rem;
-    display: block;
-    width: 8.3rem;
-    border-radius: 0.05rem;
-    -webkit-user-select: text;
-    -webkit-appearance: none;
-    background-color: #fafafa;
-    margin-left: 0.625rem;
-    box-sizing: border-box;
-    padding-right: 1.5rem;
-    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
-    line-height: 1.5rem;
-    font-size: 1rem;
-}
-
-.itemNum {
-    display: inline-block;
-    width: 2rem;
-    height: 2rem;
-    background-color: #f2f2f2;
-    text-align: center;
-    line-height: 2rem;
-    font-size: 1.35rem;
-    color: #6c9ed7;
-    float: right;
-}
-
-[v-cloak] {
-    display: none !important;
-}
-
-.plsh-box {
-    width: calc(100% - 0.5rem);
-    border: 0.025rem solid #c2c2c2;
-    border-radius: 0.15rem;
-    height: 3.25rem;
-    margin: 0.625rem 0rem;
-    margin-left: 0.25rem;
-    overflow: hidden;
-    background-color: #fafafa;
-    box-shadow: 0rem 0.025rem 0.025rem rgba(0, 0, 0, .15);
-}
-
-.plsh-left {
-    float: left;
-    height: 100%;
-}
-
-.plsh-right {
-    float: right;
-}
-
-.plsh-icon {
-    float: left;
-    width: 1.375rem;
-    height: 100%;
-}
-
-.plsh-text {
-    width: 13.5rem;
-    height: 2.25rem;
-    line-height: 1.125rem;
-    box-sizing: border-box;
-    margin-top: 0.5rem;
-    color: #2b368f;
-    float: left;
-    overflow: hidden;
-}
-
-.plsh-right {
-    float: right;
-    height: 100%;
-    width: 3.25rem;
-}
-
-.plsh-button {
-    color: #6c9ed7;
-    width: 100%;
-    height: 3.25rem;
-    box-sizing: border-box;
-    line-height: 3.25rem;
-    box-shadow: -0.025rem 0.025rem 0.025rem rgba(0, 0, 174, .15);
-    line-height: 3.25rem;
-    background-color: #f2f2f2;
-    font-size: 0.75rem;
-    text-align: center;
-}
-
-div {
-    -webkit-user-select: text;
-}
-
-/*--------------------------------叶老大说先不改的代码----------------------*/
-
-/*--------------------------------photowripe插件样式,叶老大说先不改----------*/
-.pswp {
-    display: none;
-    position: absolute;
-    width: 100%;
-    height: 100%;
-    left: 0;
-    top: 0;
-    overflow: hidden;
-    -ms-touch-action: none;
-    touch-action: none;
-    z-index: 1500;
-    -webkit-text-size-adjust: 100%;
-    -webkit-backface-visibility: hidden;
-    outline: none;
-}
-
-.pswp * {
-    -webkit-box-sizing: border-box;
-    box-sizing: border-box;
-}
-
-.pswp img {
-    max-width: none;
-}
-
-.pswp--animate_opacity {
-    opacity: 0.001;
-    will-change: opacity;
-    -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
-    transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
-}
-
-.pswp--open {
-    display: block;
-}
-
-.pswp--zoom-allowed .pswp__img {
-    cursor: -webkit-zoom-in;
-    cursor: -moz-zoom-in;
-    cursor: zoom-in;
-}
-
-.pswp--zoomed-in .pswp__img {
-    cursor: -webkit-grab;
-    cursor: -moz-grab;
-    cursor: grab;
-}
-
-.pswp--dragging .pswp__img {
-    cursor: -webkit-grabbing;
-    cursor: -moz-grabbing;
-    cursor: grabbing;
-}
-
-.pswp__bg {
-    position: absolute;
-    left: 0;
-    top: 0;
-    width: 100%;
-    height: 100%;
-    background: #000;
-    opacity: 0;
-    -webkit-transform: translateZ(0);
-    transform: translateZ(0);
-    -webkit-backface-visibility: hidden;
-    will-change: opacity;
-}
-
-.pswp__scroll-wrap {
-    position: absolute;
-    left: 0;
-    top: 0;
-    width: 100%;
-    height: 100%;
-    overflow: hidden;
-}
-
-.pswp__container,
-.pswp__zoom-wrap {
-    -ms-touch-action: none;
-    touch-action: none;
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-}
-
-.pswp__container,
-.pswp__img {
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-    -webkit-tap-highlight-color: transparent;
-    -webkit-touch-callout: none;
-}
-
-.pswp__zoom-wrap {
-    position: absolute;
-    width: 100%;
-    -webkit-transform-origin: left top;
-    -ms-transform-origin: left top;
-    transform-origin: left top;
-    -webkit-transition: -webkit-transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
-    transition: transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
-}
-
-.pswp__bg {
-    will-change: opacity;
-    -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
-    transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
-}
-
-.pswp--animated-in .pswp__bg,
-.pswp--animated-in .pswp__zoom-wrap {
-    -webkit-transition: none;
-    transition: none;
-}
-
-.pswp__container,
-.pswp__zoom-wrap {
-    -webkit-backface-visibility: hidden;
-}
-
-.pswp__item {
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    overflow: hidden;
-}
-
-.pswp__img {
-    position: absolute;
-    width: auto;
-    height: auto;
-    top: 0;
-    left: 0;
-}
-
-.pswp__img--placeholder {
-    -webkit-backface-visibility: hidden;
-}
-
-.pswp__img--placeholder--blank {
-    background: #222;
-}
-
-.pswp--ie .pswp__img {
-    width: 100% !important;
-    height: auto !important;
-    left: 0;
-    top: 0;
-}
-
-.pswp__error-msg {
-    position: absolute;
-    left: 0;
-    top: 50%;
-    width: 100%;
-    text-align: center;
-    line-height: 16px;
-    margin-top: -8px;
-    color: #CCC;
-}
-
-.pswp__error-msg a {
-    color: #CCC;
-    text-decoration: underline;
-}
-
-.pswp__button {
-    width: 44px;
-    height: 44px;
-    position: relative;
-    background: none;
-    cursor: pointer;
-    overflow: visible;
-    -webkit-appearance: none;
-    display: block;
-    border: 0;
-    padding: 0;
-    margin: 0;
-    float: right;
-    opacity: 0.75;
-    -webkit-transition: opacity 0.2s;
-    transition: opacity 0.2s;
-    -webkit-box-shadow: none;
-    box-shadow: none;
-}
-
-.pswp__button:focus,
-.pswp__button:hover {
-    opacity: 1;
-}
-
-.pswp__button:active {
-    outline: none;
-    opacity: 0.9;
-}
-
-.pswp__button::-moz-focus-inner {
-    padding: 0;
-    border: 0;
-}
-
-.pswp__ui--over-close .pswp__button--close {
-    opacity: 1;
-}
-
-.pswp__button,
-.pswp__button--arrow--left:before,
-.pswp__button--arrow--right:before {
-    background: url(default-skin.png) 0 0 no-repeat;
-    background-size: 264px 88px;
-    width: 44px;
-    height: 44px;
-}
-
-@media (-webkit-min-device-pixel-ratio: 1.1),
-(-webkit-min-device-pixel-ratio: 1.09375),
-(min-resolution: 105dpi),
-(min-resolution: 1.1dppx) {
-
-    .pswp--svg .pswp__button,
-    .pswp--svg .pswp__button--arrow--left:before,
-    .pswp--svg .pswp__button--arrow--right:before {
-        background-image: url(default-skin.svg);
-    }
-
-    .pswp--svg .pswp__button--arrow--left,
-    .pswp--svg .pswp__button--arrow--right {
-        background: none;
-    }
-}
-
-.pswp__button--close {
-    background-position: 0 -44px;
-}
-
-.pswp__button--share {
-    background-position: -44px -44px;
-}
-
-.pswp__button--fs {
-    display: none;
-}
-
-.pswp--supports-fs .pswp__button--fs {
-    display: block;
-}
-
-.pswp--fs .pswp__button--fs {
-    background-position: -44px 0;
-}
-
-.pswp__button--zoom {
-    display: none;
-    background-position: -88px 0;
-}
-
-.pswp--zoom-allowed .pswp__button--zoom {
-    display: block;
-}
-
-.pswp--zoomed-in .pswp__button--zoom {
-    background-position: -132px 0;
-}
-
-.pswp--touch .pswp__button--arrow--left,
-.pswp--touch .pswp__button--arrow--right {
-    visibility: hidden;
-}
-
-.pswp__button--arrow--left,
-.pswp__button--arrow--right {
-    background: none;
-    top: 50%;
-    margin-top: -50px;
-    width: 70px;
-    height: 100px;
-    position: absolute;
-}
-
-.pswp__button--arrow--left {
-    left: 0;
-}
-
-.pswp__button--arrow--right {
-    right: 0;
-}
-
-.pswp__button--arrow--left:before,
-.pswp__button--arrow--right:before {
-    content: '';
-    top: 35px;
-    background-color: rgba(0, 0, 0, 0.3);
-    height: 30px;
-    width: 32px;
-    position: absolute;
-}
-
-.pswp__button--arrow--left:before {
-    left: 6px;
-    background-position: -138px -44px;
-}
-
-.pswp__button--arrow--right:before {
-    right: 6px;
-    background-position: -94px -44px;
-}
-
-.pswp__counter,
-.pswp__share-modal {
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-}
-
-.pswp__share-modal {
-    display: block;
-    background: rgba(0, 0, 0, 0.5);
-    width: 100%;
-    height: 100%;
-    top: 0;
-    left: 0;
-    padding: 10px;
-    position: absolute;
-    z-index: 1600;
-    opacity: 0;
-    -webkit-transition: opacity 0.25s ease-out;
-    transition: opacity 0.25s ease-out;
-    -webkit-backface-visibility: hidden;
-    will-change: opacity;
-}
-
-.pswp__share-modal--hidden {
-    display: none;
-}
-
-.pswp__share-tooltip {
-    z-index: 1620;
-    position: absolute;
-    background: #FFF;
-    top: 56px;
-    border-radius: 2px;
-    display: block;
-    width: auto;
-    right: 44px;
-    -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
-    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
-    -webkit-transform: translateY(6px);
-    -ms-transform: translateY(6px);
-    transform: translateY(6px);
-    -webkit-transition: -webkit-transform 0.25s;
-    transition: transform 0.25s;
-    -webkit-backface-visibility: hidden;
-    will-change: transform;
-}
-
-.pswp__share-tooltip a {
-    display: block;
-    padding: 8px 12px;
-    color: #000;
-    text-decoration: none;
-    line-height: 18px;
-}
-
-.pswp__share-tooltip a:hover {
-    text-decoration: none;
-    color: #000;
-}
-
-.pswp__share-tooltip a:first-child {
-    border-radius: 2px 2px 0 0;
-}
-
-.pswp__share-tooltip a:last-child {
-    border-radius: 0 0 2px 2px;
-}
-
-.pswp__share-modal--fade-in {
-    opacity: 1;
-}
-
-.pswp__share-modal--fade-in .pswp__share-tooltip {
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-}
-
-.pswp--touch .pswp__share-tooltip a {
-    padding: 16px 12px;
-}
-
-a.pswp__share--facebook:before {
-    content: '';
-    display: block;
-    width: 0;
-    height: 0;
-    position: absolute;
-    top: -12px;
-    right: 15px;
-    border: 6px solid transparent;
-    border-bottom-color: #FFF;
-    -webkit-pointer-events: none;
-    -moz-pointer-events: none;
-    pointer-events: none;
-}
-
-a.pswp__share--facebook:hover {
-    background: #3E5C9A;
-    color: #FFF;
-}
-
-a.pswp__share--facebook:hover:before {
-    border-bottom-color: #3E5C9A;
-}
-
-a.pswp__share--twitter:hover {
-    background: #55ACEE;
-    color: #FFF;
-}
-
-a.pswp__share--pinterest:hover {
-    background: #CCC;
-    color: #CE272D;
-}
-
-a.pswp__share--download:hover {
-    background: #DDD;
-}
-
-.pswp__counter {
-    position: absolute;
-    left: 0;
-    top: 0;
-    height: 44px;
-    line-height: 44px;
-    color: #FFF;
-    opacity: 0.75;
-    padding: 0 10px;
-}
-
-.pswp__caption {
-    position: absolute;
-    left: 0;
-    bottom: 0;
-    width: 100%;
-    min-height: 44px;
-}
-
-.pswp__caption small {
-    color: #BBB;
-}
-
-.pswp__caption__center {
-    text-align: left;
-    max-width: 420px;
-    margin: 0 auto;
-    padding: 10px;
-    line-height: 20px;
-    color: #CCC;
-}
-
-.pswp__caption--empty {
-    display: none;
-}
-
-.pswp__caption--fake {
-    visibility: hidden;
-}
-
-.pswp__preloader {
-    width: 44px;
-    height: 44px;
-    position: absolute;
-    top: 0;
-    left: 50%;
-    margin-left: -22px;
-    opacity: 0;
-    -webkit-transition: opacity 0.25s ease-out;
-    transition: opacity 0.25s ease-out;
-    will-change: opacity;
-    direction: ltr;
-}
-
-.pswp__preloader__icn {
-    width: 20px;
-    height: 20px;
-    margin: 12px;
-}
-
-.pswp__preloader--active {
-    opacity: 1;
-}
-
-.pswp__preloader--active .pswp__preloader__icn {
-    background: url(preloader.gif) 0 0 no-repeat;
-}
-
-.pswp--css_animation .pswp__preloader--active {
-    opacity: 1;
-}
-
-.pswp--css_animation .pswp__preloader--active .pswp__preloader__icn {
-    -webkit-animation: clockwise 500ms linear infinite;
-    animation: clockwise 500ms linear infinite;
-}
-
-.pswp--css_animation .pswp__preloader--active .pswp__preloader__donut {
-    -webkit-animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite;
-    animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite;
-}
-
-.pswp--css_animation .pswp__preloader__icn {
-    background: none;
-    opacity: 0.75;
-    width: 14px;
-    height: 14px;
-    position: absolute;
-    left: 15px;
-    top: 15px;
-    margin: 0;
-}
-
-.pswp--css_animation .pswp__preloader__cut {
-    position: relative;
-    width: 7px;
-    height: 14px;
-    overflow: hidden;
-}
-
-.pswp--css_animation .pswp__preloader__donut {
-    -webkit-box-sizing: border-box;
-    box-sizing: border-box;
-    width: 14px;
-    height: 14px;
-    border: 2px solid #FFF;
-    border-radius: 50%;
-    border-left-color: transparent;
-    border-bottom-color: transparent;
-    position: absolute;
-    top: 0;
-    left: 0;
-    background: none;
-    margin: 0;
-}
-
-@media screen and (max-width: 1024px) {
-    .pswp__preloader {
-        position: relative;
-        left: auto;
-        top: auto;
-        margin: 0;
-        float: right;
-    }
-}
-
-@-webkit-keyframes clockwise {
-    0% {
-        -webkit-transform: rotate(0deg);
-        transform: rotate(0deg);
-    }
-
-    100% {
-        -webkit-transform: rotate(360deg);
-        transform: rotate(360deg);
-    }
-}
-
-@keyframes clockwise {
-    0% {
-        -webkit-transform: rotate(0deg);
-        transform: rotate(0deg);
-    }
-
-    100% {
-        -webkit-transform: rotate(360deg);
-        transform: rotate(360deg);
-    }
-}
-
-@-webkit-keyframes donut-rotate {
-    0% {
-        -webkit-transform: rotate(0);
-        transform: rotate(0);
-    }
-
-    50% {
-        -webkit-transform: rotate(-140deg);
-        transform: rotate(-140deg);
-    }
-
-    100% {
-        -webkit-transform: rotate(0);
-        transform: rotate(0);
-    }
-}
-
-@keyframes donut-rotate {
-    0% {
-        -webkit-transform: rotate(0);
-        transform: rotate(0);
-    }
-
-    50% {
-        -webkit-transform: rotate(-140deg);
-        transform: rotate(-140deg);
-    }
-
-    100% {
-        -webkit-transform: rotate(0);
-        transform: rotate(0);
-    }
-}
-
-.pswp__ui {
-    -webkit-font-smoothing: auto;
-    visibility: visible;
-    opacity: 1;
-    z-index: 1550;
-}
-
-.pswp__top-bar {
-    position: absolute;
-    left: 0;
-    top: 0;
-    height: 44px;
-    width: 100%;
-}
-
-.pswp__caption,
-.pswp__top-bar,
-.pswp--has_mouse .pswp__button--arrow--left,
-.pswp--has_mouse .pswp__button--arrow--right {
-    -webkit-backface-visibility: hidden;
-    will-change: opacity;
-    -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
-    transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
-}
-
-.pswp--has_mouse .pswp__button--arrow--left,
-.pswp--has_mouse .pswp__button--arrow--right {
-    visibility: visible;
-}
-
-.pswp__top-bar,
-.pswp__caption {
-    background-color: rgba(0, 0, 0, 0.5);
-}
-
-.pswp__ui--fit .pswp__top-bar,
-.pswp__ui--fit .pswp__caption {
-    background-color: rgba(0, 0, 0, 0.3);
-}
-
-.pswp__ui--idle .pswp__top-bar {
-    opacity: 0;
-}
-
-.pswp__ui--idle .pswp__button--arrow--left,
-.pswp__ui--idle .pswp__button--arrow--right {
-    opacity: 0;
-}
-
-.pswp__ui--hidden .pswp__top-bar,
-.pswp__ui--hidden .pswp__caption,
-.pswp__ui--hidden .pswp__button--arrow--left,
-.pswp__ui--hidden .pswp__button--arrow--right {
-    opacity: 0.001;
-}
-
-.pswp__ui--one-slide .pswp__button--arrow--left,
-.pswp__ui--one-slide .pswp__button--arrow--right,
-.pswp__ui--one-slide .pswp__counter {
-    display: none;
-}
-
-.pswp__element--disabled {
-    display: none !important;
-}
-
-.pswp--minimal--dark .pswp__top-bar {
-    background: none;
-}
-
-/*---------------------------------------photowripe插件样式结束-------------------------------*/
-/***************APP报名学员临时样式(571/2019/06/11)*********************/
-#app select {
-    width: 100%;
-    height: 1.4rem;
-    border: none;
-    outline: none;
-    appearance: none;
-    -moz-appearance: none;
-    -webkit-appearance: none;
-    background: url(image/mobileIcon-down.png) no-repeat right center transparent;
-    background-size: 9%;
-    color: #333333;
-    font-size: 0.75rem;
-    padding-right: .8rem;
-}
-
-
-.mobileForm .input-selectedDiv div {
-    padding-left: 7px;
-}
-
-.mobileForm td>select {
-    vertical-align: top;
-}
-
-input[type=date] {
-    border: none;
-    background: url(image/mobileIcon-down.png) no-repeat right center transparent;
-    background-size: 9%;
-    appearance: none;
-    -moz-appearance: none;
-    -webkit-appearance: none;
-    width: 100%;
-    height: 1.4rem;
-    color: #333333;
-    font-size: 0.75rem;
-}
-
-/*****完善个人信息备用*********/
-
-.ry {
-    margin-bottom: 2.5rem;
-}
-
-.ry div input {
-    border: none;
-    height: 1.4rem;
-    vertical-align: top;
-}
-
-.content_nr {
-    display: inline-block;
-    width: 97px;
-    height: 40px;
-    float: left;
-    position: relative;
-    top: 12px;
-}
-
-/*已打钩*/
-.mobileicon-checked_new {
-    display: inline-block;
-    background: url(image/icon-checked.png) center center no-repeat;
-    width: .9rem;
-    height: .7rem;
-    background-size: 100%;
-}
-
-/*未钩*/
-.mobileicon-unchecked_new {
-    display: inline-block;
-    background: url(image/icon-unchecked.png) center center no-repeat;
-    width: .9rem;
-    height: .7rem;
-    background-size: 100%;
-}
-
-/* 2019.8.18 */
-
-/* 选中 */
-.icon-warningFull {
-    width: 17px;
-    height: 17px;
-    background-color: #ff0000;
-    border: 1px solid #6c9ddb;
-}
-
-/* 未选中    */
-.icon-empty {
-    width: 17px;
-    height: 17px;
-    background-color: #ffffff;
-    border: 1px solid #6c9ddb;
-}
-
-
-/* 2019.8.19 */
-.largeInvertIcon-save {
-    width: 25px;
-    height: 28px;
-    background: url(image/largeInvertIcon-save.png);
-    display: inline-block;
-}
-
-/* 2019.8.28 */
-/* 移动端截图 */
-/*
- mobilePlugin-drag 裁剪图片右下角自由拖动的三角形
-mobileDialog-mask 裁剪图片遮罩层
-mobileArea-div  选区的框(裁剪图片的框)
-mobileArea-msg 选区信息(裁剪图片区域宽、高的DIV)
- */
-.mobilePlugin-drag {
-    display: inline-block;
-    bottom: -0.1rem !important;
-    right: -0.1rem !important;
-    width: 1.25rem !important;
-    height: 1.25rem !important;
-    background: url(image/plugin-drag.png) center center no-repeat;
-    background-size: 87%;
-}
-
-.mobileDialog-mask {
-    position: absolute;
-    top: 0%;
-    left: 0%;
-    width: 100%;
-    height: 100%;
-    /* -moz-opacity: 0.2; */
-    /* opacity: .20; */
-    filter: alpha(opacity=20);
-    background-color: rgba(0, 0, 0, .2);
-}
-
-.mobileArea-div {
-    display: block;
-    height: 100%;
-    outline-color: rgba(51, 153, 255, 0.75);
-    outline: 1px solid #39f;
-    overflow: hidden;
-    width: 100%;
-}
-
-.mobileArea-msg {
-    /* display: none; */
-    background-color: #000;
-    opacity: 0.6;
-    color: #fff;
-    position: absolute;
-    z-index: 9999999999;
-}
-
-/* 2019.9.23移动端上下文菜单 */
-.mobileContextMenu-div {
-    background: rgba(0, 0, 0, 0.4);
-
-}
-
-.mobileContextMenu-button {
-    width: 2.5rem;
-    height: 2.5rem;
-    background: #6c9ed7;
-    color: white;
-    line-height: 2.5rem;
-    text-align: center;
-    border-radius: 50%;
-}
-
-/* 2019.9.23移动端刷新按钮 */
-.mobileIcon-refresh {
-    width: 2rem;
-    height: 2rem;
-    background: #d9d9d9 url(image/refresh-app.png)no-repeat center;
-    background-size: 70%;
-    border-radius: 0.25rem;
-    display: inline-block;
-    position: fixed;
-    right: 1rem;
-    top: 1rem;
-    z-index: 30000000;
-}
-
-
-/* 2019.9.24 */
-/* 移动端首页 头像框样式 */
-/* .mobilePersonalPhoto {
-    width: 4.25rem;
-    height: 4.25rem;
-    border: 0.025rem solid #cccccc;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    box-sizing: border-box;
-    border-radius: 50%;
-    background: #fff;
-    margin: 0.35rem 0.525rem 0 0.525rem;
-} */
-
-/* 移动端首页梯形 */
-.mobileProgress-button {
-    float: right;
-    background-color: rgba(237, 239, 240, 1);
-    height: 1.425rem;
-    display: inline-block;
-    line-height: 1.425rem;
-    border-top-right-radius: 0.05rem;
-    border-bottom-right-radius: 0.05rem;
-    font-size: 0.75rem;
-    color: #333;
-    position: relative;
-    text-align: center;
-    padding: 0 0.5rem;
-    box-sizing: border-box;
-    border-top-left-radius: 0.05rem;
-}
-
-/* 移动端首页梯形旁的三角形 */
-.mobileProgress-button:before {
-    content: "";
-    width: 0rem;
-    height: 0rem;
-    border-top: 1.775rem solid transparent;
-    border-bottom: 1.775rem solid rgba(237, 239, 240, 1);
-    border-left: 1.5rem solid transparent;
-    border-right: none;
-    position: absolute;
-    top: -2.12rem;
-    left: -1.2rem;
-}
-
-/* 梯形下边的蓝色线 */
-.mobileProgress-div {
-    background: #c7e2fe;
-    width: 100%;
-    height: 0.275rem;
-    border-bottom: 0.025rem solid #959595;
-}
-
-/* 移动端首页 用户名字 */
-.mobliePlugin-boldText {
-    font-size: 0.75rem;
-    color: #276ab0;
-}
-
-/* 移动端首页 用户提示语 */
-.mobilePlugin-dimText {
-    font-size: 0.75rem;
-    color: #666666;
-}
-
-/* 移动端首页 日程内容 */
-.mobilePlugin-text {
-    width: 12rem;
-    display: inline-block;
-    height: 20px;
-    position: relative;
-    padding: 0.325rem 0rem 0rem;
-    margin-top: 0.3rem;
-    float: right;
-    font-size: 15px;
-    margin-right: 1rem;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    color: #333333;
-}
-
-/* 事务的下边框 */
-.mobilePlugin-largeText {
-    border-bottom: 0.025rem solid #6c9ddb;
-
-}
-
-/* 用于移动端首页事件 右边小icon */
-.mobileIcon-num {
-    width: 0.85rem;
-    height: 0.85rem;
-    border: 0.025rem solid #6c9ddb;
-    display: inline-block;
-    text-align: center;
-    line-height: 0.85rem;
-    margin-right: 0.2rem;
-    position: absolute;
-    right: 0;
-    bottom: 0.35rem;
-    color: #6c9ddb;
-}
-
-/* 2019.9.25 */
-.mobilePlugin-boldText {
-    font-size: 0.68rem;
-    color: black;
-}
-
-/* 2019.9.26 */
-.mobileMiniIcon-start {
-    width: 19px;
-    height: 19px;
-    background: url(image/mobileMiniIcon-start.png) no-repeat;
-    position: absolute;
-    left: 0;
-    bottom: 0;
-}
-
-.mobileMiniIcon-search {
-    width: 19px;
-    height: 19px;
-    background: url(image/mobileMiniIcon-search.png) no-repeat;
-    position: absolute;
-    left: 0;
-    bottom: 0;
-}
-
-.mobileFilter {
-    -webkit-filter: grayscale(100%);
-    -moz-filter: grayscale(100%);
-    -ms-filter: grayscale(100%);
-    -o-filter: grayscale(100%);
-    filter: grayscale(100%);
-    filter: gray;
-    background-color: #e1e1e1;
-    /*2019.11.12 杨文俊增加*/
-
-}
-
-/* 下载页鸽子 2019.10.14 */
-.largeIcon-beacon {
-    background: url(image/gezi.png)center center no-repeat;
-    background-size: 85%;
-}
-
-/* app选择日期 */
-input[type=datetime-local] {
-    width: 100%;
-    height: 100%;
-    min-height: 1rem;
-    position: relative;
-    top: 0;
-    font-size: 0.75rem;
-
-}
-
-
-/* app悬浮菜单 */
-.mobileFloatButton {
-    width: 2rem;
-    height: 2rem;
-    background: #D8D8D8;
-    display: inline-block;
-    border-radius: 0.2rem;
-}
-
-.mobileIcon-menu {
-    width: 100%;
-    height: 100%;
-    display: inline-block;
-    background: url(image/mobileIcon-menu.png) no-repeat center center;
-    background-size: 70%;
-}
-
-/*  灰色小圆角边框 用于审批表单元格当前编辑状态的高亮边框及待办边框 */
-.mobileSmallBox-dim {
-    border: 0.05rem solid #c2c2c2;
-    background-color: #ffffff;
-    border-radius: 0.15rem;
-}
-
-/* 高亮小圆角边框 用于审批表单元格当前编辑状态的高亮边框 */
-.mobileSmallBox-highlight {
-    border: 0.05rem solid #6c9ed7;
-    background-color: #ffffff;
-    border-radius: 0.15rem;
-}
-
-/* app首页横栏蓝色按钮 2019.12.5 */
-.grxxTarbar {
-    width: 100%;
-    text-align: center;
-    height: 3.3rem;
-    font-size: 18px;
-    background: #cccccc;
-    color: #2b368f;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    position: fixed;
-    bottom: 0;
-    border-top: 0.2rem solid #6c9ddb;
-}
-
-.mobileIcon-beacon {
-    width: 1.5rem;
-    height: 1.5rem;
-    display: inline-block;
-    background: url(image/mobileIcon-beacon.png);
-    background-size: 100%;
-    margin: 0 0.3rem 0 0;
-}
-
-/* 边框(被选中) 2019.12.31 */
-.plugin-div-selected {
-    border: 1px solid #679cd9;
-    border-radius: 3px;
-    box-shadow: 5px 5px 10px 0px #a7a5a5;
-}
-
-/* 个人空间上半部分样式 2020.1.9 */
-
-/* APP属性设置页面背景色(天蓝色,位于完善个人信息所在页面的上半部分) */
-.mobileSet-div {
-    background: #ebf0f2;
-}
-
-/* APP属性设置页面行(白色,含默认字体样式) */
-.mobileSet-list {
-    background: white;
-}
-
-/* APP属性设置页面行(灰色,选中状态) */
-.mobileSet-list-selected:active {
-    background-color: #d7d7d7 !important;
-}
-
-/* APP日历样式begin*/
-
-.mobileDate-div td,
-.mobileDate-headerDiv * {
-    transition-duration: .3s;
-    -webkit-transition-duration: .3s;
-}
-
-.mobileDate-headerDiv {
-    position: relative;
-    /*line-height: 48px;
-  padding: 10px 70px 5px; */
-    /* border-bottom: 1px solid #e2e2e2; */
-    border-bottom: 0.05rem solid #e2e2e2;
-
-    line-height: 2.4rem;
-    padding: 0.25rem 3.5rem 0.25rem
-}
-
-.mobileDate-headerDiv i {
-    /* padding: 0 5px; */
-    padding: 0 0.25rem;
-    cursor: pointer;
-    position: absolute;
-    /* top: 10px; */
-    color: #999;
-    /*  font-size: 24px; */
-
-
-    top: 0.125rem;
-    font-size: 1.2rem;
-}
-
-.mobileDate-headerDiv * {
-    display: inline-block;
-    vertical-align: bottom;
-}
-
-.mobileDate-headerDiv i.mobileIcon-fastPrev {
-    /* left: 25px; */
-    left: 0.8rem;
-}
-
-.mobileDate-headerDiv i.mobileIcon-prev {
-    /*  left: 75px; */
-    left: 3rem;
-}
-
-.mobileDate-headerDiv i.mobileIcon-fastNext {
-    /* right: 23px; */
-    right: 0.8rem
-}
-
-.mobileDate-headerDiv i.mobileIcon-next {
-    /* right:75px; */
-    right: 3rem;
-}
-
-.mobileDate-headerDiv i:hover,
-.mobileDate-headerDiv span:hover {
-    color: #71a0ce;
-}
-
-
-.mobileDate-div {
-    position: relative;
-    /* padding: 10px; */
-    padding: 0.5rem;
-    -moz-user-select: none;
-    -webkit-user-select: none;
-    -ms-user-select: none;
-    border-top: none 0;
-    border-bottom: none 0;
-}
-
-.mobileDate-div table {
-    border-collapse: collapse;
-    font-family: "黑体-Regular" !important;
-    /* font-size: 18px; */
-    font-size: 0.9rem;
-    width: 100%;
-}
-
-.mobileDate-div td,
-.mobileDate-div th {
-    /* width: 55px;
-  height: 48px; */
-    width: 2.7rem;
-    height: 2.4rem;
-    text-align: center;
-    /*  border: 2px #FFF solid ; */
-    border: 0.1rem #FFF solid;
-}
-
-.mobileDate-div td {
-
-    position: relative;
-    cursor: pointer;
-    /*  line-height: 48px; */
-    line-height: 2.4rem;
-    /* border: 2px #FFF solid ; */
-    border: 0.1rem #FFF solid;
-    font-weight: bolder;
-    color: #666;
-
-}
-
-.mobileDate-div th {
-    font-weight: 400;
-    color: #333
-}
-
-
-
-.mobileDate-div td:hover {
-    background-color: #eaeaea;
-    color: #333;
-}
-
-.mobileDate-div .mobileDate-dim,
-.mobileDate-div .laydate-day-prev {
-    color: #d2d2d2;
-}
-
-.mobileDate-div .mobileDate-dim {
-    color: #d2d2d2;
-}
-
-.mobileIcon-dimTriangle::after {
-    /* border-top:8px solid #e1e1e1 !important; */
-    border-top: 0.4rem solid #e1e1e1 !important;
-    z-index: -98;
-}
-
-.laydate-selected.mobileDate-dim,
-.laydate-selected.laydate-day-prev {
-    background-color: #f8f8f8 !important;
-}
-
-.mobileDate-selected {
-    background-color: #71a0ce !important;
-    color: #fff !important;
-    font-weight: bolder !important;
-}
-
-.mobileDate-selected .mobileIcon-triangle {
-    color: #fff !important;
-}
-
-.mobileDate-highlight {
-    /* color:#71a0ce !important;*/
-    font-weight: bolder !important;
-}
-
-.mobileIcon-triangle {
-    position: absolute;
-    left: 0px;
-    top: 0px;
-    width: 100%;
-    /* height: 48px;
-  line-height: 48px; */
-    height: 2.4rem;
-    line-height: 2.4rem;
-
-    overflow: hidden;
-    font-weight: bolder;
-    justify-content: center;
-}
-
-.mobileIcon-triangle::after {
-    position: absolute;
-    content: '';
-    right: 0px;
-    top: 0px;
-    width: 0px;
-    height: 0px;
-    /* border-top:8px solid #71a0ce;*/
-    /*border-left: 8px solid  transparent; */
-    border-top: 0.4rem solid #71a0ce;
-    border-left: 0.4rem solid transparent;
-    z-index: -99;
-}
-
-.mobileIcon-dimTriangle::after {
-    border-top: 0.4rem solid #e1e1e1 !important;
-    z-index: -98;
-}
-
-layui-laydate-header .layui-icon {
-    display: none !important
-}
-
-
-/* APP日历样式end*/
-
-/* 报名缴费微信支付 */
-.icon-wechatPay {
-    width: 127px;
-    height: 51px;
-    background: url(image/wxpay.png) no-repeat;
-    display: inline-block;
-}
-
-.largeIcon-checked {
-    width: 128px;
-    height: 128px;
-    display: inline-block;
-    background: url(image/icon_success.png) no-repeat;
-}
-
-.content-warning {
-    /* color: #ff0000; */
-    color: #fa5a32;
-    font-size: 14px;
-}
-
-/*app修改密码的错误提示文字*/
-.mobileContent-warning {
-    color: FF0000;
-    font-family: SIL Hei;
-    font-size: 0.75rem;
-    text-align: center;
-    line-height: 1.2rem;
-}
-
-/*app端ueditor样式*/
-.ueditor p {
-    display: block;
-    margin-block-start: 1em;
-    margin-block-end: 1em;
-    margin-inline-start: 0px;
-    margin-inline-end: 0px;
-}
-
-.ueditor img {
-    width: 100%;
-    height: auto !important;
-    max-width: 100%;
-    max-height: 100%;
-}
-
-.ueditor video {
-    width: 100%;
-}
-
-/*pc端UEDITORFIELD样式*/
-.UEDITORFIELD p {
-    display: block;
-    margin-block-start: 1em;
-    margin-block-end: 1em;
-    margin-inline-start: 0px;
-    margin-inline-end: 0px;
-}
-
-/* 移动端个人信息页面样式 20200716 杨文俊 */
-.mobileIcon-location {
-    /* 图标定位 */
-    width: 1.5rem;
-    height: 1.5rem;
-    display: inline-block;
-    background: url(image/mobileIcon-location.png) no-repeat;
-    background-size: 100%;
-}
-
-/*  锁定按钮(显示在用户设备列表,锁定设备行的右上角)20200720 杨文俊*/
-.mobileIcon-lock {
-    width: 1.25rem;
-    height: 1.25rem;
-    display: inline-block;
-    background: url(image/mobileIcon-lock.png) no-repeat;
-    background-size: 100%;
-}
-
-/*  铃铛(显示在用户设备列表,消息提醒设备的右上角)20200720 杨文俊*/
-.mobileIcon-bell {
-    width: 1.25rem;
-    height: 1.25rem;
-    display: inline-block;
-    background: url(image/mobileIcon-bell.png) no-repeat;
-    background-size: 100%;
-}
-
-/*pc  锁定按钮(显示在用户设备列表,锁定设备行的右上角)20200721 杨文俊*/
-.smallIcon-lock {
-    width: 18px;
-    height: 18px;
-    display: inline-block;
-    background: url(image/smallIcon-lock.png) no-repeat;
-    background-size: 100%;
-}
-
-/*pc  铃铛(显示在用户设备列表,消息提醒设备的右上角)20200721 杨文俊*/
-.smallIcon-bell {
-    width: 18px;
-    height: 18px;
-    display: inline-block;
-    background: url(image/smallIcon-bell.png) no-repeat;
-    background-size: 100%;
-}
-
-/*  内容按钮样式    对应PC样式content-button 20200723 杨文俊*/
-.padContent-button {
-    font-size: 1rem;
-    color: #6b9fd3;
-    padding: 0rem 1rem;
-    height: 2.6rem;
-    line-height: 2.4rem;
-    box-sizing: border-box;
-    border: 1px solid #6b9fd3;
-    vertical-align: middle;
-    border-radius: 0.3rem;
-    outline: none;
-    margin-right: 0.1rem;
-    background: none;
-}
-
-.padContent-button:hover {
-    border: 0.05rem solid #6b9fd3;
-    color: #fff;
-    background-color: #6b9fd3;
-}
-
-/*.padContent-button:active {
-    border: 0.05rem solid #415e7d;
-    color: #fff;
-    background-color: #415e7d;
-}	*/
-/* 关闭    对应PC样式icon-close 20200723 杨文俊*/
-.padIcon-close {
-    width: 2rem;
-    height: 2rem;
-    display: inline-block;
-    background: url(image/help-closeButton.png) no-repeat;
-    background-size: 100%;
-}
-
-/* 平板底部按钮20200724 杨文俊*/
-.padBottom-button {
-    border: none;
-    outline: none;
-    width: calc(50% - 0.075rem);
-    height: 4rem;
-    color: #4863a4;
-    font-size: 1.8rem;
-    text-align: center;
-    box-sizing: border-box;
-    background-color: #cacbcc;
-    -webkit-appearance: none;
-    border-radius: 0rem;
-}
-
-.padBottom-button:nth-child(1) {
-    float: left;
-}
-
-.mobileContent-button {
-    font-size: 0.7rem;
-    color: #6b9fd3;
-    padding: 0rem 0.65rem;
-    height: 1.4rem;
-    line-height: 1.4rem;
-    box-sizing: border-box;
-    border: 0.05rem solid #6b9fd3;
-    vertical-align: middle;
-    border-radius: 0.15rem;
-    outline: none;
-    margin-right: 0.1rem;
-    background: none;
-
-}
-
-/* app关闭按钮 */
-.mobileIcon-close {
-    display: inline-block;
-    width: 1.2rem;
-    height: 1.2rem;
-    background: url(image/spb-close.png) center center no-repeat;
-    background-size: 100%;
-}
-
-.mobile-titleText {
-    font-size: 0.8rem;
-    line-height: 1rem;
-    color: #000;
-}
-
-.mobile-contentText {
-    font-size: 0.75rem;
-    line-height: 1rem;
-    color: #000;
-}
-
-
-/* 学阳做的flashMsg动画样式 begin*/
-@-webkit-keyframes layui-upbit {
-    from {
-        -webkit-transform: translate3d(0, 30px, 0);
-        opacity: .3
-    }
-
-    to {
-        -webkit-transform: translate3d(0, 0, 0);
-        opacity: 1
-    }
-}
-
-@keyframes layui-upbit {
-    from {
-        transform: translate3d(0, 30px, 0);
-        opacity: .3
-    }
-
-    to {
-        transform: translate3d(0, 0, 0);
-        opacity: 1
-    }
-}
-
-.wd-anim {
-    -webkit-animation-duration: .3s;
-    animation-duration: .3s;
-    -webkit-animation-fill-mode: both;
-    animation-fill-mode: both
-}
-
-.wd-anim-upbit {
-    -webkit-animation-name: layui-upbit;
-    animation-name: layui-upbit
-}
-
-/* 学阳做的flashMsg动画样式 end*/
-
-/* 迎新推送按钮 */
-.icon-yxts {
-    width: 80px;
-    height: 22px;
-    line-height: 22px;
-    color: #FFF;
-    background: url(image/yx_ts.png) no-repeat;
-    display: inline-block;
-}
-
-/*裁剪*/
-.cat {
-    width: 23px !important;
-    height: 23px !important;
-    background: url(image/cat.png) no-repeat !important;
-    background-size: 100% 100% !important;
-    background-color: transparent !important;
-}
-
-/*app顺时针旋转*/
-.mobileIcon-rightRotation {
-    background-image: url(image/icon-rightRotation.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.mobileIcon-rightRotation:active {
-    background-image: url(image/icon-rightRotation-hover.png);
-}
-
-/*app逆时针旋转*/
-.mobileIcon-leftRotation {
-    background-image: url(image/icon--leftRotation.png);
-    background-position: center;
-    background-repeat: no-repeat;
-}
-
-.mobileIcon-leftRotation:active {
-    background-image: url(image/icon--leftRotation-hover.png);
-}
-
-/*app增加(大)*/
-.mobileIcon-bigAdd {
-    background-image: url(image/addIcon.png);
-    background-position-x: center;
-    background-repeat: no-repeat;
-}
-
-.button.mobileIcon-bigAdd:active {
-    background-image: url(image/addIcon-hover.png);
-}
-
-.button.mobileIcon-bigAdd:hover {
-    background-image: url(image/addIcon-hover.png);
-}
-
-/*正文黑色大字体*/
-.content-largeText {
-    font-family: Microsoft YaHei;
-    font-size: 36px;
-    color: #000000;
-}
-
-/*正文红色大字体*/
-.content-largeWarningText {
-    font-family: Microsoft YaHei;
-    font-size: 36px;
-    color: #FF0000;
-}
-
-.mobileSmallIcon-file {
-    width: 1.5rem;
-    height: 1.5rem;
-    background-image: url(image/mobileIcon-file.png);
-    background-position: center center;
-    background-repeat: no-repeat;
-    background-size: 65%;
-    display: inline-block;
-    vertical-align: top;
-    margin-top: -0.1rem;
-}
-
-/*快捷图标左下角的个人空间小图标*/
-.miniIcon-personal {
-    position: absolute;
-    left: 0px;
-    bottom: 0px;
-    width: 19px;
-    height: 19px;
-    background: url(image/icon-personal.png) center center no-repeat;
-    z-index: 10;
-}
-
-.mobileMiniIcon-personal {
-    width: 19px;
-    height: 19px;
-    background: url(image/icon-personal.png) no-repeat;
-    position: absolute;
-    left: 0;
-    bottom: 0;
-}
-
-/*右渐隐效果*/
-.right-fade {
-    position: absolute;
-    width: 1.5rem;
-    height: 100%;
-    background-image: linear-gradient(to right, transparent, #ebebeb 70%, #ebebeb);
-}
-
-/*左渐隐效果*/
-.left-fade {
-    position: absolute;
-    width: 1.5rem;
-    height: 100%;
-    background-image: linear-gradient(to left, transparent, #ebebeb 70%, #ebebeb);
-}
-
-/* 调分数右边的普通红色竖线*/
-.vLine-rightWarning {
-    border-right: 2px solid red !important;
-    height: 100%;
-    position: absolute;
-    left: -1px;
-    top: 0px;
-}
-
-/*调分数右边的细红色竖线 (粗细只有一像素)*/
-.vLine-smallRightWarning {
-    border-right: 1px solid red !important;
-    height: 100%;
-    position: absolute;
-    left: -1px;
-    top: 0px;
-}
-
-/*行灰色背景 */
-.list-dimBackground {
-    background-color: #e1e1e1 !important;
-}
-
-.list-background td {
-    border-bottom: 1px #f2f2f2 solid !important;
-}
-
-.smallIcon-user {
-    display: inline-block;
-    height: 51px;
-    width: 51px;
-    background: url(image/smallIcon-user.png) center center no-repeat;
-    background-size: 50%;
-}
-
-.smallIcon-dimUser {
-    display: inline-block;
-    height: 51px;
-    width: 51px;
-    background: url(image/smallIcon-dimUser.png) center center no-repeat;
-    background-size: 50%;
-}
-
-.icon-switchUser {
-    display: inline-block;
-    height: 61px;
-    width: 61px;
-    background: url(image/icon/icon-switchUser.png) center center no-repeat;
-    background-size: 50%;
-}
-
-.mobileIcon-scan {
-    width: 2.75rem;
-    height: 2.15rem;
-    background: url(image/icon/icon-scan.png) center center no-repeat;
-    background-size: 50%;
-    background-position: center center;
-    border: none;
-    outline: none;
-}
-
-.mobileIcon-add {
-    width: 2.75rem;
-    height: 2.15rem;
-    background: url(image/mobileIcon-add.png) center center no-repeat;
-    background-size: 130%;
-    background-position: center center;
-    border: none;
-    outline: none;
-}
-
-/*标题行的返回按钮图标*/
-.mobileIcon-return {
-    display: inline-block;
-    width: 1.1rem;
-    height: 1.1rem;
-    background: url(image/mobileIcon-return.png) center center no-repeat;
-    background-size: 100%;
-    border: none;
-    outline: none;
-}
-
-.mobileInvertIcon-i {
-    display: inline-block;
-    width: 2.25rem;
-    height: 2.25rem;
-    background: url(image/i_icon.png) center center no-repeat;
-    background-size: 100%;
-    border: none;
-    outline: none;
-}
-
-/*文字前面的三角形感叹号图标*/
-.icon-warning {
-    display: inline-block;
-    margin-top: -12px;
-    height: 35px;
-    width: 60px;
-    background: url(image/icon-warning.gif) center center no-repeat;
-}
-
-/* 党校班次计划图标begin*/
-.smallIcon-bed {
-    display: inline-block;
-    /*  width:15px;*/
-    height: 15px;
-    background: url(image/smallIcon-bed.png) left center no-repeat;
-    padding: 4px 0px 4px 18px;
-    border: none;
-    outline: none;
-}
-
-.smallIcon-classroom {
-    display: inline-block;
-    /*  width:15px;*/
-    height: 15px;
-    background: url(image/smallIcon-classroom.png) left center no-repeat;
-    padding: 4px 0px 4px 18px;
-    border: none;
-    outline: none;
-}
-
-.smallIcon-extraBed {
-    display: inline-block;
-    /*  width:15px;*/
-    height: 15px;
-    background: url(image/smallIcon-extraBed.png) left center no-repeat;
-    padding: 4px 0px 4px 18px;
-    border: none;
-    outline: none;
-}
-
-.smallIcon-restaurant {
-    display: inline-block;
-    /*  width:15px;*/
-    height: 15px;
-    background: url(image/smallIcon-restaurant.png) left center no-repeat;
-    padding: 4px 0px 4px 18px;
-    border: none;
-    outline: none;
-}
-
-/* 班数目*/
-.smallIcon-class {
-    display: inline-block;
-    /*  width:15px;*/
-    height: 15px;
-    background: url(image/smallIcon-class.png) left center no-repeat;
-    padding: 4px 0px 4px 18px;
-    border: none;
-    outline: none;
-}
-
-/* 党校班次计划图标end*/
-
-/* 蓝色代表开始的三角形*/
-.calendar-play-2a3493::before {
-    display: inline-block;
-    content: '';
-    border-width: 4px;
-    border-style: solid;
-    border-top-color: transparent !important;
-    border-bottom-color: transparent !important;
-    border-right-color: transparent !important;
-    position: absolute;
-    left: 0;
-    bottom: -3px;
-    border-color: #2a3493;
-}
-
-/* 蓝色横线*/
-.calendar-hLine-2a3493 {
-
-    border-bottom: 2px solid #2a3493 !important;
-}
-
-/* 蓝色代表结束的正方形*/
-.calendar-stop-2a3493::after {
-    display: inline-block;
-    content: '';
-
-    position: absolute;
-    right: 0;
-    bottom: -2px;
-    width: 6px;
-    height: 6px;
-    background-color: #2a3493;
-}
-
-/* 玫瑰红色代表开始的三角形*/
-.calendar-play-fa0cff::before {
-    display: inline-block;
-    content: '';
-    border-width: 4px;
-    border-style: solid;
-    border-top-color: transparent !important;
-    border-bottom-color: transparent !important;
-    border-right-color: transparent !important;
-    position: absolute;
-    left: 0;
-    bottom: -3px;
-    border-color: #fa0cff;
-}
-
-/* 玫瑰红色横线*/
-.calendar-hLine-fa0cff {
-
-    border-bottom: 2px solid #fa0cff !important;
-}
-
-/* 玫瑰红色代表结束的正方形*/
-.calendar-stop-fa0cff::after {
-    display: inline-block;
-    content: '';
-
-    position: absolute;
-    right: 0;
-    bottom: -2px;
-    width: 6px;
-    height: 6px;
-    background-color: #fa0cff;
-}
-
-/* 绿色代表开始的三角形*/
-.calendar-play-21a750::before {
-    display: inline-block;
-    content: '';
-    border-width: 4px;
-    border-style: solid;
-    border-top-color: transparent !important;
-    border-bottom-color: transparent !important;
-    border-right-color: transparent !important;
-    position: absolute;
-    left: 0;
-    bottom: -3px;
-    border-color: #21a750;
-}
-
-/* 绿色横线*/
-.calendar-hLine-21a750 {
-
-    border-bottom: 2px solid #21a750 !important;
-}
-
-/* 绿色代表结束的正方形*/
-.calendar-stop-21a750::after {
-    display: inline-block;
-    content: '';
-
-    position: absolute;
-    right: 0;
-    bottom: -2px;
-    width: 6px;
-    height: 6px;
-    background-color: #21a750;
-}
-
-/* 红色代表开始的三角形*/
-.calendar-play-ff0000::before {
-    display: inline-block;
-    content: '';
-    border-width: 4px;
-    border-style: solid;
-    border-top-color: transparent !important;
-    border-bottom-color: transparent !important;
-    border-right-color: transparent !important;
-    position: absolute;
-    left: 0;
-    bottom: -3px;
-    border-color: #ff0000;
-}
-
-/* 红色横线*/
-.calendar-hLine-ff0000 {
-
-    border-bottom: 2px solid #ff0000 !important;
-}
-
-/* 红色代表结束的正方形*/
-.calendar-stop-ff0000::after {
-    display: inline-block;
-    content: '';
-
-    position: absolute;
-    right: 0;
-    bottom: -2px;
-    width: 6px;
-    height: 6px;
-    background-color: #ff0000;
-}
-
-/* 橙色代表开始的三角形*/
-.calendar-play-ff9600::before {
-    display: inline-block;
-    content: '';
-    border-width: 4px;
-    border-style: solid;
-    border-top-color: transparent !important;
-    border-bottom-color: transparent !important;
-    border-right-color: transparent !important;
-    position: absolute;
-    left: 0;
-    bottom: -3px;
-    border-color: #ff9600;
-}
-
-/* 橙色横线*/
-.calendar-hLine-ff9600 {
-
-    border-bottom: 2px solid #ff9600 !important;
-}
-
-/* 橙色代表结束的正方形*/
-.calendar-stop-ff9600::after {
-    display: inline-block;
-    content: '';
-
-    position: absolute;
-    right: 0;
-    bottom: -2px;
-    width: 6px;
-    height: 6px;
-    background-color: #ff9600;
-}
-
-/*其它班次色代表开始的三角形*/
-.calendar-play-6c9ed7::before {
-    display: inline-block;
-    content: '';
-    border-width: 4px;
-    border-style: solid;
-    border-top-color: transparent !important;
-    border-bottom-color: transparent !important;
-    border-right-color: transparent !important;
-    position: absolute;
-    left: 0;
-    bottom: -3px;
-    border-color: #6c9ed7;
-}
-
-/* 其它班次色横线*/
-.calendar-hLine-6c9ed7 {
-    border-bottom: 2px solid #6c9ed7 !important;
-}
-
-/* 其它班次色代表结束的正方形*/
-.calendar-stop-6c9ed7::after {
-    display: inline-block;
-    content: '';
-    position: absolute;
-    right: 0;
-    bottom: -2px;
-    /*  border-width: 3px;
-    border-style: solid;
-    border-color:#6c9ed7;*/
-    width: 6px;
-    height: 6px;
-    background-color: #6c9ed7;
-}
-
-/*是否点名图标*/
-.icon-form {
-    display: inline-block;
-    width: 26px;
-    height: 26px;
-    background: url(image/icon-form.png) center center no-repeat;
-    background-size: 100%;
-    border: none;
-    outline: none;
-}
-
-/*移动端objectpicker相关样式*/
-
-.mobileInput-div textarea,
-.mobileInput-div textarea:disabled {
-    border: none;
-    outline: none;
-    border-radius: 0.05rem;
-    line-height: 1.3rem;
-    color: #000;
-    vertical-align: middle;
-    box-sizing: border-box;
-    resize: none;
-    width: calc(100% - 1.1rem);
-}
-
-
-.mobileSmallButton {
-    display: inline-block;
-    width: 0.55rem;
-    height: 0.55rem;
-    ;
-    background-color: #f7f7f7;
-    color: #6c9ddb;
-    text-align: center;
-    line-height: 0.55rem;
-    box-shadow: -1px 1px 1px rgba(108, 158, 215, .4);
-    border-radius: 0.05rem;
-    outline: none;
-    border: none;
-    background-position: center center;
-    background-repeat: no-repeat;
-}
-
-.mobileSmallButton:hover {
-    color: #fff;
-    background-color: #6c9ed7;
-}
-
-.mobileSmallButton:active {
-    color: #fff;
-    background-color: #415f7f;
-}
-
-.mobileSmallButton.icon-down {
-    box-shadow: none !important;
-    background-image: url(image/dialog-select-icon.png) !important;
-    background-position: center center !important;
-    z-index: 9999;
-    right: 0rem;
-    width: 1rem;
-    height: 1rem;
-}
-
-.mobileInput-div>icon-down {
-    display: inline-block;
-    vertical-align: middle;
-    width: 0.55rem;
-    height: 0.55rem;
-    background: url(image/dialog-select-icon.png) center center no-repeat;
-    position: absolute;
-    right: 0rem;
-    top: 0rem;
-
-}
-
-.mobileSmallButton.icon-down:active {
-    background-image: url(image/objectPicker-button-hover.png);
-}
-
-.mobileSmallButton.icon-down:hover {
-    background-image: url(image/objectPicker-button-hover.png);
-}
-
-.mobileInput-div-selected {
-    border: 0.025rem solid #6b9ed6 !important;
-    box-shadow: 0.05rem 0.05remx 0.05rem #dedede;
-    box-sizing: border-box;
-    word-break: break-all;
-    z-index: 9999 !important;
-}
-
-
-
-/* 车牌号录入 */
-.carNumber-items {
-    width: 100%;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-}
-
-.carNumber-items-box,
-.carNumber-item,
-.carNumber-item-newpower {
-    width: 35px;
-    height: 35px;
-    border: 2px solid #e9e9e9;
-    border-radius: 1px;
-    text-align: center;
-    line-height: 35px;
-    font-size: 16px;
-    cursor: pointer;
-}
-
-.carNumber-items-point {
-    width: 5px;
-    height: 5px;
-    background-color: #000;
-    border-radius: 50%;
-}
-
-.carNumber-item-newpower {
-    border: 2px solid #c4e3b9;
-    background-color: #f6f9ff;
-}
-
-.keyboard {
-    background: #d1d5d9;
-    position: fixed;
-    bottom: 0;
-    width: 100%;
-    /* padding: 10px; */
-    left: 0;
-    box-sizing: border-box;
-    z-index: 1111;
-}
-
-.keyboardClose {
-    background: #f7f7f7;
-    display: flex;
-    justify-content: space-between;
-    height: 1.5rem;
-    padding: 10px;
-    /* margin-bottom: 10px; */
-}
-
-.keyboardClose span {
-    font-size: 1rem;
-    line-height: 1.5rem;
-}
-
-.keyboard-item {
-    padding: 10px 5px;
-}
-
-.keyboard-line {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: center;
-}
-
-.keyboard-btn {
-    padding: 8px 5px;
-    margin: 3px;
-    background: #fff;
-    border-radius: 5px;
-    box-shadow: 0 2px 0px rgba(0, 0, 0, 0.2);
-    color: #000;
-    text-align: center;
-    font-size: 1.2rem;
-    cursor: pointer;
-    border: none;
-    box-sizing: border-box;
-}
-
-.keyboard-btn:active {
-    background: #e0e0e0;
-}
-
-.keyboard-delete-btn {
-
-    background: #a7b0bc url(image/keyboardDelete.png) no-repeat center;
-    background-size: 75%;
-}
-
-.keyboard-delete-btn:active {
-    background: #fff url(image/keyboardDelete.png) no-repeat center !important;
-    background-size: 75% !important;
-}
-
-/* ss暂用下拉框样式 */
-.ss-select-container {
-    position: relative;
-    width: 100%;
-    font-size: 1rem;
-}
-
-.ss-select {
-    padding: 5px 0;
-    border-radius: 5px;
-    cursor: pointer;
-    position: relative;
-}
-
-.ss-options {
-    display: none;
-    position: absolute;
-    top: 100%;
-    left: 0;
-    width: 100%;
-    background-color: #393D51;
-    z-index: 1000;
-    color: #fff;
-    border: 1px solid #393D51;
-    box-sizing: border-box;
-    border-radius: 5px;
-    overflow: hidden;
-    max-height: 30rem;
-    overflow: auto;
-}
-
-.ss-options div {
-    padding: 10px 10px 10px 23px;
-    cursor: pointer;
-    position: relative;
-}
-
-.ss-options div::after {
-    content: "";
-    position: absolute;
-
-    bottom: 0%;
-    left: 50%;
-    transform: translateX(-50%);
-    width: 80%;
-    height: 1px;
-    background-color: #303445;
-
-}
-
-.ss-options div:last-child::after,
-.ss-options div:hover::after,
-.ss-options div.selected::after {
-    display: none;
-}
-
-.ss-options div:hover {
-    background-color: #fff;
-    color: #393D51;
-}
-
-.ss-options div.selected {
-    background-color: #fff;
-    color: #393D51;
-
-}
-
-.ss-options div.selected::before {
-    content: "";
-    background: url(image/svg_icon/baocun.svg) no-repeat center;
-    position: absolute;
-    width: 15px;
-    height: 100%;
-    left: 5px;
-    top: 0;
-    color: #393D51;
-}
-
-.ss-select-container.open .ss-options {
-    display: block;
-}
-
-/* .ss-select-container.open .ss-select::after {
-    content: "▲";
-  } */
-
-.ss-select::after {
-    width: 15px;
-    height: 100%;
-    content: "";
-    background: url(image/svg_icon/xiangxiajiantou.svg) no-repeat center;
-    position: absolute;
-    right: 10px;
-    top: 50%;
-    transform: translateY(-50%);
-}
-
-/* 来访移动端提交图标 */
-/* 成功 */
-.lf-success {
-    width: 100px;
-    height: 100px;
-    background: url(image/svg_icon/tijiaochenggong.svg) no-repeat center;
-    background-size: 100%;
-}
-
-/* 失败 */
-.lf-fail {
-    width: 100px;
-    height: 100px;
-    background: url(image/svg_icon/tijiaoshibai.svg) no-repeat center;
-    background-size: 100%;
-}
-
-/* 缩略图容器样式 */
-
-.mobileFilePreview {
-    display: flex;
-    flex-wrap: wrap;
-    /* 保证多列布局 */
-    justify-content: flex-start;
-    /* padding: 10px; */
-}
-
-.mobileFilePreviewItem {
-    box-sizing: border-box;
-    /* 使宽高计算准确,包含 padding 和 border */
-    border-radius: 4px;
-    border: 1px solid #ebebeb;
-    position: relative;
-    overflow: hidden;
-}
-
-/* 缩略图样式,确保图片比例 */
-.mobileFilePreviewItem img {
-    width: 100%;
-    height: 100%;
-    /* 缩略图固定高度 */
-    object-fit: contain;
-    cursor: pointer;
-    
-}
-
-/* 遮罩层样式 */
-.mobileFilePreviewOverlay {
-    display: none;
-    /* 默认隐藏 */
-    position: fixed;
-    top: 0;
-    left: 0;
-    width: 100vw;
-    height: 100vh;
-    background-color: rgba(0, 0, 0, 0.8);
-    justify-content: center;
-    align-items: center;
-    z-index: 1000;
-    overflow: hidden;
-    /* 防止图片超出时溢出 */
-}
-
-
-/* 放大图片样式,仅应用于 .mobileFilePreviewOverlay 内的图片 */
-.mobileFilePreviewOverlay img {
-    max-width: 100%;
-    /* 最大宽度 90% */
-    max-height: 100%;
-    /* 最大高度 90% */
-    object-fit: contain;
-    /* 保证图片保持原有比例 */
-    transform-origin: center center;
-    transition: transform 0.2s ease;
-    position: relative;
-}
-/* 添加附件按钮 */
-.mobileFilePreviewAddButton{
-    width: 100px;
-    height: 100px;
-    border: 2px dashed rgb(221, 221, 221);
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    cursor: pointer;
-    font-size: 24px;
-    color: rgb(170, 170, 170);
-    /* margin-bottom: 18.4667px; */
-    margin-right: 0px;
-}
-/* 删除附件按钮 */
-.mobileFilePreviewDeleteButton{
-    width: 1.5rem;
-    height: 1.5rem;
-    position: absolute;
-    top: 0px;
-    right: 0px;
-    background: url(image/svg_icon/guanbi.svg) no-repeat center;
-    background-size: 70%;
-    color: rgb(255, 255, 255);
-    border: none;
-    cursor: pointer;
-}
-/* 附件文件名查看 */
-.mobileFilePreviewFile{
-    width: 100%;
-    height: 100%;
-    border-radius: 4px;
-    cursor: pointer;
-    text-align: center;
-    overflow-wrap: anywhere;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    overflow: auto;
-}
-
-/* 进度条容器 */
-.progress-container {
-    position: relative;
-    width: 150px;
-    height: 150px;
-    text-align: center;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-}
-/* SVG 进度条 */
-.progress-svg {
-    width: 100%;
-    height: 100%;
-    transform: rotate(-90deg); /* 从顶部开始 */
-    position: absolute;
-}
-
-/* 背景圆形,静态 */
-.progress-circle-bg {
-    fill: none;
-    stroke: #ddd;
-    stroke-width: 2;
-}
-
-/* 前景圆形,动态进度条 */
-.progress-circle {
-    fill: none;
-    stroke: #4caf50;
-    stroke-width: 2;
-    stroke-linecap: round;
-    stroke-dasharray: 100, 100;
-    stroke-dashoffset: 100;
-    transition: stroke-dashoffset 0.35s;
-}
-
-/* 显示百分比的文本 */
-.progress-text {
-    font-size: 24px;
-    color: #fff;
-}
-
-/* 显示动作信息的文本,例如 "上传中..." */
-.action-text {
-    font-size: 16px;
-    color: #fff;
-}
-
-/* 搜索图标 */
-.mobileIcon-qrcode{
-    background-color: #fff; /* 设置背景颜色为白色 */
-    background-image: url(image/svg_icon/qrcode.svg); /* 设置背景图像 */
-    background-repeat: no-repeat; /* 设置背景图像不重复 */
-    background-position: center; /* 设置背景图像居中显示 */
-}
-
-
-/* 来访卡片开始 */
-.mobileLf-card {
-    position: relative;
-    width: 95%;
-    margin: 0 auto 0.8rem;
-    background: #fff;
-    font-size: 1rem;
-    line-height: 1.5rem;
-    padding: 1rem;
-    box-sizing: border-box;
-    border-radius: 4px;
-    color: #333;
-    box-shadow: 0 0 5px rgba(168, 168, 168, 0.1);
-}
-
-.mobileLf-title {
-    font-size: 1.2rem;
-    font-weight: bold;
-    line-height: 2rem;
-    color: #000;
-    display: flex;
-    align-items: center;
-}
-/* 审核中 */
-.mobileLf-card-ing-tag{
-    position: absolute;
-    right: 0;
-    top: 0;
-    background: #fccb81;
-    color: white;
-    border-radius: 4px;
-    padding: 2px 5px;
-    width: 4rem;
-    text-align: center;
-    letter-spacing: 1px;
-    font-size:0.95rem;
-}
-/* 同意 */
-.mobileLf-card-agree-tag{
-    /* position: absolute;
-    right: 0;
-    top: 0; */
-    background: #fff;
-    color: #c0e0b7;
-    border: 1px solid #c0e0b7;
-    border-radius: 4px;
-    padding: 2px 5px;
-    /* width: 2.5rem; */
-    margin-left: .5rem;
-    text-align: center;
-    letter-spacing: 1px;
-    display: inline-block;
-    line-height: normal;
-    font-size:0.95rem;
-}
-/* 拒绝 */
-.mobileLf-card-refuse-tag{
-    /* position: absolute;
-    right: 0;
-    top: 0; */
-    background: #fff;
-    color: #f29149;
-    border: 1px solid #f29149;
-    border-radius: 4px;
-    padding: 2px 5px;
-    /* width: 2.5rem; */
-    margin-left: .5rem;
-    text-align: center;
-    letter-spacing: 1px;
-    display: inline-block;
-    line-height: normal;
-    font-size:0.95rem;
-}
-
-/* 失败 */
-.mobileLf-card-fail-tag{
-    /* position: absolute;
-    right: 0;
-    top: 0; */
-    background: #fff;
-    color: red;
-    border: 1px solid red;
-    border-radius: 4px;
-    padding: 2px 5px;
-    /* width: 2.5rem; */
-    margin-left: .5rem;
-    text-align: center;
-    letter-spacing: 1px;
-    display: inline-block;
-    line-height: normal;
-    font-size:0.95rem;
-}
-/* 来访卡片结束 */
-
-/* 移动端审核流程开始 */
-.mobileShList{
-    width: calc(100% - 22px);
-    margin: 0.5rem auto 0.5rem auto;
-}
-
-.mobileShList-task-title{
-    font-size: 1rem;
-    display: flex;
-    align-items: center;
-}
-
-.mobileShList-task-hollowPoint{
-    width: 1rem;
-    height: 1rem;
-    display: block;
-    background: #fff;
-    border: 1px solid #585e6c;
-    border-radius: 50%;
-    margin-right: 0.5rem;
-}
-.mobileShList-task-solidPoint{
-    width: 1rem;
-    height: 1rem;
-    display: block;
-    background: #585e6c;
-    border-radius: 50%;
-    margin-right: 0.5rem;
-}
-.mobileShList-task-content{
-    display: flex;
-    flex-direction: column;
-    align-items: flex-end;
-    padding: 0.8rem 0 1.8rem;
-    position: relative;
-}
-.mobileShList-task-content::before{
-    position: absolute;
-    content: '';
-    display: block;
-    width: 1px;
-    height: 100%;
-    background: #585e6c;
-    left: 0.5rem;
-    top: 0;
-
-}
-.mobileShList-task:last-child .mobileShList-task-content::before{
-    height: 0;
-}
-.mobileShList-task-content p{
-    background: url(image/svg_icon/yonghu02.svg) no-repeat;
-    width: calc(100% - 1.6rem);
-    font-size: 0.95rem;
-    margin-bottom: 0.7rem;
-    display: flex;
-    justify-content: space-between;
-    align-items: flex-start;
-    background-size: 1.1rem;
-    padding-left: 1.5rem;
-    box-sizing: border-box;
-    line-height: 1.25rem;
-}
-.mobileShList-task-content p:last-child{
-    margin-bottom: 0;
-}
-
-.mobileShList-task-author {
-    white-space: nowrap;
-}
-.mobileShList-task-comment {
-    flex-grow: 1;
-    
-    word-break: break-word;
-}
-.mobileShList-task-time {
-    white-space: nowrap;
-    color:#999;
-}
-/* 移动端审核流程结束 */
-/* .mobileShList-task-content p{
-    background: url(image/svg_icon/yonghu02.svg) no-repeat;
-    background-size: 1rem;
-    background-position: left top;
-    width: calc(100% - 1.3rem);
-    font-size: 0.98rem;
-    margin-bottom: 0.3rem;
-    display: flex;
-    justify-content: space-between;
-    align-items: flex-start;
-   
-    padding-left: 1.2rem;
-    box-sizing: border-box;
-} */
-
-/* 移动端搜索按钮 */
-.mobileSearch {
-    background: url(image/svg_icon/queding.svg) no-repeat;
-    background-size: 90%;
-    background-position: center;
-    color: #fff;
-}
-/* 移动端扫码按钮 */
-.mobileScan {
-    background: url(image/svg_icon/saoyisao2.svg) no-repeat;
-    background-size: 98%;
-    background-position: center;
-    color: #fff;
-}
-
-/* 统计图 */
-.mobileLfStatistics {
-    width: calc(100% - 20px);
-    margin: 0 auto;
-}
-
-.mobileLfStatistics table {
-    width: 100%;
-    border-collapse: collapse;
-    /* 边框合并 */
-    table-layout: inherit;
-}
-
-.mobileLfStatistics tr {
-    height: 47px;
-    line-height: 47px;
-}
-
-.mobileLfStatistics tr:first-child th {
-    background: white;
-}
-
-.mobileLfStatistics th {
-    display: table-cell;
-    vertical-align: middle;
-    background: #fafafa;
-    border: 1px solid #e6e6e6;
-    text-align: center;
-    font-size: 1rem;
-}
-
-.mobileLfStatistics td {
-    border: 1px solid #e6e6e6;
-    text-align: center;
-    background: #fff;
-    font-size: 0.95rem;
-}
-
-.mobileLfStatistics .mobileLfStatistics-day {
-    height: 67px;
-    line-height: unset;
-}
-
-.mobileLfStatistics .mobileLfStatistics-day th {
-    width: 4.5rem;
-}
-
-.mobileLfStatistics .mobileLfStatistics-day div {
-    margin: 1px;
-}
-
-.mobileLfStatistics .mobileLfStatistics-day div p {
-    height: 33px;
-    display: flex;
-    align-items: center;
-    width: 85%;
-    justify-content: center;
-    margin: 0 auto;
-    font-size: 0.95rem;
-}
-
-/* 过去时间*/
-.mobileLfStatistics-overTime {
-    background-color: #f0f0f0;
-}
-
-.mobileLfStatistics-overTime p {
-    color: #999999;
-}
-
-.mobileLfStatistics-overTime p:first-child {
-    border-bottom: 1px dashed #b8b8b8;
-}
-
-/* 当前时间 */
-.mobileLfStatistics-currentTime {
-    background-color: #c7ffe0;
-}
-
-.mobileLfStatistics-currentTime p {
-    color: #000;
-}
-
-.mobileLfStatistics-currentTime p:first-child {
-    border-bottom: 1px dashed #b8b8b8;
-}
-
-/* 未来时间 */
-.mobileLfStatistics-futureTime {
-    background-color: #c7e0ff;
-}
-
-.mobileLfStatistics-futureTime p {
-    color: #000;
-}
-
-.mobileLfStatistics-futureTime p:first-child {
-    border-bottom: 1px dashed #b8b8b8;
-}
-
-/* 大于100小于500人 */
-.mobileLfStatistics-orange {
-    background-color: #ffb882;
-    color: #fff !important;
-    width: 100% !important;
-}
-
-/* 大于等于500人 */
-.mobileLfStatistics-red {
-    background-color: #ff5b5b;
-    color: #fff !important;
-    width: 100% !important;
-}
-
-.mobileLfStatistics-title {
-    position: relative;
-}
-
-.mobileLfStatistics-title span {
-    position: absolute;
-    right: 1rem;
-    top: 0;
-    font-size: 0.95rem;
-}
-
-.mobileLfStatistics-Color666 {
-    color: #666666;
-}
-.mobileLfStatistics-prev {
-    width: 1.5rem;
-    height: 1.5rem;
-    transform: rotate(90deg); 
-    
-    background: url(image/svg_icon/shangyizhang.svg) no-repeat;
-    background-size: 90%;
-    background-position: center;
-    color: #fff;
-}
-.mobileLfStatistics-next {
-    width: 1.5rem;
-    height: 1.5rem;
-    transform: rotate(90deg); 
-    background: url(image/svg_icon/xiayizhang.svg) no-repeat;
-    background-size: 90%;
-    background-position: center;
-    color: #fff;
-}

+ 0 - 6842
alf/base.css

@@ -1,6842 +0,0 @@
-@import url(var.css);
-
-/* 证件照 */
-.id-photo{
-  width: 153px;
-  height: 213px;
-  background: #e8e8e8;
-  background-size: cover;
-  cursor: pointer;
-  position: relative;
-}
-.id-photo::before {
-  content: "\e605";
-  font-size: 100px;
-  font-family: "iconfont";
-  color: #ccc;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  pointer-events: none; 
-  z-index: 1;  /* 确保图标在内容后面 */
-  /* 其他定位属性 */
-}
-/* 生活照 */
-.life-photo{
-  width: 144px;
-  height: 144px;
-  border-radius: 50%;
-  background:#e8e8e8;
-  background-size: contain;
-  cursor: pointer;
-  position: relative;
-}
-.life-photo::before {
-  content: "\e605";
-  font-size: 80px;
-  font-family: "iconfont";
-  color: #ccc;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  pointer-events: none; 
-  z-index: 1;
-}
-.life-photo img{
-  border-radius: 50%;
-}
-/* 图标相关开始 */
-/* 通用icon */
-.common-icon{
-  font-size: 22px;
-  font-family: "iconfont";
-
-}
-.common-icon-add::before{
-  content: "\e60d";
-  color: #999999;
-
-}
-.common-icon-setting::before{
-  content: "\e630";
-  /* color: #999999; */
-}
-/* 减少 */
-.common-icon-reduce::before{
-  content: "\e6a2";
-  color: #EB6100;
-}
-/* 附件 */
-.common-icon-paper-clip::before{
-  content: "\e676";
-  color: #999999;
-}
-.common-icon-change::before{
-  font-size: 16px;
-  content: "→";
-  color: red;
-}
-/* 表情 */
-.common-icon-smile::before{
-  content: "\e616";
-  color: #999999;
-}
-/* 常用语 */
-.common-icon-common-words::before{
-  content: "\e69d";
-  color: #999999;
-}
-/* 手写 */
-.common-icon-handwriting::before{
-  content: "\e6ab";
-  color: #999999;
-}
-/* 视频播放 */
-.common-icon-video::before{
-  content: "\e699";
-  color: #999999;
-}
-/* 文件夹-关闭 */
-.common-icon-folder-close::before{
-  content: "\e60b";
-  color: #999999;
-}
-/* 文件夹-打开 */
-.common-icon-folder-open::before{
-  content: "\e60c";
-  color: #999999;
-}
-/* 文件 */
-.common-icon-file::before{
-  content: "\e69e";
-  color: #999999;
-}
-/* 刷新 */
-.common-icon-refresh::before{
-  content: "\e635";
-  color: #999;
-}
-/* 待办 */ 
-.common-icon-todo::before{
-  content: "\e65c";
-  color: #999;
-}
-/* 催办 */
-.common-icon-urge::before{
-  content: "\e664";
-  color: #999;
-}
-/* 快捷发起 */
-.common-icon-quick-start::before{
-  content: "\e6a6";
-  color: #999;
-}
-/* 公告 */
-.common-icon-notice::before{
-  content: "\e6ac";
-  color: #999;
-}
-/* 统计图 */
-.common-icon-chart::before{
-  content: "\e6a5";
-  color: #999;
-}
-/* 请假 */
-.common-icon-leave-big::before{
-  font-size: 36px;
-  content: "\e6af";
-  color: #999999;
-}
-/* 收付款 */
-.common-icon-receipt-big::before{
-  font-size: 36px;
-  content: "\e68e";
-  color: #999999;
-}
-/* 考勤 */
-.common-icon-attendance-big::before{
-  font-size: 36px;
-  content: "\e694";
-  color: #999999;
-}
-/* 会议 */
-.common-icon-meeting::before{
-  content: "\e692";
-  color: #999999;
-}
-/* 一卡通 */
-.common-icon-card::before{
-  content: "\e6a0";
-  color: #999999;
-}
-/* 个人网站 */
-.common-icon-site::before{
-  content: "\e6ae";
-  color: #999999;
-}
-.common-icon-arrow-right{
-  font-size: 14px;
-}
-.common-icon-arrow-right::before{
-  content: "\e640";
-}
-/* 通用icon结束 */
-/* 全局左侧导航开始 */
-.nav-icon {
-  font-size: 22px;
-  font-family: "iconfont";
-  padding: 10px;
-  color: #565d6d;
-}
-.nav-icon-home::before {
-  content: "\e690";
-}
-.nav-icon-person::before {
-  content: "\e605";
-}
-.nav-icon-knowledge::before {
-  content: "\e62c";
-}
-.nav-icon-statistics::before {
-  content: "\e68a";
-}
-.nav-icon-category::before {
-  content: "\e652";
-}
-.nav-icon-add::before {
-  content: "\e60d";
-}
-.nav-icon-search::before {
-  content: "\e62f";
-}
-.nav-icon-folder-close::before{
-  content: "\e60b";
-  font-size: 19px;
-}
-.nav-icon-folder-open::before{
-  content: "\e60c";
-  font-size: 19px;
-}
-/* 岗位 */
-.nav-icon-post::before{
-  content: "\e69c";
-}
-/* 单位 */
-.nav-icon-unit::before{
-  content: "\e662";
-}
-/* 全局左侧导航结束 */
-/* 顶部导航开始 */
-.header-icon {
-  /* 基础样式 */
-  width: 36px;
-  height: 36px;
-  font-size: 22px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  font-family: "iconfont";
-  border-radius: 4px;
-  border: 1px solid var(--icon-item-border-color, transparent);
-}
-
-.header-icon:hover {
-  --icon-item-border-color: #edf1f5;
-}
-
-.header-help::after {
-  content: "\e6a7";
-  /* 帮助图标 */
-}
-
-.header-setting::after {
-  content: "\e60e";
-  /* 设置图标 */
-}
-
-.header-save::after {
-  content: "\e68d";
-  /* 设置图标 */
-}
-
-.header-menu::after {
-  content: "\e6ad";
-  /* 菜单图标 */
-}
-
-.header-home::after {
-  content: "\e600";
-  /* 主页图标 */
-}
-.header-skin::after {
-  content: "\e689";
-  /* 换肤图标 */
-}
-
-.header-lock::after {
-  content: "\e69f";
-  /* 锁定图标 */
-}
-
-.header-logout {
-  width: 48px;
-  height: 48px;
-  font-size: 33px;
-}
-
-.header-logout:hover {
-  background-color: #000;
-}
-
-.header-logout::after {
-  content: "\e6a1";
-  /* 退出图标 */
-}
-
-/* 顶部导航结束 */
-/* 全局菜单图标开始 */
-.global-menu-icon {
-  font-size: 16px;
-  font-family: "iconfont";
-  /* padding: 10px; */
-}
-/* 全局菜单图标结束 */
-/* 全局查询列表卡片 */
-.cart-list-icon {
-  font-size: 22px;
-  font-family: "iconfont";
-  /* padding: 10px; */
-}
-.cart-list-setting::before {
-  content: "\e630";
-  color: #dddddd;
-}
-
-/* 弹窗底部按钮icon */
-.bottom-div-icon{
-  font-size: 20px;
-  font-family: "iconfont";
-}
-.bottom-div-save::before{
-  content: "\e68d";
-}
-.bottom-div-close{
-  display: flex;
-  align-items: center;
-}
-.bottom-div-close::before{
-  content: "\e693";
-  font-size: 16px;
-}
-.bottom-div-back::before{
-  content: "\e638";
-}
-/* 表单组件icon开始 */
-.form-icon{
-  font-size: 18px;
-  font-family: "iconfont";
-}
-
-.form-icon-select::before{
-  content: "\e63e";
-}
-.form-icon-transform-select::before{
-  content: "\e63f";
-}
-.form-icon-select-checked::before{
-  content: "\e68d";
-}
-
-.form-icon-onoffbutton-checked::before{
-  content: "\e62d";
-}
-.form-icon-onoffbutton-unchecked::before{
-  content: "\e62b";
-}
-.form-icon-time::before{
-  content: "\e606";
-}
-.form-icon-prev-month::before{
-  content: "\e641";
-}
-.form-icon-prev-year::before{
-  content: "\e6b1";
-}
-.form-icon-next-month::before{
-  content: "\e640";
-}
-.form-icon-next-year::before{
-  content: "\e6b2";
-}
-/* 表单组件icon结束 */
-/* 登录页icon开始 */
-.login-icon{
-  font-size: 22px;
-  font-family: "iconfont";
-}
-.login-icon-user::before{
-  content: "\e605";
-}
-.login-icon-password::before{
-  content: "\e607";
-}
-.login-icon-check-code::before{
-  content: "\e608";
-}
-.login-icon-time::before{
-  content: "\e606";
-}
-.login-icon-loginin::before{
-  content: "\e6a1";
-}
-.login-icon-yaoyiyao::before{
-  content: "\e60f";
-}
-.login-icon-change-user{
-  position: absolute;
-  top: 0;
-  right: 0;
-  width: 22px !important;
-  height: 22px;
-  margin-right: 5px;
-  margin-top: 5px;
-  cursor: pointer;
-}
-.login-icon-change-user::before{
-  content: "\e609";
-}
-/* 登录页icon结束 */
-/* 弹窗icon开始 */
-.dialog-icon{
-  font-size: 22px;
-  font-family: "iconfont";
-}
-/* 关闭 */
-.dialog-icon-close::before{
-  content: "\e693";
-  font-size: 28px;
-}
-/* 下载 */
-.dialog-icon-download::before{
-  content: "\e691";
-}
-/* 打印 */
-.dialog-icon-print::before{
-  content: "\e66f";
-}
-/* 设置 */
-.dialog-icon-setting::before{
-  content: "\e630";
-}
-/* 收藏 */
-.dialog-icon-collect::before{
-  content: "\e698";
-}
-/* 帮助 */
-.dialog-icon-help::before{
-  content: "\e6cd";
-}
-/* 全屏 */
-.dialog-icon-full-screen::before{
-  content: "\e6ca";
-}
-/* 锁屏 */
-.dialog-icon-lock::before{
-  content: "\e697";
-}
-
-/* editor相关图标开始 */
-.editor-icon{
-  font-size: 16px;
-  font-family: "iconfont";
-  color: #666666;
-}
-/* 加粗 */
-.editor-icon-bold::before{
-  content: "\e68b";
-}
-/* 斜体 */
-.editor-icon-italic::before{
-  content: "\e66b";
-}
-/* 下划线 */
-.editor-icon-underline::before{
-  content: "\e685";
-}
-/* 删除线 */
-.editor-icon-strikethrough::before{
-  content: "\e66e";
-}
-
-/* 加粗 */
-.editor-icon-bold::before{
-  content: "\e68b";
-}
-/* 斜体 */
-.editor-icon-italic::before{
-  content: "\e66b";
-}
-/* 下划线 */
-.editor-icon-underline::before{
-  content: "\e685";
-}
-/* 删除线 */
-.editor-icon-strikethrough::before{
-  content: "\e66e";
-}
-
-/* 清除格式 */
-.editor-icon-eraser::before{
-  content: "\e6c2";
-}
-/* 复制格式 */
-.editor-icon-copyformat::before{
-  content: "\e68b";
-}
-/* 字体 */
-.editor-icon-font::before{
-  content: "\e680";
-}
-/* 字号 */
-.editor-icon-fontsize::before{
-  content: "\e67d";
-}
-/* 文字颜色 */
-.editor-icon-brush::before{
-  content: "\e681";
-}
-/* 段落 */
-.editor-icon-paragraph::before{
-  content: "\e682";
-}
-/* 左对齐 */
-.editor-icon-align-left::before{
-  content: "\e67e";
-}
-/* 居中对齐 */
-.editor-icon-align-center::before{
-  content: "\e67b";
-}
-/* 右对齐 */
-.editor-icon-align-right::before{
-  content: "\e67f";
-}
-/* 两端对齐 */
-.editor-icon-align-justify::before{
-  content: "\e67c";
-}
-/* 无序列表 */
-.editor-icon-ul::before{
-  content: "\e6c3";
-}
-/* 有序列表 */
-.editor-icon-ol::before{
-  content: "\e6c7";
-}
-/* 增加缩进 */
-.editor-icon-indent::before{
-  content: "\e6c8";
-}
-/* 减少缩进 */
-.editor-icon-outdent::before{
-  content: "\e6c9";
-}
-/* 图片 */
-.editor-icon-image::before{
-  content: "\e683";
-}
-/* 文件 */
-.editor-icon-file::before{
-  content: "\e668";
-}
-/* 视频 */
-.editor-icon-video::before{
-  content: "\e699";
-}
-/* 表格 */
-.editor-icon-table::before{
-  content: "\e677";
-}
-/* 链接 */
-.editor-icon-link::before{
-  content: "\e676";
-}
-/* 源代码 */
-.editor-icon-source::before{
-  content: "\e68b";
-}
-/* 预览 */
-.editor-icon-preview::before{
-  content: "\e642";
-}
-/* 全屏 */
-.editor-icon-fullsize::before{
-  content: "\e6c4";
-}
-/* 退出全屏 */
-.editor-icon-fullsize-exit::before{
-  content: "\e6cb";
-}
-/* 打印 */
-.editor-icon-print::before{
-  content: "\e66f";
-}
-/* 撤销 */
-.editor-icon-undo::before{
-  content: "\e688";
-}
-/* 重做 */
-.editor-icon-redo::before{
-  content: "\e686";
-}
-/* 查找 */
-.editor-icon-find::before{
-  content: "\e62f";
-}
-/* 全选 */
-.editor-icon-selectall::before{
-  content: "\e68b";
-}
-/* 隐藏原有的 SVG */
-.jodit-toolbar-button__trigger svg {
-  display: none;
-}
-
-/* 添加我们自己的图标 */
-.jodit-toolbar-button__trigger::after {
-  content: "\e63e";  
-  font-family: "iconfont" !important; 
-  font-size: 12px;
-}
-.jodit-toolbar-button_with-trigger_true{
-  margin-right: 4px !important;
-}
-.jodit-toolbar-button_with-trigger_true>.jodit-toolbar-button__button{
-  width: 20px !important;
-  min-width: 20px !important;
-}
-/* editor相关图标结束 */
-/* 弹窗icon结束 */
-/* 图标相关结束 */
-.self-block {
-  width: 100%;
-  height: 100%;
-}
-
-body * {
-  box-sizing: border-box;
-}
-
-html,
-body {
-  margin: 0;
-  padding: 0;
-}
-
-html,
-body,
-#app {
-  width: 100%;
-  height: 100%;
-  /* min-width: 1024px; */
-}
-
-i{
-  font-style: normal;
-}
-
-input::placeholder ,textarea::placeholder{
-  color: #999;
-}
-
-/*定义滚动条高宽及背景
- 高宽分别对应横竖滚动条的尺寸*/
-::-webkit-scrollbar {
-  width: 8px;
-  /* background-color: #F5F5F5; */
-  border-radius: 4px;
-  margin: 0 6px;
-}
-
-/*定义滚动条轨道
-  内阴影+圆角*/
-::-webkit-scrollbar-track {
-  border-radius: 4px;
-  background-color: #F5F5F5;
-}
-
-/*定义滑块
-  内阴影+圆角*/
-::-webkit-scrollbar-thumb {
-  border-radius: 4px;
-  background-color: #c1c1c1;
-}
-
-
-/* 页面布局 */
-.layout-container {
-  --header-height: 70px;
-  --left-side-width: 60px;
-  width: 100%;
-  height: 100%;
-  position: relative;
-  overflow: hidden;
-}
-
-.layout-container .header {
-  height: var(--header-height);
-  width: 100%;
-  box-sizing: border-box;
-}
-
-.layout-container .content-area {
-  width: 100%;
-  height: calc(100% - var(--header-height));
-  padding-right: 6px;
-}
-
-.layout-container .content-area:after {
-  content: "";
-  display: block;
-  width: 0;
-  height: 0;
-  clear: both;
-}
-
-.layout-container .left-side {
-  float: left;
-  height: 100%;
-  width: var(--left-side-width);
-  position: relative;
-}
-
-.layout-container .left-side-container {
-  --left-size-width: 100%;
-  height: 100%;
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: var(--left-size-width);
-  transition: width 0.2s;
-}
-
-.layout-container .left-side-container[size="max"] {
-  --left-size-width: 230px;
-}
-
-.layout-container .btn-size {
-  position: absolute;
-  bottom: 0;
-  left: calc(100% + 1px);
-  width: 16px;
-  height: 18px;
-  background: #fff;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-  z-index: 100;
-  --border-color: #dddfe6;
-  border-bottom: 1px solid var(--border-color);
-  border-right: 1px solid var(--border-color);
-}
-
-.layout-container .btn-size::before {
-  content: "";
-  position: absolute;
-  left: -7px;
-  top: -22px;
-  width: 22px;
-  height: 22px;
-  background: #fff;
-  transform-origin: 100% 100%;
-  transform: rotate(-45deg);
-  z-index: 1;
-  border-right: 1px solid var(--border-color);
-}
-
-.layout-container .btn-size .icon-container {
-  position: absolute;
-  z-index: 2;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  padding: 0 0 1px 1px;
-}
-
-.layout-container .left-side-content {
-  width: 100%;
-  height: 100%;
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 100;
-  overflow: hidden;
-  background: #fafbfe;
-  
-  /* display: flex;
-  flex-direction: column;
-  justify-content: flex-start;
-  align-items: center; */
-
-}
-
-.layout-container .left-side-content:hover {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.layout-container .left-side-content:after {
-  content: "";
-  height: 100%;
-  width: 1px;
-  position: absolute;
-  left: 100%;
-  top: 0;
-  background: #dadee2;
-  box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.24);
-}
-
-.layout-container  .main-content {
-  float: right;
-  height: 100%;
-  width: calc(100% - var(--left-side-width));
-}
-
-.layout-container[sys-mode="edit"] {
-  --edit-box-tools-display: block;
-}
-
-.layout-container[sys-mode="edit"] .can-resize-box:hover {
-  --block-title-visible: hidden;
-}
-
-.flex-start-center {
-  display: flex;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.flex-between-center {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-
-/* 公共头部区域开始 */
-.global-header-container {
-  background: var(--lightdark);
-  color: var(--white);
-  height: 100%
-}
-
-.global-header-container>div {
-  height: 100%;
-}
-
-.global-header-container .logo {
-  height: 100%;
-  width: 183px;
-  cursor: pointer;
-  position: relative;
-  z-index: 200;
-}
-
-.global-header-container .logo::after {
-  position: absolute;
-  content: "";
-  width: 0;
-  height: 50%;
-  top: calc(50% - 50% / 2);
-  right: 0;
-  border-right: 1px solid var(--lightdark-sub);
-}
-
-.global-header-container .logo:hover {
-  --header-menu-visible: visible;
-}
-
-.global-header-container .logo .img {
-  padding: 12px 30px 12px calc(var(--space-size) / 2);
-  height: 100%;
-  width: 100%;
-}
-
-.global-header-container .img img {
-  height: 100%;
-  -o-object-fit: cover;
-  object-fit: cover;
-}
-
-.global-header-container .menu {
-  visibility: var(--header-menu-visible, hidden);
-  transition: top 0.3s;
-  font-size: 14px;
-  color: #333;
-  top: 100%;
-  left: 0;
-  position: absolute;
-  /* width: 100%; */
-  background: #393d51;
-  border-top: 1px solid #dddfe6;
-  padding: 10px 2px;
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius: 4px;
-}
-
-.global-header-container .menu>div {
-  height: 36px;
-  color: var(--header-menu-color, #fff);
-  background: var(--header-menu-bg, transparent);
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  padding-left: 8px;
-  padding-right: 8px;
-  gap: 10px;
-  white-space: nowrap;
-}
-
-.global-header-container .menu>div:hover {
-  --header-menu-color: #333;
-  --header-menu-bg: #fffdfd;
-}
-
-.global-header-container .bread-crumb {
-  padding-left: 30px;
-  padding-top: 30px;
-  font-size: 18px;
-  color: var(--white);
-}
-
-.global-header-container.bread-crumb .content {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.global-header-container.bread-crumb .home-icon {
-  margin-right: calc(var(--space-size) / 2);
-  margin-top: -2px;
-}
-
-.global-header-container.bread-crumb .split-icon {
-  margin: 0 var(--space-size);
-}
-
-.global-header-container.bread-crumb .content a {
-  color: inherit;
-  text-decoration: none;
-}
-
-.global-header-container .menu-area {
-  padding-top: 10px;
-  padding-right: var(--space-size);
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  gap: 12px;
-}
-
-.global-header-container .search-area {
-  padding: 0 1em;
-  width: 350px;
-  height: 40px;
-}
-
-
-/* 顶部菜单全局搜索框 */
-.search-container {
-  width: 100%;
-  height: 100%;
-  position: relative;
-  border: none;
-  border-radius: 5px;
-  overflow: hidden;
-  --search-input-font-size: 16px;
-  --search-bg: var(--white, #fff);
-  --search-color: var(--dark, #252835);
-  --input-placeholder-color: #666;
-  background: var(--search-bg);
-  color: var(--search-color);
-}
-
-.search-container.dark {
-  --search-bg: var(--dark, #252835);
-  --search-color: var(--white, #fff);
-  --input-placeholder-color: #9c9fa7;
-}
-
-.search-container input {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  z-index: 1;
-  color: inherit;
-  padding: 0 1em;
-  border: unset;
-  font-size: var(--search-input-font-size);
-  background: unset;
-}
-
-.search-container input:disabled {
-  cursor: pointer;
-}
-
-.search-container input:focus {
-  outline: unset;
-}
-
-.search-container input::-moz-placeholder {
-  color: var(--input-placeholder-color, #666);
-}
-
-.search-container input::placeholder {
-  color: var(--input-placeholder-color, #666);
-}
-
-.search-container .icon-container {
-  right: 15px;
-  top: 50%;
-  transform: translateY(-50%);
-  position: absolute;
-  z-index: 2;
-  pointer-events: none;
-  padding-left: 10px;
-  background: var(--search-bg);
-}
-
-/* 公共头部区域结束 */
-
-/* 全局左部边框开始 */
-.left-side-container {
-  width: 100%;
-  height: 100%;
-  padding: 0;
-  background: #fafbfe;
-  /* overflow-y: auto;
-  overflow-x: hidden; */
-}
-/* 菜单项小圆点 */
-.menu-item-dot {
-  width: 5px;
-  height: 5px;
-  border-radius: 50%;
-  background-color: #8e8e8e;
-  position: absolute;
-  right: 5px;
-  /* 调整右侧位置 */
-  bottom: 5px;
-  /* 调整底部位置 */
-  font-size: 16px;
-  /* 调整圆点大小 */
-}
-
-.left-side-container .menu-item {
-  height: 60px;
-  width: 100%;
-  box-sizing: border-box;
-  color: var(--lightdark);
-  cursor: pointer;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.left-side-container .add-menu-btn {
-  display: var(--menu-add-btn-display, none);
-}
-
-.left-side-container .add {
-  width: 45px;
-  height: 45px;
-  border-radius: 5px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  box-shadow: 0 1px 4px #ccc;
-}
-
-.left-side-container .menu-item-content {
-  width: 100%;
-  height: 100%;
-  padding: 0 8px;
-  gap: 5px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  position: relative;
-  --edit-mark-display: none;
-}
-
-.left-side-container .menu-item-content:hover {
-  --edit-mark-display: var(--menu-edit-mark-display, none);
-}
-
-.left-side-container .menu-item-label {
-  height: 1.5em;
-  overflow: hidden;
-  transition: all 0.5s;
-  font-size: 18px;
-  color: #565d6d;
-  opacity: var(--menu-item-label-opacity, 0);
-  visibility: var(--menu-item-label-visible, hidden);
-}
-
-.left-side-container .edit-mark {
-  display: var(--edit-mark-display);
-  right: -1px;
-  top: -1px;
-  position: absolute;
-  color: #c3c6ca;
-}
-
-.left-side-container .edit-mark:hover {
-  color: #333;
-}
-
-.left-side-container .menu-item-content:hover {
-  background: #edf1f5;
-}
-
-.left-side-container .menu-item-content:hover.edit .mark {
-  display: block;
-}
-
-.left-side-container .icon-container {
-  position: relative;
-  padding: 10px;
-  box-sizing: content-box;
-  width: 24px;
-  height: 24px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  flex-shrink: 0;
-}
-.left-side-container .active{
-  background: #edf1f5;
-}
-/* 全局左部边框结束 */
-
-/* 一级页面搜索开始 */
-.search-bar-contaienr {
-  height: 100%;
-  width: 100%;
-  padding: 0 20px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  gap: 20px;
-  --col-lg-3: 270px;
-  position: relative;
-
-}
-
-.search-bar-contaienr input {
-  padding: 8px 10px;
-  margin: 0;
-  outline: unset;
-  border: 1px solid #c4c7cc;
-  border-radius: 3px;
-  font-size: 14px;
-}
-
-
-
-.search-bar-contaienr button {
-  font-size: 14px;
-  outline: unset;
-  border: unset;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  /* gap: 5px; */
-  padding: 8px 20px;
-  border-radius: 3px;
-  margin: 0;
-  cursor: pointer;
-  border: 1px solid #c4c7cc;
-}
-
-.search-bar-contaienr button:hover {
-  background: #393d51;
-  border: 1px solid #393d51;
-  color: #fff;
-}
-
-.search-bar-contaienr .add {
-  position: relative;
-}
-
-.search-bar-contaienr .popup {
-  position: absolute;
-  top: calc(100% + 15px);
-  right: 0;
-  width: 100%;
-  height: 130px;
-  background-color: #393d51;
-  border-radius: 5px;
-  padding: 10px 0;
-  z-index: 10;
-}
-
-.search-bar-contaienr .popup::after {
-  content: "";
-  width: 1em;
-  height: 1em;
-  background: #393d51;
-  position: absolute;
-  right: 1.5em;
-  top: -0.5em;
-  transform: rotate(45deg);
-}
-.search-bar-contaienr .popup >div {
-  border-bottom: 1px solid #303445;
-}
-.search-bar-contaienr .popup >div:last-child {
-  border-bottom: unset;
-}
-
-.search-bar-contaienr button.add>div.popup>div {
-  color: #d8d8d8;
-  font-size: 14px;
-  padding: 8px 20px;
-  cursor: pointer;
-}
-
-.search-bar-contaienr button.add>div.popup>div:not(:last-child) {
-  border-bottom: 1px solid #303445;
-}
-
-.search-bar-contaienr button.add>div.popup>div:hover {
-  background: #fffdfd;
-  color: #333;
-}
-
-
-.search-bar-contaienr>div {
-  height: 32px;
-}
-
-.search-bar-contaienr>.input {
-  border: 1px solid #c4c7cc;
-  border-radius: 3px;
-  font-size: 14px;
-}
-
-.search-bar-contaienr>div.input>input {
-  height: 100%;
-  width: 100%;
-  padding: 8px 10px;
-  margin: 0;
-  outline: unset;
-  border: unset;
-  border-radius: inherit;
-  background: unset;
-  font-size: inherit;
-}
-
-
-
-.search-bar-contaienr button {
-  height: 32px;
-  font-size: 14px;
-  outline: unset;
-  border: unset;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  /* gap: 5px; */
-  padding: 0 20px;
-  border-radius: 3px;
-  margin: 0;
-  cursor: pointer;
-  background: var(--btn-bg, unset);
-  color: var(--btn-color, #999999);
-  border: 1px solid var(--btn-border-color, #c4c7cc);
-}
-
-.search-bar-contaienr button:hover {
-  --btn-bg: #393d51;
-  --btn-color: #fff;
-}
-
-.search-bar-contaienr .input {
-  width: var(--col-lg-3);
-  height: 32px;
-  /* border: 1px solid #c4c7cc; */
-  border-radius: 4px;
-  position: relative;
-}
-
-.search-bar-contaienr .input>input {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  z-index: 1;
-  outline: unset;
-  border: unset;
-  background: unset;
-  padding: 0 15px;
-  line-height: 32px;
-  font-size: 14px;
-}
-
-.search-bar-contaienr .input>input::-moz-placeholder {
-  color: #999;
-}
-
-.search-bar-contaienr .input>input::placeholder {
-  color: #999;
-}
-
-.search-bar-contaienr .bar {
-  padding: 0 10px;
-  position: absolute;
-  top: 0;
-  right: 0;
-  height: 100%;
-  display: flex;
-  align-items: center;
-  color: #c4c7cc;
-  gap: 12px;
-}
-
-.search-bar-contaienr .bar .icon-container {
-  position: relative;
-  display: block;
-}
-
-.search-bar-contaienr .bar .icon-container:not(:last-child)::after {
-  content: "";
-  position: absolute;
-  top: 50%;
-  left: calc(100% + 12px);
-  transform: translateY(-50%);
-  width: 0;
-  height: 20px;
-  border-right: 1px solid #c4c7cc;
-}
-
-
-
-.search-bar-contaienr button {
-  font-size: 16px;
-  outline: unset;
-  border: unset;
-  color: #999;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  /* gap: 5px; */
-  padding: 0 20px;
-  border-radius: 4px;
-  margin: 0;
-  /* line-height: 2em; */
-  cursor: pointer;
-  background: var(--btn-bg, unset);
-  color: var(--btn-color, #999999);
-  border: 1px solid var(--btn-border-color, #c4c7cc);
-}
-
-.search-bar-contaienr button:hover {
-  --btn-bg: #393d51;
-  --btn-color: #fff;
-}
-.search-bar-contaienr .popup-win.bottom{
-  top: 100% !important;
-}
-.search-bar-contaienr .select-container .suffix>div{
-  width: 30px !important;
-  height: 30px !important;
-}
-/* 一级页面搜索结束 */
-
-/* 知识库卡片开始 */
-.knowledge-item-container {
-  width: 573px;
-  /* height: 220px; */
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: #fafbfe;
-  border-radius: 4px;
-  position: relative;
-  cursor: pointer;
-  border: 1px solid #dddfe6;
-  --header-display: none;
-  --header-color: #999;
-}
-
-.knowledge-item-container:hover {
-  --header-display: flex;
-  box-shadow: 8px 8px 0px #3a3e513d;
-}
-
-.knowledge-item-container:hover .cart-list-setting{
-  display: block;
-}
-/* .knowledge-item-container:hover::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #dddfe6;
-} */
-.knowledge-item-container.active{
-  box-shadow: 8px 8px 0px #3a3e513d;
-}
-.knowledge-item-container.active .header{
-  border-radius: unset;
-}
-/* .knowledge-item-container.active::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #585e6e;
-} */
-
-.knowledge-item-container .active {
-  border: 1px solid #ddd;
-}
-
-.knowledge-item-container .action-bar {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 0;
-  right: 0;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.knowledge-item-container>div.action-bar:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-
-.knowledge-item-container .header {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 0;
-  right: 0;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.knowledge-item-container .header:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-.knowledge-item-container .header:hover .cart-list-setting::before{
-  color: #ffffff;
-}
-.knowledge-item-container .body {
-  padding: 20px 25px;
-}
-
-.knowledge-item-container .box-header>div:first-child {
-  color: #333333;
-  font-size: 20px;
-  line-height: 2em;
-}
-
-.knowledge-item-container .box-body {
-  /* height: 140px; */
-  color: #333;
-  padding: 10px 0;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: flex-end;
-  --right-padding-left: 20px;
-  --right-width: calc(100% - 86px);
-}
-
-.knowledge-item-container .no-thumb {
-  --right-padding-left: 0;
-  --right-width: 100%;
-}
-
-.knowledge-item-container .left {
-  width: 88px !important;
-  height: 121px !important;
-  border: 1px solid #f6f6f6;
-}
-
-.knowledge-item-container .left>img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: cover;
-  object-fit: cover;
-  display: block;
-}
-
-.knowledge-item-container .right {
-  width: var(--right-width);
-  padding-left: var(--right-padding-left);
-  padding-top: 5px;
-}
-
-.knowledge-item-container .right .title {
-  font-size: 16px;
-  color: #666666;
-  line-height: 2em;
-  /* padding-right: 1em; */
-  line-height: 24px;
-  display: -webkit-box;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  -webkit-line-clamp: 1;
-  -webkit-box-orient: vertical;
-}
-
-.knowledge-item-container  .desc {
-  margin-top: 10px;
-  font-size: 14px;
-  color: #999999;
-  line-height: 1.8em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  gap: 20px;
-}
-/* 知识库卡片结束 */
-/* 知识库文件夹开始 */
-.ss-folder-list-trapezoid {
-  width: 100px;
-  height: 0;
-  /* border-left: 25px solid transparent; */
-  border-right: 30px solid transparent;
-  border-bottom: 20px solid #fafbfe;
-  border-radius: 4px 0 0 0;
-  position: absolute;
-  top: 0px;
-  left: 0;
-  z-index: 11;
-}
-.ss-folder-list-top-transparent {
-  width: 100%;
-  height: 10px;
-  position: absolute;
-  top: 0;
-  left: 0;
-  background: transparent;
-  border-radius: 4px 4px 0 0;
-  z-index: 1;
-}
-.ss-folder-list-top {
-  width: 100%;
-  height: 10px;
-  position: absolute;
-  top: 10px;
-  left: 0;
-  background: #dcdee5;
-  border-radius: 4px 4px 0 0;
-}
-.ss-folder-list-right {
-  width: 8px;
-  height: calc(100% - 10px);
-  position: absolute;
-  bottom: 0;
-  right: 0px;
-  background: #dcdee5;
-  border-radius: 0 4px 4px 0;
-}
-
-.ss-folder-list {
-  width: 573px;
-  /* height: 220px; */
-  box-shadow: -3px 6px 5px #a1a3a6;
-  background: transparent;
-  border-radius: 4px;
-  position: relative;
-  cursor: pointer;
-  /* border: 1px solid #dddfe6; */
-  --header-display: none;
-  --header-color: #999;
-}
-
-.ss-folder-list:hover {
-  --header-display: flex;
-  box-shadow: 8px 8px 0px #3a3e513d;
-}
-.ss-folder-list:hover
-  .ss-folder-list-top-transparent {
-  background: #dcdee5;
-  border-radius: unset;
-}
-.ss-folder-list:hover .ss-folder-list-top,
-.ss-folder-list:hover .ss-folder-list-right {
-  border-radius: unset;
-}
-.ss-folder-list:hover .cart-list-setting {
-  display: block;
-}
-/* .ss-folder-list:hover::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #dcdee5;
-} */
-.ss-folder-list.active{
-  box-shadow: 8px 8px 0px #3a3e513d;
-}
-.ss-folder-list.active .header {
-  border-radius: unset;
-}
-.ss-folder-list.active
-  .ss-folder-list-top-transparent {
-  background: #585e6e;
-  border-radius: unset;
-}
-/* .ss-folder-list.active::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #585e6e;
-} */
-
-.ss-folder-list .active {
-  border: 1px solid #ddd;
-}
-
-.ss-folder-list .action-bar {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 0;
-  right: 0;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.ss-folder-list > div.action-bar:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-
-.ss-folder-list .header {
-  background-color: #fafbfe;
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 20px;
-  right: 8px;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.ss-folder-list .header:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-.ss-folder-list .header:hover .cart-list-setting::before {
-  color: #ffffff;
-}
-.ss-folder-list .body {
-  margin: 20px 0 0 0;
-  height: calc(100% - 20px);
-  background: #fafbfe;
-}
-
-.ss-folder-list .box-header > div:first-child {
-  color: #333333;
-  font-size: 20px;
-  line-height: 2em;
-}
-.ss-folder-list .box-header,
-.ss-folder-list .box-body {
-  background-color: #fafbfe;
-  padding: 0 25px;
-}
-.ss-folder-list .box-body {
-  /* height: 140px; */
-  color: #333;
-  padding: 10px 25px ;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: flex-end;
-  --right-padding-left: 20px;
-  --right-width: calc(100% - 210px);
-}
-
-.ss-folder-list .no-thumb {
-  --right-padding-left: 0;
-  --right-width: 100%;
-}
-
-.ss-folder-list .left {
-  width: 215px !important;
-  height: 121px !important;
-  border: 1px solid #f6f6f6;
-}
-
-.ss-folder-list .left > img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: cover;
-  object-fit: cover;
-  display: block;
-}
-
-.ss-folder-list .right {
-  width: var(--right-width);
-  padding-left: var(--right-padding-left);
-  padding-top: 5px;
-}
-
-.ss-folder-list .right .title {
-  font-size: 16px;
-  color: #666666;
-  line-height: 2em;
-  /* padding-right: 1em; */
-  line-height: 24px;
-  display: -webkit-box;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  -webkit-line-clamp: 1;
-  -webkit-box-orient: vertical;
-}
-
-.ss-folder-list .desc {
-  margin-top: 10px;
-  font-size: 14px;
-  color: #999999;
-  line-height: 1.8em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  gap: 20px;
-}
-/* 知识库文件夹结束 */
-
-/* 一级页面卡片左右结构开始 */
-.item-container {
-  width: 702px;
-  height: 148px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: #fafbfe;
-  border-radius: 4px;
-  position: relative;
-  cursor: pointer;
-  --header-display: none;
-  --header-color: #999;
-}
-
-.item-container:hover {
-  --header-display: flex;
-}
-
-.item-container:hover::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #dddfe6;
-}
-
-.item-container .active {
-  border: 1px solid #ddd;
-}
-
-.item-container .header {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 0;
-  right: 0;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.item-container .header:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-
-.item-container .body {
-  height: 100%;
-  padding: 12px var(--space-size, 20px);
-  box-sizing: border-box;
-  color: #333;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.item-container .left {
-  padding: 10px;
-  width: 150px;
-}
-
-.item-container .right {
-  width: calc(100% - 150px);
-}
-
-.item-container .right .title {
-  font-size: 22px;
-  color: #333;
-  line-height: 2em;
-  padding-right: 1em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.item-container .desc {
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.item-container .progress {
-  margin-top: 5px;
-  background: #edeff0;
-  width: 100%;
-  height: 22px;
-  border-radius: 11px;
-  padding: 0 65px 0 10px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  cursor: pointer;
-}
-
-.item-container .progress:hover {
-  --progress-color: #006cf1;
-}
-
-.item-container  .progress>div {
-  height: 4px;
-  position: relative;
-  border-radius: 2px;
-  background: var(--progress-color, #666666);
-}
-
-.item-container  .progress>div>div {
-  position: absolute;
-  top: 50%;
-  left: calc(100% + 10px);
-  transform: translateY(-50%);
-  font-size: 12px;
-}
-
-.page-container .content-area .left {
-  width: calc(100% - var(--project-detail-width) - 6px);
-  height: 100%;
-  overflow-y: auto;
-  /* margin-right: 6px; */
-}
-
-.page-container .content-area .left .left-content {
-  width: 100%;
-  padding: 10px;
-  display: flex;
-  flex-wrap: wrap;
-  align-content: flex-start;
-  gap: 16px;
-  overflow-y: hidden;
-}
-
-/* 一级页面卡片左右结构结束 */
-
-/* 一级页面卡片上下结构开始 */
-.item-container2 {
-  width: 573px;
-  height: 170px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: #fafbfe;
-  border-radius: 4px;
-  position: relative;
-  cursor: pointer;
-  border: 1px solid #dddfe6;
-  --header-display: none;
-  --header-color: #999;
-}
-
-.item-container2:hover {
-  --header-display: flex;
-}
-
-.item-container2:hover::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #dddfe6;
-}
-
-.item-container2 .active {
-  border: 1px solid #ddd;
-}
-
-.item-container2 .header {
-  padding: 10px 60px 2px 20px;
-}
-
-.item-container2 .title {
-  font-size: 22px;
-  color: #333;
-  line-height: 2em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.item-container2 .body {
-  padding: 0 var(--space-size, 20px);
-  box-sizing: border-box;
-  color: #333;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.item-container2 .body>div {
-  height: 100px;
-}
-
-.item-container2 .body .left {
-  width: 180px;
-  background: #fafbfe;
-  border: 1px solid #f6f6f6;
-}
-
-.item-container2 .body .left img {
-  width: 100%;
-  height: 100%;
-}
-
-.item-container2 .body .right {
-  width: calc(100% - 180px);
-  padding: 5px 0 0 20px;
-}
-
-.item-container2  .content {
-  height: 60px;
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-  display: -webkit-box;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  -webkit-line-clamp: 2;
-  -webkit-box-orient: vertical;
-}
-
-.item-container2  .tip {
-  margin-top: 5px;
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.item-container2 .action-bar {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 0;
-  right: 0;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.item-container2 .action-bar:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-
-.item-container2 .progress {
-  margin-top: 5px;
-  background: #edeff0;
-  width: 100%;
-  height: 22px;
-  border-radius: 11px;
-  padding: 0 65px 0 10px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  cursor: pointer;
-}
-
-.item-container2 .progress:hover {
-  --progress-color: #006cf1;
-}
-
-.item-container2 .progress>div {
-  height: 4px;
-  position: relative;
-  border-radius: 2px;
-  background: var(--progress-color, #666666);
-}
-
-.item-container2 .progress>div>div {
-  position: absolute;
-  top: 50%;
-  left: calc(100% + 10px);
-  transform: translateY(-50%);
-  font-size: 12px;
-}
-
-/* 一级页面卡片上下结构结束 */
-
-
-.form-container {
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  padding-right: 6px;
-  position: relative;
-}
-
-.form-container .content-box {
-  height: calc(100% - 80px);
-  overflow-y: auto;
-  padding: 25px 24px;
-  box-sizing: border-box;
-}
-
-.form-container .content-box .table-container {
-  width: 100%;
-  border-collapse: collapse;
-  font-size: 16px;
-  color: #333;
-  table-layout: fixed;
-}
-
-
-.form-container th {
-  /* width: 200px; */
-  height: 60px;
-  text-align: right;
-  font-weight: normal;
-  background: #f8f9fb;
-  padding: 15px;
-  color: #666666;
-  border: 1px solid #e2e4ec;
-  font-size: 16px;
-}
-
-.form-container td {
-  width: 360px;
-  height: 60px;
-  padding: 0;
-  box-sizing: border-box;
-  border: 1px solid #e2e4ec;
-  position: relative;
-}
-
-.form-container .required {
-  position: absolute;
-
-  height: 100%;
-  width: 0;
-  top: 0;
-  left: 0;
-  border-left: 2px solid #ff0000;
-}
-
-.form-container .photo {
-  width: 100%;
-  /* height: 240px; */
-  display: flex;
-  flex-direction: row;
-  /* justify-content: space-between; */
-  align-items: flex-end;
-  padding: 15px;
-  gap: 15px;
-}
-
-
-
-/* .form-container .photo>.left {
-  height: 214px;
-  border-radius: 2px;
-  position: relative;
-  padding: 0 5px;
-} */
-
-.form-container .left>div.content {
-  width: 100%;
-  height: 100%;
-  background: #ebebeb;
-}
-
-.form-container .left>div.content>div.icon {
-  position: absolute;
-  top: 30px;
-  left: 50%;
-  transform: translateX(-50%);
-}
-
-.form-container .left>div.content>div.text {
-  position: absolute;
-  left: 50%;
-  bottom: 35px;
-  transform: translateX(-50%);
-  font-size: 16px;
-}
-
-.form-container .right {
-  display: flex;
-  align-items: flex-end;
-  justify-content: center;
-}
-
-.form-container .right>div.content {
-  width: 144px;
-  height: 144px;
-  background: #ebebeb;
-  opacity: 1;
-  border: 1px solid #edeff0;
-  border-radius: 50%;
-  position: relative;
-}
-
-.form-container .right>div.content>div.icon {
-  position: absolute;
-  top: 20px;
-  left: 50%;
-  transform: translateX(-50%);
-}
-
-.form-container .right>div.content>div.text {
-  position: absolute;
-  bottom: 25px;
-  left: 50%;
-  transform: translateX(-50%);
-}
-
-.form-container td>.input {
-  width: 100%;
-  height: 100%;
-}
-
-.form-container td>.area {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-}
-
-.form-container td>.area>div {
-  height: 100%;
-}
-
-.form-container  td>div.img {
-  height: 120px;
-  display: block;
-  padding: 8px 22px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.form-container  td>div.img>img {
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-.form-container  td>div.p {
-  font-size: 16px;
-  color: #333333;
-  padding: 20px 22px;
-}
-
-
-
-.input-container {
-  width: 100%;
-  height: 100%;
-  position: relative;
-}
-
-.input-container>div {
-  position: absolute;
-}
-
-.input-container .input {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  position: relative;
-  --input-required-display: block;
-}
-
-.input-container>.input>input {
-  outline: unset;
-  border: unset;
-  background: unset;
-  width: 100%;
-  height: 100%;
-  font-size: inherit;
-  padding: 0 15px;
-  box-sizing: border-box;
-  text-overflow: ellipsis;
-}
-.input-container>.input>input::placeholder,.select-container .input>input::placeholder,.custom-date-picker .el-input__inner::placeholder,.custom-date-picker .el-input__inner::placeholder{
-  color: #999;
-}
-
-/* 选择框样式开始 */
-.select-container {
-  width: 100%;
-  height: 100%;
-  position: relative;
-}
-
-.select-container>div {
-  position: absolute;
-  z-index: 4;
-}
-
-.select-container .input {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  cursor: pointer;
-}
-
-.select-container .input>input {
-  outline: unset;
-  border: unset;
-  background: unset;
-  width: 100%;
-  height: 100%;
-  padding: 0 15px;
-  font-size: inherit;
-  color: #000;
-  /* pointer-events: none; */
-}
-.select-container .input>input::placeholder{
-  color: #999;
-}
-.select-container .suffix {
-  position: absolute;
-  top: 0;
-  right: 0;
-  height: 100%;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  padding: 15px 0;
-  z-index: 11;
-}
-
-.select-container .suffix>div{
-  width: 37px;
-  height: 37px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  opacity: 1;
-  background: var(--icon-bg, transparent);
-  color: #c3c7cb;
-  border-radius: 4px;
-}
-
-.select-container .suffix>div.select {
-  --icon-bg: #393d51;
-  color: #ffffff !important;
-}
-
-
-.select-container .popup-win {
-  width: 100%;
-  left: 50%;
-  transform: translateX(-50%);
-  z-index: 999;
-  padding-top: 10px;
-  --popup-content-bg: #393d51;
-}
-
-.select-container .popup-win.bottom {
-  top: calc(100% - var(--select-popup-bottom-offset, 10px));
-}
-
-.select-container .popup-win.bottom::after {
-  content: "";
-  width: 14px;
-  height: 14px;
-  background: var(--popup-content-bg);
-  position: absolute;
-  right: 28px;
-  transform: rotate(45deg);
-  top: 5px;
-}
-.select-container .popup-win.top {
-  bottom: calc(100%);
-}
-
-.select-container .popup-win.top::after {
-  content: "";
-  width: 14px;
-  height: 14px;
-  background: var(--popup-content-bg);
-  position: absolute;
-  right: 28px;
-  transform: rotate(45deg);
-  bottom: -5px;
-}
-
-.select-container .popup-content {
-  background: var(--popup-content-bg);
-  position: relative;
-  border-radius: 4px;
-  color: #fff;
-  padding: 15px 2px;
-}
-
-.select-container .popup-win .content-area {
-  width: 99.5%;
-  max-height: 200px;
-  overflow-y: auto;
-  --scrollbar-track-color: transparent;
-  --scrollbar-thumb-color: #000;
-}
-
-
-.select-container .popup-win .content-area::-webkit-scrollbar {
-  width: 10px;
-  height: 10px;
-}
-
-.select-container .popup-win .content-area::-webkit-scrollbar-thumb {
-  border-radius: 10px;
-  background: var(--scrollbar-thumb-color, transparent);
-}
-
-.select-container .popup-win .content-area::-webkit-scrollbar-track {
-  border-radius: 10px;
-  background: var(--scrollbar-track-color, transparent);
-}
-
-.select-container .popup-win .content-area>div {
-  width: 98.5%;
-  position: relative;
-  height: 36px;
-  padding: 0 22px;
-  font-size: 14px;
-  color: var(--item-color, #fff);
-  background: var(--item-bg, transparent);
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  cursor: pointer;
-}
-
-.select-container .popup-win .content-area>div:hover {
-  --item-color: #000;
-  --item-bg: #fffdfd;
-}
-
-.select-container .popup-win .content-area>div>span.check-icon {
-  position: absolute;
-  top: 50%;
-  transform: translateY(-50%) scale(0.75);
-  left: 0;
-  padding-right: 8px;
-  visibility: var(--check-icon-visible, hidden);
-}
-
-.select-container .popup-win .content-area>div.active {
-  --check-icon-visible: visible;
-}
-
-/* radio */
-.radio-container {
-  display: flex;
-  align-content: flex-start;
-  gap: 20px;
-  padding: 0 20px;
-}
-
-.radio-container>div {
-  position: relative;
-  padding: 5px 10px;
-  border: 1px solid #bfc1c6;
-  border-radius: 2px;
-  overflow: hidden;
-  cursor: pointer;
-  text-align: center;
-  --radio-color: #c3c6ca;
-  color: var(--radio-color);
-}
-
-.radio-container .checked {
-  --radio-color: #393d51;
-}
-
-.radio-container .mark {
-  position: absolute;
-  bottom: 1px;
-  right: 0;
-  color: inherit;
-  width: 18px;
-  height: 18px;
-}
-
-.radio-container2 {
-  display: inline-flex;
-  align-content: flex-start;
-  gap: 20px;
-  margin-left: 15px;
-}
-
-.radio-container2>div {
-  position: relative;
-  padding: 5px 18px;
-  border: 1px solid #bfc1c6;
-  border-radius: 2px;
-  overflow: hidden;
-  cursor: pointer;
-  text-align: center;
-  --radio-color: #c3c6ca;
-  color: var(--radio-color);
-}
-
-.radio-container2 .checked {
-  --radio-color: #393d51;
-}
-
-.radio-container2 .mark {
-  position: absolute;
-  bottom: 1px;
-  right: 0;
-  color: inherit;
-  width: 18px;
-  height: 18px;
-}
-/* textarea */
-
-.textarea-container {
-  width: 100%;
-  height: 100%;
-  position: relative;
-}
-
-.textarea-container>div {
-  position: absolute;
-}
-
-.textarea-container .textarea {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-}
-
-.textarea-container textarea {
-  outline: unset;
-  border: unset;
-  background: unset;
-  width: 100%;
-  height: 100%;
-  padding: 15px;
-  line-height: 2em;
-  font-size: inherit;
-  resize: unset;
-}
-.textarea-container textarea::placeholder{
-  color: #999;
-}
-/* 错误提示开始 */
-.err-tip {
-  --err-tip-color: #ef5d0c;
-  font-size: 12px;
-  color: var(--err-tip-color);
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  cursor: pointer;
-  position: relative;
-  line-height: 15px;
-}
-
-.err-tip>div.tip {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  width: 100%;
-  padding: 5px 15px 2px 15px;
-}
-
-.err-tip::after {
-  content: "";
-  position: absolute;
-  bottom: 0;
-  left: 2px;
-  width: calc(100% - 2px* 2);
-  /* border-bottom: 2px solid var(--err-tip-color); */
-  z-index: 1;
-}
-
-.err-tip:hover {
-  --more-tip-visible: visible;
-  --more-tip-opacity: 1;
-}
-
-.err-tip>.tip-more {
-  transition: opacity 0.2s ease-in-out 0.6s;
-  opacity: var(--more-tip-opacity, 0);
-  visibility: var(--more-tip-visible, hidden);
-  background: #ffffff;
-  border-radius: 4px;
-  border: 1px solid var(--err-tip-color);
-  position: absolute;
-  top: 0;
-  left: 2px;
-  width: calc(100% - 2px* 2);
-  padding: 4px 12.5px;
-  z-index: 5;
-}
-.err-tip>.tip-more>p{
-  margin: 0;
-  background-color: #ffffff;
-}
-
-/* 错误提示开始 */
-.validate-vline{
-  width:6px;
-  height:100%;
-  position:absolute;
-  left:0;
-  top:0;
-  background-color:#ff0000;
-}
-.validate-tip {
-  --err-tip-color: #ef5d0c;
-  font-size: 16px;
-  color: var(--err-tip-color);
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  cursor: pointer;
-  position: relative;
-  line-height: 15px;
-}
-
-.validate-tip>div.tip {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  width: 100%;
-  padding: 5px 15px 2px 10px;
-}
-
-.validate-tip::after {
-  content: "";
-  position: absolute;
-  bottom: 0;
-  left: 2px;
-  width: calc(100% - 2px* 2);
-  /* border-bottom: 2px solid var(--err-tip-color); */
-  z-index: 1;
-}
-
-.validate-tip:hover {
-  --more-tip-visible: visible;
-  --more-tip-opacity: 1;
-}
-
-.validate-tip>.tip-more {
-  transition: opacity 0.2s ease-in-out 0.6s;
-  opacity: var(--more-tip-opacity, 0);
-  visibility: var(--more-tip-visible, hidden);
-  background: #fff;
-  border-radius: 4px;
-  border: 1px solid var(--err-tip-color);
-  position: absolute;
-  top: 0;
-  left: 2px;
-  width: calc(100% - 2px* 2);
-  padding: 4px 12.5px;
-  z-index: 3;
-}
-/* 错误提示结束 */
-.floating-div {
-  background-color: white;
-  position: absolute;
-  padding: 5px;
-  width: 100%;
-  /* 或根据需要调整 */
-  top: 16px;
-  z-index: 11;
-  left: 7px;
-  border: 1px solid #ccc;
-  height: auto;
-  box-sizing: border-box;
-  /* 其他样式 */
-}
-
-.floating-div textarea {
-  /* 设置 textarea 的样式 */
-  width: 100%;
-  height: 100px;
-  resize: none;
-  border: none;
-  outline: none;
-  height: auto;
-  overflow: hidden;
-  line-height: 20px;
-  font-size: 16px;
-  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
-}
-
-/* 弹窗头部样式开始 */
-.header-container {
-  width: 100%;
-  height: 100%;
-  padding-left: var(--space-size);
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.header-container .title {
-  font-size: 18px;
-}
-
-.header-container .title.visibility {
-  --title-visibility: visible;
-}
-
-.header-container .title:hover {
-  --header-icon-refresh: block;
-  --header-icon-normal: none;
-}
-
-.header-container .normal {
-  display: var(--header-icon-normal);
-}
-
-.header-container .hover {
-  display: var(--header-icon-refresh);
-  cursor: pointer;
-}
-
-.header-container .handle-bar {
-  --pop-win-header-color: #c3c6ca;
-  color: var(--pop-win-header-color);
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.header-container .left-bar {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 6px;
-  padding-right: 14px;
-  color: inherit;
-  margin-right: 54px;
-}
-
-.header-container .left-bar .dialog-icon {
-  cursor: pointer;
-  padding: 6px;
-  width: 36px;
-  height: 36px;
-  border-radius: 4px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.header-container .left-bar .dialog-icon:hover {
-  background: #c4c7cc;
-  color: #fff;
-}
-
-.header-container .setting {
-  visibility: var(--block-title-visible, hidden);
-  width: 60px;
-  height: 60px;
-  border-top-right-radius: 4px;
-  position: relative;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-}
-
-.header-container .setting:hover {
-  color: #fff;
-  background: #575d6d;
-}
-
-.header-container .setting:hover::before {
-  display: none;
-}
-
-.header-container .close-bar {
-  width: 60px;
-  height: 60px;
-  border-top-right-radius: 4px;
-  position: relative;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-  position: absolute;
-  right: 0;
-  top: 0;
-}
-
-.header-container .close-bar::before {
-  width: 0;
-  height: 24px;
-  border-left: 1px solid #c3c6ca;
-  content: "";
-  position: absolute;
-  top: 50%;
-  left: 0;
-  transform: translateY(-50%);
-}
-
-.header-container .close-bar:hover {
-  color: #fff;
-  background: #575d6d;
-}
-
-.header-container .close-bar:hover::before {
-  display: none;
-}
-/* 弹窗头部样式结束 */
-
-
-/* 弹窗样式开始 */
-.popup-container {
-  height: 100%;
-  width: 100%;
-  background: var(--white);
-  font-size: initial;
-  box-shadow: 10px 0px 10px 0px rgba(0, 0, 0, 0.3);
-  border-radius: 4px;
-}
-
-
-.popup-container>div {
-  width: 100%;
-}
-
-.popup-container .header {
-  height: 60px;
-  border-bottom: 2px solid var(--lightgray);
-  background-color: white;
-  border-radius: 4px;
-}
-
-.popup-container .body {
-  height: calc(100% - 60px);
-}
-
-.popup-container .dialog-body {
-  width: 500px;
-  height: 300px;
-  background: red;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  position: absolute;
-}
-
-.dialog-container {
-  width: 100%;
-  height: 100%;
-  position: fixed;
-  top: 0;
-  left: 0;
-  pointer-events: none;
-  background: transparent;
-  font-size: 0;
-  z-index: 1000;
-}
-
-.dialog-container .mark-content {
-  width: 100%;
-  height: 100%;
-  pointer-events: all;
-  position: relative;
-  -webkit-backdrop-filter: blur(3px);
-  backdrop-filter: blur(3px);
-  background: rgba(0, 0, 0, 0.2);
-}
-
-/* 登录部分 */
-
-.login-container {
-  width: 100%;
-  height: 100%;
-  background-size: cover;
-  background-color: antiquewhite;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  position: fixed;
-  z-index: 99999;
-  left: 0;
-  top: 0;
-}
-
-.login-container>div {
-  height: 100%;
-}
-
-.login-container .left {
-  width: calc(100% - 510px);
-}
-
-.login-container .right {
-  width: 510px;
-  background: rgba(255, 255, 255, 0.2);
-  position: relative;
-}
-
-.login-container .right>div.content-area {
-  height: calc(100% - 70px);
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.login-container .login-box {
-  width: 432px;
-  height: 494px;
-  background: rgba(255, 255, 255, 0.9);
-  box-shadow: 0px 5px 5px 0px rgba(0, 0, 0, 0.2);
-  border-radius: 4px;
-}
-
-.login-container .login-box>div {
-  width: 100%;
-}
-
-.login-container .box-header {
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  padding: 42px;
-}
-
-.login-container .box-header>img {
-  width: 348px;
-  height: 98px;
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-.login-container .box-container {
-  height: calc(100% - 182px - 40px);
-  position: relative;
-}
-
-.login-container .box-form {
-  padding: 0 37px;
-}
-
-.login-container>div.right>div.content-area>div.login-box>div.box-container>form.box-form>div.form-item {
-  width: 100%;
-  height: 37px;
-  position: relative;
-  display: flex;
-  margin-bottom: 20px;
-  background: #ffffff;
-  border: 1px solid #575d6d;
-  border-radius: 4px;
-}
-
-.login-container .icon {
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  width: 46px;
-  height: 100%;
-  background: #575d6d;
-  color: #fff;
-}
-
-.login-container .icon-container {
-  display: block;
-}
-
-.login-container .check-code {
-  width: 140px;
-  height: 35px;
-}
-
-.login-container .check-code img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: cover;
-  object-fit: cover;
-}
-
-.login-container .input,
-.login-container .select {
-  flex: 1;
-  height: 100%;
-}
-
-.login-container .input input,
-.login-container .select input,
-.login-container .input select,
-.login-container .select select {
-  width: 100%;
-  height: 100%;
-  outline: none;
-  border: unset;
-  background: transparent;
-  padding: 0 10px;
-  font-size: 18px;
-  color: #333;
-}
-
-.login-container .form-bar {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.login-button {
-  cursor: pointer;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 10px;
-  width: 161px;
-  height: 37px;
-  background: #ffffff;
-  border-radius: 4px;
-  outline: unset;
-  font-size: 18px;
-  --btn-color: #333333;
-  --btn-bg: #fff;
-  --btn-border-color: #575d6d;
-  color: var(--btn-color);
-  background-color: var(--btn-bg);
-  border: 1px solid var(--btn-border-color);
-}
-
-.login-button[theme="primary"],
-.login-button:hover {
-  --btn-bg: #575d6d;
-  --btn-color: #fff;
-}
-
-.login-container .err-tip {
-  bottom: -32px;
-  position: absolute;
-  padding-left: 40px;
-}
-
-.login-container .err-tip::after {
-  bottom: -8px;
-}
-
-.login-container .time {
-  position: absolute;
-  left: 10px;
-  width: 12px;
-  bottom: 0;
-}
-
-.login-container .time>div {
-  width: 12px;
-  height: 12px;
-  opacity: 1;
-  margin-bottom: 8px;
-  border-radius: 50%;
-  border: 1px solid #ef5d0c;
-}
-
-.login-container .fill {
-  background: #ef5d0c;
-}
-
-.login-container .box-container>div.err-tip>div.tip {
-  color: #ef5d0c;
-  font-size: 18px;
-  bottom: -30px;
-  left: 10px;
-  padding: 5px 15px 2px 0;
-}
-
-.login-container .box-footer {
-  height: 40px;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.login-container .box-footer>div {
-  height: 100%;
-}
-
-.login-container .box-footer>div.left {
-  width: calc(100% - 40px);
-}
-
-.login-container .box-footer>div.right {
-  width: 40px;
-  cursor: pointer;
-}
-
-.login-container .footer {
-  padding: 0 40px;
-  height: 70px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  font-size: 18px;
-  color: #fff;
-}
-
-.login-container .mask {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  z-index: 100;
-  position: absolute;
-  background: rgba(255, 255, 255, 0.2);
-  padding-bottom: 70px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.login-container .qrcode-box {
-  width: 432px;
-  height: 494px;
-  background: rgba(0, 0, 0, 0.2);
-  border-radius: 4px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  position: relative;
-}
-
-.login-container .qrcode-box::after {
-  content: "";
-  width: 100%;
-  height: 100%;
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: 0;
-  background: rgba(0, 0, 0, 0.2);
-  filter: blur(1px);
-}
-
-.login-container .qr {
-  width: 340px;
-  height: 340px;
-  position: absolute;
-  z-index: 1;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  background: #f7f7f7;
-  box-shadow: 5px 0px 5px 0px rgba(0, 0, 0, 0.2);
-  border-radius: 4px;
-  padding: 20px;
-}
-
-.login-container .qr>img {
-  user-drag: none;
-  -webkit-user-drag: none;
-  -khtml-user-drag: none;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  user-select: none;
-  width: 100%;
-  height: 100%;
-}
-
-.login-container>div.right>div.mask>div.qrcode-box>div.tip {
-  position: absolute;
-  bottom: 1em;
-  left: 0;
-  width: 100%;
-  text-align: center;
-  z-index: 10;
-  font-size: 18px;
-  color: #ff0000;
-}
-
-.lockscreen-container .login-box{
-  height: auto;
-  position: relative;
-}
-.lockscreen-container .box-header{
-  display: flex;
-  flex-direction: column;
-  padding: 15px;
-  margin: 41px 0;
-}
-.lockscreen-container .box-header img{
-  width: 100px;
-  height: 100px;
-  border-radius: 50%;
-}
-.lockscreen-container .right{
-  opacity: 0;
-  visibility: hidden;
-  transition: opacity 0.3s ease, visibility 0.3s ease;
-}
-  
-.lockscreen-container .right--visible {
-  opacity: 1;
-  visibility: visible;
-}
-.lockscreen-container  .left {
-  cursor: pointer;
-}
-/* 登陆相关结束  */
-
-/* 首页组件头部 */
-.edit-box-header-container {
-  width: 100%;
-  height: 100%;
-  padding-left: var(--space-size);
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.edit-box-header-container .title {
-  font-size: 18px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 10px;
-  visibility: var(--title-visibility, hidden);
-  --header-icon-refresh: none;
-  --header-icon-normal: block;
-}
-
-.edit-box-header-container .title.visibility {
-  --title-visibility: visible;
-}
-
-.edit-box-header-container .title:hover {
-  --header-icon-refresh: block;
-  --header-icon-normal: none;
-}
-
-.edit-box-header-container .normal {
-  display: var(--header-icon-normal);
-}
-
-.edit-box-header-container .hover {
-  display: var(--header-icon-refresh);
-  cursor: pointer;
-}
-
-.edit-box-header-container .handle-bar {
-  --pop-win-header-color: #c3c6ca;
-  color: var(--pop-win-header-color);
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.edit-box-header-container .left-bar {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 12px;
-  padding-right: 14px;
-  color: inherit;
-}
-
-.edit-box-header-container .left-bar .icon-container {
-  cursor: pointer;
-  padding: 6px;
-  width: 36px;
-  height: 36px;
-  border-radius: 4px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.edit-box-header-container .left-bar .icon-container:hover {
-  background: #c4c7cc;
-  color: #fff;
-}
-
-.edit-box-header-container .setting {
-  visibility: var(--block-title-visible, hidden);
-  width: 60px;
-  height: 60px;
-  border-top-right-radius: 4px;
-  position: relative;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-}
-
-.edit-box-header-container .setting:hover {
-  color: #fff;
-  background: #575d6d;
-}
-
-.edit-box-header-container .setting:hover::before {
-  display: none;
-}
-
-.user-info-container {
-  width: 590px;
-  height: 400px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: var(--white);
-  border-radius: 2px;
-  --block-title-visible: hidden;
-}
-
-.user-info-container:hover {
-  --block-title-visible: visible;
-  box-shadow: 0 0 0 8px #dddfe6;
-  border-radius: 1px;
-}
-
-
-.user-info-container .body {
-  padding: 0 var(--space-size, 20px) var(--space-size, 20px) var(--space-size, 20px);
-}
-
-.user-info-container  .user-info {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.user-info-container .avatar {
-  width: 94px;
-  height: 94px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-}
-
-.user-info-container  .info {
-  width: calc(100% - 120px);
-}
-
-.user-info-container  .info>p {
-  padding: 0;
-  margin: 0;
-  cursor: pointer;
-}
-
-.user-info-container  .info>p:first-child {
-  font-size: 16px;
-  color: #333;
-  margin-bottom: 10px;
-}
-
-.user-info-container  .info>p:not(:first-child) {
-  font-size: 14px;
-  color: #808080;
-  line-height: 22px;
-}
-
-.user-info-container  .progress-bar {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.user-info-container .progress {
-  width: calc(100% - 0px);
-  height: 20px;
-  font-size: 12px;
-  padding: 0 90px 0 10px;
-  background: var(--lightgray);
-  border-radius: 10px;
-  --progress-color: #666666;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.user-info-container .progress:hover {
-  --progress-color: #0072f1;
-}
-
-.user-info-container .line {
-  background: var(--progress-color);
-  width: 0%;
-  height: 4px;
-  position: relative;
-  border-radius: 2px;
-}
-
-.user-info-container .line>div {
-  position: absolute;
-  top: 50%;
-  left: calc(100% + 1em);
-  transform: translateY(-50%);
-  width: 5.5em;
-}
-
-.user-info-container .bar {
-  padding-left: 10px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  height: 0px;
-  cursor: pointer;
-}
-
-.user-info-container .other-info {
-  padding: 10px 0;
-  color: #666;
-  font-size: 16px;
-}
-
-.user-info-container  .other-info>div {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 20px;
-  padding: 15px 0;
-}
-
-.edit-box-container {
-  width: 100%;
-  height: 100%;
-  position: relative;
-  overflow: hidden;
-}
-
-.edit-box-container>div {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.edit-box-container .edit-tools {
-  --direction-icon-visible: hidden;
-  display: var(--edit-box-tools-display, none);
-  z-index: 2;
-}
-
-.edit-box-container .edit-tools:hover,
-.edit-box-container .edit-tools.active {
-  --direction-icon-visible: visible;
-}
-
-.edit-box-container .edit-tools>div {
-  position: absolute;
-  pointer-events: all;
-  cursor: pointer;
-  display: flex;
-}
-
-.edit-box-container .close {
-  height: 36px;
-  width: 36px;
-  top: 0;
-  right: 0;
-  color: var(--edit-tool-bar-close-color, #c3c6ca);
-  visibility: var(--direction-icon-visible);
-}
-
-.edit-box-container .close:hover {
-  --edit-tool-bar-close-color: #575d6d;
-}
-
-.edit-box-container .right-center {
-  visibility: var(--direction-icon-visible);
-  height: 30px;
-  width: 30px;
-  top: 50%;
-  transform: translateY(-50%);
-  right: 0;
-  justify-content: flex-end;
-  align-items: flex-end;
-}
-
-.edit-box-container .right-center::before {
-  content: "";
-  right: 0;
-  top: 0;
-  width: 4px;
-  height: 100%;
-  background: #999999;
-  border-radius: 2px;
-  position: absolute;
-}
-
-.edit-box-container .right-center .icon {
-  height: 30px;
-  width: 30px;
-  transform: rotate(90deg);
-}
-
-.edit-box-container .right-bottom {
-  visibility: var(--direction-icon-visible);
-  width: 36px;
-  height: 36px;
-  bottom: 0;
-  right: 0;
-  justify-content: flex-end;
-  align-items: flex-end;
-}
-
-.edit-box-container .right-bottom::before {
-  content: "";
-  right: 0;
-  top: 0;
-  width: 3px;
-  height: 100%;
-  background: #999999;
-  border-radius: 2px;
-  position: absolute;
-}
-
-.edit-box-container .right-bottom::after {
-  content: "";
-  left: 0;
-  bottom: 0;
-  width: 100%;
-  height: 3px;
-  background: #999999;
-  border-radius: 2px;
-  position: absolute;
-}
-
-.edit-box-container .right-bottom>.icon {
-  width: 30px;
-  height: 30px;
-  transform: rotate(-45deg);
-}
-
-.edit-box-container .bottom-center {
-  visibility: var(--direction-icon-visible);
-  height: 36px;
-  width: 36px;
-  left: 50%;
-  transform: translateX(-50%);
-  bottom: 0;
-  justify-content: center;
-  align-items: flex-end;
-}
-
-.edit-box-container .bottom-center::before {
-  content: "";
-  left: 0;
-  bottom: 0;
-  width: 100%;
-  height: 4px;
-  background: #999999;
-  border-radius: 2px;
-  position: absolute;
-  z-index: 0;
-}
-
-.edit-box-container .bottom-center>.icon {
-  height: 30px;
-  width: 30px;
-  transform: rotate(180deg);
-}
-
-.edit-box-container>.content-area {
-  z-index: 1;
-}
-
-.page-content {
-  width: 100%;
-  height: 100%;
-  padding: 20px;
-  display: flex;
-  flex-wrap: wrap;
-  align-content: flex-start;
-  gap: 15px;
-  overflow-y: hidden;
-  background: var(--lightgray);
-}
-
-.page-content:hover {
-  overflow-y: auto;
-}
-
-.folder-container {
-  width: 100%;
-  height: 100%;
-  overflow-y: hidden;
-}
-
-.folder-container:hover {
-  overflow-y: auto;
-}
-
-.folder-container .group-item {
-  --hover-bg: #edf1f5;
-  padding-right: 6px;
-  color: #333;
-}
-
-.folder-container  .group-title {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 10px;
-  color: #333;
-  cursor: pointer;
-  padding: 15px var(--space-size, 20px);
-}
-
-.folder-container .group-title:hover {
-  background: var(--hover-bg);
-}
-
-.folder-container .group-title>div.folder {
-  position: relative;
-}
-
-.folder-container .group-title>div.folder::after {
-  content: attr(data-num);
-  position: absolute;
-  font-size: 14px;
-  color: #999;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -45%) scale(0.9);
-}
-
-.folder-container .group-childs {
-  padding-left: 40px;
-  margin: 0;
-}
-
-.folder-container .group-childs>li {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  list-style-type: none;
-  cursor: pointer;
-  position: relative;
-  padding: 12px 5px 12px 20px;
-  border-bottom: 1px solid #eee;
-}
-
-.folder-container .group-childs>li::before {
-  position: absolute;
-  content: "";
-  top: 50%;
-  left: 5px;
-  transform: translateY(-50%);
-  width: 0.25em;
-  height: 0.25em;
-  border-radius: 50%;
-  background-color: #666;
-}
-
-.folder-container .group-childs>li:hover {
-  background: var(--hover-bg);
-}
-
-.folder-container .group-childs>li>div:first-child {
-  color: #333;
-  font-size: 16px;
-}
-
-.folder-container .group-childs>li>div:nth-child(2) {
-  color: #999;
-}
-
-.todo-list-container {
-  width: 590px;
-  height: 400px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: var(--white);
-  border-radius: 2px;
-  --block-title-visible: hidden;
-}
-
-.todo-list-container:hover {
-  --block-title-visible: visible;
-  box-shadow: 0 0 0 8px #dddfe6;
-  border-radius: 1px;
-}
-
-.todo-list-container .body {
-  border-top: 1px solid #eaeaea;
-  height: calc(100% - 57px);
-  overflow-y: hidden;
-  padding: 12px 6px 12px 0px;
-  box-sizing: border-box;
-}
-
-.notice-list-container {
-  width: 590px;
-  height: 242px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: var(--white);
-  border-radius: 2px;
-  --block-title-visible: hidden;
-}
-
-.notice-list-container:hover {
-  --block-title-visible: visible;
-  box-shadow: 0 0 0 8px #dddfe6;
-  border-radius: 1px;
-}
-
-.notice-list-container .header {
-  border-bottom: 1px solid #eaeaea;
-}
-
-.notice-list-container .body {
-  width: calc(100% - 6px);
-
-  height: calc(100% - 57px);
-  overflow-y: hidden;
-  padding: 12px var(--space-size, 20px);
-  box-sizing: border-box;
-  color: #333;
-}
-
-.notice-list-container .body:hover {
-  overflow-y: auto;
-}
-
-.notice-list-container .body>div {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  padding: 15px 0;
-}
-
-.notice-list-container .body>div>div:first-child {
-  gap: 5px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.notice-list-container .body>div>div:nth-child(2) {
-  color: #999999;
-}
-
-.launch-container {
-  width: 590px;
-  height: 204px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: var(--white);
-  border-radius: 2px;
-  --block-title-visible: hidden;
-}
-
-.launch-container:hover {
-  --block-title-visible: visible;
-  box-shadow: 0 0 0 8px #dddfe6;
-  border-radius: 1px;
-}
-
-.launch-container .body {
-  border-top: 1px solid #eaeaea;
-  height: calc(100% - 57px);
-  overflow-y: auto;
-  padding: 12px var(--space-size, 20px);
-  box-sizing: border-box;
-  color: #808080;
-  display: flex;
-  align-content: flex-start;
-  flex-wrap: wrap;
-  font-size: 12px;
-  gap: 20px;
-}
-
-.launch-container .body>div {
-  cursor: pointer;
-  width: 60px;
-  height: 100px;
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  align-items: center;
-  position: relative;
-}
-
-.launch-container .body>div:hover {
-  --popup-visible: visible;
-}
-
-.launch-container .body>div>.common-icon {
-  color: #b4b5b5;
-  width: 60px;
-  height: 60px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  background: var(--item-bg, transparent);
-  position: relative;
-  --item-mark-color: #999999;
-}
-
-.launch-container .body>div>.common-icon:hover {
-  --item-bg: #edf1f5;
-  --item-mark-color: #3a3e51;
-}
-
-.launch-container .body>div>.common-icon.mark-down::after {
-  content: "";
-  width: 0;
-  height: 0;
-  border-width: 6px 6px 6px 6px;
-  border-style: solid;
-  border-color: transparent var(--item-mark-color) var(--item-mark-color) transparent;
-  position: absolute;
-  bottom: 0;
-  right: 0;
-}
-
-.launch-container  .text {
-  padding-top: 4px;
-  font-size: 16px;
-}
-
-.launch-container .popup {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 130px;
-  height: 90px;
-  --popup-bg: #3a3e51;
-  visibility: var(--popup-visible, hidden);
-  background: var(--popup-bg);
-  padding: 16px 2px 0 2px;
-  border-radius: 4px;
-  z-index: 1111;
-}
-
-.launch-container .popup::before {
-  width: 100%;
-  height: 12px;
-  background: transparent;
-  content: "";
-  position: absolute;
-  top: -12px;
-  left: 0;
-}
-
-.launch-container .popup::after {
-  content: "";
-  background: var(--popup-bg);
-  width: 12px;
-  height: 12px;
-  position: absolute;
-  top: -6px;
-  right: 30px;
-  transform: rotate(45deg);
-}
-
-.launch-container .popup>div {
-  height: 36px;
-  width: 100%;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  padding: 0 15px;
-  font-size: 14px;
-  background: var(--item-bg, transparent);
-  color: var(--item-color, #fff);
-}
-
-.launch-container .popup>div:hover {
-  --item-bg: #fff;
-  --item-color: #333;
-}
-
-.statistics-container {
-  width: 1200px;
-  height: 475px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: var(--white);
-  border-radius: 2px;
-  --block-title-visible: hidden;
-}
-
-.statistics-container:hover {
-  --block-title-visible: visible;
-  box-shadow: 0 0 0 8px #dddfe6;
-  border-radius: 1px;
-}
-
-.statistics-container .body {
-  /* border-top: 1px solid #eaeaea; */
-  height: calc(100% - 57px);
-  overflow-y: auto;
-  padding: 12px var(--space-size, 20px);
-  box-sizing: border-box;
-  color: #333;
-}
-
-.statistics-container .body .chart-container {
-  width: 100%;
-  height: 100%;
-}
-
-.page-container {
-  width: 100%;
-  height: 100%;
-  /* padding: 20px 0; */
-}
-
-.page-container[sys-mode="edit"] {
-  --edit-box-tools-display: block;
-}
-
-.page-container .search-bar {
-  margin-top: 20px;
-  width: 100%;
-  height: 40px;
-  position: relative;
-}
-
-.page-container .item-content-area {
-  height: calc(100% - 75px);
-  width: 100%;
-  margin-top: 10px;
-  padding: 10px 0 100px 20px;
-  display: flex;
-  flex-wrap: wrap;
-  align-content: flex-start;
-  overflow-y: auto;
-  --project-detail-width: 370px;
-}
-
-.page-container .content-area .pager-bar {
-  width: 100%;
-  height: 80px;
-  padding: 20px;
-}
-
-.page-container .content-area>div.project-detail {
-  padding-right: 20px;
-  width: var(--project-detail-width);
-  height: 100%;
-}
-
-/* 分页开始 */
-.pager-container {
-  width: 98%;
-  margin: 0 auto;
-  /* height: 100%; */
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-}
-
-.pager-container .pager-content {
-  border-radius: 4px;
-  height: 32px;
-  color: #999999;
-  font-size: 18px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-}
-
-.pager-container .pager-content>div {
-  height: 100%;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.pager-container  .info {
-  padding: 0 20px;
-  border: 1px solid var(--btn-border, #c4c7cc);
-  border-top-left-radius: 4px;
-  border-bottom-left-radius: 4px;
-}
-
-.pager-container .btn>button {
-  height: 100%;
-  background: #edf1f5;
-  width: 84px;
-  outline: unset;
-  cursor: pointer;
-  font-size: inherit;
-  color: var(--btn-color, #999999);
-  border: 1px solid var(--btn-border, #c4c7cc);
-}
-
-.pager-container .btn>button:hover {
-  --btn-border: transparent;
-  --btn-color: #fff;
-  background: #393d51;
-}
-
-.pager-container .btn:last-child>button {
-  border-top-right-radius: 4px;
-  border-bottom-right-radius: 4px;
-}
-
-/* 分页结束 */
-/* 一级页面右边信息栏开始 */
-.info-container {
-  width: 100%;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: #fafbfe;
-  border-radius: 2px;
-  position: relative;
-  overflow-y: auto;
-  height: 100%;
-}
-
-.info-container .header {
-  width: 100%;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  padding: 10px 20px;
-  border-bottom: 1px solid #cfd2d7;
-}
-
-.info-container .header>div {
-  height: 40px;
-  display: flex;
-  align-items: center;
-}
-
-.info-container .header>div:first-child {
-  width: 80px;
-}
-
-.info-container .header>div:last-child {
-  padding-left: 5px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: flex-end;
-  width: calc(70%);
-  color: #333333;
-  font-size: 18px;
-}
-
-.info-container .header>div:last-child>div {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.info-container .section-container {
-  padding: 0 20px;
-}
-
-.info-container  .section {
-  padding: 8px 0;
-  --title-tip-height: 6px;
-}
-
-.info-container   .section:not(:last-child) {
-  border-bottom: 1px solid #edf1f5;
-}
-
-.info-container   .section:hover {
-  --title-tip-height: 18px;
-}
-
-.info-container   .section>div.title {
-  color: #333333;
-  font-size: 18px;
-  line-height: 3em;
-  position: relative;
-  padding-left: 20px;
-}
-
-.info-container   .section .title:before {
-  transition: height 0.5s;
-  content: "";
-  width: 6px;
-  height: var(--title-tip-height);
-  border-radius: 3px;
-  position: absolute;
-  left: 5px;
-  top: 50%;
-  transform: translateY(-50%);
-  background: #333;
-}
-
-.info-container   .section> .a {
-  --a-color: #333;
-  color: var(--a-color);
-  font-size: 16px;
-  line-height: 2.5em;
-  cursor: pointer;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.info-container   .section .a:hover {
-  --a-color: #006cf1;
-}
-
-.info-container   .section .text {
-  color: #333333;
-  font-size: 16px;
-  line-height: 2.5em;
-}
-
-/* 一级页面右边信息栏结束 */
-
-/* 统计图 */
-.page-statistics .content-area {
-  padding: 20px;
-  height: calc(100% - 80px);
-  display: flex;
-  flex-wrap: wrap;
-  align-content: flex-start;
-  gap: 20px;
-  overflow-y: auto;
-}
-
-.project-report-statistics .statistics-container:hover {
-  --block-title-visible: visible;
-}
-
-.project-report-statistics  .body {
-  /* border-top: 1px solid #eaeaea; */
-  height: calc(100% - 57px);
-  overflow-y: auto;
-  padding: 12px var(--space-size, 20px);
-  box-sizing: border-box;
-  color: #333;
-}
-
-.project-report-statistics  .table-container {
-  border: 1px solid #dddfe6;
-  margin-bottom: 22px;
-  overflow-x: auto;
-  background: var(--table-bg, #fff);
-}
-
-.project-report-statistics  .table-container::-webkit-scrollbar {
-  width: 0;
-  height: 0;
-}
-
-.project-report-statistics  .table-container::-webkit-scrollbar-thumb {
-  border-radius: 0;
-  -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.2);
-  background: var(--scrollbar-thumb-color, #c1c1c1);
-}
-
-.project-report-statistics  .table-container::-webkit-scrollbar-track {
-  border-radius: 0;
-  -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.2);
-  background: var(--scrollbar-track-color, transparent);
-}
-
-.project-report-statistics  .table-container:hover {
-  --table-bg: #edf1f5;
-}
-
-.project-report-statistics  .title {
-  position: relative;
-  padding: 15px 20px 15px 35px;
-  font-size: 16px;
-  border-bottom: 1px solid #dddfe6;
-}
-
-.project-report-statistics  .title::before {
-  content: "";
-  position: absolute;
-  top: 50%;
-  left: 20px;
-  transform: translateY(-50%);
-  width: 5px;
-  height: 5px;
-  background: #333333;
-  border-radius: 50%;
-}
-
-.project-report-statistics  .table-columns {
-  display: flex;
-  flex-wrap: nowrap;
-}
-
-.project-report-statistics  .table-columns>div {
-  flex-shrink: 0;
-  padding: 10px 20px;
-  border-right: 1px solid #dddfe6;
-}
-
-/* 跨对象弹窗开始 */
-.search-dialog-content {
-  width: 900px;
-  height: 100vh;
-  position: relative;
-  position: absolute;
-  left: 50%;
-  top: 50%;
-  transform: translate(-50%, -50%);
-  font-size: initial;
-  color: #333;
-  /* padding: 0 100px; */
-  background: #ffffff;
-  /* box-shadow: 0px 10px 5px 0px rgba(0, 0, 0, 0.3); */
-  border-radius: 4px;
-  /* height: 100%; */
-  padding: 0 100px 30px 100px;
-}
-
-.search-dialog-content>div {
-  width: 100%;
-}
-
-.search-dialog-content .header {
-  height: 130px;
-}
-
-.search-dialog-content .input-area {
-  width: 100%;
-  height: 53px;
-  color: #666;
-  font-size: 18px;
-  position: relative;
-  border: 1px solid #999999;
-  border-radius: 4px;
-  overflow: hidden;
-}
-
-.search-dialog-content .input-area>input {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  line-height: 53px;
-  padding: 0 20px;
-  font-size: inherit;
-  outline: unset;
-  border: unset;
-  z-index: 1;
-}
-
-.search-dialog-content .search-btn {
-  position: absolute;
-  top: 0;
-  right: 0;
-  font-size: inherit;
-  color: inherit;
-  height: 100%;
-  padding: 0 17px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-  z-index: 2;
-  --search-btn-bg: transparent;
-  --search-btn-color: #666666;
-  --search-btn-left-border-visible: visible;
-  background: var(--search-btn-bg);
-  color: var(--search-btn-color);
-}
-
-.search-dialog-content .search-btn:hover {
-  --search-btn-color: #fff;
-  --search-btn-bg: #242835;
-  --search-btn-left-border-visible: hidden;
-}
-
-.search-dialog-content .search-btn::after {
-  visibility: var(--search-btn-left-border-visible);
-  position: absolute;
-  top: 50%;
-  left: 0;
-  transform: translateY(-50%);
-  width: 0;
-  height: 60%;
-  border-left: 1px solid #999999;
-  content: "";
-}
-
-.search-dialog-content .sort {
-  padding: 10px 0;
-  font-size: 14px;
-  color: #a9a9a9;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.search-dialog-content .list {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 10px;
-}
-
-.search-dialog-content .list>div {
-  padding: 5px 10px;
-  cursor: pointer;
-}
-
-.search-dialog-content .active {
-  background-color: #e8f9fc;
-  color: #0066ff;
-  border-radius: 2px;
-}
-
-.search-dialog-content .time {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  gap: 10px;
-}
-
-.search-dialog-content .res {
-  color: #999999;
-  font-size: 12px;
-}
-
-.search-dialog-content .search-res {
-  height: calc(100% - 130px);
-  overflow-y: auto;
-  padding: 10px 10px 0 0;
-  margin-bottom: 5px;
-}
-
-.search-dialog-content .search-item {
-  margin-bottom: 20px;
-}
-
-.search-dialog-content .search-item.style-1>div.title {
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-}
-
-.search-dialog-content .search-item.style-1>div.detail {
-  padding: 5px 0;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.search-dialog-content .search-item.style-1>div.detail>div.thumb {
-  width: 77px;
-  height: 95px;
-}
-
-.search-dialog-content .search-item.style-1>div.detail>div.thumb>img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-.search-dialog-content .search-item.style-1>div.detail>div.info {
-  width: calc(100% - 77px);
-  padding-left: 10px;
-}
-
-.search-dialog-content .search-item.style-1>div.detail>div.info>div.title,
-.search-dialog-content .search-item.style-1>div.detail>div.info>div.subtitle {
-  color: #333;
-  font-size: 16px;
-  line-height: 1.5em;
-}
-
-.search-dialog-content .search-item.style-1>div.detail>div.info>div.desc {
-  margin-top: 5px;
-  color: #666666;
-  font-size: 14px;
-}
-
-.search-dialog-content .search-item.style-2>div.title {
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-}
-
-.search-dialog-content .search-item.style-2>div.desc {
-  color: #666666;
-  font-size: 14px;
-}
-
-.search-dialog-content .search-item.style-3>div.title {
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-}
-
-.search-dialog-content .search-item.style-3>div.group-list {
-  margin-top: 10px;
-}
-
-.search-dialog-content .search-item.style-3 .gitem {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  align-items: flex-start;
-}
-
-.search-dialog-content .search-item.style-3 .gitem:not(:last-child) {
-  margin-bottom: 20px;
-}
-
-.search-dialog-content .search-item.style-3  .thumb {
-  width: 180px;
-  height: 99px;
-}
-
-.search-dialog-content .search-item.style-3  .thumb>img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-.search-dialog-content .search-item.style-3  .info {
-  width: calc(100% - 180px);
-  padding-left: 10px;
-}
-
-.search-dialog-content .search-item.style-3  .info>div.title {
-  color: #666666;
-  font-size: 16px;
-}
-
-.search-dialog-content .search-item.style-3  .info>div.desc {
-  margin-top: 5px;
-  color: #666666;
-  font-size: 14px;
-}
-
-.search-dialog-content .search-item.style-3  .info>div.source {
-  margin-top: 5px;
-  color: #666666;
-  font-size: 12px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 5px;
-}
-
-.search-dialog-content .search-item.style-3  .info>div.source .icon-container {
-  color: rgba(0, 0, 0, 0.3);
-}
-
-/* 跨对象弹窗结束 */
-
-/* 项目基本信息开始 */
-.project-edit-container {
-  width: 100%;
-  height: 100%;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  overflow: hidden;
-}
-
-.project-edit-container>div {
-  height: 100%;
-}
-
-.project-edit-container .left-side {
-  width: 180px !important;
-  border-right: 1px solid #e2e4ec;
-  background-color: #edf1f5;
-}
-
-.project-edit-container .left-side>div {
-  width: 100%;
-}
-
-.project-edit-container .menu-header {
-  height: 120px;
-  border-bottom: 1px solid #d8dae3;
-}
-
-.project-edit-container .menu-content {
-  height: calc(100% - 60px);
-}
-
-.project-edit-container .menu-content .scroll-view {
-  width: 100%;
-  height: 100%;
-  overflow-y: auto;
-  font-size: 18px;
-}
-
-.project-edit-container .menu-item,
-.project-edit-container .group .menu-item {
-  padding: 20px 12px 20px 30px;
-  cursor: pointer;
-  position: relative;
-  color: #333333;
-  display: flex;
-  align-items: center;
-}
-
-.project-edit-container .menu-item .arrow{
-  position: absolute;
-  left: 180px;
-}
-
-.menu-item-point{
-  width: 6px;
-  height: 6px;
-  display: block;
-  border-radius: 50%;
-  background: #666;
-  
-}
-
-.project-edit-container .menu-item>.icon-container,
-.project-edit-container .group .menu-item>.icon-container {
-  margin-left: 10px;
-}
-
-.project-edit-container .menu-item::after,
-.project-edit-container .group .menu-item::after {
-  content: "";
-  width: calc(100% - 10px * 2);
-  height: 0;
-  display: block;
-  position: absolute;
-  bottom: -1px;
-  left: 10px;
-  border-bottom: 1px solid #d8dae3;
-}
-
-.project-edit-container .menu-item.active,
-.project-edit-container .group .menu-item.active {
-  background: #fff;
-}
-
-.project-edit-container .menu-item.active::after,
-.project-edit-container .group .menu-item.active::after {
-  border-bottom-color: transparent;
-}
-
-.project-edit-container .group {
-  width: 100%;
-}
-
-/* .project-edit-container  .group-detail {
-  padding-left: 10px;
-} */
-
-.project-edit-container  .group-detail .menu-item {
-  padding-left: 44px;
-}
-
-/* .project-edit-container .group-detail .menu-item::before {
-  content: "";
-  height: 6px;
-  width: 6px;
-  border-radius: 50%;
-  position: absolute;
-  top: 50%;
-  left: 30px;
-  background: #666;
-  transform: translateY(-50%);
-  position: relative;
-} */
-
-.sub-tab-menu-footer {
-  height: 60px;
-  flex-shrink: 0;
-  background: #afb8d0;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 10px;
-  font-size: 20px;
-  color: #fff;
-  cursor: pointer;
-  position: relative;
-}
-
-.sub-tab-menu-footer:hover {
-  background: #393d51;
-}
-
-.sub-tab-menu-popup {
-  position: absolute;
-  bottom: 76px;
-  left: 0;
-  right: 0;
-  display: none;
-
-}
-
-.sub-tab-menu-popup>div {
-  height: 76px;
-  flex-shrink: 0;
-  background: #afb8d0;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 10px;
-  font-size: 20px;
-  color: #fff;
-  cursor: pointer;
-  position: relative;
-}
-
-.sub-tab-menu-popup>div::after {
-  content: "";
-  width: 90%;
-  height: 1px;
-  display: block;
-  position: absolute;
-  bottom: 0;
-  left: 50%;
-  transform: translateX(-50%);
-  background: #ffffff;
-}
-
-.sub-tab-menu-popup>div:hover {
-  background: #393d51;
-}
-
-/* 鼠标悬浮时显示弹出菜单 */
-.sub-tab-menu-footer:hover .sub-tab-menu-popup {
-  display: block;
-}
-
-.project-edit-container>div.content-area {
-  width: calc(100% - 180px);
-  overflow-y: auto;
-}
-
-/* 项目基本信息结束 */
-
-/* 项目基本信息中的基本信息表格 */
-
-.base-container {
-  width: 100%;
-  padding: 32px;
-}
-
-.base-container .base-content {
-  width: 100%;
-  --border-color: #e2e4ec;
-  border-left: 1px solid var(--border-color);
-  border-top: 1px solid var(--border-color);
-}
-
-.base-container  .tr {
-  display: flex;
-  width: 1200px;
-  border-bottom: 1px solid var(--border-color);
-}
-
-.base-container  .tr>div {
-  flex-shrink: 0;
-  border-right: 1px solid var(--border-color);
-}
-
-.base-container  .th {
-  width: 200px;
-  height: 60px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  padding-right: 10px;
-  background: #f8f9fb;
-}
-
-.base-container  .td {
-  width: 400px;
-  height: 60px;
-  padding-left: 10px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  background: #ffffff;
-}
-
-.base-container  .th-1 {
-  width: 200px;
-  line-height: 3em;
-  padding-right: 10px;
-  background: #f8f9fb;
-  text-align: right;
-}
-
-.base-container  .td-1 {
-  width: 1000px;
-  padding: 10px;
-  background: #ffffff;
-}
-
-.base-container  .td-1>p {
-  padding: 5px;
-  margin: 0;
-}
-
-/* 项目基本信息中的内容表格 */
-.itembaseinfo-content-container {
-  width: 100%;
-  height: 100%;
-  padding-left: 32px;
-}
-
-.itembaseinfo-content-container .search-bar {
-  width: 100%;
-  height: 60px;
-}
-
-.itembaseinfo-content-container .content-area {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 20px;
-  height: calc(100% - 80px);
-  width: calc(100% - 8px);
-  padding: 12px;
-  overflow-y: auto;
-
-}
-
-.itembaseinfo-content-container .table-container {
-  width: 1200px;
-  border-collapse: collapse;
-}
-
-.itembaseinfo-content-container   th {
-  background: #f5f6fa;
-}
-
-.itembaseinfo-content-container   td,
-.itembaseinfo-content-container   th {
-  border: 1px solid #d8dae3;
-  padding: 20px;
-}
-
-.itembaseinfo-content-container   tr:nth-child(odd) {
-  background: #fafafa;
-}
-
-.itembaseinfo-content-container   td[data-num]::before {
-  content: attr(data-num);
-  width: 100%;
-  font-size: inherit;
-  color: #333;
-  padding-right: 5px;
-}
-
-.itembaseinfo-content-container   td.layer-2 {
-  text-indent: 2em;
-}
-
-.itembaseinfo-content-container   td.danger {
-  color: #ff0000;
-}
-
-.itembaseinfo-item-container {
-  width: 573px;
-  height: 170px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: #fafbfe;
-  border-radius: 4px;
-  position: relative;
-  cursor: pointer;
-  border: 1px solid #dddfe6;
-  --header-display: none;
-  --header-color: #999;
-}
-
-.itembaseinfo-item-container:hover {
-  --header-display: flex;
-}
-
-.itembaseinfo-item-container:hover::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #dddfe6;
-}
-
-.itembaseinfo-item-container .active {
-  border: 1px solid #ddd;
-}
-
-.itembaseinfo-item-container .action-bar {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 0;
-  right: 0;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.itembaseinfo-item-container .action-bar:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-
-.itembaseinfo-item-container .header {
-  padding: 10px 60px 2px 20px;
-}
-
-.itembaseinfo-item-container .title {
-  font-size: 22px;
-  color: #333;
-  line-height: 2em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.itembaseinfo-item-container .body {
-  padding: 0 var(--space-size, 20px);
-  box-sizing: border-box;
-  color: #333;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.itembaseinfo-item-container .body>div {
-  height: 100px;
-}
-
-.itembaseinfo-item-container .left {
-  width: 71px;
-  background: #fafbfe;
-  border: 1px solid #f6f6f6;
-}
-
-.itembaseinfo-item-container .left img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: cover;
-  object-fit: cover;
-}
-
-.itembaseinfo-item-container .right {
-  width: calc(100% - 71px);
-  padding: 5px 0 0 20px;
-}
-
-.itembaseinfo-item-container .content {
-  height: 60px;
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-  display: -webkit-box;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  -webkit-line-clamp: 2;
-  -webkit-box-orient: vertical;
-}
-
-.itembaseinfo-item-container .tip {
-  margin-top: 5px;
-  font-size: 18px;
-  color: #666;
-  line-height: 1.8em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-/* 智能识别开始 */
-.ocr-container {
-  width: 100%;
-  height: 100%;
-}
-
-.ocr-container>div {
-  width: 100%;
-}
-
-.ocr-container .content-area {
-  height: calc(100% - 60px);
-  overflow-y: hidden;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.ocr-container .content-area>div {
-  width: 50%;
-  height: 100%;
-  overflow-y: hidden;
-  margin-right: 6px;
-}
-
-.ocr-container .left-side {
-  --scroll-track-color: #e2e4ec;
-}
-
-.ocr-img-box {
-  width: 100%;
-  height: 100%;
-  background-color: #e2e4ec;
-}
-
-.ocr-img-box .img-bar {
-  height: 60px;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  padding: 0 20px;
-  background: #f8f6f7;
-  font-size: 24px;
-  color: #666666;
-  box-sizing: border-box;
-  border-right: 10px solid var(--scroll-track-color);
-}
-
-.ocr-img-box .img-bar>div {
-  width: 50%;
-  flex-shrink: 0;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.ocr-img-box  .action-bar {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  color: #d5d4db;
-  border-top: 0;
-}
-
-.ocr-img-box .img-bar .action-bar .progress {
-  width: 185px;
-  height: 4px;
-  border-radius: 2px;
-  background: #d5d4db;
-  margin-right: 20px;
-  position: relative;
-  cursor: pointer;
-}
-
-.ocr-img-box .img-bar .action-bar .progress .buoy {
-  position: absolute;
-  width: 18px;
-  height: 18px;
-  border-radius: 50%;
-  border: 2px solid #c3c6ca;
-  top: 50%;
-  transform: translateY(-50%);
-  left: 0;
-  background: #fff;
-  cursor: pointer;
-}
-
-.ocr-img-box .img-bar .action-bar .icon-container {
-  cursor: pointer;
-}
-
-.ocr-img-box .img-viewer {
-  height: calc(100% - 60px);
-  width: calc(100% - 10px);
-  position: relative;
-  overflow: hidden;
-  background: #e2e4ec;
-}
-
-.ocr-img-range-box input[type=range] {
-  position: relative;
-  z-index: 12;
-  -webkit-appearance: none;
-  /*清除系统默认样式*/
-  width: 185px;
-  height: 4px;
-  border-radius: 2px;
-  background: #d5d4db;
-  background-size: 75% 100%;
-}
-
-/*拖动块的样式*/
-.ocr-img-range-box input[type=range]::-webkit-slider-thumb {
-  -webkit-appearance: none;
-  /*清除系统默认样式*/
-  width: 18px;
-  height: 18px;
-  background: #fff;
-  /*拖动块背景*/
-  border-radius: 50%;
-  /*外观设置为圆形*/
-  border: 2px solid #c3c6ca;
-}
-
-.ocr-img-range-box {
-  position: relative;
-  width: 185px;
-  display: flex;
-  align-items: center;
-  /* 垂直居中 */
-}
-
-.ocr-img-range-box .line {
-  width: 5px;
-  height: 18px;
-  background-color: #d5d4db;
-  position: absolute;
-  left: 50%;
-  transform: translateX(-50%);
-  height: 18px;
-}
-
-.ocr-img-range-box {
-  display: flex;
-  align-items: center;
-}
-
-.zoomable-img {
-  object-fit: contain;
-  transition: transform 0.3s, width 0.3s, height 0.3s;
-}
-
-.ocr-img-box .img-viewer .img-box {
-  width: 100%;
-  overflow-y: hidden;
-  background: white;
-}
-
-.ocr-img-box .img-viewer .img-box::-webkit-scrollbar {
-  width: 8px;
-  height: 8px;
-}
-
-.ocr-img-box .img-viewer .img-box::-webkit-scrollbar-thumb {
-  border-radius: 4px;
-  background: #575d6d;
-}
-
-.ocr-img-box .img-viewer .img-box::-webkit-scrollbar-track {
-  background: var(--scroll-track-color);
-}
-
-.ocr-img-box .img-viewer .img-box>img {
-  user-drag: none;
-  -webkit-user-drag: none;
-  -khtml-user-drag: none;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  user-select: none;
-  margin: 0 auto;
-  display: block;
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-.ocr-container .content-area .right-side {
-  overflow-y: auto;
-
-  padding: 20px;
-}
-
-.ocr-container .content-area .table-container {
-  width: 100%;
-  border-collapse: collapse;
-}
-
-.ocr-container .content-area .table-container.table-header {
-  margin-bottom: 20px;
-}
-
-.ocr-container .table-container th,
-.ocr-container .table-container td {
-  border: 1px solid #e2e4ec;
-}
-
-.ocr-container .table-container th {
-  width: 30%;
-  text-align: right;
-  font-weight: normal;
-  background: #f8f9fb;
-  padding: 15px;
-  color: #666666;
-  font-size: 16px;
-}
-
-.ocr-container .table-container td {
-  width: 70%;
-  padding: 0;
-}
-
-.ocr-container .table-container td>input {
-  width: 100%;
-  outline: none;
-  padding: 15px;
-  line-height: 1em;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-}
-
-.ocr-container .table-container td>textarea {
-  width: 100%;
-  height: 120px;
-  resize: none;
-  outline: none;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-  padding: 15px;
-}
-
-.ocr-container .table-container td>select {
-  width: 100%;
-  outline: none;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-  padding: 15px;
-}
-
-
-
-.ocr-container .content-box {
-  height: calc(100% - 60px);
-  overflow-y: auto;
-  padding: 20px;
-}
-
-.ocr-container .table-container {
-  width: 100%;
-  border-collapse: collapse;
-}
-
-.ocr-container .table-container th,
-.ocr-container .table-container td {
-  border: 1px solid #e2e4ec;
-}
-
-.ocr-container .table-container th {
-  width: 30%;
-  text-align: right;
-  font-weight: normal;
-  background: #f8f9fb;
-  padding: 15px;
-  color: #666666;
-  font-size: 16px;
-}
-
-.ocr-container .table-container td {
-  width: 70%;
-  padding: 0;
-}
-
-.ocr-container .table-container td>input {
-  width: 100%;
-  outline: none;
-  padding: 15px;
-  line-height: 1em;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-}
-
-.ocr-container .table-container td>textarea {
-  width: 100%;
-  height: 120px;
-  resize: none;
-  outline: none;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-  padding: 15px;
-}
-
-.ocr-container .table-container td>select {
-  width: 100%;
-  outline: none;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-  padding: 15px;
-}
-
-.ocr-container .table-container td>div.p {
-  font-size: 16px;
-  color: #333333;
-  padding: 20px 22px;
-}
-
-.ocr-container .table-container td>div.img {
-  height: 120px;
-  display: block;
-  padding: 8px 22px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.ocr-container .table-container td>div.img>img {
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-/* 智能识别结束 */
-/* 智能识别列表开始 */
-.ocr-list-container {
-  width: 100%;
-  height: 100%;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  position: relative;
-}
-
-.ocr-list-container>div {
-  height: 100%;
-}
-
-.ocr-list-container .left-side {
-  width: 220px;
-}
-
-.ocr-list-container .left-side .action-bar {
-  border-right: 2px solid var(--action-bar-bg);
-  height: 60px;
-  --action-bar-bg: #afb8d0;
-  --action-bar-color: #fff;
-  background: var(--action-bar-bg);
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 20px;
-  color: var(--action-bar-color);
-  font-size: 18px;
-  cursor: pointer;
-}
-
-.ocr-list-container .left-side .action-bar:hover {
-  --action-bar-bg: #242835;
-  --action-bar-color: #fff;
-}
-
-.ocr-list-container .left-side>div {
-  background: #edf1f5;
-}
-
-.ocr-list-container .left-side .content-box {
-  border-right: 2px solid #e2e4ec;
-  height: calc(100% - 60px);
-  overflow-y: auto;
-  padding: 20px 10px;
-}
-
-.ocr-list-container .left-side  .item {
-  width: 100%;
-  height: 143px;
-  border: 1px solid #e2e4ec;
-  margin-bottom: 25px;
-  background: #f8f9fb;
-  position: relative;
-  cursor: pointer;
-  padding: 2px 0;
-}
-
-.ocr-list-container .left-side  .thumb {
-  height: 100px;
-  width: 100%;
-  overflow: hidden;
-}
-
-.ocr-list-container .left-side .thumb>img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-.ocr-list-container .left-side .title {
-  color: #333333;
-  font-size: 16px;
-  padding: 10px;
-}
-
-.ocr-list-container .left-side .status-tip {
-  position: absolute;
-  width: 28px;
-  height: 28px;
-  bottom: 0;
-  right: 0;
-}
-
-.ocr-list-container .left-side .status-tip.error {
-  color: #ff0000;
-}
-
-.ocr-list-container .left-side .status-tip.warn {
-  color: #ffa800;
-}
-
-.ocr-list-container .left-side .status-tip.success {
-  color: #3cb700;
-}
-
-.ocr-list-container .left-side .item.active {
-  outline: 8px solid #afb8d0;
-}
-
-.ocr-list-container .left-side .item:not(.ocr-list-container .left-side .item.active):hover {
-  outline: 15px solid #dddfe6;
-}
-
-.ocr-list-container .right-side {
-  width: calc(100% - 220px);
-}
-
-.ocr-list-container .right-side .content-box {
-  height: calc(100% - 60px);
-  overflow-y: auto;
-  padding: 20px;
-}
-
-.ocr-list-container .right-side .table-container {
-  width: 100%;
-  border-collapse: collapse;
-}
-
-.ocr-list-container .right-side .table-container.table-header {
-  margin-bottom: 20px;
-}
-
-.ocr-list-container .right-side .table-container tr.hide {
-  visibility: hidden;
-}
-
-.ocr-list-container .right-side .table-container tr.hide * {
-  padding: 0 !important;
-  margin: 0 !important;
-  border: unset !important;
-  outline: unset !important;
-}
-
-.ocr-list-container .right-side .table-container th,
-.ocr-list-container .right-side .table-container td {
-  border: 1px solid #e2e4ec;
-}
-
-.ocr-list-container .right-side .table-container th {
-  width: 200px;
-  text-align: right;
-  font-weight: normal;
-  background: #f8f9fb;
-  padding: 15px;
-  color: #666666;
-  font-size: 16px;
-}
-
-.ocr-list-container .right-side .table-container td {
-  padding: 0;
-}
-
-.ocr-list-container .right-side .table-container td:not([colspan]) {
-  width: 360px;
-}
-
-.ocr-list-container .right-side .table-container td[colspan="3"] {
-  width: calc(100% - 200px);
-}
-
-.ocr-list-container .right-side .table-container td>input {
-  width: 100%;
-  outline: none;
-  padding: 15px;
-  line-height: 1em;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-}
-
-.ocr-list-container .right-side .table-container td>textarea {
-  width: 100%;
-  height: 120px;
-  resize: none;
-  outline: none;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-  padding: 15px;
-}
-
-.ocr-list-container .right-side .table-container td>select {
-  width: 100%;
-  outline: none;
-  border: unset;
-  color: #333333;
-  font-size: 16px;
-  padding: 15px;
-}
-
-/* 智能识别列表结束 */
-/* 成功弹窗开始 */
-.success-popup {
-  position: absolute;
-  bottom: var(--message-dialog-bottom, calc(100% + 5px));
-  right: var(--message-dialog-right, 0);
-  width: 459px;
-  height: 150px;
-  background: #ffffff;
-  border: 1px solid #ade791;
-  box-shadow: 10px 10px 5px 0px rgba(61, 187, 0, 0.3);
-  border-radius: 4px;
-  color: #333;
-  font-size: 18px;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.success-popup>div.left {
-  width: 180px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.success-popup .icon {
-  width: 82px;
-  height: 82px;
-  background: #3dbb00;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  border-radius: 50%;
-  color: #fff;
-}
-
-.success-popup>.right {
-  width: calc(100% - 180px);
-}
-
-.success-popup>.right>div {
-  text-align: left;
-}
-
-.success-popup .title {
-  font-size: 36px;
-  color: #666666;
-}
-
-.success-popup .desc {
-  margin-top: 10px;
-  font-size: 24px;
-  color: #333;
-}
-
-/* 失败弹窗开始 */
-.errorDialog {
-  position: absolute;
-  left: 50%;
-  top: 50%;
-  transform: translate(-50%, -50%);
-  width: 587px;
-  height: 300px !important;
-  background: #ffffff;
-  border: 1px solid #e1adad;
-  box-shadow: 0px 10px 5px 0px rgba(236, 59, 56, 0.3);
-  border-radius: 4px;
-  color: #333;
-  font-size: 18px;
-}
-
-.errorDialog .body {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  padding: 50px 20px;
-}
-
-.errorDialog .left {
-  width: 180px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.errorDialog .icon {
-  width: 82px;
-  height: 82px;
-  background: #ec3b38;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  border-radius: 50%;
-  color: #fff;
-}
-
-.errorDialog .body>.right {
-  width: calc(100% - 180px);
-}
-
-.errorDialog .body>.right>div {
-  text-align: left;
-}
-
-.errorDialog .title {
-  font-size: 36px;
-  color: #666666;
-}
-
-.errorDialog .desc {
-  margin-top: 10px;
-  font-size: 24px;
-  color: #333;
-}
-
-.errorDialog .footer {
-  padding: 10px 40px;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.errorDialog .btn {
-  cursor: pointer;
-  width: 120px;
-  height: 42px;
-  background: #ef5d0c;
-  border: 1px solid #f5904b;
-  border-radius: 4px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 15px;
-  color: #fff;
-}
-
-/* 审核开始 */
-.verify-container {
-  width: 100%;
-  height: 100%;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.verify-container>div {
-  height: 100%;
-}
-
-/* 左侧主内容区域 */
-.verify-container .left-side {
-  width: 100%; /* 默认状态下,右侧只占10px */
-  transition: width 0.3s ease;
-  position: relative;
-}
-
-.verify-container .left-side>div {
-  border-right: 2px solid #e2e4ec;
-}
-
-.verify-container  .content-box {
-  height: calc(100% - 60px * 2 - 30px);
-  padding: 20px 24px;
-  border-bottom: 1px solid #e2e4ec;
-  overflow-y: auto;
-}
-
-.verify-container .content-box>div {
-  background: #ffffff;
-  border: 1px solid #dddfe6;
-  border-radius: 4px;
-  padding: 24px;
-  position: relative;
-}
-
-.verify-container .content-box>div:not(:last-child) {
-  margin-bottom: 20px;
-}
-
-.verify-container .handle-bar {
-  position: absolute;
-  top: 1px;
-  left: 1px;
-  font-weight: bold;
-  cursor: pointer;
-}
-
-.verify-container .member-box .box-header .title {
-  color: #333;
-  font-size: 18px;
-  line-height: 1.8em;
-}
-
-.verify-container .member-box .box-body {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  gap: 6px;
-}
-
-.verify-container .box-body>div {
-  height: 112px;
-}
-
-.verify-container .avatar {
-  width: 81px;
-}
-
-.verify-container .left-side .box-body .avatar>img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: contain;
-  object-fit: contain;
-}
-
-.verify-container .left-side .box-body .info {
-  width: calc(100% - 81px);
-  padding-left: 24px;
-}
-
-.verify-container .left-side .box-body .info .table {
-  padding: 5px 0 15px 0;
-}
-
-.verify-container .left-side .box-body .info .table>table {
-  border-collapse: collapse;
-}
-
-.verify-container .left-side .box-body .info .table>table td {
-  border: 1px solid #dddfe6;
-  padding: 5px 32px;
-  text-align: center;
-  color: #333;
-  font-size: 16px;
-}
-
-.verify-container .left-side .box-body .info .description {
-  color: #666;
-  font-size: 16px;
-}
-
-.verify-container .left-side .zhengshu-box .box-header .title {
-  color: #333;
-  font-size: 18px;
-  line-height: 1.8em;
-}
-
-.verify-container .left-side .zhengshu-box .box-body {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.verify-container .left-side .box-body>div {
-  height: 103px;
-}
-
-.verify-container .left-side .avatar {
-  width: 145px;
-}
-
-.verify-container .left-side .avatar>img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: cover;
-  object-fit: cover;
-}
-
-.verify-container .left-side .info {
-  padding-left: 24px;
-  width: calc(100% - 145px);
-}
-
-.verify-container .left-side .p {
-  font-size: 16px;
-  color: #333;
-  padding: 5px 0 15px 0;
-}
-
-.verify-container .left-side .p>p {
-  line-height: 1.5em;
-  padding: 0;
-  margin: 0;
-}
-
-.verify-container .left-side .tip {
-  font-size: 16px;
-  color: #666666;
-}
-
-.verify-container .action-bar-1 {
-  border-top: 1px solid #e2e4ec;
-  position: absolute;
-  width: 100%;
-  bottom: 60px;
-  height: 90px;
-  background: #ffffff;
-}
-
-.verify-container .action-list {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  height: 50px;
-  padding: 0 28px;
-  gap: 28px;
-}
-
-.verify-container .action-list>.span {
-  cursor: pointer;
-}
-
-.verify-container .input-area {
-  height: 40px;
-  padding: 0 28px;
-}
-
-.verify-container .input-area>textarea,
-.verify-container .input-area>input {
-  padding: 0;
-  line-height: 40px;
-  width: 100%;
-  height: 100%;
-  resize: none;
-  font-size: 18px;
-  outline: unset;
-  border: unset;
-  background: unset;
-}
-
-.verify-container .action-bar-2 {
-  height: 50px;
-  background: #ffffff;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  padding: 10px 20px 10px 20px;
-  gap: 20px;
-  color: #999999;
-  font-size: 18px;
-}
-
-.verify-container .action-bar-2>button {
-  font-size: inherit;
-  --action-bar-bg: transparent;
-  --action-bar-color: inherit;
-  --action-bar-border: #bfc1c6;
-  background: var(--action-bar-bg);
-  border: 1px solid var(--action-bar-border);
-  color: var(--action-bar-color);
-  outline: none;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 10px;
-  padding: 5px 20px;
-  border-radius: 4px;
-  cursor: pointer;
-}
-
-.verify-container .btn-primary:hover {
-  --action-bar-bg: #242835;
-  --action-bar-border: #242835;
-  --action-bar-color: #fff;
-}
-
-.verify-container .btn-danger:hover {
-  --action-bar-bg: #f19149;
-  --action-bar-color: #fff;
-  --action-bar-border: #f19149;
-}
-
-.verify-container .right-side {
-  width: 16px; 
-  height: 100%;
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  background: transparent;
-  transition: width 0.3s ease;
-  overflow: hidden; /* 超出部分隐藏 */
-  z-index: 10001; /* 确保在左侧内容之上 */
-}
-
-.verify-container .right-side-div {
-  width: 280px;
-  overflow-y: auto;
-  background: #edf1f5;
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-}
-.verify-container .right-side-div .header {
-  border-bottom: 2px solid #e2e4ec;
-}
-
-/* 右侧边栏 - 展开状态 */
-.verify-container .right-side.expanded {
-  width: 296px;
-}
-
-.verify-container .right-side .btn-toggle::before{
-	content: "";
-    position: absolute;
-    left: -8px;
-    top: -4px;
-    width: 20px;
-    height: 20px;
-    transform-origin: 100% 100%;
-    transform: rotate(49deg);
-    z-index: 1;
-    border-left: 1px solid #d2d2d2;
-    background: #ffffff;
-}
-.verify-container .right-side .btn-toggle {
-  position: absolute;
-  bottom: 25%;
-  left: 0;
-  transform: translateY(30%);
-  width: 16px;
-  height: 16px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  cursor: pointer;
-  z-index: 10;
-  border:1px solid #d2d2d2;
-  border-right: none;
-  border-top: none;
-  background: #ffffff;
-}
-.verify-container .right-side .icon-container{
-	background: #fff;
-	position:relative;
-	z-index: 1000;
-}
-/* 右侧内容容器 - 只在展开状态显示 */
-.verify-container .right-side-content {
-  opacity: 0;
-  transition: opacity 0.2s ease;
-  width: 100%;
-  height: 100%;
-  padding-left: 16px; /* 留出箭头区域 */
-  box-sizing: border-box;
-  position: relative;
-  z-index: 1000;
-}
-
-/* 展开状态下显示内容 */
-.verify-container .right-side.expanded .right-side-content {
-  opacity: 1;
-}
-
-.verify-nodes {
-  flex: 1;
-  overflow-y: auto;
-  padding: 20px 0;
-  margin-right: 6px;
-}
-
-.verify-nodes .group-item {
-  margin-bottom: 12px;
-  padding: 8px 0 8px 20px;
-}
-
-.verify-nodes .group-item {
-  position: relative;
-}
-/* .verify-nodes .group-item::before {
-  position: absolute;
-  content: "";
-  width: 0;
-  height: 50%;
-  border-left: 1px solid #a0a0a0;
-  top: 37px;
-  left: 30px;
-}*/
-.verify-nodes .group-item:not(:last-child)::after {
-  position: absolute;
-  content: "";
-  width: 0;
-  height: calc(100% - 20px);
-  border-left: 1px solid #a0a0a0;
-  top: 37px;
-  left: 30px;
-} 
-.verify-nodes .group-item-last-open::after {
-  position: absolute;
-  content: "";
-  width: 0;
-  height: var(--group-line-height);
-  border-left: 1px solid #a0a0a0;
-  top: 37px;
-  left: 30px;
-}
-.verify-nodes .group-item-title {
-  cursor: pointer;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 10px;
-}
-
-.verify-nodes .group-item .icon {
-  color: #666666;
-  position: relative;
-}
-
-.verify-nodes .group-item .num {
-  position: absolute;
-  top: 60%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  color: #999999;
-  font-size: 14px;
-}
-
-.verify-nodes .group-item-children {
-
-  padding-left: 20px;
-}
-
-.verify-node-container {
-  padding: 16px 0;
-}
-
-.verify-node-container>.info {
-  padding: 0 10px;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  height: 60px;
-}
-
-
-.verify-node-container>.info>.avatar {
-  width: 50px;
-  height: 50px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.verify-node-container>.info>.desc {
-  width: calc(100% - 60px - 60px);
-  color: #333333;
-  font-size: 14px;
-  line-height: 1.6em;
-  padding: 0 10px;
-  display: flex;
-  flex-direction: column;
-  justify-content: flex-end;
-}
-
-.verify-node-container>.info>.desc>div {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.verify-node-container>.info>.link {
-  width: 60px;
-}
-
-.verify-node-container>.info>.link>div {
-  padding-top: 30px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 10px;
-  color: #555c6b;
-}
-
-.verify-node-container .description {
-  /* margin-top: 5px; */
-  padding: 10px;
-}
-
-.verify-node-container .description.link {
-  position: relative;
-}
-
-.verify-node-container .description.link::before {
-  position: absolute;
-  width: 20px;
-  content: "";
-  height: 0;
-  border-bottom: 1px solid #a0a0a0;
-  top: 30px;
-  left: -10px;
-}
-
-.verify-node-container .description.link::after {
-  position: absolute;
-  width: 16px;
-  content: attr(data-num);
-  height: 16px;
-  border-radius: 50%;
-  background: #edf1f5;
-  border: 1px solid #a0a0a0;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  font-size: 12px;
-  top: 21px;
-  left: -18px;
-  z-index: 100;
-}
-
-.verify-node-container .description>div {
-  width: 100%;
-  background: #fff;
-  border-radius: 3px;
-  position: relative;
-  padding: 8px 17px;
-  color: #333333;
-  font-size: 14px;
-}
-
-.verify-node-container .description>div::before {
-  content: "";
-  width: 10px;
-  height: 10px;
-  background: #fff;
-  position: absolute;
-  left: 26px;
-  top: -5px;
-  transform: rotate(45deg);
-  border-radius: 2px;
-}
-
-.verify-node-container .time {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  color: #666666;
-  font-size: 14px;
-  padding: 0 10px;
-}
-
-/* 审核结束 */
-/* 知识库弹窗查看项目 */
-.know-item-container {
-  width: 587px;
-  height: 157px;
-  box-shadow: 2px 2px 5px #e7e8e8;
-  background: #fafbfe;
-  border-radius: 4px;
-  position: relative;
-  cursor: pointer;
-  --header-display: none;
-  --header-color: #999;
-}
-
-.know-item-container:hover {
-  --header-display: flex;
-}
-
-.know-item-container:hover::after {
-  --border-size: 8px;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: calc(-1 * var(--border-size));
-  left: calc(-1 * var(--border-size));
-  content: "";
-  border-radius: 4px;
-  pointer-events: none;
-  box-sizing: content-box;
-  border: var(--border-size) solid #dddfe6;
-}
-
-.know-item-container.active {
-  border: 1px solid #ddd;
-}
-
-.know-item-container .header {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  display: var(--header-display);
-  color: var(--header-color);
-  top: 0;
-  right: 0;
-  position: absolute;
-  border-top-right-radius: 4px;
-}
-
-.know-item-container .header:hover {
-  --header-color: #fff;
-  background: #575d6d;
-}
-
-.know-item-container .body {
-  padding: 0px 25px;
-}
-
-.know-item-container .box-header {
-  height: 50px;
-  padding: 15px 0 5px 0;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.know-item-container .box-header .title {
-  width: 100%;
-  color: #333333;
-  font-size: 22px;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 10px;
-}
-
-.know-item-container .box-header .title>div {
-  flex-shrink: 0;
-}
-
-.know-item-container .box-header .title .p {
-  width: calc(100% - 50px);
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.know-item-container .box-body {
-  height: 57px;
-  color: #333;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  --right-padding-left: 12px;
-  --right-width: calc(100% - 100px);
-}
-
-.know-item-container .no-thumb {
-  --right-padding-left: 0;
-  --right-width: 100%;
-}
-
-.know-item-container .left {
-  width: 100px;
-  height: 100%;
-}
-
-.know-item-container .left>img {
-  width: 100%;
-  height: 100%;
-  -o-object-fit: cover;
-  object-fit: cover;
-  display: block;
-}
-
-.know-item-container .right {
-  width: var(--right-width);
-  padding-left: var(--right-padding-left);
-}
-
-.know-item-container .right .title {
-  font-size: 16px;
-  color: #666666;
-  line-height: 24px;
-  display: -webkit-box;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  -webkit-line-clamp: 2;
-  -webkit-box-orient: vertical;
-}
-
-.know-item-container .box-footer {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  flex-direction: column;
-  height: 47px;
-}
-
-.know-item-container .box-footer>div {
-  width: 100%;
-}
-
-.know-item-container .box-footer .info {
-  margin-top: 5px;
-  font-size: 14px;
-  color: #999999;
-  line-height: 1.2em;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  gap: 20px;
-}
-
-.know-item-container .progress {
-  margin-top: 2px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  --status-color: #3172f1;
-}
-
-.know-item-container .progress.error {
-  --status-color: #ff0000;
-}
-
-.know-item-container .progress.waiting {
-  --status-color: #3172f1;
-}
-
-.know-item-container .status {
-  font-size: 12px;
-  padding-right: 1em;
-  color: var(--status-color);
-}
-
-.know-item-container .line {
-  flex: 1;
-  padding: 10px 0;
-  position: relative;
-}
-
-.know-item-container .line::after {
-  content: "";
-  background: #edf1f5;
-  width: 100%;
-  height: 2px;
-  border-radius: 1px;
-  position: absolute;
-  top: 50%;
-  left: 0;
-  transform: translateY(-50%);
-  z-index: 1;
-}
-
-.know-item-container .line>div {
-  z-index: 2;
-  width: 100%;
-  height: 2px;
-  border-radius: 1px;
-  position: absolute;
-  top: 50%;
-  left: 0;
-  transform: translateY(-50%);
-  background: var(--status-color);
-}
-
-.know-item-container .bar {
-  color: #c3c7cb;
-  padding-left: 1em;
-}
-
-/* 增加预警 */
-.editor-container {
-  width: 100%;
-  height: 100%;
-}
-
-.editor-container .content-box {
-  height: calc(100% - 60px);
-  padding: 25px 24px;
-}
-
-.editor-container .header {
-  height: 172px;
-}
-
-.editor-container .header>table {
-  border-collapse: collapse;
-}
-
-.editor-container .header th,
-.editor-container .header td {
-  border: 1px solid #e2e4ec;
-  padding: 20px;
-}
-
-.editor-container .header th {
-  width: 160px;
-  background: #f8f9fb;
-  color: #666666;
-  font-size: 16px;
-  text-align: right;
-  font-weight: normal;
-}
-
-.editor-container .header td {
-  color: var(--td-default-color, #333);
-  font-size: 16px;
-}
-
-.editor-container .desc {
-  --td-default-color: #666;
-}
-
-.editor-container .content-box .header select {
-  width: 100px;
-  font-size: inherit;
-  height: 100%;
-  outline: unset;
-  border: unset;
-  color: #999;
-}
-
-.editor-container .content-box .body {
-  height: calc(100% - 172px);
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  gap: 20px;
-}
-
-.editor-container .content-box .body>div {
-  width: 50%;
-  height: 100%;
-  border: 1px solid #e7e8e8;
-  box-shadow: 2px 3px 5px 0px rgba(0, 0, 0, 0.06);
-}
-
-.editor-container .content-box .body>div>div {
-  width: 100%;
-}
-
-.editor-container .item-header {
-  height: 60px;
-  border-bottom: 1px solid #eaeaea;
-  padding: 0 20px;
-  font-size: 22px;
-  color: #4d4d4d;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.editor-container .item-header-left {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  gap: 10px;
-}
-
-.editor-container .item-header-left .icon-container {
-  color: #989898;
-}
-
-.editor-container .item-header-right {
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 5px;
-}
-
-.editor-container .item-header-right input {
-  width: 100px;
-  height: 24px;
-  border: 1px solid #eaeaea;
-  border-radius: 2px;
-  outline: none;
-  padding: 0 10px;
-}
-
-.editor-container .item-header-right .icon-container {
-  color: #c3c7cb;
-}
-
-.editor-container .item-body {
-  padding-right: 6px;
-  height: calc(100% - 60px);
-  overflow-y: auto;
-}
-
-.editor-container .box-body {
-  width: 100%;
-  height: 100%;
-  overflow-y: auto;
-  overflow: hidden;
-  border: 1px solid #e2e4ec;
-}
-
-.editor-container .content-area {
-  width: 100%;
-}
-
-.editor-container .action-bar {
-  height: 60px;
-  color: #c3c6ca;
-  border-bottom: 1px solid #dedfdf;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-}
-
-.editor-container .action-bar .group {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  align-items: center;
-  position: relative;
-}
-
-.editor-container .action-bar .group::after {
-  content: "";
-  width: 0;
-  height: 60%;
-  top: 50%;
-  position: absolute;
-  right: 0;
-  border-right: 1px solid #efeff0;
-  transform: translateY(-50%);
-}
-
-.editor-container .action-bar .group>div {
-  width: 50px;
-  height: 60px;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-}
-
-.editor-container .content-area {
-  height: calc(100% - 60px);
-}
-
-.editor-container .content-area textarea {
-  width: 100%;
-  height: 100%;
-  resize: none;
-  outline: unset;
-  border: unset;
-  padding: 10px 20px;
-  font-size: 16px;
-  color: #333;
-}
-
-/* 弹窗底部按钮样式 */
-.bottom-div{
-  height: 60px;
-  background: white;
-  border-top: 1px solid #e2e4ec;
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  align-items: center;
-  padding: 0 20px;
-  gap: 20px;
-  color: #999999;
-  font-size: 18px;
-  position: absolute;
-  width: 100%;
-  bottom: 0;
-  background: #fff !important;
-}
-
-.bottom-div button {
-  font-size: 18px;
-  --bottom-div-bg: transparent;
-  --bottom-div-color: inherit;
-  --bottom-div-border: #bfc1c6;
-  background: var(--bottom-div-bg);
-  border: 1px solid var(--bottom-div-border);
-  color: var(--bottom-div-color);
-  outline: none;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  gap: 5px;
-  padding: 5px 20px;
-  border-radius: 4px;
-  cursor: pointer;
-}
-
-.bottom-div button:hover {
-  --bottom-div-bg: #242835;
-  --bottom-div-color: #fff;
-}
-.bottom-div  .bottom-button-reject:hover{
-  --bottom-div-bg: #e65505 ;
-  --bottom-div-color: #fff;
-  --bottom-div-border: #e65505;
-}
-
-/* 下拉按钮开始 */
-.ss-drop-button {
-  height: 36px;
-  font-size: 16px;
-  color: #999;
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-items: center;
-  padding: 0 20px;
-  border-radius: 4px;
-  margin: 0;
-  /* line-height: 2em; */
-  cursor: pointer;
-  background: var(--btn-bg, unset);
-  color: var(--btn-color, #999999);
-  border: 1px solid var(--btn-border-color, #c4c7cc);
-  position: relative;
-}
-
-.ss-drop-button:hover {
-  --btn-bg: #393d51;
-  --btn-color: #fff;
-}
-
-.ss-drop-button .popup {
-  position: absolute;
-  top: calc(100% + 12px);
-  right: 0;
-  background-color: #393d51;
-  border-radius: 5px;
-  padding: 10px 4px;
-  z-index: 10;
-  height: auto;
-}
-
-.ss-drop-button .popup::before {
-  content: "";
-  position: absolute;
-  top: -12px;
-  /* 与弹窗的 top: calc(100% + 12px) 对应 */
-  left: 0;
-  right: 0;
-  height: 12px;
-  background: transparent;
-  /* 透明背景 */
-}
-
-.ss-drop-button .popup::after {
-  content: "";
-  width: 0.8em;
-  height: 0.8em;
-  background: #393d51;
-  position: absolute;
-  right: 1.5em;
-  top: -0.4em;
-  transform: rotate(45deg);
-
-}
-
-.ss-drop-button .popup div {
-  padding: 5px 15px;
-  cursor: pointer;
-  white-space: nowrap;
-}
-
-.ss-drop-button .popup div:hover {
-  background: #fffdfd;
-  color: #333;
-}
-.ss-drop-button-more::before{
-  width: 6px;
-  height: 6px;
-  content: '';
-  border-radius: 50%;
-  background-color: #8e8e8e;
-  position: absolute;
-  right: 4px;
-  top: 4px;
-}
-/* 下拉按钮结束 */
-/* 通用查询卡片下拉按钮开始 */
-.cart-list-button-popup{
-  position: absolute;
-  top: calc(100% + 8px);
-  right: -8px;
-  background-color: #393d51;
-  border-radius: 5px;
-  padding: 10px 4px;
-  z-index: 10;
-}
-.cart-list-button-popup::before {
-  content: "";
-  position: absolute;
-  top: -10px;
-  left: 0;
-  right: 0;
-  height: 10px;
-  background: transparent;
-}
-
-.cart-list-button-popup::after {
-  content: "";
-  width: 0.6em;
-  height: 0.6em;
-  background: #393d51;
-  position: absolute;
-  right: 1.7em;
-  top: -0.3em;
-  transform: rotate(45deg);
-}
-.cart-list-button-popup>div {
-  padding: 5px 15px;
-  cursor: pointer;
-  white-space: nowrap;
-  font-size: 16px;
-  display: flex;
-  align-items: center;
-}
-.cart-list-button-popup .cart-list-icon{
-  margin-right: 5px;
-  font-size: 16px;
-}
-.cart-list-button-popup>div:hover {
-  background: #fffdfd;
-  color: #333;
-}
-.cart-list-button-popup>div:hover .cart-list-icon::before{
-  color: #333333 !important;
-}
-/* 通用查询卡片下拉按钮结束 */
-
-/* 一级页面面包屑 */
-.bread-crumb{
-  display: flex;
-  align-items: center;
-  position: absolute;
-  left: 20px;
-  gap: 10px;
-  height: 100%;
-  z-index: 111;
-  color: #999999;
-}
-.bread-crumb>div{
-  cursor: pointer;
-}
-
-
-/* 日期选择器样式 */
-
-.el-date-table,.el-time-spinner__item{
-  font-size: 14px;
-}
-.custom-date-picker  .el-icon{
-  font-size: 16px;
-  color: #333;
-}
-.custom-date-picker .el-input__wrapper {
-  box-shadow: none !important;
-  display: flex;
-  align-items: center;
-}
-.custom-date-picker .el-input__inner::placeholder {
-  color: #999;
-
-}
-.custom-date-picker .el-input__inner {
-  font-size: 16px !important;
-  font-weight: normal;
-  height: 32px;
-  line-height: 33px;
-  color: #000;
-}
-.today .el-date-table-cell__text{
-  border: 1px solid #000;
-  border-radius: 50%;
-}
-.el-picker-panel__icon-btn{
-  margin-top: 0;
-}
-.el-date-picker__time-header{
-  padding: 12px 5px;
-  border-bottom: none;
-}
-.el-picker-panel__footer,.el-time-panel__footer{
-  border-top: none;
-  padding: 5px 10px 10px;
-}
-.el-button--small{
-  font-size: 14px;
-  padding: 14px 16px;
-
-}
-.el-time-panel__footer{
-  height: auto;
-  line-height: 25px;
-  display: flex;
-  justify-content: flex-end;
-}
-.el-time-panel__btn{
-  font-size: 14px;
-  height: 24px;
-  padding: 14px 16px;
-  margin:0;
-  line-height: unset;
-  display: flex;
-  align-items: center;
-}
-.el-input--small{
-  font-size: 16px;
-}
-.el-input--small .el-input__wrapper{
-  padding: 8px 7px 6px;
-}
-.jodit-container:not(.jodit_inline){
-  border: none !important;
-}
-/* 搜索区域的日期选择器 */
-.ss-search-date-picker input:focus,.el-picker-panel .el-input__inner:focus{
-  border:1px solid #c4c7cc !important;
-  outline: none;
-}
-.ss-search-date-picker .custom-date-picker  .el-icon{
-  font-size: 16px;
-  color: #333;
-}
-.ss-search-date-picker  .el-input--large .el-input__wrapper{
-  padding:0;
-}
-.ss-search-date-picker .el-input__wrapper {
-  height: 32px;
-  width: 100%;
-  padding:0;
-}
-.ss-search-date-picker .el-input__prefix, .ss-search-date-picker .el-input__suffix {
-  display: none;
-}
-.ss-search-date-picker .custom-date-picker .el-input__inner::placeholder {
-  color: #333;
-
-}
-.ss-search-date-picker .custom-date-picker .el-input__inner {
-  width: 100%;
-  font-size: 14px !important;
-  font-weight: normal;
-  height: 32px;
-  line-height: 33px;
-  font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
-}
-.ss-search-date-picker .el-input__inner::placeholder {
-  font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
-  color: #999999 !important;
-}
-.el-picker-panel .el-input__inner{
-  width: 100% !important;
-}

+ 0 - 1133
alf/commonValidator.js

@@ -1,1133 +0,0 @@
-/**
- * validator(校验器)文件 110613
- *
- *
- */
-wd.commonValidator={};
-var lsSfzh;
-/**
- * 非空校验器
- */
-wd.commonValidator.notNull =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-
-		var rs = '';
-		var msgPrefix = params['msgPrfx'];//消息头
-
-		var minValue = params['minLen'];//最断数值
-		var maxValue = params['maxLen'];//最长数值
-		var length = params['len'];//长度
-		var trim =typeof params['trim']=="undefined"?true:params['trim'];//前后空格,true则不能保留空格,trim默认值为true
-		var allNull =typeof params['allNull']=="undefined"?false:params['allNull'];//允许全部为空  2022-01-10
-
-/// 增加 noZero="true",值为 0 时,也作为空 -- 默认值为 true。Lin
- //    解决不允许为空的 码(int)、ID(long) 有默认值 0 的问题
-		var noZero = (typeof params['noZero']=="undefined")? true : params['noZero'];
-///
-
-		if(!wd.commonValidator.condition.call(this,valueArr,params))return rs;
-
-//		trim=(trim==null||trim==undefined)?true:trim;//
-		var regTrim = /(^\s+)|(\s+$)/;
-
-		var isNullCount = 0;
-		var isBlankBefore = false;//曾经有空格
-		var nullArr=[];
-		for(var i=0;i<valueArr.length;i++){
-			var value = valueArr[i];
-/* 改,增加 noZero="true",值为 0 时,也作为空 -- 默认值为 true。Lin
-			if(value==null||value==''||value==undefined){
-*/			if (value==null || value=='' || value==undefined || (noZero && value==0)) {
-				nullArr.push(i);
-			}
-			/* 在公共校验器已经校验了
-			if(value!=null&&value!=''){
-					if(minValue!=null && value.length < minValue){
-						rs += msgPrefix+'应至少'+minValue+'个字符\r\n';
-					}
-					if(maxValue!=null&&value.length> maxValue){
-						rs += msgPrefix+'应不超过'+maxValue+'个字符\r\n';
-					}
-					if(maxValue!=null&&value.length> maxValue){
-						rs += msgPrefix+'应不超过'+maxValue+'个字符\r\n';
-					}
-			}*/
-			if(trim){
-				if(value&& regTrim.test(value)&&isBlankBefore==false){
-					rs += msgPrefix+'前后不能包含空格!\r\n';
-					isBlankBefore=true;
-				}
-			}
-		}
-
-//		isNullCount==valueArr.length
-		if(nullArr.length>0){
-
-			//一个值
-			if(valueArr.length==1){
-				rs += msgPrefix+'不能为空!\r\n';
-			}else{
-				//多值
-				var pp=msgPrefix.split(/,/);
-				if(valueArr.length==nullArr.length){
-					if(!allNull){
-						rs += pp.join(",")+'不能全为空!\r\n';
-					}
-				}else{
-					for(var i=0;i<nullArr.length;i++){
-						var index=nullArr[i];
-						rs += pp[index]+'不能为空!\r\n';
-					}
-				}
-			}
-		}
-
-		rs += wd.commonValidator.validator(valueArr,params);
-		return rs;
-}
-
-
-wd.commonValidator.idCard =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-//	console.log("---------------------------------------");
-//	console.log(valueArr);
-//	console.log(params);
-//	console.log("---------------------------------------");
-	var rs = "";//返回的校验结果
-
-	var value=valueArr[0];//身份证号值
-	var sex;
-	var csdqm;
-	var birthday;
-
-
-//	value=this.getElementValue("sfzh");
-
-	birthday=this.getElementValue("csrq");
-	if(birthday)
-		birthday = birthday.replace(/-/g,'');
-
-	sex=this.getElementValue("xbm");
-
-	csdqm=this.getElementValue("csdqm");
-	//仅校验身份号码	
-	var sfzjlbm =params['sfzjlbm']||this.getElementValue(params['sfzjlbmName'])||this.getElementValue("sfzjlbm")||"1"; //valueArr[3];//身份证件类别码
-
-
-	var msgPrefix = params['msgPrfx']||"";//消息头
-/* 改,增加默认值。Lin
-	var idCardNotNull = params['idCardNotNull'];//身份证号不能为空
-*/  var idCardNotNull = (params['notBlank']? params['notBlank'] : false);
-	if (!value && idCardNotNull)
-	{
-		rs+=msgPrefix+'身份证件号不能为空!\r\n';
-	}
-
-
-
-
-	//如果证件类型为身份证,且不为空
-	//如果身份证为888开头的,就不验证
-	if(!value||sfzjlbm!=1||value.match(/^888.*/)){
-		return rs;
-	}
-
-	var getBirthdayByIdCard;
-
-	var Errors=new Array(
-	"",
-	msgPrefix+"身份证号位数不对!\r\n",
-	msgPrefix+"身份证号出生日期超出范围或含有非法字符!\r\n",
-	msgPrefix+"身份证号校验错误!(如果含X的,必须是大写半角的X!)\r\n",
-	msgPrefix+"身份证地区非法!\r\n"
-	);
-	var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
-	var Y,JYM;
-	var S,M;
-	var value_array = new Array();
-	value_array = value.split("");
-
-	switch(value.length){
-	case 15:
-		if ((parseInt(value.substr(6,2))+1900) % 4 == 0 || ((parseInt(value.substr(6,2))+1900) % 100 == 0 && (parseInt(value.substr(6,2))+1900) % 4 == 0 )){
-			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
-		} else {
-			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
-		}
-		if(ereg.test(value)) rs+=Errors[0];
-		else rs+=Errors[2];
-		break;
-	case 18:
-		//18位身份号码检测
-		//出生日期的合法性检查
-		//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
-		//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
-		if ( parseInt(value.substr(6,4)) % 4 == 0 || (parseInt(value.substr(6,4)) % 100 == 0 && parseInt(value.substr(6,4))%4 == 0 )){
-			ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
-		} else {
-			ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
-		}
-		if(ereg.test(value)){//测试出生日期的合法性
-		//计算校验位
-			S = (parseInt(value_array[0]) + parseInt(value_array[10])) * 7
-			+ (parseInt(value_array[1]) + parseInt(value_array[11])) * 9
-			+ (parseInt(value_array[2]) + parseInt(value_array[12])) * 10
-			+ (parseInt(value_array[3]) + parseInt(value_array[13])) * 5
-			+ (parseInt(value_array[4]) + parseInt(value_array[14])) * 8
-			+ (parseInt(value_array[5]) + parseInt(value_array[15])) * 4
-			+ (parseInt(value_array[6]) + parseInt(value_array[16])) * 2
-			+ parseInt(value_array[7]) * 1
-			+ parseInt(value_array[8]) * 6
-			+ parseInt(value_array[9]) * 3 ;
-			Y = S % 11;
-			M = "F";
-			JYM = "10X98765432";
-			M = JYM.substr(Y,1);//判断校验位
-			if(M == value_array[17]) rs+=Errors[0]; //检测ID的校验位
-			else rs+=Errors[3];
-		}else
-			rs+=Errors[2];
-
-
-		break;
-	default:
-		rs+=Errors[1];
-	break;
-	}
-
-
-
-
-//	if(birthPlaceValidate&&!rs){
-//		var csdq = value.substring(0,6);
-//		if(!csdqm||csdqm!=csdq){//不存在,或者不相等,校验失败
-//			rs+=msgPrefix+'出生地区与身份证号不符!\r\n';
-//		}
-//	}
-
-
-
-
-
-	try{
-
-
-
-		var setValue = params['autoFill']?params['autoFill']:true;//自动填写性别、出生地区、出生日期
-		if(!rs&&setValue&&(value.length==15||value.length==18)&&(!birthday||!sex)){
-
-			var current_lsSfzh=lsSfzh;
-			lsSfzh =value;
-
-			var xbmVal;
-			if(value.length == 15){
-				xbmVal=(value.substring(14,15)%2==0?2:1);
-			}else{
-				xbmVal=(value.substring(16,17)%2==0?2:1);
-			}
-			this.setElementValue("xbm",xbmVal);
-
-
-			this.setElementValue("csrq",value.substring(6,10)+"-"+value.substring(10,12)+"-"+value.substring(12,14));
-			//处理出生地区
-
-			//批量录入不支持级联,下面唔改住
-//			var csdqm = value.substring(0,6);
-			var thiscsdqm= this.getElementValue("csdqm");
-			var thisjgdqm= this.getElementValue("jgdqm");
-			thishkdqm= this.getElementValue("hkdqm");
-			csdqm = value.substring(0,6);
-
-			if(current_lsSfzh!=value&&(!thiscsdqm||!thisjgdqm)){
-				$.ajax({
-					async: false,
-					type: "post",
-					url: "/service?wdService=ry_getDqm",
-					data: {
-						dqm: csdqm
-					},
-					success: function (data) {
-						var csdqm = data;
-						if(!csdqm)return;
-						if(wd.edit.cascading.getInstance("csdqm")&&!thiscsdqm){
-							wd.edit.cascading.getInstance("csdqm").setValue(csdqm);
-							if(wd.edit.objectPicker.getInstance("csxian")&&wd.edit.objectPicker.getInstance("csxian").onchange){
-								wd.edit.objectPicker.getInstance("csxian").onchange();
-							}
-						}
-						if(wd.edit.cascading.getInstance("jgdqm")&&!thisjgdqm){
-							wd.edit.cascading.getInstance("jgdqm").setValue(csdqm);
-							if(wd.edit.objectPicker.getInstance("jgxian")&&wd.edit.objectPicker.getInstance("jgxian").onchange){
-								wd.edit.objectPicker.getInstance("jgxian").onchange();
-							}
-						}
-						if(wd.edit.cascading.getInstance("hkdqm")&&!thishkdqm){
-							wd.edit.cascading.getInstance("hkdqm").setValue(csdqm);
-						}
-					},
-					error: function (data) {
-						console.log(data);
-					}
-				})
-			}
-		}
-//		lsSfzh = growHeightList["sfzh"].val();
-	}catch(e){
-		console.log(e);
-	}
-
-
-	//出生日期,性别 先自动填写,再校验
-	birthday=this.getElementValue("csrq");
-
-	if(birthday)
-		birthday = birthday.replace(/-/g,'');
-
-	sex=this.getElementValue("xbm");
-
-
-	var birthDayValidate= params["chkCsrq"]?params["chkCsrq"]:true;//是否关联校验出生日期,默认false,false校验
-	var sexValidate= params["chkXb"]?params["chkXb"]:true;//是否关联校验性别,默认false,false校验
-	var birthPlaceValidate= params["chkCsdq"]?params["chkCsdq"]:true;//是否关联校验出生地,默认false,false校验
-	if(birthDayValidate&&!rs){
-		var birthdayFromIdCard = value.substring(6,14);
-		if(!birthday){
-			//不存在,直接过
-		}else if(birthday!=birthdayFromIdCard){
-			// 不相等,校验失败
-		    rs+=msgPrefix+'出生日期与身份证号不符!\r\n';
-		}
-	}
-	if(sexValidate&&!rs){
-		var sexFromIdCard;
-		if(value.length == 15){
-		   sexFromIdCard=value.substring(14,15);
-		}else{
-		   sexFromIdCard=value.substring(16,17);
-		}
-		if(!sex||sex%2!=sexFromIdCard%2){//不存在,或者不相等,校验失败
-			rs+=msgPrefix+'性别与身份证号不符!\r\n';
-		}
-	}
-
-/// 增加。Lin
-	if(!birthPlaceValidate){
-		var csdq = value.substring(0,6);
-		if(!csdqm||csdqm!=csdq){//不存在,或者不相等,校验失败
-			rs+=msgPrefix+'出生地区与身份证号不符!\r\n';
-		}
-	}
-///
-
-	return rs;
-}
-
-
-/**
- * 身份证号校验器
- */
-wd.commonValidator.idCard20190625 =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-
-	var rs = "";//返回的校验结果
-
-	var value = document.querySelector("[name='sfzh']").value// valueArr[0];//身份证号值
-	var birthday = document.querySelector("[name='csrq']").value//valueArr[1];//出生日期
-	//var sex = document.querySelector("[name='xbm']").value//valueArr[2];//性别码
-	var sfzlbmInput=document.querySelector("[name='sfzjlbm']")
-	var sfzjlbm = sfzlbmInput?sfzlbmInput.value:1 //valueArr[3];//身份证件类别码
-	if(!sfzjlbm)sfzjlbm=1;
-	//var csdqm = document.querySelector("[name='csdqm']").value//valueArr[3];//身份证件类别码
-	var msgPrefix = params['msgPrefix'];//消息头
-	var idCardNotNull = params['sfzhNotNull'];//身份证号不能为空
-	//var birthDayNotNull = params['csrqNotNull'];//出生年月不能为空
-	//var sexNotNull = params['xbNotNull'];//性别不能为空
-	//var csdqmNotNull = params['csdqmNotNull'];//性别不能为空
-
-	var setValue = params['setValue'];//自动填写性别、出生地区、出生日期
-
-	if(!msgPrefix)//如果用户有输入消息头
-		msgPrefix='';
-	var msgPrefix = params['msgPrefix'];//消息头
-	if (!value && idCardNotNull)
-	{
-		rs+=msgPrefix+'身份证件号不能为空!\r\n';
-	}
-	/*if(!birthday&&birthDayNotNull)
-		rs+=msgPrefix+'出生日期不能为空!\r\n';
-	else{
-		if(birthDayNotNull){
-			birthday = birthday.replace(/-/g,'');
-		}
-	}*/
-	if(birthday)
-		birthday = birthday.replace(/-/g,'');
-	/*if(!sex&&sexNotNull)
-		rs+=msgPrefix+'性别不能为空!\r\n';
-	if(!csdqm&&csdqmNotNull){
-		rs+=msgPrefix+'出生地区不能为空!\r\n';
-	}*/
-
-	if(value&&(!sfzjlbm||sfzjlbm==1)){//如果证件类型为身份证,且不为空
-
-		if(value.match(/^888.*/)){//如果身份证为888开头的,就不验证
-
-		}else{
-
-			var Errors=new Array(
-			"",
-			msgPrefix+"身份证号位数不对!\r\n",
-			msgPrefix+"身份证号出生日期超出范围或含有非法字符!\r\n",
-			msgPrefix+"身份证号校验错误!(如果含X的,必须是大写半角的X!)\r\n",
-			msgPrefix+"身份证地区非法!\r\n"
-			);
-			var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
-			var value,Y,JYM;
-			var S,M;
-			var value_array = new Array();
-			value_array = value.split("");
-			//地区检验
-			//if(csdqm.substr(0,4)!=value.substr(0,4)/*area[parseInt(value.substr(0,2))]==null*/) rs+=Errors[4];
-			//身份号码位数及格式检验
-			switch(value.length){
-			case 15:
-				if ((parseInt(value.substr(6,2))+1900) % 4 == 0 || ((parseInt(value.substr(6,2))+1900) % 100 == 0 && (parseInt(value.substr(6,2))+1900) % 4 == 0 )){
-					ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
-				} else {
-					ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
-				}
-				if(ereg.test(value)) rs+=Errors[0];
-				else rs+=Errors[2];
-
-				//校验出生年月
-				/*if(birthday){
-					var birthdayFromIdCard = value.substring(6,12);
-					if(birthday!=birthdayFromIdCard)
-						rs+=msgPrefix+'出生日期与身份证号不符!\r\n';
-				}
-
-				//校验性别
-				if(sex){
-					var sexFromIdCard = value.substring(14,15);
-					if(sex%2!=sexFromIdCard%2)
-						rs+=msgPrefix+'性别与身份证号不符!\r\n';
-				}*/
-				break;
-			case 18:
-				//18位身份号码检测
-				//出生日期的合法性检查
-				//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
-				//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
-				if ( parseInt(value.substr(6,4)) % 4 == 0 || (parseInt(value.substr(6,4)) % 100 == 0 && parseInt(value.substr(6,4))%4 == 0 )){
-					ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
-				} else {
-					ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
-				}
-				if(ereg.test(value)){//测试出生日期的合法性
-				//计算校验位
-					S = (parseInt(value_array[0]) + parseInt(value_array[10])) * 7
-					+ (parseInt(value_array[1]) + parseInt(value_array[11])) * 9
-					+ (parseInt(value_array[2]) + parseInt(value_array[12])) * 10
-					+ (parseInt(value_array[3]) + parseInt(value_array[13])) * 5
-					+ (parseInt(value_array[4]) + parseInt(value_array[14])) * 8
-					+ (parseInt(value_array[5]) + parseInt(value_array[15])) * 4
-					+ (parseInt(value_array[6]) + parseInt(value_array[16])) * 2
-					+ parseInt(value_array[7]) * 1
-					+ parseInt(value_array[8]) * 6
-					+ parseInt(value_array[9]) * 3 ;
-					Y = S % 11;
-					M = "F";
-					JYM = "10X98765432";
-					M = JYM.substr(Y,1);//判断校验位
-					if(M == value_array[17]) rs+=Errors[0]; //检测ID的校验位
-					else rs+=Errors[3];
-				}else
-					rs+=Errors[2];
-
-				//校验出生年月
-				/*if(birthday){
-					var birthdayFromIdCard = value.substring(6,14);
-					if(birthday!=birthdayFromIdCard){
-						rs+=msgPrefix+'出生日期与身份证号不符!\r\n';
-					}
-				}
-
-				//校验性别
-				if(sex){
-					var sexFromIdCard = value.substring(16,17);
-					if(sex%2!=sexFromIdCard%2)
-						rs+=msgPrefix+'性别与身份证号不符!\r\n';
-				}*/
-				break;
-			default:
-				rs+=Errors[1];
-			break;
-			}
-		}
-
-	}
-	//回显性别、出生日期、地区
-	if(!rs&&setValue){
-		if(value.length == 15){
-			wd.edit.objectPicker.getInstance("xbm").initValue(value.substring(14,15)%2==0?2:1);
-		}else{
-			wd.edit.objectPicker.getInstance("xbm").initValue(value.substring(16,17)%2==0?2:1);
-		}
-		document.querySelector("[name='csrq']").value = value.substring(6,10)+"-"+value.substring(10,12)+"-"+value.substring(12,14);
-		//处理出生地区
-		var csdqm = value.substring(0,6);
-		var csdqmstr = String(csdqm);
-
-		var csshengdqm=csdqmstr.substring(0,2)+"0000";
-		var csshidqm=csdqmstr.substring(0,4)+"00";
-		if($("input[name='csdqm']").val()){
-			return rs;
-		}
-		wd.edit.objectPicker.getInstance("cssheng").initValue(csshengdqm);
-		wd.edit.objectPicker.getInstance("csshi").initValue(csshidqm);
-		$("input[name=xbm]").click();//需要触发一次,否则级联无法生效
-		wd.edit.objectPicker.getInstance("csxian").initValue(csdqm);
-		$("input[name='csdqm']").val(csdqm);
-
-		if($("input[name='hkdqm']").val()){
-			return rs;
-		}
-		wd.edit.objectPicker.getInstance("hksheng").initValue(csshengdqm);
-		wd.edit.objectPicker.getInstance("hkshi").initValue(csshidqm);
-		//$("input[name=xbm]").click();//需要触发一次,否则级联无法生效
-		wd.edit.objectPicker.getInstance("hkxian").initValue(csdqm);
-		$("input[name='hkdqm']").val(csdqm);
-
-	}
-	return rs;
-}
-
-/**
- * 浮点数校验器
- */
-wd.commonValidator.float =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-			var rs = '';
-			var value = valueArr[0];
-			var msgPrefix = params['msgPrfx'];//消息头
-			var minValue = params['minVal'];//最小数值
-			var maxValue = params['maxVal'];//最大数值
-			var decimalLength = params['decLen'];//保留几位
-			var reg = new RegExp('^\\d+(\\.\\d{0,'+decimalLength+'})?$');
-			var regValue = new RegExp('^\\d+(\\.\\d+)?$');
-
-			var notNull = params['notBlank']==null?false:params['notBlank'];
-			if(notNull){
-				rs +=  wd.commonValidator.notNull(valueArr,params);
-			}else{
-				rs +=  wd.commonValidator.validator(valueArr,params);
-			}
-
-			if(value!=null&&value!=''){
-				if(!minValue)//minValue值不指定默认为0
-					minValue="0";
-//				if(!regValue.test(value)){
-				if(isNaN(value)){
-					rs += msgPrefix+'应为数字!\r\n';
-				}else{
-//					if(minValue!=null&&value<minValue){
-//						rs += msgPrefix+'应不小于'+minValue+'\r\n';
-//					}
-//					if(maxValue!=null&&value>maxValue){
-//						rs += msgPrefix+'应不大于'+maxValue+'\r\n';
-//					}
-					if(minValue!=null && (parseInt(value) < parseInt(minValue)&&minValue!="-")){
-						rs += msgPrefix+'应不小于'+minValue+'\r\n';
-					}
-					if(maxValue!=null&&(parseInt(value) > parseInt(maxValue)&&maxValue!="+")){
-						rs += msgPrefix+'应不大于'+maxValue+'\r\n';
-					}
-
-//					if(decimalLength!=null&&!reg.test(value)){
-					var arr=value.toString().split(".");
-					if(arr.length>1&&arr[1].length>parseInt(decimalLength)){
-						rs += msgPrefix+'小数部分应不多于'+decimalLength+'位。\r\n';
-					}
-				}
-
-			}
-
-			return rs;
-		}
-
-/**
- * 整数校验器
- */
-wd.commonValidator.int =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-			var rs = '';
-			var value = valueArr[0];
-			var msgPrefix = params['msgPrfx'];//消息头
-			var minValue = params['minVal'];//最小数值
-			var maxValue = params['maxVal'];//最大数值
-			var regValue = new RegExp('^[1-9]*[1-9][0-9]*$');
-
-			var notNull = params['notBlank']==null?false:params['notBlank'];
-			if(notNull){
-				rs +=  wd.commonValidator.notNull(valueArr,params);
-			}else{
-				rs +=  wd.commonValidator.validator(valueArr,params);
-			}
-			//minValue值不指定默认为0
-			if(!minValue){
-				minValue="0";
-			}
-			if(value!=null&&value!=''){
-//				if(value != 0 && !regValue.test(value)){
-//					rs += msgPrefix+'应为正整数!\r\n';
-//				}
-				if(isNaN(value)){
-					rs += msgPrefix+'应为整数!\r\n';
-				}
-				if(minValue!=null && (parseInt(value) < parseInt(minValue)&&minValue!="-")){
-					rs += msgPrefix+'应不小于'+minValue+'\r\n';
-				}
-				if(maxValue!=null&&(parseInt(value) > parseInt(maxValue)&&maxValue!="+")){
-					rs += msgPrefix+'应不大于'+maxValue+'\r\n';
-				}
-			}
-
-			return rs;
-		}
-/**
- * 	2022-3-1 新加的整数校验器,isInt不知谁改成了数字校验器!!
- */
-wd.commonValidator.isInteger =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-			var rs = '';
-			var value = valueArr[0];
-			var msgPrefix = params['msgPrfx'];//消息头
-			var minValue = params['minVal'];//最小数值
-			var maxValue = params['maxVal'];//最大数值
-			var regValue = new RegExp('^[1-9]*[1-9][0-9]*$');
-
-			var notNull = params['notBlank']==null?false:params['notBlank'];
-			if(notNull){
-				rs +=  wd.commonValidator.notNull(valueArr,params);
-			}
-			rs +=  wd.commonValidator.validator(valueArr,params);
-
-
-			if(value!=null&&value!=''){
-				if(value != 0 && !regValue.test(value)){
-					rs += msgPrefix+'应为正整数!\r\n';
-				}
-				if(!rs&&minValue&& value <minValue){
-					rs += msgPrefix+'应不小于'+minValue+'\r\n';
-				}
-				if(!rs&&maxValue&&value>maxValue){
-					rs += msgPrefix+'应不大于'+maxValue+'\r\n';
-				}
-			}
-
-			return rs;
-		}
-
-/**
- * 金额数校验器
- */
-wd.commonValidator.money =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-			var rs = '';
-			var value = valueArr[0];
-			var msgPrefix = params['msgPrfx'];//消息头
-			var reg = new RegExp('^\\d+(\\.\\d{0,2})?$');
-			var regValue = new RegExp('^\\d+(\\.\\d+)?$');
-
-			rs += wd.commonValidator.float(valueArr,params);
-
-
-			if(regValue.test(value)&&value!=null&&value!=''&&!reg.test(value)){
-				rs += msgPrefix+'小数部分应在两位以内。\r\n';
-			}
-
-
-			return rs;
-		}
-
-
-/**
- * 公共校验器
- */
-wd.commonValidator.validator =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-			var rs = '';
-			var value = valueArr[0];
-			var msgPrefix = params['msgPrfx'];//消息头
-			var noBlank = params['notBlank']==null?false:params['notBlank'];
-			var minLength = params['minLen'];
-			var maxLength = params['maxLen'];
-
-
-			var length = params['len'];
-
-			var regNoBlank = /\s/g;
-			var regMin = new RegExp("^.{"+minLength+",}$");
-			var regMax = new RegExp("^.{0,"+maxLength+"}$");
-			var regScope = new RegExp("^.{"+minLength+","+maxLength+"}$");
-			var regLength = new RegExp("^.{"+length+"}$");
-
-			if(value!=null&&value!=''){
-				if(noBlank&&regNoBlank.test(value)){
-					rs += msgPrefix+'不能含空格!\r\n';
-				}
-
-
-				if(minLength!=null&&!(value.length>=minLength)){
-					rs += msgPrefix+'应至少'+minLength+'个字符!\r\n';
-				}else if(maxLength!=null&&minLength!=null&&(value.length>=minLength&&value.length<=maxLength)){
-					//rs += msgPrefix+'必需在'+minLength+' ~'+maxLength+'!\r\n';
-				}else if(maxLength!=null&&!(value.length<=maxLength)){
-					rs += msgPrefix+'长度应不超过'+maxLength+'\r\n';
-				}
-
-				if(length!=null&&!(value.length==length)){
-					rs += msgPrefix+'必需等于'+length+'!\r\n';
-				}
-			}
-			return rs;
-		}
-
-
-
-/**
- * 内容管理技术规范的编码规则:[a-zA-Z_0-9] 和减号 校验器
- */
-wd.commonValidator.contentCodeRule =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-			var rs = '';
-			var value = valueArr[0];
-			var msgPrefix = params['msgPrfx'];//消息头
-			var regValue = new RegExp('^[\w-]+$');
-
-			var notNull = params['notBlank']==null?false:params['notBlank'];
-			if(notNull){
-				rs +=  wd.commonValidator.notNull(valueArr,params);
-			}else{
-				rs +=  wd.commonValidator.validator(valueArr,params);
-			}
-
-			if(value!=null&&value!=''){
-				if(value != 0 && !regValue.test(value)){
-					rs += msgPrefix+'必需由字母、数字、减号、下划线组成!\r\n';
-				}
-			}
-
-			return rs;
-}
-
-
-/**
- * 页码,只允许字母和数字
- */
-wd.commonValidator.pageNum =
-function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-			var rs = '';
-			var value = valueArr[0];
-			var msgPrefix = params['msgPrfx'];//消息头
-			var regValue = new RegExp('^[\\da-zA-Z]+$');
-
-			var notNull = params['notBlank']==null?false:params['notBlank'];
-			if(notNull){
-				rs +=  wd.commonValidator.notNull(valueArr,params);
-			}else{
-				rs +=  wd.commonValidator.validator(valueArr,params);
-			}
-
-			if(value!=null&&value!=''){
-				if(value != 0 && !regValue.test(value)){
-					rs += msgPrefix+'必需由字母、数字组成!\r\n';
-				}
-			}
-
-			return rs;
-}
-
-/**
- *	英文名
- *	由数字、字母和下划线组成,长度为2-30个字符
- */
-wd.commonValidator.enName = function(valueArr, params){
-	var rs = '';
-	var value = valueArr[0];
-	var msgPrefix = params['msgPrfx'];
-	var regValue = new RegExp('^\\w{2,30}$');
-
-	var notNull = params['notBlank'] == null ? false : params['notBlank'];
-	if(notNull){
-		rs += wd.commonValidator.notNull(valueArr, params);
-	}
-
-	if(value != null && value != ''){
-		if(!regValue.test(value)){
-			rs += msgPrefix + '只能由数字、字母和下划线组成,长度为2-30个字符!\r\n';
-		}
-//		var ryid =$('#ryid').val()||$('input[name=ryid]').val();
-		var ryid=this.getElementValue("ryid");
-		var cb = $.ajax({type: "post",
-			url: "/service?&wdService=ry_yzywm",
-			data:{'userywm':valueArr.toString(), 'ryid': ryid},
-			cache:false,
-			async:false,
-			dataType: "json" });
-
-		if(cb.status==404){
-			rs+="服务器连接失败!刷新页面";
-		}else{
-			var queryData = cb.responseJSON;
-			if(queryData.isFind != "false"){
-				rs+="英文名已存在!";
-			}
-		}
-	}
-	return rs;
-}
-
-wd.commonValidator.csenName = function(valueArr, params){
-	var rs = '';
-	var value = valueArr[0];
-	var msgPrefix = params['msgPrfx'];
-	var regValue = new RegExp('^\\w{2,30}$');
-
-	var notNull = params['notBlank'] == null ? false : params['notBlank'];
-	if(notNull){
-		rs += wd.commonValidator.notNull(valueArr, params);
-	}
-
-	if(value != null && value != ''){
-		if(!regValue.test(value)){
-			rs += msgPrefix + '只能由数字、字母和下划线组成,长度为2-30个字符!\r\n';
-		}
-//		var ryid =$('#ryid').val()||$('input[name=ryid]').val();
-		var ryid=this.getElementValue("ryid");
-		var cb = $.ajax({type: "post",
-			url: "/service?&wdService=csry_yzywm",
-			data:{'userywm':valueArr.toString(), 'ryid': ryid},
-			cache:false,
-			async:false,
-			dataType: "json" });
-
-		if(cb.status==404){
-			rs+="服务器连接失败!刷新页面";
-		}else{
-			var queryData = cb.responseJSON;
-			if(queryData.isFind != "false"){
-				rs+="英文名已存在!";
-			}
-		}
-	}
-	return rs;
-}
-
-/**
- *	域名唯一
- *
- */
-wd.commonValidator.ymwy = function(valueArr, params){
-	var rs = '';
-	var value = valueArr[0];
-	var msgPrefix = params['msgPrfx'];//消息头
-	var regValue = new RegExp('^[\w-]+$');
-
-	var notNull = params['notBlank']==null?false:params['notBlank'];
-	if(notNull){
-		rs += wd.commonValidator.notNull(valueArr, params);
-	}
-
-	if(value!=null&&value!=''){
-//		var wangzid = ($('input[name="wangzid"]') != undefined ? $('input[name="wangzid"]').val() : $('#wangzid').val());
-		var wangzid=this.getElementValue("wangzid");
-		var cb = $.ajax({
-			type:'post' ,
-			url:"/service?wdService=grwzbj_wz_ym_wy",
-			data:{
-				ym:value,
-				wangzid:wangzid
-			},
-			dataType:"json",
-			async:false,
-
-		});
-		if(cb.status==404){
-			rs+="服务器连接失败!刷新页面";
-		}else{
-			var queryData = cb.responseJSON;
-			if(queryData.isFind != false){
-				rs+="域名已存在!";
-			}
-		}
-	}
-
-	return rs;
-}
-
-/**
- * 附件是否为空校验
- * @param {*} valueArr
- * @param {*} params
- * @returns
- */
-wd.commonValidator.fjNotNull =
-	function(valueArr,//保存所有被校验的表单值的数组
-		params//校验器的其余参数
-		){
-
-		var rs = '';
-		var msgPrefix = params['msgPrfx'];//消息头
-
-		//var nrid = this.getElementValue("fjid");
-		var nrid=valueArr[0];
-		if (!nrid) {
-			rs += msgPrefix+'不能为空!\r\n';
-		} else {
-			$.ajax({
-				async: false,
-				type: "post",
-				url: "/service?wdService=getSubNrCount",
-				data: {
-					nrid: "T-" + nrid,
-					jlztm:1
-				},
-				success: function (data) {
-					var names = JSON.parse(data);
-					var isArray = $.isArray(names);
-					if (!isArray || names.length <= 0) {
-						rs += msgPrefix+'不能为空!\r\n';
-					}
-				},
-				error: function (data) {
-					console.log(data);
-				}
-			})
-		}
-
-
-		rs += wd.commonValidator.validator(valueArr,params);
-		return rs;
-}
-
-
-/**
- * 大于
- * @param {Object} valueArr
- * @param {Object} params
- */
-wd.commonValidator.greater = function(valueArr, params){
-	var rs = '';
-	var msgPrefix = params['msgPrfx'];//消息头
-	var pp=msgPrefix.split(/,/);
-	msgPrefix=pp[0]+"大于"+pp[1]+"! \r\n";
-	if(valueArr.length<2){
-		return rs;
-	}
-	var leftValue=valueArr[0];
-	var rightValue=valueArr[1];
-	if(!leftValue||!rightValue){
-		return rs;
-	}
-
-	var eq =typeof params['equal']=="undefined"?false:params['equal'];//包括大小相等
-	if(!!parseFloat(leftValue)&&!!parseFloat(rightValue) ){
-		if(eq){
-			if(parseFloat(leftValue)<parseFloat(rightValue)){
-//				 console.log(arguments);
-				 rs += msgPrefix;
-			}
-		}else{
-			if(parseFloat(leftValue)<=parseFloat(rightValue)){
-//				 console.log(arguments);
-				 rs += msgPrefix;
-			}
-		}
-	}
-	return rs;
-}
-
-/**
- * 小于
- * @param {Object} valueArr
- * @param {Object} params
- */
-wd.commonValidator.less = function(valueArr, params){
-	var rs = '';
-	var msgPrefix = params['msgPrfx'];//消息头
-	var pp=msgPrefix.split(/,/);
-	msgPrefix=pp[0]+"小于"+pp[1]+"! \r\n";
-	var eq =typeof params['equal']=="undefined"?false:params['equal'];//包括大小相等
-
-	if(valueArr.length>=2&&!!parseFloat(valueArr[0])&&!!parseFloat(valueArr[1]) ){
-		if(eq){
-			if(parseFloat(valueArr[0])>parseFloat(valueArr[1])){
-//				 console.log(arguments);
-				 rs += msgPrefix;
-			}
-		}else{
-			if(parseFloat(valueArr[0])>=parseFloat(valueArr[1])){
-//				console.log(arguments);
-				 rs += msgPrefix;
-			}
-		}
-
-	}
-	return rs;
-}
-
-
-/**
- * 不等于
- * @param {Object} valueArr
- * @param {Object} params
- */
-wd.commonValidator.notEqual = function(valueArr, params){
-	var rs = '';
-	var msgPrefix = params['msgPrfx'];//消息头
-	var pp=msgPrefix.split(/,/);
-	console.log(valueArr);
-	for(var i=0;i<valueArr.length;i++){
-		if(!valueArr[i])continue;
-		var index=valueArr.indexOf(valueArr[i],i+1);
-		if(index!=-1){
-			rs+=pp[i]+"和"+pp[index]+"不能相同!\r\n";
-			break;
-		}
-	}
-
-
-
-
-
-	return rs;
-}
-
-
-wd.commonValidator.condition=function(valueArr, params){
-
-	//满足条件才会校验
-	if(params['condition']){
-			try{
-				//xybalxm:["51"]
-				var condition=eval("({"+params['condition']+"})");
-				for(var key in condition){
-					var n=this.getElementValue(key);
-					if(condition[key].indexOf(n)==-1){
-						return false;
-					}
-				}
-			}catch(e){
-				console.log(e);
-			}
-	}
-
-	return true;
-}
-
-/**
- * 数值是否已存在校验
- * @param {*} valueArr
- * @param {*} params
- * @returns
- */
-wd.commonValidator.exists = function(valueArr, params){
-	var rs = '';
-	//表名
-	var table = params['tab'];	// ['table']。Lin
-	//字段名
-	var field = params['field'];
-	//数值
-	var value = valueArr[0];
-	//主键
-/* 改为改用 对象ID。Lin
-	var id = this.getElementValue("validationId");;
-*/
-/* 再改,ID 字段名由上层决定。Lin
-	var id = this.getElementValue(table+"id");
-*/
-	var idName = params['id'];
-	var id = this.getElementValue(idName);
-
-	if(value!=null&&value!=''){
-		var cb = $.ajax({type: "post",
-				url: "/service?&wdService=chkDup",
-/* 再改,增加 "idName" -- ID 字段名由上层决定。Lin
-				data:{'table':table, 'field': field, 'value': value, 'id': id},
-*/				data:{'table':table, 'field': field, 'value': value, 'id': id, 'idName': idName},
-				cache:false,
-				async:false,
-				dataType: "json" });
-		var queryData = cb.responseJSON;
-		if(queryData.isFind != "false"){
-		  rs= params['msg'];
-		}
-	}
-	return rs;
-}
-
-
-// 增加,多个字段值是否匹配。Lin
-// <notMatch field="jfrxm,jfrgrdh" parm="{relField:'jfrxm,jfrgrdh',srcTab:'ry',srcField:['xm','grdh']}"/>
-wd.commonValidator.chkMatch = function(valueArr, params){
-	var rs = '';
-	//表名
-	var table = params['srcTab'];	// "ry"(人员)。Lin
-	//字段名
-	var field = params['srcField'];	// "xm,grdh"(姓名,个人电话)。Lin
-	//数值
-/* 增加 parm="{relField:'jfrxm,jfrgrdh', -- 相关的页面字段。Lin
- *    去掉原来的 <ichker defField="['sfzh','csrq','xbm']
- * value,串成 "张三,12345"
-	var value = valueArr[0];
-*/
-	var relField = params['relField'];	// "jfrxm,jfrgrdh"(接访人姓名,接访人个人电话)。Lin
-	if (relField == null || relField == "")
-		return rs;
-	var value = "";
-	var fieldArr = relField.split(",");
-	for(var i = 0; i < fieldArr.length; i++) {
-		var v = this.getElementValue(fieldArr[i]);
-		if (v == null || v == "") {
-			value = "";
-			break;
-		}
-		if (value != "")
-			value += ",";
-		value += v.trim();
-	}
-	if (value == "")
-		return rs;
-	var cb = $.ajax({type: "post",
-			url: "/service?&wdService=chkMatch",
-			data:{'table':table, 'field': field, 'value': value},
-			cache:false,
-			async:false,
-			dataType: "json" });
-	var queryData = cb.responseJSON;
-	if (queryData.isMatch == "false") {
-		rs= params['msg'];
-	}
-	return rs;
-}

+ 0 - 1462
alf/ext_lf_inp.jsp

@@ -1,1462 +0,0 @@
-<%@ page language="java" pageEncoding="UTF-8" %>
-	<%@ taglib uri="/ssTag" prefix="ss" %>
-
-		<!DOCTYPE html>
-		<html lang="en" style="font-size: 16px;">
-
-		<head>
-			<title>录入来访信息</title>
-			<meta charset="UTF-8">
-			<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-			<link rel="stylesheet" href="/skin/easy/Main.css">
-			<link rel="stylesheet" href="/skin/easy/mobiscroll.custom.css">
-			<script type="text/javascript" src="/ss/jquery/jquery-1.7.2.min.js"></script>
-			<script type="text/javascript" src="/ss/js/base.js"></script>
-			<script type="text/javascript" src="/ss/js/common.js"></script>
-			<script type="text/javascript" src="/ss/js/display.js"></script>
-			<script type="text/javascript" src="/ss/js/edit.js"></script>
-			<script type="text/javascript" src="/ss/js/mobiscroll.custom.js"></script>
-			<script type="text/javascript" src="/ss/js/file.js"></script>
-			<!-- <script type="text/javascript" src="/ss/js/objectPicker.js"></script> -->
-
-			<style>
-				th,
-				td {
-					border: 1px solid black;
-					border-collapse: collapse;
-				}
-
-				table {
-					table-layout: fixed;
-					width: 100%;
-					/* 确保表格占满容器宽度 */
-				}
-
-				.mobileForm table th {
-					width: 8rem;
-				}
-
-				.mobileForm table td {
-					font-size: 1rem;
-				}
-
-				.mobileDelete-button,
-				.mobileAdd-button {
-					margin-right: 5px;
-				}
-
-				.carNumberAdd {
-					position: absolute;
-					right: 0;
-					top: 50%;
-					transform: translateY(-50%);
-				}
-
-				.carNumberTd {
-					padding: 5px !important;
-				}
-
-				.carNumberTd>div {
-					display: flex;
-					align-items: center;
-					justify-content: space-between;
-				}
-
-				.carNumberTd>div>div {
-					flex: 1;
-				}
-
-				.carNumberTd .mobileDelete-button {
-					margin: 0 0 0 5px !important;
-				}
-
-				input[type='text'] {
-					width: 100%;
-				}
-
-				.hidden {
-					display: none;
-				}
-			</style>
-		</head>
-
-		<body>
-		<%--
-		来访对象:<%=request.getAttribute("lf")  %>
-		姓名:<%=((base.po.LfPo)(request.getAttribute("lf"))).getXm() %>
-		姓别码:${lf.xbm}
-		--%>
-		
-			<!-- lfid - ${lf.lfid}
-			1. lflbm - ${lf.lflbm}         // 来访类别
-			2. jfrxm - ${lf.jfrxm}         // 受访人姓名
-			3. jfrgrdh - ${lf.jfrgrdh}     // 个人电话
-			4. jfxiaoqid - ${lf.jfxiaoqid} // 到访校区
-			5. dwmc - ${lf.dwmc}           // 来访人单位
-			6. jfbmid - ${lf.jfbmid}       // 酒店名
-			7. rs - ${lf.rs}               // 来访人数
-			8. yykssj - ${lf.yykssj}       // 预约开始时间
-			9. yyjssj - ${lf.yyjssj}       // 预约结束时间
-			10. jfryid - ${lf.jfryid}      // 受访人ID
-
-			xm - ${lf.xm}
-			xbm - ${lf.xbm}
-			sfzjlbm - ${lf.sfzjlbm}
-			sfzh - ${lf.sfzh}
-			grdh - ${lf.grdh}
-			clh - ${lf.clh} -->
-		
-		
-			<div style="height: calc(100% - 3.5rem); overflow: auto" class="mobileForm">
-				 
-				<form action="/extRoot?type=3&token=${token}" method="post" id="myForm">
-					<table>
-						<tr>
-							<th>来访类别</th>
-							<td>
-								<div class="ss-select-container" id="lflbm" value="${lf.lflbm}">
-									<div class="ss-select">请选择</div>
-									<div class="ss-options">
-									</div>
-									<input type="hidden" name="lflbm">
-								</div>
-							</td>
-						</tr>
-					</table>
-
-					<table id="formSection2" class="hidden">
-						<tr id="tr-jfrxm" class="hidden">
-							<th>接访人姓名</th>
-							<td>
-								
-								<input name="jfrxm" type="text" value="${lf.jfrxm}" />
-							</td>
-						</tr>
-						
-						<tr id="tr-jfrgrdh" class="hidden">
-							<th>个人电话</th>
-							<td>
-								
-								<input name="jfrgrdh" type="text"  value="${lf.jfrgrdh}"/>
-							</td>
-						</tr>
-					</table>
-
-					<div class="mobileForm-title hidden">来访信息</div>
-					<table id="formSection3" class="hidden">
-						<tr id="tr-jfxiaoqid" class="hidden">
-							<th>到访校区</th>
-							<td>
-								<div class="ss-select-container" id="jfxiaoqid" value="${lf.jfxiaoqid}">
-									<div class="ss-select">请选择校区</div>
-									<div class="ss-options">
-
-									</div>
-									<input type="hidden" name="jfxiaoqid">
-								</div>
-							</td>
-						</tr>
-						
-						
-						<tr id="tr-jfbmid" class="hidden">
-							<th>酒店名</th>
-							<td>
-								<div class="ss-select-container" id="jfbmid" value="${lf.jfbmid}">
-									<div class="ss-select">请选择</div>
-									<div class="ss-options">
-
-									</div>
-									<input type="hidden" name="jfbmid">
-								</div>
-
-							</td>
-						</tr>
-						<tr id="tr-dwmc" class="hidden">
-							<th>来访人单位</th>
-							<td>
-								
-								<input name="dwmc" type="text"  value="${lf.dwmc}"/>
-							</td>
-						</tr>
-						<tr id="tr-sy" class="hidden">
-							<th>事由</th>
-							<td>
-								
-								<input name="sy" type="text"  value="${lf.sy}"/>
-							</td>
-						</tr>
-						<tr id="tr-rs" class="hidden">
-							<th>来访人数</th>
-							<td>
-								<input name="rs" type="text"  value="${lf.rs}"/>
-							</td>
-						</tr>
-						<tr id="tr-yykssj" class="hidden">
-							<th>预约日期</th>
-							<td>
-								<input name="yykssj" type="text" id="yykssj"  value="${lf.yykssj}"/>
-							</td>
-						</tr>
-						<tr id="tr-yyjssj" class="hidden" style="display: none;">
-							<th>预约结束时间</th>
-							<td>
-								<input name="yyjssj" type="text" id="yyjssj"  value="${lf.yyjssj}"/>
-							</td>
-						</tr>
-
-					</table>
-
-
-					<div class="mobileForm-title hidden">
-						<span></span> <span class="mobileAdd-button" id="visitorAdd"></span>
-					</div>
-					<p style="margin: 1rem 0.5rem 0;">
-						<span>申请入校免责声明</span>
-						<br />
-						<span>来访人员进校需申请报备,不得携带管制刀具、危化品、毒品等违法危险品进校,并如实声明所携带物品清单及合法性,若未如实告知,来访者和受访者需承担相关法律责任。</span>
-					</p>
-					<input type="hidden" id="sxry_num" name="sxry_num" value="" />
-					<input type="hidden" name="lfsxry">
-					<input type="hidden" name="jfryid" value="${lf.jfryid}">
-				</form>
-			</div>
-			<div class="mobileBottom-div hidden">
-				<div class="mobileBottom-down-div">
-					<button class="mobileBottom-button" onclick="closePage()">取消</button>
-					<button class="mobileBottom-button" onclick="submitForm()">
-						保存并提交
-					</button>
-				</div>
-			</div>
-		</body>
-		<script type="text/javascript" src="/ss/validation/validation.js"></script>
-		<script type="text/javascript" src="/ss/js/licensePlateNumInp.js"></script>
-		<script type="text/javascript" src="/ss/validator/commonValidator.js"></script>
-		<script>
-			let carNumberInstances = {}; // 以随行人员编号为键,存储每个随行人员的车牌号实例数组
-			let uniqueVisitorIdCounter = 1; // 用于生成唯一的随行人员 ID
-			let visitorCount = 0; // 当前有效随行人员计数
-			let sxry_num = [];
-			let initSelectData; // 用于存储初始的 select 数据
-			// 校验器
-			var wdVm = window.wdVm || new ValidationManager();
-			wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-			wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-			wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-			wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
-			// 通用的日期格式化函数
-			function formatDateTime(date) {
-				return (
-					date.getFullYear() +
-					"-" +
-					("0" + (date.getMonth() + 1)).slice(-2) +
-					"-" +
-					("0" + date.getDate()).slice(-2) 
-					//" " +
-					// ("0" + date.getHours()).slice(-2) +
-					// ":" +
-					// ("0" + date.getMinutes()).slice(-2) +
-					// ":" +
-					// ("0" + date.getSeconds()).slice(-2)
-				);
-			}
-			
-			// 带时间的日期格式化函数
-			function formatDateTimeWithTime(date, withTime) {
-				const datePart = date.getFullYear() +
-					"-" +
-					("0" + (date.getMonth() + 1)).slice(-2) +
-					"-" +
-					("0" + date.getDate()).slice(-2);
-					
-				if (withTime) {
-					return datePart + " " +
-						("0" + date.getHours()).slice(-2) +
-						":" +
-						("0" + date.getMinutes()).slice(-2) +
-						":" +
-						("0" + date.getSeconds()).slice(-2);
-				}
-				
-				return datePart;
-			}
-			// 创建分隔线和错误提示的函数
-			function createValidation(container) {
-				const parent = container.parentNode;
-
-				// 生成分隔线
-				let lineSpan = document.getElementById(container.id + 'Span');
-				if (!lineSpan) {
-					lineSpan = document.createElement('span'); // 创建线的 span
-					lineSpan.id = container.id + 'Span'; // 使用指定格式的 id
-					lineSpan.className = 'border-input-error vLine-leftWarning'; // 设置样式
-					lineSpan.style.display = 'block'; // 初始状态隐藏分隔线
-					parent.insertBefore(lineSpan, container.nextSibling); // 插入到 container 之后
-				}
-
-				// 生成错误提示
-				let errorDiv = document.getElementById(container.id + 'ErrorDiv');
-				if (!errorDiv) {
-					errorDiv = document.createElement('div'); // 创建错误提示的 div
-					errorDiv.id = container.id + 'ErrorDiv'; // 使用指定格式的 id
-					errorDiv.className = 'error-message'; // 设置样式
-					errorDiv.style.position = 'absolute';
-					errorDiv.style.left = '0px';
-					errorDiv.style.bottom = '0px';
-					errorDiv.style.color = 'red';
-					errorDiv.style.fontSize = '12px';
-					errorDiv.style.width = '100%';
-					errorDiv.style.textAlign = 'right';
-					errorDiv.style.lineHeight = '18px';
-					errorDiv.style.height = '18px';
-					errorDiv.style.display = 'none'; // 初始状态隐藏
-					parent.insertBefore(errorDiv, lineSpan ? lineSpan.nextSibling : container.nextSibling); // 插入到分隔线之后
-				}
-			}
-			// 移除校验元素的函数
-			function removeValidation(container) {
-				const lineSpan = document.getElementById(container.id + 'Span');
-				const errorDiv = document.getElementById(container.id + 'ErrorDiv');
-
-				if (lineSpan) {
-					lineSpan.remove(); // 删除分隔线
-				}
-
-				if (errorDiv) {
-					errorDiv.remove(); // 删除错误提示
-				}
-			}
-			// 更新错误提示信息的函数
-			function updateMsg(container, msg) {
-				let errorDiv = document.getElementById(container.id + 'ErrorDiv');
-				// 如果未找到 errorDiv,先调用 createValidation 创建它
-				if (!errorDiv) {
-					createValidation(container);
-					errorDiv = document.getElementById(container.id + 'ErrorDiv');
-				}
-				if (errorDiv) {
-					errorDiv.textContent = msg; // 设置错误提示信息
-					errorDiv.style.display = 'block'; // 显示错误提示
-				}
-			}
-			
-			let isValidStartTime = true;
-			// let isValidEndTime = true;
-			// 动态设置开始和结束时间
-			function setInitialTime() {
-				const yykssj = document.querySelector('#yykssj');
-				const yyjssj = document.querySelector('#yyjssj');
-				// 初始化开始时间
-				var now = new Date();
-				var oneHourLater = formatDateTime(new Date(now.getTime() + 3600 * 1000));
-				
-				// 设置结束时间为开始时间的 23:59:59
-				var endDate = new Date(now.getTime() + 3600 * 1000);
-				var endDateFormatted = endDate + ' 23:59:59';
-				console.log('初始化的结束时间:',endDateFormatted)
-				$("#yykssj")
-					.mobiscroll()
-					.datetime({
-						display: "modal", // 弹出框显示
-						dateFormat: "yy-mm-dd", // 日期格式:年-月-日
-						dateOrder: "yyMMdd", // 设置为年-月-日顺序
-						timeFormat: "", // 不显示时间选择器
-						timeWheels: "", // 不显示时间滚轮
-						lang: "zh", // 设置为中文
-						onSelect:function(event,inst){
-							console.log(event)
-							// 解析 event 为 Date 对象
-							// const selectedDate = new Date(event);
-							// 设置时分秒为0:0:0
-							// selectedDate.setHours(0, 0, 0, 0);
-							removeValidation(yykssj);
-							// isValidStartTime = true;
-							yykssj.value = event;
-							const endDate = event + ' 23:59:59';
-							yyjssj.value = endDate; 
-							// 获取当前时间
-							// const currentDate = new Date();
-							// currentDate.setHours(0,0,0,0);
-							// if (selectedDate.getTime() >= currentDate.getTime()) {
-							// 	console.log('selectedDate:',selectedDate.getTime())
-							// 	console.log('currentDate:',currentDate.getTime())
-							// 	console.log('selectedDate.getTime() >= currentDate.getTime():',selectedDate.getTime() >= currentDate.getTime())
-							// 	removeValidation(yykssj);
-							// 	isValidStartTime = true;
-
-							// 	// 获取结束时间
-							// 	const endTime = new Date(yyjssj.value);
-
-							// 	// 设置开始时间的值为不带时间的日期格式,用于显示
-							// 	yykssj.value = formatDateTime(selectedDate);
-								
-							// 	// 设置结束时间为当天的 23:59:59
-							// 	const endDate = selectedDate + ' 23:59:59';
-							// 	yyjssj.value = endDate; 
-							// } else {
-							// 	updateMsg(yykssj, "预约日期不能早于当前日期");
-							// 	// yykssj.value = formatDateTime(new Date(now.getTime() + 3600 * 1000));
-							// 	isValidStartTime = false;
-							// }
-						}
-					}).val(oneHourLater);
-				// 设置开始时间的显示格式(不带时间)
-				yykssj.value = oneHourLater;
-				// 设置结束时间的初始值为开始时间的 23:59:59
-				yyjssj.value = endDateFormatted;
-			}
-			function closePage() {
-
-				// 定义关闭页面的函数
-				function closeWindow() {
-					if (typeof WeixinJSBridge == "undefined") {
-						// 监听WeixinJSBridgeReady事件
-						document.addEventListener('WeixinJSBridgeReady', function () {
-							WeixinJSBridge.call('closeWindow');
-						}, false);
-					} else {
-						// 如果是微信浏览器,直接调用
-						WeixinJSBridge.call('closeWindow');
-					}
-				}
-
-				// 调用关闭页面函数
-				closeWindow();
-				
-				// 如果不是微信浏览器,尝试使用window.close()关闭
-				if (!/MicroMessenger/i.test(navigator.userAgent)) {
-					window.close();
-					window.history.back();
-					
-				}
-			}
-			var submitCount = 0;
-			// 提交表单
-			function submitForm() {
-				// 处理开始时间,添加 00:00:00
-				if(submitCount){
-					alert('请勿重复提交')
-					return false
-				}
-				const form = $("#myForm");
-				const lflbm = $("input[name='lflbm']").val();
-				let valid = false;
-				const jfbmid = $("input[name='jfbmid']").val();
-				const jfxiaoqid = $("input[name='jfxiaoqid']").val();
-				const jfryid = $("input[name='jfryid']").val();
-				const xbm = $("input[name='xbm']").val();
-				const yykssj = document.querySelector('#yykssj');
-				const yyjssj = document.querySelector('#yyjssj');
-				if (!form[0].checkOnly(false)) { // 获取原生DOM元素并调用checkOnly
-					// alert('原来的校验器,checkOnly不通过')
-					valid = true;
-				}
-				// if (yykssj && yykssj.value) {
-				// 	const newYykssj = yykssj.value + ' 00:00:00';
-				// 	console.log('提交的时候一开始获取到的newYykssj:',newYykssj)
-				// 	yykssj.value = newYykssj;
-				// }
-				// 
-				
-				// 校验时间是否有效
-				if (!isValidStartTime) {
-					alert("预约日期不能早于当前日期")
-					valid = true;
-				}
-				if (xbm === '') {
-					valid = true;
-				}
-				if(((lflbm!='61')&&(lflbm!='161')&&(lflbm!='71'))&&jfryid === '' ) {
-					valid = true;
-					alert('未查询到该受访人信息,请重新输入!');
-				}
-				// 校验校区
-				if (jfxiaoqid === '' ) {
-					valid = true;
-				}
-				
-				// 如果随行人员不为0
-				if (sxry_num.length > 0) {
-					$("input[name='sxry_num']").val(sxry_num.join(','));
-					// 用来存储所有对象
-					var dataArray = [];
-					// 遍历数组
-					sxry_num.forEach(function(num) {
-						if($('input[name="xbm_' + num + '"]').val() === ''){
-							valid = true;
-							alert("请选择随行人员"+ num +"的性别")
-							return false;
-						}
-
-						// 获取每个字段的值,如果为空则赋值为 ""
-						var entry = {
-							xbm: $('input[name="xbm_' + num + '"]').val() || "",
-							sfzjlbm: $('input[name="sfzjlbm_' + num + '"]').val() || "",
-							xm: $('input[name="xm_' + num + '"]').val() || "",
-							sfzh: $('input[name="sfzh_' + num + '"]').val() || "",
-							grdh: $('input[name="grdh_' + num + '"]').val() || "",
-							clh: $('input[name="clh_' + num + '"]').val() || "", // 车辆号
-							// syfjid: $('input[name="syfjid_' + num + '"]').val() || ""
-						};
-					
-						// 将每个对象添加到数组中
-						dataArray.push(entry);
-					});
-					$('input[name="lfsxry"]').val(JSON.stringify(dataArray));
-				}
-
-				if (valid){
-					console.log('提交的校验不通过')
-					return;
-				}
-				if (yykssj && yykssj.value) {
-					const newYykssj = yykssj.value + ' 00:00:00';
-					console.log('yykssj.value:',newYykssj)
-					yykssj.value = newYykssj;
-				}
-				yyjssj.value = yykssj.value.replace(' 00:00:00', ' 23:59:59');
-				console.log(yykssj.value,yyjssj.value)
-				submitCount = 1;
-
-				// alert('预约结束时间yyjssj:'+yyjssj.value);
-				// return ;
-				form.submit();
-
-			}
-
-
-			// 生成随行人员
-			function addVisitor(visitorId, visitorNumber, title) {
-				// console.log(`当前访客id是` + visitorId, `当前访客编号是` + visitorNumber);
-				const inputNum = (visitorId === 1 ? '' : '_' + (visitorId - 1)) // 提交给后端的后缀,如果是第一个证明是访客 不用加后缀;第二个开始变随行人员,加后缀1开始
-				// console.log(`当前随行人员编号是` + (!inputNum ? ':访客不需要编号' : '_' + (visitorId - 1)));
-				carNumberInstances[visitorId] = []; // 初始化新随行人员的车牌号实例数组
-				let newFormHtml = `
-			<div class="mobileForm-container" data-visitor-id="` + visitorId + `">
-				<div class="mobileForm-title">
-					<span>` + (title ? title : '随行人员' + visitorNumber) + `</span>
-					<span class="mobileDelete-button"></span>
-				</div>
-				<table>
-					
-					<tr>
-						<th>姓名</th>
-						<td><input name="xm`+ inputNum + `" value="" type="text"/></td>
-					</tr>
-					<tr>
-						<th>性别</th>
-						<td>
-
-							<div class="ss-select-container" id="xbm`+ inputNum + `" value="">
-								<div class="ss-select">请选择</div>
-								<div class="ss-options">
-									<div data-value="1">男</div>
-									<div data-value="2">女</div>
-								</div>
-								<input type="hidden" name="xbm`+ inputNum + `" >
-							</div>
-						<%--
-						<input name="xbmName" style="width:90px;" type="text" />
-						<ss:objp name='xbm' inp='false' cb='xb'/>
-						--%>
-						</td>
-					</tr>
-					
-					<tr>
-						<th>证件类别</th>
-						<td>
-							<div class="ss-select-container" id="sfzjlbm`+ inputNum + `" value="1">
-								<div class="ss-select">请选择</div>
-								<div class="ss-options">
-									<div data-value="1">身份证</div>
-								</div>
-								<input type="hidden" name="sfzjlbm`+ inputNum + `" >
-							</div>
-						</td>
-					</tr>
-					<tr>
-						<th>证件号</th>
-						<td><input name="sfzh`+ inputNum + `" value="" type="text"/></td>
-					</tr>
-					<tr>
-						<th>个人电话</th>
-						<td><input name="grdh`+ inputNum + `" type="text"/></td>
-					</tr>`
-					+
-					(visitorNumber === 0 ? `<tr><th>附件</th><td><div id="sywjlp"></div></td></tr>`:``) 
-					+
-					`
-					<tr>
-						<td colspan="2" style="text-align: center">
-							车辆号
-							<!-- <span class="mobileAdd-button carNumberAdd"></span> -->
-						</td>
-					</tr>
-					<tr>
-						<td colspan="2" class="carNumberTd">
-							<div>
-								<div id="carNumberInput` + visitorId + `-1"></div>
-								<span class="mobileDelete-button carNumberDelete" style="visibility: hidden"></span>
-							</div>
-						</td>
-					</tr>
-				</table>
-			</div>
-		`;
-
-
-				// 如果是第一个随行人员,访客
-				if (visitorNumber === 0) {
-
-					newFormHtml = `
-			<div class="mobileForm-container" data-visitor-id="` + visitorId + `">
-				<div class="mobileForm-title">
-					<span>` + (title ? title : '随行人员' + visitorNumber) + `</span>
-					<span class="mobileDelete-button"></span>
-				</div>
-				<table>
-					
-					<tr>
-						<th>姓名</th>
-						<td><input name="xm" value="${lf.xm}" type="text"/></td>
-					</tr>
-					<tr>
-						<th>性别</th>
-						<td>
-
-							<div class="ss-select-container" id="xbm" value="${lf.xbm}">
-								<div class="ss-select">请选择</div>
-								<div class="ss-options">
-									<div data-value="1">男</div>
-									<div data-value="2">女</div>
-								</div>
-								<input type="hidden" name="xbm" >
-							</div>
-						<%--
-						<input name="xbmName" style="width:90px;" type="text" />
-						<ss:objp name='xbm' inp='false' cb='xb'/>
-						--%>
-						</td>
-					</tr>
-					
-					<tr>
-						<th>证件类别</th>
-						<td>
-							<div class="ss-select-container" id="sfzjlbm" value="${lf.sfzjlbm}">
-								<div class="ss-select">请选择</div>
-								<div class="ss-options">
-									<div data-value="1">身份证</div>
-								</div>
-								<input type="hidden" name="sfzjlbm" >
-							</div>
-						</td>
-					</tr>
-					<tr>
-						<th>证件号</th>
-						<td><input name="sfzh" value="${lf.sfzh}" type="text"/></td>
-					</tr>
-					<tr>
-						<th>个人电话</th>
-						<td><input name="grdh" value="${lf.grdh}" type="text"/></td>
-					</tr>`
-					+
-					(visitorNumber === 0 ? `<tr><th>附件</th><td><div id="sywjlp"></div></td></tr>`:``) 
-					+
-					`
-					<tr>
-						<td colspan="2" style="text-align: center">
-							车辆号
-							<!-- <span class="mobileAdd-button carNumberAdd"></span> -->
-						</td>
-					</tr>
-					<tr>
-						<td colspan="2" class="carNumberTd">
-							<div>
-								<div id="carNumberInput1-1"></div>
-								<span class="mobileDelete-button carNumberDelete" style="visibility: hidden"></span>
-							</div>
-						</td>
-					</tr>
-				</table>
-			</div>
-		`;
-
-
-
-					newFormHtml = newFormHtml.replace(
-						'class="mobileDelete-button"',
-						'class="mobileDelete-button" style="visibility: hidden"'
-					);
-					$(".mobileForm .mobileForm-title").last().before(newFormHtml);
-					const uploadUrl = '<ss:serv name="lf_uploadFile"/>';
-					const loadUrl = "<ss:serv name='lf_loadFile'/>";
-					// 选择并上传文件,并生成预览
-					mobileFileUpload('sywjlp', {
-						uploadUrl,
-						loadUrl,
-						maxSize: 1, // 
-						acceptedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf','xlsx', 'docx', 'pptx', 'doc', 'ppt', 'xls','zip', 'rar', '7z'], // 限制文件类型
-						maxFileSize: 20 * 1024 * 1024 // 单个文件最大为 5 MB
-					});
-
-				} else {
-					// 新增随行人员时,追加到最后一个随行人员后面
-					$(".mobileForm-container").last().after(newFormHtml);
-				}
-				// 初始化对应的随行人员的下拉信息
-				const xbm = initSSSelect(`#xbm` + inputNum, initSelectData.XB, { text: 'mc', value: 'xbm' }, { enable: true });
-				const sfzjlbm = initSSSelect('#sfzjlbm' + inputNum, initSelectData.SFZJLB, { text: 'mc', value: 'sfzjlbm' }, { enable: true });
-				// 初始化对应的随行人员的校验
-				wdVm.add("wd.commonValidator.notNull", [`xm` + inputNum], { msgPrfx: "姓名" }, 1);
-				wdVm.add('wd.commonValidator.notNull', [`sfzjlbm` + inputNum], { 'msgPrfx': '身份证件类别' }, 1);
-				// wdVm.add('wd.commonValidator.idCard',[`sfzh`+ inputNum],{'relField':`sfzh`+ inputNum+`,`+`sfzjlbm`+ inputNum,'msgPrfx':'身份证号'},1);
-				wdVm.add("wd.commonValidator.idCard", ["sfzh" + inputNum], { msgPrfx: "证件号", notBlank: true, sfzjlbmName: `sfzjlbm` + inputNum }, 1);
-				wdVm.add("wd.commonValidator.int", [`grdh` + inputNum], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-
-				let carInput;
-				// 处理第一个访客
-				if (visitorId === 1) {
-					carInput = new CarNumberInput('carNumberInput' + visitorId + '-1', 'clh', '粤')
-					xbm.setValue('${lf.xbm}')
-					sfzjlbm.setValue('${lf.sfzjlbm}')
-				} else {
-					carInput = new CarNumberInput('carNumberInput' + visitorId + '-1', 'clh' + inputNum, '粤')
-				}
-				carNumberInstances[visitorId].push(carInput);
-				
-			}
-			/**
-			 * 初始化自定义下拉框,支持设置默认值、回调函数、自定义选项数组和校验功能
-			 * @param {string} containerSelector - 下拉框容器的CSS选择器
-			 * @param {Array} optionsArray - 包含选项的数组对象 [{...}](可选)
-			 * @param {object} mapping - 映射对象,定义选项中用于显示文本和作为值的字段名 {text: '字段名', value: '字段名'}(可选)
-			 * @param {object} validation - 校验对象,包含校验设置 {enable: true/false, message: '报错信息'}(可选)
-			 * @param {function|null} callback - 选中后的回调函数(可选)
-			 */
-			function initSSSelect(containerSelector, optionsArray = [], mapping = { text: 'n', value: 'v' }, validation = { enable: false, message: '' }, callback = null) {
-				
-				const container = document.querySelector(containerSelector); // 获取容器
-				if (!container) {
-					console.error('容器未找到');
-					return;
-				}
-
-				const ssSelect = container.querySelector('.ss-select'); // 获取显示区域
-				const optionsContainer = container.querySelector('.ss-options'); // 获取选项容器
-				const hiddenInput = container.querySelector('input[type="hidden"]'); // 隐藏的输入框
-
-				// 获取容器的父级元素,以便插入错误提示
-				const parent = container.parentNode;
-
-				// 创建并插入分隔线 span
-				let lineSpan = document.getElementById(containerSelector.replace(/[#.]/g, '') + 'Span');
-				if (!lineSpan) {
-					lineSpan = document.createElement('span'); // 创建线的 span
-					lineSpan.id = containerSelector.replace(/[#.]/g, '') + 'Span'; // 使用指定格式的 id
-					lineSpan.className = 'border-input-error vLine-leftWarning'; // 设置样式
-					lineSpan.style.display = 'none'; // 显示分隔线
-					parent.insertBefore(lineSpan, container.nextSibling); // 插入到 container 之后
-				}
-				if (validation.enable) {
-					lineSpan.style.display = 'block'; // 显示分隔线
-				}
-
-				// 创建并插入错误提示的 div
-				let errorDiv = document.getElementById(containerSelector.replace(/[#.]/g, '') + 'ErrorDiv');
-				if (!errorDiv) {
-					errorDiv = document.createElement('div'); // 创建错误提示的 div
-					errorDiv.id = containerSelector.replace(/[#.]/g, '') + 'ErrorDiv'; // 使用指定格式的 id
-					errorDiv.className = 'error-message'; // 设置样式
-					errorDiv.style.position = 'absolute';
-					errorDiv.style.left = '0px';
-					errorDiv.style.bottom = '0px';
-					errorDiv.style.color = 'red';
-					errorDiv.style.fontSize = '12px';
-					errorDiv.style.width = '100%';
-					errorDiv.style.textAlign = 'right';
-					errorDiv.style.lineHeight = '18px';
-					errorDiv.style.height = '18px';
-					errorDiv.style.display = 'none'; // 初始状态隐藏
-					parent.insertBefore(errorDiv, lineSpan ? lineSpan.nextSibling : container.nextSibling); // 插入到分隔线之后
-				}
-
-				
-				
-				// 如果传入了选项数组,动态生成选项 DOM
-				if (optionsArray.length > 0) {
-					optionsContainer.innerHTML = ''; // 清空原有选项
-					optionsArray.forEach(option => {
-						const optionDiv = document.createElement('div');
-						optionDiv.setAttribute('data-value', option[mapping.value]); // 使用映射的 value 作为选项值
-						optionDiv.textContent = option[mapping.text]; // 使用映射的 text 作为显示文本
-						optionsContainer.appendChild(optionDiv);
-					});
-				}else {
-				    optionsContainer.innerHTML = '<div class="padding">无选项</div>';
-				}
-
-				// 点击下拉框时,打开或关闭选项列表
-				ssSelect.addEventListener('click', function (event) {
-					// 关闭其他所有下拉框
-					document.querySelectorAll('.ss-select-container').forEach(cont => {
-						if (cont !== container) {
-							cont.classList.remove('open');
-						}
-					});
-
-					// 切换当前下拉框的状态
-					container.classList.add('open');
-					event.stopPropagation(); // 阻止事件冒泡,防止点击下拉框时触发 document 的点击事件
-
-					// 如果启用了校验且没有选中内容,则显示错误提示
-					if (validation.enable && (!hiddenInput.value || hiddenInput.value === "")) {
-						errorDiv.textContent = validation.message || ''; // 设置错误提示文字
-						errorDiv.style.display = 'block'; // 显示错误提示
-					}
-				});
-
-				// 处理选项点击事件
-				optionsContainer.querySelectorAll('div').forEach(option => {
-					option.addEventListener('click', function () {
-						const value = this.getAttribute('data-value'); // 获取选项的值
-						const text = this.textContent; // 获取选项的文本
-
-						// 设置下拉框显示文本和隐藏输入框的值
-						ssSelect.textContent = text;
-						hiddenInput.value = value;
-
-						// 移除所有其他选项的选中状态
-						optionsContainer.querySelectorAll('div').forEach(opt => opt.classList.remove('selected'));
-
-						// 为当前选中的选项添加选中状态
-						this.classList.add('selected');
-
-						// 关闭下拉框
-						container.classList.remove('open');
-
-						// 隐藏错误提示
-						errorDiv.style.display = 'none';
-						// 隐藏分隔线
-						lineSpan.style.display = 'none';
-						// parent.style.borderBottom = 'none';
-						// 如果有回调函数,调用并传递选中的值
-						if (callback && typeof callback === 'function') {
-							callback(value);
-						}
-					});
-				});
-
-				// 从容器的 value 属性获取默认值
-				const defaultValue = container.getAttribute('value');
-
-				// 设置默认选中值
-				if (defaultValue !== null && defaultValue !== "") {
-					const defaultOption = optionsContainer.querySelector(`div[data-value="`+defaultValue+`"]`);
-					if (defaultOption) {
-						console.log('defaultOption',defaultOption.textContent)
-						ssSelect.textContent = defaultOption.textContent; // 设置下拉框的默认文本
-						hiddenInput.value = defaultOption.getAttribute('data-value'); // 设置隐藏输入框的默认值
-						defaultOption.classList.add('selected'); // 设置选中状态
-						// 隐藏错误提示
-						errorDiv.style.display = 'none';
-						// 隐藏分隔线
-						lineSpan.style.display = 'none';
-						
-						// 如果有回调函数,执行回调
-						if (callback && typeof callback === 'function') {
-							callback(defaultValue);
-						}
-					}
-				}
-
-				// 点击其他地方关闭所有下拉框
-				document.addEventListener('click', function () {
-					container.classList.remove('open');
-					// 如果启用了校验功能且没有选中项,显示错误提示
-					if (validation.enable && (!hiddenInput.value || hiddenInput.value === "")) {
-						errorDiv.textContent = validation.message; // 设置错误提示文字
-						errorDiv.style.display = 'block'; // 显示校验错误信息
-						// parent.style.borderBottom = '1px solid red';
-					}
-				});
-
-				// 防止点击容器内部时触发 document 的点击事件
-				container.addEventListener('click', function (event) {
-					event.stopPropagation();
-				});
-
-				// 如果启用了校验功能且没有默认选中项,显示错误提示
-				// if (validation.enable && (!defaultValue || defaultValue === "")) {
-				// 	errorDiv.textContent = validation.message; // 设置错误提示文字
-				// 	errorDiv.style.display = 'block'; // 显示校验错误信息
-				// }
-				return {
-					setValue: function(value) {
-						if (!value) {
-							// 恢复到初始状态
-							ssSelect.textContent = '请选择';
-							hiddenInput.value = '';
-							
-							// 移除所有选中状态
-							optionsContainer.querySelectorAll('div').forEach(opt => 
-								opt.classList.remove('selected')
-							);
-							
-							// 如果启用了校验,显示错误提示和分隔线
-							if (validation.enable) {
-								errorDiv.textContent = validation.message || '';
-								errorDiv.style.display = 'block';
-								lineSpan.style.display = 'block';
-							}
-							
-							return true;
-						}
-
-						const option = optionsContainer.querySelector(`div[data-value="${value}"]`);
-						if (option) {
-							// 更新显示文本和隐藏输入框的值
-							ssSelect.textContent = option.textContent;
-							hiddenInput.value = value;
-							
-							// 更新选中状态
-							optionsContainer.querySelectorAll('div').forEach(opt => opt.classList.remove('selected'));
-							option.classList.add('selected');
-							
-							// 隐藏错误提示和分隔线
-							errorDiv.style.display = 'none';
-							lineSpan.style.display = 'none';
-							
-							// 如果有回调函数,执行回调
-							if (callback && typeof callback === 'function') {
-								callback(value);
-							}
-							
-							return true;
-						}
-						return false;
-					}
-				};
-			}
-			// 清除所有表单部分的显示
-			function hideAllSections() {
-				// 隐藏所有部分
-				$('#formSection2, #formSection2 tr').addClass('hidden');
-				$('#formSection3, #formSection3 tr').addClass('hidden');
-
-				
-				// 清第二部分校验
-				wdVm.remove("wd.commonValidator.notNull", ["jfrxm"]);
-				wdVm.remove("wd.commonValidator.int", ["jfrgrdh"]);
-				wdVm.remove("wd.commonValidator.notNull", ["zy"]);
-				wdVm.remove("wd.commonValidator.notNull", ["bj"]);
-				wdVm.remove("wd.commonValidator.int", ["rs"]);
-				wdVm.remove("wd.commonValidator.notNull", ["dwmc"]);
-				wdVm.remove("wd.commonValidator.notNull", ["sy"]);
-			}
-
-			/** 
-			 * 处理 "探访学生" 的表单显示 
-			 * 受访人信息显示:姓名、专业、班级、个人电话
-			 * 来访信息显示:人数、预约开始时间、预约结束时间
-			 */
-			function handleStudentVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection2').removeClass('hidden'); // 显示表单部分2
-				$('#tr-jfrxm, #tr-zy, #tr-bj, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
-				// 加第二部分校验
-				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-				wdVm.add("wd.commonValidator.notNull", ["zy"], { msgPrfx: "专业" }, 1);
-				wdVm.add("wd.commonValidator.notNull", ["bj"], { msgPrfx: "班级" }, 1);
-				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-				$('#formSection3').removeClass('hidden');
-				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-			}
-
-
-			/** 
-			 * 处理 "探访教职工" 的表单显示 
-			 * 受访人信息显示:姓名、个人电话
-			 * 来访信息显示:人数、预约开始时间、预约结束时间
-			 */
-			function handleStaffVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection2').removeClass('hidden'); // 显示表单部分2
-				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
-				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-				$('#formSection3').removeClass('hidden');
-				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-				
-			}
-
-			/** 
-			 * 处理 "物流配送" 的表单显示 
-			 * 受访人信息显示:姓名、个人电话
-			 * 来访信息显示:人数、预约开始时间、预约结束时间
-			 */
-			function handleLogisticsVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection2').removeClass('hidden'); // 显示表单部分2
-				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
-				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-				$('#formSection3').removeClass('hidden');
-				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-				
-			}
-
-			/** 
-			 * 处理 "公务" 的表单显示 
-			 * 受访人信息显示:姓名、个人电话
-			 * 来访信息显示:单位、人数、预约开始时间、预约结束时间
-			 */
-			function handleOfficialVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection2').removeClass('hidden'); // 显示表单部分2
-				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
-				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-				$('#formSection3').removeClass('hidden'); // 显示表单部分3
-				$('#tr-dwmc, #tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); // 显示公务相关字段
-				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-				
-			}
-
-			/** 
-			 * 处理 "工作学习" 的表单显示 
-			 * 受访人信息显示:姓名、个人电话
-			 * 来访信息显示:人数、预约开始时间、预约结束时间
-			 */
-			function handleWorkStudyVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection2').removeClass('hidden'); // 显示表单部分2
-				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
-				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-				$('#formSection3').removeClass('hidden');
-				$('#tr-dwmc,#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
-				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-				
-			}
-
-			/** 
-			 * 处理 "其他" 的表单显示 
-			 * 受访人信息显示:姓名、个人电话
-			 * 来访信息显示:人数、预约开始时间、预约结束时间
-			 */
-			function handleOtherVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection2').removeClass('hidden'); // 显示表单部分2
-				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
-				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-				$('#formSection3').removeClass('hidden');
-				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj,#tr-sy, #tr-dwmc').removeClass('hidden');
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-				wdVm.add("wd.commonValidator.notNull", ["sy"], { msgPrfx: "事由", notBlank: true }, 1);
-				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
-				
-			}
-
-			/** 
-			 * 处理 "酒店餐饮" 的表单显示 
-			 * 受访人信息显示:无
-			 * 来访信息显示:酒店名【下拉】、人数、预约开始时间、预约结束时间
-			 */
-			function handleHotelVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection3').removeClass('hidden');
-				$('#tr-jfbmid, #tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); // 显示酒店相关字段
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-			}
-			
-			/** 
-			 * 处理 "培训会议" 的表单显示 
-			 * 受访人信息显示:无
-			 * 来访信息显示:名称【下拉】、人数、预约开始时间、预约结束时间
-			 */
-			function handleTrainingVisit() {
-				hideAllSections(); // 先隐藏所有部分
-				$('#formSection2').removeClass('hidden'); // 显示表单部分2
-				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
-				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
-				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-				$('#formSection3').removeClass('hidden');
-				$('#tr-dwmc,#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); // 显示会议相关字段
-				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
-				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
-
-			}
-
-			let firstVisitor = true;
-			let xqInstance ;
-			let jfbmInstance ;
-			// 选择类别后
-			function selectLflbm(value) {
-				// 初始化开始事件结束时间
-				setInitialTime()
-				// 清空已输入的数据
-				function clearInput() {
-					console.log('清除已输入的数据')
-				    $('input[name="jfrxm"]').val('')
-					$('input[name="jfrgrdh"]').val('')
-					$('input[name="jfryid"]').val('')
-					$('input[name="jfxiaoqid"]').val('')
-					$('#jfxiaoqid .ss-select').text('请选择校区');
-					$("input[name='jfbmid']").val('')
-					
-					$('#jfbmid .ss-options div').remove();
-					$('input[name="dwmc"]').val('')
-					
-				}
-				clearInput()
-				
-				if (firstVisitor) {
-					xqInstance = initSSSelect('#jfxiaoqid', initSelectData.XIAOQ, { text: 'mc', value: 'xiaoqid' }, { enable: true }, selectXq);// 初始化校区下拉
-					console.log(xqInstance)
-					
-
-					// 初始化第一个随行人员
-					addVisitor(uniqueVisitorIdCounter, visitorCount, '访客');
-					
-					const jfrxm = $("input[name='jfrxm']").val('${lf.jfrxm}')
-					const jfrgrdh = $("input[name='jfrgrdh']").val('${lf.jfrgrdh}')
-					const jfryid = $("input[name='jfryid']").val('${lf.jfryid}')
-					const dwmc = $("input[name='dwmc']").val('${lf.dwmc}')
-					
-					// const xbm = $("input[name='xbm']").val(${lf.xbm});
-					// const sfzjlbm = $("input[name='sfzjlbm']").val(${lf.sfzjlbm});
-					const xm = $("input[name='xm']").val('${lf.xm}');
-					const sfzh = $("input[name='sfzh']").val('${lf.sfzh}');
-					const grdh = $("input[name='grdh']").val('${lf.grdh}');
-					
-					carNumberInstances['1'][0].setCarNumber('${lf.clh}')
-					
-
-					// wdVm.add("wd.commonValidator.notNull", ["xm"], { msgPrfx: "姓名" }, 1);
-					// wdVm.add("wd.commonValidator.idCard", ["sfzh"], { msgPrfx: "证件号", notBlank: true, chkCsrq: false, chkXb: false, chkCsdq: false }, 1);
-					// wdVm.add("wd.commonValidator.int", ["grdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
-
-					firstVisitor = false;
-				}else{
-					xqInstance.setValue()
-					$('#jfbmid .ss-select').text('请选择酒店');
-				}
-
-				switch (value) {
-					case '1': // 探访学生
-						handleStudentVisit();
-						break;
-					case '5': // 探访教职工
-						handleStaffVisit();
-						break;
-					case '11': // 公务
-						handleOfficialVisit();
-						break;
-					case '21': // 培训会议
-						handleTrainingVisit();
-						break;
-					case '31': // 工作学习
-						handleWorkStudyVisit();
-						break;
-					case '51': // 物流配送
-						handleLogisticsVisit();
-						break;
-					case '61': // 酒店餐饮
-						handleHotelVisit();
-						$('#tr-jfbmid th').text('酒店名');
-						break;
-					case '71': // 场地预约
-						handleHotelVisit();
-						$('#tr-jfbmid th').text('场地');
-						break;
-					case '91': // 其他
-						handleOtherVisit();
-						break;
-					case '99': // 测试
-						handleOfficialVisit();
-						break;
-				}
-				// 选择后出现标题和底部按钮
-				$('.mobileForm-title,.mobileBottom-div').removeClass('hidden');
-			}
-			function initBm(value){
-				const lflbm = $("input[name='lflbm']").val();
-				// 过滤得到 xiaoqid 等于传入值的酒店对象数组
-				let filteredData ;
-				if(lflbm==61){filteredData = initSelectData.JD.filter(hotel => hotel.xiaoqid == value);}
-				if(lflbm==71){filteredData = initSelectData.CGHD.filter(hotel => hotel.xiaoqid == value);}
-				// 打印过滤后的数据
-				jfbmInstance = initSSSelect('#jfbmid', filteredData, { text: 'mc', value: 'bmid' }, { enable: true });// 初始化酒店下拉
-				if('${lf.jfbmid}' == ''){
-					$('#jfbmid .ss-select').text('请选择');
-					console.log(jfbmInstance)
-					jfbmInstance.setValue()
-				}
-			}
-			// 选择了校区
-			function selectXq(value) {
-				const lflbm = $("input[name='lflbm']").val();
-				//如果是酒店餐饮,则根据校区初始选择酒店
-				
-				initBm(value)
-				
-				
-			}
-			$(document).ready(function () {
-				const warnMsg = '${warnMsg}';
-				if (warnMsg) {
-				    alert(warnMsg);
-				}
-				$.ajax({
-					type: 'post',
-					async: false,
-					url: "<ss:serv name='lf_initExtLfInp' parm='{"param1":"abc123"}'/>",
-					data: { param2: 'def456' },
-					success: function (result) {
-						initSelectData = result;
-					}
-				});
-				// 初始化自定义下拉框,传入回调函数
-				initSSSelect('#lflbm', initSelectData.LFLB, { text: 'mc', value: 'lflbm' }, { enable: true, message: '请选择来访类别!' }, selectLflbm);
-				
-				// 绑定新增随行人员事件
-				$("#visitorAdd").click(function () {
-					visitorCount++; // 增加有效随行人员计数
-					// 把新增的随行人员ID存入数组
-					sxry_num.push(uniqueVisitorIdCounter);
-					console.log(sxry_num)
-					uniqueVisitorIdCounter++; // 增加唯一随行人员 ID
-
-					// 新增随行人员
-					addVisitor(uniqueVisitorIdCounter, visitorCount, '');
-				});
-
-				// 点击删除随行人员
-				$(document).on("click", ".mobileDelete-button", function () {
-					const currentVisitorId = $(this)
-						.closest(".mobileForm-container")
-						.data("visitor-id");
-
-					delete carNumberInstances[currentVisitorId];
-					// 从随行人员数组中删除对应ID
-					sxry_num = sxry_num.filter(item => item !== (currentVisitorId - 1));
-					console.log(sxry_num)
-					// 删除对应校验
-					wdVm.remove("wd.commonValidator.notNull", [`xm_` + (currentVisitorId - 1)]);
-					wdVm.remove("wd.commonValidator.idCard", [`sfzh_` + (currentVisitorId - 1)]);
-					wdVm.remove("wd.commonValidator.int", [`grdh_` + (currentVisitorId - 1)]);
-					wdVm.remove('wd.commonValidator.notNull', [`sfzjlbm_` + (currentVisitorId - 1)]);
-
-					// 删除元素
-					$(this).closest(".mobileForm-container").remove();
-
-					updateVisitorNumbers();
-				});
-				function updateVisitorNumbers() {
-					$(".mobileForm-container").each(function (index) {
-						const newVisitorNumber = index;
-						if (!index) {
-							$(this).find(".mobileForm-title span:first-child").text("访客");
-						} else {
-							$(this).find(".mobileForm-title span:first-child").text("随行人员" + newVisitorNumber);
-						}
-					});
-					visitorCount = $(".mobileForm-container").length - 1;//减1是为了不把访客算进去
-					console.log("删除后当前访客数量", visitorCount)
-				}
-
-				// 新增车牌号
-				$(document).on("click", ".carNumberAdd", function () {
-					const currentVisitorId = $(this)
-						.closest(".mobileForm-container")
-						.data("visitor-id");
-					console.log("当前随行人员的ID", currentVisitorId);
-					if (!carNumberInstances[currentVisitorId]) {
-						carNumberInstances[currentVisitorId] = []; // 初始化当前随行人员的实例数组
-					}
-
-					const currentCarNumberCounter =
-						carNumberInstances[currentVisitorId].length + 1;
-
-					const newId = `carNumberInput` + currentVisitorId + `-` + currentCarNumberCounter;
-
-
-					console.log("主动点击随行人员的车牌号", newId);
-
-					const newRow = `
-				<tr class="carNumberRow">
-					<td colspan="2" class="carNumberTd">
-						<div>
-							<div id="`+ newId + `"></div>
-							<span class="mobileDelete-button carNumberDelete"></span>
-						</div>
-					</td>
-				</tr>`;
-
-					$(this).closest("table").find("tr").last().after(newRow);
-
-
-					const carInput = new CarNumberInput(newId, 'clh', '粤');
-					carNumberInstances[currentVisitorId].push(carInput);
-				});
-
-				// 删除车牌号行
-				$(document).on("click", ".carNumberDelete", function () {
-					const currentVisitorId = $(this)
-						.closest(".mobileForm-container")
-						.data("visitor-id");
-
-					// 找到当前随行人员下的所有车牌号行(根据容器和行数查找)
-					const carNumberRows = $(this)
-						.closest(".mobileForm-container")
-						.find("tr.carNumberRow");
-
-					// 找到当前点击的删除按钮所在的tr元素
-					const currentRow = $(this).closest("tr.carNumberRow");
-
-					// 获取当前删除按钮对应的车牌号索引
-					const rowIndex = carNumberRows.index(currentRow) + 1;
-
-					// 确保carNumberRows和carNumberInstances数组的一致性
-					if (rowIndex !== -1 && carNumberInstances[currentVisitorId]) {
-						// 删除对应的实例
-						carNumberInstances[currentVisitorId].splice(rowIndex, 1);
-						console.log(
-							`删除随行人员${currentVisitorId}里面的第${rowIndex}个车牌号后,实例数组:`,
-							carNumberInstances[currentVisitorId]
-						);
-					}
-
-					// 删除DOM中的对应行
-					currentRow.remove();
-				});
-			});
-
-		</script>
-		<script>
-			// 定义监听的逻辑,添加防抖处理
-			var debounceTimer; // 用于防抖的定时器
-
-			function checkInputsAndSendRequest() {
-				// 清除之前的定时器,防止过于频繁地发起请求
-				clearTimeout(debounceTimer);
-
-				// 设置一个新的定时器,延迟执行校验
-				debounceTimer = setTimeout(function() {
-					var jfrxmValue = $('input[name="jfrxm"]').val();  // 获取 jfrxm 的值
-					var jfrgrdhValue = $('input[name="jfrgrdh"]').val();  // 获取 jfrgrdh 的值
-					var lflbm = $('input[name="lflbm"]').val();  // 获取 lflbm 的值
-					// 如果两个输入框都有值,再发起 AJAX 请求
-					if (jfrxmValue && jfrgrdhValue) {
-						// 发起 AJAX 请求
-						$.ajax({
-							type: 'post',
-							async: false,
-							url: "<ss:serv name='lf_loadRyidByXmGrdh'/>",
-							data: {
-								xm: jfrxmValue,
-								grdh: jfrgrdhValue,
-								lflbm: lflbm
-							},
-							success: function(result) {
-
-								// 如果有错误消息
-								if (result && result.msg) {
-									$('input[name="jfryid"]').val('');
-									showErrorMessages(result.msg); // 显示错误信息
-								} else if (result && result.ryid){
-									$('input[name="jfryid"]').val(result.ryid);
-									removeErrorMessages(); // 清除错误信息
-								}
-
-								<%--
-								// 如果有结果,赋值
-								if (result && result.length > 0) {
-									$('input[name="jfryid"]').val(result[0].ryid);
-									removeErrorMessages(); // 清除错误信息
-								} else {
-									$('input[name="jfryid"]').val('');
-									showErrorMessages(); // 显示错误信息
-								}
-								--%>
-							}
-						});
-					} else {
-						$('input[name="jfryid"]').val('');
-						// 如果输入不全,清除错误信息
-						removeErrorMessages();
-					}
-				}, 500); // 防抖延迟500ms
-			}
-
-			// 显示错误信息
-			function showErrorMessages(msg) {
-				var jfrxmTd = $('input[name="jfrxm"]').closest('td');
-				var jfrgrdhTd = $('input[name="jfrgrdh"]').closest('td');
-
-				// 检查是否已经存在错误提示
-				if (!jfrxmTd.find('.error-message').length) {
-					jfrxmTd.css("border-bottom", "1px solid red")
-						.append('<span class="border-input-error vLine-leftWarning jfrxmSpan"></span>')
-						.append('<div class="error-message" style="position: absolute; left: 0px; bottom: 0px; color: red; font-size: 12px; width: 100%; text-align: right; line-height: 18px; height: 18px;">'+msg+'</div>');
-				}
-
-				if (!jfrgrdhTd.find('.error-message').length) {
-					jfrgrdhTd.css("border-bottom", "1px solid red")
-						.append('<span class="border-input-error vLine-leftWarning jfrgrdhSpan"></span>')
-						.append('<div class="error-message" style="position: absolute; left: 0px; bottom: 0px; color: red; font-size: 12px; width: 100%; text-align: right; line-height: 18px; height: 18px;">'+msg+'</div>');
-				}
-			}
-
-			// 清除错误信息
-			function removeErrorMessages() {
-				var jfrxmTd = $('input[name="jfrxm"]').closest('td');
-				var jfrgrdhTd = $('input[name="jfrgrdh"]').closest('td');
-				jfrxmTd.css("border-bottom", ""); // 恢复边框样式
-				jfrgrdhTd.css("border-bottom", ""); // 恢复边框样式
-				jfrxmTd.find('.error-message').remove(); // 移除所有错误提示
-				jfrgrdhTd.find('.error-message').remove(); // 移除所有错误提示
-				jfrxmTd.find('.jfrxmSpan').remove(); // 移除所有错误提示
-				jfrgrdhTd.find('.jfrgrdhSpan').remove(); // 移除所有错误提示
-
-			}
-
-			// 监听两个 input 的输入事件
-			$('input[name="jfrxm"], input[name="jfrgrdh"]').on('input blur', function() {
-				checkInputsAndSendRequest();
-			});
-			
-			if('${lf.jfrxm}' && '${lf.jfrgrdh}'){
-				checkInputsAndSendRequest();
-			}
-		</script>
-		<script>
-			 // 使用事件委托绑定 td 的点击事件
-			$('table').on('click', 'td', function() {
-			console.log("td clicked");
-			focusTextInput($(this));
-			});
-
-			// 使用事件委托绑定 .error-message 的点击事件
-			$('body').on('click', '.error-message', function() {
-			focusTextInput($(this));
-			});
-
-			// 公共方法,用于查找并聚焦 input[type="text"]
-			function focusTextInput($element) {
-				const $input = $element.find('input[type="text"]').length 
-								? $element.find('input[type="text"]') 
-								: $element.siblings('input[type="text"]');
-
-				if ($input.length) {
-					$input.focus();
-				}
-			}
-		</script>
-		</html>

+ 0 - 257
alf/ext_lf_lfryMine.jsp

@@ -1,257 +0,0 @@
-<%-- 微信 来访我的 --%>
-
-<%@ page language="java" pageEncoding="UTF-8" %>
-<%@ taglib uri="/ssTag" prefix="ss" %>
-<%@ page import="base.WechatC" %>
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-    <link rel="stylesheet" href="/skin/easy/Main.css?v=1.0.0">
-    <script type="text/javascript" src="/ss/jquery/jquery-1.7.2.min.js"></script>
-    <script type="text/javascript" src="/ss/js/base.js"></script>
-    <script type="text/javascript" src="/ss/js/common.js"></script>
-    <script type="text/javascript" src="/ss/js/display.js"></script>
-    <script type="text/javascript" src="/ss/js/edit.js"></script>
-
-    <title>我的</title>
-    <style>
-        .mobileSearch-div{
-            margin: 1rem auto;
-        }
-        .mobileAdd-button{
-            width: 1.3rem;
-            height:1.3rem;
-            background: transparent;
-            margin-right: 0.3rem;
-        }
-        .mobileAdd-button::after{
-            filter: none;
-        }
-        .mobileAdd-button:active{
-            background: transparent;
-        }
-    </style>
-
-
-    
-
-</head>
-
-<body class="mobileApply-bg">
-    <%-- ${data}--%>
-    <%-- <a href="<ss:serv name='lf_mine_ck' dest='lf_mine_info' />&lp=d27f08d10cb64d6591c5f556dd880090">跳到来访查看</a>  --%>
-
-    <div class="mobileSearch-div" style="display:flex;justify-content:flex-end;padding-right: 0.5rem;">
-        <!-- <div class="mobileSearch-input-div">
-             <input type="text">
-             <span class="mobileSearch-icon"></span>
-         </div> -->
-
-        <button class="mobileSearch-button" style="height: 36px;" onclick="goLink('<%=WechatC.HOST_byWechat%>/extRoot?type=22&biz=lf_inp')" ><span class="mobileAdd-button" ></span>增加</button>
-    </div>
-    <div id="mobileLf-div" style="padding-right: 0.5rem;">
-
-           
-           <!--   <div class="mobileLf-card">
-                <div class="mobileLf-card-ing-tag">审核中</div>
-                <p class="mobileLf-title">住宿餐饮</p>
-                <p>姓名:李四</p>
-                <p>个人电话:13800138000</p>
-                <p>预约开始时间:2024/08/10 18:33</p>
-            </div>
-           <div class="mobileLf-card">
-                
-                <p class="mobileLf-title">住宿餐饮<span class="mobileLf-card-agree-tag">同意</span></p>
-                <p>姓名:李四</p>
-                <p>个人电话:13800138000</p>
-                <p>预约开始时间:2024/08/10 18:33</p>
-            </div> 
-            <div class="mobileLf-card">
-                
-                <p class="mobileLf-title">住宿餐饮<span class="mobileLf-card-refuse-tag">退回</span></p>
-                <p>姓名:李四</p>
-                <p>个人电话:13800138000</p>
-                <p>预约开始时间:2024/08/10 18:33</p>
-            </div>   -->
-    </div>
-     <%--<% String sharedValue = "2"; %>
-    <%@ include file="/page/ext_lf_index_footer.jsp" %> --%>
-
-
-    <script>
-        
-        
-        
-    </script>
-    <script>
-
-       
-        let pageNumber = 1;
-        let isLoading = false;
-        let hasMoreData = true;
-        let gr = document.createDocumentFragment();
-        
-        // 渲染列表项的函数
-        function renderItem(item) {
-            var div = document.createElement('div');
-            div.className = 'mobileLf-card';
-            div.onclick = function () {
-                location.href = `<ss:serv name='lf_lfryMine_ck' dest='lf_mine_info' />&lp=` + item.wblp;
-            };
-
-            if(item.lczt == '录入'){
-                item.lczt = '审核中';
-                item.lcztm = '11';
-            }
-            
-            div.innerHTML = (item.lcztm == '11' && item.is_late == '0'
-                ? '<div class="mobileLf-card-ing-tag">' + item.lczt + '</div>'
-                : '') +
-                '<p class="mobileLf-title">' +
-                item.lflb +
-                (item.lcztm == '51'
-                    ? '<span class="mobileLf-card-agree-tag">' + item.lczt + '</span>'
-                    : item.lcztm == '55' 
-                        ? '<span class="mobileLf-card-refuse-tag">' + item.lczt + '</span>' 
-                        : (item.lcztm == '11' && item.is_late == '1')
-                            ? '<span class="mobileLf-card-expired-tag">已过期</span>'
-                            : item.lcztm == '59'
-                                ? '<span class="mobileLf-card-refuse-tag">退回</span>'
-                                : '') +
-                '</p>' +
-                (item.jfrxm ? '<p>受访人:' + item.jfrxm + '</p>' : '') +
-                '<p>预约开始时间:' + item.yykssj + '</p>';
-            
-            return div;
-        }
-
-        // 获取下一页数据
-        function getNextPageData(pageNum){
-            if (isLoading || !hasMoreData) return;
-            
-            isLoading = true;
-            $.ajax({
-                url: "<ss:serv name='lf_initLfryMineByAjax'/>",
-                type: "post",
-                dataType: "json",
-                data: {
-                    'pageNum': pageNum
-                },
-                success: function(result) {
-                    if (result.ssCode == 1) {
-                        const data = result.data;
-                        if (!data || data.length === 0) {
-                            hasMoreData = false;
-                            return;
-                        }
-                        
-                        let fragment = document.createDocumentFragment();
-                        data.forEach(function(item) {
-                            fragment.appendChild(renderItem(item));
-                        });
-                        document.getElementById('mobileLf-div').appendChild(fragment);
-                        
-                        pageNumber++;
-                    } else {
-                        window.document.location.href = window.location.origin + '/page/ext_lf_wechatIndex.jsp';
-                    }
-                },
-                complete: function() {
-                    isLoading = false;
-                }
-            });
-        }
-
-        // 初始加载第一页
-        getNextPageData(pageNumber);
-
-        // 节流函数
-        function throttle(func, wait) {
-            let timeout = null;
-            let previous = 0;
-            
-            return function() {
-                let now = Date.now();
-                let remaining = wait - (now - previous);
-                
-                if (remaining <= 0 || remaining > wait) {
-                    if (timeout) {
-                        clearTimeout(timeout);
-                        timeout = null;
-                    }
-                    previous = now;
-                    func.apply(this, arguments);
-                } else if (!timeout) {
-                    timeout = setTimeout(() => {
-                        previous = Date.now();
-                        timeout = null;
-                        func.apply(this, arguments);
-                    }, remaining);
-                }
-            }
-        }
-
-        // 滚动检查函数
-        function checkScrollAndLoad() {
-            // 获取页面总高度、视窗高度、滚动位置
-            const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
-            const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
-            const clientHeight = window.innerHeight || document.documentElement.clientHeight;
-            
-            // 当距离底部还有10%的距离时触发加载
-            const threshold = scrollHeight * 0.1;
-            
-            if (scrollHeight - scrollTop - clientHeight <= threshold) {
-                getNextPageData(pageNumber);
-            }
-        }
-
-        // 添加滚动监听,使用节流函数控制触发频率(这里设置为500ms)
-        window.addEventListener('scroll', throttle(checkScrollAndLoad, 500));
-
-
-
-        function goLink(value){
-            window.location.href = value
-        }
-
-        function goIndex(value){
-            
-            window.document.location.href = window.location.origin + '/page/ext_lf_index.jsp?t='+value
-            
-        }
-        function closePage() {
-
-            // 定义关闭页面的函数
-            function closeWindow() {
-                if (typeof WeixinJSBridge == "undefined") {
-                    // 监听WeixinJSBridgeReady事件
-                    document.addEventListener('WeixinJSBridgeReady', function () {
-                        WeixinJSBridge.call('closeWindow');
-                    }, false);
-                } else {
-                    // 如果是微信浏览器,直接调用
-                    WeixinJSBridge.call('closeWindow');
-                }
-            }
-
-            // 调用关闭页面函数
-            closeWindow();
-
-            // 如果不是微信浏览器,尝试使用window.close()关闭
-            if (!/MicroMessenger/i.test(navigator.userAgent)) {
-                window.close();
-                window.history.back();
-                
-            }
-        }
-    </script>
-
-
-</body>
-
-</html>

+ 0 - 814
alf/input.jsp

@@ -1,814 +0,0 @@
-<%@ page language="java" pageEncoding="UTF-8" isELIgnored="false" %>
-<%@ taglib uri="/ssTag" prefix="ss"%>
-<!DOCTYPE html>
-<html>
-<head>
-    <meta http-equiv="pragma" content="no-cache">
-    <meta http-equiv="cache-control" content="no-cache">
-    <meta http-equiv="expires" content="0">
-    <!-- 在 head 标签中修改或添加 meta 标签 -->
-    <meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-eval' 'unsafe-inline' http://127.0.0.1:* http://localhost:* http://192.168.3.174:*; worker-src 'self' blob: http://192.168.3.174:*; script-src 'self' 'unsafe-eval' 'unsafe-inline' blob: http://192.168.3.174:*; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; font-src 'self' data:; connect-src 'self' blob: http://192.168.3.174:*; frame-src 'self' blob:;">
-    <script src="../ss/js/base.js"></script>
-    <script type="module" src="../ss/js/validation-manager.js"></script>
-    <script type="module" src="../ss/js/validator-rules.js"></script>
-    <style type="text/css">
-        .avatar .el-form-item__content {
-          position: relative;
-        }
-  
-        .upload {
-          width: 124px;
-          height: 124px;
-          border-radius: 6px;
-          cursor: pointer;
-          position: absolute;
-          top: 0;
-          left: 0;
-          overflow: hidden;
-          text-align: center;
-          line-height: 124px;
-          font-size: 40px;
-          color: #c0c4cc;
-          background-color: rgba(0, 0, 0, 0.5);
-          opacity: 0;
-        }
-  
-        .upload:hover {
-          color: #fff;
-          opacity: 1;
-        }
-  
-        /* .icon {
-              width: 116px;
-              height: 116px;
-              border-radius: 3px;
-              float: left;
-          } */
-  
-        .icon-border {
-          background-color: rgba(243, 246, 248, 0.94);
-          border: 4px solid #fff;
-          box-shadow: inset 0 1.5px 3px 0 rgba(0, 0, 0, 0.15),
-            0 1.5px 3px 0 rgba(0, 0, 0, 0.15);
-          box-sizing: content-box;
-          margin: auto;
-          position: relative;
-        }
-      </style>
-</head>
-<body>
-    <div id="app">
-      <form class="form-container" @submit.prevent>
-        <div class="content-box fit-height-content">
-          <table class="table-container">
-            <tr>
-              <th rowspan="4">相片</th>
-              <td rowspan="4">
-                <div class="photo">
-                  <!-- 证件照 -->
-                  <ss-photo-upload
-                    v-model:url="idPhotoUrl"
-                    class="id-photo"
-                    :cropper-options="{
-                      width: 360,
-                      height: 360,
-                      aspectRatio: 1
-                    }"
-                  ></ss-photo-upload>
-
-                  <!-- 生活照 -->
-                  <ss-photo-upload
-                    v-model:url="lifePhotoUrl"
-                    class="life-photo"
-                    :cropper-options="{
-                      width: 400,
-                      height: 300,
-                      aspectRatio: 4/3
-                    }"
-                  ></ss-photo-upload>
-                </div>
-                <!-- <div class="photo">
-                  <div class="left">
-                    <div class="content">
-                      <input
-                        type="file"
-                        accept="image/*"
-                        id="iconFile"
-                        style="display: none"
-                      />
-
-                      <div class="icon" onclick="$('#iconFile').click();">
-                        <ss-icon name="user" size="140px" />
-                      </div>
-                      <div class="text">证件照</div>
-                    </div>
-                  </div>
-                  <div class="right">
-                    <div class="content">
-                      <div class="icon">
-                        <ss-icon name="photo" type="common" size="70px" />
-                      </div>
-                      <div class="text">生活照</div>
-                    </div>
-                  </div>
-                </div> -->
-              </td>
-              <th>姓名</th>
-              <td height="60">
-                <ss-input
-                  v-model="username"
-                  name="username"
-                  placeholder="请输入姓名"
-                  type="text"
-                ></ss-input>
-              </td>
-            </tr>
-
-            <tr>
-              <th>身份证类别</th>
-              <td height="60">
-                <ss-objp
-                  v-model="zhengjianType"
-                  name="zhengjianType"
-                  :opt="[{label:'请选择',value:''},{ label: '居民身份证', value: '1' },{ label: '香港特区护照或身份证', value: '6' },{ label: '澳门特区护照或身份证', value: '7' },{ label: '台湾居民来往大陆通行证', value: '8' },{ label: '外国人永久居留证', value: '10' }]"
-                  placeholder="请选择证件类别"
-                  width="300"
-                  load="objPickerLoad"
-                />
-              </td>
-              <script>
-
-
-                zhengjianTypeLoad:{
-
-                  var url='';
-                  ajax(url);
-                }
-              </script>
-            </tr>
-            <tr>
-              <th>证件号</th>
-              <td height="60">
-                <ss-input
-                  v-model="idCardNo"
-                  name="idCardNo"
-                  placeholder="请输入证件号"
-                  type="text"
-                ></ss-input>
-              </td>
-            </tr>
-            <tr>
-              <th>生日日期</th>
-              <td height="60">
-                <ss-date-picker
-                  v-model="date"
-                  name="date"
-                  type="date"
-                  placeholder="请选择生日日期"
-                  width="300px"
-                  @change="dateChange"
-                ></ss-date-picker>
-              </td>
-            </tr>
-            <tr>
-              <th>当前时间</th>
-              <td height="60">
-                <ss-date-picker
-                  v-model="datetime"
-                  name="datetime"
-                  :type="datetimeType"
-                  placeholder="请选择当前时间"
-                  width="300px"
-                  
-                ></ss-date-picker>
-              </td>
-              <th>时间</th>
-              <td height="60">
-                <ss-date-picker
-                  v-model="time"
-                  name="time"
-                  type="time"
-                  placeholder="请选择时间"
-                  width="300px"
-                ></ss-date-picker>
-              </td>
-            </tr>
-            <tr>
-              <th>英文名</th>
-              <td height="60">
-                <ss-input
-                  v-model="enName"
-                  name="enName"
-                  placeholder="请输入英文名"
-                  type="text"
-                ></ss-input>
-              </td>
-              <th>出生地</th>
-              <td height="60">
-                <div style="display: flex; width: 100%; height: 100%">
-                  <ss-hidden
-                    v-model="csdqm"
-                    name="csdqm"
-                    rule="226699"
-                  ></ss-hidden>
-                  <ss-cascader
-                    v-model="sheng"
-                    name="csdqm"
-                    placeholder="省"
-                    :opt="groups_sheng"
-                    width="200px"
-                    @change="handleCsdqProvinceChange"
-                    :level="1"
-                  ></ss-cascader>
-                  <ss-cascader
-                    v-model="shi"
-                    name="csdqm"
-                    placeholder="市"
-                    :opt="groups_shi"
-                    width="200px"
-                    @change="handleCsdqCityChange"
-                    :level="2"
-                  ></ss-cascader>
-                  <ss-cascader
-                    v-model="qu"
-                    name="csdqm"
-                    placeholder="区"
-                    :opt="groups_qu"
-                    width="200px"
-                    :level="3"
-                  ></ss-cascader>
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th>户籍所在地</th>
-              <td height="60">
-                <div style="display: flex; width: 100%; height: 100%">
-                 
-                  <ss-hidden
-                    v-model="hjzsdm"
-                    name="hjzsdm"
-                    rule="226699"
-                  ></ss-hidden>
-
-                <ss-cascader
-                  v-model="hjzsdmSheng"
-                  name="hjzsdm"
-                  placeholder="省"
-                  :opt="groups_hjzsdmSheng"
-                  width="200px"
-                  @change="handleHjzsdmProvinceChange"
-                  :level="1"
-                ></ss-cascader>
-                <ss-cascader
-                  v-model="hjzsdmShi"
-                  name="hjzsdm"
-                  placeholder="市"
-                  :opt="groups_hjzsdmShi"
-                  width="200px"
-                  @change="handleHjzsdmCityChange"
-                  :level="2"
-                ></ss-cascader>
-                <ss-cascader
-                  v-model="hjzsdmQu"
-                  name="hjzsdm"
-                  placeholder="区"
-                  :opt="groups_hjzsdmQu"
-                  width="200px"
-                  :level="3"
-                ></ss-cascader>
-              
-                </div>
-              </td>
-              
-            </tr>
-            <tr>
-              <th>专业</th>
-              <td>
-                <ss-cascader
-                  v-model="zyid"
-                  name="zyid"
-                  placeholder="请选择专业"
-                  :opt="groups_zyid"
-                  width="250px"
-                  @change="zyidChange"
-                  :level="1"
-                  mode="2"
-                ></ss-cascader>
-              </td>
-              <th>班级</th>
-              <td>
-                <ss-cascader
-                  v-model="bjid"
-                  name="bjid"
-                  placeholder="请选择班级"
-                  :opt="groups_bjid"
-                  width="250px"
-                  :level="2"
-                  mode="2"
-                ></ss-cascader>
-              </td>
-            </tr>
-            <tr>
-              <th>班级2</th>
-              <td>
-                <ss-cascader
-                  v-model="bjid2"
-                  name="bjid2"
-                  placeholder="请选择班级2"
-                  :opt="groups_bjid2"
-                  width="250px"
-                  :level="2"
-                  mode="2"
-                ></ss-cascader>
-              </td>
-              
-            </tr>
-            <tr>
-              <th>婚姻状况</th>
-              <td height="60">
-             
-                <!-- <ss-onoffbutton-array
-                  v-model="hyzk"
-                  name="hyzk"
-                  :opt="[{ label: '已婚', value: '1', width: '100px' },{ label: '未婚', value: '2', width: '100px' },]"
-                  multiple
-                /> -->
-                <!-- 多选模式 -->
-                <ss-onoffbutton
-                  v-model="hyzk"
-                  name="hyzk"
-                  label="已婚"
-                  value="1"
-                  
-                ></ss-onoffbutton>
-                <ss-onoffbutton
-                  v-model="hyzk"
-                  name="hyzk"
-                  label="未婚"
-                  value="2"
-                  
-                ></ss-onoffbutton>
-             
-                <ss-onoffbutton
-                  v-model="hyzk"
-                  name="hyzk"
-                  label="离异"
-                  value="3"
-                  
-                ></ss-onoffbutton>
-              </td>
-              <th>民族(可输入筛选)</th>
-              <td height="60">
-                <ss-objp
-                  v-model="mingzu"
-                  name="mingzu"
-                  :opt="groups"
-                  placeholder="民族"
-                  width="150"
-                  :input="true"
-                />
-              </td>
-            </tr>
-            <tr>
-              <th>邮箱</th>
-              <td height="60">
-                <ss-input
-                  v-model="email"
-                  name="email"
-                  placeholder="请输入邮箱"
-                  type="text"
-                ></ss-input>
-              </td>
-              <th>自定义校验</th>
-              <td height="60">
-                <ss-input
-                  v-model="fieldName"
-                  name="fieldName"
-                  placeholder="请输入自定义校验"
-                  type="text"
-                ></ss-input>
-              </td>
-            </tr>
-            <tr>
-              <th>
-                <div style="height: 150px">备注</div>
-              </th>
-              <td colspan="3" height="150px">
-                <div class="input">
-                  <ss-textarea name="remark" v-model="remark" />
-                </div>
-              </td>
-            </tr>
-            <tr>
-              <th>
-                <div style="height: 150px">jodit</div>
-              </th>
-              <td colspan="3" height="150px">
-                <ss-editor
-                  v-model="content"
-                  name="content"
-                  :url="contentUrl"
-                  :height="500"
-                  upload-url="/your-upload-url"
-                  :readonly="false"
-                  placeholder="请输入内容"
-                  @ready="onEditorReady"
-                  @change="onChange"
-                ></ss-editor>
-
-              </td>
-            </tr>
-            
-          </table>
-        </div>
-        <div>
-          <ss-validate err-msg="后台返回的错误" text-align="left" />
-        </div>
-        <div class="bottom-div">
-          <ss-bottom-button
-            text="取消"
-            @click="onDialogClose"
-            icon-class="bottom-div-close"
-          ></ss-bottom-button>
-          <ss-bottom-button
-            text="保存"
-            @click="onSubmit"
-            icon-class="bottom-div-save"
-          ></ss-bottom-button>
-        </div>
-      </form>
-    </div>
-    <script type="module">
-        const doCascade = async function({
-            children = [],
-            url,
-            vm,
-            prefix = 'groups_',
-            loadData = () => {},
-            value,           
-            mode = 1
-        }) {
-        try {
-            // 清空所有子级的值和选项
-            children.forEach(child => {
-            vm[child] = '';
-            // 使用字符串拼接替代模板字符串
-            vm[prefix + child] = [];
-            });
-            console.log(vm,prefix,children);
-            
-            if (loadData && value) {
-                const data = await loadData(value);
-                if (mode == '2') {
-                    children.forEach(child => {
-                    // 使用字符串拼接替代模板字符串
-                    vm[prefix + child] = data;
-                    });
-                } else {
-                    if (children.length > 0) {
-                    // 使用字符串拼接替代模板字符串
-                    vm[prefix + children[0]] = data;
-                    }
-                }
-                return;
-            }
-
-            if (url) {
-                const response = await fetch(url);
-                const data = await response.json();
-                    if (children.length > 0) {
-                        // 使用字符串拼接替代模板字符串
-                        vm[prefix + children[0]] = data;
-                    }
-                }
-            } catch (error) {
-                console.error('级联数据加载失败:', error);
-                if (children.length > 0) {
-                // 使用字符串拼接替代模板字符串
-                vm[prefix + children[0]] = [];
-                }
-            }
-        };
-      // 模拟 Ajax 请求的工具函数
-      const mockAjax = {
-        // 缓存数据,避免重复请求
-        _cache: null,
-
-        // 获取完整数据
-        async getData() {
-          if (this._cache) return this._cache;
-          const response = await fetch("../ss/js/level.json");
-          this._cache = await response.json();
-          return this._cache;
-        },
-
-        // 获取所有省份
-        async getProvinces() {
-          const data = await this.getData();
-          return data.map((item) => ({
-            label: item.name,
-            value: item.code,
-          }));
-        },
-
-        // 根据省份代码获取城市
-        async getCities(provinceCode) {
-          const data = await this.getData();
-          const province = data.find((p) => p.code === provinceCode);
-          if (!province || !province.children) return [];
-            
-            const cities = province.children
-            .filter((item) => item.city) // 确保是市级数据
-            .map((item) => ({
-              label: item.name,
-              value: item.code,
-            }));
-            
-          return cities
-        },
-
-        // 根据城市代码获取区县
-        async getDistricts(cityCode) {
-          const data = await this.getData();
-          for (const province of data) {
-            if (!province.children) continue;
-            const city = province.children.find((c) => c.code === cityCode);
-            if (city && city.children) {
-              return city.children.map((item) => ({
-                label: item.name,
-                value: item.code,
-              }));
-            }
-          }
-          return [];
-        },
-         // 模拟专业数据
-        getMajors() {
-          return new Promise((resolve) => {
-            setTimeout(() => {
-              resolve([
-                { label: '计算机科学与技术', value: '08010000' },  // 补齐8位
-                { label: '软件工程', value: '08020000' },
-                { label: '网络工程', value: '08030000' }
-              ]);
-            }, 1000);
-          });
-        },
-        // 模拟班级数据
-        getClasses(majorCode) {
-          // majorCode 会是 '08010000' 这样的格式
-          
-          const classData = {
-            '08010000': [
-              { label: '计科1班', value: '08010001' },
-              { label: '计科2班', value: '08010002' }
-            ],
-            '08020000': [
-              { label: '软件1班', value: '08020001' },
-              { label: '软件2班', value: '08020002' }
-            ],
-            '08030000': [
-              { label: '网络1班', value: '08030001' },
-              { label: '网络2班', value: '08030002' }
-            ]
-          };
-
-          return new Promise((resolve) => {
-            setTimeout(() => {
-              resolve(classData[majorCode] || []);
-            }, 1000);
-          });
-        }
-      };
-      SS.ready(function () {
-        ssVm.add("ss.commonValidator.notNull", ["username"], {
-          msgPrfx: "姓名",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["enName"], {
-          msgPrfx: "英文名",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["csdqm"], {
-          msgPrfx: "出生地",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["hjzsdm"], {
-          msgPrfx: "户籍所在地",
-        });
-        ssVm.add("ss.commonValidator.idCard", ["idCardNo"], {
-          msgPrfx: "证件号",
-          relField: "zhengjianType",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["date"], {
-          msgPrfx: "生日日期",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["content"], {
-          msgPrfx: "内容",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["zhengjianType"], {
-          msgPrfx: "证件类别",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["csd"], { msgPrfx: "出生地" });
-        ssVm.add("ss.commonValidator.notNull", ["mingzu"], { msgPrfx: "民族" });
-        ssVm.add("ss.commonValidator.notNull", ["hyzk"], {
-          msgPrfx: "婚姻状况",
-        });
-        ssVm.add("ss.commonValidator.notNull", ["remark"], { msgPrfx: "备注" });
-        // 邮箱格式验证
-        ssVm.add("ss.commonValidator.email", ["email"], {
-          msgPrfx: "邮箱",
-          required: true,
-        });
-
-        ssVm.add("ss.commonValidator.custom", ["fieldName"], {
-          msgPrfx: "字段名",
-          validate: (value) => {
-            // 返回 true/false 或者带消息的对象
-            if (value.includes("test")) {
-              return {
-                valid: false,
-                message: "不能输入test",
-              };
-            }
-            return true;
-          },
-        });
-        // 继承父页面的eventBus
-        const eventBus = window.parent.sharedEventBus;
-        function sonClose() {
-          // console.log("孙组件关闭了");
-        }
-
-        // 调用组件中的初始化方法
-        window.SS.dom.initializeFormApp({
-          el: "#app",
-          data() {
-            return {
-              date: "",
-              datetime: "",
-              time:"",
-              username: "",
-              enName: "",
-              idCardNo: "",
-              zhengjianType: "",
-              csd: "",
-              
-              mingzu: "",
-              zhengzhimianmao: "",
-              hyzk: "",
-              email: "",
-              fieldName: "",
-              remark: "",
-              visible: true,
-              idPhotoUrl: "",
-              lifePhotoUrl: "",
-              // lifePhotoUrl: "https://m.gzgs.edu.cn/skin/easy/image/default-personalPhoto.png",
-              groups: [
-                {
-                  value: "1",
-                  label: "汉族",
-                },
-                {
-                  value: "02",
-                  label: "蒙古族",
-                },
-              ],
-              reslutVisible: false,
-
-              csdqm: "",
-              sheng: "",
-              shi: "",
-              qu: "",
-              groups_sheng: [],
-              groups_shi: [],
-              groups_qu: [],
-              hjzsdm: "440105",
-              hjzsdmSheng: "",
-              hjzsdmShi: "",
-              hjzsdmQu: "",
-              groups_hjzsdmSheng: [],
-              groups_hjzsdmShi: [],
-              groups_hjzsdmQu: [],
-
-              zyid: '08010000',
-              bjid: '08010001',
-              bjid2: '',
-              groups_zyid: [],
-              groups_bjid: [],
-              groups_bjid2: []  ,
-              
-              content: '<p>初始内容</p>'
-              
-            };
-          },
-          setup() {},
-          methods: {
-            showDialog() {
-              this.visible = !this.visible;
-            },
-            onDialogClose() {
-              SS.closeDialog();
-              // eventBus.publish('inputDialog', false);
-            },
-            dateChange(value){
-              console.log(value);
-            },
-            onSubmit() {
-              console.trace("onSubmit called"); // 这会显示调用栈
-
-            },
-            // 加载省份数据
-            async loadProvinces() {
-              const provinces = await mockAjax.getProvinces();
-              this.groups_sheng = provinces;
-              this.groups_hjzsdmSheng = provinces;
-            },
-            // 加载专业数据
-            async loadMajors() {
-              this.groups_zyid = await mockAjax.getMajors();;
-            },
-            // 出生地区的处理方法
-            async handleCsdqProvinceChange(value) {
-              await doCascade({
-                children: ['shi', 'qu'],
-                value,
-                vm: this,
-                loadData: (value) => mockAjax.getCities(value),  // 使用箭头函数
-              });
-            },
-
-            async handleCsdqCityChange(value) {
-              await doCascade({
-                children: ['qu'],
-                value,
-                vm: this,
-                loadData: (value) => mockAjax.getDistricts(value),  // 使用箭头函数
-              });
-            },
-
-            // 户籍住所的处理方法
-            async handleHjzsdmProvinceChange(value) {
-                console.log("处罚了",value);
-              await doCascade({
-                children: ['hjzsdmShi', 'hjzsdmQu'],
-                value,
-                vm: this,
-                loadData: (value) => mockAjax.getCities(value),
-              });
-              console.log(this.groups_hjzsdmShi);
-            },
-
-            async handleHjzsdmCityChange(value) {
-              await doCascade({
-                children: ['hjzsdmQu'],
-                value,
-                vm: this,
-                loadData: (value) => mockAjax.getDistricts(value),
-  
-              });
-            },
-            async zyidChange(value) {
-              // this.bjid = '';
-              // this.bjid2 = '';
-              // this.groups_bjid = [];
-              // this.groups_bjid2 = [];
-              // this.groups_bjid = await mockAjax.getClasses(value);
-              // this.groups_bjid2 = await mockAjax.getClasses(value);
-              await doCascade({
-                children: ['bjid', 'bjid2'],
-                value,
-                vm: this,
-                loadData: (value) => mockAjax.getClasses(value),
-                mode:2
-              });
-            },
-            onEditorReady(editor) {
-              // console.log('编辑器初始化完成', editor);
-            },
-            onChange(content) {
-              console.log('内容变化:', content);
-            },
-          },
-          mounted() {
-            // 先加载初始数据
-            this.loadProvinces();  // 确保第一时间加载省份数据
-            this.loadMajors();
-          },
-
-          isDialogPage: true,
-        });
-        // window.SS.cropper.init({
-        //   el: $("#iconFile"),
-        //   photoSize: {
-        //     // 裁剪的图片大小,注意需要和 aspectRatio 保持统一比例
-        //     width: 360,
-        //     height: 360,
-        //   },
-        //   success: function (path) {
-        //     // 成功后的回调方法,path为裁剪后的img路径
-        //     console.log(path)
-        //   },
-        // });
-      });
-    </script>
-  </body>
-</html>

+ 0 - 750
alf/kqjl_bzrDm.ss.jsp

@@ -1,750 +0,0 @@
-<%-- 抄自 rjkcbHomep_dm.ss.jsp
-		 不关联 课程表 表,没有连课的概念,也没有 .是否选修、.是否分组 的概念
-		 不支持 座位安排 表,关联了 课程表(某节课的座位安排) -- 有 座位安排,早就是 按节点名了
-		 不支持合班,根据 课程表.是否合班(相同时间) 来判断是否合班
-		 不支持 同上节 功能,查找 课程表 来判断 -- 先简单点 --%>
-<html>
-<head>
-<style>
-	#pmtEdit {
-		/*overflow: auto!important;*/
-	}
-	.icon {
-		float: left;
-		width: 50px;
-		height: 20px;
-		font-size: 10px;
-		/* text-align: center; */
-		margin-right: 8px;
-		line-height: 20px;
-	}
-	.name {
-		font-size: 14px;
-		/* font-weight: bold; */
-	}
-	.warningProgress-div {
-		position: absolute;
-		bottom: 0px;
-		left: 0px;
-		width: 100%;
-	}
-	.warningProgress-done {
-		position: absolute;
-		bottom: 0px;
-	}
-	.checkin .warningProgress-done {
-		width: 0%;
-	}
-	.toolate .warningProgress-done {
-		width: 50%;
-		left: 0px;
-	}
-	.tooearly .warningProgress-done {
-		width: 50%;
-		right: 0px;
-	}
-	.crunk .warningProgress-done {
-		width: 100%;
-		left: 0px;
-	}
-	.top-font {
-		font-size: 12px;
-		color: #000;
-	}
-	.red {
-		font-size: 12px;
-		color: #f00;
-	}
-	.checkin .red {
-		color: #010101;
-	}
-	.bottom-div {
-		/*bottom: 40px !important;*/
-	}
-	#ascrail2001 {
-		margin-top: -4px;
-	}
-	.bjbox:last-child {
-		margin-bottom: 70px;
-	}
-	.scrollbar:last-child {
-		/*margin-bottom: 1rem;*/
-	}
-</style>
-<script type="text/javascript">
-window.onunload = function(){
-	var twin = wd.display.getwdDialogOpener();
-	$(twin.document).find("li[bjlb=5011] .icon-schedule").trigger("click");//触发外层的刷新
-}
-function refreshHomePluginRjkcb(){
-	var twin = wd.display.getwdDialogOpener();
-	$(twin.document).find("li[bjlb=5011] .icon-schedule").trigger("click");//触发外层的刷新
-	wd.display.closeDialog();
-}
-</script>
-</head>
-<body>
-<%-- 改。Lin
-<in@put name="kcbid" type="hidden" value="${kcb.kcbid}" /> --%>
-<input name="bjid" type="hidden" value="${bjid}" />
-<div class="search-div hLine" style="position: sticky;background: #fff;top: 0;z-index: 99999;">
-	<div style="padding: 15px 25px 12px 25px;">
-		<div style="height: 20px;display: inline-block;vertical-align: middle;position: relative;text-indent: 5px;margin-right:20px;" class="top-font">
-			出勤:<span class="zc">${later==0?'-':(pmtDataSize - kqtj.kk - kqtj.cd - kqtj.zt -kqtj.qj)}</span>
-			<div class="warningProgress-div" style="width: 34px;bottom: 0px;left: 12px;">
-				<div class="warningProgress-done" style="width: 0%;right: 0px;"></div>
-			</div>
-		</div>
-		<div style="height: 20px;display: inline-block;vertical-align: middle;position: relative;text-indent: 5px;margin-right:20px;" class="top-font">
-			旷课:<span class="kk">${later==0?'-':kqtj.kk}</span>
-			<div class="warningProgress-div" style="width: 34px;bottom: 0px;left: 12px;">
-				<div class="warningProgress-done" style="width: 100%;left: 0px;"></div>
-			</div>
-		</div>
-		<div style="height: 20px;display: inline-block;vertical-align: middle;position: relative;text-indent: 5px;margin-right:20px;" class="top-font">
-			迟到:<span class="cd">${later==0?'-':kqtj.cd}</span>
-			<div class="warningProgress-div" style="width: 34px;bottom: 0px;left: 12px;">
-				<div class="warningProgress-done" style="width: 50%;left: 0px;"></div>
-			</div>
-		</div>
-		<div style="height: 20px;display: inline-block;vertical-align: middle;position: relative;text-indent: 5px;margin-right:20px;" class="top-font">
-			早退:<span class="zt">${later==0?'-':kqtj.zt}</span>
-			<div class="warningProgress-div" style="width: 34px;bottom: 0px;left: 12px;">
-				<div class="warningProgress-done" style="width: 50%;right: 0px;"></div>
-			</div>
-		</div>
-		<div style="height: 20px;display: inline-block;vertical-align: middle;position: relative;text-indent: 5px;margin-right:20px;" class="top-font">
-			请假:<span class="qj">${kqtj.qj}</span>
-			<div class="warningProgress-div" style="width: 34px;bottom: 0px;left: 12px;">
-				<div class="progress-done" style="width: 100%;right: 0px;height: 3px"></div>
-			</div>
-		</div>
-
-		<input type="button" id="rjkcb_qq" class="content-onButton" style="float: right;margin-right: -12px;display:none;" value="全勤">
-		<equal.ss val="${later==0}" val2="false">
-			<script>
-				$("#rjkcb_qq").css("display","");
-				var yczs=${kqtj.kk + kqtj.cd + kqtj.zt + kqtj.qj}
-				if(yczs==0){
-					$("#rjkcb_qq").removeClass("content-offButton").addClass("content-onButton");
-				}else{
-					$("#rjkcb_qq").removeClass("content-onButton").addClass("content-offButton");
-				}
-			</script>
-		</equal.ss>
-	</div>
-	<equal.ss val="${later==0}" val2="true">
-		<script>
-			function isQQ() {	// 全勤。Lin
-				$.ajax({
-					url: '@service{name:"homePluginRjkcb_dm_qqdm"}@',
-					data: {
-						kcbid: kcbid
-					},
-					dataType: "json",
-					type: "post",
-					success: function(result) {
-						if (result.success) {
-							$(".cd").text(0);
-							$(".zt").text(0);
-							$(".kk").text(0);
-							var rs = $('#pmtDataSize').val();
-							$(".zc").text(rs);
-							$("#rjkcbDiv").remove();
-							$("#rjkcb_qq").css("display","");
-							$("#rjkcb_qq").removeClass("content-offButton").addClass("content-onButton");
-						}
-					}
-				})
-			}
-
-			function tsj() {	// 同上节。Lin
-				$.ajax({
-					url: '@service{name:"homePluginRjkcb_dm_tsj"}@',
-					data: {
-						kcbid: kcbid
-					},
-					dataType: "json",
-					type: "post",
-					success: function(result) {
-						if (result.success) {
-							location.reload();
-							$("#rjkcbDiv").remove();
-						}
-					}
-				})
-			}
-		</script>
-
-		<div id="rjkcbDiv" style="float: right;margin-right: 10px;">
-			<input type="button" id="rjkcb_qd" onclick="isQQ()" class="content-button" value="全到">
-			<equal.ss val="${hasSjdm==1}" val2="true">
-				<input type="button" id="rjkcb_tsj" onclick="tsj()" class="content-button" value="同上节">
-			</equal.ss>
-		</div>
-	</equal.ss>
-</div>
-
-<input type="hidden" id="pmtDataSize" value='${pmtDataSize}' />
-<div class="plugin-component-div">
-	<div id="sybjBody" class="scrollbar" style="height: calc(100% - 111px)!important;width: 100%;box-sizing: border-box;padding: 0 10px;margin-top:10px;">
-		<equal.ss val="${empty pmtid }" val2="false">
-			<div style="overflow: auto;height: 500px;margin-bottom: 26px;" class="scrollbar">
-<%-- 改。Lin
-				<input type="hidden" id="changestateUrl" value='@service{name:"homePluginRjkcb_dm_qhzt"}@' /> --%>
-				<input type="hidden" id="changestateUrl" value="<serv.ss name='kqjl_swState'/>"/>
-				<input type="hidden" name="pmtid" value='${pmtid}' />
-				<input type="hidden" name="pmtdata" value='${pmtData}' />
-				<div id="pmtEdit" class="scrollbar" style='border: 1px solid #E4E4E4;position: absolute;height: 425px;width: calc(100% - 20px);margin-left:10px;overflow: auto;'>
-				</div>
-				<form.ss name="pmt"/>
-			</div>
-		</equal.ss>
-		<equal.ss val="${empty pmtid }" val2="true">
-			<rpt.ss name="bjList" id="bjItem">
-				<div style="overflow: auto;height: auto;margin-bottom: 26px;display: grid;" class="scrollbar bjbox">
-					<div id="bt" class="plugin-title hLine-highlightBlod" style="margin-bottom: 5px;">
-						<span style="vertical-align: middle;margin-left: 15px;">${bjItem[0].bjmc}  班级人数:${bjItem[0].size}人</span>
-					</div>
-					<div style="padding-left:36px;">
-						<rpt.ss name="${bjItem}" id="item">
-							<equal.ss val="${item.rcid &gt; 0}" val2="true">
-								<div name="kqjl" kqjlid="${item.kqjlid eq 0? '' : item.kqjlid}" kqlbm="${item.kqlbm}" rcid="${item.rcid}"
-										xyid="${item.xyid}" jlztm="${item.jlztm}" class='toolate wd leave' style="border-radius:0;width: 240px;height: 84px;display: flex;margin-bottom: 5px;margin-top: 0px;float:left;;padding:0 6px 6px 6px">
-									<div class="rightBar" style="background:rgb(108,158,215)">
-									</div>
-									<equal.ss val="${empty item.zpwj}" val2="true">
-										<div style="box-sizing: border-box;width:auto;height:82px;padding-top: 6px;">
-											<img style="border-bottom:none;margin-bottom: 0px;width:auto;height:auto;max-width: 100%;max-height: 100%" border=0 src="${sessionScope.ssUser.skinDir}image/default-photo.png" /> <%-- ="$@{sessionScope['wd.yh'].pflj}。Lin --%>
-										</div>
-									</equal.ss>
-									<equal.ss val="${empty item.zpwj}" val2="false">
-										<div style="box-sizing: border-box;padding-top: 6px;width:60px;height:82px;display: flex;align-items: center;justify-content: center;">
-<%-- 改。Lin
-											<img style="border-bottom:none;margin-bottom: 0px;width:auto;height:auto;max-width: 100%;max-height: 100%" border=0 src="@service{name:'getData',param:{path:'${item.zpwj}'}}@" /> --%>
-											<img style="border-bottom:none;margin-bottom: 0px;width:auto;height:auto;max-width: 100%;max-height: 100%" border=0
-													src="<serv.ss name='dlByHttp' parm='{path:"${item.zpwj}"}'/>"/>
-										</div>
-									</equal.ss>
-									<div style="display: flex;flex-direction: column;justify-content: flex-start;align-items: flex-start;margin-left: 6px;">
-										<span class="name longCardList-highlight" style="">${item.xm}</span>
-										<div class="longCardList-dim" id="ms" style="overflow: unset!important;padding-top: 8px;line-height: 16px;width: 182px;font-size:12px;color:#666;font-family:'黑体';">
-											<span>${item.pwxh}</span>
-											<br />
-											<span>${item.xyh}</span>
-											<span class="longCardList" style="display: flex;margin-top: 9px;">
-												<span class="red">请假</span>
-											</span>
-										</div>
-									</div>
-								</div>
-							</equal.ss>
-							<equal.ss val="${item.rcid == 0}" val2="true">
-								<div name="kqjl" kqjlid="${item.kqjlid eq 0? '' : item.kqjlid }" kqlbm="${item.kqlbm }" rcid="${item.rcid }"
-										xyid="${item.ryid}" xyxm="${item.xm}" jlztm="${item.jlztm}" onclick="xy_dm_lr(this)" <%-- 增加 xyxm,BzrDmServ.swStateByA() 不用再取。Lin --%>
-										class='
-											<equal.ss val="${item.kqlbm==81 &amp;&amp; item.rcid==0}" val2="true">
-												checkin  wd
-											</equal.ss>
-											<equal.ss val="${item.kqlbm==11 &amp;&amp; item.rcid==0}" val2="true">
-												toolate  wd
-											</equal.ss>
-											<equal.ss val="${item.kqlbm==21 &amp;&amp; item.rcid==0}" val2="true">
-												tooearly wd
-											</equal.ss>
-											<equal.ss val="${item.kqlbm==1 &amp;&amp; item.rcid==0}" val2="true">
-												crunk wd
-											</equal.ss>
-										'
-										style="border-radius:0;width: 240px;height: 84px;display: flex;margin-bottom: 5px;margin-top: 0px;float: none;padding:0 6px 6px 6px;float: left;">
-									<div class="rightBar">
-										<div class="rightBar-xdiv"></div>
-									</div>
-									<equal.ss val="${empty item.zpwj}" val2="true">
-										<div style="box-sizing: border-box;width:auto;height:82px;padding-top: 6px;">
-											<img style="border-bottom:none;margin-bottom: 0px;width:auto;height:auto;max-width: 100%;max-height: 100%" border=0 src='${sessionScope.ssUser.skinDir}image/default-photo.png' /> <%-- ='$@{sessionScope["wd.yh"].pflj}。Lin --%>
-										</div>
-									</equal.ss>
-									<equal.ss val="${empty item.zpwj}" val2="false">
-										<div style="box-sizing: border-box;padding-top: 6px;width:60px;height:82px;display: flex;align-items: center;justify-content: center;">
-<%-- 改。Lin
-											<img style="border-bottom:none;margin-bottom: 0px;width:auto;height:auto;max-width: 100%;max-height: 100%" border=0 src="@service{name:'getData',param:{path:'${item.zpwj}'}}@" /> --%>
-											<img style="border-bottom:none;margin-bottom: 0px;width:auto;height:auto;max-width: 100%;max-height: 100%" border=0
-													src="<serv.ss name='dlByHttp' parm='{path:"${item.zpwj}"}'/>"/>
-										</div>
-									</equal.ss>
-									<div style="display: flex;flex-direction: column;justify-content: flex-start;align-items: flex-start;margin-left: 6px;">
-										<span class="name longCardList-highlight" style="">${item.xm}</span>
-										<div class="longCardList-dim" id="ms" style="overflow: unset!important;padding-top: 8px;line-height: 16px;width: 182px;font-size:12px;color:#666;font-family:'黑体';">
-											<span>${item.pwxh}</span>
-											<br />
-											<span>${item.xyh}</span>
-											<span class="longCardList" style="display: flex;margin-top: 9px;">
-												<span class="itemZt red" id="zt">
-													<equal.ss val="${item.kqlbm == 81}" val2="true">
-														出勤
-													</equal.ss>
-													<equal.ss val="${item.kqlbm == 11}" val2="true">
-														迟到
-													</equal.ss>
-													<equal.ss val="${item.kqlbm == 21}" val2="true">
-														早退
-													</equal.ss>
-													<equal.ss val="${item.kqlbm == 1}" val2="true">
-														旷课
-													</equal.ss>
-												</span>
-											</span>
-										</div>
-									</div>
-								</div>
-							</equal.ss>
-						</rpt.ss>
-					</div>
-				</div>
-			</rpt.ss>
-		</equal.ss>
-	</div>
-</div>
-<div class="bottom-div">
-	<div class="bottom-down-div">
-		<equal.ss val="${empty dataType}" val2="true">
-			<input class="bottom-button" type="button" value="关闭" onclick="refreshHomePluginRjkcb()">
-		</equal.ss>
-	</div>
-</div>
-</body>
-<style>
-	/* 顶掉样式表line-height */
-	.longCardList-highlight {
-		line-height: 29px;
-	}
-	.wd {
-		width: 150px;
-		height: 150px;
-		border-radius: 15px;
-		margin: 5px;
-		overflow-x: hidden;
-		overflow: auto;
-		float: left;
-		border: 1px solid #E4E4E5;
-		font-size: 14px;
-		position: relative;
-		background-color: #fff;
-	}
-	.wd img {
-		max-width: 100%;
-		width: 100%;
-		height: 100px;
-		border-bottom: 1px solid #e4e4e4;
-		margin-bottom: 15px;
-	}
-	.wraper img {
-		width: 80px;
-		height: 90px;
-		margin-left: 10px;
-	}
-	.bottomDiv {
-		width: 100%;
-		height: 20px;
-		line-height: 20px;
-		position: absolute;
-		bottom: 0;
-		font-size: 12px;
-		overflow: hidden;
-	}
-	.bottomDiv .num {
-		display: inline-block;
-		width: 20px;
-		text-align: center;
-		background: #999;
-		padding: 0;
-		color: #fff;
-		line-height: 20px;
-		height: 20px;
-	}
-	.rightBar {
-		width: 15px;
-		height: 100%;
-		position: absolute;
-		right: 0px;
-		background: #e1e1e1;
-	}
-	.rightBar-xdiv {
-		width: 100%;
-		position: absolute;
-		background-color: #f00;
-	}
-	.checkin .rightBar .rightBar-xdiv {
-		display: none
-	}
-	.crunk .rightBar .rightBar-xdiv {
-		height: 100%;
-	}
-	.toolate .rightBar .rightBar-xdiv {
-		height: 50%;
-		top: 0px;
-	}
-	.tooearly .rightBar .rightBar-xdiv {
-		height: 50%;
-		bottom: 0;
-	}
-</style>
-
-<equal.ss val='${dataType=="play"}' val2="false">
-	<script>
-		var kcbid = "${kcbid}";
-		var bdm = "${bdm}";
-		var lskcbid = "${lskcbid==null?kcbid:lskcbid}";
-
-		//jlztm为1时 或不存在考情记录
-		function xy_homePluginRjkcb_dm_qhzt(_obj) {
-			var kqjlid = $(_obj).attr("kqjlid");
-			var kqlbm = getQhKqlbm(_obj);
-			var xyid = $(_obj).attr("xyid");
-			var xyxm = $(_obj).attr("xyxm");	// 增加,BzrDmServ.swStateByA() 不用再取。Lin --%>
-			ajaxqhzt(_obj, kqjlid, kqlbm, xyid, xyxm);	// 增加 xyxm,BzrDmServ.swStateByA() 不用再取。Lin --%>
-		}
-
-		function onOrOffQq(kqtj) {
-			var yczs = kqtj.kk + kqtj.cd + kqtj.zt + Number($(".qj").text());
-			if (yczs > 0) {
-				$("#rjkcb_qq").removeClass("content-onButton").addClass("content-offButton");
-			} else {
-				$("#rjkcb_qq").removeClass("content-offButton").addClass("content-onButton");
-			}
-		}
-
-		function ajaxqhzt(_obj, kqjlid, kqlbm, xyid, xyxm) {	// 增加 xyxm,BzrDmServ.swStateByA() 不用再取。Lin --%>
-/* 改。Lin
-			var qhztUrl = '@service{name:"homePluginRjkcb_dm_qhzt"}@';
-*/		var qhztUrl = "<serv.ss name='kqjl_swState'/>";
-			$.ajax({
-				url: qhztUrl,
-				type: "POST",
-				data: {
-					kcbid: kcbid,
-					kqjlid: kqjlid,
-					kqlbm: kqlbm,
-					ryid: xyid,
-					xyxm: xyxm,	// 增加,BzrDmServ.swStateByA() 不用再取。Lin --%>
-					aa: 1,
-					lskcbid: lskcbid,
-					bdm: bdm,
-/// 增加,改为 班主任点名(半天点名)。Lin
-					bjid: ${bjid},
-					jkssj: '${jkssj}',
-					jjssj: '${jjssj}'
-///
-				},
-				dataType: "json",
-				async: true,
-				success: function(result) {
-					console.log("==aaa===:" + result.msg);
-					if (result.msg) {
-						onOrOffQq(result.kqjl);
-						if (result.kqjlid) {
-							$(_obj).attr("kqjlid", result.kqjlid);
-						}
-						if (result.del) {
-							$(_obj).attr("kqjlid", "");
-						}
-						$(".search-div").find(".cd").text(result.kqjl.cd);
-						$(".search-div").find(".zt").text(result.kqjl.zt);
-						$(".search-div").find(".kk").text(result.kqjl.kk);
-						//
-						var rs = $('#pmtDataSize').val();
-						var qj = $('.qj').text();
-						var zc = rs - result.kqjl.cd - result.kqjl.zt - result.kqjl.kk - qj;
-
-						$(".search-div").find(".zc").text(zc);
-						//
-						qhzt(_obj, kqlbm);
-						$("#rjkcbDiv").remove();
-					}
-					if (window.parent.isExist) {
-						window.parent.isExist(kcbid, false);
-					}
-				}
-			});
-		}
-
-		//pmt切换状态
-		function pmt_qhzt(cell) {
-			var dom = cell._dom;
-			var rcid = $(dom).children(".bottomDiv").attr("rcid");
-			if (rcid != 0) {
-				return;
-			}
-			if (cell.data) {
-				var objectState = parseInt(cell.objectState);
-				console.log(typeof objectState);
-
-				//正常-缺勤-迟到-早退
-				switch (objectState) {
-					case 81:
-						cell.objectState = 1 //正常->缺勤
-							break;
-					case 1:
-						cell.objectState = 11 //缺勤->迟到
-							break;
-					case 11:
-						cell.objectState = 21 //迟到->早退
-						break;
-					case 21:
-						cell.objectState = 81 //早退->正常
-							break;
-				}
-
-				var qhztUrl = document.querySelector("#changestateUrl").value;
-				$.ajax({
-					url: qhztUrl,
-					type: "POST",
-					data: {
-						kqjlid: cell.data.kqjlid,
-						kqlbm: cell.objectState,
-						ryid: cell.data.ryid,
-						kcbid: kcbid,
-						bb: 2,
-						bdm: bdm
-					},
-					dataType: "json",
-					async: true,
-					success: function(result) {
-						console.log("??????===" + result.msg);
-						if (result.msg) {
-							onOrOffQq(result.kqjl);
-							if (result.kqjlid) {
-								cell.data.kqjlid = result.kqjlid;
-							}
-							if (result.del) {
-								cell.data.kqjlid = "";
-							}
-							wd.form.pmt.refresh();
-
-
-
-							$(".cd").text(result.kqjl.cd);
-							$(".zt").text(result.kqjl.zt);
-							$(".kk").text(result.kqjl.kk);
-							var rs = $('#pmtDataSize').val();
-							var qj = $(".qj").text();
-
-							var zc = rs - result.kqjl.cd - result.kqjl.zt - result.kqjl.kk - qj;
-							$(".zc").text(zc);
-							console.log(result.kqjl)
-							$("#rjkcbDiv").remove();
-						}
-						if (window.parent.isExist) {
-							window.parent.isExist(kcbid, false);
-						}
-					}
-				});
-			}
-		}
-
-		//获取切换的类别
-		function getQhKqlbm(_obj) {
-			var kqlbm = parseInt($(_obj).attr("kqlbm"));
-			//正常-缺勤-迟到-早退
-			switch (kqlbm) {
-				case 81:
-					return 1 //正常->缺勤
-				case 11:
-					return 21 //迟到->早退
-				case 21:
-					return 81 //早退->正常
-				case 1:
-					return 11 //缺勤->迟到
-			}
-		}
-
-		function qhzt(_obj, kqlbm) {
-			$(_obj).removeClass();
-			switch (parseInt(kqlbm)) {
-				case 81:
-					$(_obj).addClass("checkin wd");
-					$(_obj).find('.itemZt').text('出勤');
-					break;
-				case 11:
-					$(_obj).addClass("toolate wd"); //迟到
-					$(_obj).find('.itemZt').text('迟到');
-					break;
-				case 21:
-					$(_obj).addClass("tooearly wd"); //早退
-					$(_obj).find('.itemZt').text('早退');
-					break;
-				case 1:
-					$(_obj).addClass("crunk wd"); // 旷课
-					$(_obj).find('.itemZt').text('旷课');
-					break;
-			}
-			$(_obj).attr("kqlbm", kqlbm);
-		}
-	</script>
-</equal.ss>
-
-<script>
-	function wdAlert(msg) {
-		var json = {};
-		json["msg"] = encodeURI(msg);
-		var url = '@service{dest:"sys_alert",show:"wdDialog",param: {"msg":"wdVal{msg}"}}@';
-		evalUrl(url, json);
-	}
-
-	function wdInfo(msg) {
-		var json = {};
-		json["msg"] = encodeURI(msg);
-		var url = '@service{dest:"sys_info",show:"wdDialog",param: {"msg":"wdVal{msg}"}}@';
-		evalUrl(url, json);
-	}
-
-	function evalUrl(url, json) {
-		url = wd.display.replaceDynamicParam(url, json);
-		eval(url, json);
-	}
-
-	function notNull(str) {
-		if (str != null && str != undefined && str != "") {
-			return true;
-		}
-		return false;
-	}
-
-	// 没平面图的切换
-	function xy_dm_lr(_obj) {
-		if (xy_homePluginRjkcb_dm_qhzt) {
-			var jlztm = $(_obj).attr("jlztm");
-			xy_homePluginRjkcb_dm_qhzt(_obj);
-		}
-	}
-
-	//有平面图的切换
-	wd.form.pmt.cellClass = {
-		objectState: {
-			"81": "checkin iconList-boxDiv", //正常
-			"11": "toolate iconList-boxDiv",
-			"21": "tooearly iconList-boxDiv",
-			"1": "crunk iconList-boxDiv"
-		}
-	}
-
-	wd.form.pmt.leftClick = function(cell) {
-		if (pmt_qhzt) {
-			var jlztm = cell.data.jlztm;
-			pmt_qhzt(cell);
-		}
-	}
-
-	wd.form.pmt.loadFinish = function() {
-		console.log("这是点名的log!!!!!!!!!!!!!!!!");
-		var $div = $("#pmtEdit").find("div");
-		$div.addClass('iconList-boxDiv');
-		var $data = $("input[name='pmtdata']").val();
-
-		var json = JSON.parse($data);
-		var qj = 0;
-		for (var i = 0; i < json.length; i++) {
-			if (json[i].rcid != 0) {
-				qj++
-			};
-			var image = json[i].image;
-			var hl = json[i].lineNum + '_' + json[i].columnNum;
-			if (!image) {
-				image = '${sessionScope.ssUser.skinDir}image/default-photo.png';	// = '$@{sessionScope["wd.yh"].pflj}。Lin
-			} else {
-				image = "/service?wdService=getData&path=" + encodeURIComponent(image);
-			}
-			console.log(image);
-			var width = $("[hl='" + hl + "']").width();
-			if (json[i].rcid == 0) {
-				$("[hl='" + hl + "']").empty().append(
-					'<img style="max-height:calc(100% - 26px);height:auto;width:auto;max-width:calc(100% - 2px);display:block;margin:0 auto;margin-top:5px;" src="' +
-					image + '" width="' + width +
-					'"><div class="bottomDiv" rcid="' + json[i].rcid +
-					'"><span class="className" style="display:inline-block;text-align:center;line-height:15px;width:100%;">' +
-					json[i].text +
-					'</span><div class="warningProgress-div"><div class="warningProgress-done"></div></div></div>');
-			} else {
-				$("[hl='" + hl + "']").empty().append(
-					'<img style="max-height:calc(100% - 26px);height:auto;width:auto;max-width:calc(100% - 2px);display:block;margin:0 auto;margin-top:5px;" src="' +
-					image + '" width="' + width +
-					'"><div class="bottomDiv" rcid="' + json[i].rcid +
-					'"><span class="className" style="display:inline-block;text-align:center;line-height:15px;width:100%;">' +
-					json[i].text +
-					'</span><div class="warningProgress-div" style="background:rgb(108,158,215)"></div></div>');
-			}
-		}
-		$('.qj').text(qj);
-	}
-
-	//wd.form.pmt.loadFinish();
-
-	initShake();
-	// 抖动
-	function initShake() {
-		var rector = 16
-		///////DONE EDITTING///////////
-		var stopit = 0
-		var a = 1
-
-		function init(which) {
-			stopit = 0;
-			shake = which;
-			shake.style.left = 0;
-			shake.style.top = 0;
-			shake.style.position = "relative";
-			// alert("init")
-		}
-
-		function rattleimage() {
-			// alert("rattleimage")
-			if ((!document.all && !document.getElementById) || stopit == 1)
-				return
-			if (a == 1) {
-				shake.style.left = parseInt(shake.style.left) + rector
-			} else if (a == 2) {
-				shake.style.left = 0
-			} else if (a == 3) {
-				shake.style.left = parseInt(shake.style.left) - rector
-			} else if (a == 4) {
-				shake.style.left = 0
-			} else if (a == 5) {
-				shake.style.left = parseInt(shake.style.left) + rector / 2
-			} else if (a == 6) {
-				shake.style.left = 0
-			} else if (a == 7) {
-				shake.style.left = parseInt(shake.style.left) - rector / 2
-			} else if (a == 8) {
-				shake.style.left = 0
-			}
-			console.log(a, parseInt(shake.style.left))
-			if (a < 8) {
-				a++
-			} else {
-				a = 1
-			}
-			setTimeout(rattleimage, 65)
-		}
-
-		function stoprattle(which) {
-			a = 1
-			stopit = 1
-			which.style.left = 0
-			which.style.top = 0
-		}
-
-		$(document).on('click', ".leave", function() {
-			init(this);
-			rattleimage();
-			setTimeout(() => {
-				stoprattle(this)
-			}, 500)
-		})
-	}
-
-	function aa(a) {
-		$(window.parent.document.body).find('iframe').eq(0).attr('src', a)
-	}
-</script>
-</html>

+ 0 - 338
alf/mp_excelRcXcdjl_edit.ss.jsp

@@ -1,338 +0,0 @@
-<html>
-<head>
-<style type="text/css">
-.left-div, .right-div {
-	float: left;
-	/*width: 48%;*/
-	height: 94%;
-	box-sizing: border-box;
-	position: relative;
-}
-.left-div {
-	width: 37%;
-}
-.right-div {
-	width: 62.7%;
-}
-table.list {
-	margin-left: 0px !important;
-}
-table.list th{
-	 /*   width: 158px;*/
-}
-table.list td{
-	/* width: 158px;*/
-}
-.list-div tr {
-	border-bottom: 1px solid #e4e4e4;
-	background-color: #f0f0f0;
-}
-.list-div tr:hover {
-	border-bottom: 1px solid #e4e4e4;
-	background-color: #c7e3fc;
-}
-.list tr:nth-child(even):hover {
-	background-color:#c7e3fc;
-}
-.list-div td {
-	/*max-width: 140px !important;*/
-	padding: 0px 12px 0px 12px !important;
-}
-.list-div th {
-	padding: 0px 12px 0px 12px !important;
-}
-.left-button {
-	width: 100%;
-	float: left;
-	text-align: center;
-	position: absolute;
-	bottom: 0;
-}
-.left-div {
-	margin-right: 1px;
-}
-.times {
-	width: 80px !important;
-}
-.form-text {
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-}
-.cjfs {
-	width: 60px !important;
-}
-.list tr td {
-	padding-right: 28px;
-}
-input::-webkit-outer-spin-button, input::-webkit-inner-spin-button {
-	-webkit-appearance: none;
-}
-input[type="text"] {
-	-moz-appearance: textfield;
-	width: 65px;
-	text-align: right;
-}
-.content-div {
-	padding-right:15px!important;
-}
-.xylist {
-	display: block;
-	height: 630px;
-	overflow-y: auto;
-}
-.list tr{
-	display: table;
-	width: 100%;
-	table-layout: fixed;
-}
-.list-highlight {
-	color: #2b368f!important;
-	font-size: 14px!important;
-}
-</style>
-<script type="text/javascript">
-	console.log("start!!!");
-	window.onload = function () {	// 加载数据服务,统一为 ByA。Lin
-		loadXsCj();
-	}
-
-	function loadXsCj(e){
-console.log("loadXsCj");
-		var rcid = ${rcid};
-		$.ajax({
-			url : "<serv.ss name='rcXcdjl_initZxxzEdit'/>",
-			type : 'post',
-			async : false,
-			dataType: "json",	// 增加。Lin
-			data : {
-				'rcid' : rcid
-			},
-			success : function(result) {
-/* 改。Lin
- * 增加 dataType: "json", 了
- * 只有一组数据
-				var data = eval("(" + result + ")");
-				//学员信息
-				var stuData = data.stulist;
-*/			var stuData = result;
-//			var stuStr = "";	// 去掉,没用到。Lin
-				var jlztmBoolean=true;
-				for (var i in stuData) {
-					console.log(stuData[i]);
-					var stu = stuData[i];
-					var str = "";
-					if(stu.jlztm && stu.jlztm == 51){//加灰色样式
-						str += "<tr class='filter'>";
-					}else{//不加
-						str += "<tr>";
-					}
-					str += "<input type='hidden' value='" + stu.xcdid + "' name='xcdid' />";
-					str += "<input type='hidden' value='";
-					if ("xcdjlid" in stu)
-						str += stu.xcdjlid;
-					else
-						str += "null";
-					str += "' name='xcdjlid' />";	// + stu.ryid + "' name='xyid' />"。Lin
-					str += "<td style='width:85px;' class='list-highlight'>" + stu.xcdmc + "</td>";	// + stu.xm +。Lin
-					var jyfs="";
-					if(stu.jlztm==51){
-						jyfs=" readonly='true' ";
-					}
-					// 情况描述。Lin
-					str += "<td style='width:120px;text-align: right;'>" +
-							"<input "+ jyfs +" type='text' value='"+ stu.qkms +"' name='qkms' tab='tabField'"+
-							" onfocus='keydown_to_tab(this)' onkeypress='if(event.keyCode==13) focusNextInput(this);'/>" +
-							"</td>";
-					// 处理描述。Lin
-					str += "<td style='width:120px;text-align: right;'>" +
-							"<input "+ jyfs +" type='text' value='"+ stu.clms +"' name='clms' tab='tabField'"+
-							" onfocus='keydown_to_tab(this)' onkeypress='if(event.keyCode==13) focusNextInput(this);'/>" +
-							"</td>";
-					// 责任人。Lin
-					str += "<td style='width:50px;text-align: right;'>" +
-							"<input "+ jyfs +" type='text' value='"+ stu.zrr +"' name='zrr' tab='tabField'"+
-							" onfocus='keydown_to_tab(this)' onkeypress='if(event.keyCode==13) focusNextInput(this);'/>" +
-							"</td>";
-					str += "</tr>";
-					$('.xylist').append($(str));
-					if(stu.jlztm==1||!stu.jlztm)
-						jlztmBoolean=false;
-				}
-				//if (stuData[0].jlztm && stuData[0].jlztm != 1) {
-				if(jlztmBoolean){
-					$('.xylist input').attr("disabled", "disabled");
-					$('input[name="save"]').attr('disabled', 'disabled');
-					$('input[name="subm"]').attr('disabled', 'disabled');
-					$('input[name="save"]').css("color", "#aaa");
-					$('input[name="subm"]').css("color", "#aaa");
-				} else {
-					$('input[name="save"]').attr('disabled', false);
-					$('input[name="subm"]').attr('disabled', false);
-					$('input[name="save"]').css("color", "");
-					$('input[name="subm"]').css("color", "");
-				}
-			}
-		});
-	}
-</script>
-</head>
-<body>
-<!-- 查询 -->
-<%-- 再改,点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
-<form action="" name="cjform" method="post"> --%>
-<form action="<serv.ss name='rcXcdjl_submZxxzEdit' dest='info' parm='{requestParentViewObject:"${requestParentViewObject}"}'/>" method="post">
-	<input type="hidden" name="xxx" value="${dataType}" />
-	<input type="hidden" name="rcid" value="${rcid}" />
-	<div class="list-div list-search-div right-div content-div "
-		style="height: 90% overflow-x:hidden; min-height:80%;">
-		<table class="list aa" style=" float:right;width:100%!important;">
-		<thead style="width: 100%">
-			<tr style="border:none;">
-				<th style="padding: 0 0 0 12px;width: 140px;">巡查点</th>
-				<th style="width:85px;">情况描述</th>
-				<th style="width: 275px;">处理描述</th>
-				<th style="width:120px;">责任人</th>
-			</tr>
-		</thead>
-		<tbody ssOddClazz="list-odd" ssEvenClazz="list-even" ssHovClazz="list-hover" class="xylist scrollbar" ssFith="{list:true,rowHeight:35}" >
-			<rpt.ss name="ssList" id="item">
-				<tr class="list-dim" >
-					<td style='width: 205px;'></td>
-					<td></td>
-					<td style='width: 275px;'>
-						<onoff.ss name="qxfs" val="1,2" mode="play" />
-					</td>
-					<td></td>
-					<td></td>
-				</tr>
-			</rpt.ss>
-		</tbody>
-		</table>
-	</div>
-	<div class="bottom-div">
-		<equal.ss val='${dataType=="play"}' val2="false">
-			<div class="bottom-down-div">
-<%-- 改,二级对象的保存就是提交,新的提交只是放到二级对象草稿箱(不需要确认)。Lin
-				<in@put type="button" name="save" value="保存" class="bottom-button"
-						onclick="submitForm(1);" style="display: inline-block !important;">
-		 再改,解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=
-		 直接用标准的 <form 的提交。直接写到 <form action= 里
-				<in@put type="button" name="save" value="保存" class="bottom-button"
-						onclick="submitForm();" style="display: inline-block !important;"> --%>
-				<input type="submit" value="保存" class="bottom-button"/>
-<%-- 去掉,界面上(业务上),二级对象没有提交 -- 二级对象的保存就是提交。Lin
-				<in@put type="button" name="subm"  value="提交" class="bottom-button"
-						onclick="tjConfirm();" style="display: inline-block !important;">
---%>
-				<input type="button" value="取消" class="bottom-button"
-						onclick="wd.display.closeDialog();">
-			</div>
-		</equal.ss>
-	</div>
-</form>
-
-</body>
-<script type="text/javascript">
-// <%-- 去掉,界面上(业务上),二级对象没有提交 -- 二级对象的保存就是提交。Lin
-// 	function tjConfirm(){
-// 		wd.display.confirm(" ","请确认成绩已全部录完,提交后不能在此页面修改!",function(){submitForm(2)},function(){return;});
-// 	}
-// --%>
-
-// <%-- 改,去掉 type,只有一个提交了 -- 二级对象的保存就是提交,新的提交只是放到二级对象草稿箱(不需要确认)。Lin
-// 	function submitForm(type) { --%>
-// <%-- 再去掉,直接写到 <form action= 里 -- 解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
-// 	function submitForm() {
-// 		//若是 保存更新,就不提交表单
-// 		var f = $('form[name="cjform"]');
-// --%>
-// <%-- 去掉,去掉 type,只有一个提交了 -- 二级对象的保存就是提交,新的提交只是放到二级对象草稿箱(不需要确认)。Lin
-// 		if (type == 1) {
-// 			$.ajax({
-// 				url : "<serv.ss name='rcXcdjl_submZxxzEdit'/>",	// :"m_xy_gl_djcj_bc"。Lin
-// 				type : "post",
-// 				data : f.serialize(),
-// 				beforeSend : function(result) {
-// 					//将 保存 提交按钮改为 不可用
-// 					$('input[name="save"]').attr('disabled', 'disabled');
-// 					$('input[name="subm"]').attr('disabled', 'disabled');
-// 					$('input[name="save"]').css("color", "#aaa");
-// 					$('input[name="subm"]').css("color", "#aaa");
-// 				},
-// 				success : function(result) {
-// 					var data = eval("(" + result + ")");
-// 					if (data.result)
-// 							//eval('@service{dest:"sys_info",show:"wdDialog",param:{"msg":"保存成功"}}@');
-// 						wd.display.alert("保存成功");
-// 					else
-// 							//eval('@service{dest:"sys_info",show:"wdDialog",param:{"msg":"保存失败"}}@');
-// 						wd.display.alert("保存失败");
-// 				},
-// 				error : function(result) {
-// 					//eval('@service{dest:"sys_info",show:"wdDialog",param:{"msg":"保存失败"}}@');
-// 					wd.display.alert("保存失败");
-// 				},
-// 				complete : function(result) {
-// 					afterSelectPlan(1);
-// 					/*$('input[name="save"]').attr('disabled', false);
-// 					$('input[name="subm"]').attr('disabled', false);
-// 					$('input[name="save"]').css("color", "#015a31");
-// 					$('input[name="subm"]').css("color", "#015a31");*/
-// 				}
-// 			});
-// 		}
-// 		if (type == 2) {
-// --%>
-// <%-- 改,续传变量,BpmU.saveSq( 需要用到 -- 增加写 二级对象草稿箱。Lin
-// 			f.attr('action', '@service{name:"m_xy_gl_djcj_tj",dest:"sys_info"}@'); --%>
-// <%-- 再去掉,直接写到 <form action= 里 -- 解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
-// 			f.attr('action', "<serv.ss name='rcXcdjl_submZxxzEdit' parm='{requestParentViewObject:"${requestParentViewObject}"}'/>");
-// 			f.submit();
-// --%>
-// //	}	// 去掉,去掉 type,只有一个提交了。Lin
-// <%-- 再去掉,直接写到 <form action= 里 -- 解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
-// 	}
-// --%>
-
-	// 回车下一个获取焦点
-	function focusNextInput(thisInput) {
-		var inputs = $("input[tab='tabField']");	// = $("input[name='cjfs']")。Lin
-		for (var i = 0; i < inputs.length; i++) {
-			// 如果是最后一个,则焦点回到第一个
-			if (i == (inputs.length - 1)) {
-				inputs[0].focus(); break;
-			} else if (thisInput == inputs[i]) {
-				inputs[i + 1].focus(); break;
-			}
-		}
-	}
-
-	// 上一个获取焦点
-	function focusUpInput(thisInput) {
-		// console.log(11111);
-		var inputs = $("input[tab='tabField']");	// = $("input[name='cjfs']")。Lin
-		for (var i = 0; i < inputs.length; i++) {
-			// 如果是第一个,则焦点回到最后一个
-			if (thisInput == inputs[i]) {
-				inputs[i - 1].focus(); break;
-			} else if (thisInput == inputs[0]) {
-				inputs[inputs.length - 1].focus(); break;
-			}
-		}
-	}
-
-	function keydown_to_tab($input) { //聚焦
-		// console.log($input)
-		$($input).bind("keydown", function(e) {
-//		var n = $('.cjfs').length;	// 去掉,没用到。Lin
-			// console.log(n,e.keyCode)
-			if (e.keyCode == 40) { //键盘按下
-				focusNextInput($input)
-			} else if (e.keyCode == 38) { //键盘按上
-				focusUpInput($input)
-			}
-		});
-	}
-</script>
-</html>

+ 0 - 5832
alf/ss-components.js

@@ -1,5832 +0,0 @@
-import { ssIcon, commonIcon } from "./icon-config.js";
-import * as IndexComponents from "./ss-index-components.js";
-import * as EchartComponents from "./ss-echarts-compnents.js";
-import { isNum, toStyleStr } from "./tools.js";
-import { EVEN_VAR } from "./EventBus.js";
-
-// import * as elements from "../lib/element-plus.js";
-(function () {
-  const {
-    createApp,
-    ref,
-    reactive,
-    watch,
-    onMounted,
-    onBeforeUnmount,
-    h,
-    computed,
-    resolveComponent,
-    watchEffect,
-    nextTick,
-    onVnodeMounted,
-    Teleport,
-    inject,
-    provide,
-  } = Vue;
-
-  // 弹窗默认遮罩z-index
-  let currentZIndex = 100;
-  //   目前已存在的弹窗
-  const topWindow = window.top;
-  topWindow.dialogInstances = topWindow.dialogInstances || [];
-  // 新建弹窗
-  function createSsDialogInstance(setting, callbackEvent) {
-    currentZIndex += 10; // 动态提升 z-index
-    const container = document.createElement("div");
-    document.body.appendChild(container);
-    const app = Vue.createApp({
-      render() {
-        return h(SsDialog, {
-          ...setting,
-          zIndex: currentZIndex,
-          onClose() {
-            document.body.removeChild(container); // 仅移除弹窗容器
-            const index = topWindow.dialogInstances.indexOf(app);
-            if (index > -1) {
-              topWindow.dialogInstances.splice(index, 1); // 移除实例
-            }
-            // 关闭后的回调
-            if (callbackEvent && typeof callbackEvent === "function") {
-              callbackEvent();
-            }
-            app.unmount(); // 仅卸载弹窗实例
-            if (container.parentNode) {
-              container.parentNode.removeChild(container); // 确保移除容器
-            }
-          },
-        });
-      },
-    });
-    topWindow.dialogInstances.push({ app, callbackEvent, container });
-    app.component("ss-mark", SsMark); // 注册 ss-mark 组件
-    app.component("ss-icon", SsIcon);
-    app.component("ss-full-style-header", SsFullStyleHeader); // 注册 ss-full-style-header 组件
-    app.mount(container);
-  }
-  // ss-breadcrumb 一级菜单页面面包屑
-  const SsBreadcrumb = {
-    name: "SsBreadcrumb",
-    props: {
-      level: {
-        type: Object,
-        default: null,
-      },
-    },
-    setup(props) {
-      const currentMenu = ref(null);
-      const folderPath = ref([]);
-      const eventBus = window.parent.sharedEventBus;
-
-      // 监听页面变化
-      onMounted(() => {
-        // 获取初始页面
-        currentMenu.value = eventBus.getState(EVEN_VAR.currentPage);
-        folderPath.value = eventBus.getState("folderPath") || [];
-
-        // 订阅页面变化
-        eventBus.subscribe(EVEN_VAR.currentPage, (page) => {
-          currentMenu.value = page;
-        });
-        eventBus.subscribe("folderPath", (path) => {
-          folderPath.value = path || [];
-        });
-      });
-      // 修改点击处理函数
-      const handlePathClick = (index) => {
-        if (props.level?.onBack) {
-          // 截取到点击的位置,后面的路径会被销毁
-          const newPath = folderPath.value.slice(0, index + 1);
-          eventBus.publish("folderPath", newPath);
-          // 返回到对应层级
-          const targetFolder = newPath[newPath.length - 1]?.folder || null;
-          props.level.onBack(targetFolder);
-        }
-      };
-      const SsCommonIcon = resolveComponent("SsCommonIcon");
-      return () =>
-          h("div", { class: "bread-crumb" }, [
-            currentMenu.value &&
-            h(
-                "div",
-                {
-                  onClick: () => {
-                    if (props.level?.onBack) {
-                      eventBus.publish("folderPath", []);
-                      props.level.onBack(null); // 返回到根目录
-                    } else {
-                      eventBus.publish(EVEN_VAR.currentPage, currentMenu.value);
-                    }
-                  },
-                },
-                currentMenu.value.label || currentMenu.value.name
-            ),
-
-            ...(folderPath.value || [])
-                .map((folder, index) => [
-                  h(SsCommonIcon, { class: "common-icon-arrow-right" }),
-                  h(
-                      "div",
-                      {
-                        class: "bread-crumb-item",
-                        onClick: () => handlePathClick(index),
-                        style: { cursor: "pointer" },
-                      },
-                      folder.title
-                  ),
-                ])
-                .flat(),
-          ]);
-    },
-  };
-
-  // ss-input form表单的输入
-  const SsInput = {
-    name: "SsInput",
-    inheritAttrs: false, // 不直接继承属性到组件根元素
-    props: {
-      name: {
-        type: String,
-        required: true,
-        default: "",
-      },
-      // 接收 v-model 绑定的值
-      errTip: {
-        type: String,
-      },
-      required: {
-        type: Boolean,
-        default: false,
-      },
-      placeholder: {
-        type: String,
-        default: "请输入",
-      },
-      defaultValue: [String, Number],
-      modelValue: [String, Number],
-    },
-    emits: ["update:modelValue", "input", "blur", "change"], // 允许更新 v-model 绑定的值
-    setup(props, { emit }) {
-      const errMsg = ref("");
-      const inputRef = ref(null);
-      const textareaRef = ref(null);
-      const inputValue = ref(props.modelValue || props.defaultValue || "");
-      const contentFloatingDiv = ref(false); // 控制浮动 DIV 的显示
-
-      const showRequired = computed(() => {
-        // 检查是否有验证规则(通过 window.ssVm 判断)
-        const hasValidationRule = window.ssVm?.validations?.has(props.name);
-
-        if (!hasValidationRule) return false;
-        if (errMsg.value) return true;
-        if (!inputValue.value) return true;
-        return false;
-      });
-
-      const validate = () => {
-        if (window.ssVm) {
-          const result = window.ssVm.validateField(props.name);
-          console.log(result);
-
-          errMsg.value = result.valid ? "" : result.message;
-        }
-      };
-
-      // 使用 watch 监听 props.errTip 和 props.modelValue 的变化
-      watch(
-          () => props.errTip,
-          (newVal) => {
-            errMsg.value = newVal;
-          },
-          { immediate: true }
-      );
-      watch(
-          () => props.modelValue,
-          (newVal) => {
-            inputValue.value = newVal;
-          }
-      );
-
-      // 挂载时的逻辑
-      onMounted(() => {
-        errMsg.value = props.errTip;
-        inputValue.value = props.modelValue || props.defaultValue || "";
-      });
-      // 计算并调整textarea的高度
-      const adjustHeight = () => {
-        nextTick(() => {
-          const textarea = textareaRef.value;
-          if (!textarea) return;
-          // 重置高度以获得正确的scrollHeight
-          textarea.style.height = "auto";
-          // 计算新高度
-          const maxHeight =
-              parseInt(getComputedStyle(textarea).lineHeight, 10) * 5; // 假设lineHeight是单行高度
-          const newHeight = Math.min(textarea.scrollHeight, maxHeight);
-          textarea.style.height = `${newHeight}px`;
-        });
-      };
-      // 定义事件处理函数
-      const onInput = (event) => {
-        const newValue = event.target.value;
-        inputValue.value = newValue;
-        emit("update:modelValue", newValue);
-        validate(); // 输入时验证
-        nextTick(() => {
-          contentFloatingDiv.value =
-              inputRef.value.scrollWidth > inputRef.value.offsetWidth;
-        });
-        adjustHeight();
-      };
-      const onFocus = (event) => {
-        nextTick(() => {
-          contentFloatingDiv.value =
-              inputRef.value.scrollWidth > inputRef.value.offsetWidth;
-        });
-        adjustHeight();
-      };
-
-      // 失去焦点时进行验证
-      const onBlur = (event) => {
-        emit("blur", event.target);
-        validate(); // 失焦时验证
-        nextTick(() => {
-          // 如果焦点不在 input 或 textarea 上,则隐藏浮动 div
-          if (!document.activeElement.classList.contains("input-control")) {
-            contentFloatingDiv.value = false;
-          }
-        });
-      };
-      const onChange = (event) => {
-        inputValue.value = event.target.value || "";
-        emit("change", inputValue.value);
-      };
-      const onMouseover = (event) => {
-        nextTick(() => {
-          // setTimeout(contentFloatingDiv.value = true, 500)
-        });
-      };
-      const onMouseleave = (event) => {
-        // contentFloatingDiv.value = false
-      };
-      return {
-        errMsg,
-        inputValue,
-        showRequired,
-        onInput,
-        onBlur,
-        onChange,
-        onMouseover,
-        onMouseleave,
-        contentFloatingDiv,
-        inputRef,
-        textareaRef,
-        onFocus,
-      };
-    },
-    render() {
-      return h("div", { class: "input" }, [
-        h("div", { class: "input-container" }, [
-          h("div", { class: "input" }, [
-            h("input", {
-              ref: "inputRef",
-              class: "input-control",
-              name: this.name,
-              value: this.inputValue,
-              onInput: this.onInput,
-              onFocus: this.onFocus,
-              onBlur: this.onBlur,
-              onChange: this.onChange,
-              placeholder: this.placeholder,
-              onMouseover: this.onMouseover, // 监听鼠标悬停
-              onMouseleave: this.onMouseleave, // 监听鼠标离开
-              ...this.$attrs,
-              autocomplete: "off",
-            }),
-            // this.showRequired ? h("div", { class: "required" }) : null,
-          ]),
-          this.contentFloatingDiv || ""
-              ? h("div", { class: "floating-div" }, [
-                h("textarea", {
-                  ref: "textareaRef",
-                  class: "input-control",
-                  value: this.inputValue,
-                  onInput: this.onInput,
-                  onBlur: this.onBlur,
-                  onFocus: this.onFocus,
-                  onMouseover: this.onMouseover, // 监听鼠标悬停
-                  onMouseleave: this.onMouseleave, // 监听鼠标离开
-                  autocomplete: "off",
-                  onVnodeMounted: (vnode) => {
-                    vnode.el.focus();
-                  },
-                }),
-              ])
-              : null,
-          // this.errMsg ? h(SsValidate, { errMsg: this.errMsg }) : null,
-        ]),
-      ]);
-    },
-  };
-  // ss-normal-input 登录输入
-  const SsLoginInput = {
-    name: "SsLoginInput",
-    inheritAttrs: false,
-    props: {
-      errTip: {
-        type: String,
-      },
-
-      type: {
-        type: String,
-        default: "text",
-      },
-      required: {
-        type: Boolean,
-        default: false,
-      },
-      placeholder: {
-        type: String,
-        default: "请输入",
-      },
-      name: {
-        type: String,
-        default: "",
-      },
-      defaultValue: [String, Number],
-      modelValue: [String, Number],
-    },
-    emits: ["update:modelValue", "input", "blur", "change"], // 允许更新 v-model 绑定的值
-    setup(props, { emit }) {
-      const errMsg = ref("");
-      const inputRef = ref(null);
-      const textareaRef = ref(null);
-      const inputValue = ref(props.modelValue || props.defaultValue || "");
-
-      // 使用 watch 监听 props.errTip 和 props.modelValue 的变化
-      watch(
-          () => props.errTip,
-          (newVal) => {
-            errMsg.value = newVal;
-          },
-          { immediate: true }
-      );
-      watch(
-          () => props.modelValue,
-          (newVal) => {
-            inputValue.value = newVal;
-          }
-      );
-
-      // 挂载时的逻辑
-      onMounted(() => {
-        errMsg.value = props.errTip;
-        inputValue.value = props.modelValue || props.defaultValue || "";
-      });
-
-      // 定义事件处理函数
-      const onInput = (event) => {
-        const newValue = event.target.value;
-        inputValue.value = newValue;
-        emit("update:modelValue", newValue);
-      };
-      return { inputValue, onInput, inputRef, textareaRef };
-    },
-    render() {
-      return h("div", { class: "input" }, [
-        h("div", { class: "input-container" }, [
-          h("div", { class: "input" }, [
-            h("input", {
-              ref: "inputRef",
-              class: "input-control",
-              name: this.name,
-              value: this.inputValue,
-              onInput: this.onInput,
-              type: this.type,
-              placeholder: this.placeholder,
-              required: this.required,
-              ...this.$attrs,
-              autocomplete: "off",
-            }),
-            this.required ? h("div", { class: "required" }) : null,
-          ]),
-        ]),
-      ]);
-    },
-  };
-  // ss-login-button
-  const SsLoginButton = {
-    name: "SsLoginButton",
-    inheritAttrs: false,
-    props: {
-      class: {
-        type: String,
-        default: "",
-      },
-      text: {
-        type: String,
-        default: "",
-      },
-      type: {
-        type: String,
-        default: "button",
-      },
-    },
-    emits: ["click"],
-    setup(props, { emit }) {
-      // 定义事件处理函数
-      const onClick = (event) => {
-        // 发射一个 'click' 事件,你可以传递所需的参数
-        emit("click", event);
-      };
-
-      return { props, onClick };
-    },
-    render() {
-      const SsIcon = resolveComponent("ss-icon");
-      const SsLoginIcon = resolveComponent("ss-login-icon");
-      return h(
-          "button",
-          { class: "login-button", type: this.type, onClick: this.onClick },
-          [
-            h("span", [h(SsLoginIcon, { class: this.class })]),
-            h("span", {}, this.text),
-          ]
-      );
-    },
-  };
-  // ss-objp 下拉选择
-  const SsObjp = {
-    name: "SsObjp",
-    inheritAttrs: false,
-    props: {
-      filter: {
-        type: String,
-        required: false,
-      },
-      cb: {
-        type: String,
-        required: true,
-      },
-      url: {
-        type: String,
-        required: true,
-      },
-      name: {
-        type: String,
-        required: true,
-      },
-      width: {
-        type: String,
-        default: "100%",
-      },
-      placeholder: {
-        type: String,
-        default: "请选择",
-      },
-      inp: {
-        type: Boolean,
-        default: false,
-      },
-      opt: {
-        type: Array,
-        default: () => [],
-      },
-      errTip: String,
-      defaultValue: [String, Number],
-      modelValue: [String, Number],
-      direction: {
-        type: String,
-        default: "bottom",
-      },
-    },
-    emits: ["update:modelValue", "input", "blur", "change"],
-    setup(props, { emit }) {
-      const canInput = props.inp;
-      const errMsg = Vue.ref(props.errTip);
-      const selectItem = Vue.ref({});
-      let inputText = Vue.ref(""); // 用于存储输入框的文本
-      const popupWinVisible = Vue.ref(false);
-
-      const filteredOptions = Vue.ref(props.opt);
-      const popupDirection = Vue.ref("bottom");
-
-      // const showRequired = Vue.computed(() => {
-      //   const hasValidationRule = window.ssVm?.validations?.has(props.name);
-      //   if (!hasValidationRule) return false;
-      //   if (errMsg.value) return true;
-      //   if (!selectItem.value?.value) return true;
-      //   return false;
-      // });
-
-      const validate = () => {
-        if (window.ssVm) {
-          const result = window.ssVm.validateField(props.name);
-          // console.log("validate", window.ssVm.validateField(props.name));
-          errMsg.value = result.valid ? "" : result.message;
-        }
-      };
-
-      //在objPicker界面,选中value对应的项
-      const updateSelectItem = () => {
-        // console.log(props.opt);
-        const item = props.opt.find((it) => it.value === props.modelValue);
-        if (item) {
-          selectItem.value = item;
-          inputText.value = item.label;
-        } else {
-          selectItem.value = { label: "", value: "" };
-          inputText.value = "";
-        }
-        // validate();
-      };
-
-      Vue.watch(
-          () => props.errTip,
-          (newVal) => {
-            errMsg.value = newVal;
-          }
-      );
-
-      Vue.watch(() => props.modelValue, updateSelectItem, { immediate: true });
-      Vue.watch(
-          () => props.opt,
-          (newVal) => {
-            updateSelectItem();
-            filteredOptions.value = [...newVal];
-            // console.log("filteredOptions", filteredOptions.value);
-          }
-      );
-
-      //初始化objPicker在页面刚打开时的默认值
-      async function initDefaultValue() {
-        try {
-          if (props.url && props.cb && props.modelValue) {
-            const objectPickerParam = { input: props.inp, codebook: props.cb };
-            const objectPickerParamStr = JSON.stringify(objectPickerParam);
-
-            const params = new URLSearchParams();
-            params.append("objectpickerparam", objectPickerParamStr);
-            params.append("objectpickertype", "2");
-            params.append("objectpickervalue", props.modelValue); //需回显的值
-
-            axios
-                .post(props.url, params, {
-                  headers: {
-                    "Content-Type": "application/x-www-form-urlencoded", // 必须手动设置!
-                  },
-                })
-                .then((response) => {
-                  // alert(JSON.stringify(response.data));
-
-                  if ("timeout" == response.data.statusText) {
-                    alert("网络超时!");
-                    return;
-                  }
-
-                  if (response.data.result) {
-                    const keys = Object.keys(response.data.result);
-                    if (keys.length === 1) {
-                      let code = keys[0];
-                      let desc = response.data.result[keys[0]];
-                      if (props.opt)
-                        props.opt.length = 0; //通过修改数组的length属性,直接清空数组元素,内存会被自动释放。这是性能最优的方式
-                      else {
-                        props.opt = [];
-                      }
-                      props.opt.push({ label: desc, value: code });
-                      updateSelectItem();
-
-                      // alert('props.opt:'+JSON.stringify(props.opt));
-                    }
-                  }
-                });
-          }
-        } catch (error) {
-          // callback(null, error.message); // 失败回调,传递错误
-        }
-      }
-
-      // Vue.onMounted(updateSelectItem);
-
-      const doSelectItem = (item) => {
-        emit("update:modelValue", item.value);
-        selectItem.value = item;
-        inputText.value = item.label;
-        hidePopup();
-        nextTick(() => {
-          console.log(item.value + "@@@props.modelValue:" + props.modelValue);
-          validate();
-          if (window.ssVm) {
-            // 遍历所有验证规则,找到依赖当前字段的规则
-            for (const [field, rules] of window.ssVm.validations.entries()) {
-              for (const rule of rules) {
-                if (rule.opt?.relField === props.name) {
-                  // console.log("Found dependent field:", field); // 调试日志
-                  window.ssVm.validateField(field);
-                }
-              }
-            }
-          }
-        });
-      };
-
-      //可录入的objPicker,更新下拉菜单选项
-      async function updateOptionBYInputText(inpTxt) {
-        try {
-          let objectPickerParam;
-          let url = props.url;
-
-          if (props.url && props.cb) {
-            //如果有定义过滤器
-            if (props.filter) {
-              //包含HTML实体的JSON字符串转为JSON对象,如原字符串是{&quot;dwid&quot;:&quot;88&quot;},注意key也必需用单引号包着
-              const decodedString = props.filter.replace(/&quot;/g, '"'); // 转换为: {"dwid":"88"}
-              objectPickerParam = JSON.parse(decodedString); // 转为json对象
-              objectPickerParam["input"] = props.inp;
-              objectPickerParam["codebook"] = props.cb;
-
-              const filterObj = JSON.parse(decodedString); // 转为json对象
-              for (let k in filterObj) {
-                let v = filterObj[k];
-                url += "&" + k + "=" + v;
-              }
-
-              // alert(url);
-            } else {
-              objectPickerParam = { input: props.inp, codebook: props.cb };
-            }
-
-            const objectPickerParamStr = JSON.stringify(objectPickerParam);
-            const params = new URLSearchParams();
-            params.append("objectpickerparam", objectPickerParamStr);
-            params.append("objectpickertype", "1");
-            if (props.inp && props.inp === "true") {
-              params.append("objectpickersearchAll", 0); //只查录入的值
-              params.append("objectpickerinput", inpTxt); //录入的值
-            } else {
-              params.append("objectpickersearchAll", 1);
-            }
-
-            axios
-                .post(url, params, {
-                  headers: {
-                    "Content-Type": "application/x-www-form-urlencoded", // 必须手动设置!
-                  },
-                })
-                .then((response) => {
-                  if ("timeout" == response.data.statusText) {
-                    alert("网络超时!");
-                    return;
-                  }
-
-                  if (response.data.result) {
-                    const keys = Object.keys(response.data.result);
-                    // console.log("params:"+params+"@@response.data:"+JSON.stringify(response.data));
-                    if (keys.length > 0) {
-                      if (props.opt)
-                        props.opt.length = 0; //通过修改数组的length属性,直接清空数组元素,内存会被自动释放。这是性能最优的方式
-                      else {
-                        props.opt = [];
-                      }
-                      for (let k in response.data.result) {
-                        props.opt.push({
-                          label: response.data.result[k],
-                          value: k,
-                        });
-                      }
-
-                      // console.log('###inpTxt:'+inpTxt+';');
-                      if (
-                          props.inp &&
-                          props.inp === "true" &&
-                          inpTxt.length > 0
-                      ) {
-                        //对于可录入的,用已录入的值作过滤
-
-                        filteredOptions.value = props.opt.filter((option) =>
-                            option.label
-                                .toLowerCase()
-                                .includes(inputText.value.toLowerCase())
-                        );
-                        filteredOptions.value.unshift({ label: "", value: "" });
-
-                        // console.log('###做了过滤:'+inputText.value.toLowerCase()+';');
-                      } else {
-                        filteredOptions.value = props.opt;
-                        filteredOptions.value.unshift({ label: "", value: "" });
-                      }
-
-                      if (!popupWinVisible.value) {
-                        popupWinVisible.value = true; // 确保下拉框在输入时打开
-                      }
-
-                      console.log("props.opt11:" + JSON.stringify(props.opt));
-                    }
-                  }
-                });
-          }
-        } catch (error) {
-          // callback(null, error.message); // 失败回调,传递错误
-        }
-      }
-
-      // 计算弹出方向的方法
-      const calculatePopupDirection = () => {
-        // 1. 获取select容器元素
-        const selectEl = document
-            .querySelector(`[name="${props.name}"]`)
-            ?.closest(".select-container");
-        if (!selectEl) return;
-
-        // 2. 获取位置信息
-        const selectRect = selectEl.getBoundingClientRect();
-        const viewportHeight = window.innerHeight;
-
-        // 3. 简单判断:如果下方剩余空间小于300px就向上弹出
-        const spaceBelow = viewportHeight - selectRect.bottom;
-
-        // 调试信息
-        // console.log('空间判断:', {
-        //   elementBottom: selectRect.bottom,
-        //   viewportHeight,
-        //   spaceBelow,
-        //   willPopUp: spaceBelow < 300,
-        //   popupDirection: popupDirection.value
-        // });
-
-        // 4. 设置方向
-        popupDirection.value = spaceBelow < 300 ? "top" : "bottom";
-      };
-
-      //点击下拉菜单的文本区域时,会触发的方法
-      function togglePopup() {
-        //可录入的objPicker,更新下拉菜单选项
-        updateOptionBYInputText(inputText.value);
-        // popupWinVisible.value = !popupWinVisible.value;
-        Vue.nextTick(() => {
-          calculatePopupDirection();
-        });
-      }
-
-      const hidePopup = () => {
-        popupWinVisible.value = false;
-      };
-
-      //点击下拉菜单的三角形时,会触发的方法
-      const suffixClick = () => {
-        //可录入的objPicker,更新下拉菜单选项
-        updateOptionBYInputText("");
-        // popupWinVisible.value = !popupWinVisible.value;
-        Vue.nextTick(() => {
-          calculatePopupDirection();
-        });
-        console.log("点三角");
-      };
-
-      //可录入的objPicker,录入项变化时,会触发
-      async function handleInputChange(event) {
-        inputText.value = event.target.value;
-        if (!inputText.value) {
-          inputText.value = "";
-        }
-
-        //可录入的objPicker,更新下拉菜单选项
-        updateOptionBYInputText(inputText.value);
-
-        // filteredOptions.value = props.opt.filter((option) =>
-        //     option.label.toLowerCase().includes(inputText.value.toLowerCase())
-        // );
-        // if (!popupWinVisible.value) {
-        //   popupWinVisible.value = true; // 确保下拉框在输入时打开
-        // }
-      }
-      Vue.onMounted(() => {
-        initDefaultValue();
-        window.addEventListener("resize", calculatePopupDirection);
-      });
-      Vue.onUnmounted(() => {
-        window.removeEventListener("resize", calculatePopupDirection);
-      });
-
-      return {
-        errMsg,
-        selectItem,
-        inputText,
-        canInput,
-        filteredOptions,
-        popupWinVisible,
-        popupDirection,
-        suffixClick,
-        togglePopup,
-        hidePopup,
-        doSelectItem,
-        handleInputChange,
-      };
-    },
-
-    template: `
-      <div class="input" style="position: relative" :style="{width: width}">
-        <div class="select-container" @mouseleave="hidePopup">
-          <div class="input" @click="togglePopup">
-            <input 
-              type="hidden"
-              :name="name"
-              :value="selectItem.value"
-              .value="selectItem.value" 
-            />
-            <input
-              v-model="inputText"
-              @input="handleInputChange"
-              v-if="canInput"
-              :placeholder="placeholder"
-              
-            />
-            
-            <input
-              v-else
-              :placeholder="placeholder"
-              :value="selectItem.label"
-              
-              disabled
-              style="pointer-events: none;"
-            />
-           
-            <div class="suffix" @click.stop="suffixClick">
-              <ss-form-icon :class="popupWinVisible ? 'form-icon-transform-select select' : 'form-icon-select'" />
-              
-            </div>
-          </div>
-         
-            
-          <div v-show="popupWinVisible" class="popup-win" :class="popupDirection">
-            <div v-if="opt && opt.length && filteredOptions.length > 0" class="popup-content">
-              <div class="content-area">
-                <div v-for="(item, index) in filteredOptions" :key="index" @click="doSelectItem(item)" :class="{ active: item.value === selectItem.value }">
-                  <span class="check-icon">
-                   
-                    <ss-form-icon class="form-icon-select-checked" />
-                  </span>
-                  <span>{{ item.label }}</span>
-                </div>
-              </div>
-            </div>
-            <div v-else class="popup-content"><div class="content-area"><div class="content-area"> <span>无选项</span></div></div></div>
-          </div>
-        </div>
-      </div>
-
-    `,
-  };
-  // ss-hidden 隐藏字段组件
-  const SsHidden = {
-    name: "SsHidden",
-    props: {
-      modelValue: String,
-      name: {
-        type: String,
-        required: true,
-      },
-      rule: {
-        type: String,
-        required: true,
-      },
-
-      param: {
-        type: String,
-        required: true,
-      },
-      url: {
-        type: String,
-        required: true,
-      },
-    },
-    emits: ["update:modelValue"],
-
-    setup(props, { emit }) {
-      const errMsg = Vue.ref("");
-      const validate = () => {
-        if (window.ssVm) {
-          const result = window.ssVm.validateField(props.name);
-          console.log("validate", window.ssVm.validateField(props.name));
-          errMsg.value = result.valid ? "" : result.message;
-        }
-      };
-      Vue.onMounted(() => {
-        /**
-         * 初始化级联菜单值初始值思路:
-         * 1. 带隐藏字段(即带编码规则)的级联菜单
-         *  在隐藏字段这,可以取到要回显的值和编码规则,从而计算出各级下拉菜单要回显的值。
-         *  然后通过ajax取各级级联菜单的值回显。
-         *  2. 不带隐藏字段的级联,只能在各个下拉菜单的setup事件中通过ajax取回显值回显
-         */
-
-        // 当同组级联下拉菜单选中值变化时,会调用本隐藏字段下面这方法设置隐藏字段值
-        window.addEventListener(
-            "cascader-setHiddenVal-" + props.name,
-            (event) => {
-              const { value } = event.detail;
-              emit("update:modelValue", value);
-              console.log(value);
-              setTimeout(() => {
-                validate();
-              }, 50);
-            }
-        );
-
-        // 如果有初始值,触发回显过程
-        if (props.modelValue) {
-          console.log("级联隐藏字段,开始回显,初始值:", props.modelValue);
-          triggerCascaderEcho(props.modelValue);
-          validate();
-        }
-      });
-
-      // 触发级联回显
-      const triggerCascaderEcho = (code) => {
-        /**
-         * 开始回显,初始值: 440304
-         * 解析后的所有值: Array(3)0: "440000"1: "440300"2: "440304"length: 3[[Prototype]]: Array(0)
-         */
-        const values = parseHiddenCodeForAll(code, props.rule);
-        console.log("解析后的所有值:", values);
-
-        // 转换为 JSON 对象
-        // const paramObj = JSON.parse(props.param);
-        const paramObj = props.param;
-        let selectArr = paramObj.fieldOrd; //保存本组级联菜单项的数组,如:['hksheng','hkshi','hkxian']
-        if (selectArr.length != values.length) {
-          // alert('属性'+props.name+'的值'+code+'与级联菜单中下拉菜单的数目不匹配!');
-          return;
-        }
-
-        // 按顺序触发回显,并增加延迟确保数据加载
-        /**
-         * 通过隐藏字段的setup事件,
-         * 循环遍历各级下拉菜单,并触发定义在下拉菜单中的'cascader-echo'事件,
-         * 在此事件中完成每个下拉菜单回显值操作(只取当前要回显的键值对显示,
-         * 下拉菜单所有的值,在点击下拉菜单时,才通过ajax取)。
-         */
-        values.forEach((value, index) => {
-          if (value) {
-            setTimeout(() => {
-              let upperVal = undefined;
-              if (index != 0) {
-                upperVal = values[index - 1];
-              }
-
-              const echoEvent = new CustomEvent(
-                  "cascader-echo-" + selectArr[index],
-                  {
-                    detail: {
-                      name: props.name,
-                      value: value,
-                      // level: index + 1,
-                      isAuto: true, // 标记为自动回显
-                      upperVal: upperVal,
-                    },
-                  }
-              );
-
-              console.log(props.name + "--upperValue:" + upperVal);
-
-              window.dispatchEvent(echoEvent);
-            }, index * 500); // 每级增加500ms延迟
-          }
-        });
-      };
-
-      // 解析所有级别的代码
-      const parseHiddenCodeForAll = (code, rule) => {
-        if (!code || !rule) return [];
-
-        // 获取规则中每段的长度
-        const segments = [];
-        let currentChar = rule[0];
-        let currentLength = 1;
-
-        for (let i = 1; i < rule.length; i++) {
-          if (rule[i] === currentChar) {
-            currentLength++;
-          } else {
-            segments.push(currentLength);
-            currentChar = rule[i];
-            currentLength = 1;
-          }
-        }
-        segments.push(currentLength);
-
-        // 解析每一级的值
-        const values = [];
-        let position = 0;
-
-        segments.forEach((length, index) => {
-          const value = code
-              .substring(0, position + length)
-              .padEnd(rule.length, "0");
-          values.push(value);
-          position += length;
-        });
-
-        return values;
-      };
-      watchEffect(() => {});
-      return {};
-    },
-    template: `<input type="hidden" :name="name" :value="modelValue">`,
-  };
-  // ss-cascader 级联选择器
-  const SsCcp = {
-    name: "SsCcp",
-    inheritAttrs: false,
-    props: {
-      modelValue: String,
-
-      name: {
-        type: String,
-        required: true,
-      },
-      level: {
-        type: Number,
-        required: true,
-      },
-      opt: {
-        type: Array,
-        default: () => [],
-      },
-      placeholder: {
-        type: String,
-        default: "请选择",
-      },
-      width: {
-        type: String,
-        default: "150px",
-      },
-      direction: {
-        type: String,
-        default: "bottom",
-      },
-      mode: {
-        type: String,
-        default: "1",
-      },
-
-      //级联菜单配置参数,如果是数组,则代表本下拉菜单是多套级联菜单共用的第一级菜单。如果是对象,则只有一套级联菜单用此下拉菜单。
-      param: {
-        type: String,
-        required: true,
-      },
-      //向后台拿数据的url
-      url: {
-        type: String,
-        required: true,
-      },
-    },
-    emits: ["update:modelValue", "change"],
-
-    setup(props, { emit }) {
-      // alert('级联菜单初始化:'+props.name+':--:'+props.modelValue);
-      const selectItem = Vue.ref({ label: props.placeholder, value: "" });
-      const popupWinVisible = Vue.ref(false);
-      const isAutoEcho = Vue.ref(false); // 用于标记是否是自动回显
-      const upperValue = Vue.ref(""); //上级下拉菜单当前值,在初始化下拉菜单默认值时,和上级下拉菜单的值变化时,修改此upperValue变量
-      const popupDirection = Vue.ref("bottom");
-
-      //有隐藏字段的下拉菜单,加载菜单项并展开事件
-      // 被上级下拉菜单选中值后,触发本下拉菜单刷新菜单项并弹出显示
-      window.addEventListener("cascader-open-" + props.name, async (event) => {
-        const { upperVal } = event.detail;
-        upperValue.value = upperVal;
-        console.log(
-            "22props.name:" +
-            props.name +
-            ",22props.upperValue:" +
-            upperValue.value
-        );
-
-        selectItem.value = ""; //清除本下拉菜单当前选中的值
-        emit("update:modelValue", ""); //通知父级
-
-        //清空下拉菜单,并设置第一项的值为placeholder
-        clearAndInit1stOpt();
-
-        //下个下拉菜单名
-        let nextSelName = getNextSel(props.name, props.param.fieldOrd);
-        if (nextSelName) {
-          //清下个下拉菜单选中值和选项
-          event = new CustomEvent("cascader-cleanOpt-" + nextSelName, {
-            detail: {},
-          });
-          window.dispatchEvent(event);
-        }
-
-        showPopup();
-      });
-
-      //设置mode2的下级下拉菜单的上级菜单当前值
-      function setNextSelectUpperValue() {
-        //设置下级菜单的上级菜单当前值upperValue
-        let paramArr = undefined;
-        if (Array.isArray(props.param)) {
-          paramArr = props.param;
-        } else {
-          paramArr = [];
-          paramArr.push(props.param);
-        }
-
-        for (const oneParam of paramArr) {
-          //下个下拉菜单名
-          const nextSelName = getNextSel(props.name, oneParam.fieldOrd);
-          if (nextSelName) {
-            setTimeout(() => {
-              const openNextEvent = new CustomEvent(
-                  "cascade-setUpperVal-" + nextSelName,
-                  {
-                    detail: {
-                      upperVal: props.modelValue,
-                    },
-                  }
-              );
-              window.dispatchEvent(openNextEvent);
-            }, 100);
-          }
-        } // end for
-      }
-
-      // 把上级 级联下拉菜单的值,设置进本组件的事件
-      window.addEventListener("cascade-setUpperVal-" + props.name, (event) => {
-        // alert('props.name:'+props.name+',props.upperValue:'+event.detail.upperVal);
-        const { upperVal } = event.detail;
-        upperValue.value = upperVal;
-
-        // console.log('props.name:'+props.name+',props.upperValue:'+upperValue.value);
-      });
-
-      //清空下拉菜单,并设置第一项的值为空
-      function clearAndInit1stOpt() {
-        if (props.opt)
-          props.opt.length = 0; //通过修改数组的length属性,直接清空数组元素,内存会被自动释放。这是性能最优的方式
-        else {
-          props.opt = [];
-        }
-        props.opt.push({ label: "", value: "" });
-      }
-
-      //获取下一级下拉菜单,如果下一级下拉菜单不存在,则返回undefined
-      function getNextSel(selName, selNameArr) {
-        // 检查参数有效性
-        if (!Array.isArray(selNameArr) || selNameArr.length === 0) {
-          return undefined;
-        }
-
-        // 查找当前元素的索引
-        const currentIndex = selNameArr.indexOf(selName);
-
-        // 如果元素不存在或已经是最后一个元素,返回undefined
-        if (currentIndex === -1 || currentIndex === selNameArr.length - 1) {
-          return undefined;
-        }
-
-        // 返回下一个元素
-        return selNameArr[currentIndex + 1];
-      }
-
-      // 处理选择事件
-      const doSelectItem = (item) => {
-        selectItem.value = item;
-        emit("update:modelValue", item.value); //修改本下拉菜单在vue中保存的值
-
-        // alert('item.value:'+item.value);
-        if (props.mode === "1") {
-          // mode 1 模式:修改隐藏字段值
-
-          let event = new CustomEvent(
-              "cascader-setHiddenVal-" + props.param.combField,
-              {
-                detail: {
-                  value: item.value,
-                },
-              }
-          );
-          window.dispatchEvent(event);
-        }
-        emit("change", item.value); //触发配置的change方法
-
-        //设置下级菜单的上级菜单当前值upperValue
-        let paramArr = undefined;
-        if (Array.isArray(props.param)) {
-          paramArr = props.param;
-        } else {
-          paramArr = [];
-          paramArr.push(props.param);
-        }
-
-        for (const oneParam of paramArr) {
-          //下个下拉菜单名
-          const nextSelName = getNextSel(props.name, oneParam.fieldOrd);
-          if (nextSelName) {
-            setTimeout(() => {
-              const openNextEvent = new CustomEvent(
-                  "cascader-open-" + nextSelName,
-                  {
-                    detail: {
-                      upperVal: item.value,
-                    },
-                  }
-              );
-              window.dispatchEvent(openNextEvent);
-            }, 100);
-          }
-        } // end for
-
-        hidePopup();
-
-        //下个下拉菜单名
-        // let nextSelName = getNextSel(props.name, props.param.fieldOrd);
-        // if(nextSelName){
-        //   // //设置下一级下拉菜单中保存的本下拉菜单值(upperValue)
-        //   // event = new CustomEvent('cascade-setUpperVal-'+nextSelName, {
-        //   //   detail: {
-        //   //     value: item.value
-        //   //   }
-        //   // });
-        //   // window.dispatchEvent(event);
-        //
-        //   //触发下一级下拉菜单,重新初始化下拉菜单项并弹出显示
-        //   event = new CustomEvent('cascader-open-' +nextSelName, {
-        //     detail: {
-        //       upperVal: item.value
-        //     }
-        //   });
-        //   window.dispatchEvent(event);
-        // }
-
-        // 只在手动选择时自动展开下一级
-        // if (!isAutoEcho.value) {
-        //   const nextLevel = props.level + 1;
-        //   setTimeout(() => {
-        //     const openNextEvent = new CustomEvent('open-next-cascader', {
-        //       detail: {
-        //         name: props.name,
-        //         level: nextLevel
-        //       }
-        //     });
-        //     window.dispatchEvent(openNextEvent);
-        //   }, 100);
-        // }
-      };
-
-      // 监听下一级展开事件 (仅 mode 2)
-      window.addEventListener("cascade-open", (event) => {
-        if (props.mode === "2") {
-          const { level } = event.detail;
-          if (level === props.level) {
-            popupWinVisible.value = true;
-          }
-        }
-      });
-
-      if (props.mode === "1") {
-        //如果是有隐藏字段的下拉菜单
-        // 监听回显事件
-        window.addEventListener(
-            "cascader-echo-" + props.name,
-            async (event) => {
-              const { name, value, isAuto, upperVal } = event.detail;
-              // level,
-              if (upperVal) {
-                upperValue.value = upperVal;
-                console.log(
-                    "value:" +
-                    value +
-                    ",upperValue:" +
-                    upperValue +
-                    ",初始化级联组件时props.name:" +
-                    props.name
-                );
-              }
-
-              // if (name === props.name && level === props.level) {
-              // 设置自动回显标记
-              isAutoEcho.value = true;
-
-              // if (props.opt.length === 0) {
-              // const loadDataEvent = new CustomEvent('cascader-load-data', {
-              //   detail: {
-              //     name: props.name,
-              //     level: props.level,
-              //     value: value
-              //   }
-              // });
-              // window.dispatchEvent(loadDataEvent);
-
-              //下面的代码只用于页面刚打开时,初始化级联菜单的回显值。
-
-              //Vue.watch用于监听数据的变化,并在数据变化时执行特定的回调函数。
-              //这段代码使用了 Vue.js 的 watch API 来监听 props.opt 的变化,如果props.opt有变化,则自动
-
-              //   const unwatch = Vue.watch(
-              //       () => props.opt,                // 监听的数据源(props.opt)
-              //       (newOptions) => {              // 回调函数
-              //         if (newOptions.length > 0) { // 条件判断
-              //           matchAndSelect(value);     // 执行逻辑
-              //           unwatch();                 // 停止监听
-              //         }
-              //       },
-              //       { immediate: true }            // 配置:立即触发一次
-              //   );
-              // } else {
-              //   matchAndSelect(value);
-              // }
-
-              // 初始化级联菜单在页面刚打开时的默认值
-              async function initDefaultValue(value) {
-                try {
-                  // alert(1);
-                  if (props.url && props.param && props.modelValue) {
-                    // alert(2);
-                    /**
-                     *         let objectPickerParam=
-                     *             {"objectpickerparam":"{\"input\":\"false\",\"cascadingLevel\":\"hksheng,hkshi,hkxian\"," +
-                     *                     "\"name\":\"hksheng\"," +
-                     *                     "\"cascadingName\":\"dq\",\"cascadingInputsName\":\"hkdqm\"," +
-                     *                     "\"codebook\":\"sheng\"}",
-                     *                 "objectpickertype":2,
-                     *                 "objectpickervalue":"440000"
-                     *             };
-                     */
-
-                    const objectPickerParam = {
-                      input: "false",
-                      cascadingLevel: props.param.fieldOrd.join(","), //如:"hksheng,hkshi,hkxian"
-                      name: props.name, //本下拉菜单名
-                      cascadingName: props.param.name, //级联菜单名
-                      cascadingInputsName: props.param.combField, //对象属性,即隐藏字段名,如:hkdqm
-                      codebook: props.param.codebook,
-                    };
-
-                    const objectPickerParamStr =
-                        JSON.stringify(objectPickerParam);
-
-                    const params = new URLSearchParams();
-                    params.append("objectpickerparam", objectPickerParamStr);
-                    params.append("objectpickertype", "2");
-                    params.append("objectpickervalue", value); //需回显的值
-
-                    axios
-                        .post(props.url, params, {
-                          headers: {
-                            "Content-Type": "application/x-www-form-urlencoded", // 必须手动设置!
-                          },
-                        })
-                        .then((response) => {
-                          // alert(JSON.stringify(response.data));
-
-                          if ("timeout" == response.data.statusText) {
-                            alert("网络超时!");
-                            return;
-                          }
-
-                          if (response.data.result) {
-                            const keys = Object.keys(response.data.result);
-                            if (keys.length === 1) {
-                              let code = keys[0];
-                              let desc = response.data.result[keys[0]];
-                              clearAndInit1stOpt();
-                              props.opt.push({ label: desc, value: code });
-
-                              if (value) matchAndSelect(value);
-                              // updateSelectItem();
-
-                              // alert('props.opt:'+JSON.stringify(props.opt));
-                            }
-                          }
-                        });
-                  }
-                } catch (error) {
-                  alert(error);
-                  // callback(null, error.message); // 失败回调,传递错误
-                }
-              }
-
-              //下面的代码只用于页面刚打开时,初始化级联菜单的回显值。
-              initDefaultValue(value);
-
-              // 延迟重置自动回显标记
-              setTimeout(() => {
-                isAutoEcho.value = false;
-              }, 500);
-            }
-        );
-
-        // 被上级下拉菜单触发的,清除选中值和下拉菜单选项
-        window.addEventListener(
-            "cascader-cleanOpt-" + props.name,
-            async (event) => {
-              upperValue.value = "";
-
-              selectItem.value = ""; //清除本下拉菜单当前选中的值
-              emit("update:modelValue", ""); //通知父级
-
-              //清空所有下拉菜单项
-              if (props.opt) {
-                props.opt.length = 0;
-              } else {
-                props.opt = [];
-              }
-
-              //下个下拉菜单名
-              let nextSelName = getNextSel(props.name, props.param.fieldOrd);
-              // alert('nextSelName:'+nextSelName+'--,props.name:'+props.name);
-              if (nextSelName) {
-                //清下个下拉菜单选中值和选项
-                event = new CustomEvent("cascader-cleanOpt-" + nextSelName, {
-                  detail: {},
-                });
-                window.dispatchEvent(event);
-              }
-            }
-        );
-      } else if (props.mode === "2") {
-        //没隐藏字段的下拉菜单,在这初始化默认值
-
-        let needInitParam = undefined;
-        if (Array.isArray(props.param)) {
-          needInitParam = props.param[props.param.length - 1]; //只初始化数组最后一项
-          console.log("needInitParam最后一项:" + JSON.stringify(needInitParam));
-        } else {
-          needInitParam = props.param;
-        }
-
-        // 初始化级联菜单在页面刚打开时的默认值
-        async function initDefaultValue(value, param) {
-          try {
-            // alert(1);
-            if (props.url && param && props.modelValue) {
-              // alert(2);
-              /**
-               *        let param=
-               *             {"objectpickerparam":"{\"input\":\"false\",\"cascadingLevel\":\"rylbm,gwid\"," +
-               *                     "\"name\":\"gwid\",\"cascadingName\":\"rylb_gw\"," +
-               *                     "\"codebook\":\"gwByRylb\"}",
-               *                 "objectpickertype":2,
-               *                 "objectpickervalue":"102121"};
-               */
-
-                  // alert('props.name:'+props.name+',props.param.fieldOrd:'+props.param.fieldOrd);
-
-              const objectPickerParam = {
-                    input: "false",
-                    cascadingLevel: param.fieldOrd.join(","), //如:"hksheng,hkshi,hkxian"
-                    name: props.name, //本下拉菜单名
-                    cascadingName: param.name, //级联菜单名
-                    codebook: param.codebook,
-                  };
-
-              const objectPickerParamStr = JSON.stringify(objectPickerParam);
-
-              const sendParams = new URLSearchParams();
-              sendParams.append("objectpickerparam", objectPickerParamStr);
-              sendParams.append("objectpickertype", "2");
-              sendParams.append("objectpickervalue", value); //需回显的值
-
-              axios
-                  .post(props.url, sendParams, {
-                    headers: {
-                      "Content-Type": "application/x-www-form-urlencoded", // 必须手动设置!
-                    },
-                  })
-                  .then((response) => {
-                    // alert(JSON.stringify(response.data));
-
-                    if ("timeout" == response.data.statusText) {
-                      alert("网络超时!");
-                      return;
-                    }
-
-                    if (response.data.result) {
-                      const keys = Object.keys(response.data.result);
-
-                      console.log(
-                          "name:" +
-                          props.name +
-                          ",@@级联初始化默认值value:" +
-                          value +
-                          "--param:" +
-                          JSON.stringify(param) +
-                          "--objectPickerParamStr:" +
-                          objectPickerParamStr +
-                          "--response.data:" +
-                          JSON.stringify(response.data)
-                      );
-
-                      if (keys.length === 1) {
-                        let code = keys[0];
-                        let desc = response.data.result[keys[0]];
-
-                        if (props.opt)
-                          props.opt.length = 0; //通过修改数组的length属性,直接清空数组元素,内存会被自动释放。这是性能最优的方式
-                        else {
-                          props.opt = [];
-                        }
-                        props.opt.push({ label: desc, value: code });
-
-                        if (value) matchAndSelect(value);
-
-                        console.log(
-                            "GOOD mode2回显的默认值:" +
-                            JSON.stringify({ label: desc, value: code }) +
-                            "--props.param:" +
-                            JSON.stringify(param)
-                        );
-
-                        // updateSelectItem();
-
-                        // alert('props.opt:'+JSON.stringify(props.opt));
-                      }
-                    }
-                  });
-            }
-          } catch (error) {
-            alert(error);
-            // callback(null, error.message); // 失败回调,传递错误
-          }
-
-          // 重置自动回显标记
-          isAutoEcho.value = false;
-        }
-
-        // 初始化级联菜单在页面刚打开时的默认值
-        initDefaultValue(props.modelValue, needInitParam);
-
-        //设置mode2的下级下拉菜单的上级菜单当前值
-        setNextSelectUpperValue();
-      }
-
-      //选中要回显的默认值
-      const matchAndSelect = (value) => {
-        const matchedOption = props.opt.find((opt) => opt.value === value);
-        if (matchedOption) {
-          selectItem.value = matchedOption;
-          emit("update:modelValue", value);
-          emit("change", value);
-        }
-      };
-
-      const calculatePopupDirection = () => {
-        // 1. 获取select容器元素
-        const selectEl = document.querySelector(
-            `[name="${props.name}"]`
-        )?.nextElementSibling;
-        console.log("selectEl:" + selectEl, props.name);
-        if (!selectEl) return;
-
-        // 2. 获取位置信息
-        const selectRect = selectEl.getBoundingClientRect();
-        const viewportHeight = window.innerHeight;
-
-        // 3. 简单判断:如果下方剩余空间小于300px就向上弹出
-        const spaceBelow = viewportHeight - selectRect.bottom;
-
-        // 调试信息
-        console.log("空间判断:", {
-          elementBottom: selectRect.bottom,
-          viewportHeight,
-          spaceBelow,
-          willPopUp: spaceBelow < 300,
-          popupDirection: popupDirection.value,
-        });
-
-        // 4. 设置方向
-        popupDirection.value = spaceBelow < 300 ? "top" : "bottom";
-      };
-      //级联菜单点击事件
-      const togglePopup = () => {
-        if (!popupWinVisible.value) {
-          //如果当前下拉菜单是隐藏的,先ajax重新加载下拉菜单项,再显示。
-
-          showPopup();
-        } else {
-          hidePopup();
-        }
-      };
-
-      //显示下拉菜单,在此之前先清除下拉菜单项
-      const showPopup = () => {
-        //清空下拉菜单,并设置第一项的值为空
-        clearAndInit1stOpt();
-        Vue.nextTick(() => {
-          calculatePopupDirection();
-        });
-        let url = props.url;
-        let filterObj = props.param.filter;
-
-        if (filterObj) {
-          for (let k in filterObj) {
-            let v = filterObj[k];
-            url += "&" + k + "=" + v;
-          }
-        }
-
-        if (props.mode === "1") {
-          //如果是有隐藏字段的下拉菜单
-
-          console.log("666url:" + url);
-
-          // alert('url:'+url);
-
-          // 获取级联菜单所有下拉菜单项
-          async function getSelectItems(value) {
-            try {
-              // alert(1);
-              if (props.url && props.param) {
-                // alert(2);
-                /**
-                 *            param={"objectpickerparam":"{\"input\":\"false\",\"cascadingLevel\":\"hksheng,hkshi,hkxian\"," +
-                 *                     "\"name\":\"hksheng\",\"cascadingName\":\"dq\"," +
-                 *                     "\"cascadingInputsName\":\"hkdqm\",\"codebook\":\"sheng\"}",
-                 *                 "objectpickertype":1,//2表示获取要回显的一项,1表示获取所有下拉菜单项
-                 *                 "upperValue":"440000"
-                 *             };
-                 */
-
-                const objectPickerParam = {
-                  input: "false",
-                  cascadingLevel: props.param.fieldOrd.join(","), //如:"hksheng,hkshi,hkxian"
-                  name: props.name, //本下拉菜单名
-                  cascadingName: props.param.name, //级联菜单名
-                  cascadingInputsName: props.param.combField, //对象属性,即隐藏字段名,如:hkdqm
-                  codebook: props.param.codebook,
-                };
-
-                console.log("mode1 upperValue.value:" + upperValue.value);
-
-                const objectPickerParamStr = JSON.stringify(objectPickerParam);
-
-                const params = new URLSearchParams();
-                params.append("objectpickerparam", objectPickerParamStr);
-                params.append("objectpickertype", "1");
-                if (upperValue.value) {
-                  params.append("upperValue", upperValue.value);
-                }
-                // params.append('objectpickervalue', value); //需回显的值
-
-                axios
-                    .post(url, params, {
-                      headers: {
-                        "Content-Type": "application/x-www-form-urlencoded", // 必须手动设置!
-                      },
-                    })
-                    .then((response) => {
-                      if ("timeout" == response.data.statusText) {
-                        alert("网络超时!");
-                        return;
-                      }
-
-                      if (response.data.result) {
-                        const keys = Object.keys(response.data.result);
-                        console.log(
-                            "params:" +
-                            params +
-                            "@@response.data:" +
-                            JSON.stringify(response.data)
-                        );
-
-                        if (keys.length > 0) {
-                          for (let k in response.data.result) {
-                            props.opt.push({
-                              label: response.data.result[k],
-                              value: k,
-                            });
-                          }
-
-                          if (!popupWinVisible.value) {
-                            popupWinVisible.value = true; // 确保下拉框打开
-                          }
-
-                          console.log("props.opt11:" + JSON.stringify(props.opt));
-                        }
-                      }
-                    });
-              }
-            } catch (error) {
-              alert(error);
-              // callback(null, error.message); // 失败回调,传递错误
-            }
-          }
-
-          getSelectItems(props.modelValue);
-        } else if (props.mode === "2") {
-          //没隐藏字段的下拉菜单
-
-          let needInitParam = undefined;
-          if (Array.isArray(props.param)) {
-            needInitParam = props.param[props.param.length - 1]; //只初始化数组最后一项
-            console.log(
-                "needInitParam最后一项:" + JSON.stringify(needInitParam)
-            );
-          } else {
-            needInitParam = props.param;
-          }
-
-          // 获取级联菜单所有下拉菜单项
-          async function getSelectItems(value, sendParam) {
-            try {
-              // alert(1);
-              if (props.url && sendParam) {
-                // alert(2);
-                /**
-                 *            param="{\"input\":\"false\",\"cascadingLevel\":\"dwid,sjryid\",
-                 *            \"ryid\":\"111121\",\"name\":\"sjryid\",
-                 *            \"cascadingName\":\"dw_sjry\",\"codebook\":\"sjryByDw\"}"
-                 */
-
-                const objectPickerParam = {
-                  input: "false",
-                  cascadingLevel: sendParam.fieldOrd.join(","), //如:"hksheng,hkshi,hkxian"
-                  name: props.name, //本下拉菜单名
-                  cascadingName: sendParam.name, //级联菜单名
-                  codebook: sendParam.codebook,
-                };
-
-                console.log("mode2 upperValue.value:" + upperValue.value);
-
-                const objectPickerParamStr = JSON.stringify(objectPickerParam);
-
-                const params = new URLSearchParams();
-                params.append("objectpickerparam", objectPickerParamStr);
-                params.append("objectpickertype", "1");
-                if (upperValue.value) {
-                  params.append("upperValue", upperValue.value);
-                }
-                // params.append('objectpickervalue', value); //需回显的值
-
-                axios
-                    .post(url, params, {
-                      headers: {
-                        "Content-Type": "application/x-www-form-urlencoded", // 必须手动设置!
-                      },
-                    })
-                    .then((response) => {
-                      if ("timeout" == response.data.statusText) {
-                        alert("网络超时!");
-                        return;
-                      }
-
-                      if (response.data.result) {
-                        const keys = Object.keys(response.data.result);
-                        console.log(
-                            "params:" +
-                            params +
-                            "@@response.data:" +
-                            JSON.stringify(response.data)
-                        );
-
-                        if (keys.length > 0) {
-                          for (let k in response.data.result) {
-                            props.opt.push({
-                              label: response.data.result[k],
-                              value: k,
-                            });
-                          }
-
-                          if (!popupWinVisible.value) {
-                            popupWinVisible.value = true; // 确保下拉框打开
-                          }
-
-                          console.log("props.opt11:" + JSON.stringify(props.opt));
-                        }
-                      }
-                    });
-              }
-            } catch (error) {
-              alert(error);
-              // callback(null, error.message); // 失败回调,传递错误
-            }
-          }
-
-          getSelectItems(props.modelValue, needInitParam);
-
-          // popupWinVisible.value = !popupWinVisible.value;
-        }
-      };
-
-      const hidePopup = () => {
-        popupWinVisible.value = false;
-      };
-
-      // 合并所有的 onMounted 逻辑
-      Vue.onMounted(() => {
-        window.addEventListener("resize", calculatePopupDirection);
-
-        // 1. 监听展开下一级事件
-        window.addEventListener("open-next-cascader", (event) => {
-          const { name, level } = event.detail;
-          if (name === props.name && level === props.level) {
-            popupWinVisible.value = true;
-          }
-        });
-
-        // 2. 监听级联事件
-        window.addEventListener("cascader-change", (event) => {
-          const { name, level, value } = event.detail;
-          if (name === props.name && level < props.level) {
-            selectItem.value = { label: "", value: "" };
-            emit("update:modelValue", "");
-            if (ssHidden) {
-              ssHidden.updateValue(value);
-            }
-          }
-        });
-      });
-      Vue.onUnmounted(() => {
-        window.removeEventListener("resize", calculatePopupDirection);
-      });
-      // 监听值变化,处理回显 (mode 2)
-      Vue.watch(
-          () => props.modelValue,
-          (newVal) => {
-            if (props.mode === "2" && newVal) {
-              // 使用 watchEffect 替代嵌套的 watch
-              Vue.watchEffect(() => {
-                if (props.opt.length > 0) {
-                  const matchedOption = props.opt.find(
-                      (opt) => opt.value === newVal
-                  );
-                  if (matchedOption) {
-                    selectItem.value = matchedOption;
-                  }
-                }
-              });
-            } else {
-              // 原有的值变化处理
-              const item = props.opt.find((it) => it.value === newVal);
-              if (item) {
-                selectItem.value = item;
-              } else {
-                selectItem.value = { label: "", value: "" };
-              }
-            }
-          },
-          { immediate: true }
-      );
-
-      // 监听选项变化,当数据加载完成时进行匹配
-      Vue.watch(
-          () => props.opt,
-          (newOptions) => {
-            if (newOptions.length > 0) {
-              const matchedOption = newOptions.find(
-                  (opt) => opt.value === selectItem.value.value
-              );
-              if (matchedOption) {
-                selectItem.value = matchedOption;
-                emit("update:modelValue", matchedOption.value);
-                emit("change", matchedOption.value);
-              }
-            }
-          }
-      );
-
-      return {
-        selectItem,
-        popupWinVisible,
-        popupDirection,
-        togglePopup,
-        hidePopup,
-        doSelectItem,
-      };
-    },
-
-    template: `
-      <div class="input" style="position: relative" :style="{width: width}">
-        <input type="hidden" :name="name" :value="modelValue">
-        <div class="select-container" @mouseleave="hidePopup">
-          <div class="input" @click="togglePopup">
-            <input 
-              type="hidden"
-              :name="name"
-              :value="selectItem.value"
-            />
-            <input
-              :placeholder="placeholder"
-              :value="selectItem.label"
-              disabled
-              style="pointer-events: none;"
-            />
-            <div class="suffix">
-              <ss-form-icon :class="popupWinVisible ? 'form-icon-transform-select select' : 'form-icon-select'" />
-            </div>
-          </div>
-
-          <div v-show="popupWinVisible" class="popup-win " :class="popupDirection">
-            <div v-if="opt && opt.length > 0" class="popup-content">
-              <div class="content-area">
-                <div 
-                  v-for="(item, index) in opt" 
-                  :key="index" 
-                  @click="doSelectItem(item)" 
-                  :class="{ active: item.value === selectItem.value }"
-                >
-                  <span class="check-icon">
-                    <ss-form-icon class="form-icon-select-checked" />
-                  </span>
-                  <span>{{ item.label }}</span>
-                </div>
-              </div>
-            </div>
-            <div v-else class="popup-content">
-              <div class="content-area">
-                <div class="content-area">
-                  <span>无选项</span>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-    `,
-  };
-  // ss-date-picker 日期时间选择器组件
-  const SsDatePicker = {
-    name: "SsDatePicker",
-    props: {
-      modelValue: {
-        type: [String, Number, Date],
-        default: "",
-      },
-      name: {
-        type: String,
-        required: true,
-      },
-      type: {
-        type: String,
-        default: "date",
-        validator: (value) => ["date", "datetime", "time"].includes(value),
-      },
-      fmt: {
-        type: String,
-        default: null,
-      },
-      placeholder: {
-        type: String,
-        default: "",
-      },
-      width: {
-        type: String,
-        default: "100%",
-      },
-    },
-
-    emits: ["update:modelValue"],
-
-    setup(props, { emit }) {
-      const errMsg = ref("");
-      const validate = () => {
-        if (window.ssVm) {
-          const result = window.ssVm.validateField(props.name);
-          console.log("validate", window.ssVm.validateField(props.name));
-          errMsg.value = result.valid ? "" : result.message;
-        }
-      };
-      // 根据type确定默认格式
-      const defaultFormat = computed(() => {
-        switch (props.type) {
-          case "datetime":
-            return "YYYY-MM-DD HH:mm:ss";
-          case "date":
-            return "YYYY-MM-DD";
-          case "time":
-            return "HH:mm:ss";
-        }
-      });
-      const convertJavaFormatToElement = (javaFormat) => {
-        if (!javaFormat) return null;
-        return javaFormat
-            .replace("yyyy", "YYYY")
-            .replace("MM", "MM")
-            .replace("dd", "DD")
-            .replace("HH", "HH")
-            .replace("mm", "mm")
-            .replace("ss", "ss");
-      };
-
-      const finalFormat = computed(() => {
-        if (props.fmt) {
-          return convertJavaFormatToElement(props.fmt);
-        }
-        return defaultFormat.value;
-      });
-
-      // 使用 resolveComponent 获取组件
-      const ElDatePicker = resolveComponent("ElDatePicker");
-      const ElTimePicker = resolveComponent("ElTimePicker");
-      const SsFormIcon = resolveComponent("SsFormIcon");
-      const ElIcon = resolveComponent("ElIcon");
-
-      const handleValueUpdate = (val) => {
-        emit("update:modelValue", val);
-        emit("change", val); // 同时触发 change 事件
-        setTimeout(() => {
-          validate();
-        }, 50);
-      };
-      const dateType = computed(() => {
-        const fmt = props.fmt || "";
-        if (fmt.includes("HH:mm:ss")) {
-          return "datetime";
-        } else if (fmt.includes("HH:mm")) {
-          return "datetime";
-        } else if (fmt.includes("mm:ss")) {
-          return "time";
-        }
-        return "date";
-      });
-
-      let useTimePicker = true;
-      //"yyyy-MM-dd HH:mm:ss";  "日期字符串格式在java的写法",传到本组件fmt属性也是按这个格式
-      if (props.fmt) {
-        //有fmt属性,则以fmt属性优先判断类型
-        if (/[dMy]/.test(props.fmt)) {
-          //如果有传入日期格式,且含年月日
-          useTimePicker = false;
-        } else {
-          useTimePicker = true;
-        }
-      } else if (props.type !== "time") {
-        useTimePicker = false;
-      }
-
-      return () =>
-          h("div", { class: "ss-date-picker", style: { width: props.width } }, [
-            h("input", {
-              type: "hidden",
-              name: props.name,
-              value: props.modelValue,
-            }),
-            // 选择组件
-            h(useTimePicker ? ElTimePicker : ElDatePicker, {
-              modelValue: props.modelValue,
-              "onUpdate:modelValue": handleValueUpdate,
-              type: dateType.value,
-              format: finalFormat.value,
-              "value-format": finalFormat.value,
-              clearable: true,
-              placeholder: props.placeholder,
-              class: "custom-date-picker", // 用于自定义样式
-              "time-arrow-control": props.type === "datetime", // 修改这里
-              size: "large", // 添加这一行,改为 large 尺寸
-              style: { width: "100%" },
-              "prefix-icon": h(SsFormIcon, { class: "form-icon-time" }),
-            }),
-          ]);
-    },
-  };
-  // ss-icon 图标
-  const SsIcon = {
-    name: "SsIcon",
-    props: {
-      name: { type: String, required: true },
-      size: { type: [Number, String], default: 16 },
-      unit: { type: String, default: "px" },
-      color: String,
-      type: {
-        type: String,
-        default: ssIcon.name,
-        validator: function (value) {
-          return [ssIcon, commonIcon].some((icon) => icon.name === value);
-        },
-      },
-    },
-    emits: ["update:modelValue", "input", "blur", "change"],
-    setup(props, { emit }) {
-      const useIconType = computed(() => {
-        return [ssIcon, commonIcon].find(
-            (iconConfig) => iconConfig.name === props.type
-        );
-      });
-      const iconName = computed(() => {
-        const iconConfig = useIconType.value; // 注意:使用 .value 来访问响应式引用的值
-        if (!iconConfig) {
-          console.error(`Icon type "${props.type}" not found.`);
-          return "";
-        }
-        const iconType = iconConfig.types[props.name];
-        if (!iconType) {
-          console.error(
-              `Icon name "${props.name}" not found in type "${props.type}".`
-          );
-          return "";
-        }
-        return `${iconConfig.prefix}${iconType}`;
-      });
-
-      // 类似地,你可以计算 fontFamily 和 style
-      const fontFamily = computed(() => {
-        return useIconType.value ? useIconType.value.family : "";
-      });
-      // console.log(iconName.value,fontFamily.value)
-      const style = computed(() => {
-        const sizeStyle = isNum(props.size)
-            ? `${props.size}${props.unit}`
-            : props.size;
-        const styleObj = {
-          fontSize: sizeStyle,
-          color: props.color || "",
-        };
-        return toStyleStr(styleObj);
-      });
-
-      // 使用渲染函数定义模板逻辑
-      return () =>
-          h("i", {
-            class: ["icon-container", iconName.value, fontFamily.value],
-            style: style.value,
-          });
-    },
-  };
-  // 通用icon
-  const SsCommonIcon = {
-    name: "SsCommonIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("i", {
-            class: props.class + " common-icon",
-          });
-    },
-  };
-  // 登录页icon
-  const SsLoginIcon = {
-    name: "SsLoginIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " login-icon",
-          });
-    },
-  };
-  // 弹窗icon
-  const SsDialogIcon = {
-    name: "SsDialogIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("i", {
-            class: props.class + " dialog-icon",
-          });
-    },
-  };
-  // 全局左侧导航图标组件
-  const SsNavIcon = {
-    name: "SsNavIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " nav-icon",
-          });
-    },
-  };
-  // 顶部工具栏图标组件
-  const SsHeaderIcon = {
-    name: "SsHeaderIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " header-icon",
-          });
-    },
-  };
-  // 全局菜单图标组件
-  const SsGolbalMenuIcon = {
-    name: "SsGolbalMenuIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " global-menu-icon",
-          });
-    },
-  };
-  // 全局查询列表卡片图标
-  const SsCartListIcon = {
-    name: "SsCartListIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " cart-list-icon",
-          });
-    },
-  };
-  // 全局底部工具栏图标组件
-  const SsQuickIcon = {
-    name: "SsQuickIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " quick-icon",
-          });
-    },
-  };
-  // 表单组件icon
-  const SsFormIcon = {
-    name: "SsFormIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " form-icon",
-          });
-    },
-  };
-  // 弹窗底部按钮icon
-  const SsBottomDivIcon = {
-    name: "SsBottomDivIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("div", {
-            class: props.class + " bottom-div-icon",
-          });
-    },
-  };
-  // editor组件icon
-  const SsEditorIcon = {
-    name: "SsEditorIcon",
-    props: {
-      class: {
-        type: String,
-        required: true,
-      },
-    },
-    setup(props) {
-      return () =>
-          h("i", {
-            class: props.class + " editor-icon",
-          });
-    },
-  };
-  // ss-validate校验器
-  const SsValidate = {
-    name: "SsValidate",
-    props: {
-      errMsg: { type: String },
-      textAlign: { type: String, default: "left" },
-      style: { type: Object, default: () => ({}) },
-    },
-    template: `<div class="validate-vline"></div>
-    <div class="validate-tip" :style="style">
-      <div class="tip" :style="{ textAlign: textAlign }">{{ errMsg }}</div>
-      <div class="tip-more" :style="{ textAlign: textAlign }">{{ errMsg }}</div>
-    </div>`,
-  };
-  // ss-onoffbutton-array 多选按钮 数组形式
-  const SsOnoffbuttonArray = {
-    name: "SsOnoffbuttonArray",
-    props: {
-      name: {
-        type: String,
-        required: true,
-      },
-      opt: {
-        type: Array,
-        default: () => [],
-      },
-      defaultValue: [String, Number, Array],
-      modelValue: [String, Number, Array],
-      multiple: {
-        // 新增多选模式属性
-        type: Boolean,
-        default: false,
-      },
-    },
-    emits: ["update:modelValue"], // 允许更新 v-model 绑定的值
-    setup(props, { emit }) {
-      console.log("多选按钮", props.opt);
-      // 使用数组来存储选中值
-      const checkedValue = ref(
-          props.multiple
-              ? Array.isArray(props.defaultValue)
-                  ? props.defaultValue
-                  : []
-              : props.defaultValue
-      );
-      const errMsg = ref(props.errTip);
-
-      // 生成icon名字
-      const genIconName = (itemValue) => {
-        if (props.multiple) {
-          return checkedValue.value.includes(itemValue)
-              ? "form-icon-onoffbutton-checked"
-              : "form-icon-onoffbutton-unchecked";
-        }
-        return checkedValue.value === itemValue
-            ? "form-icon-onoffbutton-checked"
-            : "form-icon-onoffbutton-unchecked";
-      };
-      // 选中项
-      const selectItem = (value) => {
-        if (props.multiple) {
-          // 多选模式
-          const index = checkedValue.value.indexOf(value);
-          if (index === -1) {
-            checkedValue.value = [...checkedValue.value, value];
-          } else {
-            checkedValue.value = checkedValue.value.filter((v) => v !== value);
-          }
-        } else {
-          // 单选模式
-          checkedValue.value = value;
-        }
-
-        emit("update:modelValue", checkedValue.value);
-        nextTick(() => {
-          // 触发验证
-          if (window.ssVm) {
-            window.ssVm.validateField(props.name);
-          }
-        });
-      };
-
-      return { checkedValue, genIconName, selectItem };
-    },
-    // 使用渲染函数定义模板逻辑
-    render() {
-      const SsFormIcon = resolveComponent("ss-form-icon");
-      return h("div", { class: "radio-container" }, [
-        // 根据情况创建 input
-        this.multiple
-            ? this.checkedValue.length
-                ? // 多选且有选中值:为选中项创建 input
-                this.checkedValue.map((value) =>
-                    h("input", {
-                      type: "checkbox",
-                      name: this.name,
-                      value: value,
-                      checked: true,
-                      style: { display: "none" },
-                    })
-                )
-                : // 多选但没有选中值:创建一个空值 input
-                h("input", {
-                  type: "hidden",
-                  name: this.name,
-                  value: "",
-                })
-            : // 单选模式:创建一个 input
-            h("input", {
-              type: "hidden",
-              name: this.name,
-              value: this.checkedValue || "",
-            }),
-
-        this.opt.map((item, i) =>
-            h(
-                "div",
-                {
-                  key: i,
-                  class: {
-                    checked: this.multiple
-                        ? this.checkedValue.includes(item.value)
-                        : this.checkedValue === item.value,
-                  },
-                  style: { width: item.width },
-                  onClick: () => this.selectItem(item.value),
-                },
-                [
-                  h("span", null, item.label),
-                  h("div", { class: "mark" }, [
-                    h(SsFormIcon, {
-                      class: this.genIconName(item.value),
-                    }),
-                  ]),
-                ]
-            )
-        ),
-      ]);
-    },
-  };
-
-  // ss-onoffbutton 一个按钮
-  const SsOnoffbutton = {
-    name: "SsOnoffbutton",
-    props: {
-      name: {
-        type: String,
-        required: true,
-      },
-      label: {
-        type: String,
-        required: true,
-      },
-      value: {
-        type: [String, Number],
-        required: true,
-      },
-      width: {
-        type: String,
-        default: "",
-      },
-      modelValue: [String, Number, Array],
-      multiple: {
-        type: Boolean,
-        default: false,
-      },
-    },
-    emits: ["update:modelValue"],
-
-    setup(props, { emit }) {
-      const parseModelValue = (val) => {
-        if (!val) return [];
-        // 如果以逗号开头,去掉开头的逗号
-        const cleanValue = val.toString().replace(/^,+/, "");
-        if (cleanValue.includes("|")) {
-          return cleanValue.split("|");
-        }
-        if (cleanValue.includes(",")) {
-          return cleanValue.split(",");
-        }
-        return [cleanValue];
-      };
-      // 判断当前按钮是否选中
-      const isChecked = computed(() => {
-        if (props.multiple) {
-          const currentValue = parseModelValue(props.modelValue);
-          return currentValue.includes(props.value.toString());
-
-          // return Array.isArray(props.modelValue) && props.modelValue.includes(props.value);
-        }
-        return props.modelValue === props.value;
-      });
-
-      // 切换选中状态
-      const toggleSelect = () => {
-        if (props.multiple) {
-          const currentValue = parseModelValue(props.modelValue);
-          const index = currentValue.indexOf(props.value.toString());
-          let newValue;
-          if (index === -1) {
-            newValue = [...currentValue, props.value];
-          } else {
-            newValue = currentValue.filter((v) => v !== props.value.toString());
-          }
-          emit("update:modelValue", newValue.join(","));
-        } else {
-          emit("update:modelValue", props.value);
-        }
-
-        nextTick(() => {
-          // 触发验证
-          if (window.ssVm) {
-            window.ssVm.validateField(props.name);
-          }
-        });
-      };
-
-      return { isChecked, toggleSelect };
-    },
-
-    render() {
-      const SsFormIcon = resolveComponent("ss-form-icon");
-      return h("div", { class: "radio-container2" }, [
-        // 隐藏的表单元素
-        this.multiple
-            ? h("input", {
-              type: "hidden",
-              name: `${this.name}`, // 多选模式下使用数组形式的 name
-              value: this.isChecked ? this.value : "",
-            })
-            : this.isChecked &&
-            h("input", {
-              // 只有当前按钮被选中时才创建 input
-              type: "hidden",
-              name: this.name,
-              value: this.value,
-            }),
-
-        // 按钮显示
-        h(
-            "div",
-            {
-              class: { checked: this.isChecked },
-              style: { width: this.width },
-              onClick: this.toggleSelect,
-            },
-            [
-              h("span", null, this.label),
-              h("div", { class: "mark" }, [
-                h(SsFormIcon, {
-                  class: this.isChecked
-                      ? "form-icon-onoffbutton-checked"
-                      : "form-icon-onoffbutton-unchecked",
-                }),
-              ]),
-            ]
-        ),
-      ]);
-    },
-  };
-
-  // ss-textarea
-  const SsTextarea = {
-    name: "SsTextarea",
-    props: {
-      name: {
-        type: String,
-        required: true,
-      },
-      placeholder: {
-        type: String,
-        default: "请输入",
-      },
-      defaultValue: [String, Number],
-      modelValue: [String, Number],
-    },
-    emits: ["update:modelValue"],
-    setup(props, { emit }) {
-      const inputValue = ref(props.modelValue || props.defaultValue || "");
-
-      // 监听 modelValue 变化
-      watch(
-          () => props.modelValue,
-          (newVal) => {
-            inputValue.value = newVal;
-          }
-      );
-
-      // 输入事件处理
-      const onInput = (event) => {
-        const newValue = event.target.value;
-        inputValue.value = newValue;
-        emit("update:modelValue", newValue);
-        // 触发验证
-        if (window.ssVm) {
-          window.ssVm.validateField(props.name);
-        }
-      };
-
-      // 失焦时验证
-      const onBlur = () => {
-        if (window.ssVm) {
-          window.ssVm.validateField(props.name);
-        }
-      };
-
-      return { inputValue, onInput, onBlur };
-    },
-    render() {
-      return h("div", { class: "textarea-container" }, [
-        h("div", { class: "textarea" }, [
-          // 添加隐藏的 input 用于验证
-          h("input", {
-            type: "hidden",
-            name: this.name,
-            value: this.inputValue || "",
-          }),
-          h("textarea", {
-            placeholder: this.placeholder,
-            value: this.inputValue,
-            onInput: this.onInput,
-            onBlur: this.onBlur,
-          }),
-        ]),
-      ]);
-    },
-  };
-  // ss-editor 富文本编辑器 基于Jodit
-  const SsEditor = {
-    name: "SsEditor",
-    props: {
-      modelValue: {
-        type: String,
-        default: "",
-      },
-      name: {
-        type: String,
-        default: "",
-      },
-      url: {
-        type: String,
-        default: "",
-      },
-      height: {
-        type: [Number, String],
-        default: 400,
-      },
-      placeholder: {
-        type: String,
-        default: "请输入内容",
-      },
-      readonly: {
-        type: Boolean,
-        default: false,
-      },
-      uploadUrl: {
-        type: String,
-        default: "/upload",
-      },
-      param: {
-        type: Object,
-        default: () => ({}),
-      },
-    },
-
-    emits: ["update:modelValue", "ready", "change"],
-
-    setup(props, { emit }) {
-      const SsEditorIcon = resolveComponent("SsEditorIcon");
-      const editorRef = ref(null);
-      let editorContent = '';//保存富文本编辑器里面的富文本内容
-      const uniqueId = "editor-" + Date.now();
-      const errMsg = Vue.ref("");
-      let fjid = ref(props.param.button.val);
-      let fjName = props.param.button.desc;
-      let mode = props.param.mode;
-      const validate = () => {
-        if (window.ssVm) {
-          const result = window.ssVm.validateField(props.name);
-          console.log("validate", window.ssVm.validateField(props.name));
-          errMsg.value = result.valid ? "" : result.message;
-        }
-      };
-      onMounted(() => {
-        validate();
-        const editor = Jodit.make(`#${uniqueId}`, {
-          height: props.height,
-          placeholder: props.placeholder,
-          readonly: props.readonly,
-          language: "zh_cn",
-          i18n: {
-            zh_cn: {
-              Link: "链接",
-              URL: "链接",
-              "No follow": "无跟踪",
-              "Class name": "类名",
-              Image: "图片",
-              File: "文件",
-              "Line height": "行高",
-              Alternative: "描述",
-              "Alternative text": "描述",
-              "Lower Alpha": "小写字母",
-              "Upper Alpha": "大写字母",
-              "Upper Roman": "大写罗马数字",
-              "Lower Roman": "小写罗马数字",
-              "Lower Greek": "小写希腊字母",
-              "Lower Letter": "小写字母",
-              "Upper Letter": "大写字母",
-            },
-          },
-          showXPathInStatusbar: false,
-          showCharsCounter: false,
-          showWordsCounter: false,
-          allowResizeY: false,
-          toolbarSticky: false,
-
-          statusbar: false,
-          uploader: {
-            url: props.uploadUrl,
-            format: "json",
-            method: "POST",
-            filesVariableName: function (i) {
-              return "imgs[" + i + "]";
-            },
-            headers: {
-              Accept: "application/json",
-            },
-            prepareData: function (formData) {
-              // 这里可以在发送前处理表单数据
-              return formData;
-            },
-            isSuccess: function (resp) {
-              console.log("isSuccess resp:", resp);
-              return resp.code === 0;
-            },
-            getMessage: function (resp) {
-              console.log("getMessage resp:", resp);
-              return resp.msg || "上传失败";
-            },
-            process: function (resp) {
-              console.log("process resp:", resp);
-              return resp.data.url;
-            },
-            error: function (e) {
-              console.error("上传失败:", e.message);
-            },
-            defaultHandlerSuccess: function (resp) {
-              console.log("上传成功:", resp);
-            },
-            defaultHandlerError: function (err) {
-              console.error("上传错误:", err);
-            },
-            contentType: function (requestData) {
-              // 可以根据需要修改 Content-Type
-              return false; // 让浏览器自动设置
-            },
-          },
-
-          // 自定义字体列表
-          controls: {
-            font: {
-              list: {
-                Arial: "Arial",
-                SimSun: "宋体",
-                SimHei: "黑体",
-                "Microsoft YaHei": "微软雅黑",
-                KaiTi: "楷体",
-                FangSong: "仿宋",
-                "Times New Roman": "Times New Roman",
-                "Courier New": "Courier New",
-              },
-            },
-            customLinkButton: {
-              name: "link",
-              tooltip: "附件",
-              exec: function (editor) {
-                // 按钮点击时的处理函数
-                console.log("附件点击了");
-                console.log("param", props.param);
-                console.log("cmsAddUrl",props.param.button.cmsAddUrl);
-
-                if (fjid.value == null || fjid.value == "") {
-                  $.ajax({
-                    type: "post",
-                    url: props.param.button.cmsAddUrl,
-                    async: false,
-                    data: {
-                      name: "fjid",
-                      ssNrObjName: "sh",
-                      ssNrObjId: "",
-                    },
-                    success: function (_fjid) {
-                      console.log("cmsAddUrl success", _fjid);
-                      fjid.value = _fjid;
-                    },
-                  });
-                }
-                var str =
-                    "&nrid=T-" +
-                    fjid.value +
-                    "&objectId=" +
-                    fjid.value +
-                    "&objectName=" +
-                    fjName +
-                    "&callback=" +
-                    (window["fjidCallbackName"] || "");
-                console.log("str", str);
-                SS.openDialog({
-                  src: props.param.button.cmsUpdUrl + str,
-                  headerTitle: "编辑",
-                  width: 900,
-                  high: 664,
-                  zIndex:51
-                });
-                // ss.display.showComponent({
-                //   show: ["wdDialog"],
-                //   url: props.param.button.cmsUpdUrl + str,
-                //   title: "编辑",
-                //   width: 900,
-                //   high: 664,
-                // });
-              },
-            },
-          },
-          toolbarAdaptive: true,
-          buttons: [
-            "fullsize",
-            "bold",
-            "italic",
-            "underline",
-            "strikethrough",
-            "eraser",
-            "|",
-            "font",
-            "fontsize",
-            "brush",
-            "paragraph",
-            "|",
-            "left",
-            "center",
-            "right",
-            "justify",
-            "|",
-            "ul",
-            "ol",
-            "indent",
-            "outdent",
-            "|",
-            "image",
-            "table",
-            "customLinkButton",
-            "print",
-            "|",
-            "undo",
-            "redo",
-            "find",
-          ],
-          // 中等宽度时显示的按钮
-          buttonsMD: [
-            "fullsize",
-            "bold",
-            "italic",
-            "underline",
-            "strikethrough",
-            "eraser",
-            "|",
-            "font",
-            "fontsize",
-            "brush",
-            "paragraph",
-            "|",
-            "font",
-            "fontsize",
-            "|",
-            "left",
-            "center",
-            "right",
-            "justify",
-            "|",
-            "image",
-            "customLinkButton",
-            "|",
-            "dots", // 其余按钮会自动进入 dots 菜单
-          ],
-
-          // 小屏幕时显示的按钮
-          buttonsSM: ["fullsize", "bold", "italic", "|", "image", "|", "dots"],
-
-          // 超小屏幕时显示的按钮
-          buttonsXS: ["fullsize", "bold", "|", "dots"],
-          // 设置响应式断点
-          sizeLG: 1024, // 大屏幕
-          sizeMD: 768, // 中等屏幕
-          sizeSM: 576, // 小屏幕
-          // 自定义图标
-          getIcon: function (name, clearName) {
-            // 定义图标映射
-            const iconMap = {
-              bold: "editor-icon-bold",
-              italic: "editor-icon-italic",
-              underline: "editor-icon-underline",
-              strikethrough: "editor-icon-strikethrough",
-              eraser: "editor-icon-eraser",
-              copyformat: "editor-icon-copyformat",
-              font: "editor-icon-font",
-              fontsize: "editor-icon-fontsize",
-              brush: "editor-icon-brush",
-              paragraph: "editor-icon-paragraph",
-              left: "editor-icon-align-left",
-              center: "editor-icon-align-center",
-              right: "editor-icon-align-right",
-              justify: "editor-icon-align-justify",
-              ul: "editor-icon-ul",
-              ol: "editor-icon-ol",
-              indent: "editor-icon-indent",
-              outdent: "editor-icon-outdent",
-              image: "editor-icon-image",
-              file: "editor-icon-file",
-              video: "editor-icon-video",
-              table: "editor-icon-table",
-              link: "editor-icon-link",
-              source: "editor-icon-source",
-              eye: "editor-icon-preview",
-              fullsize: "editor-icon-fullsize",
-              shrink: "editor-icon-fullsize-exit", // 添加退出全屏图标
-
-              print: "editor-icon-print",
-              undo: "editor-icon-undo",
-              redo: "editor-icon-redo",
-              search: "editor-icon-find",
-              selectall: "editor-icon-selectall",
-            };
-            // 获取对应的图标类名
-            const iconClass = iconMap[clearName] || iconMap[name];
-
-            if (iconClass) {
-              // 返回带有我们自定义图标类的 span 元素
-              return `<span class="editor-icon ${iconClass}"></span>`;
-            }
-
-            return null;
-          },
-        });
-
-
-
-        // 设置初始值
-        editor.value = editorContent;
-        // editor.value = props.modelValue;
-
-        // 监听变化
-        editor.events.on("change", () => {
-          // emit("update:modelValue", editor.value);
-          editorContent = editor.value;
-          // alert('editorContent:'+editorContent);
-          let contentElements = document.getElementsByName(props.name.replace(/wj$/, "") + "Edit");
-          if(contentElements.length>0){
-            contentElements[0].value = editorContent;
-          }
-          emit("change", editor.value);
-          setTimeout(() => {
-            validate();
-          }, 50);
-        });
-
-        // 保存编辑器实例
-        editorRef.value = editor;
-
-        emit("ready", editor);
-
-        //回显编辑器富文本文件
-        if (props.url ) {
-          const params = new URLSearchParams();
-
-        if(mode)
-          params.append("mode", mode);
-
-          if(props.modelValue)
-            params.append("path", props.modelValue);
-
-          // alert('props.url:'+props.url+',props.modelValue:'+props.modelValue);
-
-          axios
-              .post(props.url, params, {
-                headers: {
-                  "Content-Type": "application/x-www-form-urlencoded", // 必须手动设置!
-                },
-              })
-              .then((response) => {
-                // alert(JSON.stringify(response.data));
-
-                if ("timeout" == response.data.statusText) {
-                  alert("网络超时!");
-                  return;
-                }
-
-                let content = response.data.content;
-                if (content) {
-                  // editor.value = content;
-                  editorRef.value.value = content;
-                  editorContent = content;
-                  // alert('editor.value:'+editor.value)
-                }
-
-                let filePath = response.data.path;
-                // alert('response.data:'+JSON.stringify(response.data));
-                if(filePath){
-                  props.modelValue = filePath;
-                  emit("update:modelValue", filePath);
-                }
-              });
-        }
-      });
-
-      // 监听值变化
-      watch(
-          // () => props.modelValue,
-          () => editorContent,
-          (newValue) => {
-            if (editorRef.value && newValue !== editorRef.value.value) {
-              editorRef.value.value = newValue || "";
-            }
-          }
-      );
-
-      // 监听只读状态变化
-      watch(
-          () => props.readonly,
-          (newValue) => {
-            if (editorRef.value) {
-              editorRef.value.setReadOnly(newValue);
-            }
-          }
-      );
-
-      // 组件销毁时清理
-      onBeforeUnmount(() => {
-        if (editorRef.value) {
-          editorRef.value.destruct();
-        }
-      });
-
-      return () =>
-          h("div", { class: "ss-editor-container" }, [
-            fjid.value &&
-            h("input", {
-              type: "hidden",
-              name: "fjid",
-              value: fjid.value,
-            }),
-            h("input", {
-              type: "hidden",
-              name: props.name.replace(/wj$/, "") + "Edit",
-              value: editorContent
-              // value: props.modelValue,
-            }),
-            h("input", {
-              type: "hidden",
-              name: props.name.replace(/wj$/, "") + "wj",
-              value: props.modelValue
-              // value: props.url
-            }),
-            h("input", { type: "hidden", name: "ueditorpath", value: "mswj" }),
-            h("textarea", { id: uniqueId }),
-          ]);
-    },
-  };
-  // 弹窗右边图标
-  const SsFullStyleHeader = {
-    name: "SsFullStyleHeader",
-    props: {
-      title: {
-        type: String,
-        default: "标题",
-      },
-    },
-    emits: ["close"],
-    setup(props, { emit }) {
-      // console.log(props.title)
-      const onClose = () => {
-        emit("close");
-      };
-      const SsIcon = resolveComponent("ss-icon");
-      return () =>
-          h("div", { class: "header-container" }, [
-            h("div", { class: "title" }, props.title),
-            h("div", { class: "handle-bar" }, [
-              h("div", { class: "left-bar" }, [
-                h(SsDialogIcon, { class: "dialog-icon-download" }),
-                h(SsDialogIcon, { class: "dialog-icon-print" }),
-                h(SsDialogIcon, { class: "dialog-icon-setting" }),
-                h(SsDialogIcon, { class: "dialog-icon-collect" }),
-                h(SsDialogIcon, { class: "dialog-icon-help" }),
-                h(SsDialogIcon, { class: "dialog-icon-full-screen" }),
-                h(SsDialogIcon, { class: "dialog-icon-lock" }),
-              ]),
-              h("div", { class: "close-bar", onClick: onClose }, [
-                h(SsDialogIcon, { class: "dialog-icon-close" }),
-              ]),
-            ]),
-          ]);
-    },
-  };
-  // ss-dialog弹窗
-  const SsDialog = {
-    name: "SsDialog",
-    props: {
-      src: {
-        type: String,
-      },
-      headerTitle: {
-        type: String,
-        // required: true,
-        default: "弹窗",
-      },
-      width: {
-        type: String,
-        default: "1400",
-      },
-      height: {
-        type: String,
-        default: "600",
-      },
-      params: {
-        type: Object,
-        default: () => ({}),
-      },
-      zIndex: {
-        type: Number,
-        default: 1000,
-      },
-    },
-    emits: ["close"],
-    setup(props, { slots, emit }) {
-      // 关闭窗口方法
-      const onClose = () => {
-        emit("close");
-      };
-      const showHeader = ref(true);
-      const headerVisible = ref(false);
-      const popupHieght = ref(props.height);
-      // 状态:存储位置信息
-      const position = reactive({
-        // 页面居中
-        x: (window.innerWidth - props.width) / 2,
-        y: (window.innerHeight - popupHieght.value) / 2,
-        isDragging: false,
-        offsetX: 0,
-        offsetY: 0,
-      });
-      // 鼠标按下时设置起始坐标并开始拖拽
-      const startDrag = (event) => {
-        position.isDragging = true;
-        position.offsetX = event.clientX - position.x;
-        position.offsetY = event.clientY - position.y;
-      };
-      // 鼠标移动时更新位置
-      const onDrag = (event) => {
-        if (position.isDragging) {
-          position.x = event.clientX - position.offsetX;
-          position.y = event.clientY - position.offsetY;
-        }
-      };
-      // 鼠标放开时结束拖拽
-      const endDrag = () => {
-        position.isDragging = false;
-      };
-      // 监听来自 iframe 的消息
-      const handleMessage = (event) => {
-        //  顶天立地
-        if (event.data && typeof event.data.hasScrollBar !== "undefined") {
-          if (event.data.hasScrollBar) {
-            //   console.log(event);
-            position.y = 10;
-            showHeader.value = false;
-            headerVisible.value = true;
-            popupHieght.value = window.innerHeight - 20;
-            //   console.log(popupHieght.value);
-            document.querySelector(".body").style.height = "100%";
-            document.querySelector(".body").style.paddingTop = "30px";
-            document.querySelector(".header-container ").style.position =
-                "absolute";
-            document.querySelector(".header-container ").style.zIndex = "10";
-          }
-        }
-      };
-      // 鼠标移入关闭按钮区域时显示头部
-      const onMouseEnterCloseButton = () => {
-        headerVisible.value = false;
-      };
-      // 鼠标移出关闭按钮区域时隐藏头部
-      const onMouseLeaveCloseButton = () => {
-        headerVisible.value = true;
-      };
-      // 在组件挂载时添加全局事件监听器
-      Vue.onMounted(() => {
-        // 如果传过来的高度大于窗口高度,则设置为窗口高度减去20 否则保持传过来的高度
-        popupHieght.value =
-            popupHieght.value > window.innerHeight
-                ? window.innerHeight - 20
-                : popupHieght.value;
-        const container = document.querySelector(".header-container");
-        if (container) {
-          container.addEventListener("mousedown", startDrag);
-        }
-        document.addEventListener("mousemove", onDrag);
-        document.addEventListener("mouseup", endDrag);
-        window.addEventListener("message", handleMessage);
-      });
-
-      // 在组件卸载时移除全局事件监听器
-      Vue.onUnmounted(() => {
-        document.removeEventListener("mousemove", onDrag);
-        document.removeEventListener("mouseup", endDrag);
-        window.removeEventListener("message", handleMessage);
-      });
-      const SsMark = resolveComponent("ss-mark");
-      const SsFullStyleHeader = resolveComponent("ss-full-style-header");
-      // render函数定义组件结构
-      return () =>
-          h(
-              Teleport,
-              { to: "body" }, // 使用 Teleport 将弹窗内容挂载到 body
-              h(SsMark, { }, [
-                h(
-                    "div",
-                    {
-                      class: "popup-container",
-                      style: {
-                        position: "absolute",
-                        left: `${position.x}px`,
-                        top: `${position.y}px`,
-                        width: props.width + "px",
-                        height: popupHieght.value + "px",
-                        zIndex: props.zIndex, // 确保弹窗在最上层
-                      },
-                    },
-                    [
-                      h(SsFullStyleHeader, {
-                        class: "header",
-                        title: props.headerTitle,
-                        onClose: onClose,
-                        onMousedown: startDrag, // 绑定拖动事件
-                        onMouseUp: endDrag,
-                        ...(!showHeader.value && {
-                          onMouseenter: onMouseEnterCloseButton,
-                          onMouseleave: onMouseLeaveCloseButton,
-                        }),
-                        style: {
-                          cursor: position.isDragging ? "grabbing" : "grab",
-                          visibility: headerVisible.value ? "hidden" : "visible",
-                        },
-                      }),
-                      h(
-                          "div",
-                          {
-                            class: "body",
-                            style: {},
-                          },
-                          [
-                            h("iframe", {
-                              src: props.src,
-                              frameborder: 0,
-                              style: { width: "100%", height: "100%" },
-                            }),
-                          ]
-                      ),
-                      headerVisible.value &&
-                      h("div", {
-                        class: "close-button",
-
-                        onMouseenter: onMouseEnterCloseButton,
-                        onMouseleave: onMouseLeaveCloseButton,
-                        style: {
-                          position: "absolute",
-                          top: "0",
-                          right: "0",
-                          // background: 'black',
-                          width: "60px",
-                          height: "60px",
-                          cursor: "pointer",
-                        },
-                      }),
-                    ]
-                ),
-              ])
-          );
-    },
-  };
-  // ss-mark遮罩层
-  const SsMark = {
-    name: "SsMark",
-
-    setup(props, { slots, emit }) {
-      return () =>
-          h("div", { class: "dialog-container" }, [
-            h("div", { class: "mark-content" }, [
-              h("div", { class: "dialog-contianer" }, [
-                slots.default ? slots.default() : "",
-              ]),
-            ]),
-          ]);
-    },
-  };
-  // ss-bottom-button 底部按钮
-  const SsBottomButton = {
-    name: "SsBottomButton",
-    props: {
-      text: {
-        type: String,
-        required: true,
-      },
-      type: {
-        type: String,
-        default: "button",
-      },
-      iconClass: {
-        type: String,
-      },
-      class: {
-        type: String,
-        default: "",
-      },
-      onclick: {
-        type: [Function, String],
-        default: null,
-      },
-    },
-    setup(props, { emit }) {
-      const SsBottomDivIcon = Vue.resolveComponent("ss-bottom-div-icon");
-      return () =>
-          h(
-              "button",
-              {
-                class: props.class,
-                onClick: (e) => {
-                  e.stopPropagation();
-                  if (props.onclick) {
-                    // 如果是函数直接调用
-                    if (typeof props.onclick === "function") {
-                      props.onclick(e);
-                    } else if (typeof props.onclick === "string") {
-                      // 如果是字符串,使用直接的方法执行
-                      // 临时存储按钮元素到全局变量
-                      window.__ss_current_button = e.currentTarget;
-
-                      // 直接执行代码,使用eval以保留原始上下文
-                      try {
-                        eval(props.onclick);
-                      } finally {
-                        // 清理全局变量
-                        delete window.__ss_current_button;
-                      }
-                    }
-                  }
-                },
-                type: props.type,
-              },
-              [
-                h("span", null, [
-                  h(SsBottomDivIcon, {
-                    class: props.iconClass,
-                  }),
-                ]),
-                h("span", null, props.text),
-              ]
-          );
-    },
-  };
-  // ss-search搜索框
-  const SsSearch = {
-    name: "SsSearch",
-    props: {
-      theme: {
-        type: String,
-        default: "light",
-        validator: function (value) {
-          return ["dark", "light"].includes(value);
-        },
-      },
-      placeholder: {
-        type: String,
-        default: "请输入搜索条件",
-      },
-    },
-    setup(props, { emit }) {
-      const onClick = () => {
-        console.log("Search clicked");
-        emit("click");
-      };
-      const SsIcon = Vue.resolveComponent("ss-icon");
-      return () =>
-          Vue.h(
-              "div",
-              {
-                class: ["search-container", props.theme],
-                onClick: onClick,
-              },
-              [
-                Vue.h("input", {
-                  placeholder: props.placeholder,
-                  disabled: true,
-                }),
-                Vue.h(SsIcon, {
-                  name: "search-result",
-                  size: "20px",
-                }),
-              ]
-          );
-    },
-  };
-  // ss-cart-item 菜单页面的卡片 左右结构
-  const SsCartItem = {
-    name: "SsCartItem",
-    props: {
-      active: Boolean,
-      item: {
-        type: Object,
-        default: () => ({
-          thumb: "images/example/project-img.png",
-          title: "广州(国际)科技成果转化天河基地专",
-          description: "佳能中国广州分公司",
-          all: 50,
-          finish: 5,
-        }),
-      },
-    },
-    setup(props, { emit }) {
-      const item = props.item;
-
-      const itemWidth = Vue.computed(() => {
-        const containerWidth =
-            document.body.clientWidth || document.body.scrollWidth - 520;
-        const halfWidth = containerWidth / 2;
-        if (halfWidth < 480) {
-          return Math.min(containerWidth, 702) + "px";
-        } else {
-          return Math.min(halfWidth, 702) + "px";
-        }
-      });
-
-      const onItemClick = (e) => {
-        emit("click", e);
-      };
-
-      return {
-        item,
-        itemWidth,
-        onItemClick,
-      };
-    },
-    render() {
-      const SsIcon = Vue.resolveComponent("ss-icon");
-      return Vue.h(
-          "div",
-          {
-            class: { "item-container": true, active: this.active },
-            onClick: this.onItemClick,
-            style: { width: this.itemWidth },
-          },
-          [
-            Vue.h("div", { class: "header" }, [
-              Vue.h(SsIcon, { name: "setting", size: "20px" }),
-            ]),
-            Vue.h("div", { class: "body" }, [
-              Vue.h("div", { class: "left" }, [
-                Vue.h("img", {
-                  src: this.item.thumb,
-                  alt: "Thumbnail",
-                  class: "imgUnHandle",
-                  style: { "object-fit": "cover", width: "100%", height: "100%" },
-                }),
-              ]),
-              Vue.h("div", { class: "right" }, [
-                Vue.h("div", { class: "title" }, this.item.title),
-                Vue.h("div", { class: "desc" }, this.item.description),
-                Vue.h("div", { class: "progress" }, [
-                  Vue.h(
-                      "div",
-                      {
-                        style: {
-                          width: `${(this.item.finish / this.item.all) * 100}%`,
-                        },
-                      },
-                      [Vue.h("div", `${this.item.finish}/${this.item.all}`)]
-                  ),
-                ]),
-              ]),
-            ]),
-          ]
-      );
-    },
-  };
-  // ss-cart-item2 菜单页面的卡片 上下结构
-  const SsCartItem2 = {
-    name: "SsCartItem2",
-    props: {
-      active: Boolean,
-      item: {
-        type: Object,
-        default: () => ({
-          thumb: "images/example/project-img.png",
-          title: "广州(国际)科技成果转化天河基地专",
-          description: "佳能中国广州分公司",
-          all: 50,
-          finish: 5,
-        }),
-      },
-    },
-    setup(props, { emit }) {
-      const item = props.item;
-      const itemWidth = Vue.computed(() => {
-        const containerWidth =
-            document.body.clientWidth || document.body.scrollWidth - 520;
-        const halfWidth = containerWidth / 2;
-        if (halfWidth < 480) {
-          return Math.min(containerWidth, 702) + "px";
-        } else {
-          return Math.min(halfWidth, 702) + "px";
-        }
-      });
-
-      const onItemClick = (e) => {
-        emit("click", e);
-      };
-
-      return {
-        item,
-        itemWidth,
-        onItemClick,
-      };
-    },
-
-    render() {
-      const SsIcon = Vue.resolveComponent("ss-icon");
-      return Vue.h(
-          "div",
-          {
-            class: { "item-container2": true, active: this.active },
-            onClick: this.onItemClick,
-            style: { width: this.itemWidth },
-          },
-          [
-            Vue.h("div", { class: "action-bar" }, [
-              Vue.h(SsIcon, { name: "setting", size: "20px" }),
-            ]),
-            Vue.h("div", { class: "header" }, [
-              Vue.h("div", { class: "title" }, `${this.item.title}`),
-            ]),
-            Vue.h("div", { class: "body" }, [
-              Vue.h("div", { class: "left" }, [
-                Vue.h("img", {
-                  src: this.item.thumb,
-                  alt: "Thumbnail",
-                  class: "imgUnHandle",
-                  style: { "object-fit": "cover", width: "100%", height: "100%" },
-                }),
-              ]),
-              Vue.h("div", { class: "right" }, [
-                Vue.h("div", { class: "content" }, this.item.description),
-                Vue.h("div", { class: "tip" }, [
-                  Vue.h("div", { class: "progress" }, [
-                    Vue.h(
-                        "div",
-                        {
-                          style: {
-                            width: `${(this.item.finish / this.item.all) * 100}%`,
-                          },
-                        },
-                        [Vue.h("div", `${this.item.finish}/${this.item.all}`)]
-                    ),
-                  ]),
-                ]),
-              ]),
-            ]),
-          ]
-      );
-    },
-  };
-  // ss-list-card 通用列表卡片
-  const SsListCard = {
-    name: "SsListCard",
-    props: {
-      item: {
-        type: Object,
-        required: true,
-      },
-    },
-    emits: ["click", "change"],
-    setup(props, { emit }) {
-      const item = props.item;
-      const itemWidth = Vue.computed(() => {
-        const containerWidth =
-            document.body.clientWidth || document.body.scrollWidth;
-        if (containerWidth > 1200) {
-          return "30%";
-        }
-        return "45%";
-      });
-      const onItemClick = (e) => {
-        // 清除所有类型卡片的 active 状态
-        const allListCards = document.querySelectorAll(
-            ".knowledge-item-container"
-        );
-        const allFolderCards = document.querySelectorAll(".ss-folder-list");
-
-        allListCards.forEach((card) => card.classList.remove("active"));
-        allFolderCards.forEach((card) => card.classList.remove("active"));
-
-        // 设置当前项的 active 状态
-        e.currentTarget.classList.add("active");
-        props.item.onclick();
-      };
-      const onItemChange = (e, icon, index) => {
-        e.stopPropagation(); // 阻止事件冒泡到卡片
-        props.item.buttons[0].onclick();
-        // emit("change", { item: props.item, icon, index });
-      };
-      return {
-        item,
-        itemWidth,
-        onItemClick,
-        onItemChange,
-      };
-    },
-
-    data() {
-      return {
-        showButtons: false,
-      };
-    },
-
-    render() {
-      const SsCartListIcon = Vue.resolveComponent("ss-cart-list-icon");
-      return Vue.h(
-          "div",
-          {
-            class: { "knowledge-item-container": true, active: this.item.active },
-            onClick: this.onItemClick,
-            style: { width: this.itemWidth },
-          },
-          [
-            this.item?.buttons?.length > 0 &&
-            Vue.h(
-                "div",
-                {
-                  class: "header",
-                  onMouseenter: () => (this.showButtons = true),
-                  onMouseleave: () => (this.showButtons = false),
-                  onClick: (e) => this.onItemChange(e, this.item.buttons[0], 0),
-                },
-                [
-                  // 只在有按钮时渲染设置图标
-                  // this.item?.buttons?.length > 0 &&
-                  Vue.h("div", {
-                    class: "cart-list-setting cart-list-icon",
-                    title: this.item?.buttons?.[0]?.title,
-                  }),
-
-                  // 鼠标移入时显示按钮列表,与图标同级
-                  // this.item?.buttons?.length > 0 &&
-                  this.showButtons &&
-                  this.item?.buttons?.length > 1 &&
-                  Vue.h(
-                      "div",
-                      {
-                        class: "cart-list-button-popup",
-                      },
-                      this.item.buttons.map((btn) =>
-                          Vue.h(
-                              "div",
-                              {
-                                onClick: (e) => {
-                                  e.stopPropagation();
-                                  btn.onclick?.();
-                                },
-                              },
-                              [
-                                // 如果有 class,显示对应的图标
-                                btn.class &&
-                                Vue.h(SsCartListIcon, {
-                                  class: [btn.class],
-                                }),
-                                // 显示按钮文本
-                                Vue.h("span", null, btn.title),
-                              ]
-                          )
-                      )
-                  ),
-                ]
-            ),
-
-            Vue.h("div", { class: "body" }, [
-              Vue.h("div", { class: "box-header" }, [
-                Vue.h("div", `${this.item.title}`),
-              ]),
-              Vue.h(
-                  "div",
-                  {
-                    class: !this.item.thumb ? "no-thumb box-body" : "box-body",
-                  },
-                  [
-                    this.item.thumb
-                        ? Vue.h("div", { class: "left" }, [
-                          Vue.h("img", {
-                            src: this.item.thumb,
-                            alt: "Thumbnail",
-                            class: "imgUnHandle",
-                            style: {
-                              "object-fit": "cover",
-                              width: "100%",
-                              height: "100%",
-                            },
-                          }),
-                        ])
-                        : null,
-                    Vue.h("div", { class: "right" }, [
-                      ...this.item.tags.map((tag) => {
-                        const [key, value] = Object.entries(tag)[0];
-                        return Vue.h(
-                            "div",
-                            {
-                              class: "title",
-                              title: `${key}: ${value}`,
-                            },
-                            `${key}: ${value}`
-                        );
-                      }),
-                    ]),
-                  ]
-              ),
-            ]),
-          ]
-      );
-    },
-  };
-  // ss-folder-card 文件夹卡片
-  const SsFolderCard = {
-    name: "SsFolderCard",
-    props: {
-      item: {
-        type: Object,
-        required: true,
-      },
-    },
-    data() {
-      return {
-        showButtons: false,
-      };
-    },
-    emits: ["click", "change"],
-    setup(props, { emit }) {
-      const item = props.item;
-      const showChildren = ref(false);
-      const eventBus = window.parent.sharedEventBus;
-
-      const itemWidth = Vue.computed(() => {
-        const containerWidth =
-            document.body.clientWidth || document.body.scrollWidth;
-        return containerWidth > 1200 ? "45%" : "90%";
-      });
-      onMounted(() => {
-        eventBus.subscribe("folderPath", (path) => {
-          const currentPath = path || [];
-          // 如果当前文件夹不在路径中,则销毁视图
-          if (
-              !currentPath.some((item) => item.folder.title === props.item.title)
-          ) {
-            showChildren.value = false;
-          }
-        });
-      });
-      const onItemClick = (e) => {
-        if (e && e.stopPropagation) {
-          e.stopPropagation();
-        }
-        // 单击只处理 active 状态
-        if (e && e.currentTarget) {
-          const allListCards = document.querySelectorAll(
-              ".knowledge-item-container"
-          );
-          const allFolderCards = document.querySelectorAll(".ss-folder-list");
-
-          allListCards.forEach((card) => card.classList.remove("active"));
-          allFolderCards.forEach((card) => card.classList.remove("active"));
-
-          e.currentTarget.classList.add("active");
-        } else {
-          // 如果是数据对象,需要找到对应的 DOM 元素
-          const allListCards = document.querySelectorAll(
-              ".knowledge-item-container"
-          );
-          const allFolderCards = document.querySelectorAll(".ss-folder-list");
-          allListCards.forEach((card) => card.classList.remove("active"));
-          allFolderCards.forEach((card) => card.classList.remove("active"));
-          // 找到标题匹配的文件夹元素
-          const targetFolder = Array.from(allFolderCards).find((card) =>
-              card.textContent.includes(e.title)
-          );
-
-          if (targetFolder) {
-            targetFolder.classList.add("active");
-          }
-        }
-        emit("click", item);
-      };
-      // 修改双击处理函数
-      const handleFolderDblClick = (folder, e) => {
-        if (e) e.stopPropagation();
-        if (folder.children?.length) {
-          showChildren.value = true;
-          const pathInfo = {
-            title: folder.title,
-            folder: folder,
-          };
-          const currentPath = eventBus.getState("folderPath") || [];
-          if (!currentPath.some((item) => item.title === folder.title)) {
-            eventBus.publish("folderPath", [...currentPath, pathInfo]);
-          }
-        }
-      };
-      const onItemChange = (e, icon, index) => {
-        e.stopPropagation();
-        props.item.buttons[0].onclick();
-        // emit("change", { item: props.item, icon, index });
-      };
-      return {
-        item,
-        itemWidth,
-        showChildren,
-        onItemClick,
-        onItemChange,
-        handleFolderDblClick,
-      };
-    },
-    render() {
-      const SsCartListIcon = Vue.resolveComponent("ss-cart-list-icon");
-      if (this.showChildren) {
-        return h(SsFolderCartView, {
-          folder: this.item,
-        });
-      }
-      return Vue.h(
-          "div",
-          {
-            class: { "ss-folder-list": true, active: this.item.active },
-            onClick: (e) => {
-              e.stopPropagation();
-              this.onItemClick(e);
-            },
-            onDblclick: (e) => this.handleFolderDblClick(this.item, e),
-            style: { width: this.itemWidth },
-          },
-          [
-            // 文件夹特有的装饰元素
-            Vue.h("div", { class: "ss-folder-list-trapezoid" }),
-            Vue.h("div", { class: "ss-folder-list-top-transparent" }),
-            Vue.h("div", { class: "ss-folder-list-top" }),
-            Vue.h("div", { class: "ss-folder-list-right" }),
-
-            // header 部分(按钮)
-            this.item?.buttons?.length > 0 &&
-            Vue.h(
-                "div",
-                {
-                  class: "header",
-                  onMouseenter: () => (this.showButtons = true),
-                  onMouseleave: () => (this.showButtons = false),
-                  onClick: (e) => this.onItemChange(e, this.item.buttons[0], 0),
-                },
-                [
-                  // this.item?.buttons?.length > 0 &&
-                  Vue.h("div", {
-                    class: "cart-list-setting cart-list-icon",
-                    title: this.item?.buttons?.[0]?.title,
-                  }),
-
-                  // this.item?.buttons?.length > 0 &&
-                  this.showButtons &&
-                  this.item?.buttons?.length > 1 &&
-                  Vue.h(
-                      "div",
-                      {
-                        class: "cart-list-button-popup",
-                      },
-                      this.item.buttons.map((btn) =>
-                          Vue.h(
-                              "div",
-                              {
-                                onClick: (e) => {
-                                  e.stopPropagation();
-                                  btn.onclick?.();
-                                },
-                              },
-                              [
-                                btn.class &&
-                                Vue.h(SsCartListIcon, {
-                                  class: [btn.class],
-                                }),
-                                Vue.h("span", null, btn.title),
-                              ]
-                          )
-                      )
-                  ),
-                ]
-            ),
-            // body 部分
-            Vue.h("div", { class: "body" }, [
-              Vue.h("div", { class: "box-header" }, [
-                Vue.h("div", null, this.item.title),
-              ]),
-              Vue.h(
-                  "div",
-                  {
-                    class: !this.item.thumb ? "no-thumb box-body" : "box-body",
-                  },
-                  [
-                    this.item.thumb
-                        ? Vue.h("div", { class: "left" }, [
-                          Vue.h("img", {
-                            src: this.item.thumb,
-                            alt: "Thumbnail",
-                            class: "imgUnHandle",
-                            style: {
-                              "object-fit": "cover",
-                              width: "100%",
-                              height: "100%",
-                            },
-                          }),
-                        ])
-                        : null,
-                    Vue.h("div", { class: "right" }, [
-                      ...this.item.tags.map((tag) => {
-                        const [key, value] = Object.entries(tag)[0];
-                        return Vue.h(
-                            "div",
-                            {
-                              class: "title",
-                              title: `${key}: ${value}`,
-                            },
-                            `${key}: ${value}`
-                        );
-                      }),
-                    ]),
-                  ]
-              ),
-            ]),
-          ]
-      );
-    },
-  };
-  // SsFolderCartView 组件 - 用于显示文件夹内容
-  const SsFolderCartView = {
-    name: "SsFolderCartView",
-    props: {
-      folder: {
-        type: Object,
-        required: true,
-      },
-    },
-    emits: ["click"],
-    setup(props, { emit }) {
-      const eventBus = window.parent.sharedEventBus;
-      const currentFolder = ref(props.folder);
-      const showChildren = ref(false);
-
-      const onItemClick = (e) => {
-        if (e && e.stopPropagation) {
-          e.stopPropagation();
-        }
-        // 单击只处理 active 状态
-        if (e && e.currentTarget) {
-          const allListCards = document.querySelectorAll(
-              ".knowledge-item-container"
-          );
-          const allFolderCards = document.querySelectorAll(".ss-folder-list");
-
-          allListCards.forEach((card) => card.classList.remove("active"));
-          allFolderCards.forEach((card) => card.classList.remove("active"));
-
-          e.currentTarget.classList.add("active");
-        } else {
-          // 如果是数据对象,需要找到对应的 DOM 元素
-          const allListCards = document.querySelectorAll(
-              ".knowledge-item-container"
-          );
-          const allFolderCards = document.querySelectorAll(".ss-folder-list");
-
-          allListCards.forEach((card) => card.classList.remove("active"));
-          allFolderCards.forEach((card) => card.classList.remove("active"));
-
-          // 找到标题匹配的文件夹元素
-          const targetFolder = Array.from(allFolderCards).find((card) =>
-              card.textContent.includes(e.title)
-          );
-
-          if (targetFolder) {
-            targetFolder.classList.add("active");
-          }
-        }
-        emit("click", props.folder);
-      };
-      const handleFolderDblClick = (folder, e) => {
-        if (e) e.stopPropagation();
-        if (folder.children?.length) {
-          showChildren.value = true;
-          const pathInfo = {
-            title: folder.title,
-            folder: folder,
-          };
-          const currentPath = eventBus.getState("folderPath") || [];
-          if (!currentPath.some((item) => item.title === folder.title)) {
-            eventBus.publish("folderPath", [...currentPath, pathInfo]);
-            currentFolder.value = folder;
-          }
-        }
-      };
-
-      const goBack = (targetFolder) => {
-        if (targetFolder === null) {
-          // 返回根目录
-          eventBus.publish("folderPath", []);
-        } else {
-          currentFolder.value = targetFolder;
-        }
-      };
-
-      return {
-        currentFolder,
-        showChildren,
-        onItemClick,
-        handleFolderDblClick,
-        goBack,
-      };
-    },
-
-    render() {
-      return h(
-          "div",
-          {
-            class: "page-container",
-            style: {
-              position: "fixed",
-              top: 0,
-              left: 0,
-              width: "100%",
-              height: "100%",
-              background: "var(--lightgray)",
-              padding: "20px 0",
-              zIndex: 1000,
-            },
-          },
-          [
-            // 搜索栏
-            h("div", { class: "search-bar" }, [
-              h("div", { class: "search-bar-contaienr" }, [
-                h(SsBreadcrumb, {
-                  level: {
-                    onBack: this.goBack,
-                  },
-                }),
-              ]),
-            ]),
-
-            // 内容区域
-            h(
-                "div",
-                {
-                  class: "content-area item-content-area",
-                  style: { gap: "20px" },
-                },
-                [
-                  ...(this.currentFolder.children || []).map((child, index) =>
-                      h(child.children ? SsFolderCard : SsListCard, {
-                        key: index,
-                        item: child,
-                        onClick: (e) => this.onItemClick(e),
-                        onDblclick: (e) => this.handleFolderDblClick(child, e),
-                      })
-                  ),
-                ]
-            ),
-          ]
-      );
-    },
-  };
-
-  // ss-page分页
-  const SsPage = {
-    name: "SsPage",
-    props: {
-      total: {
-        type: Number,
-        required: true,
-      },
-
-      size: {
-        type: Number,
-        default: 10,
-      },
-      page: {
-        type: Number,
-        default: 1,
-      },
-      onChange: {
-        type: Function,
-        default: () => {},
-      },
-    },
-    setup(props) {
-      const totalItems = ref(props.total); // 总条目数
-      const totalPages = ref(Math.ceil(props.total / props.size));
-      const currentPage = ref(props.page); // 当前页码
-
-      // 计算显示的信息
-      const pageInfo = ref(
-          `共${totalItems.value}条,第 ${currentPage.value}/${totalPages.value} 页`
-      );
-
-      // 上一页的逻辑
-      const goToPreviousPage = (e) => {
-        e.preventDefault(); // 阻止默认行为
-        if (currentPage.value > 1) {
-          currentPage.value -= 1;
-          updatePageInfo();
-          props.onChange?.({
-            pageNo: currentPage.value, // 当前页码
-            rowNumPer: props.size, // 每页条数
-            rowNum: props.total, // 总记录数
-          });
-        }
-      };
-
-      // 下一页的逻辑
-      const goToNextPage = (e) => {
-        e.preventDefault(); // 阻止默认行为
-        if (currentPage.value < totalPages.value) {
-          currentPage.value += 1;
-          updatePageInfo();
-          props.onChange?.({
-            pageNo: currentPage.value, // 当前页码
-            rowNumPer: props.size, // 每页条数
-            rowNum: props.total, // 总记录数
-          });
-        }
-      };
-
-      // 更新页码信息的函数
-      const updatePageInfo = () => {
-        pageInfo.value = `共${totalItems.value}条,第 ${currentPage.value}/${totalPages.value} 页`;
-      };
-
-      return {
-        pageInfo,
-        totalPages,
-        goToPreviousPage,
-        goToNextPage,
-      };
-    },
-
-    render(props, { slots, emit }) {
-      return Vue.h("div", { class: "pager-container" }, [
-        Vue.h("input", { type: "hidden", name: "rowNum", value: props.total }),
-        Vue.h("input", {
-          type: "hidden",
-          name: "rowNumPer",
-          value: props.size,
-        }),
-        Vue.h("input", {
-          type: "hidden",
-          name: "pageCount",
-          value: this.totalPages,
-        }),
-        Vue.h("input", { type: "hidden", name: "pageNo", value: props.page }),
-        Vue.h("div", { class: "pager-content" }, [
-          Vue.h("div", { class: "info" }, this.pageInfo),
-          Vue.h(
-              "div",
-              { class: "btn" },
-              Vue.h(
-                  "button",
-                  { onClick: (e) => this.goToPreviousPage(e) },
-                  "上一页"
-              )
-          ),
-          Vue.h(
-              "div",
-              { class: "btn" },
-              Vue.h("button", { onClick: (e) => this.goToNextPage(e) }, "下一页")
-          ),
-        ]),
-      ]);
-    },
-  };
-  // ss-right-info 一级页面右边栏
-  const SSRightInfo = {
-    name: "SSRightInfo",
-    setup() {
-      // 初始化响应式数据
-      const item = ref({
-        thumb: "images/example/project-img.png", // 更换为适合你项目的实际路径
-        title: "工业和信息化产业高质量发展资金",
-      });
-
-      return {
-        item,
-      };
-    },
-    render() {
-      return Vue.h("div", { class: "info-container" }, [
-        Vue.h("div", { class: "header" }, [
-          Vue.h("div", [
-            Vue.h("img", {
-              src: this.item.thumb,
-              class: "imgUnHandle",
-              style: { "object-fit": "cover", width: "100%", height: "100%" },
-            }), // 将 ImageViewer 替换为 img 标签
-          ]),
-          Vue.h("div", [Vue.h("div", this.item.title)]),
-        ]),
-        Vue.h("div", { class: "section-container" }, [
-          Vue.h("div", { class: "section" }, [
-            Vue.h("div", { class: "title" }, "合同"),
-            Vue.h("div", { class: "text" }, "合同总金额:42,399,320"),
-            Vue.h(
-                "div",
-                { class: "a" },
-                "《工业和信息化产业高质量发展资金补助合同》"
-            ),
-          ]),
-          Vue.h("div", { class: "section" }, [
-            Vue.h("div", { class: "title" }, "发票"),
-            Vue.h("div", { class: "text" }, "应开发票总额:42,399,320"),
-            Vue.h("div", { class: "text" }, "已开发票金额:17,235,345"),
-            Vue.h("div", { class: "text" }, "未开发票金额:25,163,975"),
-          ]),
-          Vue.h("div", { class: "section" }, [
-            Vue.h("div", { class: "title" }, "项目组成员"),
-            Vue.h("div", { class: "text" }, "我司:3人"),
-            Vue.h("div", { class: "text" }, "对方:2人"),
-            Vue.h("div", { class: "text" }, "项目负责人:张三"),
-          ]),
-          Vue.h("div", { class: "section" }, [
-            Vue.h("div", { class: "title" }, "采购"),
-            Vue.h("div", { class: "text" }, "总额:999,320"),
-            Vue.h("div", { class: "text" }, "已付金额:335,345"),
-            Vue.h("div", { class: "text" }, "未付金额:663,975"),
-          ]),
-        ]),
-      ]);
-    },
-  };
-  //
-  const SsSuccessPopup = {
-    name: "SsSuccessPopup",
-    props: {
-      right: {
-        type: String,
-        default: "20px",
-      },
-      bottom: {
-        type: String,
-        default: "calc(100% + 5px)",
-      },
-    },
-    setup(props, { expose }) {
-      // 响应式状态:是否可见
-      const visible = ref(false);
-
-      // 计算样式
-      const style = computed(() => {
-        return {
-          "--message-dialog-right": props.right,
-          "--message-dialog-bottom": props.bottom,
-        };
-      });
-
-      // 显示对话框的方法
-      const show = () => {
-        visible.value = true;
-      };
-
-      // 隐藏对话框的方法
-      const hide = () => {
-        visible.value = false;
-      };
-
-      // 将方法暴露给外部使用
-      expose({ show, hide });
-
-      // 返回渲染函数
-      return () => {
-        if (!visible.value) return null;
-        const SsIcon = resolveComponent("ss-icon");
-        return h(
-            "div",
-            {
-              class: "success-popup",
-              style: style.value,
-              onClick: (e) => e.stopPropagation(),
-            },
-            [
-              h("div", { class: "left" }, [
-                h("div", { class: "icon" }, [
-                  h(SsIcon, { name: "check", size: "36px" }),
-                ]),
-              ]),
-              h("div", { class: "right" }, [
-                h("div", { class: "title" }, "提交成功"),
-                h("div", { class: "desc" }, "您的信息已成功提交。"),
-              ]),
-            ]
-        );
-      };
-    },
-  };
-  const SsErrorDialog = {
-    name: "SsErrorDialog",
-    setup(props, { emit }) {
-      const visible = ref(false);
-
-      const style = computed(() => {
-        return {};
-      });
-
-      const show = () => {
-        visible.value = true;
-      };
-
-      const hide = () => {
-        visible.value = false;
-      };
-
-      const onBack = () => {
-        emit("back");
-        hide();
-      };
-
-      return {
-        visible,
-        style,
-        show,
-        hide,
-        onBack,
-      };
-    },
-    render() {
-      const SsIcon = resolveComponent("ss-icon");
-      return this.visible
-          ? h(
-              "div",
-              {
-                class: "errorDialog",
-                style: this.style,
-                onClick: (event) => event.stopPropagation(),
-              },
-              [
-                h("div", { class: "body" }, [
-                  h("div", { class: "left" }, [
-                    h("div", { class: "icon" }, [
-                      h(SsIcon, { name: "close", size: "36px" }),
-                    ]),
-                  ]),
-                  h("div", { class: "right" }, [
-                    h("div", { class: "title" }, "操作失败"),
-                    h("div", { class: "desc" }, "请点击返回以继续。"),
-                  ]),
-                ]),
-                h("div", { class: "footer" }, [
-                  h("div", { class: "left" }),
-                  h("div", { class: "right" }, [
-                    h(
-                        "div",
-                        {
-                          class: "btn",
-                          onClick: this.onBack,
-                        },
-                        [h(SsIcon, { name: "arrow-left-line" }), h("div", "返回")]
-                    ),
-                  ]),
-                ]),
-              ]
-          )
-          : null;
-    },
-  };
-  /**
-   * 审核链条
-   * @name ss-verify
-   * @param { Array } verify-list 审核节点列表
-   * @property { Array } verify-list 审核节点列表
-   * @example <ss-verify :verify-list="verifyList"></ss-verify>
-   * verify-list [
-   *    {
-   *        groupName: "",  // 群组名称
-   *        open: true, // 默认是否展开
-   *        children:[ //群组里的人员
-   *           {
-   *            thumb: "images/example/user-4.png", // 头像
-   *             name: "李丽思 ", // 姓名
-   *             role: "人事处处长",  // 角色
-   *             description: "同意。",  // 审核意见
-   *             time: "09:38 08/11", // 审核时间
-   *             video: false,  // false不显示/true显示 视频icon
-   *             link: false,  // false不显示/true显示 链接icon 后续应该是附件
-   *           }
-   *        ]
-   *    }
-   *  ]
-   */
-  const SsVerify = {
-    name: "SsVerify",
-    props: {
-      verifyList: {
-        type: Array,
-        required: true,
-      },
-    },
-    setup(props) {
-      const toggleOpen = (item) => {
-        item.open = !item.open;
-      };
-      onMounted(() => {
-        setTimeout(() => {
-          const lastOpenGroup = document.querySelector(".group-item-last-open");
-          console.log("lastOpenGroup", lastOpenGroup);
-          if (lastOpenGroup) {
-            const nodes = $(lastOpenGroup).find(".verify-node-container");
-            if (nodes.length) {
-              let totalHeight = 0;
-              const gudingHeight = 100;
-
-              if (nodes.length === 1) {
-                totalHeight = gudingHeight;
-              } else {
-                // 累加除最后一个节点外的所有节点高度
-                for (let i = 0; i < nodes.length - 1; i++) {
-                  totalHeight += $(nodes[i]).outerHeight();
-                }
-                totalHeight += gudingHeight;
-              }
-
-              console.log("节点信息:", {
-                节点总数: nodes.length,
-                计算后的高度: totalHeight,
-              });
-
-              lastOpenGroup.style.setProperty(
-                  "--group-line-height",
-                  `${totalHeight}px`
-              );
-            }
-          }
-        }, 0);
-      });
-      return {
-        toggleOpen,
-      };
-    },
-    render() {
-      const SsIcon = resolveComponent("ss-icon");
-      const SsCommonIcon = resolveComponent("ss-common-icon");
-      const SsVerifyNode = resolveComponent("ss-verify-node");
-      return h(
-          "div",
-          { class: "verify-nodes" },
-          this.verifyList.map((item, i) =>
-              h(
-                  "div",
-                  {
-                    key: i,
-                    class: {
-                      "group-item": true,
-                      "group-item-last-open":
-                          i === this.verifyList.length - 1 && item.open,
-                    },
-                  },
-                  [
-                    h(
-                        "div",
-                        {
-                          class: "group-item-title",
-                          onClick: () => this.toggleOpen(item),
-                        },
-                        [
-                          h("div", { class: "icon" }, [
-                            item.open
-                                ? h(SsCommonIcon, { class: "common-icon-folder-open" })
-                                : h(SsCommonIcon, { class: "common-icon-folder-close" }),
-                            h(
-                                "div",
-                                {
-                                  class: "num",
-                                  style: { top: item.open ? "60%" : "55%" },
-                                },
-                                item.children?.length || 0
-                            ),
-                          ]),
-                          h("div", { class: "name" }, item.groupName),
-                        ]
-                    ),
-                    item.open && item.children?.length > 0
-                        ? h(
-                            "div",
-                            { class: "group-item-children" },
-                            item.children.map((citem, j) =>
-                                h(SsVerifyNode, {
-                                  key: j,
-                                  item: citem,
-                                  // isGroup: i + 1 !== this.verifyList.length,
-                                  isGroup: true,
-                                })
-                            )
-                        )
-                        : null,
-                  ]
-              )
-          )
-      );
-    },
-  };
-
-  /**
-   * 审核页面的审核节点
-   * @name ss-verify-node
-   * @param {Object} item 审核节点信息
-   * @param {Boolean} isGroup 是否为分组节点
-   */
-  const SsVerifyNode = {
-    name: "SsVerifyNode",
-    props: {
-      item: {
-        type: Object,
-        required: true,
-      },
-      isGroup: {
-        type: Boolean,
-        default: false,
-      },
-    },
-    render() {
-      const SsIcon = resolveComponent("ss-icon");
-      const SsCommonIcon = resolveComponent("ss-common-icon");
-      return Vue.h("div", { class: "verify-node-container" }, [
-        Vue.h("div", { class: "info" }, [
-          Vue.h("div", { class: "avatar" }, [
-            Vue.h("img", {
-              src: this.item.thumb,
-              style: {
-                width: "50px",
-                height: "50px",
-                borderRadius: "50%",
-              },
-            }),
-          ]),
-          Vue.h("div", { class: "desc" }, [
-            Vue.h("div", this.item.name),
-            Vue.h("div", this.item.role),
-          ]),
-          Vue.h("div", { class: "link" }, [
-            Vue.h("div", [
-              this.item.video
-                  ? Vue.h(SsCommonIcon, { class: "common-icon-video" })
-                  : null,
-              this.item.link
-                  ? Vue.h(SsCommonIcon, {
-                    class: "common-icon-paper-clip",
-                  })
-                  : null,
-            ]),
-          ]),
-        ]),
-        Vue.h(
-            "div",
-            {
-              class: {
-                description: true,
-                link: this.isGroup,
-              },
-              attrs: { "data-num": "3" },
-            },
-            [Vue.h("div", this.item.description)]
-        ),
-        Vue.h("div", { class: "time" }, this.item.time),
-      ]);
-    },
-  };
-  /**
-   * 智能识别图片的左侧图片播放 可以放大缩小旋转图片
-   * @name ss-orc-img-box
-   * @param { Object } image-obj 包含图片的url, 和图片的名称
-   *
-   */
-  const SsOrcImgBox = {
-    name: "SsOrcImgBox",
-    props: {
-      imageObj: {
-        type: Object,
-        required: true,
-      },
-    },
-    setup(props) {
-      const zoom = ref(1);
-      const rotation = ref(0);
-      const containerWidth = ref(0);
-      const containerHeight = ref(0);
-      const container = ref(null);
-      const imgPosition = ref({ x: 0, y: 0 });
-      const isDragging = ref(false);
-      const lastMousePosition = ref({ x: 0, y: 0 });
-      const imgStyle = computed(() => ({
-        width: `${zoom.value * 100}%`,
-        height: `${zoom.value * 100}%`,
-        transform: `rotate(${rotation.value}deg) translate(${imgPosition.value.x}px, ${imgPosition.value.y}px)`,
-        transformOrigin: "center center",
-        cursor: isDragging.value ? "grabbing" : "grab",
-      }));
-
-      const resetZoom = () => {
-        zoom.value = 1;
-        rotation.value = rotation.value + 90;
-        imgPosition.value = { x: 0, y: 0 };
-      };
-
-      const handleRangeChange = (event) => {
-        const value = event.target.value / 50; // 0 到 100 映射到 0 到 2 的缩放
-        zoom.value = Math.max(value, 0.1); // 设置最小缩放值为 0.1
-      };
-      const updateImgBoxDimensions = () => {
-        if (container.value) {
-          containerWidth.value = container.value.clientWidth;
-          containerHeight.value = container.value.clientHeight;
-        }
-      };
-      const onMouseDown = (event) => {
-        isDragging.value = true;
-        lastMousePosition.value = { x: event.clientX, y: event.clientY };
-      };
-
-      const onMouseMove = (event) => {
-        if (isDragging.value) {
-          const dx = event.clientX - lastMousePosition.value.x;
-          const dy = event.clientY - lastMousePosition.value.y;
-
-          // 防止旋转后拖动的x,y反转
-          // 首先将当前旋转角度从度数转换为弧度,因为 JavaScript 的 Math 库使用弧度
-          const angle = rotation.value * (Math.PI / 180);
-          // 使用基本的二维旋转矩阵将原始位移 dx 和 dy 转换为旋转后的位移 rotatedDx 和 rotatedDy。
-          const rotatedDx = dx * Math.cos(angle) + dy * Math.sin(angle);
-          const rotatedDy = dy * Math.cos(angle) - dx * Math.sin(angle);
-
-          imgPosition.value = {
-            x: imgPosition.value.x + rotatedDx,
-            y: imgPosition.value.y + rotatedDy,
-          };
-          lastMousePosition.value = { x: event.clientX, y: event.clientY };
-        }
-      };
-
-      const onMouseUp = () => {
-        isDragging.value = false;
-      };
-      onMounted(() => {
-        nextTick(() => {
-          updateImgBoxDimensions();
-          window.addEventListener("resize", updateImgBoxDimensions);
-          window.addEventListener("mousemove", onMouseMove);
-          window.addEventListener("mouseup", onMouseUp);
-        });
-      });
-
-      return {
-        zoom,
-        rotation,
-        container,
-        imgStyle,
-        resetZoom,
-        handleRangeChange,
-        containerWidth,
-        containerHeight,
-        onMouseDown,
-        imgPosition,
-      };
-    },
-    render() {
-      const SsIcon = resolveComponent("ss-icon");
-      return h("div", { class: "ocr-img-box" }, [
-        h("div", { class: "img-bar" }, [
-          h("div", this.imageObj.name),
-          h("div", { class: "action-bar" }, [
-            h("div", { class: "ocr-img-range-box" }, [
-              h("input", {
-                type: "range",
-                min: 0,
-                max: 100,
-                value: this.zoom * 50, // 初始位置为50
-                onInput: this.handleRangeChange,
-              }),
-              h("span", { class: "line" }),
-            ]),
-            h(SsIcon, {
-              name: "reset",
-              size: "26px",
-              onClick: this.resetZoom,
-            }),
-          ]),
-        ]),
-        h("div", { class: "img-viewer", ref: "container" }, [
-          h(
-              "div",
-              {
-                class: "img-box",
-                style: {
-                  width: `${this.containerWidth}px`,
-                  height: `${this.containerHeight}px`,
-                  overflow: "hidden",
-                  position: "relative",
-                },
-              },
-              [
-                h("img", {
-                  src: this.imageObj.thumb,
-                  style: this.imgStyle,
-                  class: "zoomable-img",
-                  onMousedown: this.onMouseDown,
-                }),
-              ]
-          ),
-        ]),
-      ]);
-    },
-  };
-  // 搜索输入框组件
-  const SsSearchInput = {
-    name: "SsSearchInput",
-    props: {
-      name: String,
-      placeholder: String,
-      width: {
-        type: String,
-        default: "100px",
-      },
-      modelValue: String,
-    },
-    emits: ["update:modelValue", "search"],
-    setup(props, { emit }) {
-      const handleInput = (e) => {
-        emit("update:modelValue", e.target.value);
-      };
-      const handleKeyup = (e) => {
-        if (e.key === "Enter") {
-          emit("search");
-        }
-      };
-
-      return { handleInput, handleKeyup };
-    },
-    render() {
-      return h(
-          "div",
-          {
-            class: "input",
-            style: this.width ? { width: this.width } : undefined,
-          },
-          [
-            h("input", {
-              name: this.name,
-              placeholder: this.placeholder,
-              value: this.modelValue,
-              onInput: this.handleInput,
-              onKeyup: this.handleKeyup,
-            }),
-          ]
-      );
-    },
-  };
-  // ss-search-date-picker 日期时间选择器组件
-  const SsSearchDatePicker = {
-    name: "SsSearchDatePicker",
-    props: {
-      modelValue: {
-        type: [String, Number, Date],
-        default: "",
-      },
-      name: {
-        type: String,
-        required: true,
-      },
-      type: {
-        type: String,
-        default: "date",
-        validator: (value) => ["date", "datetime", "time"].includes(value),
-      },
-      fmt: {
-        type: String,
-        default: null,
-      },
-      placeholder: {
-        type: String,
-        default: "",
-      },
-      width: {
-        type: String,
-        default: "100%",
-      },
-    },
-
-    emits: ["update:modelValue"],
-
-    setup(props, { emit }) {
-      const errMsg = ref("");
-      const validate = () => {
-        if (window.ssVm) {
-          const result = window.ssVm.validateField(props.name);
-          console.log("validate", window.ssVm.validateField(props.name));
-          errMsg.value = result.valid ? "" : result.message;
-        }
-      };
-      // 根据type确定默认格式
-      const defaultFormat = computed(() => {
-        switch (props.type) {
-          case "datetime":
-            return "YYYY-MM-DD HH:mm:ss";
-          case "date":
-            return "YYYY-MM-DD";
-          case "time":
-            return "HH:mm:ss";
-        }
-      });
-
-      const convertJavaFormatToElement = (javaFormat) => {
-        if (!javaFormat) return null;
-        return javaFormat
-            .replace("yyyy", "YYYY")
-            .replace("MM", "MM")
-            .replace("dd", "DD")
-            .replace("HH", "HH")
-            .replace("mm", "mm")
-            .replace("ss", "ss");
-      };
-
-      const finalFormat = computed(() => {
-        if (props.fmt) {
-          return convertJavaFormatToElement(props.fmt);
-        }
-        return defaultFormat.value;
-      });
-
-      // 使用 resolveComponent 获取组件
-      const ElDatePicker = resolveComponent("ElDatePicker");
-      const ElTimePicker = resolveComponent("ElTimePicker");
-      const SsFormIcon = resolveComponent("SsFormIcon");
-      const ElIcon = resolveComponent("ElIcon");
-      let useTimePicker = true;
-      //"yyyy-MM-dd HH:mm:ss";  "日期字符串格式在java的写法",传到本组件fmt属性也是按这个格式
-      if (props.fmt) {
-        //有fmt属性,则以fmt属性优先判断类型
-        if (/[dMy]/.test(props.fmt)) {
-          //如果有传入日期格式,且含年月日
-          useTimePicker = false;
-        } else {
-          useTimePicker = true;
-        }
-      } else if (props.type !== "time") {
-        useTimePicker = false;
-      }
-      const dateType = computed(() => {
-        const fmt = props.fmt || "";
-        if (fmt.includes("HH:mm:ss")) {
-          return "datetime";
-        } else if (fmt.includes("HH:mm")) {
-          return "datetime";
-        } else if (fmt.includes("mm:ss")) {
-          return "time";
-        }
-        return "date";
-      });
-      const handleValueUpdate = (val) => {
-        emit("update:modelValue", val);
-        emit("change", val); // 同时触发 change 事件
-        setTimeout(() => {
-          validate();
-        }, 50);
-      };
-      return () =>
-          h(
-              "div",
-              { class: "ss-search-date-picker", style: { width: props.width } },
-              [
-                h("input", {
-                  type: "hidden",
-                  name: props.name,
-                  value: props.modelValue,
-                }),
-                h(useTimePicker ? ElTimePicker : ElDatePicker, {
-                  modelValue: props.modelValue,
-                  "onUpdate:modelValue": handleValueUpdate,
-                  type: dateType.value,
-                  format: finalFormat.value,
-                  "value-format": finalFormat.value,
-                  clearable: true,
-                  placeholder: props.placeholder,
-                  class: "custom-date-picker", // 用于自定义样式
-                  "time-arrow-control": props.type === "datetime", // 修改这里
-                  size: "large", // 添加这一行,改为 large 尺寸
-                  style: { width: "100%" },
-                  "prefix-icon": h(SsFormIcon, { class: "form-icon-time" }),
-                }),
-              ]
-          );
-    },
-  };
-  // 搜索按钮组件(包含下拉按钮)
-  const SsSearchButton = {
-    name: "SsSearchButton",
-    props: {
-      text: {
-        type: String,
-        required: true,
-      },
-      iconClass: {
-        type: String,
-        required: true,
-      },
-      opt: {
-        type: Array,
-        default: () => [],
-      },
-      checkId: {
-        type: String,
-        default: "0",
-      },
-    },
-    setup(props, { emit }) {
-      const currentId = ref(props.checkId || "0");
-      const showPopup = ref(false);
-
-      const handleMouseEnter = () => {
-        showPopup.value = true;
-      };
-
-      const handleMouseLeave = () => {
-        showPopup.value = false;
-      };
-
-      // 添加点击事件处理,阻止默认行为
-      const handleClick = (e) => {
-        e.preventDefault();
-        if (props.opt?.length > 0) {
-          const selectedOption =
-              currentId.value === "0"
-                  ? props.opt[0]
-                  : props.opt.find((opt) => opt.id === currentId.value);
-
-          if (selectedOption) {
-            selectedOption.callback?.();
-          }
-        } else {
-          emit("click", e);
-        }
-      };
-      // 获取显示文本
-      const getDisplayText = () => {
-        if (!props.opt?.length) return props.text;
-
-        const selectedOption =
-            currentId.value === "0"
-                ? props.opt[0]
-                : props.opt.find((opt) => opt.id === currentId.value);
-
-        return selectedOption ? selectedOption.desc : props.opt[0].desc;
-      };
-
-      return () =>
-          h(
-              "button",
-              {
-                class:
-                    props.opt?.length > 0
-                        ? "ss-drop-button ss-drop-button-more"
-                        : "ss-drop-button",
-                type: "button", // 明确指定按钮类型为 button
-                onMouseenter: handleMouseEnter,
-                onMouseleave: handleMouseLeave,
-                onClick: handleClick, // 添加点击事件处理
-              },
-              [
-                props.iconClass
-                    ? h("span", {
-                      class: props.iconClass,
-                      style: { fontFamily: "iconfont", marginRight: "5px" },
-                    })
-                    : null,
-                h("span", getDisplayText()),
-                props.opt.length > 0 &&
-                showPopup.value &&
-                h(
-                    "div",
-                    {
-                      class: "popup",
-                    },
-                    props.opt.map((item) =>
-                        h(
-                            "div",
-                            {
-                              onClick: (e) => {
-                                e.preventDefault(); // 选项点击也阻止默认行为
-                                e.stopPropagation(); // 阻止事件冒泡
-                                currentId.value = item.id; // 更新当前选中的ID
-                                item.callback();
-                                showPopup.value = false; // 选择后关闭弹窗
-                              },
-                            },
-                            item.desc
-                        )
-                    )
-                ),
-              ]
-          );
-    },
-  };
-  // 下拉按钮组件
-  const SsDropButton = {
-    name: "SsDropButton",
-    props: {
-      text: {
-        type: String,
-        required: true,
-      },
-      iconClass: {
-        type: String,
-        required: true,
-      },
-      opt: {
-        type: Array,
-        default: () => [],
-      },
-      checkId: {
-        type: String,
-        default: "0",
-      },
-      onclick: {
-        type: Function,
-        default: null,
-      },
-    },
-    setup(props) {
-      const currentId = ref(props.checkId || "0");
-      const showPopup = ref(false);
-
-      const handleMouseEnter = () => {
-        showPopup.value = true;
-      };
-
-      const handleMouseLeave = () => {
-        showPopup.value = false;
-      };
-
-      // 添加点击事件处理,阻止默认行为
-      const handleClick = (e) => {
-        e.preventDefault();
-        if (props.opt?.length > 0) {
-          const selectedOption =
-              currentId.value === "0"
-                  ? props.opt[0]
-                  : props.opt.find((opt) => opt.id === currentId.value);
-
-          if (selectedOption) {
-            selectedOption.callback?.();
-          }
-        } else if (props.onclick) {
-          props.onclick();
-        }
-      };
-      // 获取显示文本
-      const getDisplayText = () => {
-        if (!props.opt?.length) return props.text;
-
-        const selectedOption =
-            currentId.value === "0"
-                ? props.opt[0]
-                : props.opt.find((opt) => opt.id === currentId.value);
-
-        return selectedOption ? selectedOption.desc : props.opt[0].desc;
-      };
-
-      return () =>
-          h(
-              "button",
-              {
-                class:
-                    props.opt?.length > 0
-                        ? "ss-drop-button ss-drop-button-more"
-                        : "ss-drop-button",
-                type: "button", // 明确指定按钮类型为 button
-                onMouseenter: handleMouseEnter,
-                onMouseleave: handleMouseLeave,
-                onClick: handleClick, // 添加点击事件处理
-              },
-              [
-                h("span", {
-                  class: props.iconClass,
-                  style: { fontFamily: "iconfont" },
-                }),
-                h("span", getDisplayText()),
-                props.opt.length > 0 &&
-                showPopup.value &&
-                h(
-                    "div",
-                    {
-                      class: "popup",
-                    },
-                    props.opt.map((item) =>
-                        h(
-                            "div",
-                            {
-                              onClick: (e) => {
-                                e.preventDefault(); // 选项点击也阻止默认行为
-                                e.stopPropagation(); // 阻止事件冒泡
-                                currentId.value = item.id; // 更新当前选中的ID
-                                item.callback();
-                                showPopup.value = false; // 选择后关闭弹窗
-                              },
-                            },
-                            item.desc
-                        )
-                    )
-                ),
-              ]
-          );
-    },
-  };
-  /**
-   * 二级页面标签组件
-   * @name ss-sub-tab
-   * @description 用于展示二级页面的布局组件,包含左侧垂直标签导航(支持分组)和右侧iframe内容区
-   * @property {String} headerImage - 左侧顶部图片地址
-   * @property {Array} menuList - 菜单配置列表
-   * @property {Object} [activeMenu] - 当前选中的菜单项,不传则自动选择第一个可选菜单
-   * @property {Array} footerButtons - 底部按钮配置列表
-
-   */
-  const SsSubTab = {
-    name: "SsSubTab",
-    props: {
-      headerImage: {
-        type: String,
-        default: "",
-      },
-      menuList: {
-        type: Array,
-        required: true,
-      },
-      activeMenu: {
-        // 只需要传入标题
-        type: String,
-        default: "",
-      },
-      footerButtons: {
-        type: Array,
-        default: () => [],
-      },
-      leftDisplay: {
-        type: Boolean,
-        default: true,
-      },
-    },
-    emits: ["menu-change", "footer-click"],
-    setup(props, { emit }) {
-      // 根据标题找到对应的菜单项
-      const findMenuByTitle = (title) => {
-        for (const item of props.menuList) {
-          if (item.children?.length > 0) {
-            const child = item.children.find((c) => c.title === title);
-            if (child) return child;
-          } else if (item.title === title) {
-            return item;
-          }
-        }
-        return null;
-      };
-
-      // 计算默认选中的菜单项
-      const defaultActiveMenu = computed(() => {
-        if (props.activeMenu) {
-          const menu = findMenuByTitle(props.activeMenu);
-          if (menu) return menu;
-        }
-
-        const firstItem = props.menuList[0];
-        if (!firstItem) return null;
-
-        return firstItem.children?.length > 0
-            ? firstItem.children[0]
-            : firstItem;
-      });
-
-      const currentMenu = ref(defaultActiveMenu.value);
-
-      // 监听外部activeMenu变化
-      watch(
-          () => props.activeMenu,
-          (newTitle) => {
-            if (newTitle) {
-              const menu = findMenuByTitle(newTitle);
-              if (menu) {
-                currentMenu.value = menu;
-              }
-            }
-          }
-      );
-
-      // 选择菜单项时触发 menu-change 钩子
-      const selectItem = (item) => {
-        currentMenu.value = item;
-        emit("menu-change", item);
-      };
-
-      // 处理底部按钮点击
-      const handleFooterClick = (button, index) => {
-        emit("footer-click", { button, index });
-      };
-
-      return {
-        currentMenu,
-        selectItem,
-        handleFooterClick,
-      };
-    },
-    template: `
-          <div class="project-edit-container">
-              <div class="left-side" v-if="leftDisplay">
-              
-                  <!-- 头部图片 -->
-                  <div v-if="headerImage" class="menu-header">
-                      <div class="thumb">
-                          <img :src="headerImage" style="object-fit: cover;width: 100%;height: 100%;" />
-                      </div>
-                  </div>
-
-                  <!-- 菜单内容 -->
-                  <div class="menu-content">
-                      <div class="scroll-view">
-                          <template v-for="(menuItem, i) in menuList" :key="i">
-                              <!-- 分组菜单 -->
-                              <div v-if="menuItem.children?.length > 0" class="group">
-                                  <div class="menu-item" @click="menuItem.open = !menuItem.open">
-                                      <span>{{ menuItem.title }}</span>
-                                      
-                                      <span class="arrow">
-                                          <ss-icon :name="menuItem.open ? 'arrow-up' : 'arrow-down'" size="20px" />
-                                      </span>
-                                  </div>
-                                  <div v-show="menuItem.open" class="group-detail">
-                                      <div v-for="(item, j) in menuItem.children" 
-                                          :key="j" 
-                                          class="menu-item"
-                                          :class="{ active: item.name === currentMenu?.name }"
-                                          @click="selectItem(item)"
-                                      >
-                                          {{ item.title }}
-                                           
-                                           &nbsp;
-                                          <span class="menu-item-point" v-if="item.cgxList || item.objectList"></span>
-                                      </div>
-                                  </div>
-                              </div>
-                              <!-- 普通菜单项 -->
-                              <div v-else 
-                                  class="menu-item"
-                                  :class="{ active: menuItem.name === currentMenu?.name }"
-                                  @click="selectItem(menuItem)"
-                              >
-                                    {{ menuItem.title }}
-                                   &nbsp;
-                                  <span class="menu-item-point" v-if="menuItem.cgxList || menuItem.objectList"></span>
-                              </div>
-                          </template>
-                      </div>
-                  </div>
-                  
-                  <!-- 底部按钮 -->
-                  <div v-if="footerButtons.length > 0" 
-                      class="sub-tab-menu-footer"
-                      @click="footerButtons[0].onclick"
-                  >
-                      <div>{{ footerButtons[0].text }}</div>
-                      <ss-icon 
-                          v-if="footerButtons.length > 1" 
-                          name="arrow-up" 
-                          size="24px" 
-                      />
-                      
-                      <!-- 悬浮按钮 -->
-                      <div v-if="footerButtons.length > 1" class="sub-tab-menu-popup">
-                          <div v-for="(button, index) in footerButtons.slice(1)" 
-                              :key="index"
-                              @click.stop="button.onclick"
-                          >
-                              {{ button.text }}
-                          </div>
-                      </div>
-                  </div>
-                  
-              </div>
-
-              <!-- 右侧内容区域 -->
-              <div class="content-area fit-height-content" style="overflow: hidden;" :style="!leftDisplay ? { width: '100%' } : {}">
-                 
-                  <template v-for="(menuItem, i) in menuList" :key="i">
-                      <iframe 
-                          :src="menuItem.url"
-                          style="height: 100%;width: 100%;"
-                          frameborder="0"
-                          class="sub-tab-iframe"
-                          :id="i === 0 ? 'sub-tab-iframe' : ''"
-                          v-show="currentMenu?.name === menuItem.name"
-                      />
-                  </template>
-              </div>
-          </div>
-      `,
-  };
-  // <iframe
-  //     v-if="currentMenu?.url"
-  //     :src="currentMenu.url"
-  //     style="height: 100%;width: 100%;"
-  //     frameborder="0"
-  //     id="sub-tab-iframe"
-  // />
-
-  // ss-photo-upload 通用图片上传组件
-  const SsImgUpload = {
-    name: "SsImgUpload",
-    props: {
-      name: {
-        type: String,
-        required: true,
-      },
-      // 图片URL,用于回显
-      // url: {
-      //   type: String,
-      //   default: "",
-      // },
-      // 样式类名
-      class: {
-        type: String,
-        required: true,
-      },
-      // 裁剪配置
-      cropperOpt: {
-        type: Object,
-        default: () => ({
-          width: 360,
-          height: 360,
-          aspectRatio: 1,
-        }),
-      },
-      //上传图片url(未加图片名参数之前的部分)
-      ulUrl: {
-        type: String,
-        required: true,
-      },
-      //下载图片url(未加图片名参数之前的部分)
-      dlUrl: {
-        type: String,
-        required: true,
-      },
-      modelValue: [String, Number],
-    },
-
-    emits: ["update:modelValue"],
-
-    setup(props, { emit }) {
-      const inputId = Vue.computed(
-          () => `file_${Vue.getCurrentInstance().uid}`
-      );
-      //修改图片初始显示路径
-      let pathVal = ref(props.modelValue);
-      let picUrl = ref("");
-      if (props.modelValue) {
-        picUrl.value = props.dlUrl + "&path=" + props.modelValue;
-      }
-
-      Vue.onMounted(() => {
-        window.SS.cropper.init({
-          el: $(`#${inputId.value}`),
-          photoSize: {
-            width: props.cropperOpt.width,
-            height: props.cropperOpt.height,
-          },
-          aspectRatio: props.cropperOpt.aspectRatio,
-          uploadUrl: props.ulUrl,
-          success: (path) => {
-            pathVal.value = path;
-            picUrl.value = props.dlUrl + "&path=" + path;
-            emit("update:modelValue", path);
-          },
-        });
-      });
-
-      return () =>
-          h("div", { class: [props.class] }, [
-            h("input", {
-              type: "file",
-              accept: "image/*",
-              id: inputId.value,
-              style: { display: "none" },
-            }),
-            h("input", {
-              type: "hidden",
-              name: props.name,
-              value: pathVal.value,
-            }),
-            h(
-                "div",
-                {
-                  style: {
-                    width: "100%",
-                    height: "100%",
-                  },
-                  onClick: () => $(`#${inputId.value}`).click(),
-                },
-                [
-                  picUrl.value &&
-                  h("img", {
-                    src: picUrl.value,
-                    style:
-                        "width: 100%; height: 100%;object-fit: inherit;position: relative;z-index: 11;",
-                  }),
-                ]
-            ),
-          ]);
-    },
-  };
-
-  // 初始化函数,负责创建和挂载 Vue 应用
-  // window.SS = { dom: {} };
-  /**
-   * 获取当前窗口的父窗口
-   * @returns {Window} 父窗口对象
-   */
-  window.SS.topWin = (function (p, c) {
-    while (p != c) {
-      c = p;
-      p = p.parent;
-    }
-    return c;
-  })(window.parent, window);
-
-  window.SS.createSsDialogInstance = createSsDialogInstance;
-  /**
-   * 创建弹窗
-   * @param {Object} setting
-   * @param {Function} callbackEvent
-   */
-  window.SS.openDialog = function (setting, callbackEvent) {
-    if (setting.params) {
-      const encodedParams = encodeURIComponent(JSON.stringify(setting.params));
-      setting.src +=
-          (setting.src.includes("?") ? "&" : "?") + "params=" + encodedParams;
-    }
-
-    if (window.parent && window.parent !== window) {
-      window.parent.SS.createSsDialogInstance(setting, callbackEvent);
-    } else {
-      createSsDialogInstance(setting, callbackEvent);
-    }
-  };
-  //关闭弹窗
-  window.SS.closeDialog = function () {
-    console.log("关闭弹窗");
-    if (topWindow.dialogInstances.length > 0) {
-      const instance = topWindow.dialogInstances.pop();
-      console.log("instance", instance);
-      console.log("instance.callbackEvent", instance.callbackEvent);
-      console.log(
-          "instance.callbackEvent.end",
-          typeof instance.callbackEvent === "function"
-      );
-      if (instance.callbackEvent) {
-        // 判断是否有end回调并执行
-        if (typeof instance.callbackEvent === "function") {
-          instance.callbackEvent();
-        }
-        if (typeof instance.callbackEvent.end === "function") {
-          instance.callbackEvent.end();
-        }
-      }
-      instance.app.unmount(); // 卸载最后一个实例
-      if (instance.container && instance.container.parentNode) {
-        instance.container.parentNode.removeChild(instance.container); // 移除容器
-      }
-    }
-  };
-
-  /**
-   * 裁剪插件
-   */
-  window.SS.cropper = {
-    init: function (setting) {
-      if (!window.top.SS) window.top.SS = {};
-      // 重要:确保 cropper 对象的完整初始化
-      if (!window.top.SS.cropper) {
-        window.top.SS.cropper = {
-          settings: new Map(),
-          _backupSettings: {},
-          getSetting: this.getSetting,
-          clearSetting: this.clearSetting,
-          debug: this.debug,
-        };
-      } else if (!window.top.SS.cropper.settings) {
-        // 如果 cropper 存在但 settings 不存在,重新初始化 settings
-        window.top.SS.cropper.settings = new Map();
-        window.top.SS.cropper._backupSettings = {};
-      }
-      const uploaderId = `uploader_${Date.now()}_${Math.random()
-          .toString(36)
-          .substr(2, 9)}`;
-
-      window.top.SS.cropper.settings.set(uploaderId, setting);
-      window.top.SS.cropper._backupSettings[uploaderId] = setting;
-
-      setting.box = setting.box || "1";
-      var winSetting = {
-        headerTitle: "图片裁剪",
-        src: "/newUI/page/cropper.jsp",
-        width: "900",
-        height: "500",
-      };
-
-      $(setting.el).change(function () {
-        if (!window.SS.cropper.verify(setting)) {
-          $(setting.el).val(""); // 清空文件选择
-          return false;
-        }
-        var files = this.files;
-        if (files && files.length) {
-          if (!window.SS.cropper.verifySize($(setting.el)[0], 5)) {
-            $(setting.el).val(""); // 清空文件选择
-            alert("文件大小不能超过5M,请重新选择");
-            return false;
-          }
-          var URL = window.URL || window.webkitURL;
-          var file = files[0];
-          setting.file = file;
-
-          if (
-              /^image\/\w+$/.test(file.type) &&
-              /\.(jpg|jpeg|png|)$/i.test(file.name)
-          ) {
-            var uploadedImageURL = URL.createObjectURL(file);
-            setting.data = uploadedImageURL;
-            setting.fileName = file.name;
-            // console.log()
-            winSetting.params = {
-              ...setting,
-              uploaderId,
-            };
-            console.log("ss-componets中change之后的winSetting", winSetting);
-            SS.openDialog(winSetting, {
-              success: function (win) {
-                console.log("裁剪插件成功");
-                // win.cropperSetting = setting;
-              },
-              end: function () {
-                console.log("裁剪插件结束");
-                $(setting.el).val(""); // 清空文件选择
-              },
-            });
-          } else {
-            alert("请选择图片文件,支持jpg、jpeg、png格式");
-          }
-        }
-      });
-      return uploaderId;
-    },
-    verify: function (setting) {
-      if (!setting) {
-        console.error(" cropper setting is not undefined! ");
-        return false;
-      }
-      if (!setting.el) {
-        console.error(" cropper setting.el is not undefined! ");
-        return false;
-      }
-      if (setting.photoSize) {
-        if (
-            (!setting.photoSize.width && setting.photoSize.height) ||
-            (!setting.photoSize.height && setting.photoSize.width)
-        ) {
-          console.error(
-              " cropper setting.photoSize { width, height } is not undefined! "
-          );
-          return false;
-        }
-      }
-      if (!setting.box) {
-        setting.box = "1";
-      }
-
-      if (!setting.aspectRatio) {
-        setting.aspectRatio = 1 / 1;
-      }
-
-      return true;
-    },
-    verifySize: function (fileEl, maxSize) {
-      // 判断是否为IE浏览器: /msie/i.test(navigator.userAgent) 为一个简单正则
-      var isIE = /msie/i.test(navigator.userAgent) && !window.opera;
-      var fileSize = 0;
-      if (isIE && !fileEl.files) {
-        // IE浏览器
-        var filePath = fileEl.value; // 获得上传文件的绝对路径
-        var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
-        var file = fileSystem.GetFile(filePath);
-        fileSize = file.Size; // 文件大小,单位:b
-      } else {
-        // 非IE浏览器
-        fileSize = fileEl.files[0].size;
-      }
-
-      var size = fileSize / 1024 / 1024;
-      return !(size > maxSize);
-    },
-    // 获取特定上传组件的setting
-    getSetting: function (uploaderId) {
-      if (!window.top.SS?.cropper) {
-        console.warn("顶层窗口中未找到 SS.cropper");
-        return null;
-      }
-
-      // 优先从 Map 中获取
-      let setting = window.top.SS.cropper.settings.get(uploaderId);
-
-      // 如果 Map 中没有,尝试从备份中获取
-      if (!setting && window.top.SS.cropper._backupSettings[uploaderId]) {
-        console.log("从备份中恢复 setting");
-        setting = window.top.SS.cropper._backupSettings[uploaderId];
-        // 恢复到 Map 中
-        window.top.SS.cropper.settings.set(uploaderId, setting);
-      }
-
-      return setting;
-    },
-
-    // 清理特定上传组件的setting
-    clearSetting: function (uploaderId) {
-      if (!window.top.SS?.cropper) return;
-
-      window.top.SS.cropper.settings.delete(uploaderId);
-      delete window.top.SS.cropper._backupSettings[uploaderId];
-      console.log(
-          "清理设置后的 Map size:",
-          window.top.SS.cropper.settings.size
-      );
-    },
-  };
-
-  /**
-   * 获取url中的参数
-   * @returns {Object}
-   */
-  window.SS.getQueryParams = function () {
-    const params = {};
-    const queryString = window.location.search.substring(1);
-    const pairs = queryString.split("&");
-    for (let i = 0; i < pairs.length; i++) {
-      const pair = pairs[i].split("=");
-      params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
-    }
-    if (params.params) {
-      try {
-        params.params = JSON.parse(params.params);
-      } catch (e) {
-        console.error("Failed to parse params:", e);
-      }
-    }
-
-    return params;
-  };
-
-  /**
-   * 创建vue应用
-   * @param {Object} config 配置项
-   * @values {String} config.el 挂载的元素
-   * @values {Boolean} config.isDialogPage 是否是弹窗页面 决定了是否可以使用顶天立地
-   * @values {Object} config.vueOptions vue配置项
-   * @returns {Object} vue实例
-   */
-  window.SS.dom.initializeFormApp = function (config) {
-    const { el, isDialogPage = false, ...vueOptions } = config;
-    const app = createApp({
-      ...vueOptions,
-    });
-    // 如果是弹窗iframe里面的html的话 给当前的页面挂上事件 实现顶天立地的效果
-    if (isDialogPage) {
-      function checkScroll() {
-        // 选出所有fit-height-content的元素 如果有滚动条
-        const elements = document.querySelectorAll(".fit-height-content");
-        let hasScrollBar = false;
-        // 检查元素是否有滚动条 检查当前窗口的所有元素
-        // 如果有滚动条,则将结果设置为true
-        elements.forEach((el) => {
-          if (el.scrollHeight > el.clientHeight) {
-            hasScrollBar = true;
-          }
-        });
-        // 将结果发送给父窗口
-        window.parent.postMessage({ hasScrollBar }, "*");
-      }
-
-      function addScrollListeners() {
-        const elements = document.querySelectorAll("div");
-        elements.forEach((el) => {
-          el.addEventListener("scroll", checkScroll);
-        });
-      }
-      const observer = new MutationObserver((mutations) => {
-        addScrollListeners();
-        checkScroll();
-      });
-
-      observer.observe(document.body, {
-        childList: true,
-        subtree: true,
-      });
-
-      window.addEventListener("resize", checkScroll);
-    }
-    // 注册组件
-    app.component("SsLoginIcon", SsLoginIcon);
-    app.component("SsMark", SsMark);
-    app.component("SsFullStyleHeader", SsFullStyleHeader);
-    app.component("SsDialog", SsDialog);
-    app.component("SsInput", SsInput);
-    app.component("SsObjp", SsObjp);
-    app.component("SsHidden", SsHidden);
-    app.component("SsCcp", SsCcp);
-    app.component("SsDatePicker", SsDatePicker);
-    app.component("SsIcon", SsIcon);
-    app.component("SsCommonIcon", SsCommonIcon);
-    app.component("SsBreadcrumb", SsBreadcrumb);
-    app.component("SsEditor", SsEditor);
-    app.component("SsDialogIcon", SsDialogIcon);
-    app.component("SsBottomButton", SsBottomButton);
-    app.component("SsNavIcon", SsNavIcon);
-    app.component("SsHeaderIcon", SsHeaderIcon);
-    app.component("SsGolbalMenuIcon", SsGolbalMenuIcon);
-    app.component("SsCartListIcon", SsCartListIcon);
-    app.component("SsQuickIcon", SsQuickIcon);
-    app.component("SsFormIcon", SsFormIcon);
-    app.component("SsBottomDivIcon", SsBottomDivIcon);
-    app.component("SsEditorIcon", SsEditorIcon);
-    app.component("SsValidate", SsValidate);
-    app.component("SsOnoffbutton", SsOnoffbutton);
-    app.component("SsOnoffbuttonArray", SsOnoffbuttonArray);
-    app.component("SsTextarea", SsTextarea);
-    app.component("SsLoginInput", SsLoginInput);
-    app.component("SsLoginButton", SsLoginButton);
-    app.component("SsSearch", SsSearch);
-    app.component("SsCartItem", SsCartItem);
-    app.component("SsCartItem2", SsCartItem2);
-    app.component("SsListCard", SsListCard);
-    app.component("SsFolderCard", SsFolderCard);
-    app.component("SsFolderCartView", SsFolderCartView);
-    app.component("SsPage", SsPage);
-    app.component("SsRightInfo", SSRightInfo);
-    app.component("SsSuccessPopup", SsSuccessPopup);
-    app.component("SsErrorDialog", SsErrorDialog);
-    app.component("SsVerify", SsVerify);
-    app.component("SsVerifyNode", SsVerifyNode);
-    app.component("SsOrcImgBox", SsOrcImgBox);
-    app.component("ss-search-input", SsSearchInput);
-    app.component("ss-search-date-picker", SsSearchDatePicker);
-
-    app.component("ss-search-button", SsSearchButton);
-    app.component("ss-drop-button", SsDropButton);
-    app.component("ss-sub-tab", SsSubTab);
-    app.component("ss-img", SsImgUpload);
-    // 设置为中文
-    app.use(ElementPlus, {
-      locale: ElementPlusLocaleZhCn,
-    });
-    // console.log(ElementPlus);
-    // 确保 ElementPlusIconsVue
-    // if (window.ElementPlusIconsVue) {
-    //   // 注册 Element Plus 图标组件
-    //   for (const [key, component] of Object.entries(
-    //     window.ElementPlusIconsVue
-    //   )) {
-    //     console.log(key, component);
-    //     app.component(key, component);
-    //   }
-    // }
-    // 挂载首页的组件
-    for (const componentName in IndexComponents) {
-      app.component(componentName, IndexComponents[componentName]);
-    }
-    // 挂载echarts的组件
-    for (const componentName in EchartComponents) {
-      app.component(componentName, EchartComponents[componentName]);
-    }
-    // 挂载 Vue 应用
-    const vm = app.mount(el);
-    vm.data = vueOptions.data();
-
-    return vm;
-  };
-})();

+ 0 - 1562
alf/validation.js

@@ -1,1562 +0,0 @@
-/**
- * 用于处理表单验证的JS文件 110609 注意:iframe默认是有最大的宽高限制的,要想iframe加载的页面较大时
- * 也能自动调整大小,应该为iframe的css样式增加:width: 100%;height: 100%; 否则iframe大到一定程序就不能再大了
- */
-
-//var validationManagerPath = '/wd/js/validation';
-function isMobile() {
-  const screenWidth = (window !== window.top ? window.top : window).innerWidth <= 768;
-
-  const userAgent = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
-  
-  // 检测触摸支持
-  const hasTouchScreen = (
-    'ontouchstart' in window || 
-    navigator.maxTouchPoints > 0 ||
-    navigator.msMaxTouchPoints > 0
-  );
-
-  
-  return hasTouchScreen && (userAgent || screenWidth);
-
-}
-
-
-// 为真,则在用户输入数据时实现进行检查
-var realTimeCheck = true;
-
-var chartDiv;
-var validationTimeOutId = null;
-
-if (realTimeCheck) {
-  // 如果需要在用户输入数据时实现进行检查,则把相应的iframe写入页面
-  /*
-   * var divStr = '<div style="position: absolute; z-index: 19701; top:
-   * -500px" id="msgDiv"><div id="validationDiv"><iframe name="msgIframe"
-   * id="msgIframe" src="'+validationManagerPath+ '/validationMsg.html"
-   * scrolling="no" frameborder="0" style="visibility: visible;position:
-   * absolute; width: 100%; height: 100%;"></iframe></div></div>'; var
-   * topBody = top.document.getElementsByTagName('BODY')[0]; topBody.innerHTML =
-   * divStr;
-   */
-
-  // alert(window.top.document.getElementsByTagName("body")[0]);
-
-  // document.write('<div style="position: absolute; z-index: 65535; top:
-  // -500px" id="msgDiv"><div id="validationDiv"><iframe name="msgIframe"
-  // id="msgIframe" src="'+validationManagerPath+
-  // '/validationMsg.html" scrolling="no" frameborder="0"
-  // style="visibility: visible;position: absolute; width: 100%; height:
-  // 100%;"></iframe></div></div>');
-
-  var topDoc = top.document;
-  chartDiv = topDoc.getElementById("msgDiv");
-  if (chartDiv == null || typeof chartDiv == "undefined") {
-    chartDiv = topDoc.createElement("div");
-    topDoc.body.appendChild(chartDiv);
-    chartDiv.id = "msgDiv";
-    chartDiv.innerHTML +=
-      '<div id="validationDiv" class="flashMsg-div" ><span class="msgDiv-content"></span><div class="msgDiv-tail"></div></div>';
-    // chartDiv.innerHTML = '<img
-    // src="<%=request.getContextPath()%>/images/kpiUp.jpg" />';//错误的
-    with (chartDiv.style) {
-      zIndex = 65535;
-      position = "absolute";
-      // background = '#F5F5F5';
-      width = "auto";
-      height = 0;
-      top = -500;
-      left = 0;
-      // border = "1px solid";
-      display = "block";
-      style = "position:absolute;border-radius:3px;overflow:hidden;";
-    }
-  }
-}
-
-// 保存校验结果的变量
-var message = "";
-
-function ValidationManager() {
-  // 用于处理表单验证的工具类构造器
-
-  /** 保存所有要校验的信息的集合* */
-  this.validationInfos = [];
-}
-
-ValidationManager.MSG_TYPE_SUCCESS = 0; // 消息类型――正确
-ValidationManager.MSG_TYPE_ERROR = 1; // 消息类型――错误
-ValidationManager.MSG_TYPE_WARNING = 2; // 消息类型――警告
-
-ValidationManager.prototype = {
-  /** 用于显示表单验证结果的Div* */
-  MsgDiv: chartDiv,
-
-  /** 如果为真,则如果代码报错会alert出来,在实际项目中应设为false* */
-  debug: true,
-
-  /** 通过NAME或ID获得页面元素的通用方法* */
-  getElement: function (nameOrId) {
-    var rs = document.getElementById(nameOrId);
-    if (!rs) {
-      // 如果上面的方法失败,则采用下面的方法取得对象实例
-      var arr = document.getElementsByName(nameOrId);
-      if (arr != null) rs = arr[0];
-    }
-    console.log(rs);
-    return rs;
-  },
-  getElements: function (nameOrId) {
-    var rs = new Array();
-    var ele = document.getElementById(nameOrId);
-    if (!ele) {
-      // 如果上面的方法失败,则采用下面的方法取得对象实例
-      var arr = document.getElementsByName(nameOrId);
-
-      if (arr != null) {
-        for (var i = 0; i < arr.length; i++) {
-          rs.push(arr[i]);
-        }
-      }
-    } else {
-      rs.push(ele);
-    }
-    //			console.log(rs)
-    return rs;
-  },
-  /** 获取参数s指定的方法引用* */
-  getFunRef: function (s) {
-    if (!s) return null;
-
-    try {
-      var r = eval(s);
-    } catch (e) {
-      //alert("方法不存在 :"+s)
-      console.log("方法不存在 :" + s);
-    }
-
-    return r;
-  },
-
-  /**
-   * 为DOM元素targetElem的evenName事件追加事件触发时回调函数activeFun
-   * 通过此函数为DOM元素绑定监听事件的好处在于:可以把新添加的监听函数与DOM元素
-   * 已绑定的旧的监听函数合并成为新的监听函数,而不会覆盖DOM元素旧的同名监听函数。
-   */
-  addEventListener: function (
-    targetElem, // 需绑定监听事件的DOM元素
-    eventName, // 事件名称,如:onclick
-    activeFun
-  ) {
-    // 事件触发的回调函数
-
-    // DOM元素原来的监听事件
-    var oriListener = targetElem[eventName];
-    if (oriListener) {
-      // 如果原来已经存在同名的监听事件了
-      targetElem[eventName] = function () {
-        oriListener.call(targetElem); // 调用原来已经存在监听方法
-        activeFun.call(targetElem); // 调用新添加的监听方法
-      };
-    } else {
-      targetElem[eventName] = function () {
-        activeFun.call(targetElem); // 调用新添加的监听方法
-      };
-    }
-  },
-
-  /** 当前页面的第一个FORM元素* */
-  form: null,
-
-  /** 用于显示表单验证结果的iframe的Id或Name* */
-  MsgIframeIdorName: "msgIframe",
-
-  /** 用于显示表单验证结果的div的Id或Name* */
-  MsgDivIdorName: "msgDiv",
-
-  /** 用于显示表单验证结果的iframe* */
-  MsgIframe: null,
-
-  /** 已经初始化成功* */
-  initOk: false,
-
-  /**
-   * 如果表单存在,则为表单绑定onsubmit校验事件
-   *
-   * @param {}
-   *            targetForm 需要校验的FORM的name或者ID
-   * @return {Boolean} 返回校验结果,为真则校验通过
-   */
-  checkForm: function (targetForm) {
-    try {
-      var THIS = this;
-
-      if (!targetForm) {
-        // 如果目标form不存在
-        //alert('checkForm方法执行出错,参数不能为空!');
-        console.log("checkForm方法执行出错,参数不能为空!");
-        return;
-      }
-
-      if ((typeof targetForm).toUpperCase() == "STRING")
-        // 如果输入的是FORM的name或者ID
-        var targetForm = this.getElement(targetForm);
-
-      if (!targetForm.validationManager) {
-        // 如果FORM中没校验器,则添加一个校验器
-        targetForm.validationManager = this;
-
-        var activeFun = function (showerror) {
-          // 为表单绑定onsubmit事件
-
-          try {
-            if (window.beforeBatchSubmit) {
-              window.beforeBatchSubmit();
-            }
-          } catch (e) {
-            console.log(e);
-          }
-
-          var rsArr = targetForm.validationManager.checkAll(
-            targetForm.validationManager.validationInfos
-          );
-          console.log(rsArr)
-          var totalMsg = ""; // 保存校验显示的消息
-
-          for (var i = 0; i < rsArr.length; i++) {
-            var rs = rsArr[i];
-            var msg = rs.msg;
-
-            var regExp = /[\n\r]+$/; // 测试校验结果结尾有没有换行符的正则表达式
-            var hasLineBreak; // 有换行符
-            hasLineBreak = regExp.test(msg);
-
-            // if(hasLineBreak)//如果有换行符
-            // totalMsg+=msg;
-            // else
-            totalMsg += msg + "<br>";
-          }
-
-          if (totalMsg) {
-            // 如果校验不通过
-            if (showerror == false) return false; //如果不显示错误
-            try {
-              var windowId = new Date().getTime();
-              var width = 400;
-              var high = 400;
-
-              // wd.topWindow.dhxWins.enableAutoViewport(true);//让窗口大小自动适应内容
-
-              var w = wd.topWindow.dhxWins.createWindow(
-                windowId,
-                0,
-                0,
-                width,
-                high
-              );
-
-              //----------------加遮罩层开始  ----------------
-              if (!wd.topWindow.wd.display.wdDialogOpeners) {
-                wd.topWindow.wd.display.wdDialogOpeners = {};
-              }
-              var wdDialogId = windowId;
-              wd.topWindow.wd.display.wdDialogOpeners[wdDialogId] = window;
-              var containerObj = wd.topWindow.wd.display;
-
-              if (wd.topWindow.document.querySelector("#validationTotalMsg")) {
-                wd.topWindow.document
-                  .querySelector("#validationTotalMsg")
-                  .close();
-              }
-
-              //----------------加遮罩层结束  ----------------
-
-              w.keepInViewport(true); // 保持在窗口内
-              w.center(); // 居中
-
-              var title =
-                "<span style=\"font-size: 18px; '宋体';line-height:30px; color: #333;margin-left: 5px;\" >录入数据错误</span>";
-              w.setText(title); // 设置窗口标题
-              w.setModal(true); // 设置模式窗口
-              w.bringToTop(); // 置顶
-
-              // 隐藏不需要的按钮
-              // alert(document.getElementById("mainContainer")==wd.topWindow.document.body);
-
-              if (w.button("help")) w.button("help").hide();
-              if (w.button("stick")) w.button("stick").hide();
-              if (w.button("sticked")) w.button("sticked").hide();
-              if (w.button("park")) w.button("park").hide();
-              if (w.button("minmax1"))
-              // 隐藏最大化按钮
-              w.button("minmax1").hide();
-              w.denyResize(); // 不允许改变大小
-              var innerDiv =
-                '<div id="innerFrame" class="scrollbar" style="width: ' +
-                (width - 5) +
-                ';height:calc(100% - 53px);display:flex;align-items:center;justify-content: space-around;overflow:auto;line-height:30px;font-size:16px;color:red;box-sizing:border-box;padding-left:15px;" >' +
-                totalMsg +
-                '</div><div class="bottom-div" style="position:absolute;"><div class="bottom-down-div"><input type="button" value="关闭" class="bottom-button" id="closeButton" style="letter-spacing: 6px;"></div></div></div>';
-              w.attachHTMLString(innerDiv);
-
-              w.setAttribute("id", "validationTotalMsg");
-
-              var currentDialogZIndex = w.zi; // 弹出窗口的z-index
-              wd.display.dxwindowsCreateMaskDiv(currentDialogZIndex);
-
-              w.attachEvent("onClose", function (win) {
-                wd.display.dxwindowsCloseMaskDiv(); //关闭wddialog时,移除遮罩层
-                return true;
-              });
-              try {
-                wd.display.initStyleWdButtons();
-
-                $(w).on("click", "#closeButton", function () {
-                  w.close();
-                });
-              } catch (e) {
-                console.log(e);
-              }
-
-              var divArr =
-                wd.topWindow.document.querySelectorAll("[ida=dhxMainCont]");
-              for (var i = 0; i < divArr.length; i++) {
-                divArr[i].style.backgroundColor = "";
-              }
-            } catch (e) {
-              //alert(totalMsg);// 弹出校验结果
-            }
-            THIS.hideMsgDiv();
-            return false;
-          } else return true;
-        }; //end function
-
-        //如果用户直接调用form的submit方法,则校验不会生效。因此,这里覆盖原来form的submit方法\
-
-        targetForm.oriSubmit = targetForm.submit;
-        targetForm.checkOnly = function (boo) {
-          boo = typeof boo == "undefined" ? true : boo;
-          //					!(boo == null ? true : boo);
-          return activeFun(boo);
-        };
-        targetForm.submit = function () {
-          if (activeFun()) targetForm.oriSubmit();
-        };
-        wd.c.addEventListener(
-          targetForm, //需绑定监听事件的DOM元素
-          "onsubmit", //事件名称,如:onclick
-          activeFun
-        );
-      }
-    } catch (e) {
-      if (this.debug)
-        //alert('方法checkForm执行异常:'+e);
-        console.log("方法checkForm执行异常:" + e);
-    }
-  },
-
-  /** 如果为真则自动为当前页面的第一个表单绑定onsubmit校验事件* */
-  formAutoCheck: true,
-
-  /** 初始化变量的方法,只需执行一次* */
-  init: function () {
-    try {
-      if (this.initOk) return; // 如果已经初始化过了,就返回。
-
-      if (!this.MsgIframe)
-        this.MsgIframe = this.getElement(this.MsgIframeIdorName);
-
-      if (!this.MsgDiv) this.MsgDiv = this.getElement(this.MsgDivIdorName);
-
-      if (this.formAutoCheck) {
-        //              var forms = document.getElementsByTagName('form');
-        var forms = $("form:visible"); //过滤隐藏form
-        this.form = forms[forms.length - 1]; // 当前页面的第一个FORM元素
-
-        if (this.form) {
-          // 如果表单存在,则为表单绑定onsubmit事件
-          this.checkForm(this.form);
-        }
-      }
-
-      this.initOk = true;
-    } catch (e) {
-      if (this.debug)
-        //alert('方法init执行异常:'+e);
-        console.log("方法init执行异常:" + e);
-    }
-  },
-
-  /** 设定显示表单验证结果的iframe的显示内容* */
-  setMsg: function (rsArr) {
-    // try{
-    // 调用iframe中的方法,设置表单验证结果的iframe的显示内容
-
-    if (!rsArr || rsArr.length == 0) return;
-
-    //  console.log(rsArr)
-    //this.MsgDiv.firstChild.innerHTML = rsArr[0].msg + "<div class=\"flashMsg-up warningFlashMsg-up\"></div>";
-    this.MsgDiv.querySelector(".msgDiv-content").innerHTML = rsArr[0].msg;
-    // 暂时隐藏20181128
-    // window.top.frames[this.MsgIframeIdorName].setMsg(rsArr);
-
-    // alert(document.frames.length);
-
-    // }catch(e){
-    // if(this.debug)
-    // alert('方法setMsg执行异常:'+e.message);
-    // }
-  },
-
-  /**
-   * 返回传入对象e的绝对坐标,并作为一个对象返回
-   *
-   * @param {}
-   *            e
-   * @return {"x": x, "y": y}
-   */
-  getAbsPoint: function (e) {
-    try {
-      var x = e.offsetLeft;
-      var y = e.offsetTop;
-      var w = e.offsetWidth;
-      var h = e.offsetHeight;
-
-      /**
-       * OffsetParent为从中计算偏移量的元素。 如果某个元素的父级或此元素层次结构中的其他元素使用相对或绝对定位, 则 OffsetParent
-       * 将成为当前元素嵌套到的第一个相对或绝对定位元素。如果当前元素以上的任何元素都不是绝对 或相对定位的,则 OffsetParent 将是文档的
-       * BODY 标记。
-       *
-       * obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素。 obj.offsetLeft 指 obj
-       * 距离左方或上层控件的位置,整型,单位像素。
-       *
-       * offsetTop与offsetLeft均为相对偏移量,但是下面不断地拿offsetParent的偏移量来累加,
-       * 直至拿到offsetParent为body之后,就没有offsetParent了,此时循环才终止。
-       * 最终计算出来的x,y为e相对body的绝对坐标。
-       */
-      while ((e = e.offsetParent)) {
-        // 只要对象的offsetParent存在,则继续累加XY,
-
-        x += e.offsetLeft;
-        y += e.offsetTop;
-      }
-
-      return {
-        x: x,
-        y: y,
-        w: w,
-        h: h,
-      };
-    } catch (e) {
-      if (this.debug)
-        //alert('方法getAbsPoint执行异常:'+e);
-        console.log("方法getAbsPoint执行异常:" + e);
-    }
-  },
-
-  /**
-   * refleshIframeFun:function(){ if(!this.hasRefleshedIframe){
-   * document.getElementById("validationDiv").innerHTML='<iframe name="msgIframe"
-   * id="msgIframe" src="'+validationManagerPath+ '/validationMsg.html"
-   * scrolling="no" frameborder="0" style="visibility: visible;position: absolute;
-   * width: 100%; height: 100%;"></iframe>'; this.hasRefleshedIframe = true; } },
-   */
-  /**
-   * MsgDiv定位于要校验的目标input元素的上方
-   *
-   * @param {}
-   *            targetInput 要校验的目标input元素
-   */
-  showMsgDiv: function (targetInput, msg) {
-    try {
-      wd.flashMsg.show({
-        el: targetInput, // 吸附的元素
-        msg: msg, // 内容
-        animate: false,
-      });
-    } catch (e) {
-      console.log(e);
-    }
-
-    if (true) return;
-    // try{
-
-    // this.refleshIframeFun();
-
-    var win = window;
-    var xy = this.recursionIframe(win);
-    //		var inputElem = document.getElementsByName(targetInput.name)[0];
-    var offset = this.getInputOffset(targetInput, true);
-    var height = this.MsgDiv.offsetHeight;
-    this.MsgDiv.style.left = xy.x + offset.left + "px";
-    var tailDiv = this.MsgDiv.querySelector(".msgDiv-tail");
-    var msgtop;
-    if (offset.top < window.innerHeight / 2) {
-      //录入框下方,尾巴向上
-      msgtop = xy.y + offset.top + 38 + "px";
-      tailDiv.setAttribute("class", "msgDiv-tail flashMsg-up");
-    } else {
-      //录入框上方,尾巴向下
-      msgtop = xy.y + offset.top - height - 38 + "px";
-      tailDiv.setAttribute("class", "msgDiv-tail flashMsg-down");
-    }
-    this.MsgDiv.style.top = msgtop;
-
-    // 调用隐藏的方法,让tips在3s后隐藏
-    var dom = this.MsgDiv;
-    function hideDom(dom) {
-      dom.style.top = "-500px";
-    }
-    if (validationTimeOutId) clearTimeout(validationTimeOutId);
-
-    validationTimeOutId = setTimeout(function () {
-      hideDom(dom);
-    }, 3000);
-
-    /**
-     * }catch(e){ if(this.debug) alert('方法执行异常:'+e); }
-     */
-  },
-
-  /**
-   * 获取输入光标在页面中的坐标 【..】
-   *
-   * @param {HTMLElement}
-   *            输入框元素
-   * @param {Boolean}
-   *            返回焦点光标顶部的top值(默认false)
-   * @return {Object} 返回left和top
-   */
-  getInputOffset: function (elem, focusTop) {
-    var that = this,
-      cloneDiv = "{$clone_div}",
-      cloneLeft = "{$cloneLeft}",
-      cloneFocus = "{$cloneFocus}",
-      cloneRight = "{$cloneRight}",
-      none = '<span style="white-space:pre-wrap;"> </span>',
-      div = elem[cloneDiv] || document.createElement("div"),
-      left = elem[cloneLeft] || document.createElement("span"),
-      focus = elem[cloneFocus] || document.createElement("span"),
-      right = elem[cloneRight] || document.createElement("span"),
-      offset = that._offset(elem),
-      index = this._getFocus(elem),
-      focusOffset = {
-        left: 0,
-        top: 0,
-      };
-
-    div.style.width = this._getStyle(elem, "width");
-    div.style.height = this._getStyle(elem, "height");
-
-    try {
-      div.scrollLeft = elem.scrollLeft;
-      div.scrollTop = elem.scrollTop;
-    } catch (e) {} // IE8
-
-    left.innerHTML = ((elem.value && elem.value.substring(0, index)) || "")
-      .replace(/</g, "&lt;")
-      .replace(/>/g, "&gt;")
-      .replace(/\n/g, "<br/>")
-      .replace(/\s/g, none);
-    right.innerHTML = (
-      (elem.value && elem.value.substring(index, elem.value.length)) ||
-      ""
-    )
-      .replace(/</g, "&lt;")
-      .replace(/>/g, "&gt;")
-      .replace(/\n/g, "<br/>")
-      .replace(/\s/g, none);
-
-    focus.style.display = "inline-block";
-    try {
-      focusOffset = this._offset(focus);
-    } catch (e) {}
-    focus.style.display = "none";
-
-    return {
-      left: offset.left + focusOffset.left,
-      top: offset.top + focusOffset.top + (focusTop ? focus.offsetHeight : 0),
-    };
-  },
-
-  // 获取元素在页面中位置
-  _offset: function (elem) {
-    var box = elem.getBoundingClientRect();
-    var doc = elem.ownerDocument;
-    var body = doc.body;
-    var docElem = doc.documentElement;
-    var clientTop = docElem.clientTop || body.clientTop || 0;
-    var clientLeft = docElem.clientLeft || body.clientLeft || 0;
-    var top = box.top + (self.pageYOffset || docElem.scrollTop) - clientTop;
-    var left = box.left + (self.pageXOffset || docElem.scrollLeft) - clientLeft;
-
-    return {
-      left: left,
-      top: top,
-    };
-  },
-
-  // 获取光标在文本框的位置
-  _getFocus: function (elem) {
-    var index = 0;
-    if (elem.nodeName === "TEXTAREA") {
-      if (document.selection) {
-        // IE Support
-        elem.focus();
-        var Sel = document.selection.createRange();
-        var Sel2 = Sel.duplicate();
-        Sel2.moveToElementText(elem);
-        var index = -1;
-        while (Sel2.inRange(Sel)) {
-          Sel2.moveStart("character");
-          index++;
-        }
-      } else if (elem.selectionStart || elem.selectionStart == "0") {
-        // Firefox
-        // support
-        index = elem.selectionStart;
-      }
-      return index;
-    } else {
-      // input
-      if (document.selection) {
-        // IE Support
-        elem.focus();
-        var Sel = document.selection.createRange();
-        Sel.moveStart("character", -elem.value.length);
-        index = Sel.text.length;
-      } else if (elem.selectionStart || elem.selectionStart == "0") {
-        // Firefox
-        // support
-        index = elem.selectionStart;
-      }
-      return index;
-    }
-  },
-
-  // 获取最终样式
-  _getStyle:
-    "getComputedStyle" in window
-      ? function (elem, name) {
-          return getComputedStyle(elem, null)[name];
-        }
-      : function (elem, name) {
-          return elem.currentStyle[name];
-        },
-
-  /** 隐藏MsgDiv的方法* */
-  hideMsgDiv: function () {
-    // try{
-
-    //      this.MsgDiv.style.top = "-500px";
-    /**
-     * }catch(e){ if(this.debug) alert('方法showMsgD\niv执行异常:'+e); }
-     */
-
-    try {
-      wd.flashMsg.clear();
-    } catch (e) {
-      console.log(e);
-    }
-  },
-
-  /**
-   * 为指定的input元素绑定校验方法的公共方法
-   */
-  initInput: function (validationInfo) {
-    try {
-      this.init(); // 初始化变量的方法
-
-      this.validationInfos.push(validationInfo);
-
-      for (var i = 0; i < validationInfo.formElems.length; i++) {
-        // 被校验的表单元素
-        var targetInput = validationInfo.formElems[i];
-
-        // 保存校验信息到表单元素中
-        if (!targetInput.validationInfos) {
-          targetInput.validationInfos = [];
-        }
-
-        targetInput.validationInfos.push(validationInfo);
-
-        //				console.log(targetInput.validationInfos)
-        /** 保存原来的borderBottomColor* */
-        if (targetInput.style.borderBottomColor)
-          targetInput.oldBorderColor = targetInput.style.borderBottomColor;
-        else targetInput.oldBorderColor = "default";
-
-        targetInput.validationManager = this;
-
-        //				$(targetInput).addClass("validation-"+targetInput.tagName.toLowerCase());
-        $(targetInput).addClass("border-" + targetInput.tagName.toLowerCase());
-
-        if (realTimeCheck) {
-          // 如果要进行实时检查
-
-          var activeFun = function () {
-            //if(this.value!==''&&this.value!==null){
-            this.validationManager.checkForRealTime(this); // 检查目标input元素的值
-            /*
-                        }else{
-                        this.style.borderBottomColor='';//清空则去掉红框
-                        this.validationManager.hideMsgDiv();// 隐藏MsgDiv
-                        }
-                         */
-            //						targetInput.style.borderBottomColor="blue"
-          };
-
-          /** 为要校验的input元素绑定获得焦点事件* */
-          this.addEventListener(
-            targetInput, // 需绑定监听事件的DOM元素
-            "onfocus", // 事件名称,如:onclick
-            activeFun
-          ); // 事件触发的回调函数
-
-          this.mouseoverEvent(targetInput, activeFun);
-
-          /** 为要校验的input元素绑定失去焦点事件* */
-          var onblurFun = function () {
-            // 隐藏MsgDiv   暂时去掉20181128
-            //	this.validationManager.hideMsgDiv();
-            //						targetInput.style.borderBottomColor=""
-          };
-          this.addEventListener(
-            targetInput, // 需绑定监听事件的DOM元素
-            "onblur", // 事件名称,如:onclick
-            onblurFun
-          ); // 事件触发的回调函数
-          //初始化ueditor的校验事件
-          if (
-            typeof EditorManager != "undefined" &&
-            EditorManager &&
-            (validationInfo.argsObj.isUeditor == true ||
-              validationInfo.argsObj.isUeditor == "true")
-          ) {
-            var vmr = this;
-            window.ueCallback = window.ueCallback || [];
-            var name = validationInfo.argsObj.editorName;
-            window.ueCallback[name] = window.ueCallback[name] || [];
-            window.ueCallback[name].push(function () {
-              EditorManager.getWDEditor(validationInfo.argsObj.editorName)
-                .getUeditor()
-                .addListener("selectionchange", function () {
-                  // vmr.addEventListener(targetInput, // 需绑定监听事件的DOM元素
-                  // 'onblur', // 事件名称,如:onclick
-                  // onblurFun);
-                  // vmr.addEventListener(targetInput, // 需绑定监听事件的DOM元素
-                  // 'onfocus', // 事件名称,如:onclick
-                  // activeFun); // 事件触发的回调函数
-                  var iframe_ = EditorManager.getEditorFrame(name);
-                  iframe_.validationInfo = targetInput.validationInfo;
-                  iframe_.validationInfos = targetInput.validationInfos;
-                  iframe_.validationManager = targetInput.validationManager;
-                  onblurFun.call(iframe_);
-                  activeFun.call(iframe_);
-                });
-            });
-          }
-          //				if(targetInput.tagName.toUpperCase()=='SELECT'){// 如果要校验的不是select元素
-          //					/** 为要校验的input元素绑定键盘点击事件* */
-          //					this.addEventListener(targetInput,// 需绑定监听事件的DOM元素
-          //	 							'onkeyup',// 事件名称,如:onclick
-          //	 							activeFun);// 事件触发的回调函数
-          //				}else{
-          //
-          //					/** 为要校验的input元素绑定键盘点击事件* */
-          //					this.addEventListener(targetInput,// 需绑定监听事件的DOM元素
-          //	 							'onchange',// 事件名称,如:onclick
-          //	 							activeFun);// 事件触发的回调函数
-          //				}
-
-          var eventType = null;
-          //选择合适的时间为元素绑定
-          //select
-          if (targetInput.tagName == "SELECT") {
-            eventType = "onchange";
-            //input
-          } else if (
-            targetInput.tagName == "INPUT" ||
-            targetInput.tagName == "TEXTAREA"
-          ) {
-            eventType = "onkeyup";
-            if (targetInput.type == "button") {
-              eventType = "onclick";
-            }
-            //button
-          } else if (targetInput.tagName == "button") {
-            eventType = "onclick";
-          }
-
-          if (eventType == null) {
-            console.log(targetInput);
-            console.log("元素不支检验");
-            //alert("元素不支检验")
-            return;
-          }
-
-          //为元素绑定即时校验事件
-          this.addEventListener(
-            targetInput, // 需绑定监听事件的DOM元素
-            eventType, // 事件名称,如:onclick
-            activeFun
-          ); // 事件触发的回调函数
-        }
-      } // for
-
-      //预校验,不用等到提交表单才校验  By Rd 2015-11-12
-      this.checkAll(targetInput.validationInfos);
-
-      //          this.MsgDiv.style.top = "-500px"
-      this.hideMsgDiv();
-    } catch (e) {
-      console.log(e);
-      if (this.debug)
-        //alert('方法initInput执行异常:'+e);
-        console.error("方法initInput执行异常:" + e);
-    }
-  },
-
-  /**
-   * 为指定的表单元素绑定校验方法
-   */
-  add: function (
-    validatorStr, // 内容为校验方法全路径的字符串
-    formElems, // 被校验的表单元素的name或id
-    argsObj, // 内容为当前校验器使用的参数组成的关联数组
-    type
-  ) {
-    // 校验结果严重等级
-    try {
-      if (!type) type = ValidationManager.MSG_TYPE_ERROR;
-
-      var validationInfo = {}; // 保存一次校验所需信息的集合
-
-      validationInfo.funRef = this.getFunRef(validatorStr); // 校验器方法引用
-      validationInfo.argsObj = argsObj; // 内容为当前校验器使用的参数组成的关联数组
-      validationInfo.type = type; // 校验结果严重等级
-
-      validationInfo.formElems = []; // 被校验的表单元素
-
-      validationInfo.isNull = function () {
-        return this.formElems[0].value ? false : true;
-      };
-
-      //	validationInfo.formElems=this.getElements(eName);
-      //查找表单元素
-      for (var i = 0; i < formElems.length; i++) {
-        var eName = formElems[i];
-        if (window.growHeightList && window.growHeightList[eName]) {
-          var gh = window.growHeightList[eName];
-          var elems = [gh.getInputElement()];
-          if (elems)
-            validationInfo.formElems = validationInfo.formElems.concat(elems);
-        } else {
-          var elems = this.getElements(eName);
-          if (elems)
-            validationInfo.formElems = validationInfo.formElems.concat(elems);
-        }
-      }
-
-      //bmxy1.xy
-      //批量录入
-      if (formElems[0].split(/\./).length == 2) {
-        argsObj["namePrefix"] = formElems[0].split(/\./)[0] + ".";
-      } else {
-        argsObj["namePrefix"] = "";
-      }
-      validationInfo.name = formElems[0];
-
-      //	console.log(validationInfo)
-      //只有找到对应表单元素时才绑定校验方法 张敏聪2015-10-30
-      if (validationInfo.formElems.length > 0) {
-        // 为指定的input元素绑定校验方法的公共方法
-        this.initInput(validationInfo);
-      }
-    } catch (e) {
-      if (this.debug) console.log("方法add执行异常:" + e);
-      //alert('方法add执行异常:'+e);
-    }
-  },
-  remove: function (
-    validatorStr, // 校验器方法的全路径字符串
-    formElems // 需要移除校验的表单元素的 name 或 id
-  ) {
-    try {
-      // 获取校验方法引用
-      var validationInfo = {
-        funRef: this.getFunRef(validatorStr),
-        formElems: []
-      };
-  
-      // 查找表单元素
-      for (var i = 0; i < formElems.length; i++) {
-        var eName = formElems[i];
-        var elems = this.getElements(eName);
-        if (elems) {
-          validationInfo.formElems = validationInfo.formElems.concat(elems);
-        }
-      }
-  
-      // 如果找到了对应的表单元素
-      if (validationInfo.formElems.length > 0) {
-        for (var j = 0; j < validationInfo.formElems.length; j++) {
-          var elem = validationInfo.formElems[j];
-  
-          // 1. 移除所有校验相关事件绑定
-          $(elem).off('input.validation keyup.validation change.validation focus.validation blur.validation');
-  
-          // 2. 移除校验提示信息(如错误消息)
-          $(elem).removeClass('validation-error'); // 移除错误样式
-          $(elem).next('.validation-error-msg').remove(); // 移除错误提示信息
-  
-          // 3. 恢复原始样式(例如,边框颜色)
-          if (elem.oldBorderColor) {
-            elem.style.borderBottomColor = elem.oldBorderColor;
-          } else {
-            elem.style.borderBottomColor = ''; // 如果没有保存原始样式,使用默认样式
-          }
-  
-          // 4. 移除与必填项标记 `span` 无关的样式
-          var spanId = elem.name + "Span"; // 拼接出对应的 span id,例如 "jfrxmSpan"
-          var spanElem = document.getElementById(spanId);
-          if (spanElem) {
-            spanElem.remove(); // 直接删除这个 span 元素
-          }
-  
-          // 5. 移除校验信息缓存
-          this.validationInfos = this.validationInfos.filter(function(info) {
-            return info.funRef !== validationInfo.funRef || 
-                  !info.formElems.some(elem => validationInfo.formElems.includes(elem));
-          });
-
-          // 6. 清理校验信息缓存
-          if (elem.validationInfos) {
-            elem.validationInfos = elem.validationInfos.filter(function(info) {
-              return info.funRef !== validationInfo.funRef;
-            });
-          }
-
-        }
-      }
-    } catch (e) {
-      if (this.debug) console.log("方法 remove 执行异常: " + e);
-    }
-  }
-  ,
-  
-  /**
-   * 执行一次校验
-   *
-   * @param {}
-   *            validationInfo 保存一次校验的配置的对象
-   * 				单个校验
-   */
-  check: function (validationInfo, targetinput) {
-    var rs = {}; // 保存校验结果的对象
-    var funRef = validationInfo.funRef; // 校验器方法引用
-    var argsObj = validationInfo.argsObj; // 内容为当前校验器使用的参数组成的关联数组
-    var type = validationInfo.type; // 校验结果严重等级
-    //	console.log(targetinput.validationInfos)
-    var funArgs = [];
-    //2017-12-4 zhangmincong radio判断
-    //      if (targetinput.type && 'radio|checkbox'.indexOf(targetinput.type.toLowerCase()) > -1) {
-    //          var rdos = document.querySelectorAll("[type='" + targetinput.type + "'][name='" + targetinput.name + "']"),
-    //          value;
-    //          console.log(rdos)
-    //          for (var i = 0; i < rdos.length; i++) {
-    //              console.log(rdos[i].checked)
-    //              if (rdos[i].checked == true) {
-    //                  value = rdos[i].value;
-    //                  break;
-    //              }
-    //          }
-    //          funArgs.push([value]);
-    //      } else if ((typeof EditorManager != "undefined") && (argsObj.isUeditor == true || argsObj.isUeditor == "true")) {
-    //          if (EditorManager.getWDEditor(argsObj.editorName)) {
-    //              var value = EditorManager.getWDEditor(argsObj.editorName).getUeditor().getContent();
-    //              value = wd.display.toPlainText(value);
-    //              // console.log("ueditorValue:"+value);
-    //              funArgs.push([value]);
-    //          }
-    //      } else if (targetinput.tagName == "DIV") {
-    //          funArgs.push([targetinput.innerHTML])
-    //      } else if (targetinput.GrowHeight) {
-    //          funArgs.push([targetinput.GrowHeight.val()]);
-    //      } else {
-    //          funArgs.push([targetinput.value])
-    //      }
-    //		console.log(targetinput);
-    //      funArgs.push(argsObj)
-    // var win = window;
-    // var xy = this.recursionIframe(win);
-
-    // 调用校验器进行校验
-    var msg;
-    try {
-      //          msg = funRef.apply(window, funArgs);
-
-      //校验器获取根据name获得其他录入
-      var environment = {
-        argsObj: argsObj,
-        getElementValue: function (name) {
-          //单个或 批量 取值
-          var n = this.argsObj.namePrefix + name;
-          //id查找
-          var ele = document.querySelector("input[id='" + n + "']");
-          if (ele) return ele.value;
-          //name查找
-          var box = wd.display.getInputBox(n, true);
-          return box ? box.getValue() : null;
-        },
-        setElementValue: function (name, value) {
-          //单个或 批量 设值.....自动填写性别、出生地区、出生日期
-          var n = this.argsObj.namePrefix + name;
-          //name查找
-          var box = wd.display.getInputBox(n, true);
-          if (!box) {
-            console.log("set value fail:" + n);
-            return;
-          }
-          box.setValue(value);
-        },
-        modify: function (names, canModify) {
-          //names:["xm","xbm"]  录入可修改,不可修改
-
-          for (var i = 0; i < names.length; i++) {
-            var n = this.argsObj.namePrefix + names[i];
-            var box = wd.display.getInputBox(n);
-            if (box) {
-              box.modify(canModify);
-            }
-          }
-        },
-      };
-      var vbox = wd.display.getInputBox(validationInfo.name, true);
-      var vv = vbox ? vbox.getValue() : "";
-      funArgs.push([vv]);
-      funArgs.push(argsObj);
-      msg = funRef.apply(environment, funArgs);
-    } catch (e) {
-      console.error(e);
-      msg = "校验方法错误:" + validationInfo.funRef;
-    }
-    // 保存校验信息
-    rs.msg = msg;
-    rs.formElems = [targetinput];
-
-    if (msg)
-      // 如果校验不通过
-      rs.type = type;
-    else rs.type = ValidationManager.MSG_TYPE_SUCCESS;
-
-    //		console.log(rs);
-    return rs;
-  },
-  checks: function (validationInfo, targetInput) {
-    var result = [];
-    if (targetInput) {
-      var elem = targetInput;
-      var rs = this.check(validationInfo, elem);
-      //校验未通过
-      if (rs.msg && rs.msg.length > 0) {
-        result.push(rs);
-        elem.style.borderBottomColor = "red";
-      } else {
-        //通过
-        this.hideMsgDiv();
-        // 如果运行到这里证明校验通过
-        if (elem.oldBorderColor == "default") elem.style.borderBottomColor = "";
-        else elem.style.borderBottomColor = elem.oldBorderColor;
-      }
-    } else {
-      for (var i = 0; i < validationInfo.formElems.length; i++) {
-        var elem = validationInfo.formElems[i];
-        var rs = this.check(validationInfo, elem);
-        //			console.log(rs.msg)
-        //校验未通过
-        if (rs.msg && rs.msg.length > 0) {
-          result.push(rs);
-          elem.style.borderBottomColor = "red";
-        } else {
-          //通过
-          this.hideMsgDiv();
-          // 如果运行到这里证明校验通过
-          if (elem.oldBorderColor == "default")
-            elem.style.borderBottomColor = "";
-          else elem.style.borderBottomColor = elem.oldBorderColor;
-        }
-      }
-    }
-
-    return result;
-  },
-  checkInput: function (targetinput) {
-    var result = [];
-
-    //	targetinput里存有校验器
-    if (targetinput.validationInfos) {
-      var validationInfos = targetinput.validationInfos;
-      for (var i = 0; i < validationInfos.length; i++) {
-        var elem = targetinput;
-
-        var rs = this.check(validationInfos[i], elem);
-
-        //校验未通过
-        if (rs.msg && rs.msg.length > 0) {
-          result.push(rs);
-
-          //				elem.style.borderBottomColor='red';
-        } else {
-          //通过
-          //				this.hideMsgDiv()
-          //				// 如果运行到这里证明校验通过
-          //				if(elem.oldBorderColor=='default')
-          //					elem.style.borderBottomColor='';
-          //				else
-          //					elem.style.borderBottomColor=elem.oldBorderColor;
-        }
-      }
-    }
-
-    return result;
-  },
-  /**
-   * 对数组中消息进行排序。
-   */
-  sortRs: function (a, b) {
-    if (!a || !b) return -1;
-
-    var typeA = a.type;
-    var typeB = b.type;
-
-    if (typeB == ValidationManager.MSG_TYPE_ERROR) {
-      return 1;
-    } else return -1;
-  },
-
-  /**
-   * 获取表单元素的名字或ID
-   */
-  getNameOrId: function (formElem) {
-    if (formElem.name) return formElem.name;
-    else return formElem.id;
-  },
-
-  /**
-   * 为保存到数组rsArr的消息,添加前缀。
-   */
-  addMsgPrefix: function (rsArr) {
-    for (var i = 0; i < rsArr.length; i++) {
-      var rs = rsArr[i];
-
-      var prefix;
-
-      if (rs.type == ValidationManager.MSG_TYPE_SUCCESS) {
-        prefix = "正确:";
-      } else if (rs.type == ValidationManager.MSG_TYPE_ERROR) {
-        prefix = "错误:";
-      } else if (rs.type == ValidationManager.MSG_TYPE_WARNING) {
-        prefix = "警告:";
-      }
-
-      rs.msg = prefix + rs.msg;
-      console.log(rs);
-    }
-  },
-
-  /**
-   * 检查所有要校验的input元素,并返回校验失败的结果
-   */
-  checkAll: function (validationInfos, targetInput) {
-    var rsArr = []; // 返回的校验结果
-
-    var allFormElems = []; // 保存所有要校验的表单元素
-    var errFormElems = {}; // 所有校验不通过的表单元素
-
-    for (var i = 0; i < validationInfos.length; i++) {
-      // 一个校验信息
-      var validationInfo = validationInfos[i];
-      /**
-       * 校验并获得校验结果 rs.msg = msg; rs.type = type; rs.formElems = formElems;
-       */
-      for (var j = 0; j < validationInfo.formElems.length; j++) {
-        var elem = validationInfo.formElems[j];
-        var rs = this.check(validationInfo, elem);
-        //				console.log(rs.msg)
-        //校验未通过
-        if (rs.msg && rs.msg.length > 0) rsArr.push(rs);
-
-        this.via(elem, rs.msg);
-
-        //				if (rs.msg && rs.msg.length > 0) {
-        //					rsArr.push(rs)
-        //					elem.style.borderBottomColor = 'red';
-        //					this.checkObjectPicker(elem,rs.msg);
-        //				} else { //通过
-        //
-        //					// 如果运行到这里证明校验通过
-        //					if (elem.oldBorderColor == 'default')
-        //						elem.style.borderBottomColor = '';
-        //					else
-        //						elem.style.borderBottomColor = elem.oldBorderColor;
-        //
-        //					this.checkObjectPicker(elem);
-        //					this.hideMsgDiv()
-        //				}
-      }
-    }
-
-    // 对消息进行排序
-    // rsArr.sort(this.sortRs);
-
-    // 为保存到数组rsArr的消息,添加前缀。
-    // this.addMsgPrefix(rsArr);
-    //  console.log(rsArr)
-    return rsArr;
-  },
-
-  /**
-   * 如果校验通过,返回true
-   */
-  passValidation: function (rsArr) {
-    var rs = true;
-    if (rsArr && rsArr.length > 0) rs = false;
-    return rs;
-  },
-
-  /**
-   * 实时校验的方法
-   *
-   * @param {}
-   *            targetInput目标input元素
-   */
-  checkForRealTime: function (targetInput) {
-    // try{
-    if (window.event && "focus" == window.event.type) {
-      //          this.MsgDiv.style.top = "-500px"
-      this.hideMsgDiv();
-      return;
-    }
-
-    // 获得当前表单元素校验不通过的消息集
-    var rsArr = this.checkInput(targetInput);
-
-    var isnullFunction = false;
-
-    //		if(targetInput.validationInfos&&targetInput.validationInfos.length==1){
-    ////			console.log(targetInput.validationInfos[0].funRef==wd.commonValidator.notNull)
-    //			isnullFunction=(targetInput.validationInfos[0].funRef==wd.commonValidator.notNull)
-    //		}
-    //        isnullFunction = !$(targetInput).val()    // 去掉,导致鼠标进入时不显示错误信息 -- 不知干啥用???Lin
-
-    //		console.log(targetInput.validationInfos);
-    if (window.event) {
-      if (window.event.type == "keyup") isnullFunction = false;
-    }
-
-    if (!isnullFunction) this.setMsg(rsArr); // 设定显示表单验证结果的iframe的显示内容
-    //		console.log(rsArr);
-    this.via(targetInput, rsArr, isnullFunction);
-    //console.log(targetInput)
-    // 校验不通过,显示校验信息
-    //		if (!this.passValidation(rsArr)) {
-    ////			this.checkObjectPicker(targetInput,rsArr);
-    ////			targetInput.style.borderBottomColor = "red"
-    //			this.showMsgDiv(targetInput); // MsgDiv定位于要校验的目标input元素的上方
-    //		} else { // 校验通过
-    ////			this.checkObjectPicker(targetInput);
-    //
-    ////			if (targetInput.oldBorderColor == 'default') {
-    ////				targetInput.style.borderBottomColor = '';
-    ////			} else {
-    ////				targetInput.style.borderBottomColor = targetInput.oldBorderColor;
-    ////			}
-    //			this.hideMsgDiv(); // 隐藏MsgDiv
-    //		}
-
-    return rsArr;
-
-    /*
-     * }catch(e){ if(this.debug) alert('方法checkForRealTime执行异常:'+e.message); }
-     */
-  },
-
-  recursionIframe: function (win) {
-    if (win.parent == top && win.parent == win) {
-      // var xy = this.getAbsPoint(win);
-
-      return {
-        x: 0,
-        y: 0,
-        w: 0,
-        h: 0,
-      };
-    }
-    var winPar = win.parent; // .opener
-    var iframeArr = winPar.document.getElementsByTagName("IFRAME");
-    var targetIframe;
-    for (var i = 0; i < iframeArr.length; i++) {
-      var iframeElem = iframeArr[i];
-      if (iframeElem.contentWindow == win) {
-        targetIframe = iframeElem;
-        break;
-      }
-    }
-    // alert(targetIframe==null)
-    var xy = this.getAbsPoint(targetIframe);
-
-    if (winPar.parent != winPar) {
-      var xy2 = this.recursionIframe(winPar);
-      xy.x += xy2.x;
-      xy.y += xy2.y;
-    }
-
-    return xy;
-  },
-  findObjectPickerInputer: function (target) {
-    var name = target.getAttribute("name");
-    if (!name) return;
-    var inputer = document.querySelector("[name=" + name + "Name]");
-    if (!inputer) {
-      inputer = document.querySelector("[name=" + name + "Input]");
-      if (!inputer && /id$/.test(name)) {
-        var inputName = name.replace(/id$/, "Name");
-        inputer = document.querySelector("[name=" + inputName + "]");
-      }
-      if (!inputer && /m$/.test(name)) {
-        var inputName = name.replace(/m$/, "Name");
-
-        inputer = document.querySelector("[name=" + inputName + "]");
-      }
-    }
-    return inputer;
-  },
-  checkObjectPicker: function (target, msg) {
-    var name = target.getAttribute("name");
-
-    var obj = wd.edit.objectPicker.getInstance(name);
-    if (!obj) return;
-    if (msg) {
-      obj.failValidation();
-    } else {
-      obj.passValidation();
-    }
-
-    //		var inputer=this.findObjectPickerInputer(target);
-    //		if(!inputer)return;
-    //		if(msg){
-    //			inputer.style.border="red 1px solid";
-    //		}else{
-    //			inputer.style.border="";
-    //
-    //		}
-  },
-  via: function (targetInput, msg, isnullFunction) {
-    var gh = targetInput.GrowHeight;
-    var name = targetInput.getAttribute("name");
-    if (gh != null) {
-      name = targetInput.GrowHeight.getName();
-    }
-    if (!name || !wd.edit) return;
-
-    var leftSpan = document.getElementById(name + "Span");
-
-    if (!leftSpan) {
-      leftSpan = document.createElement("span");
-      leftSpan.setAttribute("id", name + "Span");
-      //			leftSpan.setAttribute("class","validation-span");
-      leftSpan.setAttribute("class", "border-input-error vLine-leftWarning");
-      //			leftSpan.style.borderLeft=" 1px solid red",
-      //			leftSpan.style.height="100%";
-      //  		leftSpan.style.display= "none";
-      //  		leftSpan.style.position="absolute";
-      //  		leftSpan.style.left="0px";
-    }
-
-    if (gh != null) {
-      var growHeightElement = gh.getElement();
-      growHeightElement.parentNode.insertBefore(leftSpan, growHeightElement);
-    } else {
-      targetInput.parentNode.insertBefore(leftSpan, targetInput);
-    }
-    var obj;
-    try {
-      obj = wd.edit.objectPicker
-        ? wd.edit.objectPicker.getInstance(name)
-        : null;
-    } catch (e) {
-      console.log(e);
-    }
-
-    // // 获取或创建错误提示容器
-    // function getErrorContainer() {
-    //   let errorContainer = document.getElementById("error-container");
-    //   if (!errorContainer) {
-    //     errorContainer = document.createElement("div");
-    //     errorContainer.id = "error-container"; // 设置唯一ID
-    //     errorContainer.style.cssText = `
-    //         position: fixed;
-    //         left: 0;
-    //         right: 0;
-    //         bottom: 0;
-    //         text-align: center;
-    //         background-color: #fff;
-    //         padding: 10px;
-    //         z-index: 1000;
-    //         display: flex;
-    //         font-size:1rem;
-    //         color: red;
-    //         justify-content: center;
-    //         align-items: center;
-    //         flex-direction: column;
-    //         min-height: 50px; /* 限制为五条信息的高度 */
-    //         overflow-y: auto; /* 超过五条信息时出现滚动条 */
-    //         `;
-    //     document.body.appendChild(errorContainer);
-    // }
-    // return errorContainer;
-    // }
-
-    // // 添加错误信息
-    // function addErrorMessage(name, msg) {
-    //   const errorContainer = getErrorContainer();
-    //   const errorId = `${name}-error`; // 基于 name 属性生成唯一的错误消息 ID
-
-    //   let errorMessage = document.getElementById(errorId);
-    //   if (!errorMessage) {
-    //     // 如果不存在,创建新的错误消息
-    //     errorMessage = document.createElement("div");
-    //     errorMessage.id = errorId; // 给错误消息设置唯一 ID
-    //     errorContainer.appendChild(errorMessage);
-    //   }
-    //   // 更新错误消息内容
-    //   errorMessage.textContent = msg;
-    // }
-
-    // // 移除特定错误信息
-    // function removeErrorMessage(name) {
-    //   const errorId = `${name}-error`;
-    //   const errorMessage = document.getElementById(errorId);
-    //   if (errorMessage) {
-    //     errorMessage.remove(); // 删除对应的错误消息
-    //   }
-    // }
-
-    // // 检查并移除错误容器
-    // function removeErrorContainerIfEmpty() {
-    //   const errorContainer = document.getElementById("error-container");
-    //   if (errorContainer && errorContainer.children.length === 0) {
-    //     errorContainer.remove(); // 容器中无内容时移除
-    //   }
-    // }
-
-    // 添加错误信息到指定的td元素中
-    function addErrorMessage(name, msg) {
-      const element = document.getElementsByName(name)[0]; // 获取 name 对应的元素
-      if (element) {
-        const tdElement = element.closest('td'); // 查找最近的父级 td 元素
-        if (tdElement) {
-          let errorMessage = tdElement.querySelector('.error-message'); // 查找是否已有错误信息元素
-          if (!errorMessage) {
-            // 如果不存在,创建一个新的错误信息元素
-            errorMessage = document.createElement("div");
-            errorMessage.className = "error-message"; // 设置一个类名,方便样式管理
-            errorMessage.style.cssText = `
-              position: absolute;
-              left: 0;
-              bottom: 0;
-              text-align: center;
-              color: red;
-              font-size:12px;
-              width: 100%;
-              text-align: right;
-              line-height: 18px;
-              height: 18px;
-            `;
-            tdElement.appendChild(errorMessage); // 将错误信息添加到 td 中
-            tdElement.style.borderBottom = "1px solid red";
-          }
-          errorMessage.textContent = msg; // 更新错误信息内容
-        }
-      }
-    }
-
-    // 移除特定错误信息
-    function removeErrorMessage(name) {
-      const element = document.getElementsByName(name)[0]; // 获取 name 对应的元素
-      if (element) {
-        const tdElement = element.closest('td'); // 查找最近的父级 td 元素
-        if (tdElement) {
-          const errorMessage = tdElement.querySelector('.error-message'); // 查找错误信息元素
-          if (errorMessage) {
-            errorMessage.remove(); // 删除错误信息元素
-          }
-        }
-        tdElement.style.borderBottom = "";
-      }
-    }
-
-    if (!this.passValidation(msg)) {
-      
-      leftSpan.style.display = "";
-      if (msg && msg.length > 0 && msg[0].msg) {
-        if (!isnullFunction) {
-          
-          if (obj) {
-            if(isMobile()){
-              addErrorMessage(obj, msg[0].msg); // 添加或更新错误消息
-            }else{
-              this.showMsgDiv(obj.getDisplayElement(), msg[0].msg);
-            }
-          } else {
-            // 如果是移动端,在底部显示错误信息,否则在气泡
-            if(isMobile()){
-              addErrorMessage(name, msg[0].msg); // 添加或更新错误消息
-            }else{
-              this.showMsgDiv(targetInput, msg[0].msg);
-            }
-          }
-        }
-      }
-    } else {
-      // 校验通过
-      removeErrorMessage(name); // 移除当前 name 对应的错误消息
-      //removeErrorContainerIfEmpty(); // 如果没有错误信息,移除容器
-      //			this.checkObjectPicker(targetInput);
-      leftSpan.style.display = "none";
-      //			targetInput.style.borderColor = '';
-      this.hideMsgDiv(); //隐藏MsgDiv;
-    }
-  },
-  mouseoverEvent: function (targetInput, activeFun) {
-    var THIS = this;
-    var target = targetInput;
-    var name = targetInput.getAttribute("name");
-
-    if (name && wd.edit && wd.edit.objectPicker) {
-      var obj = wd.edit.objectPicker.getInstance(name);
-      if (obj) {
-        target = obj.getDisplayElement();
-      }
-    }
-    var f = function () {
-      activeFun.call(targetInput);
-    };
-
-    $(target)
-      .on("mouseenter", f)
-      .on("mouseout", function () {
-        //			console.log(window.event)
-        //			if(window.event.srcElement!=target)return false
-        if ($(target).find(window.event.relatedTarget).length == 1)
-          return false;
-        //			console.log(window.event.srcElement)
-        //          THIS.MsgDiv.style.top = "-500px"
-        THIS.hideMsgDiv();
-      });
-    //		this.addEventListener(target, // 需绑定监听事件的DOM元素
-    //		'onmouseenter', // 事件名称,如:onclick
-    //		f); // 事件触发的回调函数
-  },
-};

+ 87 - 0
api/clyy.js

@@ -0,0 +1,87 @@
+// 车辆预约api
+import request from "@/utils/request";
+
+export const clyyApi = {
+    /**
+     * 车辆查询接口(分页)
+     * @param {object} data - 查询参数
+     * @param {string} data.beginTime - 开始时间 (yyyy-MM-dd HH:mm)
+     * @param {string} data.endTime - 结束时间 (yyyy-MM-dd HH:mm)
+     * @param {number} data.pageNo - 页码,默认1
+     * @param {number} data.rowNumPer - 每页条数,默认10
+     * @returns {Promise} 返回车辆列表和分页信息 {data: [], wdPage: {pageNo, rowNumPer, rowNum}}
+     */
+    cl_search: (data) => {
+        // 默认分页参数
+        const params = {
+            pageNo: 1,
+            rowNumPer: 10,
+            ...data
+        };
+
+        return request.post(
+            `/service?ssServ=cl_search`,
+            params,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 车辆预约提交接口
+     * @param {object} data - 预约数据
+     * @param {string} data.cdids - 车辆ID
+     * @param {string} data.beginTime - 开始时间
+     * @param {string} data.endTime - 结束时间
+     * @param {string} data.mdd - 目的地
+     * @param {string} data.syyq - 使用要求
+     * @param {string} data.syrs - 使用人数
+     * @param {number} data.sfyj - 是否预警 (0/1)
+     * @param {string} data.yjsjcd - 预警时间长度
+     * @param {string} data.yjms - 预警描述
+     * @returns {Promise} 返回提交结果
+     */
+    cl_sureYd: (data) => {
+        return request.post(
+            `/service?ssServ=cl_sureYd&ssDest=info`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+    cl_searchYd: (data) => {
+        return request.post(
+            `/service?ssServ=cl_searchYd`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+    cl_initTd: (data) => {
+        return request.post(
+            `/service?ssServ=cl_initTd`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+    cl_sureTd: (data) => {
+        return request.post(
+            `/service?ssServ=cl_sureTd`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+    
+}

+ 94 - 0
api/common.js

@@ -0,0 +1,94 @@
+// 字典查询api
+import request from "@/utils/request";
+
+export const commonApi = {
+    /**
+     * 根据字典名称(cbName)和值(value)获取对应的中文显示
+     * 参考:notInputOnclick1 - objectpickertype: 2 表示获取要回显的一项
+     * @param {string} cbName - 字典名称(codebook)
+     * @param {string} value - 需要查找的值
+     * @returns {Promise} 返回对应的中文显示
+     */
+    getDictByCbNameAndValue: (cbName, value) => {
+        const data = {
+            objectpickerparam: JSON.stringify({
+                input: "false",
+                codebook: cbName
+            }),
+            objectpickertype: 2, // 2表示获取要回显的一项
+            objectpickervalue: value // 需回显的值
+        };
+
+        return request.post('/service?ssServ=loadObjpOpt&objectpickerdropdown1=1',
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 根据字典名称(cbName)获取该字典下的所有选项
+     * 参考:notInputOnclick2 - objectpickertype: 1 表示获取所有下拉菜单项
+     * @param {string} cbName - 字典名称(codebook)
+     * @returns {Promise} 返回该字典下的所有选项列表
+     */
+    getDictOptionsByCbName: (cbName) => {
+        const data = {
+            objectpickerparam: JSON.stringify({
+                input: "false",
+                codebook: cbName
+            }),
+            objectpickertype: 1, // 1表示获取所有下拉菜单项
+            objectpickersearchAll: 1
+        };
+
+        return request.post('/service?ssServ=loadObjpOpt&objectpickerdropdown1=1',
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 通用查询接口 - 支持动态ssServ参数
+     * @param {string} ssServ - 服务名称,如 'bjdm_cx'
+     * @param {object} params - 查询参数
+     * @param {number} params.pageNo - 页码,默认1
+     * @param {number} params.rowNumPer - 每页条数,默认10
+     * @param {string} params.management - 管理标识,默认'1'
+     * @param {string} params.isReady - 就绪标识,默认'1'
+     * @param {object} extraParams - 其他额外参数
+     * @returns {Promise} 返回查询结果 {objectList, ssPaging, buttonList}
+     */
+    universalQuery: (ssServ, params = {}, extraParams = {}) => {
+        // 默认参数
+        const defaultParams = {
+            pageNo: 1,
+            rowNumPer: 10,
+            management: '1',
+            isReady: '1'
+        };
+
+        // 合并参数
+        const queryParams = {
+            ...defaultParams,
+            ...params,
+            ...extraParams
+        };
+
+        console.log(`通用查询接口调用: ssServ=${ssServ}`, queryParams);
+
+        return request.post(
+            `/service?ssServ=${ssServ}&management=${queryParams.management}&isReady=${queryParams.isReady}`,
+            queryParams,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    }
+}

+ 139 - 0
api/device.js

@@ -0,0 +1,139 @@
+import deviceRequest from "@/utils/device-request"
+
+/**
+ * 设备端API
+ * 用于智慧校园设备(如家校通话设备)的接口调用
+ */
+export const deviceApi = {
+  /**
+   * 设备登录
+   * @param {string} sn - 设备序列号(devId)
+   * @param {string} cardNo - 卡号
+   * @returns {Promise} 返回登录结果,包含 userInfo 和 sessId
+   *
+   * 返回数据格式参考 h5-controller.vue handleLoginSuccess:
+   * {
+   *   success: true,
+   *   userInfo: {
+   *     sessId: 'xxx',  // JSESSIONID
+   *     ... // 其他用户信息
+   *   }
+   * }
+   */
+  login(sn, cardNo) {
+    return deviceRequest.get(
+      `/service?ssServ=ss.login&devId=${sn}&cardNo=${cardNo}&sbmc=${sn}`,
+      {},
+      {
+        loading: { title: '设备登录中...' },
+        request: {
+          timeout: 15000
+        }
+      }
+    )
+  },
+
+  /**
+   * 查询家长信息(联系人)
+   * @returns {Promise} 返回家长信息
+   *
+   * 注意:
+   * - 不需要传参数,后端通过 URL 中的 devId 和 sbmc 自动识别用户
+   * - device-request.js 会自动从 userInfo 中获取 devId 和 sbmc 添加到 URL
+   * - 现在只返回一个家长,不是数组
+   *
+   * 返回数据格式:
+   * {
+   *   data: {
+   *     ssData: {
+   *       ryid: 111129603,              // 人员ID
+   *       wbid: 'oKFvD4j...',           // 外部ID(微信openid)
+   *       xm: '测试家长1',               // 姓名
+   *       yszwj: 'path/to/image.jpg'    // 艺术照(可选,需要用 getImageUrl 转换)
+   *     },
+   *     ssCode: 0
+   *   }
+   * }
+   */
+  selParentInfo() {
+    return deviceRequest.post(
+      `/service?ssServ=selParentInfo`,
+      {},
+      {
+        loading: { title: '获取联系人...' },
+        formData: true
+      }
+    )
+  },
+
+  /**
+   * 检查个人服务状态(刷卡进入时调用)
+   * @param {string} grfwxmm - 个人服务项目码(如:视频电话、离校通知等)
+   * @returns {Promise} 返回服务状态
+   *
+   * 返回数据格式:
+   * ssCode = 0 时:
+   * {
+   *   jsfsm: '计数方式码',
+   *   zdsc: 最大时长,
+   *   zdll: 最大流量,
+   *   zdcs: 最大次数,
+   *   ljsc: 累计时长,
+   *   ljll: 累计流量,
+   *   ljcs: 累计次数,
+   *   sfmf: 是否免费,
+   *   sfty: 是否停用
+   * }
+   * ssCode > 0 时:
+   * {
+   *   ssMsg: '错误信息'
+   * }
+   */
+  grfw_chkGrfw(grfwxmm) {
+    return deviceRequest.post(
+      `/service?ssServ=grfw_chkGrfw`,
+      { grfwxmm },
+      {
+        loading: false,
+        formData: true
+      }
+    )
+  },
+
+  /**
+   * 办结个人服务(通话结束后调用)
+   * @param {object} data - 办结参数
+   * @param {string} data.grfwxmm - 个人服务项目码
+   * @param {number} data.sc - 时长(秒/分钟)
+   * @param {number} data.ll - 流量
+   * @param {string} data.ms - 附言/备注
+   * @returns {Promise} 返回办结后的服务状态
+   *
+   * 返回数据格式:
+   * ssCode = 0 时:
+   * {
+   *   jsfsm: '计数方式码',
+   *   zdsc: 最大时长,
+   *   zdll: 最大流量,
+   *   zdcs: 最大次数,
+   *   ljsc: 累计时长,
+   *   ljll: 累计流量,
+   *   ljcs: 累计次数,
+   *   sfmf: 是否免费
+   * }
+   * ssCode > 0 时:
+   * {
+   *   ssMsg: '错误信息'
+   * }
+   */
+  grfw_endGrfw(data) {
+    return deviceRequest.post(
+      `/service?ssServ=grfw_endGrfw`,
+      data,
+      {
+        loading: false,
+        formData: true
+      }
+    )
+  }
+}

+ 90 - 0
api/grfw.js

@@ -0,0 +1,90 @@
+// 个人服务api
+import request from "@/utils/request";
+
+export const grfwApi = {
+    /**
+     * 初始化个人服务包购买 - 显示可选服务包
+     * @param {object} data - 查询参数
+     * @returns {Promise} 返回服务包列表
+     * @returns {string} minJzsj - 现有的所有个人服务项目的最小截止时间
+     * @returns {Array} grfwbmxList - 服务包列表
+     * @returns {string} grfwbmxList[].grfwbid - 个人服务包ID
+     * @returns {string} grfwbmxList[].mc - 名称
+     * @returns {number} grfwbmxList[].jg - 价格
+     * @returns {number} grfwbmxList[].num - 周包数量。0 = 不是周包,若在当前学期中,补买到当前学期结束的周数
+     */
+    grfw_initGrfwbBuy: (data) => {
+        return request.post(
+            `/service?ssServ=grfw_initGrfwbBuy`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 预支付个人服务包
+     * @param {object} data - 支付参数
+     * @param {string} data.grfwbid - 个人服务包ID
+     * @returns {Promise} 返回预支付信息
+     * @returns {string} outTradeNo - 订单号 (<应用名>grfwb<UUID>)
+     * @returns {object} prepay - PrepayWithRequestPaymentResponse对象
+     */
+    grfw_prepayGrfwb: (data) => {
+        return request.post(
+            `/service?ssServ=grfw_prepayGrfwb`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 检查订单支付情况
+     * @param {object} data - 查询参数
+     * @param {string} data.outTradeNo - 订单号
+     * @returns {Promise} 返回Transaction对象
+     */
+    chkWechatpayBySs: (data) => {
+        return request.post(
+            `/service?ssServ=ss.chkWechatpayBySs`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 支付成功后确认服务
+     * @param {object} data - 确认参数
+     * @param {string} data.grfwbid - 个人服务包ID
+     * @returns {Promise} 返回购买结果
+     * @returns {string} mc - 个人服务包名称
+     * @returns {number} sjdys - 时间单元数
+     * @returns {string} jzsj - 截止时间
+     * @returns {Array} grfwList - 个人服务项目列表
+     * @returns {string} grfwList[].grfwxmm - 个人服务项目名称(离校通知、视频电话等)
+     * @returns {string} grfwList[].jsfsm - 计数方式码(计次数、计时长、计流量)
+     * @returns {number} grfwList[].zdsc - 最大时长
+     * @returns {number} grfwList[].zdll - 最大流量
+     * @returns {number} grfwList[].zdcs - 最大次数
+     * @returns {boolean} grfwList[].sfmf - 是否免费
+     * @returns {boolean} grfwList[].sfty - 是否停用
+     */
+    grfw_endGrfwbBuy: (data) => {
+        return request.post(
+            `/service?ssServ=grfw_endGrfwbBuy`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+}

+ 65 - 15
api/kqjl.js

@@ -1,15 +1,65 @@
-// 考勤记录api
-import request from "@/utils/request";
-
-export const kqjlApi = {
-    bjdm_cx: (data) => {
-        return request.post( `/service?ssServ=bjdm_cx`,
-        data,
-        {
-          loading: true,
-        }
-
-      );
-    }
-  
-}
+// 考勤记录api
+import request from "@/utils/request";
+
+export const kqjlApi = {
+    bjdm_cx: (data) => {       
+        return request.post( `/service?ssServ=bjdm_cx&management=1&isReady=1`,
+        data,
+        {
+          loading: true,
+          formData: true,
+        }
+
+      );
+    },
+    bjdm_initBzrDm: (data) => {       
+        return request.post( `/service?ssServ=bjdm_initBzrdm`,
+        data,
+        {
+          loading: true,
+          formData: true,
+        }
+
+      );
+    },
+    bjdm_saveBzrDm: (data) => {       
+      return request.post( `/service?ssServ=bjdm_saveBzrdm`,
+        data,
+        {
+          loading: true,
+          formData: true,
+        }
+
+      );
+    },
+    mp_bzrdmHomep_load:(data) => {
+      return request.post( `/service?ssServ=mp_bzrdmHomep_load`,
+        data,
+        {
+          loading: true,
+          formData: true,
+        }
+
+      );  
+    },
+    mp_njdmHomep_load:(data) => {
+      return request.post( `/service?ssServ=mp_njdmHomep_load`,
+        data,
+        {
+          loading: true,
+          formData: true,
+        }
+
+      );  
+    },
+    mp_njdmHomep_refreshLoad:(data) => {
+      return request.post( `/service?ssServ=mp_njdmHomep_refresh`,
+        data,
+        {
+          loading: false,
+          formData: true,
+        }
+      );  
+    },
+
+}

+ 174 - 0
api/payment.js

@@ -0,0 +1,174 @@
+import request from "@/utils/request";
+
+const PAYMENT_BASE_URL = 'https://662993rq13tg.vicp.fun';
+const PAYMENT_TIMEOUT = 15000;
+
+const buildPaymentUrl = (pathOrUrl = '') => {
+  const deviceInfo = uni.getStorageSync('deviceInfo') || {};
+  const devId = deviceInfo.deviceId || '';
+  const sbmc = deviceInfo.model || '';
+  const hasProtocol = /^https?:\/\//.test(pathOrUrl);
+  const baseUrl = hasProtocol ? pathOrUrl : `${PAYMENT_BASE_URL}${pathOrUrl}`;
+  const separator = baseUrl.includes('?') ? '&' : '?';
+  return `${baseUrl}${separator}devId=${encodeURIComponent(devId)}&sbmc=${encodeURIComponent(sbmc)}`;
+};
+
+const formatFormData = (data) => {
+  if (!data || typeof data !== 'object') return data;
+  return Object.keys(data)
+    .map((key) => {
+      const value = data[key];
+      if (Array.isArray(value)) {
+        return value.map((item) => `${encodeURIComponent(key)}=${encodeURIComponent(item)}`).join('&');
+      }
+      return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
+    })
+    .join('&');
+};
+
+const showPaymentLoading = (loadingOptions) => {
+  if (loadingOptions === false) {
+    return () => {};
+  }
+
+  const config = typeof loadingOptions === 'object' ? loadingOptions : {};
+  const shouldShow = loadingOptions === undefined ? true : config.show !== false;
+  if (!shouldShow) {
+    return () => {};
+  }
+
+  const title = config.title || (typeof loadingOptions === 'string' ? loadingOptions : '加载中...');
+  const mask = config.mask ?? true;
+  const delay = config.delay ?? 300;
+  const loadingManager = request.loadingManager;
+
+  if (loadingManager) {
+    loadingManager.show({ title, mask, delay });
+    return () => loadingManager.hide();
+  }
+
+  uni.showLoading({ title, mask });
+  return () => {
+    try {
+      uni.hideLoading();
+    } catch (error) {
+      console.warn('hideLoading failed:', error);
+    }
+  };
+};
+
+const paymentRequest = (pathOrUrl, {
+  method = 'POST',
+  data = {},
+  loading,
+  formData = false,
+  timeout = PAYMENT_TIMEOUT,
+} = {}) => {
+  const hideLoading = showPaymentLoading(loading);
+  const requestMethod = String(method || 'POST').toUpperCase();
+
+  let requestData = data;
+  if (formData) {
+    requestData = formatFormData(data);
+  }
+
+  const headers = {};
+  headers['content-type'] = formData
+    ? 'application/x-www-form-urlencoded'
+    : 'application/json';
+
+  const jsessionId = uni.getStorageSync('JSESSIONID');
+  if (jsessionId) {
+    headers['Cookie'] = `JSESSIONID=${jsessionId}`;
+  }
+
+  return new Promise((resolve, reject) => {
+    uni.request({
+      url: buildPaymentUrl(pathOrUrl),
+      method: requestMethod,
+      data: requestData,
+      timeout,
+      header: headers,
+      success: (res) => {
+        const resHeader = res.header || {};
+        const setCookie = resHeader['set-cookie'] || resHeader['Set-Cookie'];
+        if (setCookie) {
+          const match = setCookie.match(/JSESSIONID=([^;]+)/);
+          if (match && match[1]) {
+            uni.setStorageSync('JSESSIONID', match[1]);
+          }
+        }
+
+        if (res.statusCode === 200) {
+          resolve({ data: res.data });
+        } else {
+          reject(res);
+        }
+      },
+      fail: (err) => {
+        uni.showToast({
+          title: '网络请求失败',
+          icon: 'none'
+        });
+        reject(err);
+      },
+      complete: () => {
+        hideLoading();
+      }
+    });
+  });
+};
+
+/**
+ * 支付相关 API
+ * 注意:接口地址需要根据后端实际提供的地址进行修改
+ */
+export const paymentApi = {
+  /**
+   * 创建充值订单并获取支付参数
+   * @param {Object} data - 订单信息
+   * @param {Number} data.amount - 充值金额(单位:元)
+   * @param {String} data.studentId - 学生ID(可选)
+   * @param {String} data.cardNo - 卡号(可选)
+   * @returns {Promise} 返回微信支付所需参数
+   */
+  createRechargeOrder(_data) {
+    return paymentRequest('/order/payOrder', {
+      method: 'POST',
+      data: undefined,
+      loading: {
+        title: '正在创建订单...'
+      }
+    });
+  },
+
+  /**
+   * 查询订单状态
+   * @param {String} orderId - 订单ID
+   * @returns {Promise}
+   */
+  queryOrderStatus(outTradeNo) {
+    const url = outTradeNo
+      ? `/order/getOrder?outTradeNo=${encodeURIComponent(outTradeNo)}`
+      : '/order/getOrder'
+    return paymentRequest(url, {
+      method: 'GET',
+      data: undefined,
+      loading: false
+    });
+  },
+
+  /**
+   * 获取充值记录列表
+   * @param {Object} params - 查询参数
+   * @returns {Promise}
+   */
+  getRechargeHistory(params) {
+    return paymentRequest('/api/payment/recharge/history', {
+      data: params,
+      loading: {
+        title: '加载中...'
+      }
+    });
+  }
+};

+ 8 - 0
api/student.js

@@ -0,0 +1,8 @@
+import request from "@/utils/request";
+
+export const studentApi = {
+  getStudentInfo(studentId) {
+    return request.get("/student/getStudentInfo?stuId=" + studentId);
+  },
+  
+};

+ 116 - 0
api/todo.js

@@ -0,0 +1,116 @@
+// 待办事项api
+import request from "@/utils/request";
+
+export const todoApi = {
+    /**
+     * 获取待办列表
+     * @param {object} data - 查询参数
+     * @returns {Promise} 返回待办列表数据 {cgList: [], shList: []}
+     */
+    getTaskHomep: (data = {}) => {
+        return request.post(
+            `/service?ssServ=taskHomep_load`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 获取草稿列表
+     * @param {object} data - 查询参数
+     * @returns {Promise} 返回草稿列表数据
+     */
+    getDraftList: (data = {}) => {
+        return request.post(
+            `/service?ssServ=cgx_list`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 获取审核列表
+     * @param {object} data - 查询参数
+     * @returns {Promise} 返回审核列表数据
+     */
+    getApprovalList: (data = {}) => {
+        return request.post(
+            `/service?ssServ=sh_list`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 批量审核
+     * @param {object} data - 审核参数
+     * @returns {Promise} 返回审核结果
+     */
+    batchApproval: (data) => {
+        return request.post(
+            `/service?ssServ=batch_approval`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 单个审核
+     * @param {object} data - 审核参数
+     * @returns {Promise} 返回审核结果
+     */
+    singleApproval: (data) => {
+        return request.post(
+            `/service?ssServ=single_approval`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 删除草稿
+     * @param {object} data - 删除参数
+     * @returns {Promise} 返回删除结果
+     */
+    deleteDraft: (data) => {
+        return request.post(
+            `/service?ssServ=delete_draft`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    },
+
+    /**
+     * 获取待办统计
+     * @param {object} data - 查询参数
+     * @returns {Promise} 返回统计数据
+     */
+    getTodoStats: (data = {}) => {
+        return request.post(
+            `/service?ssServ=todo_stats`,
+            data,
+            {
+                loading: true,
+                formData: true,
+            }
+        );
+    }
+}

+ 112 - 68
api/user.js

@@ -1,68 +1,112 @@
-import request from "@/utils/request";
-
-export const userApi = {
-  // 账号密码登录 - 显示自定义 loading 文字
-  accountLogin(data, onComplete) {
-    // 在第一次登录的时候拿到旧的设备信息,deviceId改为用户名+设备型号
-    const deviceInfo = uni.getStorageSync("deviceInfo");
-    const newDeviceInfo = {
-      ...deviceInfo,
-      deviceId: `(${data.yhm})${deviceInfo.model}`,
-    }
-    uni.setStorageSync("deviceInfo", newDeviceInfo)
-
-    const promise = request.post(
-      `/service?ssServ=ss.login&yhm=${data.yhm}&mm=${data.mm}&wdConfirmationCaptchaService=0&wechatCode=${data.wechatCode}`,
-      data,
-      {
-        loading: false, // 禁用全局 loading,由登录页面自己控制
-        request: {
-          timeout: 15000 // 登录请求 15 秒超时
-        }
-      }
-    );
-
-    // 无论成功还是失败,都调用完成回调
-    if (onComplete) {
-      promise.finally(() => {
-        onComplete()
-      })
-    }
-
-    return promise;
-  },
-
-  // 自动登录 - 静默登录,不显示 loading
-  autoLogin(data) {
-    return request.post(
-      `/service?ssServ=ss.login&wdConfirmationCaptchaService=0&mdToken=${data.mdToken}`,
-      data,
-      {
-        loading: false // 自动登录不显示 loading,避免打扰用户
-      }
-    );
-  },
-
-  // 微信登录 - 自定义 loading
-  wechatLogin(data, onComplete) {
-    const promise = request.post(
-      `/service?ssServ=ss.login&wdConfirmationCaptchaService=0`,
-      data,
-      {
-        loading: false, // 禁用全局 loading,由登录页面自己控制
-        request: {
-          timeout: 15000 // 微信登录请求 15 秒超时
-        }
-      }
-    );
-
-    // 无论成功还是失败,都调用完成回调
-    if (onComplete) {
-      promise.finally(() => {
-        onComplete()
-      })
-    }
-
-    return promise;
-  }
-};
+import request from "@/utils/request";
+
+export const userApi = {
+  // 账号密码登录 - 显示自定义 loading 文字
+  accountLogin(data, onComplete) {
+    // 在第一次登录的时候拿到旧的设备信息,deviceId改为用户名+设备型号
+    const deviceInfo = uni.getStorageSync("deviceInfo");
+    const newDeviceInfo = {
+      ...deviceInfo,
+      deviceId: `(${data.yhm})${deviceInfo.model}`,
+    }
+    uni.setStorageSync("deviceInfo", newDeviceInfo)
+
+    const promise = request.post(
+      `/service?ssServ=ss.login&yhm=${data.yhm}&mm=${data.mm}&wdConfirmationCaptchaService=0&wechatCode=${data.wechatCode}`,
+      data,
+      {
+        loading: false, // 禁用全局 loading,由登录页面自己控制
+        request: {
+          timeout: 15000 // 登录请求 15 秒超时
+        }
+      }
+    );
+
+    // 无论成功还是失败,都调用完成回调
+    if (onComplete) {
+      promise.finally(() => {
+        onComplete()
+      })
+    }
+
+    return promise;
+  },
+
+  // 扫码登录门系统
+  sacnGateLoginQrcode(data){
+    return request.post( `/service?ssServ=sacnGateLoginQrcode`,
+      data,
+      {
+        loading: true,
+        formData: true,
+      }
+    );  
+  },
+
+  // 扫码登录pc端
+  sacnLoginQrcode(data){
+    return request.post( `/service?ssServ=sacnLoginQrcode`,
+      data,
+      {
+        loading: true,
+        formData: true,
+      }
+    );  
+  },
+
+  // 自动登录 - 静默登录,不显示 loading
+  autoLogin(data) {
+    return request.post(
+      `/service?ssServ=ss.login&wdConfirmationCaptchaService=0&mdToken=${data.mdToken}`,
+      data,
+      {
+        loading: false // 自动登录不显示 loading,避免打扰用户
+      }
+    );
+  },
+
+  // 微信登录 - 自定义 loading
+  wechatLogin(data, onComplete) {
+    const promise = request.post(
+      `/service?ssServ=ss.login&wdConfirmationCaptchaService=0`,
+      data,
+      {
+        loading: false, // 禁用全局 loading,由登录页面自己控制
+        request: {
+          timeout: 15000 // 微信登录请求 15 秒超时
+        }
+      }
+    );
+
+    // 无论成功还是失败,都调用完成回调
+    if (onComplete) {
+      promise.finally(() => {
+        onComplete()
+      })
+    }
+
+    return promise;
+  },
+
+  // 获取小程序用户信息
+  mp_infoHomep_load(data){
+    return request.post( `/service?ssServ=mp_infoHomep_load`,
+      data,
+      {
+        loading: true,
+        formData: true,
+      }
+    );  
+  },
+  // 更新用户密码和信息
+  updPwd(data){
+    return request.post( `/service?ssServ=updPwd`,
+      data,
+      {
+        loading: true,
+        formData: true,
+      }
+    );
+  },
+ 
+};

+ 36 - 36
api/xuncha.js

@@ -1,36 +1,36 @@
-//  巡查api
-import request from "@/utils/request";
-
-export const xunchaApi = {
-  // 初始化巡查编辑数据 - 获取巡查点列表和记录
-  initZxxzEdit(data) {
-    return request.post(
-      `/service?ssServ=rcXcdjl_initZxxzEdit&ssDest=init&rcid=${data.rcid}`,
-      data,
-      {
-        loading: true
-      }
-    );
-  },
-
-  // 提交巡查编辑数据 - 保存巡查记录(使用表单格式)
-  submZxxzEdit(data, onComplete) {
-    const promise = request.post(
-      `/service?ssServ=rcXcdjl_submZxxzEdit&ssDest=info`,
-      data,
-      {
-        loading: true,
-        formData: true  // 使用表单格式提交
-      }
-    );
-
-    // 如果有完成回调,无论成功还是失败都调用
-    if (onComplete) {
-      promise.finally(() => {
-        onComplete()
-      })
-    }
-
-    return promise;
-  }
-};
+//  巡查api
+import request from "@/utils/request";
+
+export const xunchaApi = {
+  // 初始化巡查编辑数据 - 获取巡查点列表和记录
+  initZxxzEdit(data) {
+    return request.post(
+      `/service?ssServ=rcXcdjl_initZxxzEdit&ssDest=init&rcid=${data.rcid}`,
+      data,
+      {
+        loading: true
+      }
+    );
+  },
+
+  // 提交巡查编辑数据 - 保存巡查记录(使用表单格式)
+  submZxxzEdit(data, onComplete) {
+    const promise = request.post(
+      `/service?ssServ=rcXcdjl_submZxxzEdit&ssDest=info`,
+      data,
+      {
+        loading: true,
+        formData: true  // 使用表单格式提交
+      }
+    );
+
+    // 如果有完成回调,无论成功还是失败都调用
+    if (onComplete) {
+      promise.finally(() => {
+        onComplete()
+      })
+    }
+
+    return promise;
+  }
+};

+ 97 - 97
components/Form/index.vue

@@ -1,97 +1,97 @@
-<template>
-  <!-- 
-    Form 智能表单组件
-    
-    功能:
-    1. 封装所有校验逻辑
-    2. 自动provide校验函数给子组件
-    3. 支持v-model双向绑定
-    4. 极简使用方式
-    
-    使用方式:
-    <Form :rules="fieldConfigs" v-model="formData">
-      <up-table>
-        <up-tr>
-          <up-th>事由</up-th>
-          <ValidatedTd field="reason">
-            <up-input placeholder="请输入事由" />
-          </ValidatedTd>
-        </up-tr>
-      </up-table>
-    </Form>
-  -->
-  <view class="smart-form">
-    <!-- 直接渲染子内容,不使用插槽参数 -->
-    <slot></slot>
-  </view>
-</template>
-
-<script setup>
-import { computed, provide, watch } from 'vue'
-import { useFormValidation } from '@/composables/useFormValidation'
-
-const props = defineProps({
-  // 表单数据 - 支持v-model
-  modelValue: {
-    type: Object,
-    default: () => ({})
-  },
-  // 校验规则配置
-  rules: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-const emit = defineEmits(['update:modelValue'])
-
-// 直接使用外部传入的formData,避免双向绑定的复杂性
-const formData = computed({
-  get: () => props.modelValue,
-  set: (value) => emit('update:modelValue', value)
-})
-
-// 表单校验
-const { validateField, validateForm, errors, clearErrors, getFieldConfig, setFieldConfigs } = useFormValidation(props.rules)
-
-// 监听 props.rules 的变化,同步更新内部配置
-watch(() => props.rules, (newRules) => {
-  console.log('Form组件检测到rules变化:', newRules)
-  setFieldConfigs(newRules)
-}, { deep: true, immediate: true })
-
-// Form组件初始化完成
-
-// 计算是否有错误
-const hasErrors = computed(() => {
-  return Object.keys(errors.value).some(key => 
-    errors.value[key] && errors.value[key].length > 0
-  )
-})
-
-// 向子组件提供校验函数和数据
-provide('validateField', validateField)
-provide('errors', errors)
-provide('clearErrors', clearErrors)
-provide('formData', formData)
-provide('getFieldConfig', getFieldConfig)
-provide('validateForm', validateForm) // 添加这个,供外部使用
-
-// 移除初始化校验,让Td组件自己处理
-
-// Form组件provide完成
-
-// 暴露方法给父组件
-defineExpose({
-  validateForm,
-  validateField,
-  errors,
-  clearErrors
-})
-</script>
-
-<style lang="scss" scoped>
-.smart-form {
-  width: 100%;
-}
-</style>
+<template>
+  <!-- 
+    Form 智能表单组件
+    
+    功能:
+    1. 封装所有校验逻辑
+    2. 自动provide校验函数给子组件
+    3. 支持v-model双向绑定
+    4. 极简使用方式
+    
+    使用方式:
+    <Form :rules="fieldConfigs" v-model="formData">
+      <up-table>
+        <up-tr>
+          <up-th>事由</up-th>
+          <ValidatedTd field="reason">
+            <up-input placeholder="请输入事由" />
+          </ValidatedTd>
+        </up-tr>
+      </up-table>
+    </Form>
+  -->
+  <view class="smart-form">
+    <!-- 直接渲染子内容,不使用插槽参数 -->
+    <slot></slot>
+  </view>
+</template>
+
+<script setup>
+import { computed, provide, watch } from 'vue'
+import { useFormValidation } from '@/composables/useFormValidation'
+
+const props = defineProps({
+  // 表单数据 - 支持v-model
+  modelValue: {
+    type: Object,
+    default: () => ({})
+  },
+  // 校验规则配置
+  rules: {
+    type: Object,
+    default: () => ({})
+  }
+})
+
+const emit = defineEmits(['update:modelValue'])
+
+// 直接使用外部传入的formData,避免双向绑定的复杂性
+const formData = computed({
+  get: () => props.modelValue,
+  set: (value) => emit('update:modelValue', value)
+})
+
+// 表单校验
+const { validateField, validateForm, errors, clearErrors, getFieldConfig, setFieldConfigs } = useFormValidation(props.rules)
+
+// 监听 props.rules 的变化,同步更新内部配置
+watch(() => props.rules, (newRules) => {
+  // console.log('Form组件检测到rules变化:', newRules)
+  setFieldConfigs(newRules)
+}, { deep: true, immediate: true })
+
+// Form组件初始化完成
+
+// 计算是否有错误
+const hasErrors = computed(() => {
+  return Object.keys(errors.value).some(key => 
+    errors.value[key] && errors.value[key].length > 0
+  )
+})
+
+// 向子组件提供校验函数和数据
+provide('validateField', validateField)
+provide('errors', errors)
+provide('clearErrors', clearErrors)
+provide('formData', formData)
+provide('getFieldConfig', getFieldConfig)
+provide('validateForm', validateForm) // 添加这个,供外部使用
+
+// 移除初始化校验,让Td组件自己处理
+
+// Form组件provide完成
+
+// 暴露方法给父组件
+defineExpose({
+  validateForm,
+  validateField,
+  errors,
+  clearErrors
+})
+</script>
+
+<style lang="scss" scoped>
+.smart-form {
+  width: 100%;
+}
+</style>

+ 163 - 0
components/LoginConfirmModal/index.vue

@@ -0,0 +1,163 @@
+<template>
+  <SsConfirm
+    v-model:visible="isVisible"
+    :title="loginType.title || '扫码登录'"
+    :width="600"
+    
+    height="430rpx"
+    :bottom-buttons="buttons"
+    @button-click="handleButtonClick"
+  >
+    <view class="login-confirm-body">
+      <!-- 图标区域 -->
+      <!-- <view class="icon-wrapper" v-if="loginType.icon">
+        <image :src="loginType.icon" mode="aspectFit" class="system-icon"></image>
+      </view> -->
+
+      <!-- 系统名称 -->
+      <view class="system-name">{{ loginType.systemName }}</view>
+
+      <!-- 提示信息 -->
+      <view class="login-tip">{{ loginType.tip || '确认登录该系统吗?' }}</view>
+
+      <!-- 额外信息 -->
+      <view class="extra-info" v-if="loginType.address">
+        <view class="info-row">
+          <text class="label">登录地址:</text>
+          <text class="value">{{ loginType.address }}</text>
+        </view>
+      </view>
+    </view>
+  </SsConfirm>
+</template>
+
+<script setup>
+import { ref, watch } from 'vue'
+import SsConfirm from '@/components/SsConfirm/index.vue'
+
+const props = defineProps({
+  // 显示状态
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  // 登录类型配置
+  loginType: {
+    type: Object,
+    default: () => ({
+      systemName: '系统',
+      title: '扫码登录',
+      tip: '确认登录该系统吗?',
+      icon: '',
+      address: ''
+    })
+  }
+})
+
+const emit = defineEmits(['update:visible', 'confirm', 'cancel'])
+
+const isVisible = ref(false)
+
+// 底部按钮配置
+const buttons = [
+  { text: '取消', action: 'cancel' },
+  { text: '确认登录', action: 'confirm' }
+]
+
+// 监听外部 visible 变化
+watch(() => props.visible, (val) => {
+  isVisible.value = val
+})
+
+// 监听内部 isVisible 变化
+watch(isVisible, (val) => {
+  emit('update:visible', val)
+})
+
+// 处理按钮点击
+const handleButtonClick = (button, index) => {
+  if (button.action === 'confirm') {
+    emit('confirm')
+    isVisible.value = false
+  } else if (button.action === 'cancel') {
+    emit('cancel')
+    isVisible.value = false
+  }
+}
+
+// 暴露方法供父组件调用
+const show = () => {
+  isVisible.value = true
+}
+
+const hide = () => {
+  isVisible.value = false
+}
+
+defineExpose({
+  show,
+  hide
+})
+</script>
+
+<style lang="scss" scoped>
+.login-confirm-body {
+  padding: 40rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.icon-wrapper {
+  width: 120rpx;
+  height: 120rpx;
+  margin-bottom: 30rpx;
+
+  .system-icon {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.system-name {
+  font-size: 36rpx;
+  font-weight: bold;
+  color: #333;
+  margin-bottom: 20rpx;
+  text-align: center;
+}
+
+.login-tip {
+  font-size: 28rpx;
+  color: #666;
+  text-align: center;
+  margin-bottom: 30rpx;
+  line-height: 1.6;
+}
+
+.extra-info {
+  width: 100%;
+  padding: 20rpx;
+  background: #fafafb;
+  border-radius: 8rpx;
+  border: 1rpx solid #e6e6e6;
+
+  .info-row {
+    display: flex;
+    align-items: center;
+    font-size: 26rpx;
+
+    .label {
+      color: #666;
+      margin-right: 10rpx;
+      white-space: nowrap;
+    }
+
+    .value {
+      color: #999;
+      word-break: break-all;
+      flex: 1;
+    }
+  }
+}
+</style>

+ 112 - 112
components/SsBottom/index.vue

@@ -1,112 +1,112 @@
-<template>
-    <view class="bottom">
-		<view class="bottom-top-div" v-if="showShyj">
-			<up-table style="margin: 0 !important;width: 100% !important;height: 100rpx !important;">
-				<up-tr style="height: 100%;">
-					<up-th style="background-color: #e6e6e6 !important;color: #333333;padding: 0 32rpx;align-items: center;border: none !important;">{{ shyjTitle }}</up-th>
-					<Td style="height: 100%;border: 1px solid #e6e6e6 !important;"><SsInput :placeholder="shyjPlaceholder" v-model="reason" @input="handleShyjInput"/></Td>
-				</up-tr>
-			</up-table>
-		</view>
-		<view class="bottom-button-div" :style="showShyj ? '' : 'border-top: 1rpx solid #e6e6e6;'">
-			<template v-for="(button, index) in buttons" :key="index">
-				<view
-					class="bottom-button"
-					@click="handleButtonClick(button, index)"
-				>
-					{{ button.text }}
-				</view>
-				<!-- 分割线,最后一个按钮不显示 -->
-				<view v-if="index < buttons.length - 1" class="button-divider"></view>
-			</template>
-		</view>
-	</view>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import SsInput from '@/components/SsInput/index.vue'
-import Td from '@/components/Td/index.vue'
-const reason = ref('')
-
-const props = defineProps({
-    // 是否显示审核意见
-    showShyj: {
-        type: Boolean,
-        default: false
-    },
-    // 审核意见标题
-    shyjTitle: {
-        type: String,
-        default: '审核意见'
-    },
-    // 审核意见占位符
-    shyjPlaceholder: {
-        type: String,
-        default: '请输入审核意见'
-    },
-    // 按钮配置
-    buttons: {
-        type: Array,
-        default: () => [
-            { text: '取消', action: 'cancel', },
-            { text: '保存并提交', action: 'submit', }
-        ]
-    }
-})
-
-const emit = defineEmits(['button-click', 'update:shyjValue'])
-
-
-
-
-// 处理按钮点击
-const handleButtonClick = (button, index) => {
-    emit('button-click', {
-        action: button.action,
-        button: button,
-        index: index,
-        shyjValue: reason.value // 传递审核意见
-    })
-}
-
-// 监听审核意见变化
-const handleShyjInput = (value) => {
-    emit('update:shyjValue', value)
-}
-</script>
-
-<style scoped lang="scss">
-.bottom {
-    position: fixed;
-    bottom: 0;
-    left: 0;
-    width: 100%;
-    z-index: 999;
-}
-.bottom-button-div{
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    background-color: #fff;
-    height: 100rpx;
-}
-.bottom-button{
-    flex: 1;
-    height: 100%;
-    line-height: 100rpx;
-    text-align: center;
-    font-size: 32rpx;
-    color: #333;
-    background-color: #fafafb;
-}
-.button-divider {
-    width: 1rpx;
-    height: 80%;
-    background-color: #e0e0e0;
-}
-.bottom-button:active{
-    background-color: #585e6e;
-    color: #fff;
-}
-</style>
+<template>
+    <view class="bottom">
+		<view class="bottom-top-div" v-if="showShyj">
+			<up-table style="margin: 0 !important;width: 100% !important;height: 100rpx !important;">
+				<up-tr style="height: 100%;">
+					<up-th style="background-color: #e6e6e6 !important;color: #333333;padding: 0 32rpx;align-items: center;border: none !important;">{{ shyjTitle }}</up-th>
+					<Td style="height: 100%;border: 1px solid #e6e6e6 !important;"><SsInput :placeholder="shyjPlaceholder" v-model="reason" @input="handleShyjInput"/></Td>
+				</up-tr>
+			</up-table>
+		</view>
+		<view class="bottom-button-div" :style="showShyj ? '' : 'border-top: 1rpx solid #e6e6e6;'">
+			<template v-for="(button, index) in buttons" :key="index">
+				<view
+					class="bottom-button"
+					@click="handleButtonClick(button, index)"
+				>
+					{{ button.text }}
+				</view>
+				<!-- 分割线,最后一个按钮不显示 -->
+				<view v-if="index < buttons.length - 1" class="button-divider"></view>
+			</template>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+import SsInput from '@/components/SsInput/index.vue'
+import Td from '@/components/Td/index.vue'
+const reason = ref('')
+
+const props = defineProps({
+    // 是否显示审核意见
+    showShyj: {
+        type: Boolean,
+        default: false
+    },
+    // 审核意见标题
+    shyjTitle: {
+        type: String,
+        default: '审核意见'
+    },
+    // 审核意见占位符
+    shyjPlaceholder: {
+        type: String,
+        default: '请输入审核意见'
+    },
+    // 按钮配置
+    buttons: {
+        type: Array,
+        default: () => [
+            { text: '取消', action: 'cancel', },
+            { text: '保存并提交', action: 'submit', }
+        ]
+    }
+})
+
+const emit = defineEmits(['button-click', 'update:shyjValue'])
+
+
+
+
+// 处理按钮点击
+const handleButtonClick = (button, index) => {
+    emit('button-click', {
+        action: button.action,
+        button: button,
+        index: index,
+        shyjValue: reason.value // 传递审核意见
+    })
+}
+
+// 监听审核意见变化
+const handleShyjInput = (value) => {
+    emit('update:shyjValue', value)
+}
+</script>
+
+<style scoped lang="scss">
+.bottom {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    z-index: 999;
+}
+.bottom-button-div{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: #fff;
+    height: 100rpx;
+}
+.bottom-button{
+    flex: 1;
+    height: 100%;
+    line-height: 100rpx;
+    text-align: center;
+    font-size: 32rpx;
+    color: #333;
+    background-color: #fafafb;
+}
+.button-divider {
+    width: 1rpx;
+    height: 80%;
+    background-color: #e0e0e0;
+}
+.bottom-button:active{
+    background-color: #585e6e;
+    color: #fff;
+}
+</style>

+ 196 - 0
components/SsCarCard/index.vue

@@ -0,0 +1,196 @@
+<template>
+    <view class="car-card" :class="statusClass" @click="handleCardClick">
+        <!-- 第一行:车辆名称 -->
+        <view class="car-title">
+            {{ carData.name || '别克GL8' }}
+        </view>
+        <!-- {{ carData }} -->
+        <!-- 第二行:左右结构 -->
+        <view class="car-info">
+            <!-- 左边:车辆图片 -->
+            <view class="car-image-container">
+                <image class="car-image" :src="getImageUrl(carData.image)" mode="aspectFill" />
+            </view>
+
+            <!-- 右边:车辆信息 -->
+            <view class="car-details">
+                <view class="detail-item car-name">
+                    {{ carData.wph }}
+                </view>
+                <view class="detail-item seats" v-for="wp in carData.wpcsList">
+                    {{ wp.mc }} : {{ wp.sz || wp.zf }}
+                </view>
+
+                <!-- <view class="detail-item car-color">
+                    {{ carData.color || '白色' }}
+                </view>-->
+                <view class="detail-item car-type">
+                    {{ carData.type || '商务车' }}
+                </view> 
+            </view>
+        </view>
+    </view>
+</template>
+
+<script setup>
+import { computed } from 'vue'
+import { getImageUrl } from '@/utils/util'
+
+// Props
+const props = defineProps({
+    // 车辆数据
+    carData: {
+        type: Object,
+        default: () => ({})
+    },
+    // 车辆状态:'available' | 'reserved' | 'disabled'
+    status: {
+        type: String,
+        default: 'available',
+        validator: (value) => ['available', 'reserved', 'disabled'].includes(value)
+    }
+})
+
+// Emits
+const emit = defineEmits(['click', 'select'])
+
+
+// 计算状态样式类
+const statusClass = computed(() => {
+    return `status-${props.status}`
+})
+
+// 处理卡片点击
+const handleCardClick = () => {
+    if (props.status === 'disabled') {
+        return // 禁用状态和已预约状态不响应点击
+    }
+
+    emit('click', props.carData)
+    emit('select', props.carData)
+}
+
+// 移除 onMounted 中的异步获取逻辑,现在在父组件中处理
+// onMounted(async () => {
+//     // 更新物品类型
+//     const result = await commonApi.getDictByCbNameAndValue('wplb', props.carData.wplbm)
+//     props.carData.type = result.data.result[props.carData.wplbm]
+// })
+</script>
+
+<style lang="scss" scoped>
+.car-card {
+    background: #FFFFFF;
+    border-radius: 8rpx;
+    overflow: visible;
+    padding: 34rpx;
+    margin-bottom: 34rpx;
+    box-shadow: 2rpx 6rpx 6rpx rgba(4, 0, 0, 0.15);
+    box-sizing: border-box;
+    position: relative;
+    z-index: 1;
+    transition: all 0.3s ease;
+
+    // 可预约状态 - 绿色
+    &.status-available {
+        background-color: #c7ffe0;
+    }
+
+    // 已被预约状态 - 橙色(不可更改)
+    &.status-reserved {
+        background-color: #ffb882;
+    }
+
+    // 禁用状态 - 灰色
+    &.status-disabled {
+        background-color: #f5f5f5;
+        opacity: 0.6;
+    }
+}
+
+.car-title {
+    font-size: 34rpx;
+    font-weight: bold;
+    color: #000000;
+    margin-bottom: 17rpx;
+    text-align: left;
+}
+
+.car-info {
+    display: flex;
+    align-items: flex-start;
+    gap: 45rpx;
+}
+
+.car-image-container {
+    flex-shrink: 0;
+    width: 380rpx;
+    height: 212rpx;
+    border-radius: 8rpx;
+    overflow: hidden;
+    background-color: #f8f8f8;
+}
+
+.car-image {
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+}
+
+.car-details {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    gap: 8rpx;
+    min-width: 0;
+}
+
+.detail-item {
+    font-size: 34rpx;
+    color: #333;
+    line-height: 48rpx;
+
+
+}
+
+// 禁用状态下的文字颜色
+.status-disabled {
+
+    .car-title,
+    .detail-item {
+        color: #999 !important;
+    }
+
+    .detail-item.seats {
+        color: #bbb !important;
+    }
+}
+
+// 响应式适配
+@media (max-width: 750rpx) {
+    .car-card-content {
+        padding: 20rpx;
+    }
+
+    .car-image-container {
+        width: 160rpx;
+        height: 100rpx;
+    }
+
+    .car-title {
+        font-size: 32rpx;
+    }
+
+    .detail-item {
+        font-size: 26rpx;
+
+        &.seats {
+            font-size: 28rpx;
+        }
+
+        &.car-name {
+            font-size: 28rpx;
+        }
+    }
+}
+</style>

+ 238 - 22
components/SsCard/index.vue

@@ -1,22 +1,238 @@
-<template>
-  <view class="ss-card" @click="$emit('click')">
-    <slot></slot>
-  </view>
-</template>
-
-<script setup>
-// 组件只需要提供基础样式,内容通过slot传入
-</script>
-
-<style lang="scss" scoped>
-.ss-card {
-  background: #FFFFFF;
-  border-radius: 8rpx;
-  overflow: hidden;
-  padding: 25rpx;
-  border: 1px solid #d9d9d9;
-  margin-bottom: 30rpx;
-  box-shadow: 2rpx 6rpx 6rpx rgba(4, 0, 0, 0.15);
-  box-sizing: border-box;
-}
-</style>
+<template>
+  <view class="ss-card" @click="handleCardClick">
+    <!-- 右上角设置按钮 - 只有buttons且长度>0时显示 -->
+    <view
+      v-if="hasButtons"
+      class="card-setting-header"
+      @click.stop="handleSettingClick"
+    >
+      <view class="setting-icon">
+        <Icon name="icon-chilun" size="32" color="#999" />
+      </view>
+
+      <!-- 按钮弹窗菜单 - 只有多个按钮时显示 -->
+      <view
+        v-if="showButtonMenu && isMultipleButtons"
+        class="button-menu"
+        @click.stop
+      >
+        <view
+          v-for="(btn, index) in item.buttons"
+          :key="index"
+          class="menu-item"
+          @click="handleButtonClick(btn, index)"
+        >
+          <text v-if="btn.icon" :class="['iconfont', btn.icon]"></text>
+          <text class="menu-text">{{ btn.title }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 卡片内容 -->
+    <slot></slot>
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, onMounted, onUnmounted } from 'vue'
+import Icon from '@/components/icon/index.vue';
+
+// Props
+const props = defineProps({
+  item: {
+    type: Object,
+    default: () => ({})
+  }
+})
+
+// Emits
+const emit = defineEmits(['click', 'buttonClick'])
+
+// 状态
+const showButtonMenu = ref(false)
+
+// 计算属性
+const hasButtons = computed(() => {
+  return props.item?.buttons && Array.isArray(props.item.buttons) && props.item.buttons.length > 0
+})
+
+const isMultipleButtons = computed(() => {
+  return props.item?.buttons && props.item.buttons.length > 1
+})
+
+const isSingleButton = computed(() => {
+  return props.item?.buttons && props.item.buttons.length === 1
+})
+
+/**
+ * 处理卡片点击
+ */
+const handleCardClick = () => {
+  // 如果菜单打开,先关闭菜单
+  if (showButtonMenu.value) {
+    showButtonMenu.value = false
+    return
+  }
+
+  emit('click')
+}
+
+/**
+ * 处理设置按钮点击
+ */
+const handleSettingClick = () => {
+  if (isSingleButton.value) {
+    // 只有一个按钮,直接执行
+    handleButtonClick(props.item.buttons[0], 0)
+  } else if (isMultipleButtons.value) {
+    // 先记录当前状态
+    const wasOpen = showButtonMenu.value
+
+    // 关闭其他卡片的菜单
+    uni.$emit('closeAllCardMenus')
+
+    // 切换当前菜单状态(如果之前是关闭的就打开,如果是打开的就关闭)
+    showButtonMenu.value = !wasOpen
+  }
+}
+
+/**
+ * 关闭菜单
+ */
+const closeMenu = () => {
+  showButtonMenu.value = false
+}
+
+/**
+ * 监听全局关闭事件
+ */
+onMounted(() => {
+  uni.$on('closeAllCardMenus', closeMenu)
+})
+
+onUnmounted(() => {
+  uni.$off('closeAllCardMenus', closeMenu)
+})
+
+/**
+ * 处理按钮点击
+ */
+const handleButtonClick = (btn, index) => {
+  showButtonMenu.value = false
+
+  // 执行按钮的回调
+  if (btn.onclick && typeof btn.onclick === 'function') {
+    btn.onclick()
+  }
+
+  // 触发组件事件
+  emit('buttonClick', { button: btn, index, item: props.item })
+}
+</script>
+
+<style lang="scss" scoped>
+.ss-card {
+  background: #FFFFFF;
+  border-radius: 8rpx;
+  overflow: visible; // 让popup能显示
+  padding: 25rpx;
+  border: 1px solid #d9d9d9;
+  margin-bottom: 30rpx;
+  box-shadow: 2rpx 6rpx 6rpx rgba(4, 0, 0, 0.15);
+  box-sizing: border-box;
+  position: relative; // 为绝对定位的header提供参考
+  z-index: 1; // 给卡片一个基础层级,但低于popup
+}
+
+// 右上角设置按钮区域
+.card-setting-header {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 80rpx;
+  height: 80rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 1001; // 比ss-select稍高
+
+  .setting-icon {
+    width: 80rpx;
+    height: 80rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-radius: 0 8rpx 0 8rpx;
+    // background: rgba(0, 0, 0, 0.05);
+    transition: all 0.3s ease;
+
+    &:active {
+      background: rgba(0, 0, 0, 0.1);
+    }
+  }
+}
+
+// 按钮弹窗菜单 - 参考ss-select样式
+.button-menu {
+  position: absolute;
+  top: 100%;
+  right: 0;
+  background-color: #393D51;
+  z-index: 10000; // 提高层级,确保不被下一个卡片遮挡
+  color: #fff;
+  border: 2rpx solid #393D51;
+  box-sizing: border-box;
+  border-radius: 10rpx;
+  overflow: hidden;
+  max-height: 600rpx;
+  overflow: auto;
+  min-width: 200rpx;
+
+  .menu-item {
+    padding: 20rpx 20rpx 20rpx 32rpx;
+    cursor: pointer;
+    position: relative;
+    display: flex;
+    align-items: center;
+
+    // 分隔线
+    &::after {
+      content: "";
+      position: absolute;
+      bottom: 0%;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 80%;
+      height: 2rpx;
+      background-color: #303445;
+    }
+
+    &:last-child::after {
+      display: none;
+    }
+
+    &:active {
+      background-color: #fff;
+      color: #393D51;
+
+      &::after {
+        display: none;
+      }
+    }
+
+    .iconfont {
+      font-size: 28rpx;
+      color: inherit;
+      margin-right: 16rpx;
+    }
+
+    .menu-text {
+      font-size: 28rpx;
+      color: inherit;
+      flex: 1;
+    }
+  }
+}
+
+
+</style>

+ 198 - 0
components/SsConfirm/index.vue

@@ -0,0 +1,198 @@
+<template>
+  <view v-if="visible" class="ss-confirm">
+    <!-- 遮罩层 - 模糊背景 -->
+    <view class="confirm-mask" @click="handleMaskClick"></view>
+
+    <!-- 弹窗内容 -->
+    <view class="confirm-content" :style="contentStyle">
+      <!-- 头部信息 - 可选 -->
+      <view v-if="showHeader" class="confirm-header">
+        <slot name="header">
+          <view class="header-title">{{ title }}</view>
+        </slot>
+      </view>
+      <view class="header-line" v-if="showHeader"></view>
+
+      <!-- 主要内容区域 - 通过slot传入 -->
+      <view class="confirm-body">
+        <slot></slot>
+      </view>
+
+      <!-- 底部按钮 -->
+      <view class="confirm-bottom">
+        <SsBottom :buttons="bottomButtons" @button-click="handleBottomClick" />
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { computed } from 'vue'
+import SsBottom from '@/components/SsBottom/index.vue'
+
+// Props定义
+const props = defineProps({
+  // 弹窗显示状态
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  // 弹窗标题
+  title: {
+    type: String,
+    default: '确认'
+  },
+  // 是否显示头部
+  showHeader: {
+    type: Boolean,
+    default: true
+  },
+  // 弹窗宽度
+  width: {
+    type: [String, Number],
+    default: '600rpx'
+  },
+  // 弹窗高度
+  height: {
+    type: [String, Number],
+    default: '500rpx'
+  },
+  // 弹窗最大高度
+  // maxHeight: {
+  //   type: [String, Number],
+  //   default: '500rpx'
+  // },
+  // 底部按钮配置
+  bottomButtons: {
+    type: Array,
+    default: () => [
+      { text: '取消', type: 'default' },
+      { text: '确认', type: 'primary' }
+    ]
+  },
+  // 点击遮罩是否关闭
+  maskClosable: {
+    type: Boolean,
+    default: true
+  }
+})
+
+// 事件定义
+const emit = defineEmits(['update:visible', 'close', 'button-click', 'mask-click'])
+
+// 计算弹窗样式
+const contentStyle = computed(() => {
+  const style = {}
+
+  // 处理宽度
+  if (typeof props.width === 'number') {
+    style.width = props.width + 'rpx'
+  } else {
+    style.width = props.width
+  }
+
+  // 处理高度
+  if (props.height !== 'auto') {
+    if (typeof props.height === 'number') {
+      style.height = props.height + 'rpx'
+    } else {
+      style.height = props.height
+    }
+  }
+
+ 
+
+  return style
+})
+
+/**
+ * 处理遮罩点击
+ */
+// const handleMaskClick = () => {
+//   emit('mask-click')
+//   if (props.maskClosable) {
+//     emit('update:visible', false)
+//     emit('close')
+//   }
+// }
+
+/**
+ * 处理底部按钮点击
+ */
+const handleBottomClick = (button, index) => {
+  emit('button-click', button, index)
+}
+</script>
+
+<style lang="scss" scoped>
+.ss-confirm {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 9999;
+  display: flex;
+  flex-direction: column;
+}
+
+// 遮罩层
+.confirm-mask {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  backdrop-filter: blur(4rpx); // 只要模糊效果,不要颜色
+  -webkit-backdrop-filter: blur(41rpxrpx);
+}
+
+// 弹窗内容
+.confirm-content {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  background: #f2f3f4;
+  border-radius: 10rpx;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+  box-shadow: 12rpx 10rpx 5rpx rgba(0, 0, 0, 0.3);
+  // 宽高通过 :style 动态设置
+}
+
+// 头部信息
+.confirm-header {
+  padding-top: 41rpx;
+  padding-bottom: 20rpx;
+  border-bottom: 1rpx solid #f2f3f4;
+
+  .header-title {
+    font-size: 42rpx;
+    color: #333;
+    text-align: center;
+  }
+}
+
+.header-line {
+  width: calc(100% - 104rpx);
+  height: 1rpx;
+  background: #e6e6e6;
+  margin: 0 auto;
+}
+
+// 主要内容区域
+.confirm-body {
+  flex: 1;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+}
+
+// 底部按钮
+.confirm-bottom {
+  position: relative;
+  border-top: 1rpx solid #eee;
+}
+</style>

+ 380 - 337
components/SsDatetimePicker/index.vue

@@ -1,337 +1,380 @@
-<template>
-  <!-- 
-    ss-datetime-picker 智能日期时间选择组件
-    基于 uview-plus 的 datetime-picker
-    自动绑定ValidatedTd的事件处理函数
-  -->
-  <view class="smart-datetime-picker">
-    <up-datetime-picker
-      ref="datetimePicker"
-      :show="show"
-      v-model="innerValue"
-      :mode="mode"
-      :min-date="minDate"
-      :max-date="maxDate"
-      :formatter="formatter"
-      :filter="filter"
-      :default-index="defaultIndex"
-      :item-height="itemHeight"
-      :cancel-text="cancelText"
-      :confirm-text="confirmText"
-      :cancel-color="cancelColor"
-      :confirm-color="confirmColor"
-      :visible-item-count="visibleItemCount"
-      :close-on-click-overlay="closeOnClickOverlay"
-      :safe-area-inset-bottom="safeAreaInsetBottom"
-      @confirm="handleConfirm"
-      @cancel="handleCancel"
-      @close="handleClose"
-    />
-    
-    <!-- 显示区域 -->
-    <view 
-      class="smart-datetime-picker__display"
-      @click="openPicker"
-    >
-      <text 
-        v-if="displayValue" 
-        class="smart-datetime-picker__value"
-      >
-        {{ displayValue }}
-      </text>
-      <text 
-        v-else 
-        class="smart-datetime-picker__placeholder"
-      >
-        {{ placeholder }}
-      </text>
-      <Icon name="icon-xiangxiajiantou" size="32" color="#999"/>
-
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref, computed, inject, watch } from 'vue'
-import Icon from '@/components/icon/index.vue';
-import dayjs from 'dayjs'
-
-const props = defineProps({
-  modelValue: {
-    type: [String, Number, Date],
-    default: ''
-  },
-  // 选择器模式:date-日期,time-时间,datetime-日期时间
-  mode: {
-    type: String,
-    default: 'date',
-    validator: (value) => ['date', 'time', 'datetime'].includes(value)
-  },
-  // 最小日期
-  minDate: {
-    type: [String, Number, Date],
-    default: () => dayjs().subtract(10, 'year').valueOf()
-  },
-  // 最大日期
-  maxDate: {
-    type: [String, Number, Date],
-    default: () => dayjs().add(10, 'year').valueOf()
-  },
-  // 占位符
-  placeholder: {
-    type: String,
-    default: '请选择'
-  },
-  // 格式化函数
-  formatter: {
-    type: Function,
-    default: null
-  },
-  // 过滤函数
-  filter: {
-    type: Function,
-    default: null
-  },
-  // 默认选中的索引
-  defaultIndex: {
-    type: Array,
-    default: () => []
-  },
-  // 选项高度
-  itemHeight: {
-    type: [String, Number],
-    default: 44
-  },
-  // 取消按钮文字
-  cancelText: {
-    type: String,
-    default: '取消'
-  },
-  // 确认按钮文字
-  confirmText: {
-    type: String,
-    default: '确认'
-  },
-  // 取消按钮颜色
-  cancelColor: {
-    type: String,
-    default: '#909193'
-  },
-  // 确认按钮颜色
-  confirmColor: {
-    type: String,
-    default: '#3c9cff'
-  },
-  // 可见选项数量
-  visibleItemCount: {
-    type: [String, Number],
-    default: 5
-  },
-  // 点击遮罩是否关闭
-  closeOnClickOverlay: {
-    type: Boolean,
-    default: true
-  },
-  // 是否开启底部安全区适配
-  safeAreaInsetBottom: {
-    type: Boolean,
-    default: false
-  },
-  // 显示格式
-  displayFormat: {
-    type: String,
-    default: ''
-  }
-})
-
-const emit = defineEmits(['update:modelValue', 'confirm', 'cancel', 'change'])
-
-// 从ValidatedTd注入事件处理函数(兼容旧方式)
-const onInput = inject('onInput', null)
-const onBlur = inject('onBlur', null)
-
-// 控制选择器显示
-const show = ref(false)
-
-// 内部值
-const innerValue = ref(Date.now())
-
-// 日期选择器引用
-const datetimePicker = ref(null)
-
-// 初始化内部值
-const initInnerValue = () => {
-  if (props.mode === 'time') {
-    // 时间模式下,直接使用时间字符串
-    if (props.modelValue) {
-      innerValue.value = props.modelValue
-    } else {
-      // 如果没有值,使用当前时间
-      const now = new Date()
-      const hours = now.getHours().toString().padStart(2, '0')
-      const minutes = now.getMinutes().toString().padStart(2, '0')
-      innerValue.value = `${hours}:${minutes}`
-    }
-  } else {
-    // 日期和日期时间模式
-    if (props.modelValue) {
-      if (typeof props.modelValue === 'string') {
-        innerValue.value = dayjs(props.modelValue).valueOf()
-      } else if (typeof props.modelValue === 'number') {
-        innerValue.value = props.modelValue
-      } else if (props.modelValue instanceof Date) {
-        innerValue.value = props.modelValue.getTime()
-      }
-    } else {
-      innerValue.value = dayjs().valueOf()
-    }
-  }
-}
-
-// 监听 modelValue 变化
-watch(() => props.modelValue, () => {
-  initInnerValue()
-}, { immediate: true })
-
-// 计算显示值
-const displayValue = computed(() => {
-  if (!props.modelValue) return ''
-  
-  if (props.mode === 'time') {
-    // 时间模式下直接显示值
-    return props.modelValue
-  }
-  
-  let format = props.displayFormat
-  if (!format) {
-    switch (props.mode) {
-      case 'date':
-        format = 'YYYY-MM-DD'
-        break
-      case 'datetime':
-        format = 'YYYY-MM-DD HH:mm'
-        break
-      default:
-        format = 'YYYY-MM-DD'
-    }
-  }
-  
-  const date = dayjs(props.modelValue)
-  return date.isValid() ? date.format(format) : props.modelValue
-})
-
-// 打开选择器
-const openPicker = () => {
-  show.value = true
-  console.log('打开日期选择器', show.value)
-}
-
-// 确认选择
-const handleConfirm = (value) => {
-  console.log('原始值:', value)
-  let formattedValue = ''
-  
-  try {
-    if (props.mode === 'time') {
-      // 时间模式下,value.value 已经是 "HH:mm" 格式
-      formattedValue = value.value
-      
-      console.log('处理后的时间值:', formattedValue)
-    } else {
-      // 日期和日期时间模式
-      const date = dayjs(value.value)
-      switch (props.mode) {
-        case 'date':
-          formattedValue = date.format('YYYY-MM-DD')
-          break
-        case 'datetime':
-          formattedValue = date.format('YYYY-MM-DD HH:mm')
-          break
-        default:
-          formattedValue = date.format('YYYY-MM-DD')
-      }
-    }
-    
-    // 1. 支持v-model
-    emit('update:modelValue', formattedValue)
-    
-    // 2. 兼容旧的inject方式
-    if (onInput) {
-      onInput({ detail: { value: formattedValue } })
-    }
-    
-    // 3. 触发确认事件
-    emit('confirm', { value: formattedValue, timestamp: value.value })
-    emit('change', formattedValue)
-    
-  } catch (error) {
-    console.error('时间处理错误:', error)
-    formattedValue = ''
-  }
-  
-  show.value = false
-  console.log(`SsDatetimePicker handleConfirm: ${formattedValue}`)
-}
-
-// 取消选择
-const handleCancel = () => {
-  show.value = false
-  emit('cancel')
-}
-
-// 关闭选择器
-const handleClose = () => {
-  show.value = false
-  
-  // 触发失焦事件
-  if (onBlur) {
-    onBlur()
-  }
-}
-
-// 初始化
-initInnerValue()
-</script>
-
-<style lang="scss" scoped>
-.smart-datetime-picker {
-  width: 100%;
-  
-  &__display {
-    width: 100%;
-    height: 60rpx;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    font-size: 32rpx;
-    line-height: 60rpx;
-    color: #333;
-    background-color: transparent;
-    border: none;
-    outline: none;
-    box-sizing: border-box;
-    cursor: pointer;
-  }
-  
-  &__value {
-    flex: 1;
-    color: #333;
-    font-size: 32rpx;
-  }
-  
-  &__placeholder {
-    flex: 1;
-    color: #999;
-    font-size: 32rpx;
-  }
-  
-  &__icon {
-    margin-left: 16rpx;
-    transition: transform 0.3s ease;
-  }
-  
-  &__display:active &__icon {
-    transform: rotate(180deg);
-  }
-}
-</style>
+<template>
+  <!-- 
+    ss-datetime-picker 智能日期时间选择组件
+    基于 uview-plus 的 datetime-picker
+    自动绑定ValidatedTd的事件处理函数
+  -->
+  <view class="smart-datetime-picker">
+    <up-datetime-picker
+      ref="datetimePicker"
+      :show="show"
+      v-model="innerValue"
+      :mode="mode"
+      :min-date="minDate"
+      :max-date="maxDate"
+      :formatter="formatter"
+      :filter="filter"
+      :default-index="defaultIndex"
+      :item-height="itemHeight"
+      :cancel-text="cancelText"
+      :confirm-text="confirmText"
+      :cancel-color="cancelColor"
+      :confirm-color="confirmColor"
+      :visible-item-count="visibleItemCount"
+      :close-on-click-overlay="closeOnClickOverlay"
+      :safe-area-inset-bottom="safeAreaInsetBottom"
+      :z-index="zIndex"
+      :disabled="disabled"
+      @confirm="handleConfirm"
+      @cancel="handleCancel"
+      @close="handleClose"
+    />
+    
+    <!-- 显示区域 -->
+    <view 
+      class="smart-datetime-picker__display"
+      :class="{ 'is-disabled': disabled }"
+      :aria-disabled="disabled ? 'true' : 'false'"
+      @click="handleDisplayClick"
+    >
+      <text 
+        v-if="displayValue" 
+        class="smart-datetime-picker__value"
+      >
+        {{ displayValue }}
+      </text>
+      <text 
+        v-else 
+        class="smart-datetime-picker__placeholder"
+      >
+        {{ placeholder }}
+      </text>
+      <Icon name="icon-xiangxiajiantou" size="32" color="#999"/>
+
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, inject, watch } from 'vue'
+import Icon from '@/components/icon/index.vue';
+import dayjs from 'dayjs'
+
+const props = defineProps({
+  modelValue: {
+    type: [String, Number, Date],
+    default: ''
+  },
+  // 是否禁用
+  disabled: {
+    type: Boolean,
+    default: false
+  },
+  // 选择器模式:date-日期,time-时间,datetime-日期时间
+  mode: {
+    type: String,
+    default: 'date',
+    validator: (value) => ['date', 'time', 'datetime'].includes(value)
+  },
+  // 最小日期
+  minDate: {
+    type: [String, Number, Date],
+    default: () => dayjs().subtract(10, 'year').valueOf()
+  },
+  // 最大日期
+  maxDate: {
+    type: [String, Number, Date],
+    default: () => dayjs().add(10, 'year').valueOf()
+  },
+  // 占位符
+  placeholder: {
+    type: String,
+    default: '请选择'
+  },
+  // 格式化函数
+  formatter: {
+    type: Function,
+    default: null
+  },
+  // 过滤函数
+  filter: {
+    type: Function,
+    default: null
+  },
+  // 默认选中的索引
+  defaultIndex: {
+    type: Array,
+    default: () => []
+  },
+  // 选项高度
+  itemHeight: {
+    type: [String, Number],
+    default: 44
+  },
+  // 取消按钮文字
+  cancelText: {
+    type: String,
+    default: '取消'
+  },
+  // 确认按钮文字
+  confirmText: {
+    type: String,
+    default: '确认'
+  },
+  // 取消按钮颜色
+  cancelColor: {
+    type: String,
+    default: '#909193'
+  },
+  // 确认按钮颜色
+  confirmColor: {
+    type: String,
+    default: '#3c9cff'
+  },
+  // 可见选项数量
+  visibleItemCount: {
+    type: [String, Number],
+    default: 5
+  },
+  // 点击遮罩是否关闭
+  closeOnClickOverlay: {
+    type: Boolean,
+    default: true
+  },
+  // 是否开启底部安全区适配
+  safeAreaInsetBottom: {
+    type: Boolean,
+    default: false
+  },
+  // 显示格式
+  displayFormat: {
+    type: String,
+    default: ''
+  },
+  // z-index层级
+  zIndex: {
+    type: [String, Number],
+    default: 20000 // 设置一个很高的默认值,确保在SsBottom之上
+  }
+})
+
+const emit = defineEmits(['update:modelValue', 'confirm', 'cancel', 'change'])
+
+// 从ValidatedTd注入事件处理函数(兼容旧方式)
+const onInput = inject('onInput', null)
+const onBlur = inject('onBlur', null)
+
+// 控制选择器显示
+const show = ref(false)
+
+// 内部值
+const innerValue = ref(Date.now())
+
+// 日期选择器引用
+const datetimePicker = ref(null)
+
+// 初始化内部值
+const initInnerValue = () => {
+  if (props.mode === 'time') {
+    // 时间模式下,直接使用时间字符串
+    if (props.modelValue) {
+      innerValue.value = props.modelValue
+    } else {
+      // 如果没有值,使用当前时间
+      const now = new Date()
+      const hours = now.getHours().toString().padStart(2, '0')
+      const minutes = now.getMinutes().toString().padStart(2, '0')
+      innerValue.value = `${hours}:${minutes}`
+    }
+  } else {
+    // 日期和日期时间模式
+    if (props.modelValue) {
+      if (typeof props.modelValue === 'string') {
+        innerValue.value = dayjs(props.modelValue).valueOf()
+      } else if (typeof props.modelValue === 'number') {
+        innerValue.value = props.modelValue
+      } else if (props.modelValue instanceof Date) {
+        innerValue.value = props.modelValue.getTime()
+      }
+    } else {
+      innerValue.value = dayjs().valueOf()
+    }
+  }
+}
+
+// 监听 modelValue 变化
+watch(() => props.modelValue, () => {
+  initInnerValue()
+}, { immediate: true })
+
+// 计算显示值
+const displayValue = computed(() => {
+  if (!props.modelValue) return ''
+  
+  if (props.mode === 'time') {
+    // 时间模式下直接显示值
+    return props.modelValue
+  }
+  
+  let format = props.displayFormat
+  if (!format) {
+    switch (props.mode) {
+      case 'date':
+        format = 'YYYY-MM-DD'
+        break
+      case 'datetime':
+        format = 'YYYY-MM-DD HH:mm'
+        break
+      default:
+        format = 'YYYY-MM-DD'
+    }
+  }
+  
+  const date = dayjs(props.modelValue)
+  return date.isValid() ? date.format(format) : props.modelValue
+})
+
+// 打开选择器
+const openPicker = () => {
+  show.value = true
+  console.log('打开日期选择器', show.value)
+}
+
+// 处理显示区域点击(考虑禁用态)
+const handleDisplayClick = () => {
+  if (props.disabled) return
+  openPicker()
+}
+
+// 确认选择
+const handleConfirm = (value) => {
+  console.log('原始值:', value)
+  let formattedValue = ''
+  
+  try {
+    if (props.mode === 'time') {
+      // 时间模式下,value.value 已经是 "HH:mm" 格式
+      formattedValue = value.value
+      
+      console.log('处理后的时间值:', formattedValue)
+    } else {
+      // 日期和日期时间模式
+      const date = dayjs(value.value)
+      switch (props.mode) {
+        case 'date':
+          formattedValue = date.format('YYYY-MM-DD')
+          break
+        case 'datetime':
+          formattedValue = date.format('YYYY-MM-DD HH:mm')
+          break
+        default:
+          formattedValue = date.format('YYYY-MM-DD')
+      }
+    }
+    
+    // 1. 支持v-model
+    emit('update:modelValue', formattedValue)
+    
+    // 2. 兼容旧的inject方式
+    if (onInput) {
+      onInput({ detail: { value: formattedValue } })
+    }
+    
+    // 3. 触发确认事件
+    emit('confirm', { value: formattedValue, timestamp: value.value })
+    emit('change', formattedValue)
+    
+  } catch (error) {
+    console.error('时间处理错误:', error)
+    formattedValue = ''
+  }
+  
+  show.value = false
+  console.log(`SsDatetimePicker handleConfirm: ${formattedValue}`)
+}
+
+// 取消选择
+const handleCancel = () => {
+  show.value = false
+  emit('cancel')
+}
+
+// 关闭选择器
+const handleClose = () => {
+  show.value = false
+  
+  // 触发失焦事件
+  if (onBlur) {
+    onBlur()
+  }
+}
+
+// 初始化
+initInnerValue()
+</script>
+
+<style lang="scss" scoped>
+.smart-datetime-picker {
+  width: 100%;
+  
+  &__display {
+    width: 100%;
+    height: 60rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 32rpx;
+    line-height: 60rpx;
+    color: #333;
+    background-color: transparent;
+    border: none;
+    outline: none;
+    box-sizing: border-box;
+    cursor: pointer;
+  }
+  
+  &__value {
+    flex: 1;
+    color: #333;
+    font-size: 32rpx;
+  }
+  
+  &__placeholder {
+    flex: 1;
+    color: #999;
+    font-size: 32rpx;
+  }
+  
+  &__icon {
+    margin-left: 16rpx;
+    transition: transform 0.3s ease;
+  }
+  
+  &__display:active &__icon {
+    transform: rotate(180deg);
+  }
+
+  &__display.is-disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+  }
+}
+</style>
+
+<!-- 全局样式,确保uview picker的z-index足够高 -->
+<style lang="scss">
+/* 覆盖uview-plus的datetime-picker样式 */
+.u-datetime-picker,
+.u-picker,
+.u-popup {
+  z-index: 99999 !important;
+}
+
+.u-popup__content {
+  z-index: 99999 !important;
+}
+
+.u-overlay {
+  z-index: 99998 !important;
+}
+</style>

+ 85 - 85
components/SsInput/index.vue

@@ -1,85 +1,85 @@
-<template>
-  <!-- 
-    ss-input 智能输入组件
-    自动绑定ValidatedTd的事件处理函数
-  -->
-  <view class="smart-input">
-    <input
-      class="smart-input__field"
-      :placeholder="$attrs.placeholder || '请输入'"
-      :value="modelValue"
-      @input="handleInput"
-      @blur="handleBlur"
-      @change="handleInput"
-    />
-  </view>
-</template>
-
-<script setup>
-import { inject } from 'vue'
-
-const props = defineProps({
-  modelValue: {
-    type: String,
-    default: ''
-  }
-})
-
-const emit = defineEmits(['update:modelValue'])
-
-// 从ValidatedTd注入事件处理函数(兼容旧方式)
-const onInput = inject('onInput', null)
-const onBlur = inject('onBlur', null)
-
-// ss-input初始化完成
-
-const handleInput = (event) => {
-  const value = event.detail?.value || event.target?.value || ''
-
-  // 1. 支持v-model
-  emit('update:modelValue', value)
-
-  // 2. 兼容旧的inject方式
-  if (onInput) {
-    onInput(event)
-  }
-
-  console.log(`SsInput handleInput: ${value}`)
-}
-
-const handleBlur = (event) => {
-  // 调用ValidatedTd的处理函数
-  if (onBlur) {
-    onBlur(event)
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.smart-input {
-  width: 100%;
-  
-  &__field {
-    width: 100%;
-    height: 60rpx;
-    // padding: 0 20rpx;
-    font-size: 32rpx;
-    line-height: 60rpx;
-    color: #333;
-    background-color: transparent;
-    border: none;
-    outline: none;
-    box-sizing: border-box;
-    
-    &::placeholder {
-      color: #999;
-      font-size: 32rpx;
-    }
-    
-    &:focus {
-      color: #333;
-      border: 1px solid #ccc;
-    }
-  }
-}
-</style>
+<template>
+  <!-- 
+    ss-input 智能输入组件
+    自动绑定ValidatedTd的事件处理函数
+  -->
+  <view class="smart-input">
+    <input
+      class="smart-input__field"
+      :placeholder="$attrs.placeholder || '请输入'"
+      :value="modelValue"
+      @input="handleInput"
+      @blur="handleBlur"
+      @change="handleInput"
+    />
+  </view>
+</template>
+
+<script setup>
+import { inject } from 'vue'
+
+const props = defineProps({
+  modelValue: {
+    type: String,
+    default: ''
+  }
+})
+
+const emit = defineEmits(['update:modelValue'])
+
+// 从ValidatedTd注入事件处理函数(兼容旧方式)
+const onInput = inject('onInput', null)
+const onBlur = inject('onBlur', null)
+
+// ss-input初始化完成
+
+const handleInput = (event) => {
+  const value = event.detail?.value || event.target?.value || ''
+
+  // 1. 支持v-model
+  emit('update:modelValue', value)
+
+  // 2. 兼容旧的inject方式
+  if (onInput) {
+    onInput(event)
+  }
+
+  console.log(`SsInput handleInput: ${value}`)
+}
+
+const handleBlur = (event) => {
+  // 调用ValidatedTd的处理函数
+  if (onBlur) {
+    onBlur(event)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.smart-input {
+  width: 100%;
+  
+  &__field {
+    width: 100%;
+    height: 60rpx;
+    // padding: 0 20rpx;
+    font-size: 32rpx;
+    line-height: 60rpx;
+    color: #333;
+    background-color: transparent;
+    border: none;
+    outline: none;
+    box-sizing: border-box;
+    
+    &::placeholder {
+      color: #999;
+      font-size: 32rpx;
+    }
+    
+    &:focus {
+      color: #333;
+      border: 1px solid #ccc;
+    }
+  }
+}
+</style>

+ 188 - 177
components/SsOnoffButton/index.vue

@@ -1,177 +1,188 @@
-<template>
-  <view class="ss-onoff-button" :class="{ checked: isChecked }" @click="toggleSelect">
-    <text class="button-label">{{ label }}</text>
-    <view class="button-mark">
-      <text
-        class="form-icon"
-        :class="isChecked ? 'form-icon-onoffbutton-checked' : 'form-icon-onoffbutton-unchecked'"
-      ></text>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { computed, inject, nextTick } from 'vue'
-
-const props = defineProps({
-  // 字段名称,用于表单校验
-  name: {
-    type: String,
-    required: true
-  },
-  // 显示标签
-  label: {
-    type: String,
-    required: true
-  },
-  // 按钮的值
-  value: {
-    type: [String, Number],
-    required: true
-  },
-  // 宽度设置
-  width: {
-    type: String,
-    default: ''
-  },
-  // v-model 绑定的值
-  modelValue: {
-    type: [String, Number, Array],
-    default: ''
-  },
-  // 是否多选模式
-  multiple: {
-    type: Boolean,
-    default: false
-  }
-})
-
-const emit = defineEmits(['update:modelValue', 'change'])
-
-// 从父组件注入校验相关功能
-const validateField = inject('validateField', () => {})
-
-// 解析 modelValue,支持逗号分隔的字符串和数组
-const parseModelValue = (val) => {
-  if (!val) return []
-  
-  // 如果是数组,直接返回字符串数组
-  if (Array.isArray(val)) {
-    return val.map(v => v.toString())
-  }
-  
-  // 如果是字符串,按逗号分割
-  const cleanValue = val.toString().replace(/^,+/, '') // 去掉开头的逗号
-  if (cleanValue.includes('|')) {
-    return cleanValue.split('|')
-  }
-  if (cleanValue.includes(',')) {
-    return cleanValue.split(',')
-  }
-  return cleanValue ? [cleanValue] : []
-}
-
-// 判断当前按钮是否选中
-const isChecked = computed(() => {
-  if (props.multiple) {
-    const currentValue = parseModelValue(props.modelValue)
-    return currentValue.includes(props.value.toString())
-  }
-  return props.modelValue === props.value
-})
-
-// 切换选中状态
-const toggleSelect = () => {
-  if (props.multiple) {
-    // 多选模式
-    const currentValue = parseModelValue(props.modelValue)
-    const index = currentValue.indexOf(props.value.toString())
-    let newValue
-    
-    if (index === -1) {
-      // 添加选项
-      newValue = [...currentValue, props.value.toString()]
-    } else {
-      // 移除选项
-      newValue = currentValue.filter(v => v !== props.value.toString())
-    }
-    
-    // 发送更新事件,使用逗号分隔的字符串格式
-    const emitValue = newValue.join(',')
-    emit('update:modelValue', emitValue)
-    emit('change', emitValue, newValue)
-  } else {
-    // 单选模式
-    emit('update:modelValue', props.value)
-    emit('change', props.value)
-  }
-  
-  // 触发校验
-  nextTick(() => {
-    if (props.name) {
-      validateField(props.name)
-    }
-  })
-}
-</script>
-
-<style lang="scss" scoped>
-/* 引入iconfont样式 */
-@import '../../static/iconfont/iconfont.css';
-
-.ss-onoff-button {
-  position: relative;
-  display: inline-flex;
-  align-items: center;
-  justify-content: center;
-  padding: 10rpx 36rpx;
-  border: 2rpx solid #BFC1C6;
-  border-radius: 4rpx;
-  background-color: #fff;
-  color: #C3C6CA;
-  font-size: 28rpx;
-  cursor: pointer;
-  transition: all 0.3s ease;
-  // margin-right: 20rpx;
-  // margin-bottom: 20rpx;
-  // min-width: 120rpx;
-
-  &.checked {
-    color: #393D51;
-    border-color: #393D51;
-    // background-color: #F8F9FA;
-  }
-
-  .button-label {
-    flex: 1;
-    text-align: center;
-    line-height: 1.2;
-  }
-
-  .button-mark {
-    position: absolute;
-    bottom: 0rpx;
-    right: 0rpx;
-    width: 36rpx;
-    height: 36rpx;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    color: inherit;
-  }
-}
-
-/* 表单组件icon样式 - 完全按照PC端实现 */
-.form-icon {
-  font-size: 36rpx;
-  font-family: "iconfont";
-}
-
-.form-icon-onoffbutton-checked::before {
-  content: "\e62d";
-}
-
-.form-icon-onoffbutton-unchecked::before {
-  content: "\e62b";
-}
-</style>
+<template>
+  <view class="ss-onoff-button" :class="{ checked: isChecked, disabled: disabled }" @click="toggleSelect">
+    <text class="button-label">{{ label }}</text>
+    <view class="button-mark">
+      <text
+        class="form-icon"
+        :class="isChecked ? 'form-icon-onoffbutton-checked' : 'form-icon-onoffbutton-unchecked'"
+      ></text>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { computed, inject, nextTick } from 'vue'
+
+const props = defineProps({
+  // 字段名称,用于表单校验
+  name: {
+    type: String,
+    required: true
+  },
+  // 显示标签
+  label: {
+    type: String,
+    required: true
+  },
+  // 按钮的值
+  value: {
+    type: [String, Number],
+    required: true
+  },
+  // 宽度设置
+  width: {
+    type: String,
+    default: ''
+  },
+  // v-model 绑定的值
+  modelValue: {
+    type: [String, Number, Array],
+    default: ''
+  },
+  // 是否多选模式
+  multiple: {
+    type: Boolean,
+    default: false
+  },
+  // 是否禁用
+  disabled: {
+    type: Boolean,
+    default: false
+  }
+})
+
+const emit = defineEmits(['update:modelValue', 'change'])
+
+// 从父组件注入校验相关功能
+const validateField = inject('validateField', () => {})
+
+// 解析 modelValue,支持逗号分隔的字符串和数组
+const parseModelValue = (val) => {
+  if (!val) return []
+  
+  // 如果是数组,直接返回字符串数组
+  if (Array.isArray(val)) {
+    return val.map(v => v.toString())
+  }
+  
+  // 如果是字符串,按逗号分割
+  const cleanValue = val.toString().replace(/^,+/, '') // 去掉开头的逗号
+  if (cleanValue.includes('|')) {
+    return cleanValue.split('|')
+  }
+  if (cleanValue.includes(',')) {
+    return cleanValue.split(',')
+  }
+  return cleanValue ? [cleanValue] : []
+}
+
+// 判断当前按钮是否选中
+const isChecked = computed(() => {
+  if (props.multiple) {
+    const currentValue = parseModelValue(props.modelValue)
+    return currentValue.includes(props.value.toString())
+  }
+  return props.modelValue === props.value
+})
+
+// 切换选中状态
+const toggleSelect = () => {
+  if (props.disabled) return
+  if (props.multiple) {
+    // 多选模式
+    const currentValue = parseModelValue(props.modelValue)
+    const index = currentValue.indexOf(props.value.toString())
+    let newValue
+    
+    if (index === -1) {
+      // 添加选项
+      newValue = [...currentValue, props.value.toString()]
+    } else {
+      // 移除选项
+      newValue = currentValue.filter(v => v !== props.value.toString())
+    }
+    
+    // 发送更新事件,使用逗号分隔的字符串格式
+    const emitValue = newValue.join(',')
+    emit('update:modelValue', emitValue)
+    emit('change', emitValue, newValue)
+  } else {
+    // 单选模式
+    emit('update:modelValue', props.value)
+    emit('change', props.value)
+  }
+  
+  // 触发校验
+  nextTick(() => {
+    if (props.name) {
+      validateField(props.name)
+    }
+  })
+}
+</script>
+
+<style lang="scss" scoped>
+/* 引入iconfont样式 */
+@import '../../static/iconfont/iconfont.css';
+
+.ss-onoff-button {
+  position: relative;
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  padding: 10rpx 36rpx;
+  border: 2rpx solid #BFC1C6;
+  border-radius: 4rpx;
+  background-color: #fff;
+  color: #C3C6CA;
+  font-size: 28rpx;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  // margin-right: 20rpx;
+  // margin-bottom: 20rpx;
+  // min-width: 120rpx;
+
+  &.checked {
+    color: #393D51;
+    border-color: #393D51;
+    // background-color: #F8F9FA;
+  }
+
+  &.disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+  }
+
+  .button-label {
+    flex: 1;
+    text-align: center;
+    line-height: 1.2;
+  }
+
+  .button-mark {
+    position: absolute;
+    bottom: 0rpx;
+    right: 0rpx;
+    width: 36rpx;
+    height: 36rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: inherit;
+  }
+}
+
+/* 表单组件icon样式 - 完全按照PC端实现 */
+.form-icon {
+  font-size: 36rpx;
+  font-family: "iconfont";
+}
+
+.form-icon-onoffbutton-checked::before {
+  content: "\e62d";
+}
+
+.form-icon-onoffbutton-unchecked::before {
+  content: "\e62b";
+}
+</style>

+ 329 - 169
components/SsSearchButton/index.vue

@@ -1,169 +1,329 @@
-<template>
-  <!--
-    ss-search-button 搜索按钮组件
-    基于原JSP中的mobileSearch-button样式封装
-  -->
-  <button
-    class="ss-search-button"
-    :style="buttonStyle"
-    @click="handleClick"
-    :disabled="disabled"
-  >
-
-    <!-- 前置图标插槽 -->
-    <view v-if="preIcon || $slots.preIcon" class="ss-search-button__pre-icon">
-      <slot name="preIcon">
-        <Icon v-if="preIcon" :name="preIcon" :size="iconSize" :color="iconColor" />
-      </slot>
-    </view>
-
-    <!-- 按钮文本 -->
-    <text class="ss-search-button__text">{{ text }}</text>
-
-    <!-- 后置图标插槽 -->
-    <view v-if="suffixIcon || $slots.suffixIcon" class="ss-search-button__suffix-icon">
-      <slot name="suffixIcon">
-        <Icon v-if="suffixIcon" :name="suffixIcon" :size="iconSize" :color="iconColor" />
-      </slot>
-    </view>
-  </button>
-</template>
-
-<script setup>
-import { computed } from 'vue'
-import Icon from '@/components/icon/index.vue'
-
-const props = defineProps({
-  // 按钮文本
-  text: {
-    type: String,
-    default: '增加'
-  },
-  // 是否禁用
-  disabled: {
-    type: Boolean,
-    default: false
-  },
-  // 按钮高度
-  height: {
-    type: [String, Number],
-    default: '36px'
-  },
-  // 前置图标名称
-  preIcon: {
-    type: String,
-    default: ''
-  },
-  // 后置图标名称
-  suffixIcon: {
-    type: String,
-    default: ''
-  },
-  // 图标大小
-  iconSize: {
-    type: [String, Number],
-    default: '32'
-  },
-  // 图标颜色
-  iconColor: {
-    type: String,
-    default: '#585d6e'
-  },
-  // 自定义按钮样式
-  customStyle: {
-    type: Object,
-    default: () => ({})
-  },
-  // 跳转链接(兼容原JSP用法)
-  href: {
-    type: String,
-    default: ''
-  }
-})
-
-const emit = defineEmits(['click'])
-
-// 按钮样式
-const buttonStyle = computed(() => ({
-  height: typeof props.height === 'number' ? `${props.height}px` : props.height,
-  ...props.customStyle
-}))
-
-
-const handleClick = () => {
-  // 触发点击事件
-  emit('click')
-}
-</script>
-
-<style lang="scss" scoped>
-.ss-search-button {
-
-  height: auto;
-  padding: 0 1rem;
-  border: 1px solid #eceded;
-  outline: none;
-  background-color: #fff;
-  text-align: center;
-  font-size: 1rem;
-  color: #585d6e;
-  letter-spacing: 0.1rem;
-  border-radius: 4px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  -webkit-appearance: none;
-  appearance: none;
-  box-sizing: border-box;
-  transition: all 0.2s ease;
-
-  &:active {
-    background-color: #eceded;
-    color: #fff;
-    border-color: #eceded;
-    transform: scale(0.98);
-    transition: all 0.1s ease;
-
-    // active 状态下图标样式
-    .ss-search-button__pre-icon,
-    .ss-search-button__suffix-icon {
-      :deep(.iconfont) {
-        color: #fff !important;
-      }
-      :deep(text) {
-        color: #fff !important;
-      }
-    }
-  }
-
-  &:disabled {
-    opacity: 0.6;
-    cursor: not-allowed;
-  }
-
-  &__pre-icon {
-    margin-right: 0.3rem;
-    display: flex;
-    align-items: center;
-  }
-
-  &__suffix-icon {
-    margin-left: 0.3rem;
-    display: flex;
-    align-items: center;
-  }
-
-  &__text {
-    font-size: inherit;
-    color: inherit;
-  }
-}
-
-// 响应式适配
-@media screen and (max-width: 750px) {
-  .ss-search-button {
-    font-size: 14px;
-    padding: 0 0.8rem;
-  }
-}
-</style>
+<template>
+  <!--
+    ss-search-button 搜索按钮组件
+    基于原JSP中的mobileSearch-button样式封装
+    支持多选项popup功能
+  -->
+  <view class="ss-search-button-container" :class="{ open: showOptionsMenu }">
+    <button
+      class="ss-search-button"
+      :style="buttonStyle"
+      @click="handleClick"
+      :disabled="disabled"
+    >
+
+      <!-- 前置图标插槽 -->
+      <view v-if="preIcon || $slots.preIcon" class="ss-search-button__pre-icon">
+        <slot name="preIcon">
+          <Icon v-if="preIcon" :name="preIcon" :size="iconSize" :color="iconColor" />
+        </slot>
+      </view>
+
+      <!-- 按钮文本 -->
+      <text class="ss-search-button__text">{{ text }}</text>
+
+      <!-- 后置图标插槽 -->
+      <view v-if="suffixIcon || $slots.suffixIcon" class="ss-search-button__suffix-icon">
+        <slot name="suffixIcon">
+          <Icon v-if="suffixIcon" :name="suffixIcon" :size="iconSize" :color="iconColor" />
+        </slot>
+      </view>
+    </button>
+
+    <!-- 选项弹窗菜单 - 参考ss-select样式 -->
+    <view
+      v-if="showOptionsMenu && hasMultipleOptions"
+      class="options-menu"
+      @click.stop
+    >
+      <view
+        v-for="(option, index) in options"
+        :key="index"
+        class="option-item"
+        @click="handleOptionClick(option, index)"
+      >
+        <text v-if="option.icon" :class="['iconfont', option.icon]"></text>
+        <text class="option-text">{{ option.text }}</text>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { computed, ref, onMounted, onUnmounted } from 'vue'
+import Icon from '@/components/icon/index.vue'
+
+const props = defineProps({
+  // 按钮文本
+  text: {
+    type: String,
+    default: '增加'
+  },
+  // 是否禁用
+  disabled: {
+    type: Boolean,
+    default: false
+  },
+  // 按钮高度
+  height: {
+    type: [String, Number],
+    default: '36px'
+  },
+  // 前置图标名称
+  preIcon: {
+    type: String,
+    default: ''
+  },
+  // 后置图标名称
+  suffixIcon: {
+    type: String,
+    default: ''
+  },
+  // 图标大小
+  iconSize: {
+    type: [String, Number],
+    default: '32'
+  },
+  // 图标颜色
+  iconColor: {
+    type: String,
+    default: '#585d6e'
+  },
+  // 自定义按钮样式
+  customStyle: {
+    type: Object,
+    default: () => ({})
+  },
+  // 跳转链接(兼容原JSP用法)
+  href: {
+    type: String,
+    default: ''
+  },
+  // 选项列表 - 新增
+  options: {
+    type: Array,
+    default: () => []
+  }
+})
+
+const emit = defineEmits(['click', 'optionClick'])
+
+// 状态
+const showOptionsMenu = ref(false)
+
+// 计算属性
+const hasOptions = computed(() => {
+  return props.options && Array.isArray(props.options) && props.options.length > 0
+})
+
+const hasMultipleOptions = computed(() => {
+  return props.options && props.options.length > 1
+})
+
+const isSingleOption = computed(() => {
+  return props.options && props.options.length === 1
+})
+
+// 按钮样式
+const buttonStyle = computed(() => ({
+  height: typeof props.height === 'number' ? `${props.height}px` : props.height,
+  ...props.customStyle
+}))
+
+/**
+ * 处理按钮点击
+ */
+const handleClick = () => {
+  if (!hasOptions.value) {
+    // 没有选项,直接触发点击事件
+    emit('click')
+  } else if (isSingleOption.value) {
+    // 单个选项,直接执行
+    handleOptionClick(props.options[0], 0)
+  } else if (hasMultipleOptions.value) {
+    // 先记录当前状态
+    const wasOpen = showOptionsMenu.value
+
+    // 关闭其他按钮的菜单
+    uni.$emit('closeAllButtonMenus')
+
+    // 切换当前菜单状态
+    showOptionsMenu.value = !wasOpen
+  }
+}
+
+/**
+ * 处理选项点击
+ */
+const handleOptionClick = (option, index) => {
+  showOptionsMenu.value = false
+
+  // 执行选项的回调
+  if (option.onclick && typeof option.onclick === 'function') {
+    option.onclick()
+  }
+
+  // 触发组件事件
+  emit('optionClick', { option, index })
+
+  // 兼容原来的click事件
+  emit('click', { option, index })
+}
+
+/**
+ * 关闭菜单
+ */
+const closeMenu = () => {
+  showOptionsMenu.value = false
+}
+
+/**
+ * 监听全局关闭事件
+ */
+onMounted(() => {
+  uni.$on('closeAllButtonMenus', closeMenu)
+})
+
+onUnmounted(() => {
+  uni.$off('closeAllButtonMenus', closeMenu)
+})
+</script>
+
+<style lang="scss" scoped>
+.ss-search-button-container {
+  position: relative;
+  display: inline-block;
+}
+
+.ss-search-button {
+  height: auto;
+  padding: 0 1rem;
+  border: 1px solid #eceded;
+  outline: none;
+  background-color: #fff;
+  text-align: center;
+  font-size: 1rem;
+  color: #585d6e;
+  letter-spacing: 0.1rem;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  -webkit-appearance: none;
+  appearance: none;
+  box-sizing: border-box;
+  transition: all 0.2s ease;
+
+  &:active {
+    background-color: #eceded;
+    color: #fff;
+    border-color: #eceded;
+    transform: scale(0.98);
+    transition: all 0.1s ease;
+
+    // active 状态下图标样式
+    .ss-search-button__pre-icon,
+    .ss-search-button__suffix-icon {
+      :deep(.iconfont) {
+        color: #fff !important;
+      }
+      :deep(text) {
+        color: #fff !important;
+      }
+    }
+  }
+
+  &:disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+  }
+
+  &__pre-icon {
+    margin-right: 0.3rem;
+    display: flex;
+    align-items: center;
+  }
+
+  &__suffix-icon {
+    margin-left: 0.3rem;
+    display: flex;
+    align-items: center;
+  }
+
+  &__text {
+    font-size: inherit;
+    color: inherit;
+  }
+}
+
+// 选项弹窗菜单 - 参考ss-select样式
+.options-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  width: 100%;
+  background-color: #393D51;
+  z-index: 1003; // 比卡片popup稍高
+  color: #fff;
+  border: 2rpx solid #393D51;
+  box-sizing: border-box;
+  border-radius: 10rpx;
+  overflow: hidden;
+  max-height: 600rpx;
+  overflow: auto;
+  min-width: 200rpx;
+
+  .option-item {
+    padding: 20rpx 20rpx 20rpx 32rpx;
+    cursor: pointer;
+    position: relative;
+    display: flex;
+    align-items: center;
+
+    // 分隔线
+    &::after {
+      content: "";
+      position: absolute;
+      bottom: 0%;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 80%;
+      height: 2rpx;
+      background-color: #303445;
+    }
+
+    &:last-child::after {
+      display: none;
+    }
+
+    &:active {
+      background-color: #fff;
+      color: #393D51;
+
+      &::after {
+        display: none;
+      }
+    }
+
+    .iconfont {
+      font-size: 28rpx;
+      color: inherit;
+      margin-right: 16rpx;
+    }
+
+    .option-text {
+      font-size: 28rpx;
+      color: inherit;
+      flex: 1;
+    }
+  }
+}
+
+// 响应式适配
+@media screen and (max-width: 750px) {
+  .ss-search-button {
+    font-size: 14px;
+    padding: 0 0.8rem;
+  }
+}
+</style>

+ 357 - 352
components/SsSelect/index.vue

@@ -1,352 +1,357 @@
-<template>
-  <view class="ss-select-container" :class="{ open: isOpen }" @click.stop="toggleDropdown">
-    <!-- 显示区域 -->
-    <view class="ss-select" :class="{ disabled: disabled }">
-      <text class="select-text" :class="{ placeholder: !selectedValue }">{{ displayText }}</text>
-      <view class="select-arrow" :class="{ rotate: isOpen }">
-        <Icon name="icon-xiangxiajiantou" size="32" :color="disabled ? '#ccc' : '#999'"/>
-      </view>
-    </view>
-    
-    <!-- 选项列表 -->
-    <view class="ss-options" v-show="isOpen">
-      <!-- 加载状态 -->
-      <view
-        v-if="loading"
-        class="option-item loading-item"
-      >
-        <text class="loading-text">加载中...</text>
-      </view>
-      <!-- 无选项 -->
-      <view
-        v-else-if="optionsList.length === 0"
-        class="option-item no-options"
-      >
-        无选项
-      </view>
-      <!-- 选项列表 -->
-      <view
-        v-else
-        v-for="(option, index) in optionsList"
-        :key="index"
-        class="option-item"
-        :class="{ selected: option[props.mapping.value] === selectedValue }"
-        @click.stop="selectOption(option)"
-      >
-        {{ option[props.mapping.text] }}
-      </view>
-    </view>
-    
-
-  </view>
-</template>
-
-<script setup>
-import { ref, computed, watch, onMounted, onUnmounted } from 'vue'
-import Icon from '@/components/icon/index.vue';
-// Props 定义
-const props = defineProps({
-  // 选项数组
-  options: {
-    type: Array,
-    default: () => []
-  },
-  // 字段映射
-  mapping: {
-    type: Object,
-    default: () => ({ text: 'n', value: 'v' })
-  },
-  // 默认值
-  modelValue: {
-    type: [String, Number],
-    default: ''
-  },
-  // 占位符
-  placeholder: {
-    type: String,
-    default: '请选择'
-  },
-  // 校验配置
-  validation: {
-    type: Object,
-    default: () => ({ enable: false, message: '' })
-  },
-  // 是否禁用
-  disabled: {
-    type: Boolean,
-    default: false
-  },
-  // 是否支持搜索
-  searchable: {
-    type: Boolean,
-    default: false
-  },
-  // 是否支持清空
-  clearable: {
-    type: Boolean,
-    default: false
-  },
-  // 加载状态
-  loading: {
-    type: Boolean,
-    default: false
-  },
-  // 宽度设置
-  width: {
-    type: String,
-    default: '100%'
-  }
-})
-
-// Emits 定义
-const emit = defineEmits(['update:modelValue', 'change', 'search', 'clear'])
-
-// 响应式数据
-const isOpen = ref(false)
-const selectedValue = ref(props.modelValue)
-const searchKeyword = ref('')
-
-// 计算属性
-const optionsList = computed(() => props.options || [])
-
-const displayText = computed(() => {
-  if (!selectedValue.value) return props.placeholder
-  
-  const selectedOption = optionsList.value.find(
-    option => option[props.mapping.value] === selectedValue.value
-  )
-  return selectedOption ? selectedOption[props.mapping.text] : props.placeholder
-})
-
-
-
-// 方法
-const toggleDropdown = () => {
-  if (props.disabled) return
-
-  if (!isOpen.value) {
-    // 关闭其他下拉框
-    uni.$emit('closeAllSelects')
-  }
-
-  isOpen.value = !isOpen.value
-}
-
-const selectOption = (option) => {
-  const value = option[props.mapping.value]
-  selectedValue.value = value
-  isOpen.value = false
-  
-  // 触发事件
-  emit('update:modelValue', value)
-  emit('change', value, option)
-}
-
-const closeDropdown = () => {
-  isOpen.value = false
-}
-
-// 设置值的方法(供外部调用)
-const setValue = (value) => {
-  if (!value) {
-    selectedValue.value = ''
-    emit('update:modelValue', '')
-    return true
-  }
-  
-  const option = optionsList.value.find(
-    opt => opt[props.mapping.value] === value
-  )
-  
-  if (option) {
-    selectedValue.value = value
-    emit('update:modelValue', value)
-    emit('change', value, option)
-    return true
-  }
-  
-  return false
-}
-
-// 监听外部值变化
-watch(() => props.modelValue, (newValue) => {
-  selectedValue.value = newValue
-})
-
-// 监听全局关闭事件
-const handleGlobalClose = () => {
-  closeDropdown()
-}
-
-onMounted(() => {
-  uni.$on('closeAllSelects', handleGlobalClose)
-  
-  // 点击页面其他地方关闭下拉框
-  uni.$on('pageClick', closeDropdown)
-})
-
-onUnmounted(() => {
-  uni.$off('closeAllSelects', handleGlobalClose)
-  uni.$off('pageClick', closeDropdown)
-})
-
-// 暴露方法给父组件
-defineExpose({
-  setValue,
-  getValue: () => selectedValue.value,
-  getSelectedOption: () => {
-    return optionsList.value.find(
-      option => option[props.mapping.value] === selectedValue.value
-    )
-  }
-})
-</script>
-
-<style lang="scss" scoped>
-/* ss暂用下拉框样式 */
-.ss-select-container {
-  position: relative;
-  width: v-bind(width);
-  font-size: 32rpx;
-
-}
-
-.ss-select {
-  padding: 10rpx 0;
-  border-radius: 10rpx;
-  cursor: pointer;
-  position: relative;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  min-height: 80rpx;
-  box-sizing: border-box;
-
-  &.disabled {
-    opacity: 0.6;
-    cursor: not-allowed;
-
-    .select-text {
-      color: #ccc;
-    }
-  }
-}
-
-.select-text {
-  flex: 1;
-  color: #333;
-
-  &.placeholder {
-    color: #999;
-  }
-}
-
-.select-arrow {
-  display: flex;
-  align-items: center;
-  transition: transform 0.3s ease;
-  margin-left: 20rpx;
-
-  &.rotate {
-    transform: rotate(180deg);
-  }
-}
-
-.ss-options {
-  display: none;
-  position: absolute;
-  top: 100%;
-  left: 0;
-  width: 100%;
-  background-color: #393D51;
-  z-index: 1000;
-  color: #fff;
-  border: 2rpx solid #393D51;
-  box-sizing: border-box;
-  border-radius: 10rpx;
-  overflow: hidden;
-  max-height: 600rpx;
-  overflow: auto;
-}
-
-.ss-select-container.open .ss-options {
-  display: block;
-}
-
-.option-item {
-  padding: 20rpx 20rpx 20rpx 46rpx;
-  cursor: pointer;
-  position: relative;
-
-  &::after {
-    content: "";
-    position: absolute;
-    bottom: 0%;
-    left: 50%;
-    transform: translateX(-50%);
-    width: 80%;
-    height: 2rpx;
-    background-color: #303445;
-  }
-
-  &:last-child::after,
-  &:hover::after,
-  &.selected::after {
-    display: none;
-  }
-
-  &:hover {
-    background-color: #fff;
-    color: #393D51;
-  }
-
-  &.selected {
-    background-color: #fff;
-    color: #393D51;
-
-    &::before {
-      content: "";
-      background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23393D51"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>') no-repeat center;
-      position: absolute;
-      width: 30rpx;
-      height: 100%;
-      left: 10rpx;
-      top: 0;
-      color: #393D51;
-    }
-  }
-
-  &.no-options {
-    text-align: center;
-    color: #999;
-    cursor: default;
-
-    &:hover {
-      background-color: #393D51;
-      color: #999;
-    }
-  }
-
-  &.loading-item {
-    text-align: center;
-    color: #999;
-    cursor: default;
-
-    &:hover {
-      background-color: #393D51;
-      color: #999;
-    }
-
-    .loading-text {
-      animation: loading-pulse 1.5s ease-in-out infinite;
-    }
-  }
-}
-
-@keyframes loading-pulse {
-  0%, 100% { opacity: 0.6; }
-  50% { opacity: 1; }
-}
-
-
-</style>
+<template>
+  <view class="ss-select-container" :class="{ open: isOpen }" @click.stop="toggleDropdown">
+    <!-- 显示区域 -->
+    <view class="ss-select" :class="{ disabled: disabled }">
+      <text class="select-text" :class="{ placeholder: !selectedValue }">{{ displayText }}</text>
+      <view class="select-arrow" :class="{ rotate: isOpen }">
+        <Icon name="icon-xiangxiajiantou" size="32" :color="disabled ? '#ccc' : '#999'"/>
+      </view>
+    </view>
+    
+    <!-- 选项列表 -->
+    <view class="ss-options" v-show="isOpen">
+      <!-- 加载状态 -->
+      <view
+        v-if="loading"
+        class="option-item loading-item"
+      >
+        <text class="loading-text">加载中...</text>
+      </view>
+      <!-- 无选项 -->
+      <view
+        v-else-if="optionsList.length === 0"
+        class="option-item no-options"
+      >
+        无选项
+      </view>
+      <!-- 选项列表 -->
+      <view
+        v-else
+        v-for="(option, index) in optionsList"
+        :key="index"
+        class="option-item"
+        :class="{ selected: option[props.mapping.value] === selectedValue }"
+        @click.stop="selectOption(option)"
+      >
+        {{ option[props.mapping.text] }}
+      </view>
+    </view>
+    
+
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, watch, onMounted, onUnmounted } from 'vue'
+import Icon from '@/components/icon/index.vue';
+// Props 定义
+const props = defineProps({
+  // 选项数组
+  options: {
+    type: Array,
+    default: () => []
+  },
+  // 字段映射
+  mapping: {
+    type: Object,
+    default: () => ({ text: 'n', value: 'v' })
+  },
+  // 默认值
+  modelValue: {
+    type: [String, Number],
+    default: ''
+  },
+  // 占位符
+  placeholder: {
+    type: String,
+    default: '请选择'
+  },
+  // 校验配置
+  validation: {
+    type: Object,
+    default: () => ({ enable: false, message: '' })
+  },
+  // 是否禁用
+  disabled: {
+    type: Boolean,
+    default: false
+  },
+  // 是否支持搜索
+  searchable: {
+    type: Boolean,
+    default: false
+  },
+  // 是否支持清空
+  clearable: {
+    type: Boolean,
+    default: false
+  },
+  // 加载状态
+  loading: {
+    type: Boolean,
+    default: false
+  },
+  // 宽度设置
+  width: {
+    type: String,
+    default: '100%'
+  },
+  minWidth:{
+    type:String,
+    default:'unset'
+  }
+})
+
+// Emits 定义
+const emit = defineEmits(['update:modelValue', 'change', 'search', 'clear'])
+
+// 响应式数据
+const isOpen = ref(false)
+const selectedValue = ref(props.modelValue)
+const searchKeyword = ref('')
+
+// 计算属性
+const optionsList = computed(() => props.options || [])
+
+const displayText = computed(() => {
+  if (!selectedValue.value) return props.placeholder
+  
+  const selectedOption = optionsList.value.find(
+    option => option[props.mapping.value] === selectedValue.value
+  )
+  return selectedOption ? selectedOption[props.mapping.text] : props.placeholder
+})
+
+
+
+// 方法
+const toggleDropdown = () => {
+  if (props.disabled) return
+
+  if (!isOpen.value) {
+    // 关闭其他下拉框
+    uni.$emit('closeAllSelects')
+  }
+
+  isOpen.value = !isOpen.value
+}
+
+const selectOption = (option) => {
+  const value = option[props.mapping.value]
+  selectedValue.value = value
+  isOpen.value = false
+  
+  // 触发事件
+  emit('update:modelValue', value)
+  emit('change', value, option)
+}
+
+const closeDropdown = () => {
+  isOpen.value = false
+}
+
+// 设置值的方法(供外部调用)
+const setValue = (value) => {
+  if (!value) {
+    selectedValue.value = ''
+    emit('update:modelValue', '')
+    return true
+  }
+  
+  const option = optionsList.value.find(
+    opt => opt[props.mapping.value] === value
+  )
+  
+  if (option) {
+    selectedValue.value = value
+    emit('update:modelValue', value)
+    emit('change', value, option)
+    return true
+  }
+  
+  return false
+}
+
+// 监听外部值变化
+watch(() => props.modelValue, (newValue) => {
+  selectedValue.value = newValue
+})
+
+// 监听全局关闭事件
+const handleGlobalClose = () => {
+  closeDropdown()
+}
+
+onMounted(() => {
+  uni.$on('closeAllSelects', handleGlobalClose)
+  
+  // 点击页面其他地方关闭下拉框
+  uni.$on('pageClick', closeDropdown)
+})
+
+onUnmounted(() => {
+  uni.$off('closeAllSelects', handleGlobalClose)
+  uni.$off('pageClick', closeDropdown)
+})
+
+// 暴露方法给父组件
+defineExpose({
+  setValue,
+  getValue: () => selectedValue.value,
+  getSelectedOption: () => {
+    return optionsList.value.find(
+      option => option[props.mapping.value] === selectedValue.value
+    )
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+/* ss暂用下拉框样式 */
+.ss-select-container {
+  position: relative;
+  width: v-bind(width);
+  min-width: v-bind(minWidth);
+  font-size: 32rpx;
+
+}
+
+.ss-select {
+  padding: 10rpx 0;
+  border-radius: 10rpx;
+  cursor: pointer;
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-height: 28rpx;
+  box-sizing: border-box;
+
+  &.disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+
+    .select-text {
+      color: #ccc;
+    }
+  }
+}
+
+.select-text {
+  flex: 1;
+  color: #333;
+
+  &.placeholder {
+    color: #999;
+  }
+}
+
+.select-arrow {
+  display: flex;
+  align-items: center;
+  transition: transform 0.3s ease;
+  margin-left: 20rpx;
+
+  &.rotate {
+    transform: rotate(180deg);
+  }
+}
+
+.ss-options {
+  display: none;
+  position: absolute;
+  top: 100%;
+  left: 0;
+  width: 100%;
+  background-color: #393D51;
+  z-index: 1000;
+  color: #fff;
+  border: 2rpx solid #393D51;
+  box-sizing: border-box;
+  border-radius: 10rpx;
+  overflow: hidden;
+  max-height: 600rpx;
+  overflow: auto;
+}
+
+.ss-select-container.open .ss-options {
+  display: block;
+}
+
+.option-item {
+  padding: 20rpx 20rpx 20rpx 46rpx;
+  cursor: pointer;
+  position: relative;
+
+  &::after {
+    content: "";
+    position: absolute;
+    bottom: 0%;
+    left: 50%;
+    transform: translateX(-50%);
+    width: 80%;
+    height: 2rpx;
+    background-color: #303445;
+  }
+
+  &:last-child::after,
+  &:hover::after,
+  &.selected::after {
+    display: none;
+  }
+
+  &:hover {
+    background-color: #fff;
+    color: #393D51;
+  }
+
+  &.selected {
+    background-color: #fff;
+    color: #393D51;
+
+    &::before {
+      content: "";
+      background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23393D51"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>') no-repeat center;
+      position: absolute;
+      width: 30rpx;
+      height: 100%;
+      left: 10rpx;
+      top: 0;
+      color: #393D51;
+    }
+  }
+
+  &.no-options {
+    text-align: center;
+    color: #999;
+    cursor: default;
+
+    &:hover {
+      background-color: #393D51;
+      color: #999;
+    }
+  }
+
+  &.loading-item {
+    text-align: center;
+    color: #999;
+    cursor: default;
+
+    &:hover {
+      background-color: #393D51;
+      color: #999;
+    }
+
+    .loading-text {
+      animation: loading-pulse 1.5s ease-in-out infinite;
+    }
+  }
+}
+
+@keyframes loading-pulse {
+  0%, 100% { opacity: 0.6; }
+  50% { opacity: 1; }
+}
+
+
+</style>

+ 18 - 18
components/SsTableTitle/index.vue

@@ -1,18 +1,18 @@
-<template>
-    <view class="table-title">
-        <slot></slot>
-    </view>
-</template>
-
-<script>
-
-</script>
-
-<style scoped lang="scss">
-.table-title {
-    width: calc(100% - 32rpx);
-    margin:16rpx auto ;
-    font-size: 32rpx;
-    color: #333;
-}
-</style>
+<template>
+    <view class="table-title">
+        <slot></slot>
+    </view>
+</template>
+
+<script>
+
+</script>
+
+<style scoped lang="scss">
+.table-title {
+    width: calc(100% - 32rpx);
+    margin:16rpx auto ;
+    font-size: 32rpx;
+    color: #333;
+}
+</style>

+ 155 - 0
components/SsUploadAvatar/index.vue

@@ -0,0 +1,155 @@
+<template>
+  <view class="ss-upload-avatar">
+    <view class="avatar-container">
+      <!-- 直接在头像图片上使用微信原生头像选择功能 -->
+      <button 
+        class="avatar-btn"
+        open-type="chooseAvatar"
+        @chooseavatar="onChooseAvatar"
+      >
+        <image class="avatar-img" :src="innerUrl" mode="aspectFill" />
+      </button>
+      
+      <text class="avatar-tips">点击图像修改</text>
+    </view>
+
+    <!-- 裁剪器(隐藏,通过 ref 调用) -->
+    <up-cropper
+      ref="cropperRef"
+      :canChangeSize="false"
+      areaWidth="300rpx"
+      areaHeight="300rpx"
+      exportWidth="260rpx"
+      exportHeight="260rpx"
+      @confirm="onCropConfirm"
+    />
+  </view>
+</template>
+
+<script setup>
+import { ref, watch, computed } from 'vue'
+import upload from '@/utils/upload.js'
+import { getImageUrl } from '@/utils/util.js'
+
+/* -------------------- 接口 -------------------- */
+const props = defineProps({
+  modelValue: { type: String, default: '' }
+})
+const emit = defineEmits(['update:modelValue', 'updated'])
+
+/* -------------------- 响应式 -------------------- */
+// 存储服务器路径(用于提交给后端)
+const serverPath = ref(props.modelValue)
+// 计算显示URL(用于回显)
+const innerUrl = computed(() => {
+  if (!serverPath.value) return '/static/images/yishuzhao_nv.svg'
+  // 如果是临时路径(微信临时文件)或本地静态资源,直接显示
+  if (serverPath.value.startsWith('http') ||
+      serverPath.value.startsWith('wxfile://') ||
+      serverPath.value.startsWith('/static/')) {
+    return serverPath.value
+  }
+  // 如果是服务器路径,通过 getImageUrl 转换
+  return getImageUrl(serverPath.value)
+})
+const cropperRef = ref(null)
+
+watch(() => props.modelValue, v => serverPath.value = v)
+
+/* -------- 微信头像选择回调 -------- */
+async function onChooseAvatar(e) {
+  console.log('微信头像选择:', e)
+  const avatarUrl = e.detail.avatarUrl
+  if (avatarUrl) {
+    // 先显示临时图片(即时反馈)
+    serverPath.value = avatarUrl
+
+    // 上传到服务器
+    try {
+      const path = await upload.uploadAvatar(avatarUrl)
+      console.log('上传成功,服务器路径:', path)
+
+      // 更新为服务器返回的 path(只保存 path,不保存完整URL)
+      serverPath.value = path
+      emit('update:modelValue', path)
+      emit('updated', path)
+
+      uni.showToast({ title: '头像上传成功', icon: 'success' })
+    } catch (error) {
+      console.error('上传失败:', error)
+      // 上传失败,恢复原头像
+      serverPath.value = props.modelValue
+      uni.showToast({ title: '上传失败,请重试', icon: 'none' })
+    }
+  } else {
+    uni.showToast({ title: '获取头像失败', icon: 'error' })
+  }
+}
+
+/* -------- 裁剪完成 -------- */
+async function onCropConfirm(e) {
+  const tempPath = e.path
+  // 先显示临时图片
+  serverPath.value = tempPath
+
+  // 上传到服务器
+  try {
+    const path = await upload.uploadAvatar(tempPath)
+    console.log('裁剪并上传成功,服务器路径:', path)
+
+    // 更新为服务器返回的 path
+    serverPath.value = path
+    emit('update:modelValue', path)
+    emit('updated', path)
+
+    uni.showToast({ title: '裁剪并上传成功', icon: 'success' })
+  } catch (error) {
+    console.error('上传失败:', error)
+    // 上传失败,恢复原头像
+    serverPath.value = props.modelValue
+    uni.showToast({ title: '上传失败,请重试', icon: 'none' })
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.ss-upload-avatar {
+  display: flex;
+  align-items: center;
+  
+  .avatar-container {
+    display: flex;
+    // flex-direction: column;
+    align-items: center;
+    gap: 20rpx;
+  }
+  
+  .avatar-btn {
+    // 重置按钮样式,让它看起来就像图片
+    background: none;
+    border: none;
+    padding: 0;
+    margin: 0;
+    border-radius: 0;
+    
+    &::after {
+      border: none;
+    }
+  }
+  
+  .avatar-img {
+    width: 160rpx;
+    height: 160rpx;
+    border-radius: 50%;
+    border: 2rpx solid #eee;
+    background-color: #f5f5f5;
+    display: block; // 确保图片正常显示
+  }
+  
+  .avatar-tips {
+    font-size: 32rpx;
+    color: #666;
+    text-align: center;
+  }
+}
+</style>

+ 245 - 245
components/Td/index.vue

@@ -1,245 +1,245 @@
-<template>
-  <view
-    class="validated-td"
-    style="
-      flex: 1;
-      height: 100%;
-      display: flex;
-      align-items: center;
-      padding: 13rpx 24rpx 13rpx 32rpx;
-      background-color: #fff;
-      color: #000000;
-      font-size: 32rpx;
-      line-height: 38rpx;
-      border-bottom: 1rpx solid #e6e6e6;
-      border-right: 1rpx solid #e6e6e6;
-      position: relative;
-      box-sizing: border-box;
-      min-width: 0;
-      width: 100%;
-    "
-  >
-    <!-- 必填红线 - 只在输入模式下显示 -->
-    <view v-if="!isReadonly && showRequiredLine" class="required-line"></view>
-
-    <!-- 错误红线 - 只在输入模式下显示 -->
-    <view v-if="!isReadonly && hasError" class="error-left-line"></view>
-
-    <!-- 插槽内容包装器 -->
-    <view class="slot-wrapper">
-      <!-- 只读模式 -->
-      <slot v-if="isReadonly"></slot>
-
-      <!-- 输入模式 -->
-      <slot v-else></slot>
-    </view>
-
-    <!-- 错误提示 - 只在输入模式下显示 -->
-    <view v-if="!isReadonly && hasError" class="error-message">
-      {{ errorMessage }}
-    </view>
-  </view>
-</template>
-
-<!--
-  微信小程序组件配置
-  设置样式隔离为shared,允许外部样式影响组件
--->
-<script module="config">
-export default {
-  styleIsolation: 'shared'
-}
-</script>
-
-<script setup>
-import { computed, inject, ref, provide, watch } from 'vue'
-
-const props = defineProps({
-  field: {
-    type: String,
-    required: false
-  },
-  rules: {
-    type: Array,
-    default: () => []
-  }
-})
-
-// 自动判断模式:有field属性就是输入模式,没有就是只读模式
-const isReadonly = computed(() => !props.field)
-
-// 从父组件注入校验相关功能
-const validateField = inject('validateField', () => {})
-const errors = inject('errors', ref({}))
-const formData = inject('formData', ref({}))
-const getFieldConfig = inject('getFieldConfig', () => ({}))
-
-
-// 事件处理函数需要在这里定义,然后再provide
-
-// 获取字段配置
-const fieldConfig = computed(() => {
-  if (isReadonly.value || !props.field) return {}
-  return getFieldConfig(props.field) || {}
-})
-
-// 合并规则:props传入的规则优先级更高
-const finalRules = computed(() => {
-  if (isReadonly.value) return []
-  return props.rules.length > 0 ? props.rules : (fieldConfig.value.rules || [])
-})
-
-// 移除hasValidated,改为直接校验
-
-const hasError = computed(() => {
-  return props.field && errors.value[props.field] && errors.value[props.field].length > 0
-})
-
-const errorMessage = computed(() => {
-  return hasError.value ? errors.value[props.field][0] : ''
-})
-
-// 检查是否为必填字段
-const isRequired = computed(() => {
-  return finalRules.value.some(rule => rule.required)
-})
-
-// 获取当前字段值的辅助函数
-const getCurrentFieldValue = () => {
-  if (!formData.value || !props.field) return undefined
-
-  const fieldPath = props.field.split('.')
-  let value = formData.value
-  for (const key of fieldPath) {
-    value = value?.[key]
-  }
-  return value
-}
-
-// 必填红线显示逻辑
-const showRequiredLine = computed(() => {
-  if (!isRequired.value) return false  // 非必填字段不显示
-  if (hasError.value) return false     // 有错误时不显示(错误红线优先)
-
-  const fieldValue = getCurrentFieldValue()
-
-  // 如果有值,不显示必填红线
-  if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {
-    return false
-  }
-
-  // 如果没有值,显示必填红线
-  return true
-})
-
-// 事件处理函数 - 现在主要用于兼容旧的inject方式
-const handleInput = () => {
-  // 现在由watch自动处理校验,这里不需要做什么
-  console.log(`用户输入 ${props.field}`)
-}
-
-const handleBlur = () => {
-  // 现在由watch自动处理校验,这里不需要做什么
-  console.log(`用户失焦 ${props.field}`)
-}
-
-// 为子组件提供事件处理函数和字段名
-if (!isReadonly.value && props.field) {
-  provide('onInput', handleInput)
-  provide('onBlur', handleBlur)
-  provide('fieldName', props.field)
-}
-
-// 监听formData变化,自动校验(支持v-model模式)
-watch(() => getCurrentFieldValue(), (newValue, oldValue) => {
-  if (isReadonly.value || !props.field) return
-
-  console.log(`watch触发 ${props.field}:`, { newValue, oldValue })
-  console.log(`finalRules.value:`, finalRules.value)
-  console.log(`fieldConfig.value:`, fieldConfig.value)
-
-  // 只有在值真正发生变化时才校验(避免初始化时的无意义校验)
-  if (oldValue !== undefined && newValue !== oldValue) {
-    if (finalRules.value.length > 0) {
-      console.log(`执行校验 ${props.field}:`, newValue)
-      validateField(props.field, newValue, finalRules.value)
-    } else {
-      console.log(`没有校验规则 ${props.field}`)
-    }
-  }
-}, { flush: 'post' })
-</script>
-
-<style lang="scss" scoped>
-/**
- * ValidatedTd 组件样式
- *
- * 设计说明:
- * 1. 宽度问题已通过页面CSS解决(validated-td选择器)
- * 2. 必填红线:显示在td左侧,提示用户该字段为必填
- * 3. 错误红线:显示在td左侧,提示用户校验失败
- * 4. 错误提示:显示在td右下角,显示具体错误信息
- * 5. 所有校验相关样式只在非只读模式下生效
- */
-
-/* 主容器样式 */
-.validated-td {
-  position: relative;
-  display: flex;
-  align-items: center;
-  flex: 1;
-  min-width: 0;
-  width: 100%;
-}
-
-/* 必填红线 - 显示在td左侧,表示该字段为必填项 */
-.required-line {
-  position: absolute;
-  left: 0;
-  top: 0;
-  bottom: 0;
-  width: 6rpx; /* 红线宽度 */
-  background-color: #f56c6c; /* 红色 */
-  z-index: 1; /* 层级较低,会被错误红线覆盖 */
-}
-
-/* 校验错误左侧红线 - 显示在td左侧,表示校验失败 */
-.error-left-line {
-  position: absolute;
-  left: 0;
-  top: 0;
-  bottom: 0;
-  width: 6rpx; /* 红线宽度 */
-  background-color: #f56c6c; /* 红色 */
-  z-index: 2; /* 层级较高,会覆盖必填红线 */
-}
-
-/* 错误提示文字 - 显示在td右下角,显示具体的错误信息 */
-.error-message {
-  position: absolute;
-  right: 0; /* 靠右对齐 */
-  bottom: 0rpx; /* 贴底显示 */
-  color: #f56c6c; /* 红色文字 */
-  font-size: 24rpx; /* 较小的字体 */
-  line-height: 32rpx;
-  height: 32rpx;
-  padding: 0 8rpx; /* 左右内边距 */
-  box-sizing: border-box;
-  z-index: 10; /* 最高层级,确保显示在最上层 */
-  white-space: nowrap; /* 不换行 */
-  width: 100%; /* 占满宽度 */
-  display: flex;
-  justify-content: flex-end; /* 右对齐 */
-  border-bottom: 1px solid #f56c6c; /* 底部红线 */
-}
-
-/* 插槽包装器 - 确保内容正确显示 */
-.slot-wrapper {
-  width: 100%;
-  height: 100%;
-  display: flex;
-  align-items: center;
-  flex: 1;
-  min-width: 0;
-}
-</style>
+<template>
+  <view
+    class="validated-td"
+    style="
+      flex: 1;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      padding: 13rpx 24rpx 13rpx 32rpx;
+      background-color: #fff;
+      color: #000000;
+      font-size: 32rpx;
+      line-height: 38rpx;
+      border-bottom: 1rpx solid #e6e6e6;
+      border-right: 1rpx solid #e6e6e6;
+      position: relative;
+      box-sizing: border-box;
+      min-width: 0;
+      width: 100%;
+    "
+  >
+    <!-- 必填红线 - 只在输入模式下显示 -->
+    <view v-if="!isReadonly && showRequiredLine" class="required-line"></view>
+
+    <!-- 错误红线 - 只在输入模式下显示 -->
+    <view v-if="!isReadonly && hasError" class="error-left-line"></view>
+
+    <!-- 插槽内容包装器 -->
+    <view class="slot-wrapper">
+      <!-- 只读模式 -->
+      <slot v-if="isReadonly"></slot>
+
+      <!-- 输入模式 -->
+      <slot v-else></slot>
+    </view>
+
+    <!-- 错误提示 - 只在输入模式下显示 -->
+    <view v-if="!isReadonly && hasError" class="error-message">
+      {{ errorMessage }}
+    </view>
+  </view>
+</template>
+
+<!--
+  微信小程序组件配置
+  设置样式隔离为shared,允许外部样式影响组件
+-->
+<script module="config">
+export default {
+  styleIsolation: 'shared'
+}
+</script>
+
+<script setup>
+import { computed, inject, ref, provide, watch } from 'vue'
+
+const props = defineProps({
+  field: {
+    type: String,
+    required: false
+  },
+  rules: {
+    type: Array,
+    default: () => []
+  }
+})
+
+// 自动判断模式:有field属性就是输入模式,没有就是只读模式
+const isReadonly = computed(() => !props.field)
+
+// 从父组件注入校验相关功能
+const validateField = inject('validateField', () => {})
+const errors = inject('errors', ref({}))
+const formData = inject('formData', ref({}))
+const getFieldConfig = inject('getFieldConfig', () => ({}))
+
+
+// 事件处理函数需要在这里定义,然后再provide
+
+// 获取字段配置
+const fieldConfig = computed(() => {
+  if (isReadonly.value || !props.field) return {}
+  return getFieldConfig(props.field) || {}
+})
+
+// 合并规则:props传入的规则优先级更高
+const finalRules = computed(() => {
+  if (isReadonly.value) return []
+  return props.rules.length > 0 ? props.rules : (fieldConfig.value.rules || [])
+})
+
+// 移除hasValidated,改为直接校验
+
+const hasError = computed(() => {
+  return props.field && errors.value[props.field] && errors.value[props.field].length > 0
+})
+
+const errorMessage = computed(() => {
+  return hasError.value ? errors.value[props.field][0] : ''
+})
+
+// 检查是否为必填字段
+const isRequired = computed(() => {
+  return finalRules.value.some(rule => rule.required)
+})
+
+// 获取当前字段值的辅助函数
+const getCurrentFieldValue = () => {
+  if (!formData.value || !props.field) return undefined
+
+  const fieldPath = props.field.split('.')
+  let value = formData.value
+  for (const key of fieldPath) {
+    value = value?.[key]
+  }
+  return value
+}
+
+// 必填红线显示逻辑
+const showRequiredLine = computed(() => {
+  if (!isRequired.value) return false  // 非必填字段不显示
+  if (hasError.value) return false     // 有错误时不显示(错误红线优先)
+
+  const fieldValue = getCurrentFieldValue()
+
+  // 如果有值,不显示必填红线
+  if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {
+    return false
+  }
+
+  // 如果没有值,显示必填红线
+  return true
+})
+
+// 事件处理函数 - 现在主要用于兼容旧的inject方式
+const handleInput = () => {
+  // 现在由watch自动处理校验,这里不需要做什么
+  // console.log(`用户输入 ${props.field}`)
+}
+
+const handleBlur = () => {
+  // 现在由watch自动处理校验,这里不需要做什么
+  // console.log(`用户失焦 ${props.field}`)
+}
+
+// 为子组件提供事件处理函数和字段名
+if (!isReadonly.value && props.field) {
+  provide('onInput', handleInput)
+  provide('onBlur', handleBlur)
+  provide('fieldName', props.field)
+}
+
+// 监听formData变化,自动校验(支持v-model模式)
+watch(() => getCurrentFieldValue(), (newValue, oldValue) => {
+  if (isReadonly.value || !props.field) return
+
+  // console.log(`watch触发 ${props.field}:`, { newValue, oldValue })
+  // console.log(`finalRules.value:`, finalRules.value)
+  // console.log(`fieldConfig.value:`, fieldConfig.value)
+
+  // 只有在值真正发生变化时才校验(避免初始化时的无意义校验)
+  if (oldValue !== undefined && newValue !== oldValue) {
+    if (finalRules.value.length > 0) {
+      // console.log(`执行校验 ${props.field}:`, newValue)
+      validateField(props.field, newValue, finalRules.value)
+    } else {
+      // console.log(`没有校验规则 ${props.field}`)
+    }
+  }
+}, { flush: 'post' })
+</script>
+
+<style lang="scss" scoped>
+/**
+ * ValidatedTd 组件样式
+ *
+ * 设计说明:
+ * 1. 宽度问题已通过页面CSS解决(validated-td选择器)
+ * 2. 必填红线:显示在td左侧,提示用户该字段为必填
+ * 3. 错误红线:显示在td左侧,提示用户校验失败
+ * 4. 错误提示:显示在td右下角,显示具体错误信息
+ * 5. 所有校验相关样式只在非只读模式下生效
+ */
+
+/* 主容器样式 */
+.validated-td {
+  position: relative;
+  display: flex;
+  align-items: center;
+  flex: 1;
+  min-width: 0;
+  width: 100%;
+}
+
+/* 必填红线 - 显示在td左侧,表示该字段为必填项 */
+.required-line {
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  width: 6rpx; /* 红线宽度 */
+  background-color: #f56c6c; /* 红色 */
+  z-index: 1; /* 层级较低,会被错误红线覆盖 */
+}
+
+/* 校验错误左侧红线 - 显示在td左侧,表示校验失败 */
+.error-left-line {
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  width: 6rpx; /* 红线宽度 */
+  background-color: #f56c6c; /* 红色 */
+  z-index: 2; /* 层级较高,会覆盖必填红线 */
+}
+
+/* 错误提示文字 - 显示在td右下角,显示具体的错误信息 */
+.error-message {
+  position: absolute;
+  right: 0; /* 靠右对齐 */
+  bottom: 0rpx; /* 贴底显示 */
+  color: #f56c6c; /* 红色文字 */
+  font-size: 24rpx; /* 较小的字体 */
+  line-height: 32rpx;
+  height: 32rpx;
+  padding: 0 8rpx; /* 左右内边距 */
+  box-sizing: border-box;
+  z-index: 10; /* 最高层级,确保显示在最上层 */
+  white-space: nowrap; /* 不换行 */
+  width: 100%; /* 占满宽度 */
+  display: flex;
+  justify-content: flex-end; /* 右对齐 */
+  border-bottom: 1px solid #f56c6c; /* 底部红线 */
+}
+
+/* 插槽包装器 - 确保内容正确显示 */
+.slot-wrapper {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  flex: 1;
+  min-width: 0;
+}
+</style>

+ 226 - 226
components/agreement/AgreementPopup.vue

@@ -1,226 +1,226 @@
-<template>
-  <view class="agreement-popup" :class="{ 'show': visible }">
-    <view class="mask" @tap="handleClose"></view>
-    <view class="popup-content">
-      <!-- 头部 -->
-      <view class="popup-header">
-        <text class="title">{{ title }}</text>
-        <text class="close-btn" @tap="handleClose">×</text>
-      </view>
-      
-      <!-- 内容区域 -->
-      <scroll-view class="content" scroll-y>
-        <template v-if="type === 'user'">
-          <view class="agreement-text">
-            <view class="section">
-              <view class="section-title">一、服务说明</view>
-              <view class="paragraph">1.1 本平台是面向学生家长的智慧校园服务平台,旨在为家长提供便捷的教育信息服务。</view>
-              <view class="paragraph">1.2 通过本平台,家长可以查看学生在校情况、与教师沟通、接收学校通知等。</view>
-            </view>
-            <view class="section">
-              <view class="section-title">二、账号管理</view>
-              <view class="paragraph">2.1 家长需要使用真实身份信息进行注册和认证,确保与学生的关系真实有效。</view>
-              <view class="paragraph">2.2 每个账号仅限本人使用,请勿将账号信息泄露或转借他人。</view>
-            </view>
-            <view class="section">
-              <view class="section-title">三、使用规范</view>
-              <view class="paragraph">3.1 请遵守平台规则,文明发言,不得发布不当言论或有害信息。</view>
-              <view class="paragraph">3.2 尊重教师和其他家长的隐私,未经允许不得传播他人信息。</view>
-            </view>
-            <view class="section">
-              <view class="section-title">四、服务变更</view>
-              <view class="paragraph">4.1 平台将持续优化服务内容,以提供更好的使用体验。</view>
-              <view class="paragraph">4.2 如遇重大更新,平台会及时通知用户。</view>
-            </view>
-          </view>
-        </template>
-        
-        <template v-else>
-          <view class="agreement-text">
-            <view class="section">
-              <view class="section-title">非繁数智校园 小程序隐私保护指引</view>
-              <view class="paragraph">本指引是非繁数智校园小程序开发者 非繁软件(广州)有限公司(以下简称"开发者")为处理你的个人信息而制定。</view>
-            </view>
-
-            <view class="section">
-              <view class="section-title">开发者处理的信息</view>
-              <view class="paragraph">根据法律规定,开发者仅处理实现小程序功能所必要的信息。</view>
-              <view class="paragraph">为了确定用户的真实性,便于用户关联自己的小孩,开发者将在获取你的明示同意后,收集你的微信昵称、头像。</view>
-            </view>
-
-            <view class="section">
-              <view class="section-title">第三方插件信息/SDK信息</view>
-              <view class="paragraph">为实现特定功能,开发者可能会接入由第三方提供的插件/SDK。第三方插件/SDK的个人信息处理规则,请以其公示的官方说明为准。非繁数智校园小程序接入的第三方插件信息/SDK信息如下:</view>
-              <view class="paragraph">插件名称:VOIP通话</view>
-              <view class="paragraph">插件提供方名称: 深圳市腾讯计算机系统有限公司</view>
-              <view class="paragraph">为了音视频通话,开发者将在获得你的明示同意后,访问你的摄像头。</view>
-              <view class="paragraph">为了音视频通话,开发者将在获得你的明示同意后,访问你的麦克风。</view>
-              <view class="paragraph">为了保存组件截图,开发者将在获得你的明示同意后,使用你的相册(仅写入)权限。</view>
-            </view>
-
-            <view class="section">
-              <view class="section-title">你的权益</view>
-              <view class="paragraph">关于你的个人信息,你可以通过以下方式与开发者联系,行使查阅、复制、更正、删除等法定权利。</view>
-              <view class="paragraph">若你在小程序中注册了账号,你可以通过以下方式与开发者联系,申请注销你在小程序中使用的账号。在受理你的申请后,开发者承诺在十五个工作日内完成核查和处理,并按照法律法规要求处理你的相关信息。</view>
-              <view class="paragraph">邮箱:1612356478@qq.com</view>
-            </view>
-
-            <view class="section">
-              <view class="section-title">开发者对信息的存储</view>
-              <view class="paragraph">开发者承诺,除法律法规另有规定外,开发者对你的信息的保存期限应当为实现处理目的所必要的最短时间。</view>
-            </view>
-
-            <view class="section">
-              <view class="section-title">信息的使用规则</view>
-              <view class="paragraph">开发者将会在本指引所明示的用途内使用收集的信息</view>
-              <view class="paragraph">如开发者使用你的信息超出本指引目的或合理范围,开发者必须在变更使用目的或范围前,再次以小程序通知方式告知并征得你的明示同意。</view>
-            </view>
-
-            <view class="section">
-              <view class="section-title">信息对外提供</view>
-              <view class="paragraph">开发者承诺,不会主动共享或转让你的信息至任何第三方,如存在确需共享或转让时,开发者应当直接征得或确认第三方征得你的单独同意。</view>
-              <view class="paragraph">开发者承诺,不会对外公开披露你的信息,如必须公开披露时,开发者应当向你告知公开披露的目的、披露信息的类型及可能涉及的信息,并征得你的单独同意。</view>
-            </view>
-
-            <view class="section">
-              <view class="paragraph">你认为开发者未遵守上述约定,或有其他的投诉建议、或未成年人个人信息保护相关问题,可通过以下方式与开发者联系;或者向微信进行投诉。</view>
-              <view class="paragraph">邮箱 : 1612356478@qq.com</view>
-            </view>
-
-            <view class="section">
-              <view class="paragraph">更新日期:2025-05-07</view>
-              <view class="paragraph">生效日期:2025-05-07</view>
-            </view>
-
-           
-          </view>
-        </template>
-      </scroll-view>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref, computed } from 'vue'
-
-const props = defineProps({
-  visible: {
-    type: Boolean,
-    default: false
-  },
-  type: {
-    type: String,
-    default: 'user' // 'user' 或 'privacy'
-  }
-})
-
-const emit = defineEmits(['update:visible'])
-
-const title = computed(() => {
-  return props.type === 'user' ? '用户服务协议' : '隐私政策'
-})
-
-const handleClose = () => {
-  emit('update:visible', false)
-}
-</script>
-
-<style scoped>
-.agreement-popup {
-  position: fixed;
-  left: 0;
-  right: 0;
-  top: 0;
-  bottom: 0;
-  z-index: 99999;
-  visibility: hidden;
-}
-
-.agreement-popup.show {
-  visibility: visible;
-}
-
-.agreement-popup.show .popup-content {
-  transform: translateY(0);
-}
-
-.mask {
-  position: absolute;
-  left: 0;
-  right: 0;
-  top: 0;
-  bottom: 0;
-  background: rgba(0, 0, 0, 0.6);
-}
-
-.popup-content {
-  position: absolute;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background: #fff;
-  border-radius: 24rpx 24rpx 0 0;
-  padding: 40rpx 30rpx;
-  transform: translateY(100%);
-  transition: transform 0.3s ease-out;
-  max-height: 80vh;
-  display: flex;
-  flex-direction: column;
-}
-
-.popup-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 40rpx;
-}
-
-.title {
-  font-size: 36rpx;
-  font-weight: bold;
-  color: #333;
-}
-
-.close-btn {
-  font-size: 48rpx;
-  color: #999;
-  padding: 20rpx;
-  margin: -20rpx;
-}
-
-.content {
-  flex: 1;
-  overflow: auto;
-}
-
-.agreement-text {
-  padding-bottom: 40rpx;
-}
-
-.section {
-  margin-bottom: 40rpx;
-}
-
-.section-title {
-  font-size: 32rpx;
-  font-weight: bold;
-  color: #333;
-  margin-bottom: 20rpx;
-}
-
-.paragraph {
-  font-size: 28rpx;
-  color: #666;
-  line-height: 1.8;
-  margin-bottom: 16rpx;
-  text-align: justify;
-}
-
-/* 隐藏滚动条 */
-::-webkit-scrollbar {
-  display: none;
-  width: 0;
-  height: 0;
-  color: transparent;
-}
-</style>
+<template>
+  <view class="agreement-popup" :class="{ 'show': visible }">
+    <view class="mask" @tap="handleClose"></view>
+    <view class="popup-content">
+      <!-- 头部 -->
+      <view class="popup-header">
+        <text class="title">{{ title }}</text>
+        <text class="close-btn" @tap="handleClose">×</text>
+      </view>
+      
+      <!-- 内容区域 -->
+      <scroll-view class="content" scroll-y>
+        <template v-if="type === 'user'">
+          <view class="agreement-text">
+            <view class="section">
+              <view class="section-title">一、服务说明</view>
+              <view class="paragraph">1.1 本平台是面向学生家长的智慧校园服务平台,旨在为家长提供便捷的教育信息服务。</view>
+              <view class="paragraph">1.2 通过本平台,家长可以查看学生在校情况、与教师沟通、接收学校通知等。</view>
+            </view>
+            <view class="section">
+              <view class="section-title">二、账号管理</view>
+              <view class="paragraph">2.1 家长需要使用真实身份信息进行注册和认证,确保与学生的关系真实有效。</view>
+              <view class="paragraph">2.2 每个账号仅限本人使用,请勿将账号信息泄露或转借他人。</view>
+            </view>
+            <view class="section">
+              <view class="section-title">三、使用规范</view>
+              <view class="paragraph">3.1 请遵守平台规则,文明发言,不得发布不当言论或有害信息。</view>
+              <view class="paragraph">3.2 尊重教师和其他家长的隐私,未经允许不得传播他人信息。</view>
+            </view>
+            <view class="section">
+              <view class="section-title">四、服务变更</view>
+              <view class="paragraph">4.1 平台将持续优化服务内容,以提供更好的使用体验。</view>
+              <view class="paragraph">4.2 如遇重大更新,平台会及时通知用户。</view>
+            </view>
+          </view>
+        </template>
+        
+        <template v-else>
+          <view class="agreement-text">
+            <view class="section">
+              <view class="section-title">非繁数智校园 小程序隐私保护指引</view>
+              <view class="paragraph">本指引是非繁数智校园小程序开发者 非繁软件(广州)有限公司(以下简称"开发者")为处理你的个人信息而制定。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">开发者处理的信息</view>
+              <view class="paragraph">根据法律规定,开发者仅处理实现小程序功能所必要的信息。</view>
+              <view class="paragraph">为了确定用户的真实性,便于用户关联自己的小孩,开发者将在获取你的明示同意后,收集你的微信昵称、头像。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">第三方插件信息/SDK信息</view>
+              <view class="paragraph">为实现特定功能,开发者可能会接入由第三方提供的插件/SDK。第三方插件/SDK的个人信息处理规则,请以其公示的官方说明为准。非繁数智校园小程序接入的第三方插件信息/SDK信息如下:</view>
+              <view class="paragraph">插件名称:VOIP通话</view>
+              <view class="paragraph">插件提供方名称: 深圳市腾讯计算机系统有限公司</view>
+              <view class="paragraph">为了音视频通话,开发者将在获得你的明示同意后,访问你的摄像头。</view>
+              <view class="paragraph">为了音视频通话,开发者将在获得你的明示同意后,访问你的麦克风。</view>
+              <view class="paragraph">为了保存组件截图,开发者将在获得你的明示同意后,使用你的相册(仅写入)权限。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">你的权益</view>
+              <view class="paragraph">关于你的个人信息,你可以通过以下方式与开发者联系,行使查阅、复制、更正、删除等法定权利。</view>
+              <view class="paragraph">若你在小程序中注册了账号,你可以通过以下方式与开发者联系,申请注销你在小程序中使用的账号。在受理你的申请后,开发者承诺在十五个工作日内完成核查和处理,并按照法律法规要求处理你的相关信息。</view>
+              <view class="paragraph">邮箱:1612356478@qq.com</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">开发者对信息的存储</view>
+              <view class="paragraph">开发者承诺,除法律法规另有规定外,开发者对你的信息的保存期限应当为实现处理目的所必要的最短时间。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">信息的使用规则</view>
+              <view class="paragraph">开发者将会在本指引所明示的用途内使用收集的信息</view>
+              <view class="paragraph">如开发者使用你的信息超出本指引目的或合理范围,开发者必须在变更使用目的或范围前,再次以小程序通知方式告知并征得你的明示同意。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">信息对外提供</view>
+              <view class="paragraph">开发者承诺,不会主动共享或转让你的信息至任何第三方,如存在确需共享或转让时,开发者应当直接征得或确认第三方征得你的单独同意。</view>
+              <view class="paragraph">开发者承诺,不会对外公开披露你的信息,如必须公开披露时,开发者应当向你告知公开披露的目的、披露信息的类型及可能涉及的信息,并征得你的单独同意。</view>
+            </view>
+
+            <view class="section">
+              <view class="paragraph">你认为开发者未遵守上述约定,或有其他的投诉建议、或未成年人个人信息保护相关问题,可通过以下方式与开发者联系;或者向微信进行投诉。</view>
+              <view class="paragraph">邮箱 : 1612356478@qq.com</view>
+            </view>
+
+            <view class="section">
+              <view class="paragraph">更新日期:2025-05-07</view>
+              <view class="paragraph">生效日期:2025-05-07</view>
+            </view>
+
+           
+          </view>
+        </template>
+      </scroll-view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue'
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  type: {
+    type: String,
+    default: 'user' // 'user' 或 'privacy'
+  }
+})
+
+const emit = defineEmits(['update:visible'])
+
+const title = computed(() => {
+  return props.type === 'user' ? '用户服务协议' : '隐私政策'
+})
+
+const handleClose = () => {
+  emit('update:visible', false)
+}
+</script>
+
+<style scoped>
+.agreement-popup {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  z-index: 99999;
+  visibility: hidden;
+}
+
+.agreement-popup.show {
+  visibility: visible;
+}
+
+.agreement-popup.show .popup-content {
+  transform: translateY(0);
+}
+
+.mask {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.6);
+}
+
+.popup-content {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: #fff;
+  border-radius: 24rpx 24rpx 0 0;
+  padding: 40rpx 30rpx;
+  transform: translateY(100%);
+  transition: transform 0.3s ease-out;
+  max-height: 80vh;
+  display: flex;
+  flex-direction: column;
+}
+
+.popup-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 40rpx;
+}
+
+.title {
+  font-size: 36rpx;
+  font-weight: bold;
+  color: #333;
+}
+
+.close-btn {
+  font-size: 48rpx;
+  color: #999;
+  padding: 20rpx;
+  margin: -20rpx;
+}
+
+.content {
+  flex: 1;
+  overflow: auto;
+}
+
+.agreement-text {
+  padding-bottom: 40rpx;
+}
+
+.section {
+  margin-bottom: 40rpx;
+}
+
+.section-title {
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #333;
+  margin-bottom: 20rpx;
+}
+
+.paragraph {
+  font-size: 28rpx;
+  color: #666;
+  line-height: 1.8;
+  margin-bottom: 16rpx;
+  text-align: justify;
+}
+
+/* 隐藏滚动条 */
+::-webkit-scrollbar {
+  display: none;
+  width: 0;
+  height: 0;
+  color: transparent;
+}
+</style>

+ 120 - 0
components/custom-modal.vue

@@ -0,0 +1,120 @@
+<template>
+	<view v-if="visible" class="modal-overlay" @click.stop="handleOverlayClick">
+		<view class="modal-container" @click.stop>
+			<view class="modal-title">{{ title }}</view>
+			<view class="modal-content">{{ content }}</view>
+			<view class="modal-footer">
+				<view v-if="showCancel" class="modal-btn cancel-btn" @click="handleCancel">
+					{{ cancelText }}
+				</view>
+				<view class="modal-btn confirm-btn" @click="handleConfirm">
+					{{ confirmText }}
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'CustomModal',
+	props: {
+		visible: {
+			type: Boolean,
+			default: false
+		},
+		title: {
+			type: String,
+			default: '提示'
+		},
+		content: {
+			type: String,
+			default: ''
+		},
+		showCancel: {
+			type: Boolean,
+			default: false
+		},
+		cancelText: {
+			type: String,
+			default: '取消'
+		},
+		confirmText: {
+			type: String,
+			default: '确定'
+		}
+	},
+	methods: {
+		handleConfirm() {
+			this.$emit('confirm')
+		},
+		handleCancel() {
+			this.$emit('cancel')
+		},
+		handleOverlayClick() {
+			// 点击遮罩层不做任何操作,防止误触
+		}
+	}
+}
+</script>
+
+<style scoped>
+.modal-overlay {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background-color: rgba(0, 0, 0, 0.6);
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 9999;
+}
+
+.modal-container {
+	width: 600rpx;
+	background-color: #fff;
+	border-radius: 16rpx;
+	overflow: hidden;
+}
+
+.modal-title {
+	padding: 40rpx 40rpx 20rpx;
+	font-size: 36rpx;
+	font-weight: 600;
+	color: #333;
+	text-align: center;
+}
+
+.modal-content {
+	padding: 20rpx 40rpx 40rpx;
+	font-size: 32rpx;
+	color: #666;
+	text-align: center;
+	line-height: 1.6;
+}
+
+.modal-footer {
+	display: flex;
+	border-top: 1rpx solid #e5e5e5;
+}
+
+.modal-btn {
+	flex: 1;
+	padding: 30rpx;
+	font-size: 34rpx;
+	text-align: center;
+	color: #333;
+}
+
+.cancel-btn {
+	border-right: 1rpx solid #e5e5e5;
+	color: #666;
+}
+
+.confirm-btn {
+	color: #576b95;
+	font-weight: 500;
+}
+</style>

+ 54 - 52
components/icon/index.vue

@@ -1,53 +1,55 @@
-<template>
-  <text 
-    :class="['iconfont', iconClass]" 
-    :style="{ color: color, fontSize: size + 'rpx',verticalAlign: 'middle'}"
-    @click="handleClick"
-  ></text>
-</template>
-
-<script setup>
-/**
- * 图标组件
- * 基于iconfont图标库
- */
-import { computed } from 'vue';
-
-// 组件属性定义
-const props = defineProps({
-  // 图标名称,对应iconfont中的类名,如'icon-home'
-  name: {
-    type: String,
-    required: true
-  },
-  // 图标颜色
-  color: {
-    type: String,
-    default: '#000'
-  },
-  // 图标大小,单位rpx
-  size: {
-    type: [Number, String],
-    default: 32
-  }
-});
-
-// 事件
-const emit = defineEmits(['click']);
-
-// 计算完整的图标类名
-const iconClass = computed(() => {
-  return props.name;
-});
-
-// 点击事件处理
-const handleClick = (event) => {
-  emit('click', event);
-};
-</script>
-
-<style>
-
-/* 引入iconfont样式 */
-@import '../../static/iconfont/iconfont.css';
+<template>
+  <text 
+    :class="['iconfont', iconClass]" 
+    :style="{ color: color, fontSize: size + 'rpx',verticalAlign: 'middle'}"
+    @click="handleClick"
+  ></text>
+</template>
+
+<script setup>
+/**
+ * 图标组件
+ * 基于iconfont图标库
+ */
+import { computed } from 'vue';
+
+// 组件属性定义
+const props = defineProps({
+  // 图标名称,对应iconfont中的类名,如'icon-home'
+  name: {
+    type: String,
+    required: true
+  },
+  // 图标颜色
+  color: {
+    type: String,
+    default: '#000'
+  },
+  // 图标大小,单位rpx
+  size: {
+    type: [Number, String],
+    default: 32
+  }
+});
+
+// 事件
+const emit = defineEmits(['click']);
+
+// 计算完整的图标类名
+const iconClass = computed(() => {
+  return props.name;
+});
+
+// 点击事件处理
+const handleClick = (event) => {
+  emit('click', event);
+};
+</script>
+
+<style>
+/* 引入iconfont样式 */
+@import '../../static/iconfont/iconfont.css';
+.iconfont{
+  line-height: 1;
+}
 </style> 

+ 470 - 470
components/login/LoginPopup.vue

@@ -1,471 +1,471 @@
-<template>
-
-    <view class="login-popup" :class="{ 'show': loginPopupVisible }">
-        <view class="mask" @tap="handleClose"></view>
-        <view class="popup-content">
-            <view class="popup-header">
-                <text class="title">登录</text>
-                <text class="close-btn" @tap="handleClose">×</text>
-            </view>
-
-            <!-- 微信登录按钮 -->
-            <!-- <button class="wechat-btn" @tap="handleWechatLogin">
-                <image src="/static/icon/wechat.png" mode="aspectFit" class="wechat-icon"></image>
-                微信一键登录
-            </button> -->
-
-            <!-- 分割线 -->
-            <!-- <view class="divider">
-                <text class="divider-text">或</text>
-            </view> -->
-
-            <!-- 账号密码登录 -->
-            <view class="account-login">
-                <view class="input-item">
-                    <input type="text" v-model="form.username" placeholder="用户名" placeholder-class="placeholder"
-                        />
-                </view>
-                <view class="input-item">
-                    <input :password="!showPassword" type="text" v-model="form.password" placeholder="密码"
-                        placeholder-class="placeholder" />
-
-                    <view class="eye-icon" @tap.stop="showPassword = !showPassword">
-                        <image :src="showPassword ? '/static/icon/eye-open.png' : '/static/icon/eye-close.png'"
-                            mode="aspectFit" class="eye-image"></image>
-                    </view>
-                </view>
-                <button
-                    class="account-btn"
-                    :class="{ 'disabled': isLogging }"
-                    :disabled="isLogging"
-                    @tap="handleAccountLogin"
-                >
-                    {{ isLogging ? '登录中...' : '登录' }}
-                </button>
-            </view>
-
-            <!-- 用户协议 -->
-            <view class="agreement">
-                <checkbox :checked="agreed" @tap="handleAgreementConfirm" color="#40ac6d" />
-                <text class="agreement-text">
-                    我已阅读并同意
-                    <text class="link" @tap="openAgreement('user')">《用户协议》</text>
-                    与
-                    <text class="link" @tap="openAgreement('privacy')">《隐私协议》</text>
-                </text>
-            </view>
-        </view>
-    </view>
-
-    <agreement-popup v-model:visible="showAgreement" :type="agreementType" />
-</template>
-
-<script setup>
-import AgreementPopup from '../agreement/AgreementPopup.vue'
-
-import { ref } from 'vue'
-import { useUserStore } from '@/store/modules/user'
-import { storeToRefs } from 'pinia'
-import { userApi } from '@/api/user'
-
-const userStore = useUserStore()
-const { loginPopupVisible } = storeToRefs(userStore)
-
-const loginType = ref('wechat')
-const form = ref({
-    username: '',
-    password: ''
-})
-const showPassword = ref(false)
-const agreed = ref(false)
-const showAgreement = ref(false)
-const agreementType = ref('user')
-
-// 防重复点击状态
-const isLogging = ref(false)
-
-// 点击协议链接
-const openAgreement = (type) => {
-    agreementType.value = type
-    showAgreement.value = true
-}
-
-// 确认阅读协议
-const handleAgreementConfirm = () => {
-    agreed.value = true
-}
-const handleClose = () => {
-    userStore.hideLoginPopup()
-    form.value.username = ''
-    form.value.password = ''
-    agreed.value = false
-    isLogging.value = false // 重置登录状态
-    uni.hideLoading() // 确保隐藏 loading
-}
-// 微信登录
-const handleWechatLogin = async () => {
-    if (isLogging.value) {
-        console.log('正在登录中,请勿重复点击')
-        return
-    }
-
-    if (!agreed.value) {
-        uni.showToast({
-            title: '请先同意用户协议和隐私协议',
-            icon: 'none'
-        })
-        return
-    }
-
-    try {
-        isLogging.value = true
-
-        // 显示获取微信授权的提示
-        uni.showLoading({
-            title: '获取微信授权...',
-            mask: true
-        })
-
-        const loginRes = await uni.login()
-
-        // 切换到登录中的 loading
-        uni.showLoading({
-            title: '微信登录中...',
-            mask: true
-        })
-
-        const res = await userApi.wechatLogin({
-            code: loginRes.code
-        }, () => {
-            // 请求完成回调,无论成功失败都会执行
-            isLogging.value = false
-            uni.hideLoading() // 隐藏 loading
-        })
-
-        console.log("登录成功", res.data)
-        userStore.setUserInfo(res.data)
-        uni.$emit('login', res.data)
-        handleClose()
-
-    } catch (e) {
-        console.error('登录失败:', e)
-        uni.showToast({
-            title: '登录失败',
-            icon: 'none'
-        })
-        // 确保隐藏 loading 和重置状态
-        isLogging.value = false
-        uni.hideLoading()
-    }
-}
-
-// 账号密码登录
-const handleAccountLogin = async () => {
-    if (isLogging.value) {
-        console.log('正在登录中,请勿重复点击')
-        return
-    }
-
-    if (!agreed.value) {
-        uni.showToast({
-            title: '请先同意用户协议和隐私协议',
-            icon: 'none'
-        })
-        return
-    }
-    if (!form.value.username || !form.value.password) {
-        uni.showToast({
-            title: '请输入用户名和密码',
-            icon: 'none'
-        })
-        return
-    }
-
-    try {
-        isLogging.value = true
-
-        // 显示获取微信授权的提示
-        uni.showLoading({
-            title: '获取微信授权...',
-            mask: true
-        })
-
-        uni.login({
-            provider: 'weixin',
-            success: async function (loginRes) {
-                try {
-                    console.log("wxcode", loginRes.code);
-
-                    // 切换到登录中的 loading
-                    uni.showLoading({
-                        title: '登录中...',
-                        mask: true
-                    })
-
-                    try {
-                        const res = await userApi.accountLogin({
-                            yhm: form.value.username,
-                            mm: form.value.password,
-                            wdConfirmationCaptchaService: "0",
-                            wechatCode: loginRes.code
-                        })
-
-                        uni.hideLoading()
-                        console.log("account登录成功", res.data)
-                        uni.$emit('login', res.data)
-                        userStore.setUserInfo(res.data)
-                        
-                        handleClose()
-
-                    } catch (error) {
-                        console.error('登录失败:', error)
-                        uni.showToast({
-                            title: '登录失败',
-                            icon: 'none'
-                        })
-                    } finally {
-                        // 无论成功失败,都重置状态
-                        isLogging.value = false
-                        uni.hideLoading()
-                    }
-                } catch (outerError) {
-                    console.error('登录过程出错:', outerError)
-                    uni.showToast({
-                        title: '登录失败',
-                        icon: 'none'
-                    })
-                    isLogging.value = false
-                    uni.hideLoading()
-                }
-            },
-            fail: function (error) {
-                console.error('获取微信授权失败:', error)
-                uni.showToast({
-                    title: '获取微信授权失败',
-                    icon: 'none'
-                })
-                isLogging.value = false
-                uni.hideLoading()
-            }
-        });
-
-    } catch (e) {
-        console.error('登录过程出错:', e)
-        uni.showToast({
-            title: '登录失败',
-            icon: 'none'
-        })
-        isLogging.value = false
-        uni.hideLoading()
-    }
-}
-const handleImageError = (e) => {
-    console.error('图片加载失败:', e)
-}
-</script>
-
-<style scoped>
-.login-popup {
-    position: fixed;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    z-index: 9999;
-    visibility: hidden;
-}
-
-.login-popup.show {
-    visibility: visible;
-}
-
-.login-popup.show .popup-content {
-    transform: translateY(0);
-}
-
-.mask {
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-    background: rgba(0, 0, 0, 0.6);
-}
-
-.popup-content {
-    position: absolute;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background: #fff;
-    border-radius: 12rpx 12rpx 0 0;
-    padding: 40rpx 30rpx;
-    transform: translateY(100%);
-    transition: transform 0.3s ease-out;
-}
-
-.popup-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 40rpx;
-}
-
-.title {
-    font-size: 36rpx;
-    font-weight: bold;
-    color: #333;
-}
-
-.close-btn {
-    font-size: 48rpx;
-    color: #999;
-    padding: 20rpx;
-    margin: -20rpx;
-}
-
-/* 微信登录按钮 */
-.wechat-btn {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    width: 100%;
-    height: 88rpx;
-    background: #40ac6d;
-    color: #fff;
-    border-radius: 44rpx;
-    font-size: 32rpx;
-    border: none;
-}
-
-.wechat-icon {
-    width: 48rpx;
-    height: 48rpx;
-    margin-right: 16rpx;
-}
-
-/* 分割线 */
-.divider {
-    position: relative;
-    text-align: center;
-    margin: 40rpx 0;
-}
-
-.divider::before,
-.divider::after {
-    content: '';
-    position: absolute;
-    top: 50%;
-    width: calc(50% - 40rpx);
-    height: 1px;
-    background: #eee;
-}
-
-.divider::before {
-    left: 0;
-}
-
-.divider::after {
-    right: 0;
-}
-
-.divider-text {
-    display: inline-block;
-    padding: 0 20rpx;
-    color: #999;
-    font-size: 28rpx;
-    background: #fff;
-    position: relative;
-    z-index: 1;
-}
-
-/* 账号密码登录 */
-.account-login {
-    margin-bottom: 30rpx;
-}
-
-.input-item {
-    position: relative;
-    margin-bottom: 20rpx;
-}
-
-.input-item input {
-    width: 100%;
-    height: 88rpx;
-    background: #f5f5f5;
-    border-radius: 44rpx;
-    padding: 0 40rpx;
-    font-size: 28rpx;
-    box-sizing: border-box;
-}
-
-.eye-icon {
-    position: absolute;
-    right: 20rpx;
-    /* 调整位置 */
-    top: 50%;
-    transform: translateY(-50%);
-    padding: 20rpx;
-    /* 增加点击区域 */
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    z-index: 1000;
-}
-
-.eye-image {
-    width: 40rpx;
-    height: 40rpx;
-    display: block;
-    pointer-events: none;
-
-}
-
-.placeholder {
-    color: #999;
-}
-
-.account-btn {
-    width: 100%;
-    height: 88rpx;
-    line-height: 88rpx;
-    background: #666666;
-    color: #fff;
-    border-radius: 44rpx;
-    font-size: 32rpx;
-    border: none;
-    margin-top: 30rpx;
-    transition: all 0.3s ease;
-}
-
-.account-btn.disabled {
-    background: #cccccc !important;
-    color: #999999 !important;
-    opacity: 0.6;
-    cursor: not-allowed;
-}
-
-/* 用户协议 */
-.agreement {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    margin-top: 30rpx;
-}
-
-.agreement-text {
-    font-size: 24rpx;
-    color: #999;
-    margin-left: 8rpx;
-}
-
-.link {
-    color: #40ac6d;
-}
-
-/* 按钮点击效果 */
-.wechat-btn:active,
-.account-btn:active {
-    opacity: 0.8;
-}
+<template>
+
+    <view class="login-popup" :class="{ 'show': loginPopupVisible }">
+        <view class="mask" @tap="handleClose"></view>
+        <view class="popup-content">
+            <view class="popup-header">
+                <text class="title">登录</text>
+                <text class="close-btn" @tap="handleClose">×</text>
+            </view>
+
+            <!-- 微信登录按钮 -->
+            <!-- <button class="wechat-btn" @tap="handleWechatLogin">
+                <image src="/static/icon/wechat.png" mode="aspectFit" class="wechat-icon"></image>
+                微信一键登录
+            </button> -->
+
+            <!-- 分割线 -->
+            <!-- <view class="divider">
+                <text class="divider-text">或</text>
+            </view> -->
+
+            <!-- 账号密码登录 -->
+            <view class="account-login">
+                <view class="input-item">
+                    <input type="text" v-model="form.username" placeholder="用户名" placeholder-class="placeholder"
+                        />
+                </view>
+                <view class="input-item">
+                    <input :password="!showPassword" type="text" v-model="form.password" placeholder="密码"
+                        placeholder-class="placeholder" />
+
+                    <view class="eye-icon" @tap.stop="showPassword = !showPassword">
+                        <image :src="showPassword ? '/static/icon/eye-open.png' : '/static/icon/eye-close.png'"
+                            mode="aspectFit" class="eye-image"></image>
+                    </view>
+                </view>
+                <button
+                    class="account-btn"
+                    :class="{ 'disabled': isLogging }"
+                    :disabled="isLogging"
+                    @tap="handleAccountLogin"
+                >
+                    {{ isLogging ? '登录中...' : '登录' }}
+                </button>
+            </view>
+
+            <!-- 用户协议 -->
+            <view class="agreement">
+                <checkbox :checked="agreed" @tap="handleAgreementConfirm" color="#40ac6d" />
+                <text class="agreement-text">
+                    我已阅读并同意
+                    <text class="link" @tap="openAgreement('user')">《用户协议》</text>
+                    与
+                    <text class="link" @tap="openAgreement('privacy')">《隐私协议》</text>
+                </text>
+            </view>
+        </view>
+    </view>
+
+    <agreement-popup v-model:visible="showAgreement" :type="agreementType" />
+</template>
+
+<script setup>
+import AgreementPopup from '../agreement/AgreementPopup.vue'
+
+import { ref } from 'vue'
+import { useUserStore } from '@/store/modules/user'
+import { storeToRefs } from 'pinia'
+import { userApi } from '@/api/user'
+
+const userStore = useUserStore()
+const { loginPopupVisible } = storeToRefs(userStore)
+
+const loginType = ref('wechat')
+const form = ref({
+    username: '',
+    password: ''
+})
+const showPassword = ref(false)
+const agreed = ref(false)
+const showAgreement = ref(false)
+const agreementType = ref('user')
+
+// 防重复点击状态
+const isLogging = ref(false)
+
+// 点击协议链接
+const openAgreement = (type) => {
+    agreementType.value = type
+    showAgreement.value = true
+}
+
+// 确认阅读协议
+const handleAgreementConfirm = () => {
+    agreed.value = true
+}
+const handleClose = () => {
+    userStore.hideLoginPopup()
+    form.value.username = ''
+    form.value.password = ''
+    agreed.value = false
+    isLogging.value = false // 重置登录状态
+    uni.hideLoading() // 确保隐藏 loading
+}
+// 微信登录
+const handleWechatLogin = async () => {
+    if (isLogging.value) {
+        console.log('正在登录中,请勿重复点击')
+        return
+    }
+
+    if (!agreed.value) {
+        uni.showToast({
+            title: '请先同意用户协议和隐私协议',
+            icon: 'none'
+        })
+        return
+    }
+
+    try {
+        isLogging.value = true
+
+        // 显示获取微信授权的提示
+        uni.showLoading({
+            title: '获取微信授权...',
+            mask: true
+        })
+
+        const loginRes = await uni.login()
+
+        // 切换到登录中的 loading
+        uni.showLoading({
+            title: '微信登录中...',
+            mask: true
+        })
+
+        const res = await userApi.wechatLogin({
+            code: loginRes.code
+        }, () => {
+            // 请求完成回调,无论成功失败都会执行
+            isLogging.value = false
+            uni.hideLoading() // 隐藏 loading
+        })
+
+        console.log("登录成功", res.data)
+        userStore.setUserInfo(res.data)
+        uni.$emit('login', res.data)
+        handleClose()
+
+    } catch (e) {
+        console.error('登录失败:', e)
+        uni.showToast({
+            title: '登录失败',
+            icon: 'none'
+        })
+        // 确保隐藏 loading 和重置状态
+        isLogging.value = false
+        uni.hideLoading()
+    }
+}
+
+// 账号密码登录
+const handleAccountLogin = async () => {
+    if (isLogging.value) {
+        console.log('正在登录中,请勿重复点击')
+        return
+    }
+
+    if (!agreed.value) {
+        uni.showToast({
+            title: '请先同意用户协议和隐私协议',
+            icon: 'none'
+        })
+        return
+    }
+    if (!form.value.username || !form.value.password) {
+        uni.showToast({
+            title: '请输入用户名和密码',
+            icon: 'none'
+        })
+        return
+    }
+
+    try {
+        isLogging.value = true
+
+        // 显示获取微信授权的提示
+        uni.showLoading({
+            title: '获取微信授权...',
+            mask: true
+        })
+
+        uni.login({
+            provider: 'weixin',
+            success: async function (loginRes) {
+                try {
+                    console.log("wxcode", loginRes.code);
+
+                    // 切换到登录中的 loading
+                    uni.showLoading({
+                        title: '登录中...',
+                        mask: true
+                    })
+
+                    try {
+                        const res = await userApi.accountLogin({
+                            yhm: form.value.username,
+                            mm: form.value.password,
+                            wdConfirmationCaptchaService: "0",
+                            wechatCode: loginRes.code
+                        })
+
+                        uni.hideLoading()
+                        console.log("account登录成功", res.data)
+                        uni.$emit('login', res.data)
+                        userStore.setUserInfo(res.data)
+                        
+                        handleClose()
+
+                    } catch (error) {
+                        console.error('登录失败:', error)
+                        uni.showToast({
+                            title: '登录失败',
+                            icon: 'none'
+                        })
+                    } finally {
+                        // 无论成功失败,都重置状态
+                        isLogging.value = false
+                        uni.hideLoading()
+                    }
+                } catch (outerError) {
+                    console.error('登录过程出错:', outerError)
+                    uni.showToast({
+                        title: '登录失败',
+                        icon: 'none'
+                    })
+                    isLogging.value = false
+                    uni.hideLoading()
+                }
+            },
+            fail: function (error) {
+                console.error('获取微信授权失败:', error)
+                uni.showToast({
+                    title: '获取微信授权失败',
+                    icon: 'none'
+                })
+                isLogging.value = false
+                uni.hideLoading()
+            }
+        });
+
+    } catch (e) {
+        console.error('登录过程出错:', e)
+        uni.showToast({
+            title: '登录失败',
+            icon: 'none'
+        })
+        isLogging.value = false
+        uni.hideLoading()
+    }
+}
+const handleImageError = (e) => {
+    console.error('图片加载失败:', e)
+}
+</script>
+
+<style scoped>
+.login-popup {
+    position: fixed;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    z-index: 9999;
+    visibility: hidden;
+}
+
+.login-popup.show {
+    visibility: visible;
+}
+
+.login-popup.show .popup-content {
+    transform: translateY(0);
+}
+
+.mask {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    background: rgba(0, 0, 0, 0.6);
+}
+
+.popup-content {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: #fff;
+    border-radius: 12rpx 12rpx 0 0;
+    padding: 40rpx 30rpx;
+    transform: translateY(100%);
+    transition: transform 0.3s ease-out;
+}
+
+.popup-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 40rpx;
+}
+
+.title {
+    font-size: 36rpx;
+    font-weight: bold;
+    color: #333;
+}
+
+.close-btn {
+    font-size: 48rpx;
+    color: #999;
+    padding: 20rpx;
+    margin: -20rpx;
+}
+
+/* 微信登录按钮 */
+.wechat-btn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    height: 88rpx;
+    background: #40ac6d;
+    color: #fff;
+    border-radius: 44rpx;
+    font-size: 32rpx;
+    border: none;
+}
+
+.wechat-icon {
+    width: 48rpx;
+    height: 48rpx;
+    margin-right: 16rpx;
+}
+
+/* 分割线 */
+.divider {
+    position: relative;
+    text-align: center;
+    margin: 40rpx 0;
+}
+
+.divider::before,
+.divider::after {
+    content: '';
+    position: absolute;
+    top: 50%;
+    width: calc(50% - 40rpx);
+    height: 1px;
+    background: #eee;
+}
+
+.divider::before {
+    left: 0;
+}
+
+.divider::after {
+    right: 0;
+}
+
+.divider-text {
+    display: inline-block;
+    padding: 0 20rpx;
+    color: #999;
+    font-size: 28rpx;
+    background: #fff;
+    position: relative;
+    z-index: 1;
+}
+
+/* 账号密码登录 */
+.account-login {
+    margin-bottom: 30rpx;
+}
+
+.input-item {
+    position: relative;
+    margin-bottom: 20rpx;
+}
+
+.input-item input {
+    width: 100%;
+    height: 88rpx;
+    background: #f5f5f5;
+    border-radius: 44rpx;
+    padding: 0 40rpx;
+    font-size: 28rpx;
+    box-sizing: border-box;
+}
+
+.eye-icon {
+    position: absolute;
+    right: 20rpx;
+    /* 调整位置 */
+    top: 50%;
+    transform: translateY(-50%);
+    padding: 20rpx;
+    /* 增加点击区域 */
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    z-index: 1000;
+}
+
+.eye-image {
+    width: 40rpx;
+    height: 40rpx;
+    display: block;
+    pointer-events: none;
+
+}
+
+.placeholder {
+    color: #999;
+}
+
+.account-btn {
+    width: 100%;
+    height: 88rpx;
+    line-height: 88rpx;
+    background: #666666;
+    color: #fff;
+    border-radius: 44rpx;
+    font-size: 32rpx;
+    border: none;
+    margin-top: 30rpx;
+    transition: all 0.3s ease;
+}
+
+.account-btn.disabled {
+    background: #cccccc !important;
+    color: #999999 !important;
+    opacity: 0.6;
+    cursor: not-allowed;
+}
+
+/* 用户协议 */
+.agreement {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-top: 30rpx;
+}
+
+.agreement-text {
+    font-size: 24rpx;
+    color: #999;
+    margin-left: 8rpx;
+}
+
+.link {
+    color: #40ac6d;
+}
+
+/* 按钮点击效果 */
+.wechat-btn:active,
+.account-btn:active {
+    opacity: 0.8;
+}
 </style>

+ 0 - 133
components/tabbar/index.vue

@@ -1,133 +0,0 @@
-<template>
-  <view class="custom-tabbar" :class="{ 'safe-area-inset-bottom': true }">
-    <view 
-      v-for="(item, index) in tabList" 
-      :key="index" 
-      class="tabbar-item" 
-      :class="{ active: currentPath === item.pagePath }"
-      @click="switchTab(item, index)"
-    >
-      <view class="icon-box">
-        <Icon 
-          v-if="item.iconName" 
-          :name="item.iconName" 
-          :size="48" 
-          :color="currentPath === item.pagePath ? activeColor : inactiveColor"
-        />
-      </view>
-      <text 
-        class="text" 
-        :style="{ color: currentPath === item.pagePath ? activeColor : inactiveColor }"
-      >{{ item.text }}</text>
-    </view>
-  </view>
-</template>
-
-<script setup>
-import { ref, onMounted, onUnmounted } from 'vue';
-import Icon from '@/components/icon/index.vue';
-
-// 固定的导航配置
-const tabList = [
-  {
-    iconName: 'icon-shouye',
-    text: '首页',
-    pagePath: 'pages/index/index'
-  },
-  {
-    iconName: 'icon-zuanshi',
-    text: '产品',
-    pagePath: 'pages/product/index'
-  },
-  {
-    iconName: 'icon-zhifeiji',
-    text: '活动',
-    pagePath: 'pages/activity/index'
-  },
-  {
-    iconName: 'icon-qizhi',
-    text: '基(营)地',
-    pagePath: 'pages/base/index'
-  },
-  {
-    iconName: 'icon-renyuan',
-    text: '我的',
-    pagePath: 'pages/my/index'
-  }
-];
-
-// 颜色配置
-const activeColor = '#1d2089';
-const inactiveColor = '#999';
-
-// 当前路径
-const currentPath = ref('');
-
-// 更新当前路径
-const updateCurrentPath = () => {
-  const pages = getCurrentPages();
-  const currentPage = pages[pages.length - 1];
-  currentPath.value = currentPage ? currentPage.route : '';
-};
-
-// 切换页面
-const switchTab = (item) => {
-  if (currentPath.value === item.pagePath) return;
-  
-  uni.switchTab({
-    url: `/${item.pagePath}`
-  });
-};
-
-// 监听路由变化
-uni.$on('onShow', () => {
-  updateCurrentPath();
-});
-
-// 组件挂载时更新路径
-onMounted(() => {
-  updateCurrentPath();
-});
-
-// 组件销毁时移除监听
-onUnmounted(() => {
-  uni.$off('onShow');
-});
-</script>
-
-<style lang="scss" scoped>
-.custom-tabbar {
-  position: fixed;
-  left: 0;
-  bottom: 0;
-  width: 100%;
-  height: 120rpx;
-  align-items: center;
-  background-color: #fff;
-  display: flex;
-  border-top: 1rpx solid #dcdcdc;
-  z-index: 999;
-  
-  &.safe-area-inset-bottom {
-    padding-bottom: constant(safe-area-inset-bottom);
-    padding-bottom: env(safe-area-inset-bottom);
-  }
-  
-  .tabbar-item {
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    
-    .icon-box {
-      margin-bottom: 6rpx;
-    }
-    
-    .text {
-      font-size: 24rpx;
-      line-height: 1;
-    }
-  }
-}
-</style> 

+ 143 - 143
composables/useFormValidation.js

@@ -1,143 +1,143 @@
-import { ref, provide } from 'vue'
-
-export function useFormValidation(fieldConfigs = {}) {
-  const errors = ref({})
-
-  // 字段配置管理
-  const configs = ref(fieldConfigs)
-
-  // 获取字段配置
-  const getFieldConfig = (fieldName) => {
-    return configs.value[fieldName] || {}
-  }
-
-  // 设置字段配置
-  const setFieldConfig = (fieldName, config) => {
-    configs.value[fieldName] = config
-  }
-
-  // 批量设置字段配置
-  const setFieldConfigs = (newConfigs) => {
-    configs.value = { ...configs.value, ...newConfigs }
-  }
-
-  // 提供给子组件使用
-  provide('errors', errors)
-  provide('getFieldConfig', getFieldConfig)
-  
-  // 校验单个字段
-  const validateField = (fieldName, value, rules) => {
-    if (!rules || !Array.isArray(rules)) {
-      return true
-    }
-    
-    const fieldErrors = []
-    
-    for (const rule of rules) {
-      // 必填校验
-      if (rule.required && (!value || value === '')) {
-        fieldErrors.push(rule.message || '此字段为必填项')
-        break
-      }
-
-      // 如果值为空且不是必填,跳过其他校验
-      if (!value || value === '') {
-        continue
-      }
-
-      // 最小长度校验
-      if (rule.min && value.length < rule.min) {
-        fieldErrors.push(rule.message || `最少输入${rule.min}个字符`)
-        break
-      }
-
-      // 最大长度校验
-      if (rule.max && value.length > rule.max) {
-        fieldErrors.push(rule.message || `最多输入${rule.max}个字符`)
-        break
-      }
-
-      // 正则校验
-      if (rule.pattern && !rule.pattern.test(value)) {
-        fieldErrors.push(rule.message || '格式不正确')
-        break
-      }
-      
-      // 自定义校验函数
-      if (rule.validator && typeof rule.validator === 'function') {
-        const result = rule.validator(value)
-        if (result !== true) {
-          fieldErrors.push(result || rule.message || '校验失败')
-          break
-        }
-      }
-    }
-
-    // 更新错误信息
-    if (fieldErrors.length > 0) {
-      errors.value[fieldName] = fieldErrors
-      return false
-    } else {
-      delete errors.value[fieldName]
-      return true
-    }
-  }
-  
-  // 提供给子组件使用
-  provide('validateField', validateField)
-  
-  // 获取嵌套字段值的辅助函数
-  const getNestedFieldValue = (formData, fieldPath) => {
-    const pathArray = fieldPath.split('.')
-    let value = formData
-    for (const key of pathArray) {
-      value = value?.[key]
-    }
-    return value
-  }
-
-  // 校验整个表单
-  const validateForm = (formData, formRules) => {
-    console.log('validateForm开始:', { formData, formRules })
-    let isValid = true
-
-    for (const fieldName in formRules) {
-      // 支持嵌套字段路径(如 "xcd_0.qkms")
-      const fieldValue = getNestedFieldValue(formData, fieldName)
-      const fieldRules = formRules[fieldName].rules || formRules[fieldName]
-
-      console.log(`校验字段 ${fieldName}:`, { fieldValue, fieldRules })
-      const fieldValid = validateField(fieldName, fieldValue, fieldRules)
-      console.log(`字段 ${fieldName} 校验结果:`, fieldValid)
-
-      if (!fieldValid) {
-        isValid = false
-      }
-    }
-
-    console.log('validateForm结束:', isValid)
-    return isValid
-  }
-  
-  // 清除所有错误
-  const clearErrors = () => {
-    errors.value = {}
-  }
-
-  // 清除指定字段错误
-  const clearFieldError = (fieldName) => {
-    delete errors.value[fieldName]
-  }
-
-  return {
-    errors,
-    validateField,
-    validateForm,
-    clearErrors,
-    clearFieldError,
-    getFieldConfig,
-    setFieldConfig,
-    setFieldConfigs,
-    configs
-  }
-}
+import { ref, provide } from 'vue'
+
+export function useFormValidation(fieldConfigs = {}) {
+  const errors = ref({})
+
+  // 字段配置管理
+  const configs = ref(fieldConfigs)
+
+  // 获取字段配置
+  const getFieldConfig = (fieldName) => {
+    return configs.value[fieldName] || {}
+  }
+
+  // 设置字段配置
+  const setFieldConfig = (fieldName, config) => {
+    configs.value[fieldName] = config
+  }
+
+  // 批量设置字段配置
+  const setFieldConfigs = (newConfigs) => {
+    configs.value = { ...configs.value, ...newConfigs }
+  }
+
+  // 提供给子组件使用
+  provide('errors', errors)
+  provide('getFieldConfig', getFieldConfig)
+  
+  // 校验单个字段
+  const validateField = (fieldName, value, rules) => {
+    if (!rules || !Array.isArray(rules)) {
+      return true
+    }
+    
+    const fieldErrors = []
+    
+    for (const rule of rules) {
+      // 必填校验
+      if (rule.required && (!value || value === '')) {
+        fieldErrors.push(rule.message || '此字段为必填项')
+        break
+      }
+
+      // 如果值为空且不是必填,跳过其他校验
+      if (!value || value === '') {
+        continue
+      }
+
+      // 最小长度校验
+      if (rule.min && value.length < rule.min) {
+        fieldErrors.push(rule.message || `最少输入${rule.min}个字符`)
+        break
+      }
+
+      // 最大长度校验
+      if (rule.max && value.length > rule.max) {
+        fieldErrors.push(rule.message || `最多输入${rule.max}个字符`)
+        break
+      }
+
+      // 正则校验
+      if (rule.pattern && !rule.pattern.test(value)) {
+        fieldErrors.push(rule.message || '格式不正确')
+        break
+      }
+      
+      // 自定义校验函数
+      if (rule.validator && typeof rule.validator === 'function') {
+        const result = rule.validator(value)
+        if (result !== true) {
+          fieldErrors.push(result || rule.message || '校验失败')
+          break
+        }
+      }
+    }
+
+    // 更新错误信息
+    if (fieldErrors.length > 0) {
+      errors.value[fieldName] = fieldErrors
+      return false
+    } else {
+      delete errors.value[fieldName]
+      return true
+    }
+  }
+  
+  // 提供给子组件使用
+  provide('validateField', validateField)
+  
+  // 获取嵌套字段值的辅助函数
+  const getNestedFieldValue = (formData, fieldPath) => {
+    const pathArray = fieldPath.split('.')
+    let value = formData
+    for (const key of pathArray) {
+      value = value?.[key]
+    }
+    return value
+  }
+
+  // 校验整个表单
+  const validateForm = (formData, formRules) => {
+    console.log('validateForm开始:', { formData, formRules })
+    let isValid = true
+
+    for (const fieldName in formRules) {
+      // 支持嵌套字段路径(如 "xcd_0.qkms")
+      const fieldValue = getNestedFieldValue(formData, fieldName)
+      const fieldRules = formRules[fieldName].rules || formRules[fieldName]
+
+      console.log(`校验字段 ${fieldName}:`, { fieldValue, fieldRules })
+      const fieldValid = validateField(fieldName, fieldValue, fieldRules)
+      console.log(`字段 ${fieldName} 校验结果:`, fieldValid)
+
+      if (!fieldValid) {
+        isValid = false
+      }
+    }
+
+    console.log('validateForm结束:', isValid)
+    return isValid
+  }
+  
+  // 清除所有错误
+  const clearErrors = () => {
+    errors.value = {}
+  }
+
+  // 清除指定字段错误
+  const clearFieldError = (fieldName) => {
+    delete errors.value[fieldName]
+  }
+
+  return {
+    errors,
+    validateField,
+    validateForm,
+    clearErrors,
+    clearFieldError,
+    getFieldConfig,
+    setFieldConfig,
+    setFieldConfigs,
+    configs
+  }
+}

+ 3 - 2
config/env.js

@@ -1,3 +1,4 @@
-export default {
-  baseUrl: 'https://yx.newfeifan.cn'
+export default {
+  baseUrl: 'https://m.hfdcschool.com',
+  // baseUrl: 'https://yx.newfeifan.cn',
 }

+ 21 - 20
index.html

@@ -1,20 +1,21 @@
-<!DOCTYPE html>
-<html lang="zh-CN">
-  <head>
-    <meta charset="UTF-8" />
-    <script>
-      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
-        CSS.supports('top: constant(a)'))
-      document.write(
-        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
-        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
-    </script>
-    <title></title>
-    <!--preload-links-->
-    <!--app-context-->
-  </head>
-  <body>
-    <div id="app"><!--app-html--></div>
-    <script type="module" src="/main.js"></script>
-  </body>
-</html>
+<!DOCTYPE html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="UTF-8" />
+
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 13 - 13
main.js

@@ -1,13 +1,13 @@
-import App from './App'
-import { createSSRApp } from 'vue'
-import pinia from './store/index.js'
-import uviewPlus from 'uview-plus'
-
-export function createApp() {
-  const app = createSSRApp(App)
-  app.use(pinia)
-  app.use(uviewPlus)
-  return {
-    app
-  }
-}
+import App from './App'
+import { createSSRApp } from 'vue'
+import pinia from './store/index.js'
+import uviewPlus from 'uview-plus'
+
+export function createApp() {
+  const app = createSSRApp(App)
+  app.use(pinia)
+  app.use(uviewPlus)
+  return {
+    app
+  }
+}

+ 8 - 1
manifest.json

@@ -52,7 +52,14 @@
     "mp-weixin" : {
         "appid" : "wxddbefe871c9ac785",
         "setting" : {
-            "urlCheck" : false
+            "urlCheck" : false,
+            "minified" : true
+        },
+        "plugins" : {
+            "wmpf-voip" : {
+                "version" : "latest",
+                "provider" : "wxf830863afde621eb"
+            }
         },
         "mergeVirtualHostAttributes" : true,
         "usingComponents" : true

+ 2 - 2
node_modules/.bin/lessc

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../less/bin/lessc" "$@"

+ 2 - 2
node_modules/.modules.yaml

@@ -114,7 +114,7 @@ layoutVersion: 5
 nodeLinker: isolated
 packageManager: pnpm@9.1.2
 pendingBuilds: []
-prunedAt: Tue, 12 Aug 2025 02:25:04 GMT
+prunedAt: Sun, 28 Sep 2025 09:03:01 GMT
 publicHoistPattern:
   - '*eslint*'
   - '*prettier*'
@@ -122,5 +122,5 @@ registries:
   default: https://registry.npmmirror.com/
 skipped: []
 storeDir: D:\.pnpm-store\v3
-virtualStoreDir: D:\FF-Project\digital-campus-mini-program\node_modules\.pnpm
+virtualStoreDir: D:\FF-Project\zhihuixiaoyuan\digital-campus-mini-program\node_modules\.pnpm
 virtualStoreDirMaxLength: 120

+ 2 - 2
node_modules/.pnpm/@vue+compiler-core@3.5.18/node_modules/@vue/compiler-core/node_modules/.bin/parser

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../../../../../../@babel+parser@7.28.0/node_modules/@babel/parser/bin/babel-parser.js" "$@"

+ 2 - 2
node_modules/.pnpm/@vue+compiler-sfc@3.5.18/node_modules/@vue/compiler-sfc/node_modules/.bin/parser

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../../../../../../@babel+parser@7.28.0/node_modules/@babel/parser/bin/babel-parser.js" "$@"

+ 2 - 2
node_modules/.pnpm/less-loader@12.3.0_less@4.4.0/node_modules/less-loader/node_modules/.bin/lessc

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/less@4.4.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../../../../../less@4.4.0/node_modules/less/bin/lessc" "$@"

+ 4 - 4
node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/errno

@@ -6,12 +6,12 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../../../errno/cli.js" "$@"
+  exec "$basedir/node"  "$basedir/../../../../../errno@0.1.8/node_modules/errno/cli.js" "$@"
 else
-  exec node  "$basedir/../../../errno/cli.js" "$@"
+  exec node  "$basedir/../../../../../errno@0.1.8/node_modules/errno/cli.js" "$@"
 fi

+ 4 - 4
node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/image-size

@@ -6,12 +6,12 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../../../image-size/bin/image-size.js" "$@"
+  exec "$basedir/node"  "$basedir/../../../../../image-size@0.5.5/node_modules/image-size/bin/image-size.js" "$@"
 else
-  exec node  "$basedir/../../../image-size/bin/image-size.js" "$@"
+  exec node  "$basedir/../../../../../image-size@0.5.5/node_modules/image-size/bin/image-size.js" "$@"
 fi

+ 4 - 4
node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/mime

@@ -6,12 +6,12 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../../../mime/cli.js" "$@"
+  exec "$basedir/node"  "$basedir/../../../../../mime@1.6.0/node_modules/mime/cli.js" "$@"
 else
-  exec node  "$basedir/../../../mime/cli.js" "$@"
+  exec node  "$basedir/../../../../../mime@1.6.0/node_modules/mime/cli.js" "$@"
 fi

+ 4 - 4
node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules/.bin/needle

@@ -6,12 +6,12 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../../../needle/bin/needle" "$@"
+  exec "$basedir/node"  "$basedir/../../../../../needle@3.3.1/node_modules/needle/bin/needle" "$@"
 else
-  exec node  "$basedir/../../../needle/bin/needle" "$@"
+  exec node  "$basedir/../../../../../needle@3.3.1/node_modules/needle/bin/needle" "$@"
 fi

+ 5 - 5
node_modules/.pnpm/lock.yaml

@@ -24,8 +24,8 @@ importers:
         specifier: ^11.2.10
         version: 11.2.10
       uview-plus:
-        specifier: ^3.4.65
-        version: 3.4.65
+        specifier: ^3.5.52
+        version: 3.5.52
       vue:
         specifier: ^3.5.18
         version: 3.5.18
@@ -270,8 +270,8 @@ packages:
   tslib@2.8.1:
     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
 
-  uview-plus@3.4.65:
-    resolution: {integrity: sha512-SXk3CgvO+v6XNTPe8g5RrEOfebgQRHHnrsn55wTz5y1s1VE2tORvqlVjAfzvfv0udSgioeq5a4227LHcDSN3QQ==}
+  uview-plus@3.5.52:
+    resolution: {integrity: sha512-cyZv0Pz+rZ4vohbtZXAlnvCHwzkLudrvFXZVPr+NlUHuTJwAjZ6vSb6jmcZeozmz4HOyGfSf+USjdswdUG9OIQ==}
     engines: {HBuilderX: ^3.1.0, uni-app: ^4.66, uni-app-x: ''}
 
   vue@3.5.18:
@@ -517,7 +517,7 @@ snapshots:
 
   tslib@2.8.1: {}
 
-  uview-plus@3.4.65:
+  uview-plus@3.5.52:
     dependencies:
       clipboard: 2.0.11
       dayjs: 1.11.13

+ 2 - 2
node_modules/.pnpm/make-dir@2.1.0/node_modules/make-dir/node_modules/.bin/semver

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../../../../../semver@5.7.2/node_modules/semver/bin/semver" "$@"

+ 2 - 2
node_modules/.pnpm/node_modules/.bin/errno

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules/errno/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/errno@0.1.8/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../errno/cli.js" "$@"

+ 2 - 2
node_modules/.pnpm/node_modules/.bin/image-size

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules/image-size/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/image-size@0.5.5/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../image-size/bin/image-size.js" "$@"

+ 2 - 2
node_modules/.pnpm/node_modules/.bin/mime

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/mime@1.6.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../mime/cli.js" "$@"

+ 2 - 2
node_modules/.pnpm/node_modules/.bin/nanoid

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../nanoid/bin/nanoid.cjs" "$@"

+ 2 - 2
node_modules/.pnpm/node_modules/.bin/needle

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules/needle/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/needle@3.3.1/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../needle/bin/needle" "$@"

+ 2 - 2
node_modules/.pnpm/node_modules/.bin/parser

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../@babel/parser/bin/babel-parser.js" "$@"

+ 2 - 2
node_modules/.pnpm/node_modules/.bin/semver

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules/semver/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/semver@5.7.2/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../semver/bin/semver" "$@"

+ 2 - 2
node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/node_modules/.bin/nanoid

@@ -6,9 +6,9 @@ case `uname` in
 esac
 
 if [ -z "$NODE_PATH" ]; then
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules"
 else
-  export NODE_PATH="/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
+  export NODE_PATH="/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/bin/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/nanoid@3.3.11/node_modules:/mnt/d/FF-Project/zhihuixiaoyuan/digital-campus-mini-program/node_modules/.pnpm/node_modules:$NODE_PATH"
 fi
 if [ -x "$basedir/node" ]; then
   exec "$basedir/node"  "$basedir/../../../../../nanoid@3.3.11/node_modules/nanoid/bin/nanoid.cjs" "$@"

+ 0 - 21
node_modules/.pnpm/uview-plus@3.4.65/node_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 - 74
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/README.md

@@ -1,74 +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(即将发布)的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水。uview-plus是基于uView2.x移植的支持vue3的版本,感谢uView。
-
-## 可视化设计
-
-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>
-<img src="https://uview-plus.jiangruyi.com/common/h5_qrcode.png" width="220" height="220" >
-
-## 链接
-
-- [官方文档](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)
-
-## 交流反馈
-
-欢迎加入我们的QQ群交流反馈:[点此跳转](https://uview-plus.jiangruyi.com/components/addQQGroup.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 - 966
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/changelog.md

@@ -1,966 +0,0 @@
-## 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 - 85
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--form/u--form.vue

@@ -1,85 +0,0 @@
-<template>
-	<uvForm
-		ref="uForm"
-		:model="model"
-		:rules="rules"
-		:errorType="errorType"
-		:borderBottom="borderBottom"
-		:labelPosition="labelPosition"
-		:labelWidth="labelWidth"
-		:labelAlign="labelAlign"
-		:labelStyle="labelStyle"
-		:customStyle="customStyle"
-	>
-		<slot />
-	</uvForm>
-</template>
-
-<script>
-	/**
-	 * 此组件存在的理由是,在nvue下,u-form被uni-app官方占用了,u-form在nvue中相当于form组件
-	 * 所以在nvue下,取名为u--form,内部其实还是u-form.vue,只不过做一层中转
-	 */
-	import uvForm from '../u-form/u-form.vue';
-	import { props } from '../u-form/props.js';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	export default {
-		// #ifdef MP-WEIXIN
-		name: 'u-form',
-		// #endif
-		// #ifndef MP-WEIXIN
-		name: 'u--form',
-		// #endif
-		mixins: [mpMixin, props, mixin],
-		components: {
-			uvForm
-		},
-		created() {
-			this.children = []
-		},
-		methods: {
-			// 手动设置校验的规则,如果规则中有函数的话,微信小程序中会过滤掉,所以只能手动调用设置规则
-			setRules(rules) {
-				this.$refs.uForm.setRules(rules)
-			},
-			/**
-			 * 校验全部数据
-			 * @param {Object} options
-			 * @param {Boolean} options.showErrorMsg -是否显示校验信息,
-			 */
-			validate(options) {
-				/**
-				 * 在微信小程序中,通过this.$parent拿到的父组件是u--form,而不是其内嵌的u-form
-				 * 导致在u-form组件中,拿不到对应的children数组,从而校验无效,所以这里每次调用u-form组件中的
-				 * 对应方法的时候,在小程序中都先将u--form的children赋值给u-form中的children
-				 */
-				// #ifdef MP-WEIXIN
-				this.setMpData()
-				// #endif
-				return this.$refs.uForm.validate(options)
-			},
-			validateField(value, callback) {
-				// #ifdef MP-WEIXIN
-				this.setMpData()
-				// #endif
-				return this.$refs.uForm.validateField(value, callback)
-			},
-			resetFields() {
-				// #ifdef MP-WEIXIN
-				this.setMpData()
-				// #endif
-				return this.$refs.uForm.resetFields()
-			},
-			clearValidate(props) {
-				// #ifdef MP-WEIXIN
-				this.setMpData()
-				// #endif
-				return this.$refs.uForm.clearValidate(props)
-			},
-			setMpData() {
-				this.$refs.uForm.children = this.children
-			}
-		},
-	}
-</script>

+ 0 - 50
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--image/u--image.vue

@@ -1,50 +0,0 @@
-<template>
-	<uvImage 
-		:src="src"
-		:mode="mode"
-		:width="width"
-		:height="height"
-		:shape="shape"
-		:radius="radius"
-		:lazyLoad="lazyLoad"
-		:showMenuByLongpress="showMenuByLongpress"
-		:loadingIcon="loadingIcon"
-		:errorIcon="errorIcon"
-		:showLoading="showLoading"
-		:showError="showError"
-		:fade="fade"
-		:webp="webp"
-		:duration="duration"
-		:bgColor="bgColor"
-		:customStyle="customStyle"
-		@click="$emit('click')"
-		@error="$emit('error')"
-		@load="$emit('load')"
-	>
-		<template v-slot:loading>
-			<slot name="loading"></slot>
-		</template>
-		<template v-slot:error>
-			<slot name="error"></slot>
-		</template>
-	</uvImage>
-</template>
-
-<script>
-	/**
-	 * 此组件存在的理由是,在nvue下,u-image被uni-app官方占用了,u-image在nvue中相当于image组件
-	 * 所以在nvue下,取名为u--image,内部其实还是u-iamge.vue,只不过做一层中转
-	 */
-	import uvImage from '../u-image/u-image.vue';
-	import { props } from '../u-image/props.js';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	export default {
-		name: 'u--image',
-		mixins: [mpMixin, props, mixin],
-		components: {
-			uvImage
-		},
-		emits: ['click', 'error', 'load']
-	}
-</script>

+ 0 - 74
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--input/u--input.vue

@@ -1,74 +0,0 @@
-<template>
-	<uvInput 
-		<!-- #ifdef VUE2 -->
-		:value="value"
-		@input="e => $emit('input', e)"
-		<!-- #endif -->
-		<!-- #ifdef VUE3 -->
-		:modelValue="modelValue"
-		@update:modelValue="e => $emit('update:modelValue', e)"
-		<!-- #endif -->
-		:type="type"
-		:fixed="fixed"
-		:disabled="disabled"
-		:disabledColor="disabledColor"
-		:clearable="clearable"
-		:password="password"
-		:maxlength="maxlength"
-		:placeholder="placeholder"
-		:placeholderClass="placeholderClass"
-		:placeholderStyle="placeholderStyle"
-		:showWordLimit="showWordLimit"
-		:confirmType="confirmType"
-		:confirmHold="confirmHold"
-		:holdKeyboard="holdKeyboard"
-		:focus="focus"
-		:autoBlur="autoBlur"
-		:disableDefaultPadding="disableDefaultPadding"
-		:cursor="cursor"
-		:cursorSpacing="cursorSpacing"
-		:selectionStart="selectionStart"
-		:selectionEnd="selectionEnd"
-		:adjustPosition="adjustPosition"
-		:inputAlign="inputAlign"
-		:fontSize="fontSize"
-		:color="color"
-		:prefixIcon="prefixIcon"
-		:suffixIcon="suffixIcon"
-		:suffixIconStyle="suffixIconStyle"
-		:prefixIconStyle="prefixIconStyle"
-		:border="border"
-		:readonly="readonly"
-		:shape="shape"
-		:customStyle="customStyle"
-		:formatter="formatter"
-		:ignoreCompositionEvent="ignoreCompositionEvent"
-	>
-		<!-- #ifdef MP -->
-		<slot name="prefix"></slot>
-		<slot name="suffix"></slot>
-		<!-- #endif -->
-		<!-- #ifndef MP -->
-		<slot name="prefix" slot="prefix"></slot>
-		<slot name="suffix" slot="suffix"></slot>
-		<!-- #endif -->
-	</uvInput>
-</template>
-
-<script>
-	/**
-	 * 此组件存在的理由是,在nvue下,u-input被uni-app官方占用了,u-input在nvue中相当于input组件
-	 * 所以在nvue下,取名为u--input,内部其实还是u-input.vue,只不过做一层中转
-	 */
-	import uvInput from '../u-input/u-input.vue';
-	import { props } from '../u-input/props.js';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	export default {
-		name: 'u--input',
-		mixins: [mpMixin, props, mixin],
-		components: {
-			uvInput
-		},
-	}
-</script>

+ 0 - 45
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--text/u--text.vue

@@ -1,45 +0,0 @@
-<template>
-    <uvText
-        :type="type"
-        :show="show"
-        :text="text"
-        :prefixIcon="prefixIcon"
-        :suffixIcon="suffixIcon"
-        :mode="mode"
-        :href="href"
-        :format="format"
-        :call="call"
-        :openType="openType"
-        :bold="bold"
-        :block="block"
-        :lines="lines"
-        :color="color"
-		:decoration="decoration"
-        :size="size"
-        :iconStyle="iconStyle"
-        :margin="margin"
-        :lineHeight="lineHeight"
-        :align="align"
-        :wordWrap="wordWrap"
-        :customStyle="customStyle"
-    ></uvText>
-</template>
-
-<script>
-/**
- * 此组件存在的理由是,在nvue下,u-text被uni-app官方占用了,u-text在nvue中相当于input组件
- * 所以在nvue下,取名为u--input,内部其实还是u-text.vue,只不过做一层中转
- * 不使用v-bind="$attrs",而是分开独立写传参,是因为微信小程序不支持此写法
- */
-import uvText from "../u-text/u-text.vue";
-import { props } from "../u-text/props.js";
-import { mpMixin } from '../../libs/mixin/mpMixin.js'
-import { mixin } from '../../libs/mixin/mixin.js'
-export default {
-    name: "u--text",
-    mixins: [mpMixin, mixin, props,],
-    components: {
-        uvText,
-    },
-};
-</script>

+ 0 - 47
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u--textarea/u--textarea.vue

@@ -1,47 +0,0 @@
-<template>
-	<uvTextarea
-		:value="value"
-		:modelValue="modelValue"
-		:placeholder="placeholder"
-		:height="height"
-		:confirmType="confirmType"
-		:disabled="disabled"
-		:count="count"
-		:focus="focus"
-		:autoHeight="autoHeight"
-		:fixed="fixed"
-		:cursorSpacing="cursorSpacing"
-		:cursor="cursor"
-		:showConfirmBar="showConfirmBar"
-		:selectionStart="selectionStart"
-		:selectionEnd="selectionEnd"
-		:adjustPosition="adjustPosition"
-		:disableDefaultPadding="disableDefaultPadding"
-		:holdKeyboard="holdKeyboard"
-		:maxlength="maxlength"
-		:border="border"
-		:customStyle="customStyle"
-		:formatter="formatter"
-		:ignoreCompositionEvent="ignoreCompositionEvent"
-		@input="e => $emit('input', e)"
-		@update:modelValue="e => $emit('update:modelValue', e)"
-	></uvTextarea>
-</template>
-
-<script>
-	/**
-	 * 此组件存在的理由是,在nvue下,u--textarea被uni-app官方占用了,u-textarea在nvue中相当于textarea组件
-	 * 所以在nvue下,取名为u--textarea,内部其实还是u-textarea.vue,只不过做一层中转
-	 */
-	import uvTextarea from '../u-textarea/u-textarea.vue';
-	import { props } from '../u-textarea/props.js';
-	import { mpMixin } from '../../libs/mixin/mpMixin';
-	import { mixin } from '../../libs/mixin/mixin';
-	export default {
-		name: 'u--textarea',
-		mixins: [mpMixin, props, mixin],
-		components: {
-			uvTextarea
-		},
-	}
-</script>

+ 0 - 109
node_modules/.pnpm/uview-plus@3.4.65/node_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 - 26
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-action-sheet/actionSheet.js

@@ -1,26 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-20 16:44:35
- * @FilePath     : /u-view2.0/uview-ui/libs/config/props/actionSheet.js
- */
-export default {
-    // action-sheet组件
-    actionSheet: {
-        show: false,
-        title: '',
-        description: '',
-        actions: [],
-        index: '',
-        cancelText: '',
-        closeOnClickAction: true,
-        safeAreaInsetBottom: true,
-        openType: '',
-        closeOnClickOverlay: true,
-        round: 0,
-        wrapMaxHeight: '600px'
-    }
-}

+ 0 - 62
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-action-sheet/props.js

@@ -1,62 +0,0 @@
-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
-        },
-        // 取消按钮的文字,不为空时显示按钮
-        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 - 282
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue

@@ -1,282 +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"
-				>
-					<u-icon
-					    name="close"
-					    size="17"
-					    color="#c8c9cc"
-					    bold
-					></u-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"
-							>
-								<template v-if="!item.loading">
-									<text
-									    class="u-action-sheet__item-wrap__item__name"
-									    :style="[itemStyle(index)]"
-									>{{ item.name }}</text>
-									<text
-									    v-if="item.subname"
-									    class="u-action-sheet__item-wrap__item__subname"
-									>{{ item.subname }}</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://ijry.github.io/uview-plus/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')
-					}
-				}
-			},
-		}
-	}
-</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 - 28
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-album/album.js

@@ -1,28 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-20 16:47:24
- * @FilePath     : /u-view2.0/uview-ui/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 - 86
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-album/props.js

@@ -1,86 +0,0 @@
-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 - 299
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-album/u-album.vue

@@ -1,299 +0,0 @@
-<template>
-    <view class="u-album">
-        <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
-// 由于weex为阿里的KPI业绩考核的产物,所以不支持百分比单位,这里需要通过dom查询组件的宽度
-const dom = uni.requireNativePlugin('dom')
-// #endif
-
-/**
- * Album 相册
- * @description 本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。减少重复的模板代码
- * @tutorial https://ijry.github.io/uview-plus/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: {
-        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
-            }
-        },
-        // 将数组划分为二维数组
-        showUrls() {
-            if (this.autoWrap) {
-                return [ this.urls.slice(0, this.maxCount) ];
-            } else {
-                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
-            }
-        },
-        imageWidth() {
-            return addUnit(
-                this.urls.length === 1 ? this.singleWidth : this.multipleSize, this.unit
-            )
-        },
-        imageHeight() {
-            return addUnit(
-                this.urls.length === 1 ? this.singleHeight : this.multipleSize, this.unit
-            )
-        },
-        // 此变量无实际用途,仅仅是为了利用computed特性,让其在urls长度等变化时,重新计算图片的宽度
-        // 因为用户在某些特殊的情况下,需要让文字与相册的宽度相等,所以这里事件的形式对外发送
-        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,
-        // 预览图片
-        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)
-                })
-            }
-        },
-        // 获取图片的路径
-        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
-            this.$uGetRect('.u-album__row').then((size) => {
-                this.singleWidth = size.width * this.singlePercent
-            })
-            // #endif
-
-            // #ifdef APP-NVUE
-            // 这里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 - 22
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-alert/alert.js

@@ -1,22 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-20 16:48:53
- * @FilePath     : /u-view2.0/uview-ui/libs/config/props/alert.js
- */
-export default {
-    // alert警告组件
-    alert: {
-        title: '',
-        type: 'warning',
-        description: '',
-        closable: false,
-        showIcon: false,
-        effect: 'light',
-        center: false,
-        fontSize: 14
-    }
-}

+ 0 - 46
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-alert/props.js

@@ -1,46 +0,0 @@
-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
-        }
-    }
-})

+ 0 - 250
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-alert/u-alert.vue

@@ -1,250 +0,0 @@
-<template>
-	<u-transition
-	    mode="fade"
-	    :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"
-			>
-				<u-icon
-				    :name="iconName"
-				    size="18"
-				    :color="iconColor"
-				></u-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"
-			>
-				<u-icon
-				    name="close"
-				    :color="iconColor"
-				    size="15"
-				></u-icon>
-			</view>
-		</view>
-	</u-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://ijry.github.io/uview-plus/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	定义需要用到的外部样式
-	 * @event    {Function}        click       点击组件时触发
-	 * @event    {Function}        close       点击关闭按钮时触发
-	 * @example  <u-alert :title="title"  type = "warning" :closable="closable" :description = "description"></u-alert>
-	 */
-	export default {
-		name: 'u-alert',
-		mixins: [mpMixin, mixin, props],
-		data() {
-			return {
-				show: true
-			}
-		},
-		computed: {
-			iconColor() {
-				return this.effect === 'light' ? this.type : '#fff'
-			},
-			// 不同主题对应不同的图标
-			iconName() {
-				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"],
-		methods: {
-			addUnit,
-			addStyle,
-			// 点击内容
-			clickHandler() {
-				this.$emit('click')
-			},
-			// 点击关闭按钮
-			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
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar-group/avatarGroup.js

@@ -1,23 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-20 16:49:55
- * @FilePath     : /u-view2.0/uview-ui/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
node_modules/.pnpm/uview-plus@3.4.65/node_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
node_modules/.pnpm/uview-plus@3.4.65/node_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://ijry.github.io/uview-plus/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
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar/avatar.js

@@ -1,28 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-20 16:49:22
- * @FilePath     : /u-view2.0/uview-ui/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
node_modules/.pnpm/uview-plus@3.4.65/node_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
-        }
-    }
-})

Разница между файлами не показана из-за своего большого размера
+ 0 - 61
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-avatar/u-avatar.vue


+ 0 - 27
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-back-top/backtop.js

@@ -1,27 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-20 16:50:18
- * @FilePath     : /u-view2.0/uview-ui/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
node_modules/.pnpm/uview-plus@3.4.65/node_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
node_modules/.pnpm/uview-plus@3.4.65/node_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"
-		>
-			<u-icon
-			    :name="icon"
-			    :custom-style="iconStyle"
-			></u-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
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-badge/badge.js

@@ -1,27 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-23 19:51:50
- * @FilePath     : /u-view2.0/uview-ui/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
node_modules/.pnpm/uview-plus@3.4.65/node_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
node_modules/.pnpm/uview-plus@3.4.65/node_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 - 27
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-box/props.js

@@ -1,27 +0,0 @@
-import { defineMixin } from '../../libs/vue'
-import defProps from '../../libs/config/props.js'
-
-export const propsBox = defineMixin({
-    props: {
-        // 背景色
-        bgColors: {
-            type: [Array],
-            default: ['#EEFCFF', '#FCF8FF', '#FDF8F2']
-        },
-        // 高度
-        height: {
-            type: [String],
-            default: "160px"
-        },
-        // 圆角
-        borderRadius: {
-            type: [String],
-            default: "6px"
-        },
-        // 间隔
-        gap: {
-            type: [String],
-            default: "15px"
-        },
-    }
-})

+ 0 - 91
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-box/u-box.vue

@@ -1,91 +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">左</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">右上</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">右下</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
node_modules/.pnpm/uview-plus@3.4.65/node_modules/uview-plus/components/u-button/button.js

@@ -1,43 +0,0 @@
-/*
- * @Author       : LQ
- * @Description  :
- * @version      : 1.0
- * @Date         : 2021-08-20 16:44:21
- * @LastAuthor   : LQ
- * @lastTime     : 2021-08-20 16:51:27
- * @FilePath     : /u-view2.0/uview-ui/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
node_modules/.pnpm/uview-plus@3.4.65/node_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;
-	}
-}

Некоторые файлы не были показаны из-за большого количества измененных файлов