ZaiZai 1 year ago
parent
commit
ec7b4f7303
100 changed files with 4276 additions and 1084 deletions
  1. 27 0
      httpApi/modules/menu.js
  2. 2 1
      httpApi/request/socket.js
  3. 4 0
      hybrid/html/pdf/web/viewer.css
  4. 2 2
      manifest.json
  5. 18 18
      package.json
  6. 1 8
      pages/image/info.vue
  7. 31 18
      pages/index/preview.vue
  8. 1 1
      pages/task/detail.vue
  9. 11 0
      store/index.js
  10. 28 2
      store/user.js
  11. 2 0
      uni_modules/c-lottie/changelog.md
  12. 16 19
      uni_modules/c-lottie/components/c-lottie/c-lottie.vue
  13. 1 1
      uni_modules/c-lottie/package.json
  14. 2 2
      uni_modules/c-lottie/yarn.lock
  15. 2 0
      uni_modules/lemon-filePicker/changelog.md
  16. 11 2
      uni_modules/lemon-filePicker/package.json
  17. 17 5
      uni_modules/lemon-filePicker/readme.md
  18. 17 0
      uni_modules/lemon-filePicker/utssdk/app-android/AndroidManifest.xml
  19. 217 138
      uni_modules/lemon-filePicker/utssdk/app-android/index.uts
  20. 2 0
      uni_modules/uni-calendar/changelog.md
  21. 2 1
      uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
  22. 1 1
      uni_modules/uni-calendar/package.json
  23. 2 0
      uni_modules/uni-data-picker/changelog.md
  24. 380 0
      uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue
  25. 0 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts
  26. 693 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts
  27. 76 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css
  28. 69 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue
  29. 4 3
      uni_modules/uni-data-picker/package.json
  30. 1 1
      uni_modules/uni-data-picker/readme.md
  31. 2 0
      uni_modules/uni-data-select/changelog.md
  32. 12 2
      uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
  33. 1 1
      uni_modules/uni-data-select/package.json
  34. 17 7
      uni_modules/uni-datetime-picker/changelog.md
  35. 0 1
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
  36. 211 198
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
  37. 105 137
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
  38. 1 1
      uni_modules/uni-datetime-picker/package.json
  39. 2 0
      uni_modules/uni-easyinput/changelog.md
  40. 0 2
      uni_modules/uni-easyinput/components/uni-easyinput/common.js
  41. 1 1
      uni_modules/uni-easyinput/package.json
  42. 4 0
      uni_modules/uni-file-picker/changelog.md
  43. 23 0
      uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js
  44. 11 1
      uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue
  45. 1 1
      uni_modules/uni-file-picker/package.json
  46. 2 0
      uni_modules/uni-forms/changelog.md
  47. 5 5
      uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue
  48. 1 1
      uni_modules/uni-forms/components/uni-forms/uni-forms.vue
  49. 1 1
      uni_modules/uni-forms/package.json
  50. 18 0
      uni_modules/uni-icons/changelog.md
  51. 91 0
      uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
  52. 31 17
      uni_modules/uni-icons/components/uni-icons/uni-icons.vue
  53. 32 31
      uni_modules/uni-icons/components/uni-icons/uniicons.css
  54. BIN
      uni_modules/uni-icons/components/uni-icons/uniicons.ttf
  55. 664 0
      uni_modules/uni-icons/components/uni-icons/uniicons_file.ts
  56. 649 0
      uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js
  57. 14 12
      uni_modules/uni-icons/package.json
  58. 2 0
      uni_modules/uni-notice-bar/changelog.md
  59. 5 0
      uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
  60. 1 1
      uni_modules/uni-notice-bar/package.json
  61. 2 0
      uni_modules/uni-popup/changelog.md
  62. 90 0
      uni_modules/uni-popup/components/uni-popup/uni-popup.uvue
  63. 1 1
      uni_modules/uni-popup/components/uni-popup/uni-popup.vue
  64. 1 1
      uni_modules/uni-popup/package.json
  65. 4 0
      uni_modules/uni-swipe-action/changelog.md
  66. 15 14
      uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue
  67. 1 1
      uni_modules/uni-swipe-action/package.json
  68. 2 0
      uni_modules/uni-table/changelog.md
  69. 5 1
      uni_modules/uni-table/components/uni-tr/uni-tr.vue
  70. 1 1
      uni_modules/uni-table/package.json
  71. 2 0
      uni_modules/uni-tooltip/changelog.md
  72. 47 7
      uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue
  73. 13 11
      uni_modules/uni-tooltip/package.json
  74. 26 1
      uni_modules/uni-ui/changelog.md
  75. 2 2
      uni_modules/uni-ui/package.json
  76. 6 0
      uni_modules/uv-checkbox/changelog.md
  77. 3 3
      uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue
  78. 2 1
      uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue
  79. 1 1
      uni_modules/uv-checkbox/package.json
  80. 2 0
      uni_modules/uv-empty/changelog.md
  81. 1 1
      uni_modules/uv-empty/components/uv-empty/uv-empty.vue
  82. 1 1
      uni_modules/uv-empty/package.json
  83. 6 0
      uni_modules/uv-icon/changelog.md
  84. 1 1
      uni_modules/uv-icon/components/uv-icon/props.js
  85. 1 1
      uni_modules/uv-icon/package.json
  86. 4 0
      uni_modules/uv-transition/changelog.md
  87. 5 0
      uni_modules/uv-transition/components/uv-transition/uv-transition.vue
  88. 1 1
      uni_modules/uv-transition/package.json
  89. 28 0
      uni_modules/uv-ui-tools/changelog.md
  90. 1 1
      uni_modules/uv-ui-tools/index.js
  91. 2 2
      uni_modules/uv-ui-tools/libs/config/config.js
  92. 107 72
      uni_modules/uv-ui-tools/libs/luch-request/adapters/index.js
  93. 15 14
      uni_modules/uv-ui-tools/libs/luch-request/core/InterceptorManager.js
  94. 141 138
      uni_modules/uv-ui-tools/libs/luch-request/core/Request.js
  95. 4 4
      uni_modules/uv-ui-tools/libs/luch-request/core/buildFullPath.js
  96. 27 23
      uni_modules/uv-ui-tools/libs/luch-request/core/defaults.js
  97. 4 1
      uni_modules/uv-ui-tools/libs/luch-request/core/dispatchRequest.js
  98. 105 82
      uni_modules/uv-ui-tools/libs/luch-request/core/mergeConfig.js
  99. 7 7
      uni_modules/uv-ui-tools/libs/luch-request/core/settle.js
  100. 42 47
      uni_modules/uv-ui-tools/libs/luch-request/helpers/buildURL.js

+ 27 - 0
httpApi/modules/menu.js

@@ -0,0 +1,27 @@
+import { httpApi } from '../request/httpApi'
+import website from "@/config/index";
+
+export default {
+    async getRoutes() {
+        return httpApi({
+            url: '/api/blade-system/menu/routes',
+            method: 'get',
+            params: {
+                sysType: website.clientId,
+            },
+        })
+    },
+    async getButtons() {
+        return httpApi({
+            url: '/api/blade-system/menu/buttons',
+            method: 'get',
+        })
+    },
+    async getAazyList(form) {
+        return httpApi({
+            url: '/api/blade-system/menu/lazy-list',
+            method: 'get',
+            params: form,
+        })
+    },
+}

+ 2 - 1
httpApi/request/socket.js

@@ -2,6 +2,7 @@ import {getWssApiUrl} from "@/config/envApi";
 import {getStorage} from "@/utils/storage";
 import {getObjVal, getObjValue, isString} from "js-fast-way";
 import {useAppStore} from "@/store";
+import {isNullES} from "js-fast-way";
 
 export default class HcSocket {
     static socketTask = null
@@ -13,7 +14,7 @@ export default class HcSocket {
         this.timeID = setInterval(() => {
             if (!_this.isConnect) {
                 const { user_id } = getObjValue(getStorage('userInfo'))
-                if (!user_id) return false;
+                if (isNullES(user_id)) return false;
                 _this.connectSocket(user_id)
             } else {
                 clearInterval(_this.timeID)

+ 4 - 0
hybrid/html/pdf/web/viewer.css

@@ -2407,3 +2407,7 @@ html[dir='rtl'] #documentPropertiesOverlay .row > * {
     display: none;
   }
 }
+
+#toolbarViewerRight {
+    display: none;
+}

+ 2 - 2
manifest.json

@@ -2,8 +2,8 @@
     "name" : "工程云家",
     "appid" : "__UNI__A0B807E",
     "description" : "智慧数字工程",
-    "versionName" : "2.2.2",
-    "versionCode" : 222,
+    "versionName" : "2.2.3",
+    "versionCode" : 223,
     "transformPx" : false,
     "networkTimeout" : {
         "request" : 300000,

+ 18 - 18
package.json

@@ -1,26 +1,26 @@
 {
   "dependencies": {
-    "dayjs": "^1.11.9",
-    "js-base64": "^3.7.5",
-    "js-fast-way": "^0.2.5",
-    "js-md5": "^0.7.3",
-    "pinia": "^2.1.6",
+    "dayjs": "^1.11.10",
+    "js-base64": "^3.7.6",
+    "js-fast-way": "^0.4.0",
+    "js-md5": "^0.8.3",
+    "pinia": "^2.1.7",
     "uni-ajax": "^2.5.1",
-    "vue": "^3.3.4"
+    "vue": "^3.4.15"
   },
   "devDependencies": {
-    "@iconify-json/fluent": "^1.1.32",
-    "@iconify-json/ic": "^1.1.13",
-    "@iconify-json/icon-park-outline": "^1.1.12",
-    "@iconify-json/iconoir": "^1.1.32",
-    "@iconify-json/material-symbols": "^1.1.56",
-    "@iconify-json/mdi": "^1.1.54",
-    "@iconify-json/ooui": "^1.1.26",
-    "@iconify-json/ri": "^1.1.12",
-    "@iconify-json/solar": "^1.1.2",
-    "unocss": "^0.55.2",
-    "unocss-preset-extra": "^0.5.2",
-    "unocss-preset-weapp": "^0.55.0"
+    "@iconify-json/fluent": "^1.1.46",
+    "@iconify-json/ic": "^1.1.17",
+    "@iconify-json/icon-park-outline": "^1.1.15",
+    "@iconify-json/iconoir": "^1.1.39",
+    "@iconify-json/material-symbols": "^1.1.70",
+    "@iconify-json/mdi": "^1.1.64",
+    "@iconify-json/ooui": "^1.1.33",
+    "@iconify-json/ri": "^1.1.19",
+    "@iconify-json/solar": "^1.1.9",
+    "unocss": "^0.58.3",
+    "unocss-preset-extra": "^0.5.3",
+    "unocss-preset-weapp": "^0.58.1"
   },
   "license": "MIT"
 }

+ 1 - 8
pages/image/info.vue

@@ -106,14 +106,7 @@ const viewPdfClick = async () => {
     if (margePdfUrl) {
         await toPdfPreview(margePdfUrl)
     } else {
-        const { data } = await mainApi.imageClassificationFile({id})
-        const url = isString(data) ? data : ''
-        if (url) {
-            dataInfo.value.margePdfUrl = url
-            await toPdfPreview(url)
-        } else {
-            errorToast('预览资料文件异常')
-        }
+       errorToast('暂无可预览的资料文件')
     }
 }
 

+ 31 - 18
pages/index/preview.vue

@@ -19,26 +19,39 @@ onLoad((option) => {
 
 //渲染完成
 onMounted(() => {
+    setWebViewStyle()
+})
+
+//设置样式
+const setWebViewStyle = async () => {
     // #ifdef APP-PLUS
-    let currentWebview = instance.$scope.$getAppWebview()
-    //如果是页面初始化调用时,需要延时一下
-    setTimeout(function() {
-        wv = currentWebview.children()[0]
-        wv.setStyle({scalable:true})
-        // #ifdef APP-PLUS
-        //ios 禁用缓存,测试生效!!
-        let cache1 = plus.ios.newObject('NSURLCache');
-        let cache = plus.ios.invoke(cache1, 'sharedURLCache');
-        plus.ios.invoke(cache, 'removeAllCachedResponses');
-        plus.ios.invoke(cache, 'setDiskCapacity:', 0);
-        plus.ios.invoke(cache, 'setMemoryCapacity:', 0);
-
-        //安卓端缓存清理。
-        plus.cache.clear();
-        // #endif
-    }, 1000);
+    await initWebview()
     // #endif
-})
+}
+
+//初始化webview
+const initWebview = async () => {
+    return new Promise((resolve) => {
+        let currentWebview = instance.$scope.$getAppWebview()
+        //如果是页面初始化调用时,需要延时一下
+        setTimeout(function() {
+            wv = currentWebview.children()[0]
+            wv.setStyle({scalable:true})
+            // #ifdef APP-PLUS
+            //ios 禁用缓存,测试生效!!
+            let cache1 = plus.ios.newObject('NSURLCache');
+            let cache = plus.ios.invoke(cache1, 'sharedURLCache');
+            plus.ios.invoke(cache, 'removeAllCachedResponses');
+            plus.ios.invoke(cache, 'setDiskCapacity:', 0);
+            plus.ios.invoke(cache, 'setMemoryCapacity:', 0);
+
+            //安卓端缓存清理。
+            plus.cache.clear();
+            // #endif
+            resolve(true)
+        }, 1000);
+    })
+}
 </script>
 
 <style lang="scss">

+ 1 - 1
pages/task/detail.vue

@@ -435,7 +435,7 @@ const viewPdfClick = () => {
     const {fileUrl} = taskFileInfo.value
     if (fileUrl) {
         // #ifdef H5
-        window.open(url, '_blank')
+        window.open(fileUrl, '_blank')
         // #endif
         // #ifdef APP-PLUS
         uni.navigateTo({

+ 11 - 0
store/index.js

@@ -16,6 +16,8 @@ export const useAppStore = defineStore('main', {
         projectId: getStorage('projectId') ?? '',
         contractId: getStorage('contractId') ?? '',
         isAnimation: getStorage('isAnimation') ?? false,
+        //按钮权限
+        buttons: getStorage('buttons') || {},
         //消息数据
         msgCountData: getStorage('msgCountData') ?? {},
         //检测升级
@@ -74,6 +76,14 @@ export const useAppStore = defineStore('main', {
         setOnUpdate(value) {
             this.onUpdate = value
         },
+        //按钮权限
+        setButtons(value) {
+            this.buttons = value
+            setStorage('buttons', value)
+        },
+        getButtonsVal(value) {
+            return this.buttons[value] || false
+        },
         //清除缓存和token
         clearStoreData() {
             //清除状态
@@ -93,6 +103,7 @@ export const useAppStore = defineStore('main', {
                 isUpdate: false,
                 toUpdate: true
             }
+            this.buttons = null
             this.onUpdate = null
             clearStorage()
         },

+ 28 - 2
store/user.js

@@ -1,10 +1,11 @@
 import pinia from "@/store/init"
 import {useAppStore} from "@/store";
-import {setStorage} from "@/utils/storage";
+import {getStorage, setStorage} from "@/utils/storage";
 import userApi from '~api/user/index';
+import menuApi from '~api/menu';
 import projectApi from "~api/user/project";
 import {setToken, setRefreshToken} from '@/httpApi/util/auth';
-import {getArrValue, getObjVal, getObjValue, isNullES} from "js-fast-way";
+import {getArrValue, getObjVal, getObjValue, isNullES, ArrToOneObj} from "js-fast-way";
 
 const store = useAppStore(pinia)
 
@@ -62,6 +63,8 @@ export const getProjectContract = async () => {
         projectInfo = projectList[0]
         contractInfo = contractList[0]
     }
+    //获取按钮权限
+    await initButtons()
     //设置项目合同段数据
     store.setProjectInfo(projectInfo)
     store.setProjectId(projectInfo.id)
@@ -100,3 +103,26 @@ const getContractInfo = async (contractId) => {
     const {data} = await projectApi.getContractInfo(contractId)
     return getObjValue(data)
 }
+
+
+//按钮初始化
+export const initButtons = async () => {
+    const value = getStorage('buttons')
+    if (!value) {
+        const { error, data } = await menuApi.getButtons()
+        if (error) return Promise.reject('error')
+        const buttons = getArrValue(data)
+        const buttonsArr = await setButtonsData(buttons)
+        store.setButtons(buttonsArr)
+        return Promise.resolve(true)
+    } else {
+        return Promise.resolve(true)
+    }
+}
+
+//设置按钮
+const setButtonsData = async (data) => {
+    let buttonsArr = {}
+    await ArrToOneObj(data, 'code', buttonsArr)
+    return buttonsArr
+}

+ 2 - 0
uni_modules/c-lottie/changelog.md

@@ -1,3 +1,5 @@
+## 1.0.9(2023-09-08)
+修复在微信小程序端当多个Lottie组件存在时无法单独控制某一组件的问题
 ## 1.0.8(2023-07-14)
 新增加载成功事件dataReady  加载失败事件 dataFailed
 ## 1.0.7(2023-07-14)

+ 16 - 19
uni_modules/c-lottie/components/c-lottie/c-lottie.vue

@@ -38,9 +38,6 @@
 	// #ifdef MP&VUE2
 	import lottie from '../../node_modules/lottie-miniprogram'
 	// #endif
-	// #ifdef MP
-	let player, context, myCanvas;
-	// #endif
 	export default {
 		props: {
 			canvasId: {
@@ -148,10 +145,10 @@
 				})
 			},
 			async render() {
-				if (player) {
+				if (this.player) {
 					// console.log(player);
 					// call('stop')
-					this.call('destroy', player)
+					this.call('destroy', this.player)
 				}
 				let {
 					canvas,
@@ -159,14 +156,14 @@
 					height,
 					pixelRatio
 				} = await this.getContext()
-				myCanvas = canvas
-				context = canvas.getContext('2d')
+				this.myCanvas = canvas
+				this.context = canvas.getContext('2d')
 				//避免出现锯齿问题
-				context.scale(pixelRatio, pixelRatio)
+				this.context.scale(pixelRatio, pixelRatio)
 				canvas.width = width * pixelRatio
 				canvas.height = height * pixelRatio
-				lottie.setup(myCanvas)
-				player = lottie.loadAnimation({
+				lottie.setup(this.myCanvas)
+				this.player = lottie.loadAnimation({
 					loop: this.loop,
 					autoplay: this.autoPlay,
 					// 动画json的本地数据
@@ -174,30 +171,30 @@
 					//远程动画。一定要把json格式的文件放到服务器中,并且注意域名是合法的
 					path: this.src,
 					rendererSettings: {
-						context,
+						context:this.context,
 					},
 				})
-				player.addEventListener('data_ready',(val)=>{ //当动画的所有部分都已加载时
+				this.player.addEventListener('data_ready',(val)=>{ //当动画的所有部分都已加载时
 					this.$emit('dataReady', val)
 				})
-				player.addEventListener('data_failed',(val)=>{ //当部分动画无法加载时
+				this.player.addEventListener('data_failed',(val)=>{ //当部分动画无法加载时
 					this.$emit('dataFailed', val)
 				})
-				player.onComplete = (val) => { //动画播放完成触发
+				this.player.onComplete = (val) => { //动画播放完成触发
 					// console.log('动画播放完成触发',val);
 					this.$emit('Complete', val)
 				}
-				player.onLoopComplete = (val) => { //当前循环播放完成触发
+				this.player.onLoopComplete = (val) => { //当前循环播放完成触发
 					// console.log('当前循环播放完成触发',val);
 					this.$emit('LoopComplete', val)
 				}
 				if (this.isOnChange) {
-					player.onEnterFrame = (val) => { //播放动画的时候触发
+					this.player.onEnterFrame = (val) => { //播放动画的时候触发
 						// console.log('播放动画的时候触发',val);
 						this.$emit('EnterFrame', val)
 					}
 				}
-				player.onSegmentStart = (val) => { //开始播放一个动画片段的时候触发
+				this.player.onSegmentStart = (val) => { //开始播放一个动画片段的时候触发
 					// console.log('开始播放一个动画片段的时候触发',val);
 					this.$emit('SegmentStart', val)
 				}
@@ -208,9 +205,9 @@
 				let {name,args} = val
 				// console.log(name, args);
 				if (Array.isArray(args)) {
-					player[name](...args)
+					this.player[name](...args)
 				} else {
-					player[name](args)
+					this.player[name](args)
 				}
 			},
 			// #endif

+ 1 - 1
uni_modules/c-lottie/package.json

@@ -1,7 +1,7 @@
 {
   "id": "c-lottie",
   "displayName": "c-lottie",
-  "version": "1.0.8",
+  "version": "1.0.9",
   "description": "c-design c-lottie动画 支持app h5 微信小程序",
   "keywords": [
     "lottie",

+ 2 - 2
uni_modules/c-lottie/yarn.lock

@@ -4,10 +4,10 @@
 
 lottie-miniprogram@^1.0.12:
   version "1.0.12"
-  resolved "https://registry.npmjs.org/lottie-miniprogram/-/lottie-miniprogram-1.0.12.tgz#637a315c6a3df2e908012fb2771ab47a342ca55e"
+  resolved "http://39.108.216.210:9000/lottie-miniprogram/-/lottie-miniprogram-1.0.12.tgz#637a315c6a3df2e908012fb2771ab47a342ca55e"
   integrity sha512-2ITtXAyeDXbftvYYe5w0ayl8jTV8laylWMCdJofpka1q205NkjRNj7kX+iIZZ/YjKh1f8plWxb9gSFHkC7BLUQ==
 
 lottie-web@^5.10.2:
   version "5.12.2"
-  resolved "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz#579ca9fe6d3fd9e352571edd3c0be162492f68e5"
+  resolved "http://39.108.216.210:9000/lottie-web/-/lottie-web-5.12.2.tgz#579ca9fe6d3fd9e352571edd3c0be162492f68e5"
   integrity sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==

+ 2 - 0
uni_modules/lemon-filePicker/changelog.md

@@ -1,3 +1,5 @@
+## 3.0(2023-09-24)
+1.新增 支持将应用作为第三方应用的打开方式
 ## 1.6(2023-09-06)
 1.修复 安卓文件选择bug修复
 ## 1.5(2023-08-09)

+ 11 - 2
uni_modules/lemon-filePicker/package.json

@@ -1,7 +1,7 @@
 {
     "id": "lemon-filePicker",
     "displayName": "安卓iOS 双端APP文件选择",
-    "version": "1.6",
+    "version": "3.0",
     "description": "支持IOS 、安卓 双平台的APP文件选取插件",
     "keywords": [
         "文件选择",
@@ -14,7 +14,16 @@
         "HBuilderX": "^3.8.7"
     },
     "dcloudext": {
-        "type": "uts"
+        "type": "uts",
+        "contact": {
+            "qq": ""
+        },
+        "declaration": {
+            "ads": "无",
+            "data": "插件不采集任何数据",
+            "permissions": "无"
+        },
+        "npmurl": ""
     },
     "uni_modules": {
         "dependencies": [],

+ 17 - 5
uni_modules/lemon-filePicker/readme.md

@@ -10,6 +10,18 @@
 4.本插件已做权限检查(安卓),支持跳转到APP权限设置页
 5.支持设置Mime类型(安卓),实现限制文件类型选取
 6.支持访问指定目录(安卓),方便用户在指定目录快速选取
+7.支持将APP作为其他应用的打开方式(安卓,具体说明请看【fileSelect可配置参数说明】中的action属性):
+	一种使用场景:
+		在微信中好友发送了一个文件,你想让用户可以将该文件保存到本APP中
+		或用户想在本app中处理该文件。本插件会自动把你的app展示在其他应用的打开方式中,供用户选择。
+		q:为什么不直接使用选择文件的方式来拿到文件,而是要通过此方式呢?
+		a: 使用该方式免去了用户在复杂的文件选择器中查找所需的文件,如果文件所在的位置层级过深,
+		或者是在部分无法访问的目录中,只会导致用户放弃使用。
+		此方式还可以在未启动你的APP的情况下保存文件到你的APP中,因此用户可以在任何时候任何其他应用中将文件保存到你的APP中
+		q:如何开启此功能?
+		a: 本插件默认开启该功能,使用该功能需要云打包自定义调试基座!云打包自定义调试基座!云打包自定义调试基座!
+		q:如何关闭该功能?
+		a: 删除AndroidManifest.xml文件即可,该文件所在路径为:'/uni_modules/lemon-filePicker/utssdk/app-android/AndroidManifest.xml'
 import fileSelect from "@/uni_modules/lemon-filePicker"
 ```
 ### 2.唤起文件选择
@@ -72,33 +84,33 @@ import fileSelect from "@/uni_modules/lemon-filePicker"
 | scope | string | 【可选】访问指定目录,不需要则不要声明该属性,默认显示顶级目录<br />例:<br />- /DCIM/Camera 相机 <br />-  /Download 下载    <br /> | 仅安卓 (部分目录由于安全策略无法访问,如"Android/data",请自行测试,可以参考自己手机的目录进行设置) |
 | permission | Boolean | 【可选】当读取文件的权限被用户拒绝,是否自动跳转到当前APP的权限设置页面,默认为false(不跳转) | 仅安卓 |
 | mimetype | string | 【必填】限制选取的文件类型,不限制需设为"*/*",更多类型请参照Mime类型对照表,暂时仅支持设置单个类型<br />例: <br />-  image/*    (图片) <br />-  text/plain  (文本)<br />- application/vnd.openxmlformats-officedocument.wordprocessingml.document (word)<br /> | 仅安卓 |
+| action | string | 【可选】打开的行为配置,目前暂时只支持暂时'openWithFile','openWithFile'行为用于获取用户最近一次在其他应用选择本应用作为打开方式选择的文件 | 仅安卓 |
 
 
 | fileSelect返回值说明 |  |  |  |
 | --- | --- | --- | --- |
 | 属性 | 类型 | 说明 | 兼容性 |
-| code | string | 状态码:<br />- 0 成功<br />- 1001 未授权文件读取权限(仅安卓)<br />- 1002 文件不存在(仅安卓)<br />- 1004 用户取消了选择(仅ios)<br /> | <br /> |
+| code | string | 状态码:<br />- 0 成功<br />- 1001 未授权文件读取权限(仅安卓)<br />- 1002 文件不存在(仅安卓)<br />- 1004 用户取消了选择(仅ios)  - 1005 文件选取出错(仅安卓)  <br /> | <br /> |
 | filePath | string | 选取的文件的绝对路径,可以直接提供给uniapp的上传等api使用(使用该路径时,请确认自己的项目有读取访问文件的权限) |  |
 | fileName | string | 选取的文件的名称 |  |
 | fileSize | string | 选取的文件的大小(单位:字节) |  |
-| fileType | string | 选取的文件的后缀名 |  |
+| fileExt | string | 选取的文件的后缀名 | 仅安卓 |
 | errMsg | string | 选择完成后的状态信息  |  |
 | detail | string | 具体的文字说明 |  |
 
 # 兼容性说明
 ### 目前仅测试了部分真机(安卓13.0 、ios13),其他系统版本兼容性未知,请自行测试.
-### 由于安卓 API33 (>=Android13)系统隐私安全管控更为严格,废弃了常规的读取和写入权限,所以暂时只支持 targetSdkVersion<=32,请检查manifest.json中配置项targetSdkVersion
 # 问题反馈与收集
 ```js
 感谢使用,本插件已停止维护,若遇到问题请加qq群466852060讨论交流
-本uts插件为开放源代码插件,可自行在 uni_modules->lemon-filePicker->utssdk 直接修改对应平台的源代码
+本uts插件为开放源代码插件,可自行在 uni_modules->lemon-filePicker->utssdk 直接修改对应平台的源代码,以满足个性化需求
 
 # 已上线[原生插件]版文件选取,同样支持安卓和ios双端,支持更多功能
 前往使用:https://ext.dcloud.net.cn/plugin?id=14059(请根据自己实际真机测试选择使用uts版或原生插件版)
 
 
 目前收集的问题(Q&A):
-1.文件查找失败:'@/uni_modules/lemon-filePicker' 
+1.文件查找失败:'@/uni_modules/lemon-filePicker'  大概率你是在浏览器上打开的吧?运行请选择【运行到手机或模拟器】,本插件仅用于安卓和ios的APP使用,不支持任何h5,不支持任何浏览器运行。
 2.(已解决,ios,应该?)Error: undefined class: UTSSDKModulesLemonFilePickerIndexSwift
 遇到问题2,大概率是你用的window电脑,直接用基本调试基座运行的。
    一、官方文档说明如下:

+ 17 - 0
uni_modules/lemon-filePicker/utssdk/app-android/AndroidManifest.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"  package="com.lemonjk.uni_modules.lemon_filepicker">
+	<application android:requestLegacyExternalStorage="true">
+		<meta-data android:name="ScopedStorage" android:value="true" />
+		<activity   android:name="uts.sdk.modules.lemonFilePicker.FileActivity" android:exported="true" tools:ignore="AppLinkUrlError" >
+			<intent-filter>
+				<action android:name="android.intent.action.VIEW" />
+				<category android:name="android.intent.category.DEFAULT" />
+				<data android:mimeType="*/*" />
+				<data android:host="*" />
+				<data android:scheme="file" />
+				<data android:scheme="content" />
+			</intent-filter>
+		</activity>
+	</application>
+</manifest>

+ 217 - 138
uni_modules/lemon-filePicker/utssdk/app-android/index.uts

@@ -2,110 +2,228 @@
 
 // 引用android api
 import { UTSAndroid } from "io.dcloud.uts";
-import ActivityCompat from "androidx.core.app.ActivityCompat";
+import { ActivityCompat } from "androidx.core.app";
+import AlertDialog from 'android.app.AlertDialog';
 import { Context, Intent, ContentUris, ContentResolver } from "android.content";
-import { Settings } from "android.provider";
 import Uri from "android.net.Uri";
 import FileUtils from "android.os.FileUtils";
 import { DocumentsContract, MediaStore } from "android.provider";
 import { File, FileOutputStream } from "java.io";
 import Activity from "android.app.Activity";
-import Manifest from "android.Manifest";
 import Cursor from "android.database.Cursor";
-import { Build, Environment } from "android.os";
- 
-    
+import { Build, Environment, Bundle } from "android.os";
+import DialogInterface from 'android.content.DialogInterface';
+import JSONObject from 'com.alibaba.fastjson.JSONObject';
+
+class FileActivity extends Activity {
+
+	constructor() {
+		super();
+	}
+	override onCreate(savedInstanceState ?: Bundle) : void {
+		super.onCreate(savedInstanceState)
+		var dataUri = this.getIntent().getData()
+		transUriStart(this, dataUri)
+
+	}
+	// override  onResume() {
+	//         super.onResume()
+
+	// var dataUri=this.getIntent().getData()
+	// console.log(dataUri.toString())
+	// }
+}
+
 type InfoOptions = {
-	scope?:string,
+	scope ?: string,
 	permission ?: boolean,
-	mimetype?:string,
+	mimetype ?: string,
+	action ?: string,
 	success ?: (res : object) => void
 	fail ?: (res : object) => void
 	complete ?: (res : object) => void
 }
+
+
+const FILE_SELECT_REQUEST_CODE = 110
 export default function fileSelect(options : InfoOptions) {
-	UTSAndroid.onAppActivityRequestPermissionsResult((requestCode : number,
-		permissions : MutableList<string>,
-		grantResults : MutableList<number>) => {
-		UTSAndroid.offAppActivityRequestPermissionsResult();
-		if ((requestCode !== 1001) && (grantResults[0] === -1)) {
+
+	let permissionList = ["android.permission.READ_EXTERNAL_STORAGE"]
+	const permission = options.permission;
+	if (permission != null && permission) {
+		UTSAndroid.gotoSystemPermissionActivity(UTSAndroid.getUniActivity()!, permissionList)
+		return;
+	}
+	// 请求权限 
+	UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, permissionList, function (allRight : boolean, grantedList : string[]) {
+		if (allRight) {
+			// 用户同意了全部权限
+			if (options.action != null&&options.action=="openWithFile") {
+				 let prefs = UTSAndroid.getUniActivity()?.getSharedPreferences("lemonjkReceive",Context.MODE_PRIVATE)
+				 let res  = prefs?.getString("receiveFromOtherApp","")
+				 if(res!=null&&res!=''){ 
+					 options.success?.(JSONObject.parse(res)) 
+					 options.complete?.(JSONObject.parse(res))
+				 }else{
+					 const res2 = {
+					 	code: "1002",
+					 	errMsg: 'fileselect:fail',
+					 	detail: "文件不存在"
+					 }
+					 options.fail?.(res2) 
+					 options.complete?.(res2)
+				 }
+			} 
+			else if(options.action=='fk'){
+				let fuck_intent = new Intent(UTSAndroid.getUniActivity(), FileActivity().javaClass);
+			}
+			else {
+				fileSelectStart(options);
+			}
+
+		} else {
+			// 用户仅同意了 grantedList中的权限
 			options.fail?.({
 				code: "1001",
 				errMsg: 'fileselect:fail',
-				detail:"未授权文件读取权限"
+				detail: "未授权文件读取权限"
 			})
-			const permission=options.permission;
-			if(permission!=null&&permission){
-				const intent = new Intent();
-				intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
-				const uri = Uri.fromParts("package", UTSAndroid.getUniActivity()?.getPackageName(), "");
-				intent.setData(uri);
-				UTSAndroid.getUniActivity()?.startActivity(intent);
-			}
-			
-		} else {
-			fileSelectStart(options);
-
 		}
-	});
+	}, function (doNotAskAgain : boolean, grantedList : string[]) {
+		// 用户拒绝了部分权限,仅允许了grantedList中的权限
+		// if (doNotAskAgain) {
+		// 	// 用户拒绝了权限,并且选择不再询问 
+		// }
+		options.fail?.({
+			code: "1001",
+			errMsg: 'fileselect:fail',
+			detail: "未授权文件读取权限"
+		})
+	})
+}
+/**
+	* 用户输入对话框监听器
+	*/
+class DialogListener extends DialogInterface.OnClickListener {
 
-	// 请求权限 
-	ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001)
+	callback : () => void
+
+	constructor(cb : () => void) {
+		super();
+		this.callback = cb;
+	}
+
+	override onClick(_dialog : DialogInterface, _arg1 : Int) : void {
+		// //数据获取
+
+		// let input = this.inputET.getText().toString()
+		this.callback();
+		// Toast.makeText(UTSAndroid.getUniActivity(), input,
+		// 	Toast.LENGTH_LONG).show();
 
+	}
 }
- function fileSelectStart(options : InfoOptions) {
-	const FILE_SELECT_REQUEST_CODE = 110
-	const context = UTSAndroid.getAppContext();
-	if (context != null) {
-		if(options.scope!=null){ 
-			let strPath=options.scope
-			strPath=strPath?.replaceAll("/","%2F")  
-			console.log(strPath);
-			let uri1:Uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3A"+strPath);
-			let intent1:Intent = new Intent(Intent.ACTION_GET_CONTENT);
-			intent1.addCategory(Intent.CATEGORY_OPENABLE);  
-			if(options.mimetype!=null){ 
-				intent1.setType(options.mimetype);
-			}else{
-				intent1.setType("*/*");
+
+
+function transUriStart(context : Context, myUri ?: Uri) {
+	let fileActivity = context as FileActivity;
+	if (myUri != null) {
+		// console.log(getRealPathFromURI(context, myUri))
+		const newFile = new File(getRealPathFromURI(context, myUri));
+		if (newFile.exists()) {
+			let filePath = newFile.toString();
+			let fileName = newFile.getName();
+			let fileSize = newFile.length();
+			const extIdx = fileName.lastIndexOf(".");
+			let fileExt = extIdx != -1 ? fileName.substring(extIdx + 1) : ""
+			const res = {
+				code: "0",
+				filePath: filePath,
+				fileName: fileName,
+				fileSize: fileSize,
+				fileExt: fileExt,
+				rawPath:myUri.toString(),
+				errMsg: 'fileselect:ok',
+				detail: "文件读取成功"
 			}
-			intent1.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri1);
-			UTSAndroid.getUniActivity()?.startActivityForResult(intent1, FILE_SELECT_REQUEST_CODE);
-			
-		}else{
-			const intent = new Intent(Intent.ACTION_GET_CONTENT);
-			intent.setType("*/*");
-			intent.addCategory(Intent.CATEGORY_OPENABLE);
-			if(options.mimetype!=null){
-				intent.setType(options.mimetype);
+			let editor=context.getSharedPreferences("lemonjkReceive",Context.MODE_PRIVATE).edit();
+			editor.putString("receiveFromOtherApp", JSON.stringify(res))
+			editor.apply();
+			new AlertDialog.Builder(fileActivity)
+				.setTitle("文件打开成功")
+				.setMessage("[" + fileName + "]" + "已保存到应用中")
+				.setPositiveButton("确定", new DialogListener(() => {
+					fileActivity.finish();
+				})).show();
+		} else {
+			const res2 = {
+				code: "1002",
+				errMsg: 'fileselect:fail',
+				detail: "文件不存在"
 			}
-			UTSAndroid.getUniActivity()?.startActivityForResult(intent, FILE_SELECT_REQUEST_CODE)
+			new AlertDialog.Builder(fileActivity)
+				.setTitle("文件打开失败")
+				.setMessage("文件不存在")
+				.setPositiveButton("确定", new DialogListener(() => {
+					fileActivity.finish();
+				})).show();
+			console.log(res2)
+		}
+	} else {
+		const res3 = {
+			code: "1005",
+			errMsg: 'fileselect:fail',
+			detail: "文件选取出错:myUri为null"
 		}
-		
+		new AlertDialog.Builder(fileActivity)
+			.setTitle("文件打开失败")
+			.setMessage("文件不存在")
+			.setPositiveButton("确定", new DialogListener(() => {
+				fileActivity.finish();
+			})).show();
+		console.log(res3)
+	}
+}
+function fileSelectStart(options : InfoOptions) {
+	const context = UTSAndroid.getAppContext();
+	if (context != null) {
+		const intent = new Intent(Intent.ACTION_GET_CONTENT);
+		if (options.scope != null) {
+			let strPath = options.scope
+			strPath = strPath?.replaceAll("/", "%2F");
+			let uriByScope : Uri = Uri.parse("content://com.android.externalstorage.documents/document/primary%3A" + strPath);
+			intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uriByScope);
+		}
+		var mimeType = "*/*";
+		const mimetypeTemp = options.mimetype;
+		if (mimetypeTemp != null) {
+			mimeType = mimetypeTemp;
+		}
+		intent.setType(mimeType);
+		intent.addCategory(Intent.CATEGORY_OPENABLE);
+		UTSAndroid.getUniActivity()?.startActivityForResult(intent, FILE_SELECT_REQUEST_CODE);
 		UTSAndroid.onAppActivityResult((requestCode : Int, resultCode : Int, data ?: Intent) => {
-			// let eventName = "onAppActivityResult  -  requestCode:" + requestCode + " -resultCode:"+resultCode + " -data:"+JSON.stringify(data);
-			UTSAndroid.offAppActivityResult();
+			UTSAndroid.offAppActivityResult(null);
 			if (requestCode == FILE_SELECT_REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
 				const fileUri = data.getData();
- 
+				// console.log(fileUri?.toString()); 
 				if (fileUri != null) {
-					// console.log('文件选择器:【文件相对路径】', fileUri.getPath());
 					let path = getRealPathFromURI(context, fileUri)
 					const file = new File(path)
 					if (file.exists()) {
 						let upLoadFilePath = file.toString();
 						let upLoadFileName = file.getName();
 						let fileSize = file.length();
-						const extIdx= upLoadFilePath.lastIndexOf(".");
-						let fileType =extIdx!=-1?upLoadFilePath.substring(extIdx+1):""
+						const extIdx = upLoadFileName.lastIndexOf(".");
+						let fileExt = extIdx != -1 ? upLoadFileName.substring(extIdx + 1) : ""
 						const res = {
 							code: "0",
 							filePath: upLoadFilePath,
 							fileName: upLoadFileName,
-							fileSize:fileSize,
-							fileType:fileType,
+							fileSize: fileSize,
+							fileExt: fileExt,
 							errMsg: 'fileselect:ok',
-							detail:"文件读取成功"
+							detail: "文件读取成功"
 						}
 						options.success?.(res)
 						options.complete?.(res)
@@ -113,25 +231,23 @@ export default function fileSelect(options : InfoOptions) {
 						const res2 = {
 							code: "1002",
 							errMsg: 'fileselect:fail',
-							detail:"文件不存在"
+							detail: "文件不存在"
 						}
 						options.fail?.(res2)
 						options.complete?.(res2)
 					}
-
 				}
 			}
 		});
 	} else {
 		const res3 = {
-			code: "1002",
+			code: "1005",
 			errMsg: 'fileselect:fail',
-			detail:"文件不存在"
+			detail: "文件选取出错:context为null"
 		}
 		options.fail?.(res3)
 		options.complete?.(res3)
 	}
-
 }
 
 function getRealPathFromURI(context : Context, uri : Uri) : string {
@@ -142,64 +258,33 @@ function getRealPathFromURI(context : Context, uri : Uri) : string {
 	if (isKitKat) {
 		if (DocumentsContract.isDocumentUri(context, uri)) {
 			if (isExternalStorageDocument(uri)) {
-				const docId : string = DocumentsContract.getDocumentId(uri);
-				const split : string[] = docId.split(":");
-				console.log(docId, split);
-				if ("primary".equals(split[0])) {
-					return Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + split[1];
-				} else {
-					return "/storage/" + split[0] + "/" + split[1]
-				}
+				console.log("isExternalStorageDocument")
+				return saveFileFromUri(context, uri)
 			}
 			// DownloadsProvider
 			else if (isDownloadsDocument(uri)) {
-				if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-					return saveFileFromUri(context, uri)
-				}
-				const downloadPath: string = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
-				const fileName:string = getFileName(context, uri);
-				return downloadPath+"/"+fileName
+				console.log("isDownloadsDocument")
+				return saveFileFromUri(context, uri)
 			}
 			// MediaProvider 
 			else if (isMediaDocument(uri)) {
-				let docId : string = DocumentsContract.getDocumentId(uri);
-				let split : string[] = docId.split(":");
-				let type : string = split[0];
-				let contentUri : Uri | null = null;
-
-				if ("image".equals(type)) {
-					contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
-				} else if ("video".equals(type)) {
-					contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
-				} else if ("audio".equals(type)) {
-					contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
-				}
-				else if ("document".equals(type)) {
-					// 安卓系统版本大于等于10
-					if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-						return saveFileFromUri(context, uri)
-					}
-					return ""
-				}
-				const selection : string = "_id=?";
-				const selectionArgs : String[] = [split[1]];
-				if (contentUri != null) {
-					return getDataColumn(context, contentUri, selection, selectionArgs);
-				}
+				console.log("isMediaDocument")
+				return saveFileFromUri(context, uri)
 			}
 		}
 		//其他 content
 		else if ("content".equals(uri.getScheme())) {
-			return getDataColumn(context, uri, null, null);
-
+			// return getDataColumn(context, uri, null, null);
+			console.log("content")
+			return saveFileFromUri(context, uri)
 		}
 		//其他 file
 		else if ("file".equals(uri.getScheme())) {
+			console.log("file")
 			return uri.getPath() as string;
 		}
 	}
 	return ""
-
 }
 function isExternalStorageDocument(uri : Uri) : boolean {
 	return "com.android.externalstorage.documents".equals(uri.getAuthority());
@@ -212,48 +297,44 @@ function isMediaDocument(uri : Uri) : boolean {
 	return "com.android.providers.media.documents".equals(uri.getAuthority());
 }
 
-function getDataColumn(context : Context, uri : Uri, selection : string | null, selectionArgs : String[] | null) : string {
-	let column = "_data";
-	let projection = arrayOf<string>(column)
-	let cursor : Cursor | null = null;
-	const _selectionArgs = selectionArgs != null ? selectionArgs.toTypedArray() : null
-	
-	try {
+// function getDataColumn(context : Context, uri : Uri, selection : string | null, selectionArgs : String[] | null) : string {
+// 	let column = "_data";
+// 	let projection = arrayOf<string>(column)
+// 	let cursor : Cursor | null = null;
+// 	const _selectionArgs = selectionArgs != null ? selectionArgs.toTypedArray() : null
 
-		cursor = context.getContentResolver().query(uri, projection, selection, _selectionArgs, null);
-		
-		if (cursor != null && cursor.moveToFirst()) {
-			const column_index = cursor.getColumnIndexOrThrow(column);
-			return cursor.getString(column_index);
-		}
-	} catch (e) {
-		console.log(e);
-	} finally {
-		if (cursor != null) { 
-			cursor.close();
-		}
-	}
-	return "";
-}
+// 	try {
+
+// 		cursor = context.getContentResolver().query(uri, projection, selection, _selectionArgs, null);
+
+// 		if (cursor != null && cursor.moveToFirst()) {
+// 			const column_index = cursor.getColumnIndexOrThrow(column);
+// 			return cursor.getString(column_index);
+// 		}
+// 	} catch (e) {
+// 		console.log(e);
+// 	} finally {
+// 		if (cursor != null) {
+// 			cursor.close();
+// 		}
+// 	}
+// 	return "";
+// }
 function getFileName(context : Context, uri : Uri) : string {
 	let projection = arrayOf(MediaStore.Images.ImageColumns.DISPLAY_NAME)
 	let cursor = context.getContentResolver().query(uri, projection, null, null, null)
 	try {
 		if (cursor != null && cursor.moveToFirst()) {
-
 			let name_col_index = cursor.getColumnIndex(projection[0])
-
 			return cursor.getString(name_col_index)
 		}
 	} catch (e) {
 		console.log(e);
-
 	} finally {
 		cursor?.close()
 	}
 	return ""
 }
-
 function saveFileFromUri(context : Context, uri : Uri) : string {
 	let file : File;
 	const contentResolver : ContentResolver = context.getContentResolver();
@@ -261,7 +342,6 @@ function saveFileFromUri(context : Context, uri : Uri) : string {
 	if (cursor != null && cursor.moveToFirst()) {
 		const displayName = getFileName(context, uri)
 		try {
-
 			const is = contentResolver.openInputStream(uri);
 			if (is != null) {
 				const file1 : File = new File(context.getExternalCacheDir()?.getAbsolutePath() + "/" + System.currentTimeMillis());
@@ -279,7 +359,6 @@ function saveFileFromUri(context : Context, uri : Uri) : string {
 		} catch (e) {
 			console.log(e);
 		}
-
 	}
 	return ""
 }

+ 2 - 0
uni_modules/uni-calendar/changelog.md

@@ -1,3 +1,5 @@
+## 1.4.11(2024-01-10)
+- 修复 回到今天时,月份显示不一致问题
 ## 1.4.10(2023-04-10)
 - 修复 某些情况 monthSwitch 未触发的Bug
 ## 1.4.9(2023-02-02)

+ 2 - 1
uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue

@@ -328,11 +328,12 @@
 				const date = this.cale.getDate(new Date())
         const todayYearMonth = `${date.year}-${date.month}`
 
+				this.init(date.fullDate)
+
         if(nowYearMonth !== todayYearMonth) {
           this.monthSwitch()
         }
 
-				this.init(date.fullDate)
 				this.change()
 			},
 			/**

+ 1 - 1
uni_modules/uni-calendar/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-calendar",
   "displayName": "uni-calendar 日历",
-  "version": "1.4.10",
+  "version": "1.4.11",
   "description": "日历组件",
   "keywords": [
     "uni-ui",

+ 2 - 0
uni_modules/uni-data-picker/changelog.md

@@ -1,3 +1,5 @@
+## 2.0.0(2023-12-14)
+- 新增 支持 uni-app-x
 ## 1.1.2(2023-04-11)
 - 修复 更改 modelValue 报错的 bug
 - 修复 v-for 未使用 key 值控制台 warning

+ 380 - 0
uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue

@@ -0,0 +1,380 @@
+<template>
+  <view class="uni-data-tree">
+    <view class="uni-data-tree-input" @click="handleInput">
+      <slot :data="selectedPaths" :error="error">
+        <view class="input-value" :class="{'input-value-border': border}">
+          <text v-if="error!=null" class="error-text">{{error!.errMsg}}</text>
+          <scroll-view v-if="selectedPaths.length" class="selected-path" scroll-x="true">
+            <view class="selected-list">
+              <template v-for="(item, index) in selectedPaths">
+                <text class="text-color">{{item[mappingTextName]}}</text>
+                <text v-if="index<selectedPaths.length-1" class="input-split-line">{{split}}</text>
+              </template>
+            </view>
+          </scroll-view>
+          <text v-else-if="error==null&&!loading" class="placeholder">{{placeholder}}</text>
+          <view v-if="!readonly" class="arrow-area">
+            <view class="input-arrow"></view>
+          </view>
+        </view>
+      </slot>
+      <view v-if="loading && !isOpened" class="selected-loading">
+        <slot name="picker-loading" :loading="loading"></slot>
+      </view>
+    </view>
+    <view class="uni-data-tree-cover" v-if="isOpened" @click="handleClose"></view>
+    <view class="uni-data-tree-dialog" v-if="isOpened">
+      <view class="uni-popper__arrow"></view>
+      <view class="dialog-caption">
+        <view class="dialog-title-view">
+          <text class="dialog-title">{{popupTitle}}</text>
+        </view>
+        <view class="dialog-close" @click="handleClose">
+          <view class="dialog-close-plus" data-id="close"></view>
+          <view class="dialog-close-plus dialog-close-rotate" data-id="close"></view>
+        </view>
+      </view>
+      <view ref="pickerView" class="uni-data-pickerview">
+        <view v-if="error!=null" class="error">
+          <text class="error-text">{{error!.errMsg}}</text>
+        </view>
+        <scroll-view v-if="!isCloudDataList" :scroll-x="true">
+          <view class="selected-node-list">
+            <template v-for="(item, index) in selectedNodes">
+              <text class="selected-node-item" :class="{'selected-node-item-active':index==selectedIndex}"
+                @click="onTabSelect(index)">
+                {{item[mappingTextName]}}
+              </text>
+            </template>
+          </view>
+        </scroll-view>
+        <list-view class="list-view" :scroll-y="true">
+          <list-item class="list-item" v-for="(item, _) in currentDataList" @click="onNodeClick(item)">
+            <text class="item-text" :class="{'item-text-disabled': item['disable']}">{{item[mappingTextName]}}</text>
+            <text class="check" v-if="item[mappingValueName] == selectedNodes[selectedIndex][mappingValueName]"></text>
+          </list-item>
+        </list-view>
+        <view class="loading-cover" v-if="loading">
+          <slot name="pickerview-loading" :loading="loading"></slot>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  import { dataPicker } from "../uni-data-pickerview/uni-data-picker.uts"
+
+  /**
+   * DataPicker 级联选择
+   * @description 支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。
+   * @tutorial https://ext.dcloud.net.cn/plugin?id=3796
+   * @property {String} popup-title 弹出窗口标题
+   * @property {Array} localdata 本地数据,参考
+   * @property {Boolean} border = [true|false] 是否有边框
+   * @property {Boolean} readonly = [true|false] 是否仅读
+   * @property {Boolean} preload = [true|false] 是否预加载数据
+   * @value true 开启预加载数据,点击弹出窗口后显示已加载数据
+   * @value false 关闭预加载数据,点击弹出窗口后开始加载数据
+   * @property {Boolean} step-searh = [true|false] 是否分布查询
+   * @value true 启用分布查询,仅查询当前选中节点
+   * @value false 关闭分布查询,一次查询出所有数据
+   * @property {String|DBFieldString} self-field 分布查询当前字段名称
+   * @property {String|DBFieldString} parent-field 分布查询父字段名称
+   * @property {String|DBCollectionString} collection 表名
+   * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割
+   * @property {String} orderby 排序字段及正序倒叙设置
+   * @property {String|JQLString} where 查询条件
+   * @event {Function} popupshow 弹出的选择窗口打开时触发此事件
+   * @event {Function} popuphide 弹出的选择窗口关闭时触发此事件
+   */
+  export default {
+    name: 'UniDataPicker',
+    emits: ['popupopened', 'popupclosed', 'nodeclick', 'change', 'input', 'update:modelValue', 'inputclick'],
+    mixins: [dataPicker],
+    props: {
+      popupTitle: {
+        type: String,
+        default: '请选择'
+      },
+      placeholder: {
+        type: String,
+        default: '请选择'
+      },
+      heightMobile: {
+        type: String,
+        default: ''
+      },
+      readonly: {
+        type: Boolean,
+        default: false
+      },
+      clearIcon: {
+        type: Boolean,
+        default: true
+      },
+      border: {
+        type: Boolean,
+        default: true
+      },
+      split: {
+        type: String,
+        default: '/'
+      },
+      ellipsis: {
+        type: Boolean,
+        default: true
+      }
+    },
+    data() {
+      return {
+        isOpened: false
+      }
+    },
+    computed: {
+      isShowClearIcon() : boolean {
+        if (this.readonly) {
+          return false
+        }
+
+        if (this.clearIcon && this.selectedPaths.length > 0) {
+          return true
+        }
+
+        return false
+      }
+    },
+    created() {
+      this.load()
+    },
+    methods: {
+      clear() {
+      },
+      load() {
+        if (this.isLocalData) {
+          this.loadLocalData()
+        } else if (this.isCloudDataList || this.isCloudDataTree) {
+          this.loadCloudDataPath()
+        }
+      },
+      show() {
+        this.isOpened = true
+        this.$emit('popupopened')
+        if (!this.hasCloudTreeData) {
+          this.loadData()
+        }
+      },
+      hide() {
+        this.isOpened = false
+        this.$emit('popupclosed')
+      },
+      handleInput() {
+        if (this.readonly) {
+          this.$emit('inputclick')
+        } else {
+          this.show()
+        }
+      },
+      handleClose() {
+        this.hide()
+      },
+      onFinish() {
+        this.selectedPaths = this.getChangeNodes()
+        this.$emit('change', this.selectedPaths)
+        this.hide()
+      }
+    }
+  }
+</script>
+
+<style>
+  @import url("../uni-data-pickerview/uni-data-pickerview.css");
+
+  .uni-data-tree {
+    position: relative;
+  }
+
+  .uni-data-tree-input {
+    position: relative;
+  }
+
+  .selected-loading {
+    display: flex;
+    justify-content: center;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+  }
+
+  .error-text {
+    flex: 1;
+    font-size: 12px;
+    color: #DD524D;
+  }
+
+  .input-value {
+    flex-direction: row;
+    align-items: center;
+    flex-wrap: nowrap;
+    padding: 5px 5px;
+    padding-right: 5px;
+    overflow: hidden;
+    min-height: 28px;
+  }
+
+  .input-value-border {
+    border: 1px solid #e5e5e5;
+    border-radius: 5px;
+  }
+
+  .selected-path {
+    flex: 1;
+    flex-direction: row;
+    overflow: hidden;
+  }
+
+  .load-more {
+    width: 40px;
+  }
+
+  .selected-list {
+    flex-direction: row;
+    flex-wrap: nowrap;
+  }
+
+  .selected-item {
+    flex-direction: row;
+    flex-wrap: nowrap;
+  }
+
+  .text-color {
+    font-size: 14px;
+    color: #333;
+  }
+
+  .placeholder {
+    color: grey;
+    font-size: 14px;
+  }
+
+  .input-split-line {
+    opacity: .5;
+    margin-left: 1px;
+    margin-right: 1px;
+  }
+
+  .arrow-area {
+    position: relative;
+    padding: 0 12px;
+    margin-left: auto;
+    justify-content: center;
+    transform: rotate(-45deg);
+    transform-origin: center;
+  }
+
+  .input-arrow {
+    width: 8px;
+    height: 8px;
+    border-left: 2px solid #999;
+    border-bottom: 2px solid #999;
+  }
+
+  .uni-data-tree-cover {
+    position: fixed;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, .4);
+    flex-direction: column;
+    z-index: 100;
+  }
+
+  .uni-data-tree-dialog {
+    position: fixed;
+    left: 0;
+    top: 20%;
+    right: 0;
+    bottom: 0;
+    background-color: #FFFFFF;
+    border-top-left-radius: 10px;
+    border-top-right-radius: 10px;
+    flex-direction: column;
+    z-index: 102;
+    overflow: hidden;
+  }
+
+  .dialog-caption {
+    position: relative;
+    flex-direction: row;
+  }
+
+  .dialog-title-view {
+    flex: 1;
+  }
+
+  .dialog-title {
+    align-self: center;
+    padding: 0 10px;
+    line-height: 44px;
+  }
+
+  .dialog-close {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    flex-direction: row;
+    align-items: center;
+    padding: 0 15px;
+  }
+
+  .dialog-close-plus {
+    width: 16px;
+    height: 2px;
+    background-color: #666;
+    border-radius: 2px;
+    transform: rotate(45deg);
+  }
+
+  .dialog-close-rotate {
+    position: absolute;
+    transform: rotate(-45deg);
+  }
+
+  .uni-data-pickerview {
+    flex: 1;
+  }
+
+  .icon-clear {
+    display: flex;
+    align-items: center;
+  }
+
+  /* #ifdef H5 */
+  @media all and (min-width: 768px) {
+    .uni-data-tree-cover {
+      background-color: transparent;
+    }
+
+    .uni-data-tree-dialog {
+      position: absolute;
+      top: 55px;
+      height: auto;
+      min-height: 400px;
+      max-height: 50vh;
+      background-color: #fff;
+      border: 1px solid #EBEEF5;
+      box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+      border-radius: 4px;
+      overflow: unset;
+    }
+
+    .dialog-caption {
+      display: none;
+    }
+  }
+  /* #endif */
+</style>

File diff suppressed because it is too large
+ 0 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts


+ 693 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts

@@ -0,0 +1,693 @@
+export type PaginationType = {
+  current : number,
+  size : number,
+  count : number
+}
+
+export type LoadMoreType = {
+  contentdown : string,
+  contentrefresh : string,
+  contentnomore : string
+}
+
+export type SelectedItemType = {
+  name : string,
+  value : string,
+}
+
+export type GetCommandOptions = {
+  collection ?: UTSJSONObject,
+  field ?: string,
+  orderby ?: string,
+  where ?: any,
+  pageData ?: string,
+  pageCurrent ?: number,
+  pageSize ?: number,
+  getCount ?: boolean,
+  getTree ?: any,
+  getTreePath ?: UTSJSONObject,
+  startwith ?: string,
+  limitlevel ?: number,
+  groupby ?: string,
+  groupField ?: string,
+  distinct ?: boolean,
+  pageIndistinct ?: boolean,
+  foreignKey ?: string,
+  loadtime ?: string,
+  manual ?: boolean
+}
+
+const DefaultSelectedNode = {
+  text: '请选择',
+  value: ''
+}
+
+export const dataPicker = defineMixin({
+  props: {
+    localdata: {
+      type: Array as PropType<Array<UTSJSONObject>>,
+      default: [] as Array<UTSJSONObject>
+    },
+    collection: {
+      type: Object,
+      default: ''
+    },
+    field: {
+      type: String,
+      default: ''
+    },
+    orderby: {
+      type: String,
+      default: ''
+    },
+    where: {
+      type: Object,
+      default: ''
+    },
+    pageData: {
+      type: String,
+      default: 'add'
+    },
+    pageCurrent: {
+      type: Number,
+      default: 1
+    },
+    pageSize: {
+      type: Number,
+      default: 20
+    },
+    getcount: {
+      type: Boolean,
+      default: false
+    },
+    gettree: {
+      type: Object,
+      default: ''
+    },
+    gettreepath: {
+      type: Object,
+      default: ''
+    },
+    startwith: {
+      type: String,
+      default: ''
+    },
+    limitlevel: {
+      type: Number,
+      default: 10
+    },
+    groupby: {
+      type: String,
+      default: ''
+    },
+    groupField: {
+      type: String,
+      default: ''
+    },
+    distinct: {
+      type: Boolean,
+      default: false
+    },
+    pageIndistinct: {
+      type: Boolean,
+      default: false
+    },
+    foreignKey: {
+      type: String,
+      default: ''
+    },
+    loadtime: {
+      type: String,
+      default: 'auto'
+    },
+    manual: {
+      type: Boolean,
+      default: false
+    },
+    preload: {
+      type: Boolean,
+      default: false
+    },
+    stepSearh: {
+      type: Boolean,
+      default: true
+    },
+    selfField: {
+      type: String,
+      default: ''
+    },
+    parentField: {
+      type: String,
+      default: ''
+    },
+    multiple: {
+      type: Boolean,
+      default: false
+    },
+    value: {
+      type: Object,
+      default: ''
+    },
+    modelValue: {
+      type: Object,
+      default: ''
+    },
+    defaultProps: {
+      type: Object as PropType<UTSJSONObject>,
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      error: null as UniCloudError | null,
+      treeData: [] as Array<UTSJSONObject>,
+      selectedIndex: 0,
+      selectedNodes: [] as Array<UTSJSONObject>,
+      selectedPages: [] as Array<UTSJSONObject>[],
+      selectedValue: '',
+      selectedPaths: [] as Array<UTSJSONObject>,
+      pagination: {
+        current: 1,
+        size: 20,
+        count: 0
+      } as PaginationType
+    }
+  },
+  computed: {
+    mappingTextName() : string {
+      // TODO
+      return (this.defaultProps != null) ? this.defaultProps!.getString('text', 'text') : 'text'
+    },
+    mappingValueName() : string {
+      // TODO
+      return (this.defaultProps != null) ? this.defaultProps!.getString('value', 'value') : 'value'
+    },
+    currentDataList() : Array<UTSJSONObject> {
+      if (this.selectedIndex > this.selectedPages.length - 1) {
+        return [] as Array<UTSJSONObject>
+      }
+      return this.selectedPages[this.selectedIndex]
+    },
+    isLocalData() : boolean {
+      return this.localdata.length > 0
+    },
+    isCloudData() : boolean {
+      return this._checkIsNotNull(this.collection)
+    },
+    isCloudDataList() : boolean {
+      return (this.isCloudData && (this.parentField.length == 0 && this.selfField.length == 0))
+    },
+    isCloudDataTree() : boolean {
+      return (this.isCloudData && this.parentField.length > 0 && this.selfField.length > 0)
+    },
+    dataValue() : any {
+      return this.hasModelValue ? this.modelValue : this.value
+    },
+    hasCloudTreeData() : boolean {
+      return this.treeData.length > 0
+    },
+    hasModelValue() : boolean {
+      if (typeof this.modelValue == 'string') {
+        const valueString = this.modelValue as string
+        return (valueString.length > 0)
+      } else if (Array.isArray(this.modelValue)) {
+        const valueArray = this.modelValue as Array<string>
+        return (valueArray.length > 0)
+      }
+      return false
+    },
+    hasCloudDataValue() : boolean {
+      if (typeof this.dataValue == 'string') {
+        const valueString = this.dataValue as string
+        return (valueString.length > 0)
+      }
+      return false
+    }
+  },
+  created() {
+    this.pagination.current = this.pageCurrent
+    this.pagination.size = this.pageSize
+
+    this.$watch(
+      () : any => [
+        this.pageCurrent,
+        this.pageSize,
+        this.localdata,
+        this.value,
+        this.collection,
+        this.field,
+        this.getcount,
+        this.orderby,
+        this.where,
+        this.groupby,
+        this.groupField,
+        this.distinct
+      ],
+      (newValue : Array<any>, oldValue : Array<any>) => {
+        this.pagination.size = this.pageSize
+        if (newValue[0] !== oldValue[0]) {
+          this.pagination.current = this.pageCurrent
+        }
+
+        this.onPropsChange()
+      }
+    )
+  },
+  methods: {
+    onPropsChange() {
+      this.selectedIndex = 0
+      this.treeData.length = 0
+      this.selectedNodes.length = 0
+      this.selectedPages.length = 0
+      this.selectedPaths.length = 0
+
+      // 加载数据
+      this.$nextTick(() => {
+        this.loadData()
+      })
+    },
+
+    onTabSelect(index : number) {
+      this.selectedIndex = index
+    },
+
+    onNodeClick(nodeData : UTSJSONObject) {
+      if (nodeData.getBoolean('disable', false)) {
+        return
+      }
+
+      const isLeaf = this._checkIsLeafNode(nodeData)
+
+      this._trimSelectedNodes(nodeData)
+
+      this.$emit('nodeclick', nodeData)
+
+      if (this.isLocalData) {
+        if (isLeaf || !this._checkHasChildren(nodeData)) {
+          this.onFinish()
+        }
+      } else if (this.isCloudDataList) {
+        this.onFinish()
+      } else if (this.isCloudDataTree) {
+        if (isLeaf) {
+          this.onFinish()
+        } else if (!this._checkHasChildren(nodeData)) {
+          // 尝试请求一次,如果没有返回数据标记为叶子节点
+          this.loadCloudDataNode(nodeData)
+        }
+      }
+    },
+
+    getChangeNodes(): Array<UTSJSONObject> {
+      const nodes: Array<UTSJSONObject> = []
+      this.selectedNodes.forEach((node : UTSJSONObject) => {
+        const newNode: UTSJSONObject = {}
+        newNode[this.mappingTextName] = node.getString(this.mappingTextName)
+        newNode[this.mappingValueName] = node.getString(this.mappingValueName)
+        nodes.push(newNode)
+      })
+      return nodes
+    },
+
+    onFinish() { },
+
+    // 加载数据(自动判定环境)
+    loadData() {
+      if (this.isLocalData) {
+        this.loadLocalData()
+      } else if (this.isCloudDataList) {
+        this.loadCloudDataList()
+      } else if (this.isCloudDataTree) {
+        this.loadCloudDataTree()
+      }
+    },
+
+    // 加载本地数据
+    loadLocalData() {
+      this.treeData = this.localdata
+      if (Array.isArray(this.dataValue)) {
+        const value = this.dataValue as Array<UTSJSONObject>
+        this.selectedPaths = value.slice(0)
+        this._pushSelectedTreeNodes(value, this.localdata)
+      } else {
+        this._pushSelectedNodes(this.localdata)
+      }
+    },
+
+    // 加载 Cloud 数据 (单列)
+    loadCloudDataList() {
+      this._loadCloudData(null, (data : Array<UTSJSONObject>) => {
+        this.treeData = data
+        this._pushSelectedNodes(data)
+      })
+    },
+
+    // 加载 Cloud 数据 (树形)
+    loadCloudDataTree() {
+      let commandOptions = {
+        field: this._cloudDataPostField(),
+        where: this._cloudDataTreeWhere(),
+        getTree: true
+      } as GetCommandOptions
+      if (this._checkIsNotNull(this.gettree)) {
+        commandOptions.startwith = `${this.selfField}=='${this.dataValue as string}'`
+      }
+      this._loadCloudData(commandOptions, (data : Array<UTSJSONObject>) => {
+        this.treeData = data
+        if (this.selectedPaths.length > 0) {
+          this._pushSelectedTreeNodes(this.selectedPaths, data)
+        } else {
+          this._pushSelectedNodes(data)
+        }
+      })
+    },
+
+    // 加载 Cloud 数据 (节点)
+    loadCloudDataNode(nodeData : UTSJSONObject) {
+      const commandOptions = {
+        field: this._cloudDataPostField(),
+        where: this._cloudDataNodeWhere()
+      } as GetCommandOptions
+      this._loadCloudData(commandOptions, (data : Array<UTSJSONObject>) => {
+        nodeData['children'] = data
+        if (data.length == 0) {
+          nodeData['isleaf'] = true
+          this.onFinish()
+        } else {
+          this._pushSelectedNodes(data)
+        }
+      })
+    },
+
+    // 回显 Cloud Tree Path
+    loadCloudDataPath() {
+      if (!this.hasCloudDataValue) {
+        return
+      }
+
+      const command : GetCommandOptions = {}
+
+      // 单列
+      if (this.isCloudDataList) {
+        // 根据 field's as value标识匹配 where 条件
+        let where : Array<string> = [];
+        let whereField = this._getForeignKeyByField();
+        if (whereField.length > 0) {
+          where.push(`${whereField} == '${this.dataValue as string}'`)
+        }
+
+        let whereString = where.join(' || ')
+        if (this._checkIsNotNull(this.where)) {
+          whereString = `(${this.where}) && (${whereString})`
+        }
+
+        command.field = this._cloudDataPostField()
+        command.where = whereString
+      }
+
+      // 树形
+      if (this.isCloudDataTree) {
+        command.field = this._cloudDataPostField()
+        command.getTreePath = {
+          startWith: `${this.selfField}=='${this.dataValue as string}'`
+        }
+      }
+
+      this._loadCloudData(command, (data : Array<UTSJSONObject>) => {
+        this._extractTreePath(data, this.selectedPaths)
+      })
+    },
+
+    _loadCloudData(options ?: GetCommandOptions, callback ?: ((data : Array<UTSJSONObject>) => void)) {
+      if (this.loading) {
+        return
+      }
+      this.loading = true
+
+      this.error = null
+
+      this._getCommand(options).then((response : UniCloudDBGetResult) => {
+        callback?.(response.data)
+      }).catch((err : any | null) => {
+        this.error = err as UniCloudError
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+
+    _cloudDataPostField() : string {
+      let fields = [this.field];
+      if (this.parentField.length > 0) {
+        fields.push(`${this.parentField} as parent_value`)
+      }
+      return fields.join(',')
+    },
+
+    _cloudDataTreeWhere() : string {
+      let result : Array<string> = []
+      let selectedNodes = this.selectedNodes.length > 0 ? this.selectedNodes : this.selectedPaths
+      let parentField = this.parentField
+      if (parentField.length > 0) {
+        result.push(`${parentField} == null || ${parentField} == ""`)
+      }
+      if (selectedNodes.length > 0) {
+        for (var i = 0; i < selectedNodes.length - 1; i++) {
+          const parentFieldValue = selectedNodes[i].getString('value', '')
+          result.push(`${parentField} == '${parentFieldValue}'`)
+        }
+      }
+
+      let where : Array<string> = []
+      if (this._checkIsNotNull(this.where)) {
+        where.push(`(${this.where as string})`)
+      }
+
+      if (result.length > 0) {
+        where.push(`(${result.join(' || ')})`)
+      }
+
+      return where.join(' && ')
+    },
+
+    _cloudDataNodeWhere() : string {
+      const where : Array<string> = []
+      if (this.selectedNodes.length > 0) {
+        const value = this.selectedNodes[this.selectedNodes.length - 1].getString('value', '')
+        where.push(`${this.parentField} == '${value}'`)
+      }
+
+      let whereString = where.join(' || ')
+      if (this._checkIsNotNull(this.where)) {
+        return `(${this.where as string}) && (${whereString})`
+      }
+
+      return whereString
+    },
+
+    _getWhereByForeignKey() : string {
+      let result : Array<string> = []
+      let whereField = this._getForeignKeyByField();
+      if (whereField.length > 0) {
+        result.push(`${whereField} == '${this.dataValue as string}'`)
+      }
+
+      if (this._checkIsNotNull(this.where)) {
+        return `(${this.where}) && (${result.join(' || ')})`
+      }
+
+      return result.join(' || ')
+    },
+
+    _getForeignKeyByField() : string {
+      const fields = this.field.split(',')
+      let whereField = ''
+      for (let i = 0; i < fields.length; i++) {
+        const items = fields[i].split('as')
+        if (items.length < 2) {
+          continue
+        }
+        if (items[1].trim() === 'value') {
+          whereField = items[0].trim()
+          break
+        }
+      }
+      return whereField
+    },
+
+    _getCommand(options ?: GetCommandOptions) : Promise<UniCloudDBGetResult> {
+      let db = uniCloud.databaseForJQL()
+
+      let collection = Array.isArray(this.collection) ? db.collection(...(this.collection as Array<any>)) : db.collection(this.collection)
+
+      let filter : UniCloudDBFilter | null = null
+      if (this.foreignKey.length > 0) {
+        filter = collection.foreignKey(this.foreignKey)
+      }
+
+      const where : any = options?.where ?? this.where
+      if (typeof where == 'string') {
+        const whereString = where as string
+        if (whereString.length > 0) {
+          filter = (filter != null) ? filter.where(where) : collection.where(where)
+        }
+      } else {
+        filter = (filter != null) ? filter.where(where) : collection.where(where)
+      }
+
+      let query : UniCloudDBQuery | null = null
+      if (this.field.length > 0) {
+        query = (filter != null) ? filter.field(this.field) : collection.field(this.field)
+      }
+      if (this.groupby.length > 0) {
+        if (query != null) {
+          query = query.groupBy(this.groupby)
+        } else if (filter != null) {
+          query = filter.groupBy(this.groupby)
+        }
+      }
+      if (this.groupField.length > 0) {
+        if (query != null) {
+          query = query.groupField(this.groupField)
+        } else if (filter != null) {
+          query = filter.groupField(this.groupField)
+        }
+      }
+      if (this.distinct == true) {
+        if (query != null) {
+          query = query.distinct(this.field)
+        } else if (filter != null) {
+          query = filter.distinct(this.field)
+        }
+      }
+      if (this.orderby.length > 0) {
+        if (query != null) {
+          query = query.orderBy(this.orderby)
+        } else if (filter != null) {
+          query = filter.orderBy(this.orderby)
+        }
+      }
+
+      const size = this.pagination.size
+      const current = this.pagination.current
+      if (query != null) {
+        query = query.skip(size * (current - 1)).limit(size)
+      } else if (filter != null) {
+        query = filter.skip(size * (current - 1)).limit(size)
+      } else {
+        query = collection.skip(size * (current - 1)).limit(size)
+      }
+
+      const getOptions = {}
+      const treeOptions = {
+        limitLevel: this.limitlevel,
+        startWith: this.startwith
+      }
+      if (this.getcount == true) {
+        getOptions['getCount'] = this.getcount
+      }
+
+      const getTree : any = options?.getTree ?? this.gettree
+      if (typeof getTree == 'string') {
+        const getTreeString = getTree as string
+        if (getTreeString.length > 0) {
+          getOptions['getTree'] = treeOptions
+        }
+      } else if (typeof getTree == 'object') {
+        getOptions['getTree'] = treeOptions
+      } else {
+        getOptions['getTree'] = getTree
+      }
+
+      const getTreePath = options?.getTreePath ?? this.gettreepath
+      if (typeof getTreePath == 'string') {
+        const getTreePathString = getTreePath as string
+        if (getTreePathString.length > 0) {
+          getOptions['getTreePath'] = getTreePath
+        }
+      } else {
+        getOptions['getTreePath'] = getTreePath
+      }
+
+      return query.get(getOptions)
+    },
+
+    _checkIsNotNull(value : any) : boolean {
+      if (typeof value == 'string') {
+        const valueString = value as string
+        return (valueString.length > 0)
+      } else if (value instanceof UTSJSONObject) {
+        return true
+      }
+      return false
+    },
+
+    _checkIsLeafNode(nodeData : UTSJSONObject) : boolean {
+      if (this.selectedIndex >= this.limitlevel) {
+        return true
+      }
+
+      if (nodeData.getBoolean('isleaf', false)) {
+        return true
+      }
+
+      return false
+    },
+
+    _checkHasChildren(nodeData : UTSJSONObject) : boolean {
+      const children = nodeData.getArray('children') ?? ([] as Array<any>)
+      return children.length > 0
+    },
+
+    _pushSelectedNodes(nodes : Array<UTSJSONObject>) {
+      this.selectedNodes.push(DefaultSelectedNode)
+      this.selectedPages.push(nodes)
+      this.selectedIndex = this.selectedPages.length - 1
+    },
+
+    _trimSelectedNodes(nodeData : UTSJSONObject) {
+      this.selectedNodes.splice(this.selectedIndex)
+      this.selectedNodes.push(nodeData)
+
+      if (this.selectedPages.length > 0) {
+        this.selectedPages.splice(this.selectedIndex + 1)
+      }
+
+      const children = nodeData.getArray<UTSJSONObject>('children') ?? ([] as Array<UTSJSONObject>)
+      if (children.length > 0) {
+        this.selectedNodes.push(DefaultSelectedNode)
+        this.selectedPages.push(children)
+      }
+
+      this.selectedIndex = this.selectedPages.length - 1
+    },
+
+    _pushSelectedTreeNodes(paths : Array<UTSJSONObject>, nodes : Array<UTSJSONObject>) {
+      let children : Array<UTSJSONObject> = nodes
+      paths.forEach((node : UTSJSONObject) => {
+        const findNode = children.find((item : UTSJSONObject) : boolean => {
+          return (item.getString(this.mappingValueName) == node.getString(this.mappingValueName))
+        })
+        if (findNode != null) {
+          this.selectedPages.push(children)
+          this.selectedNodes.push(node)
+          children = findNode.getArray<UTSJSONObject>('children') ?? ([] as Array<UTSJSONObject>)
+        }
+      })
+      this.selectedIndex = this.selectedPages.length - 1
+    },
+
+    _extractTreePath(nodes : Array<UTSJSONObject>, result : Array<UTSJSONObject>) {
+      if (nodes.length == 0) {
+        return
+      }
+
+      const node = nodes[0]
+      result.push(node)
+
+      const children = node.getArray<UTSJSONObject>('children')
+      if (Array.isArray(children) && children!.length > 0) {
+        this._extractTreePath(children, result)
+      }
+    }
+  }
+})

+ 76 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css

@@ -0,0 +1,76 @@
+.uni-data-pickerview {
+  position: relative;
+  flex-direction: column;
+  overflow: hidden;
+}
+
+.loading-cover {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  align-items: center;
+  justify-content: center;
+  background-color: rgba(150, 150, 150, .1);
+}
+
+.error {
+  background-color: #fff;
+  padding: 15px;
+}
+
+.error-text {
+  color: #DD524D;
+}
+
+.selected-node-list {
+  flex-direction: row;
+  flex-wrap: nowrap;
+}
+
+.selected-node-item {
+  margin-left: 10px;
+  margin-right: 10px;
+  padding: 8px 10px 8px 10px;
+  border-bottom: 2px solid transparent;
+}
+
+.selected-node-item-active {
+  color: #007aff;
+  border-bottom-color: #007aff;
+}
+
+.list-view {
+  flex: 1;
+}
+
+.list-item {
+  flex-direction: row;
+  justify-content: space-between;
+  padding: 12px 15px;
+  border-bottom: 1px solid #f0f0f0;
+}
+
+.item-text {
+  color: #333333;
+}
+
+.item-text-disabled {
+  opacity: .5;
+}
+
+.item-text-overflow {
+  overflow: hidden;
+}
+
+.check {
+  margin-right: 5px;
+  border: 2px solid #007aff;
+  border-left: 0;
+  border-top: 0;
+  height: 12px;
+  width: 6px;
+  transform-origin: center;
+  transform: rotate(45deg);
+}

+ 69 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue

@@ -0,0 +1,69 @@
+<template>
+  <view class="uni-data-pickerview">
+    <view v-if="error!=null" class="error">
+      <text class="error-text">{{error!.errMsg}}</text>
+    </view>
+    <scroll-view v-if="!isCloudDataList" :scroll-x="true">
+      <view class="selected-node-list">
+        <template v-for="(item, index) in selectedNodes">
+          <text class="selected-node-item" :class="{'selected-node-item-active':index==selectedIndex}"
+            @click="onTabSelect(index)">
+            {{item[mappingTextName]}}
+          </text>
+        </template>
+      </view>
+    </scroll-view>
+    <list-view class="list-view" :scroll-y="true">
+      <list-item class="list-item" v-for="(item, _) in currentDataList" @click="onNodeClick(item)">
+        <text class="item-text" :class="{'item-text-disabled': item['disable']}">{{item[mappingTextName]}}</text>
+        <text class="check" v-if="item[mappingValueName] == selectedNodes[selectedIndex][mappingValueName]"></text>
+      </list-item>
+    </list-view>
+    <view class="loading-cover" v-if="loading">
+      <slot name="pickerview-loading" :loading="loading"></slot>
+    </view>
+  </view>
+</template>
+
+<script>
+  import { dataPicker } from "./uni-data-picker.uts"
+
+  /**
+   * DataPickerview
+   * @description uni-data-pickerview
+   * @tutorial https://ext.dcloud.net.cn/plugin?id=3796
+   * @property {Array} localdata 本地数据,参考
+   * @property {Boolean} step-searh = [true|false] 是否分布查询
+   * @value true 启用分布查询,仅查询当前选中节点
+   * @value false 关闭分布查询,一次查询出所有数据
+   * @property {String|DBFieldString} self-field 分布查询当前字段名称
+   * @property {String|DBFieldString} parent-field 分布查询父字段名称
+   * @property {String|DBCollectionString} collection 表名
+   * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割
+   * @property {String} orderby 排序字段及正序倒叙设置
+   * @property {String|JQLString} where 查询条件
+   */
+  export default {
+    name: 'UniDataPickerView',
+    emits: ['nodeclick', 'change', 'update:modelValue'],
+    mixins: [dataPicker],
+    props: {
+      ellipsis: {
+        type: Boolean,
+        default: true
+      }
+    },
+    created() {
+      this.loadData()
+    },
+    methods: {
+      onFinish() {
+        this.$emit('change', this.getChangeNodes())
+      }
+    }
+  }
+</script>
+
+<style>
+  @import url("uni-data-pickerview.css");
+</style>

+ 4 - 3
uni_modules/uni-data-picker/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-data-picker",
   "displayName": "uni-data-picker 数据驱动的picker选择器",
-  "version": "1.1.2",
+  "version": "2.0.0",
   "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景",
   "keywords": [
     "uni-ui",
@@ -53,7 +53,8 @@
       "client": {
         "App": {
           "app-vue": "y",
-          "app-nvue": "u"
+          "app-nvue": "y",
+          "app-uvue": "y"
         },
         "H5-mobile": {
           "Safari": "y",
@@ -87,4 +88,4 @@
       }
     }
   }
-}
+}

+ 1 - 1
uni_modules/uni-data-picker/readme.md

@@ -19,4 +19,4 @@
 在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。
 
 ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker)
-#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839

+ 2 - 0
uni_modules/uni-data-select/changelog.md

@@ -1,3 +1,5 @@
+## 1.0.7(2024-01-20)
+- 修复 长文本回显超过容器的bug,超过容器部分显示省略号
 ## 1.0.6(2023-04-12)
 - 修复 微信小程序点击时会改变背景颜色的 bug
 ## 1.0.5(2023-02-03)

+ 12 - 2
uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue

@@ -4,7 +4,7 @@
 		<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
 			<view class="uni-select" :class="{'uni-select--disabled':disabled}">
 				<view class="uni-select__input-box" @click="toggleSelector">
-					<view v-if="current" class="uni-select__input-text">{{current}}</view>
+					<view v-if="current" class="uni-select__input-text">{{textShow}}</view>
 					<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
 					<view v-if="current && clear && !disabled" @click.stop="clearVal" >
 						<uni-icons type="clear" color="#c0c4cc" size="24"/>
@@ -132,8 +132,17 @@
 				// #ifndef VUE3
 				return this.value;
 				// #endif
+			},
+			textShow(){
+				// 长文本显示
+				let text = this.current;
+				if (text.length > 10) {
+					return text.slice(0, 25) + '...';
+				}
+				return text;
 			}
 		},
+
 		watch: {
 			localdata: {
 				immediate: true,
@@ -153,7 +162,8 @@
 						this.initDefVal()
 					}
 				}
-			}
+			},
+
 		},
 		methods: {
 			debounce(fn, time = 100){

+ 1 - 1
uni_modules/uni-data-select/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-data-select",
   "displayName": "uni-data-select 下拉框选择器",
-  "version": "1.0.6",
+  "version": "1.0.7",
   "description": "通过数据驱动的下拉框选择器",
   "keywords": [
     "uni-ui",

+ 17 - 7
uni_modules/uni-datetime-picker/changelog.md

@@ -1,20 +1,30 @@
+## 2.2.29(2024-01-20)
+- 新增 show事件,弹窗弹出时触发该事件 [详情](https://github.com/dcloudio/uni-app/issues/4694)
+## 2.2.28(2024-01-18)
+- 去除 noChange事件,当进行日期范围选择时,若只选了一天,则开始结束日期都为同一天 [详情](https://github.com/dcloudio/uni-ui/issues/815)
+## 2.2.27(2024-01-10)
+- 优化 增加noChange事件,当进行日期范围选择时,若有空值,则触发该事件 [详情](https://github.com/dcloudio/uni-ui/issues/815)
+## 2.2.26(2024-01-08)
+- 修复 字节小程序时间选择范围器失效问题 [详情](https://github.com/dcloudio/uni-ui/issues/834)
+## 2.2.25(2023-10-18)
+- 修复 PC端初次修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737)
 ## 2.2.24(2023-06-02)
 - 修复 部分情况修改时间,开始、结束时间显示异常的Bug [详情](https://ask.dcloud.net.cn/question/171146)
-- 优化 当前月可以选择上月、下月的日期
+- 优化 当前月可以选择上月、下月的日期的Bug
 ## 2.2.23(2023-05-02)
-- 修复 部分情况修改时间,开始时间未更新 [详情](https://github.com/dcloudio/uni-ui/issues/737)
-- 修复 部分平台及设备第一次点击无法显示弹框
-- 修复 ios 日期格式未补零显示及使用异常 [详情](https://ask.dcloud.net.cn/question/162979)
+- 修复 部分情况修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737)
+- 修复 部分平台及设备第一次点击无法显示弹框的Bug
+- 修复 ios 日期格式未补零显示及使用异常的Bug [详情](https://ask.dcloud.net.cn/question/162979)
 ## 2.2.22(2023-03-30)
-- 修复 日历 picker 修改年月后,自动选中当月1日 [详情](https://ask.dcloud.net.cn/question/165937)
-- 修复 小程序端 低版本 ios NaN [详情](https://ask.dcloud.net.cn/question/162979)
+- 修复 日历 picker 修改年月后,自动选中当月1日的Bug [详情](https://ask.dcloud.net.cn/question/165937)
+- 修复 小程序端 低版本 ios NaN的Bug [详情](https://ask.dcloud.net.cn/question/162979)
 ## 2.2.21(2023-02-20)
 - 修复 firefox 浏览器显示区域点击无法拉起日历弹框的Bug [详情](https://ask.dcloud.net.cn/question/163362)
 ## 2.2.20(2023-02-17)
 - 优化 值为空依然选中当天问题
 - 优化 提供 default-value 属性支持配置选择器打开时默认显示的时间
 - 优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间
-- 优化 字节小程序日期时间范围选择,底部日期换行问题
+- 优化 字节小程序日期时间范围选择,底部日期换行的Bug
 ## 2.2.19(2023-02-09)
 - 修复 2.2.18 引起范围选择配置 end 选择无效的Bug [详情](https://github.com/dcloudio/uni-ui/issues/686)
 ## 2.2.18(2023-02-08)

+ 0 - 1
uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue

@@ -586,7 +586,6 @@
 				this.tempSingleDate = this.calendar.fullDate
 				const beforeDate = new Date(this.cale.multipleStatus.before).getTime()
 				const afterDate = new Date(this.cale.multipleStatus.after).getTime()
-        // 如果先选择结束日期,后选择开始日期,需要交换
 				if (beforeDate > afterDate && afterDate) {
 					this.tempRange.before = this.cale.multipleStatus.after
 					this.tempRange.after = this.cale.multipleStatus.before

+ 211 - 198
uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue

@@ -2,22 +2,20 @@
 	<view class="uni-date">
 		<view class="uni-date-editor" @click="show">
 			<slot>
-				<view
-          class="uni-date-editor--x"
-          :class="{'uni-date-editor--x__disabled': disabled,'uni-date-x--border': border}"
-        >
+				<view class="uni-date-editor--x"
+					:class="{'uni-date-editor--x__disabled': disabled,'uni-date-x--border': border}">
 					<view v-if="!isRange" class="uni-date-x uni-date-single">
 						<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
 						<view class="uni-date__x-input">{{ displayValue || singlePlaceholderText }}</view>
 					</view>
 
 					<view v-else class="uni-date-x uni-date-range">
-            <uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
-            <view class="uni-date__x-input text-center">{{ displayRangeValue.startDate || startPlaceholderText }}</view>
+						<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
+						<view class="uni-date__x-input text-center">{{ displayRangeValue.startDate || startPlaceholderText }}</view>
 
-            <view class="range-separator">{{rangeSeparator}}</view>
+						<view class="range-separator">{{rangeSeparator}}</view>
 
-            <view class="uni-date__x-input text-center">{{ displayRangeValue.endDate || endPlaceholderText }}</view>
+						<view class="uni-date__x-input text-center">{{ displayRangeValue.endDate || endPlaceholderText }}</view>
 					</view>
 
 					<view v-if="showClearIcon" class="uni-date__icon-clear" @click.stop="clear">
@@ -34,8 +32,7 @@
 				<view class="uni-popper__arrow"></view>
 
 				<view v-if="hasTime" class="uni-date-changed popup-x-header">
-					<input class="uni-date__input text-center" type="text" v-model="inputDate"
-						:placeholder="selectDateText" />
+					<input class="uni-date__input text-center" type="text" v-model="inputDate" :placeholder="selectDateText" />
 
 					<time-picker type="time" v-model="pickerTime" :border="false" :disabled="!inputDate"
 						:start="timepickerStartTime" :end="timepickerEndTime" :hideSecond="hideSecond" style="width: 100%;">
@@ -45,8 +42,7 @@
 				</view>
 
 				<Calendar ref="pcSingle" :showMonth="false" :start-date="calendarRange.startDate"
-					:end-date="calendarRange.endDate" :date="calendarDate" @change="singleChange"
-          :default-value="defaultValue"
+					:end-date="calendarRange.endDate" :date="calendarDate" @change="singleChange" :default-value="defaultValue"
 					style="padding: 0 8px;" />
 
 				<view v-if="hasTime" class="popup-x-footer">
@@ -58,18 +54,17 @@
 				<view class="uni-popper__arrow"></view>
 				<view v-if="hasTime" class="popup-x-header uni-date-changed">
 					<view class="popup-x-header--datetime">
-            <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startDate"
-            :placeholder="startDateText" />
+						<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startDate"
+							:placeholder="startDateText" />
 
 						<time-picker type="time" v-model="tempRange.startTime" :start="timepickerStartTime" :border="false"
-            :disabled="!tempRange.startDate" :hideSecond="hideSecond">
-            <input class="uni-date__input uni-date-range__input" type="text"
-            v-model="tempRange.startTime" :placeholder="startTimeText"
-            :disabled="!tempRange.startDate" />
-          </time-picker>
-        </view>
+							:disabled="!tempRange.startDate" :hideSecond="hideSecond">
+							<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startTime"
+								:placeholder="startTimeText" :disabled="!tempRange.startDate" />
+						</time-picker>
+					</view>
 
-        <uni-icons type="arrowthinright" color="#999" style="line-height: 40px;"></uni-icons>
+					<uni-icons type="arrowthinright" color="#999" style="line-height: 40px;"></uni-icons>
 
 					<view class="popup-x-header--datetime">
 						<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endDate"
@@ -85,12 +80,11 @@
 
 				<view class="popup-x-body">
 					<Calendar ref="left" :showMonth="false" :start-date="calendarRange.startDate"
-            :end-date="calendarRange.endDate" :range="true" :pleStatus="endMultipleStatus"
-            @change="leftChange" @firstEnterCale="updateRightCale" style="padding: 0 8px;" />
+						:end-date="calendarRange.endDate" :range="true" :pleStatus="endMultipleStatus" @change="leftChange"
+						@firstEnterCale="updateRightCale" style="padding: 0 8px;" />
 					<Calendar ref="right" :showMonth="false" :start-date="calendarRange.startDate"
-						:end-date="calendarRange.endDate" :range="true" @change="rightChange"
-						:pleStatus="startMultipleStatus" @firstEnterCale="updateLeftCale"
-						style="padding: 0 8px;border-left: 1px solid #F1F1F1;" />
+						:end-date="calendarRange.endDate" :range="true" @change="rightChange" :pleStatus="startMultipleStatus"
+						@firstEnterCale="updateLeftCale" style="padding: 0 8px;border-left: 1px solid #F1F1F1;" />
 				</view>
 
 				<view v-if="hasTime" class="popup-x-footer">
@@ -102,8 +96,7 @@
 
 		<Calendar v-if="isPhone" ref="mobile" :clearDate="false" :date="calendarDate" :defTime="mobileCalendarTime"
 			:start-date="calendarRange.startDate" :end-date="calendarRange.endDate" :selectableTimes="mobSelectableTime"
-      :startPlaceholder="startPlaceholder" :endPlaceholder="endPlaceholder"
-      :default-value="defaultValue"
+			:startPlaceholder="startPlaceholder" :endPlaceholder="endPlaceholder" :default-value="defaultValue"
 			:pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :hasTime="hasTime" :insert="false"
 			:hideSecond="hideSecond" @confirm="mobileChange" @maskClose="close" />
 	</view>
@@ -133,9 +126,19 @@
 	 **/
 	import Calendar from './calendar.vue'
 	import TimePicker from './time-picker.vue'
-	import { initVueI18n } from '@dcloudio/uni-i18n'
+	import {
+		initVueI18n
+	} from '@dcloudio/uni-i18n'
 	import i18nMessages from './i18n/index.js'
-  import { getDateTime, getDate, getTime, getDefaultSecond, dateCompare, checkDate, fixIosDateFormat } from './util'
+	import {
+		getDateTime,
+		getDate,
+		getTime,
+		getDefaultSecond,
+		dateCompare,
+		checkDate,
+		fixIosDateFormat
+	} from './util'
 
 	export default {
 		name: 'UniDatetimePicker',
@@ -188,7 +191,7 @@
 				isEmitValue: false,
 				isPhone: false,
 				isFirstShow: true,
-        i18nT: () => {}
+				i18nT: () => {}
 			}
 		},
 		props: {
@@ -221,7 +224,7 @@
 				default: ''
 			},
 			startPlaceholder: {
-        type: String,
+				type: String,
 				default: ''
 			},
 			endPlaceholder: {
@@ -248,16 +251,16 @@
 				type: [Boolean],
 				default: false
 			},
-      defaultValue: {
-        type: [String, Object, Array],
-        default: ''
-      }
+			defaultValue: {
+				type: [String, Object, Array],
+				default: ''
+			}
 		},
 		watch: {
 			type: {
 				immediate: true,
 				handler(newVal) {
-          this.hasTime = newVal.indexOf('time') !== -1
+					this.hasTime = newVal.indexOf('time') !== -1
 					this.isRange = newVal.indexOf('range') !== -1
 				}
 			},
@@ -348,9 +351,9 @@
 			selectDateText() {
 				return this.i18nT("uni-datetime-picker.selectDate")
 			},
-      selectDateTimeText() {
-        return this.i18nT("uni-datetime-picker.selectDateTime")
-      },
+			selectDateTimeText() {
+				return this.i18nT("uni-datetime-picker.selectDateTime")
+			},
 			selectTimeText() {
 				return this.i18nT("uni-datetime-picker.selectTime")
 			},
@@ -373,18 +376,19 @@
 				return this.i18nT("uni-datetime-picker.clear")
 			},
 			showClearIcon() {
-				return this.clearIcon && !this.disabled && (this.displayValue || (this.displayRangeValue.startDate && this.displayRangeValue.endDate))
+				return this.clearIcon && !this.disabled && (this.displayValue || (this.displayRangeValue.startDate && this
+					.displayRangeValue.endDate))
 			}
 		},
 		created() {
 			this.initI18nT()
-      this.platform()
+			this.platform()
 		},
 		methods: {
-      initI18nT() {
-        const vueI18n = initVueI18n(i18nMessages)
-        this.i18nT = vueI18n.t
-      },
+			initI18nT() {
+				const vueI18n = initVueI18n(i18nMessages)
+				this.i18nT = vueI18n.t
+			},
 			initPicker(newVal) {
 				if ((!newVal && !this.defaultValue) || Array.isArray(newVal) && !newVal.length) {
 					this.$nextTick(() => {
@@ -394,26 +398,26 @@
 				}
 
 				if (!Array.isArray(newVal) && !this.isRange) {
-          if(newVal){
-            this.displayValue = this.inputDate = this.calendarDate = getDate(newVal)
-            if (this.hasTime) {
-              this.pickerTime = getTime(newVal, this.hideSecond)
-              this.displayValue = `${this.displayValue} ${this.pickerTime}`
-            }
-          }else if(this.defaultValue){
-            this.inputDate = this.calendarDate = getDate(this.defaultValue)
-            if(this.hasTime){
-              this.pickerTime = getTime(this.defaultValue, this.hideSecond)
-            }
-          }
+					if (newVal) {
+						this.displayValue = this.inputDate = this.calendarDate = getDate(newVal)
+						if (this.hasTime) {
+							this.pickerTime = getTime(newVal, this.hideSecond)
+							this.displayValue = `${this.displayValue} ${this.pickerTime}`
+						}
+					} else if (this.defaultValue) {
+						this.inputDate = this.calendarDate = getDate(this.defaultValue)
+						if (this.hasTime) {
+							this.pickerTime = getTime(this.defaultValue, this.hideSecond)
+						}
+					}
 				} else {
 					const [before, after] = newVal
 					if (!before && !after) return
-          const beforeDate = getDate(before)
-          const beforeTime = getTime(before, this.hideSecond)
+					const beforeDate = getDate(before)
+					const beforeTime = getTime(before, this.hideSecond)
 
-          const afterDate = getDate(after)
-          const afterTime = getTime(after, this.hideSecond)
+					const afterDate = getDate(after)
+					const afterTime = getTime(after, this.hideSecond)
 					const startDate = beforeDate
 					const endDate = afterDate
 					this.displayRangeValue.startDate = this.tempRange.startDate = startDate
@@ -450,23 +454,26 @@
 				right.setDate(this.$refs.right.nowDate.fullDate)
 			},
 			platform() {
-        if(typeof navigator !== "undefined"){
-          this.isPhone = navigator.userAgent.toLowerCase().indexOf('mobile') !== -1
-          return
-        }
-				const { windowWidth } = uni.getSystemInfoSync()
+				if (typeof navigator !== "undefined") {
+					this.isPhone = navigator.userAgent.toLowerCase().indexOf('mobile') !== -1
+					return
+				}
+				const {
+					windowWidth
+				} = uni.getSystemInfoSync()
 				this.isPhone = windowWidth <= 500
 				this.windowWidth = windowWidth
 			},
 			show() {
+				this.$emit("show")
 				if (this.disabled) {
 					return
 				}
 				this.platform()
 				if (this.isPhone) {
 					setTimeout(() => {
-            this.$refs.mobile.open()
-          }, 0);
+						this.$refs.mobile.open()
+					}, 0);
 					return
 				}
 				this.pickerPositionStyle = {
@@ -492,7 +499,9 @@
 							}
 						} else {
 							this.$refs.right.changeMonth('next')
-							this.$refs.right.cale.lastHover = false
+							if (this.isPhone) {
+								this.$refs.right.cale.lastHover = false;
+							}
 						}
 					}
 
@@ -544,52 +553,52 @@
 				this.confirmSingleChange()
 			},
 			confirmSingleChange() {
-        if(!checkDate(this.inputDate)){
+				if (!checkDate(this.inputDate)) {
 					const now = new Date()
-          this.calendarDate = this.inputDate = getDate(now)
+					this.calendarDate = this.inputDate = getDate(now)
 					this.pickerTime = getTime(now, this.hideSecond)
-        }
-
-        let startLaterInputDate = false
-        let startDate, startTime
-        if(this.start) {
-          let startString = this.start
-          if(typeof this.start === 'number'){
-            startString = getDateTime(this.start, this.hideSecond)
-          }
-          [startDate, startTime] = startString.split(' ')
-          if(this.start && !dateCompare(startDate, this.inputDate)) {
-            startLaterInputDate = true
-            this.inputDate = startDate
-          }
-        }
-
-        let endEarlierInputDate = false
-        let endDate, endTime
-        if(this.end) {
-          let endString = this.end
-          if(typeof this.end === 'number'){
-            endString = getDateTime(this.end, this.hideSecond)
-          }
-          [endDate, endTime] = endString.split(' ')
-          if(this.end && !dateCompare(this.inputDate, endDate)) {
-            endEarlierInputDate = true
-            this.inputDate = endDate
-          }
-        }
+				}
+
+				let startLaterInputDate = false
+				let startDate, startTime
+				if (this.start) {
+					let startString = this.start
+					if (typeof this.start === 'number') {
+						startString = getDateTime(this.start, this.hideSecond)
+					}
+					[startDate, startTime] = startString.split(' ')
+					if (this.start && !dateCompare(startDate, this.inputDate)) {
+						startLaterInputDate = true
+						this.inputDate = startDate
+					}
+				}
+
+				let endEarlierInputDate = false
+				let endDate, endTime
+				if (this.end) {
+					let endString = this.end
+					if (typeof this.end === 'number') {
+						endString = getDateTime(this.end, this.hideSecond)
+					}
+					[endDate, endTime] = endString.split(' ')
+					if (this.end && !dateCompare(this.inputDate, endDate)) {
+						endEarlierInputDate = true
+						this.inputDate = endDate
+					}
+				}
 				if (this.hasTime) {
-          if(startLaterInputDate){
-            this.pickerTime = startTime || getDefaultSecond(this.hideSecond)
-          }
-          if(endEarlierInputDate){
-            this.pickerTime = endTime || getDefaultSecond(this.hideSecond)
-          }
-          if(!this.pickerTime){
-            this.pickerTime = getTime(Date.now(), this.hideSecond)
-          }
+					if (startLaterInputDate) {
+						this.pickerTime = startTime || getDefaultSecond(this.hideSecond)
+					}
+					if (endEarlierInputDate) {
+						this.pickerTime = endTime || getDefaultSecond(this.hideSecond)
+					}
+					if (!this.pickerTime) {
+						this.pickerTime = getTime(Date.now(), this.hideSecond)
+					}
 					this.displayValue = `${this.inputDate} ${this.pickerTime}`
 				} else {
-          this.displayValue = this.inputDate
+					this.displayValue = this.inputDate
 				}
 				this.setEmit(this.displayValue)
 				this.pickerVisible = false
@@ -624,11 +633,13 @@
 			},
 			mobileChange(e) {
 				if (this.isRange) {
-					const {before, after} = e.range
-
-          if(!before || !after){
-            return
-          }
+					const {
+						before,
+						after
+					} = e.range
+					if (!before) {
+						return;
+					}
 
 					this.handleStartAndEnd(before, after, true)
 					if (this.hasTime) {
@@ -661,79 +672,79 @@
 					this.pickerVisible = false
 					return
 				}
-        if(!checkDate(this.tempRange.startDate)){
-          this.tempRange.startDate = getDate(Date.now())
-        }
-        if(!checkDate(this.tempRange.endDate)){
-          this.tempRange.endDate = getDate(Date.now())
-        }
+				if (!checkDate(this.tempRange.startDate)) {
+					this.tempRange.startDate = getDate(Date.now())
+				}
+				if (!checkDate(this.tempRange.endDate)) {
+					this.tempRange.endDate = getDate(Date.now())
+				}
 
 				let start, end
 
-        let startDateLaterRangeStartDate = false
-        let startDateLaterRangeEndDate = false
-        let startDate, startTime
-        if(this.start) {
-          let startString = this.start
-          if(typeof this.start === 'number'){
-            startString = getDateTime(this.start, this.hideSecond)
-          }
-          [startDate,startTime] = startString.split(' ')
-          if(this.start && !dateCompare(this.start, this.tempRange.startDate)) {
-            startDateLaterRangeStartDate = true
-            this.tempRange.startDate = startDate
-          }
-          if(this.start && !dateCompare(this.start, this.tempRange.endDate)) {
-            startDateLaterRangeEndDate = true
-            this.tempRange.endDate = startDate
-          }
-        }
-        let endDateEarlierRangeStartDate = false
-        let endDateEarlierRangeEndDate = false
-        let endDate, endTime
-        if(this.end) {
-          let endString = this.end
-          if(typeof this.end === 'number'){
-            endString = getDateTime(this.end, this.hideSecond)
-          }
-          [endDate,endTime] = endString.split(' ')
-
-          if(this.end && !dateCompare(this.tempRange.startDate, this.end)) {
-            endDateEarlierRangeStartDate = true
-            this.tempRange.startDate = endDate
-          }
-          if(this.end && !dateCompare(this.tempRange.endDate, this.end)) {
-            endDateEarlierRangeEndDate = true
-            this.tempRange.endDate = endDate
-          }
-        }
+				let startDateLaterRangeStartDate = false
+				let startDateLaterRangeEndDate = false
+				let startDate, startTime
+				if (this.start) {
+					let startString = this.start
+					if (typeof this.start === 'number') {
+						startString = getDateTime(this.start, this.hideSecond)
+					}
+					[startDate, startTime] = startString.split(' ')
+					if (this.start && !dateCompare(this.start, this.tempRange.startDate)) {
+						startDateLaterRangeStartDate = true
+						this.tempRange.startDate = startDate
+					}
+					if (this.start && !dateCompare(this.start, this.tempRange.endDate)) {
+						startDateLaterRangeEndDate = true
+						this.tempRange.endDate = startDate
+					}
+				}
+				let endDateEarlierRangeStartDate = false
+				let endDateEarlierRangeEndDate = false
+				let endDate, endTime
+				if (this.end) {
+					let endString = this.end
+					if (typeof this.end === 'number') {
+						endString = getDateTime(this.end, this.hideSecond)
+					}
+					[endDate, endTime] = endString.split(' ')
+
+					if (this.end && !dateCompare(this.tempRange.startDate, this.end)) {
+						endDateEarlierRangeStartDate = true
+						this.tempRange.startDate = endDate
+					}
+					if (this.end && !dateCompare(this.tempRange.endDate, this.end)) {
+						endDateEarlierRangeEndDate = true
+						this.tempRange.endDate = endDate
+					}
+				}
 				if (!this.hasTime) {
-          start = this.displayRangeValue.startDate = this.tempRange.startDate
+					start = this.displayRangeValue.startDate = this.tempRange.startDate
 					end = this.displayRangeValue.endDate = this.tempRange.endDate
 				} else {
-          if(startDateLaterRangeStartDate){
-            this.tempRange.startTime = startTime || getDefaultSecond(this.hideSecond)
-          }else if(endDateEarlierRangeStartDate){
-            this.tempRange.startTime = endTime || getDefaultSecond(this.hideSecond)
-          }
-          if(!this.tempRange.startTime){
-            this.tempRange.startTime = getTime(Date.now(), this.hideSecond)
-          }
-
-          if(startDateLaterRangeEndDate){
-            this.tempRange.endTime = startTime || getDefaultSecond(this.hideSecond)
-          }else if(endDateEarlierRangeEndDate){
-            this.tempRange.endTime = endTime || getDefaultSecond(this.hideSecond)
-          }
-          if(!this.tempRange.endTime){
-            this.tempRange.endTime = getTime(Date.now(), this.hideSecond)
-          }
+					if (startDateLaterRangeStartDate) {
+						this.tempRange.startTime = startTime || getDefaultSecond(this.hideSecond)
+					} else if (endDateEarlierRangeStartDate) {
+						this.tempRange.startTime = endTime || getDefaultSecond(this.hideSecond)
+					}
+					if (!this.tempRange.startTime) {
+						this.tempRange.startTime = getTime(Date.now(), this.hideSecond)
+					}
+
+					if (startDateLaterRangeEndDate) {
+						this.tempRange.endTime = startTime || getDefaultSecond(this.hideSecond)
+					} else if (endDateEarlierRangeEndDate) {
+						this.tempRange.endTime = endTime || getDefaultSecond(this.hideSecond)
+					}
+					if (!this.tempRange.endTime) {
+						this.tempRange.endTime = getTime(Date.now(), this.hideSecond)
+					}
 					start = this.displayRangeValue.startDate = `${this.tempRange.startDate} ${this.tempRange.startTime}`
 					end = this.displayRangeValue.endDate = `${this.tempRange.endDate} ${this.tempRange.endTime}`
 				}
-        if(!dateCompare(start,end)){
-          [start, end] = [end, start]
-        }
+				if (!dateCompare(start, end)) {
+					[start, end] = [end, start]
+				}
 				this.displayRangeValue.startDate = start
 				this.displayRangeValue.endDate = end
 				const displayRange = [start, end]
@@ -741,13 +752,13 @@
 				this.pickerVisible = false
 			},
 			handleStartAndEnd(before, after, temp = false) {
-				if (!(before && after)) return
-
+				if (!before) return
+				if(!after)after = before;
 				const type = temp ? 'tempRange' : 'range'
-        const isStartEarlierEnd = dateCompare(before, after)
-        this[type].startDate = isStartEarlierEnd ? before : after
-        this[type].endDate = isStartEarlierEnd ? after : before
-    },
+				const isStartEarlierEnd = dateCompare(before, after)
+				this[type].startDate = isStartEarlierEnd ? before : after
+				this[type].endDate = isStartEarlierEnd ? after : before
+			},
 			/**
 			 * 比较时间大小
 			 */
@@ -818,6 +829,7 @@
 		width: 100%;
 		flex: 1;
 	}
+
 	.uni-date-x {
 		display: flex;
 		flex-direction: row;
@@ -829,16 +841,17 @@
 		font-size: 14px;
 		flex: 1;
 
-    .icon-calendar{
-      padding-left: 3px;
-    }
-    .range-separator{
-      height: 35px;
-      /* #ifndef MP */
-      padding: 0 2px;
-      /* #endif */
+		.icon-calendar {
+			padding-left: 3px;
+		}
+
+		.range-separator {
+			height: 35px;
+			/* #ifndef MP */
+			padding: 0 2px;
+			/* #endif */
 			line-height: 35px;
-    }
+		}
 	}
 
 	.uni-date-x--border {
@@ -865,9 +878,9 @@
 	.uni-date__x-input {
 		width: auto;
 		height: 35px;
-    /* #ifndef MP */
-    padding-left: 5px;
-    /* #endif */
+		/* #ifndef MP */
+		padding-left: 5px;
+		/* #endif */
 		position: relative;
 		flex: 1;
 		line-height: 35px;

+ 105 - 137
uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js

@@ -13,7 +13,7 @@ class Calendar {
 		this.startDate = startDate
 		// 终止时间
 		this.endDate = endDate
-    // 是否范围选择
+		// 是否范围选择
 		this.range = range
 		// 多选状态
 		this.cleanMultipleStatus()
@@ -49,44 +49,44 @@ class Calendar {
 		this.endDate = endDate
 	}
 
-  getPreMonthObj(date){
-    date = fixIosDateFormat(date)
-    date = new Date(date)
-
-    const oldMonth = date.getMonth()
-    date.setMonth(oldMonth - 1)
-    const newMonth = date.getMonth()
-    if(oldMonth !== 0 && newMonth - oldMonth === 0){
-      date.setMonth(newMonth - 1)
-    }
-    return this.getDateObj(date)
-  }
-  getNextMonthObj(date){
-    date = fixIosDateFormat(date)
-    date = new Date(date)
-
-    const oldMonth = date.getMonth()
-    date.setMonth(oldMonth + 1)
-    const newMonth = date.getMonth()
-    if(newMonth - oldMonth > 1){
-      date.setMonth(newMonth - 1)
-    }
-    return this.getDateObj(date)
-  }
+	getPreMonthObj(date) {
+		date = fixIosDateFormat(date)
+		date = new Date(date)
+
+		const oldMonth = date.getMonth()
+		date.setMonth(oldMonth - 1)
+		const newMonth = date.getMonth()
+		if (oldMonth !== 0 && newMonth - oldMonth === 0) {
+			date.setMonth(newMonth - 1)
+		}
+		return this.getDateObj(date)
+	}
+	getNextMonthObj(date) {
+		date = fixIosDateFormat(date)
+		date = new Date(date)
+
+		const oldMonth = date.getMonth()
+		date.setMonth(oldMonth + 1)
+		const newMonth = date.getMonth()
+		if (newMonth - oldMonth > 1) {
+			date.setMonth(newMonth - 1)
+		}
+		return this.getDateObj(date)
+	}
 
 	/**
 	 * 获取指定格式Date对象
 	 */
 	getDateObj(date) {
-    date = fixIosDateFormat(date)
-    date = new Date(date)
+		date = fixIosDateFormat(date)
+		date = new Date(date)
 
 		return {
 			fullDate: getDate(date),
-      year: date.getFullYear(),
-      month: addZero(date.getMonth() + 1),
-      date: addZero(date.getDate()),
-      day: date.getDay()
+			year: date.getFullYear(),
+			month: addZero(date.getMonth() + 1),
+			date: addZero(date.getDate()),
+			day: date.getDay()
 		}
 	}
 
@@ -96,36 +96,11 @@ class Calendar {
 	getPreMonthDays(amount, dateObj) {
 		const result = []
 		for (let i = amount - 1; i >= 0; i--) {
-      const month = dateObj.month > 1 ? dateObj.month -1 : 12
-			const year = month === 12 ? dateObj.year - 1 : dateObj.year
-			const date = new Date(year,month,-i).getDate()
-			const fullDate = `${year}-${addZero(month)}-${addZero(date)}`
-			let multiples = this.multipleStatus.data
-			let multiplesStatus = -1
-			if (this.range && multiples) {
-			  multiplesStatus = multiples.findIndex((item) => {
-			    return this.dateEqual(item, fullDate)
-			  })
-			}
-			const checked = multiplesStatus !== -1
-			// 获取打点信息
-			const extraInfo = this.selected && this.selected.find((item) => {
-				if (this.dateEqual(fullDate, item.date)) {
-					return item
-				}
-			})
+			const month = dateObj.month - 1
 			result.push({
-				fullDate,
-				year,
+				date: new Date(dateObj.year, month, -i).getDate(),
 				month,
-				date,
-				multiple: this.range ? checked : false,
-				beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after),
-				afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after),
-				disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)),
-				isToday: fullDate === this.date.fullDate,
-				userChecked: false,
-				extraInfo
+				disable: true
 			})
 		}
 		return result
@@ -140,7 +115,7 @@ class Calendar {
 			const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}`
 			const isToday = fullDate === currentDate
 			// 获取打点信息
-			const extraInfo = this.selected && this.selected.find((item) => {
+			const info = this.selected && this.selected.find((item) => {
 				if (this.dateEqual(currentDate, item.date)) {
 					return item
 				}
@@ -160,24 +135,25 @@ class Calendar {
 			let multiples = this.multipleStatus.data
 			let multiplesStatus = -1
 			if (this.range && multiples) {
-        multiplesStatus = multiples.findIndex((item) => {
-          return this.dateEqual(item, currentDate)
-        })
+				multiplesStatus = multiples.findIndex((item) => {
+					return this.dateEqual(item, currentDate)
+				})
 			}
-      const checked = multiplesStatus !== -1
+			const checked = multiplesStatus !== -1
 
 			result.push({
 				fullDate: currentDate,
 				year: dateObj.year,
-				month: dateObj.month,
 				date: i,
 				multiple: this.range ? checked : false,
 				beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after),
 				afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after),
-				disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(currentDate,this.endDate)),
+				month: dateObj.month,
+				disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(
+					currentDate, this.endDate)),
 				isToday,
 				userChecked: false,
-        extraInfo
+				extraInfo: info
 			})
 		}
 		return result
@@ -187,37 +163,12 @@ class Calendar {
 	 */
 	_getNextMonthDays(amount, dateObj) {
 		const result = []
-    const month = dateObj.month + 1
+		const month = dateObj.month + 1
 		for (let i = 1; i <= amount; i++) {
-			const month = dateObj.month === 12 ? 1 : dateObj.month*1 + 1
-			const year = month === 1 ? dateObj.year + 1 : dateObj.year
-			const fullDate = `${year}-${addZero(month)}-${addZero(i)}`
-			let multiples = this.multipleStatus.data
-			let multiplesStatus = -1
-			if (this.range && multiples) {
-			  multiplesStatus = multiples.findIndex((item) => {
-			    return this.dateEqual(item, fullDate)
-			  })
-			}
-			const checked = multiplesStatus !== -1
-			// 获取打点信息
-			const extraInfo = this.selected && this.selected.find((item) => {
-				if (this.dateEqual(fullDate, item.date)) {
-					return item
-				}
-			})
 			result.push({
-				fullDate,
-				year,
 				date: i,
 				month,
-				multiple: this.range ? checked : false,
-				beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after),
-				afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after),
-				disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)),
-				isToday: fullDate === this.date.fullDate,
-				userChecked: false,
-				extraInfo
+				disable: true
 			})
 		}
 		return result
@@ -290,7 +241,7 @@ class Calendar {
 	 *  获取多选状态
 	 */
 	setMultiple(fullDate) {
-    if (!this.range) return
+		if (!this.range) return
 
 		let {
 			before,
@@ -309,6 +260,7 @@ class Calendar {
 		} else {
 			if (!before) {
 				this.multipleStatus.before = fullDate
+				this.multipleStatus.after = undefined;
 				this.lastHover = false
 			} else {
 				this.multipleStatus.after = fullDate
@@ -329,9 +281,12 @@ class Calendar {
 	 *  鼠标 hover 更新多选状态
 	 */
 	setHoverMultiple(fullDate) {
-    if (!this.range || this.lastHover) return
-
-		const { before } = this.multipleStatus
+		//抖音小程序点击会触发hover事件,需要避免一下
+		// #ifndef MP-TOUTIAO
+		if (!this.range || this.lastHover) return
+		const {
+			before
+		} = this.multipleStatus
 
 		if (!before) {
 			this.multipleStatus.before = fullDate
@@ -344,6 +299,8 @@ class Calendar {
 			}
 		}
 		this.getWeeks(fullDate)
+		// #endif
+
 	}
 
 	/**
@@ -374,22 +331,22 @@ class Calendar {
 		} = this.getDateObj(dateData)
 
 		const preMonthDayAmount = new Date(year, month - 1, 1).getDay()
-    const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData))
+		const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData))
 
 		const currentMonthDayAmount = new Date(year, month, 0).getDate()
-    const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData))
+		const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData))
 
-    const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount
-    const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData))
+		const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount
+		const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData))
 
 		const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays]
 
 		const weeks = new Array(6)
 		for (let i = 0; i < calendarDays.length; i++) {
-      const index = Math.floor(i / 7)
-      if(!weeks[index]){
-        weeks[index] = new Array(7)
-      }
+			const index = Math.floor(i / 7)
+			if (!weeks[index]) {
+				weeks[index] = new Array(7)
+			}
 			weeks[index][i % 7] = calendarDays[i]
 		}
 
@@ -398,56 +355,67 @@ class Calendar {
 	}
 }
 
-function getDateTime(date, hideSecond){
-  return `${getDate(date)} ${getTime(date, hideSecond)}`
+function getDateTime(date, hideSecond) {
+	return `${getDate(date)} ${getTime(date, hideSecond)}`
 }
 
 function getDate(date) {
-  date = fixIosDateFormat(date)
-  date = new Date(date)
-  const year = date.getFullYear()
-  const month = date.getMonth()+1
-  const day = date.getDate()
-  return `${year}-${addZero(month)}-${addZero(day)}`
+	date = fixIosDateFormat(date)
+	date = new Date(date)
+	const year = date.getFullYear()
+	const month = date.getMonth() + 1
+	const day = date.getDate()
+	return `${year}-${addZero(month)}-${addZero(day)}`
 }
 
-function getTime(date, hideSecond){
-  date = fixIosDateFormat(date)
-  date = new Date(date)
-  const hour = date.getHours()
-  const minute = date.getMinutes()
-  const second = date.getSeconds()
-  return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}`
+function getTime(date, hideSecond) {
+	date = fixIosDateFormat(date)
+	date = new Date(date)
+	const hour = date.getHours()
+	const minute = date.getMinutes()
+	const second = date.getSeconds()
+	return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}`
 }
 
 function addZero(num) {
-  if(num < 10){
-    num = `0${num}`
-  }
-  return num
+	if (num < 10) {
+		num = `0${num}`
+	}
+	return num
 }
 
 function getDefaultSecond(hideSecond) {
-  return hideSecond ? '00:00' : '00:00:00'
+	return hideSecond ? '00:00' : '00:00:00'
 }
 
 function dateCompare(startDate, endDate) {
-  startDate = new Date(fixIosDateFormat(startDate))
-  endDate = new Date(fixIosDateFormat(endDate))
-  return startDate <= endDate
+	startDate = new Date(fixIosDateFormat(startDate))
+	endDate = new Date(fixIosDateFormat(endDate))
+	return startDate <= endDate
 }
 
-function checkDate(date){
-  const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g
-  return date.match(dateReg)
+function checkDate(date) {
+	const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g
+	return date.match(dateReg)
 }
 
 const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9]:[0-5]?[0-9])?$/
+
 function fixIosDateFormat(value) {
-  if (typeof value === 'string' && dateTimeReg.test(value)) {
-    value = value.replace(/-/g, '/')
-  }
-  return value
+	if (typeof value === 'string' && dateTimeReg.test(value)) {
+		value = value.replace(/-/g, '/')
+	}
+	return value
 }
 
-export {Calendar, getDateTime, getDate, getTime, addZero, getDefaultSecond, dateCompare, checkDate, fixIosDateFormat}
+export {
+	Calendar,
+	getDateTime,
+	getDate,
+	getTime,
+	addZero,
+	getDefaultSecond,
+	dateCompare,
+	checkDate,
+	fixIosDateFormat
+}

+ 1 - 1
uni_modules/uni-datetime-picker/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-datetime-picker",
   "displayName": "uni-datetime-picker 日期选择器",
-  "version": "2.2.24",
+  "version": "2.2.29",
   "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择",
   "keywords": [
     "uni-datetime-picker",

+ 2 - 0
uni_modules/uni-easyinput/changelog.md

@@ -1,3 +1,5 @@
+## 1.1.10(2024-01-22)
+- 去除 移除无用的log输出
 ## 1.1.9(2023-04-11)
 - 修复 vue3 下 keyboardheightchange 事件报错的bug
 ## 1.1.8(2023-03-29)

+ 0 - 2
uni_modules/uni-easyinput/components/uni-easyinput/common.js

@@ -6,9 +6,7 @@
  */
 export const debounce = function(func, wait = 1000, immediate = true) {
 	let timer;
-	console.log(1);
 	return function() {
-		console.log(123);
 		let context = this,
 			args = arguments;
 		if (timer) clearTimeout(timer);

+ 1 - 1
uni_modules/uni-easyinput/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-easyinput",
   "displayName": "uni-easyinput 增强输入框",
-  "version": "1.1.9",
+  "version": "1.1.10",
   "description": "Easyinput 组件是对原生input组件的增强",
   "keywords": [
     "uni-ui",

+ 4 - 0
uni_modules/uni-file-picker/changelog.md

@@ -1,3 +1,7 @@
+## 1.0.6(2024-01-06)
+- 新增 微信小程序不再调用chooseImage,而是调用chooseMedia
+## 1.0.5(2024-01-03)
+- 新增 上传文件至云存储携带本地文件名称
 ## 1.0.4(2023-03-29)
 - 修复 手动上传删除一个文件后不能再上传的bug
 ## 1.0.3(2022-12-19)

+ 23 - 0
uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js

@@ -11,6 +11,27 @@ function chooseImage(opts) {
 		extension
 	} = opts
 	return new Promise((resolve, reject) => {
+		// #ifdef MP-WEIXIN
+		uni.chooseMedia({
+			count,
+			sizeType,
+			sourceType,
+			mediaType: ['image'],
+			extension,
+			success(res) {
+				res.tempFiles.forEach(item => {
+					item.path = item.tempFilePath;
+				})
+				resolve(normalizeChooseAndUploadFileRes(res, 'image'));
+			},
+			fail(res) {
+				reject({
+					errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
+				});
+			},
+		})
+		// #endif
+		// #ifndef MP-WEIXIN
 		uni.chooseImage({
 			count,
 			sizeType,
@@ -25,6 +46,8 @@ function chooseImage(opts) {
 				});
 			},
 		});
+		// #endif
+
 	});
 }
 

+ 11 - 1
uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue

@@ -191,6 +191,10 @@
 				default () {
 					return  ['album', 'camera']
 				}
+			},
+			provider: {
+				type: String,
+				default: '' // 默认上传到 unicloud 内置存储 extStorage 扩展存储
 			}
 		},
 		data() {
@@ -331,7 +335,6 @@
 			 * 选择文件
 			 */
 			choose() {
-
 				if (this.disabled) return
 				if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType ===
 					'array') {
@@ -418,6 +421,13 @@
 				if (!this.autoUpload || this.noSpace) {
 					res.tempFiles = []
 				}
+				res.tempFiles.forEach((fileItem, index) => {
+					this.provider && (fileItem.provider = this.provider);
+					const fileNameSplit = fileItem.name.split('.')
+					const ext = fileNameSplit.pop()
+					const fileName = fileNameSplit.join('.').replace(/[\s\/\?<>\\:\*\|":]/g, '_')
+					fileItem.cloudPath = fileName + '_' + Date.now() + '_' + index + '.' + ext
+				})
 			},
 
 			/**

+ 1 - 1
uni_modules/uni-file-picker/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-file-picker",
   "displayName": "uni-file-picker 文件选择上传",
-  "version": "1.0.4",
+  "version": "1.0.6",
   "description": "文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间",
   "keywords": [
     "uni-ui",

+ 2 - 0
uni_modules/uni-forms/changelog.md

@@ -1,3 +1,5 @@
+## 1.4.10(2023-11-03)
+- 优化 labelWidth 描述错误
 ## 1.4.9(2023-02-10)
 - 修复 required 参数无法动态绑定
 ## 1.4.8(2022-08-23)

+ 5 - 5
uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue

@@ -36,7 +36,7 @@
 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=2773
 	 * @property {Boolean} required 是否必填,左边显示红色"*"号
 	 * @property {String } 	label 				输入框左边的文字提示
-	 * @property {Number } 	labelWidth 			label的宽度,单位px(默认65
+	 * @property {Number } 	labelWidth 			label的宽度,单位px(默认70
 	 * @property {String } 	labelAlign = [left|center|right] label的文字对齐方式(默认left)
 	 * 	@value left		label 左侧显示
 	 * 	@value center	label 居中
@@ -91,7 +91,7 @@
 				type: String,
 				default: ''
 			},
-			// label的宽度 ,默认 80
+			// label的宽度
 			labelWidth: {
 				type: [String, Number],
 				default: ''
@@ -128,7 +128,7 @@
 				errMsg: '',
 				userRules: null,
 				localLabelAlign: 'left',
-				localLabelWidth: '65px',
+				localLabelWidth: '70px',
 				localLabelPos: 'left',
 				border: false,
 				isFirstBorder: false,
@@ -413,9 +413,9 @@
 				// 	const {
 				// 		labelWidth
 				// 	} = this.form
-				return this.num2px(this.labelWidth ? this.labelWidth : (labelWidth || (this.label ? 65 : 'auto')))
+				return this.num2px(this.labelWidth ? this.labelWidth : (labelWidth || (this.label ? 70 : 'auto')))
 				// }
-				// return '65px'
+				// return '70px'
 			},
 			// 处理 label 位置
 			_labelPosition() {

+ 1 - 1
uni_modules/uni-forms/components/uni-forms/uni-forms.vue

@@ -52,7 +52,7 @@
 	 * @property {String} labelPosition = [top|left]	label 位置 默认 left
 	 * @value top		顶部显示 label
 	 * @value left	左侧显示 label
-	 * @property {String} labelWidth	label 宽度,默认 65px
+	 * @property {String} labelWidth	label 宽度,默认 70px
 	 * @property {String} labelAlign = [left|center|right]	label 居中方式  默认 left
 	 * @value left		label 左侧显示
 	 * @value center	label 居中

+ 1 - 1
uni_modules/uni-forms/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-forms",
   "displayName": "uni-forms 表单",
-  "version": "1.4.9",
+  "version": "1.4.10",
   "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据",
   "keywords": [
     "uni-ui",

+ 18 - 0
uni_modules/uni-icons/changelog.md

@@ -1,3 +1,21 @@
+## 2.0.9(2024-01-12)
+fix: 修复图标大小默认值错误的问题
+## 2.0.8(2023-12-14)
+- 修复 项目未使用 ts 情况下,打包报错的bug
+## 2.0.7(2023-12-14)
+- 修复 size 属性为 string 时,不加单位导致尺寸异常的bug
+## 2.0.6(2023-12-11)
+- 优化 兼容老版本icon类型,如 top ,bottom 等
+## 2.0.5(2023-12-11)
+- 优化 兼容老版本icon类型,如 top ,bottom 等
+## 2.0.4(2023-12-06)
+- 优化 uni-app x 下示例项目图标排序
+## 2.0.3(2023-12-06)
+- 修复 nvue下引入组件报错的bug
+## 2.0.2(2023-12-05)
+-优化 size 属性支持单位
+## 2.0.1(2023-12-05)
+- 新增 uni-app x 支持定义图标
 ## 1.3.5(2022-01-24)
 - 优化 size 属性可以传入不带单位的字符串数值
 ## 1.3.4(2022-01-24)

+ 91 - 0
uni_modules/uni-icons/components/uni-icons/uni-icons.uvue

@@ -0,0 +1,91 @@
+<template>
+	<text class="uni-icons" :style="styleObj">
+		<slot>{{unicode}}</slot>
+	</text>
+</template>
+
+<script>
+	import { fontData, IconsDataItem } from './uniicons_file'
+
+	/**
+	 * Icons 图标
+	 * @description 用于展示 icon 图标
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=28
+	 * @property {Number} size 图标大小
+	 * @property {String} type 图标图案,参考示例
+	 * @property {String} color 图标颜色
+	 * @property {String} customPrefix 自定义图标
+	 * @event {Function} click 点击 Icon 触发事件
+	 */
+	export default {
+		name: "uni-icons",
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#333333'
+			},
+			size: {
+				type: Object,
+				default: 16
+			},
+			fontFamily: {
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {};
+		},
+		computed: {
+			unicode() : string {
+				let codes = fontData.find((item : IconsDataItem) : boolean => { return item.font_class == this.type })
+				if (codes !== null) {
+					return codes.unicode
+				}
+				return ''
+			},
+			iconSize() : string {
+				const size = this.size
+				if (typeof size == 'string') {
+					const reg = /^[0-9]*$/g
+					return reg.test(size as string) ? '' + size + 'px' : '' + size;
+					// return '' + this.size
+				}
+				return this.getFontSize(size as number)
+			},
+			styleObj() : UTSJSONObject {
+				if (this.fontFamily !== '') {
+					return { color: this.color, fontSize: this.iconSize, fontFamily: this.fontFamily }
+				}
+				return { color: this.color, fontSize: this.iconSize }
+			}
+		},
+		created() { },
+		methods: {
+			/**
+			 * 字体大小
+			 */
+			getFontSize(size : number) : string {
+				return size + 'px';
+			},
+		},
+	}
+</script>
+
+<style scoped>
+	@font-face {
+		font-family: UniIconsFontFamily;
+		src: url('./uniicons.ttf');
+	}
+
+	.uni-icons {
+		font-family: UniIconsFontFamily;
+		font-size: 18px;
+		font-style: normal;
+		color: #333;
+	}
+</style>

+ 31 - 17
uni_modules/uni-icons/components/uni-icons/uni-icons.vue

@@ -1,24 +1,28 @@
 <template>
 	<!-- #ifdef APP-NVUE -->
-	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text>
+	<text :style="styleObj" class="uni-icons" @click="_onClick">{{unicode}}</text>
 	<!-- #endif -->
 	<!-- #ifndef APP-NVUE -->
-	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text>
+	<text :style="styleObj" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick">
+		<slot></slot>
+	</text>
 	<!-- #endif -->
 </template>
 
 <script>
-	import icons from './icons.js';
+	import { fontData } from './uniicons_file_vue.js';
+
 	const getVal = (val) => {
 		const reg = /^[0-9]*$/g
-		return (typeof val === 'number' || reg.test(val) )? val + 'px' : val;
-	} 
+		return (typeof val === 'number' || reg.test(val)) ? val + 'px' : val;
+	}
+
 	// #ifdef APP-NVUE
 	var domModule = weex.requireModule('dom');
 	import iconUrl from './uniicons.ttf'
 	domModule.addRule('fontFace', {
 		'fontFamily': "uniicons",
-		'src': "url('"+iconUrl+"')"
+		'src': "url('" + iconUrl + "')"
 	});
 	// #endif
 
@@ -34,7 +38,7 @@
 	 */
 	export default {
 		name: 'UniIcons',
-		emits:['click'],
+		emits: ['click'],
 		props: {
 			type: {
 				type: String,
@@ -48,26 +52,36 @@
 				type: [Number, String],
 				default: 16
 			},
-			customPrefix:{
+			customPrefix: {
+				type: String,
+				default: ''
+			},
+			fontFamily: {
 				type: String,
 				default: ''
 			}
 		},
 		data() {
 			return {
-				icons: icons.glyphs
+				icons: fontData
 			}
 		},
-		computed:{
-			unicode(){
-				let code = this.icons.find(v=>v.font_class === this.type)
-				if(code){
-					return unescape(`%u${code.unicode}`)
+		computed: {
+			unicode() {
+				let code = this.icons.find(v => v.font_class === this.type)
+				if (code) {
+					return code.unicode
 				}
 				return ''
 			},
-			iconSize(){
+			iconSize() {
 				return getVal(this.size)
+			},
+			styleObj() {
+				if (this.fontFamily !== '') {
+					return `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};`
+				}
+				return `color: ${this.color}; font-size: ${this.iconSize};`
 			}
 		},
 		methods: {
@@ -81,9 +95,10 @@
 <style lang="scss">
 	/* #ifndef APP-NVUE */
 	@import './uniicons.css';
+
 	@font-face {
 		font-family: uniicons;
-		src: url('./uniicons.ttf') format('truetype');
+		src: url('./uniicons.ttf');
 	}
 
 	/* #endif */
@@ -92,5 +107,4 @@
 		text-decoration: none;
 		text-align: center;
 	}
-
 </style>

+ 32 - 31
uni_modules/uni-icons/components/uni-icons/uniicons.css

@@ -1,3 +1,12 @@
+
+.uniui-cart-filled:before {
+  content: "\e6d0";
+}
+
+.uniui-gift-filled:before {
+  content: "\e6c4";
+}
+
 .uniui-color:before {
   content: "\e6cf";
 }
@@ -58,10 +67,6 @@
   content: "\e6c3";
 }
 
-.uniui-gift-filled:before {
-  content: "\e6c4";
-}
-
 .uniui-fire-filled:before {
   content: "\e6c5";
 }
@@ -82,6 +87,18 @@
   content: "\e698";
 }
 
+.uniui-arrowthinleft:before {
+  content: "\e6d2";
+}
+
+.uniui-arrowthinup:before {
+  content: "\e6d3";
+}
+
+.uniui-arrowthindown:before {
+  content: "\e6d4";
+}
+
 .uniui-back:before {
   content: "\e6b9";
 }
@@ -94,55 +111,43 @@
   content: "\e6bb";
 }
 
-.uniui-arrowthinright:before {
-  content: "\e6bb";
-}
-
 .uniui-arrow-left:before {
   content: "\e6bc";
 }
 
-.uniui-arrowthinleft:before {
-  content: "\e6bc";
-}
-
 .uniui-arrow-up:before {
   content: "\e6bd";
 }
 
-.uniui-arrowthinup:before {
-  content: "\e6bd";
-}
-
 .uniui-arrow-down:before {
   content: "\e6be";
 }
 
-.uniui-arrowthindown:before {
-  content: "\e6be";
+.uniui-arrowthinright:before {
+  content: "\e6d1";
 }
 
-.uniui-bottom:before {
+.uniui-down:before {
   content: "\e6b8";
 }
 
-.uniui-arrowdown:before {
+.uniui-bottom:before {
   content: "\e6b8";
 }
 
-.uniui-right:before {
-  content: "\e6b5";
+.uniui-arrowright:before {
+  content: "\e6d5";
 }
 
-.uniui-arrowright:before {
+.uniui-right:before {
   content: "\e6b5";
 }
 
-.uniui-top:before {
+.uniui-up:before {
   content: "\e6b6";
 }
 
-.uniui-arrowup:before {
+.uniui-top:before {
   content: "\e6b6";
 }
 
@@ -150,8 +155,8 @@
   content: "\e6b7";
 }
 
-.uniui-arrowleft:before {
-  content: "\e6b7";
+.uniui-arrowup:before {
+  content: "\e6d6";
 }
 
 .uniui-eye:before {
@@ -638,10 +643,6 @@
   content: "\e627";
 }
 
-.uniui-cart-filled:before {
-  content: "\e629";
-}
-
 .uniui-checkbox:before {
   content: "\e62b";
 }

BIN
uni_modules/uni-icons/components/uni-icons/uniicons.ttf


+ 664 - 0
uni_modules/uni-icons/components/uni-icons/uniicons_file.ts

@@ -0,0 +1,664 @@
+
+export type IconsData = {
+	id : string
+	name : string
+	font_family : string
+	css_prefix_text : string
+	description : string
+	glyphs : Array<IconsDataItem>
+}
+
+export type IconsDataItem = {
+	font_class : string
+	unicode : string
+}
+
+
+export const fontData = [
+  {
+    "font_class": "arrow-down",
+    "unicode": "\ue6be"
+  },
+  {
+    "font_class": "arrow-left",
+    "unicode": "\ue6bc"
+  },
+  {
+    "font_class": "arrow-right",
+    "unicode": "\ue6bb"
+  },
+  {
+    "font_class": "arrow-up",
+    "unicode": "\ue6bd"
+  },
+  {
+    "font_class": "auth",
+    "unicode": "\ue6ab"
+  },
+  {
+    "font_class": "auth-filled",
+    "unicode": "\ue6cc"
+  },
+  {
+    "font_class": "back",
+    "unicode": "\ue6b9"
+  },
+  {
+    "font_class": "bars",
+    "unicode": "\ue627"
+  },
+  {
+    "font_class": "calendar",
+    "unicode": "\ue6a0"
+  },
+  {
+    "font_class": "calendar-filled",
+    "unicode": "\ue6c0"
+  },
+  {
+    "font_class": "camera",
+    "unicode": "\ue65a"
+  },
+  {
+    "font_class": "camera-filled",
+    "unicode": "\ue658"
+  },
+  {
+    "font_class": "cart",
+    "unicode": "\ue631"
+  },
+  {
+    "font_class": "cart-filled",
+    "unicode": "\ue6d0"
+  },
+  {
+    "font_class": "chat",
+    "unicode": "\ue65d"
+  },
+  {
+    "font_class": "chat-filled",
+    "unicode": "\ue659"
+  },
+  {
+    "font_class": "chatboxes",
+    "unicode": "\ue696"
+  },
+  {
+    "font_class": "chatboxes-filled",
+    "unicode": "\ue692"
+  },
+  {
+    "font_class": "chatbubble",
+    "unicode": "\ue697"
+  },
+  {
+    "font_class": "chatbubble-filled",
+    "unicode": "\ue694"
+  },
+  {
+    "font_class": "checkbox",
+    "unicode": "\ue62b"
+  },
+  {
+    "font_class": "checkbox-filled",
+    "unicode": "\ue62c"
+  },
+  {
+    "font_class": "checkmarkempty",
+    "unicode": "\ue65c"
+  },
+  {
+    "font_class": "circle",
+    "unicode": "\ue65b"
+  },
+  {
+    "font_class": "circle-filled",
+    "unicode": "\ue65e"
+  },
+  {
+    "font_class": "clear",
+    "unicode": "\ue66d"
+  },
+  {
+    "font_class": "close",
+    "unicode": "\ue673"
+  },
+  {
+    "font_class": "closeempty",
+    "unicode": "\ue66c"
+  },
+  {
+    "font_class": "cloud-download",
+    "unicode": "\ue647"
+  },
+  {
+    "font_class": "cloud-download-filled",
+    "unicode": "\ue646"
+  },
+  {
+    "font_class": "cloud-upload",
+    "unicode": "\ue645"
+  },
+  {
+    "font_class": "cloud-upload-filled",
+    "unicode": "\ue648"
+  },
+  {
+    "font_class": "color",
+    "unicode": "\ue6cf"
+  },
+  {
+    "font_class": "color-filled",
+    "unicode": "\ue6c9"
+  },
+  {
+    "font_class": "compose",
+    "unicode": "\ue67f"
+  },
+  {
+    "font_class": "contact",
+    "unicode": "\ue693"
+  },
+  {
+    "font_class": "contact-filled",
+    "unicode": "\ue695"
+  },
+  {
+    "font_class": "down",
+    "unicode": "\ue6b8"
+  },
+	{
+	  "font_class": "bottom",
+	  "unicode": "\ue6b8"
+	},
+  {
+    "font_class": "download",
+    "unicode": "\ue68d"
+  },
+  {
+    "font_class": "download-filled",
+    "unicode": "\ue681"
+  },
+  {
+    "font_class": "email",
+    "unicode": "\ue69e"
+  },
+  {
+    "font_class": "email-filled",
+    "unicode": "\ue69a"
+  },
+  {
+    "font_class": "eye",
+    "unicode": "\ue651"
+  },
+  {
+    "font_class": "eye-filled",
+    "unicode": "\ue66a"
+  },
+  {
+    "font_class": "eye-slash",
+    "unicode": "\ue6b3"
+  },
+  {
+    "font_class": "eye-slash-filled",
+    "unicode": "\ue6b4"
+  },
+  {
+    "font_class": "fire",
+    "unicode": "\ue6a1"
+  },
+  {
+    "font_class": "fire-filled",
+    "unicode": "\ue6c5"
+  },
+  {
+    "font_class": "flag",
+    "unicode": "\ue65f"
+  },
+  {
+    "font_class": "flag-filled",
+    "unicode": "\ue660"
+  },
+  {
+    "font_class": "folder-add",
+    "unicode": "\ue6a9"
+  },
+  {
+    "font_class": "folder-add-filled",
+    "unicode": "\ue6c8"
+  },
+  {
+    "font_class": "font",
+    "unicode": "\ue6a3"
+  },
+  {
+    "font_class": "forward",
+    "unicode": "\ue6ba"
+  },
+  {
+    "font_class": "gear",
+    "unicode": "\ue664"
+  },
+  {
+    "font_class": "gear-filled",
+    "unicode": "\ue661"
+  },
+  {
+    "font_class": "gift",
+    "unicode": "\ue6a4"
+  },
+  {
+    "font_class": "gift-filled",
+    "unicode": "\ue6c4"
+  },
+  {
+    "font_class": "hand-down",
+    "unicode": "\ue63d"
+  },
+  {
+    "font_class": "hand-down-filled",
+    "unicode": "\ue63c"
+  },
+  {
+    "font_class": "hand-up",
+    "unicode": "\ue63f"
+  },
+  {
+    "font_class": "hand-up-filled",
+    "unicode": "\ue63e"
+  },
+  {
+    "font_class": "headphones",
+    "unicode": "\ue630"
+  },
+  {
+    "font_class": "heart",
+    "unicode": "\ue639"
+  },
+  {
+    "font_class": "heart-filled",
+    "unicode": "\ue641"
+  },
+  {
+    "font_class": "help",
+    "unicode": "\ue679"
+  },
+  {
+    "font_class": "help-filled",
+    "unicode": "\ue674"
+  },
+  {
+    "font_class": "home",
+    "unicode": "\ue662"
+  },
+  {
+    "font_class": "home-filled",
+    "unicode": "\ue663"
+  },
+  {
+    "font_class": "image",
+    "unicode": "\ue670"
+  },
+  {
+    "font_class": "image-filled",
+    "unicode": "\ue678"
+  },
+  {
+    "font_class": "images",
+    "unicode": "\ue650"
+  },
+  {
+    "font_class": "images-filled",
+    "unicode": "\ue64b"
+  },
+  {
+    "font_class": "info",
+    "unicode": "\ue669"
+  },
+  {
+    "font_class": "info-filled",
+    "unicode": "\ue649"
+  },
+  {
+    "font_class": "left",
+    "unicode": "\ue6b7"
+  },
+  {
+    "font_class": "link",
+    "unicode": "\ue6a5"
+  },
+  {
+    "font_class": "list",
+    "unicode": "\ue644"
+  },
+  {
+    "font_class": "location",
+    "unicode": "\ue6ae"
+  },
+  {
+    "font_class": "location-filled",
+    "unicode": "\ue6af"
+  },
+  {
+    "font_class": "locked",
+    "unicode": "\ue66b"
+  },
+  {
+    "font_class": "locked-filled",
+    "unicode": "\ue668"
+  },
+  {
+    "font_class": "loop",
+    "unicode": "\ue633"
+  },
+  {
+    "font_class": "mail-open",
+    "unicode": "\ue643"
+  },
+  {
+    "font_class": "mail-open-filled",
+    "unicode": "\ue63a"
+  },
+  {
+    "font_class": "map",
+    "unicode": "\ue667"
+  },
+  {
+    "font_class": "map-filled",
+    "unicode": "\ue666"
+  },
+  {
+    "font_class": "map-pin",
+    "unicode": "\ue6ad"
+  },
+  {
+    "font_class": "map-pin-ellipse",
+    "unicode": "\ue6ac"
+  },
+  {
+    "font_class": "medal",
+    "unicode": "\ue6a2"
+  },
+  {
+    "font_class": "medal-filled",
+    "unicode": "\ue6c3"
+  },
+  {
+    "font_class": "mic",
+    "unicode": "\ue671"
+  },
+  {
+    "font_class": "mic-filled",
+    "unicode": "\ue677"
+  },
+  {
+    "font_class": "micoff",
+    "unicode": "\ue67e"
+  },
+  {
+    "font_class": "micoff-filled",
+    "unicode": "\ue6b0"
+  },
+  {
+    "font_class": "minus",
+    "unicode": "\ue66f"
+  },
+  {
+    "font_class": "minus-filled",
+    "unicode": "\ue67d"
+  },
+  {
+    "font_class": "more",
+    "unicode": "\ue64d"
+  },
+  {
+    "font_class": "more-filled",
+    "unicode": "\ue64e"
+  },
+  {
+    "font_class": "navigate",
+    "unicode": "\ue66e"
+  },
+  {
+    "font_class": "navigate-filled",
+    "unicode": "\ue67a"
+  },
+  {
+    "font_class": "notification",
+    "unicode": "\ue6a6"
+  },
+  {
+    "font_class": "notification-filled",
+    "unicode": "\ue6c1"
+  },
+  {
+    "font_class": "paperclip",
+    "unicode": "\ue652"
+  },
+  {
+    "font_class": "paperplane",
+    "unicode": "\ue672"
+  },
+  {
+    "font_class": "paperplane-filled",
+    "unicode": "\ue675"
+  },
+  {
+    "font_class": "person",
+    "unicode": "\ue699"
+  },
+  {
+    "font_class": "person-filled",
+    "unicode": "\ue69d"
+  },
+  {
+    "font_class": "personadd",
+    "unicode": "\ue69f"
+  },
+  {
+    "font_class": "personadd-filled",
+    "unicode": "\ue698"
+  },
+  {
+    "font_class": "personadd-filled-copy",
+    "unicode": "\ue6d1"
+  },
+  {
+    "font_class": "phone",
+    "unicode": "\ue69c"
+  },
+  {
+    "font_class": "phone-filled",
+    "unicode": "\ue69b"
+  },
+  {
+    "font_class": "plus",
+    "unicode": "\ue676"
+  },
+  {
+    "font_class": "plus-filled",
+    "unicode": "\ue6c7"
+  },
+  {
+    "font_class": "plusempty",
+    "unicode": "\ue67b"
+  },
+  {
+    "font_class": "pulldown",
+    "unicode": "\ue632"
+  },
+  {
+    "font_class": "pyq",
+    "unicode": "\ue682"
+  },
+  {
+    "font_class": "qq",
+    "unicode": "\ue680"
+  },
+  {
+    "font_class": "redo",
+    "unicode": "\ue64a"
+  },
+  {
+    "font_class": "redo-filled",
+    "unicode": "\ue655"
+  },
+  {
+    "font_class": "refresh",
+    "unicode": "\ue657"
+  },
+  {
+    "font_class": "refresh-filled",
+    "unicode": "\ue656"
+  },
+  {
+    "font_class": "refreshempty",
+    "unicode": "\ue6bf"
+  },
+  {
+    "font_class": "reload",
+    "unicode": "\ue6b2"
+  },
+  {
+    "font_class": "right",
+    "unicode": "\ue6b5"
+  },
+  {
+    "font_class": "scan",
+    "unicode": "\ue62a"
+  },
+  {
+    "font_class": "search",
+    "unicode": "\ue654"
+  },
+  {
+    "font_class": "settings",
+    "unicode": "\ue653"
+  },
+  {
+    "font_class": "settings-filled",
+    "unicode": "\ue6ce"
+  },
+  {
+    "font_class": "shop",
+    "unicode": "\ue62f"
+  },
+  {
+    "font_class": "shop-filled",
+    "unicode": "\ue6cd"
+  },
+  {
+    "font_class": "smallcircle",
+    "unicode": "\ue67c"
+  },
+  {
+    "font_class": "smallcircle-filled",
+    "unicode": "\ue665"
+  },
+  {
+    "font_class": "sound",
+    "unicode": "\ue684"
+  },
+  {
+    "font_class": "sound-filled",
+    "unicode": "\ue686"
+  },
+  {
+    "font_class": "spinner-cycle",
+    "unicode": "\ue68a"
+  },
+  {
+    "font_class": "staff",
+    "unicode": "\ue6a7"
+  },
+  {
+    "font_class": "staff-filled",
+    "unicode": "\ue6cb"
+  },
+  {
+    "font_class": "star",
+    "unicode": "\ue688"
+  },
+  {
+    "font_class": "star-filled",
+    "unicode": "\ue68f"
+  },
+  {
+    "font_class": "starhalf",
+    "unicode": "\ue683"
+  },
+  {
+    "font_class": "trash",
+    "unicode": "\ue687"
+  },
+  {
+    "font_class": "trash-filled",
+    "unicode": "\ue685"
+  },
+  {
+    "font_class": "tune",
+    "unicode": "\ue6aa"
+  },
+  {
+    "font_class": "tune-filled",
+    "unicode": "\ue6ca"
+  },
+  {
+    "font_class": "undo",
+    "unicode": "\ue64f"
+  },
+  {
+    "font_class": "undo-filled",
+    "unicode": "\ue64c"
+  },
+  {
+    "font_class": "up",
+    "unicode": "\ue6b6"
+  },
+	{
+	  "font_class": "top",
+	  "unicode": "\ue6b6"
+	},
+  {
+    "font_class": "upload",
+    "unicode": "\ue690"
+  },
+  {
+    "font_class": "upload-filled",
+    "unicode": "\ue68e"
+  },
+  {
+    "font_class": "videocam",
+    "unicode": "\ue68c"
+  },
+  {
+    "font_class": "videocam-filled",
+    "unicode": "\ue689"
+  },
+  {
+    "font_class": "vip",
+    "unicode": "\ue6a8"
+  },
+  {
+    "font_class": "vip-filled",
+    "unicode": "\ue6c6"
+  },
+  {
+    "font_class": "wallet",
+    "unicode": "\ue6b1"
+  },
+  {
+    "font_class": "wallet-filled",
+    "unicode": "\ue6c2"
+  },
+  {
+    "font_class": "weibo",
+    "unicode": "\ue68b"
+  },
+  {
+    "font_class": "weixin",
+    "unicode": "\ue691"
+  }
+] as IconsDataItem[]
+
+// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)

+ 649 - 0
uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js

@@ -0,0 +1,649 @@
+
+export const fontData = [
+  {
+    "font_class": "arrow-down",
+    "unicode": "\ue6be"
+  },
+  {
+    "font_class": "arrow-left",
+    "unicode": "\ue6bc"
+  },
+  {
+    "font_class": "arrow-right",
+    "unicode": "\ue6bb"
+  },
+  {
+    "font_class": "arrow-up",
+    "unicode": "\ue6bd"
+  },
+  {
+    "font_class": "auth",
+    "unicode": "\ue6ab"
+  },
+  {
+    "font_class": "auth-filled",
+    "unicode": "\ue6cc"
+  },
+  {
+    "font_class": "back",
+    "unicode": "\ue6b9"
+  },
+  {
+    "font_class": "bars",
+    "unicode": "\ue627"
+  },
+  {
+    "font_class": "calendar",
+    "unicode": "\ue6a0"
+  },
+  {
+    "font_class": "calendar-filled",
+    "unicode": "\ue6c0"
+  },
+  {
+    "font_class": "camera",
+    "unicode": "\ue65a"
+  },
+  {
+    "font_class": "camera-filled",
+    "unicode": "\ue658"
+  },
+  {
+    "font_class": "cart",
+    "unicode": "\ue631"
+  },
+  {
+    "font_class": "cart-filled",
+    "unicode": "\ue6d0"
+  },
+  {
+    "font_class": "chat",
+    "unicode": "\ue65d"
+  },
+  {
+    "font_class": "chat-filled",
+    "unicode": "\ue659"
+  },
+  {
+    "font_class": "chatboxes",
+    "unicode": "\ue696"
+  },
+  {
+    "font_class": "chatboxes-filled",
+    "unicode": "\ue692"
+  },
+  {
+    "font_class": "chatbubble",
+    "unicode": "\ue697"
+  },
+  {
+    "font_class": "chatbubble-filled",
+    "unicode": "\ue694"
+  },
+  {
+    "font_class": "checkbox",
+    "unicode": "\ue62b"
+  },
+  {
+    "font_class": "checkbox-filled",
+    "unicode": "\ue62c"
+  },
+  {
+    "font_class": "checkmarkempty",
+    "unicode": "\ue65c"
+  },
+  {
+    "font_class": "circle",
+    "unicode": "\ue65b"
+  },
+  {
+    "font_class": "circle-filled",
+    "unicode": "\ue65e"
+  },
+  {
+    "font_class": "clear",
+    "unicode": "\ue66d"
+  },
+  {
+    "font_class": "close",
+    "unicode": "\ue673"
+  },
+  {
+    "font_class": "closeempty",
+    "unicode": "\ue66c"
+  },
+  {
+    "font_class": "cloud-download",
+    "unicode": "\ue647"
+  },
+  {
+    "font_class": "cloud-download-filled",
+    "unicode": "\ue646"
+  },
+  {
+    "font_class": "cloud-upload",
+    "unicode": "\ue645"
+  },
+  {
+    "font_class": "cloud-upload-filled",
+    "unicode": "\ue648"
+  },
+  {
+    "font_class": "color",
+    "unicode": "\ue6cf"
+  },
+  {
+    "font_class": "color-filled",
+    "unicode": "\ue6c9"
+  },
+  {
+    "font_class": "compose",
+    "unicode": "\ue67f"
+  },
+  {
+    "font_class": "contact",
+    "unicode": "\ue693"
+  },
+  {
+    "font_class": "contact-filled",
+    "unicode": "\ue695"
+  },
+  {
+    "font_class": "down",
+    "unicode": "\ue6b8"
+  },
+	{
+	  "font_class": "bottom",
+	  "unicode": "\ue6b8"
+	},
+  {
+    "font_class": "download",
+    "unicode": "\ue68d"
+  },
+  {
+    "font_class": "download-filled",
+    "unicode": "\ue681"
+  },
+  {
+    "font_class": "email",
+    "unicode": "\ue69e"
+  },
+  {
+    "font_class": "email-filled",
+    "unicode": "\ue69a"
+  },
+  {
+    "font_class": "eye",
+    "unicode": "\ue651"
+  },
+  {
+    "font_class": "eye-filled",
+    "unicode": "\ue66a"
+  },
+  {
+    "font_class": "eye-slash",
+    "unicode": "\ue6b3"
+  },
+  {
+    "font_class": "eye-slash-filled",
+    "unicode": "\ue6b4"
+  },
+  {
+    "font_class": "fire",
+    "unicode": "\ue6a1"
+  },
+  {
+    "font_class": "fire-filled",
+    "unicode": "\ue6c5"
+  },
+  {
+    "font_class": "flag",
+    "unicode": "\ue65f"
+  },
+  {
+    "font_class": "flag-filled",
+    "unicode": "\ue660"
+  },
+  {
+    "font_class": "folder-add",
+    "unicode": "\ue6a9"
+  },
+  {
+    "font_class": "folder-add-filled",
+    "unicode": "\ue6c8"
+  },
+  {
+    "font_class": "font",
+    "unicode": "\ue6a3"
+  },
+  {
+    "font_class": "forward",
+    "unicode": "\ue6ba"
+  },
+  {
+    "font_class": "gear",
+    "unicode": "\ue664"
+  },
+  {
+    "font_class": "gear-filled",
+    "unicode": "\ue661"
+  },
+  {
+    "font_class": "gift",
+    "unicode": "\ue6a4"
+  },
+  {
+    "font_class": "gift-filled",
+    "unicode": "\ue6c4"
+  },
+  {
+    "font_class": "hand-down",
+    "unicode": "\ue63d"
+  },
+  {
+    "font_class": "hand-down-filled",
+    "unicode": "\ue63c"
+  },
+  {
+    "font_class": "hand-up",
+    "unicode": "\ue63f"
+  },
+  {
+    "font_class": "hand-up-filled",
+    "unicode": "\ue63e"
+  },
+  {
+    "font_class": "headphones",
+    "unicode": "\ue630"
+  },
+  {
+    "font_class": "heart",
+    "unicode": "\ue639"
+  },
+  {
+    "font_class": "heart-filled",
+    "unicode": "\ue641"
+  },
+  {
+    "font_class": "help",
+    "unicode": "\ue679"
+  },
+  {
+    "font_class": "help-filled",
+    "unicode": "\ue674"
+  },
+  {
+    "font_class": "home",
+    "unicode": "\ue662"
+  },
+  {
+    "font_class": "home-filled",
+    "unicode": "\ue663"
+  },
+  {
+    "font_class": "image",
+    "unicode": "\ue670"
+  },
+  {
+    "font_class": "image-filled",
+    "unicode": "\ue678"
+  },
+  {
+    "font_class": "images",
+    "unicode": "\ue650"
+  },
+  {
+    "font_class": "images-filled",
+    "unicode": "\ue64b"
+  },
+  {
+    "font_class": "info",
+    "unicode": "\ue669"
+  },
+  {
+    "font_class": "info-filled",
+    "unicode": "\ue649"
+  },
+  {
+    "font_class": "left",
+    "unicode": "\ue6b7"
+  },
+  {
+    "font_class": "link",
+    "unicode": "\ue6a5"
+  },
+  {
+    "font_class": "list",
+    "unicode": "\ue644"
+  },
+  {
+    "font_class": "location",
+    "unicode": "\ue6ae"
+  },
+  {
+    "font_class": "location-filled",
+    "unicode": "\ue6af"
+  },
+  {
+    "font_class": "locked",
+    "unicode": "\ue66b"
+  },
+  {
+    "font_class": "locked-filled",
+    "unicode": "\ue668"
+  },
+  {
+    "font_class": "loop",
+    "unicode": "\ue633"
+  },
+  {
+    "font_class": "mail-open",
+    "unicode": "\ue643"
+  },
+  {
+    "font_class": "mail-open-filled",
+    "unicode": "\ue63a"
+  },
+  {
+    "font_class": "map",
+    "unicode": "\ue667"
+  },
+  {
+    "font_class": "map-filled",
+    "unicode": "\ue666"
+  },
+  {
+    "font_class": "map-pin",
+    "unicode": "\ue6ad"
+  },
+  {
+    "font_class": "map-pin-ellipse",
+    "unicode": "\ue6ac"
+  },
+  {
+    "font_class": "medal",
+    "unicode": "\ue6a2"
+  },
+  {
+    "font_class": "medal-filled",
+    "unicode": "\ue6c3"
+  },
+  {
+    "font_class": "mic",
+    "unicode": "\ue671"
+  },
+  {
+    "font_class": "mic-filled",
+    "unicode": "\ue677"
+  },
+  {
+    "font_class": "micoff",
+    "unicode": "\ue67e"
+  },
+  {
+    "font_class": "micoff-filled",
+    "unicode": "\ue6b0"
+  },
+  {
+    "font_class": "minus",
+    "unicode": "\ue66f"
+  },
+  {
+    "font_class": "minus-filled",
+    "unicode": "\ue67d"
+  },
+  {
+    "font_class": "more",
+    "unicode": "\ue64d"
+  },
+  {
+    "font_class": "more-filled",
+    "unicode": "\ue64e"
+  },
+  {
+    "font_class": "navigate",
+    "unicode": "\ue66e"
+  },
+  {
+    "font_class": "navigate-filled",
+    "unicode": "\ue67a"
+  },
+  {
+    "font_class": "notification",
+    "unicode": "\ue6a6"
+  },
+  {
+    "font_class": "notification-filled",
+    "unicode": "\ue6c1"
+  },
+  {
+    "font_class": "paperclip",
+    "unicode": "\ue652"
+  },
+  {
+    "font_class": "paperplane",
+    "unicode": "\ue672"
+  },
+  {
+    "font_class": "paperplane-filled",
+    "unicode": "\ue675"
+  },
+  {
+    "font_class": "person",
+    "unicode": "\ue699"
+  },
+  {
+    "font_class": "person-filled",
+    "unicode": "\ue69d"
+  },
+  {
+    "font_class": "personadd",
+    "unicode": "\ue69f"
+  },
+  {
+    "font_class": "personadd-filled",
+    "unicode": "\ue698"
+  },
+  {
+    "font_class": "personadd-filled-copy",
+    "unicode": "\ue6d1"
+  },
+  {
+    "font_class": "phone",
+    "unicode": "\ue69c"
+  },
+  {
+    "font_class": "phone-filled",
+    "unicode": "\ue69b"
+  },
+  {
+    "font_class": "plus",
+    "unicode": "\ue676"
+  },
+  {
+    "font_class": "plus-filled",
+    "unicode": "\ue6c7"
+  },
+  {
+    "font_class": "plusempty",
+    "unicode": "\ue67b"
+  },
+  {
+    "font_class": "pulldown",
+    "unicode": "\ue632"
+  },
+  {
+    "font_class": "pyq",
+    "unicode": "\ue682"
+  },
+  {
+    "font_class": "qq",
+    "unicode": "\ue680"
+  },
+  {
+    "font_class": "redo",
+    "unicode": "\ue64a"
+  },
+  {
+    "font_class": "redo-filled",
+    "unicode": "\ue655"
+  },
+  {
+    "font_class": "refresh",
+    "unicode": "\ue657"
+  },
+  {
+    "font_class": "refresh-filled",
+    "unicode": "\ue656"
+  },
+  {
+    "font_class": "refreshempty",
+    "unicode": "\ue6bf"
+  },
+  {
+    "font_class": "reload",
+    "unicode": "\ue6b2"
+  },
+  {
+    "font_class": "right",
+    "unicode": "\ue6b5"
+  },
+  {
+    "font_class": "scan",
+    "unicode": "\ue62a"
+  },
+  {
+    "font_class": "search",
+    "unicode": "\ue654"
+  },
+  {
+    "font_class": "settings",
+    "unicode": "\ue653"
+  },
+  {
+    "font_class": "settings-filled",
+    "unicode": "\ue6ce"
+  },
+  {
+    "font_class": "shop",
+    "unicode": "\ue62f"
+  },
+  {
+    "font_class": "shop-filled",
+    "unicode": "\ue6cd"
+  },
+  {
+    "font_class": "smallcircle",
+    "unicode": "\ue67c"
+  },
+  {
+    "font_class": "smallcircle-filled",
+    "unicode": "\ue665"
+  },
+  {
+    "font_class": "sound",
+    "unicode": "\ue684"
+  },
+  {
+    "font_class": "sound-filled",
+    "unicode": "\ue686"
+  },
+  {
+    "font_class": "spinner-cycle",
+    "unicode": "\ue68a"
+  },
+  {
+    "font_class": "staff",
+    "unicode": "\ue6a7"
+  },
+  {
+    "font_class": "staff-filled",
+    "unicode": "\ue6cb"
+  },
+  {
+    "font_class": "star",
+    "unicode": "\ue688"
+  },
+  {
+    "font_class": "star-filled",
+    "unicode": "\ue68f"
+  },
+  {
+    "font_class": "starhalf",
+    "unicode": "\ue683"
+  },
+  {
+    "font_class": "trash",
+    "unicode": "\ue687"
+  },
+  {
+    "font_class": "trash-filled",
+    "unicode": "\ue685"
+  },
+  {
+    "font_class": "tune",
+    "unicode": "\ue6aa"
+  },
+  {
+    "font_class": "tune-filled",
+    "unicode": "\ue6ca"
+  },
+  {
+    "font_class": "undo",
+    "unicode": "\ue64f"
+  },
+  {
+    "font_class": "undo-filled",
+    "unicode": "\ue64c"
+  },
+  {
+    "font_class": "up",
+    "unicode": "\ue6b6"
+  },
+	{
+	  "font_class": "top",
+	  "unicode": "\ue6b6"
+	},
+  {
+    "font_class": "upload",
+    "unicode": "\ue690"
+  },
+  {
+    "font_class": "upload-filled",
+    "unicode": "\ue68e"
+  },
+  {
+    "font_class": "videocam",
+    "unicode": "\ue68c"
+  },
+  {
+    "font_class": "videocam-filled",
+    "unicode": "\ue689"
+  },
+  {
+    "font_class": "vip",
+    "unicode": "\ue6a8"
+  },
+  {
+    "font_class": "vip-filled",
+    "unicode": "\ue6c6"
+  },
+  {
+    "font_class": "wallet",
+    "unicode": "\ue6b1"
+  },
+  {
+    "font_class": "wallet-filled",
+    "unicode": "\ue6c2"
+  },
+  {
+    "font_class": "weibo",
+    "unicode": "\ue68b"
+  },
+  {
+    "font_class": "weixin",
+    "unicode": "\ue691"
+  }
+]
+
+// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)

+ 14 - 12
uni_modules/uni-icons/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-icons",
   "displayName": "uni-icons 图标",
-  "version": "1.3.5",
+  "version": "2.0.9",
   "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
   "keywords": [
     "uni-ui",
@@ -16,11 +16,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -37,7 +33,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": ["uni-scss"],
@@ -50,7 +47,8 @@
       "client": {
         "App": {
           "app-vue": "y",
-          "app-nvue": "y"
+          "app-nvue": "y",
+          "app-uvue": "y"
         },
         "H5-mobile": {
           "Safari": "y",
@@ -70,11 +68,15 @@
           "阿里": "y",
           "百度": "y",
           "字节跳动": "y",
-          "QQ": "y"
+          "QQ": "y",
+					"钉钉": "y",
+					"快手": "y",
+					"飞书": "y",
+					"京东": "y"
         },
         "快应用": {
-          "华为": "u",
-          "联盟": "u"
+          "华为": "y",
+          "联盟": "y"
         },
         "Vue": {
             "vue2": "y",
@@ -83,4 +85,4 @@
       }
     }
   }
-}
+}

+ 2 - 0
uni_modules/uni-notice-bar/changelog.md

@@ -1,3 +1,5 @@
+## 1.2.2(2023-12-20)
+- 修复动态绑定title时,滚动速度不一致的问题
 ## 1.2.1(2022-09-05)
 - 新增 属性 fontSize,可修改文字大小。
 ## 1.2.0(2021-11-19)

+ 5 - 0
uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue

@@ -150,6 +150,11 @@
 				animationDelay: '0s'
 			}
 		},
+		watch:{
+			text:function(newValue,oldValue){
+				this.initSize();
+			}
+		},
 		computed: {
 			isShowGetMore() {
 				return this.showGetMore === true || this.showGetMore === 'true'

+ 1 - 1
uni_modules/uni-notice-bar/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-notice-bar",
   "displayName": "uni-notice-bar 通告栏",
-  "version": "1.2.1",
+  "version": "1.2.2",
   "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告",
   "keywords": [
     "uni-ui",

+ 2 - 0
uni_modules/uni-popup/changelog.md

@@ -1,3 +1,5 @@
+## 1.8.4(2023-11-15)
+- 新增 uni-popup 支持uni-app-x 注意暂时仅支持 `maskClick` `@open` `@close`
 ## 1.8.3(2023-04-17)
 - 修复 uni-popup 重复打开时的 bug
 ## 1.8.2(2023-02-02)

+ 90 - 0
uni_modules/uni-popup/components/uni-popup/uni-popup.uvue

@@ -0,0 +1,90 @@
+<template>
+  <view class="popup-root" v-if="isOpen" v-show="isShow" @click="clickMask">
+    <view @click.stop>
+      <slot></slot>
+    </view>
+  </view>
+</template>
+
+<script>
+  type CloseCallBack = ()=> void;
+  let closeCallBack:CloseCallBack = () :void => {};
+  export default {
+    emits:["close","clickMask"],
+    data() {
+      return {
+        isShow:false,
+        isOpen:false
+      }
+    },
+    props: {
+      maskClick: {
+        type: Boolean,
+        default: true
+      },
+    },
+    watch: {
+      // 设置show = true 时,如果没有 open 需要设置为 open
+      isShow:{
+        handler(isShow) {
+          // console.log("isShow",isShow)
+          if(isShow && this.isOpen == false){
+            this.isOpen = true
+          }
+        },
+        immediate:true
+      },
+      // 设置isOpen = true 时,如果没有 isShow 需要设置为 isShow
+      isOpen:{
+        handler(isOpen) {
+          // console.log("isOpen",isOpen)
+          if(isOpen && this.isShow == false){
+            this.isShow = true
+          }
+        },
+        immediate:true
+      }
+    },
+    methods:{
+      open(){
+        // ...funs : CloseCallBack[]
+        // if(funs.length > 0){
+        //   closeCallBack = funs[0]
+        // }
+        this.isOpen = true;
+      },
+      clickMask(){
+        if(this.maskClick == true){
+          this.$emit('clickMask')
+          this.close()
+        }
+      },
+      close(): void{
+        this.isOpen = false;
+        this.$emit('close')
+        closeCallBack()
+      },
+      hiden(){
+        this.isShow = false
+      },
+      show(){
+        this.isShow = true
+      }
+    }
+  }
+</script>
+
+<style>
+.popup-root {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 750rpx;
+  height: 100%;
+  flex: 1;
+  background-color: rgba(0, 0, 0, 0.3);
+  justify-content: center;
+  align-items: center;
+  z-index: 99;
+}
+</style>

+ 1 - 1
uni_modules/uni-popup/components/uni-popup/uni-popup.vue

@@ -163,7 +163,7 @@
 				},
 				maskShow: true,
 				mkclick: true,
-				popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
+				popupstyle: 'top'
 			}
 		},
 		computed: {

+ 1 - 1
uni_modules/uni-popup/package.json

@@ -1,7 +1,7 @@
 {
 	"id": "uni-popup",
 	"displayName": "uni-popup 弹出层",
-	"version": "1.8.3",
+	"version": "1.8.4",
 	"description": " Popup 组件,提供常用的弹层",
 	"keywords": [
         "uni-ui",

+ 4 - 0
uni_modules/uni-swipe-action/changelog.md

@@ -1,3 +1,7 @@
+## 1.3.10(2024-01-17)
+- 修复 点击按钮时,按钮会被点击穿透导致自动收缩的 bug(兼容阿里/百度/抖音小程序)
+## 1.3.9(2024-01-17)
+- 修复 点击按钮时,按钮会被点击穿透导致自动收缩的 bug
 ## 1.3.8(2023-04-13)
 - 修复`uni-swipe-action`和`uni-swipe-action-item`不同时使用导致 closeOther 方法报错的 bug
 ## 1.3.7(2022-06-06)

+ 15 - 14
uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue

@@ -6,20 +6,19 @@
 		<view class="uni-swipe_box" :change:prop="wxsswipe.showWatch" :prop="is_show" :data-threshold="threshold"
 			:data-disabled="disabled" @touchstart="wxsswipe.touchstart" @touchmove="wxsswipe.touchmove"
 			@touchend="wxsswipe.touchend">
-			<!-- #endif -->
+		<!-- #endif -->
 			<!--  #ifndef MP-WEIXIN || VUE3 -->
 			<view class="uni-swipe_box" :change:prop="renderswipe.showWatch" :prop="is_show" :data-threshold="threshold"
 				:data-disabled="disabled+''" @touchstart="renderswipe.touchstart" @touchmove="renderswipe.touchmove"
 				@touchend="renderswipe.touchend">
-				<!-- #endif -->
+			<!-- #endif -->
 				<!-- 在微信小程序 app vue端 h5 使用wxs 实现-->
 				<view class="uni-swipe_button-group button-group--left">
 					<slot name="left">
 						<view v-for="(item,index) in leftOptions" :key="index" :style="{
 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'
-					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
-							@touchend="appTouchEnd($event,index,item,'left')"
-							@click.stop="onClickForPC(index,item,'left')">
+					}" class="uni-swipe_button button-hock" @touchstart.stop="appTouchStart"
+							@touchend.stop="appTouchEnd($event,index,item,'left')" @click.stop="onClickForPC(index,item,'left')">
 							<text class="uni-swipe_button-text"
 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text>
 						</view>
@@ -32,9 +31,9 @@
 					<slot name="right">
 						<view v-for="(item,index) in rightOptions" :key="index" :style="{
 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'
-					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
-							@touchend="appTouchEnd($event,index,item,'right')"
-							@click.stop="onClickForPC(index,item,'right')"><text class="uni-swipe_button-text"
+					}" class="uni-swipe_button button-hock" @touchstart.stop="appTouchStart"
+							@touchend.stop="appTouchEnd($event,index,item,'right')" @click.stop="onClickForPC(index,item,'right')"><text
+								class="uni-swipe_button-text"
 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text>
 						</view>
 					</slot>
@@ -49,9 +48,11 @@
 				<slot name="left">
 					<view v-for="(item,index) in leftOptions" :key="index" :style="{
 				  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'
-				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'left')"><text
-							class="uni-swipe_button-text"
-							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF', fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text>
+				}" class="uni-swipe_button button-hock" @click.stop="onClick(index,item,'left')">
+						<text class="uni-swipe_button-text"
+							:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF', fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">
+							{{ item.text }}
+						</text>
 					</view>
 				</slot>
 			</view>
@@ -80,8 +81,8 @@
 						<view v-for="(item,index) in leftOptions" :key="index" :style="{
 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
 					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
-					}" class="uni-swipe_button button-hock" @touchstart="appTouchStart"
-							@touchend="appTouchEnd($event,index,item,'left')"><text class="uni-swipe_button-text"
+					}" class="uni-swipe_button button-hock" @touchstart.stop="appTouchStart"
+							@touchend.stop="appTouchEnd($event,index,item,'left')"><text class="uni-swipe_button-text"
 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text>
 						</view>
 					</slot>
@@ -92,7 +93,7 @@
 						<view v-for="(item,index) in rightOptions" :key="index" :style="{
 					  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
 					  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
-					}" @touchstart="appTouchStart" @touchend="appTouchEnd($event,index,item,'right')"
+					}" @touchstart.stop="appTouchStart" @touchend.stop="appTouchEnd($event,index,item,'right')"
 							class="uni-swipe_button button-hock"><text class="uni-swipe_button-text"
 								:style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text>
 						</view>

+ 1 - 1
uni_modules/uni-swipe-action/package.json

@@ -1,7 +1,7 @@
 {
 	"id": "uni-swipe-action",
 	"displayName": "uni-swipe-action 滑动操作",
-	"version": "1.3.8",
+	"version": "1.3.10",
 	"description": "SwipeAction 滑动操作操作组件",
 	"keywords": [
         "",

+ 2 - 0
uni_modules/uni-table/changelog.md

@@ -1,3 +1,5 @@
+## 1.2.4(2023-12-19)
+- 修复 uni-tr只有一列时minWidth计算错误,列变化实时计算更新
 ## 1.2.3(2023-03-28)
 - 修复 在vue3模式下可能会出现错误的问题
 ## 1.2.2(2022-11-29)

+ 5 - 1
uni_modules/uni-table/components/uni-tr/uni-tr.vue

@@ -71,7 +71,7 @@ export default {
 	mounted() {
 		if (this.widthThArr.length > 0) {
 			const selectionWidth = this.selection === 'selection' ? 50 : 0
-			this.root.minWidth = this.widthThArr.reduce((a, b) => Number(a) + Number(b)) + selectionWidth
+			this.root.minWidth = Number(this.widthThArr.reduce((a, b) => Number(a) + Number(b))) + selectionWidth;
 		}
 	},
 	// #ifndef VUE3
@@ -91,6 +91,10 @@ export default {
 	methods: {
 		minWidthUpdate(width) {
 			this.widthThArr.push(width)
+			if (this.widthThArr.length > 0) {
+				const selectionWidth = this.selection === 'selection' ? 50 : 0;
+				this.root.minWidth = Number(this.widthThArr.reduce((a, b) => Number(a) + Number(b))) + selectionWidth;
+			}
 		},
 		// 选中
 		checkboxSelected(e) {

+ 1 - 1
uni_modules/uni-table/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-table",
   "displayName": "uni-table 表格",
-  "version": "1.2.3",
+  "version": "1.2.4",
   "description": "表格组件,多用于展示多条结构类似的数据,如",
   "keywords": [
     "uni-ui",

+ 2 - 0
uni_modules/uni-tooltip/changelog.md

@@ -1,3 +1,5 @@
+## 0.2.2(2024-01-15)
+- 新增 placement支持设置四个方向:top bottom left right
 ## 0.2.1(2022-05-09)
 - 修复 content 为空时仍然弹出的bug
 ## 0.2.0(2022-05-07)

+ 47 - 7
uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="uni-tooltip">
 		<slot></slot>
-		<view v-if="content || $slots.content" class="uni-tooltip-popup">
+		<view v-if="content || $slots.content" class="uni-tooltip-popup" :style="initPlacement">
 			<slot name="content">
 				{{content}}
 			</slot>
@@ -16,10 +16,8 @@
 	 * @description 常用于展示鼠标 hover 时的提示信息。
 	 * @tutorial https://uniapp.dcloud.io/component/uniui/uni-tooltip
 	 * @property {String} content   弹出层显示的内容
-	 * @property {String}  placement出现位置, 目前只支持 left
+	 * @property {String}  placement出现位置, 目前支持:left right top bottom
 	 */
-
-
 	export default {
 		name: "uni-tooltip",
 		data() {
@@ -27,6 +25,48 @@
 
 			};
 		},
+		methods: {
+		},
+		computed: {
+			initPlacement() {
+				let style = {};
+				switch (this.placement) {
+					case 'left':
+						style = {
+							top: '50%',
+							transform: 'translateY(-50%)',
+							right: '100%',
+							"margin-right": '10rpx',
+						}
+						break;
+					case 'right':
+						style = {
+							top: '50%',
+							transform: 'translateY(-50%)',
+							left: '100%',
+							"margin-left": '10rpx',
+						}
+						break;
+					case 'top':
+						style = {
+							bottom: '100%',
+							transform: 'translateX(-50%)',
+							left: '50%',
+							"margin-bottom": '10rpx',
+						}
+						break;
+					case 'bottom':
+						style = {
+							top: '100%',
+							transform: 'translateX(-50%)',
+							left: '50%',
+							"margin-top": '10rpx',
+						}
+						break;
+				}
+				return style;
+			}
+		},
 		props: {
 			content: {
 				type: String,
@@ -35,7 +75,7 @@
 
 			placement: {
 				type: String,
-				default: 'bottom'
+				default: 'left'
 			},
 		}
 	}
@@ -51,7 +91,6 @@
 		z-index: 1;
 		display: none;
 		position: absolute;
-		left: 0;
 		background-color: #333;
 		border-radius: 8px;
 		color: #fff;
@@ -59,10 +98,11 @@
 		text-align: left;
 		line-height: 16px;
 		padding: 12px;
+		overflow: auto;
 	}
 
 
 	.uni-tooltip:hover .uni-tooltip-popup {
 		display: block;
 	}
-</style>
+</style>

+ 13 - 11
uni_modules/uni-tooltip/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-tooltip",
-  "displayName": "uni-tooltip",
-  "version": "0.2.1",
+  "displayName": "uni-tooltip 提示文字",
+  "version": "0.2.2",
   "description": "Tooltip 提示文字",
   "keywords": [
     "uni-tooltip",
@@ -10,14 +10,14 @@
     "tip",
     "文字提示"
 ],
-  "repository": "",
-"engines": {
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
   },
-  "dcloudext": {
-    "category": [
-        "前端组件",
-        "通用组件"
-    ],
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -34,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": ""
+    "npmurl": "",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [],
@@ -71,7 +72,8 @@
           "阿里": "u",
           "百度": "u",
           "字节跳动": "u",
-          "QQ": "u"
+          "QQ": "u",
+          "京东": "u"
         },
         "快应用": {
           "华为": "u",

+ 26 - 1
uni_modules/uni-ui/changelog.md

@@ -1,4 +1,29 @@
-## 1.4.27(2023-04-23)
+## 1.5.0(2024-01-13)
+- 修复 npm包结构目录错误的问题
+- uni-calendar 修复 回到今天时,月份显示不一致问题
+- uni-data-picker 新增 支持 uni-app-x
+- uni-datetime-picker 优化 增加noChange事件,当进行日期范围选择时,若有空值,则触发该事件 [详情](https://github.com/dcloudio/uni-ui/issues/815)
+- uni-datetime-picker 修复 字节小程序时间选择范围器失效问题 [详情](https://github.com/dcloudio/uni-ui/issues/834)
+- uni-datetime-picker 修复 PC端初次修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737)
+- uni-datetime-picker 修复 部分情况修改时间,开始、结束时间显示异常的Bug [详情](https://ask.dcloud.net.cn/question/171146)
+- uni-datetime-picker 优化 当前月可以选择上月、下月的日期的Bug
+- uni-file-picker 新增 微信小程序不再调用chooseImage,而是调用chooseMedia
+- uni-file-picker 新增 上传文件至云存储携带本地文件名称
+- uni-forms 优化 labelWidth 描述错误
+fix: 修复图标大小默认值错误的问题
+- uni-icons 修复 项目未使用 ts 情况下,打包报错的bug
+- uni-icons 修复 size 属性为 string 时,不加单位导致尺寸异常的bug
+- uni-icons 优化 兼容老版本icon类型,如 top ,bottom 等
+- uni-icons 优化 兼容老版本icon类型,如 top ,bottom 等
+- uni-icons 优化 uni-app x 下示例项目图标排序
+- uni-icons 修复 nvue下引入组件报错的bug
+-优化 size 属性支持单位
+- uni-icons 新增 uni-app x 支持定义图标
+- uni-notice-bar 修复动态绑定title时,滚动速度不一致的问题
+更新示例工程
+- uni-popup 新增 uni-popup 支持uni-app-x 注意暂时仅支持 `maskClick` `@open` `@close`
+- uni-table 修复 uni-tr只有一列时minWidth计算错误,列变化实时计算更新
+## 1.4.27(2023-04-21)
 - uni-calendar 修复 某些情况 monthSwitch 未触发的Bug
 - uni-calendar 修复 某些情况切换月份错误的Bug
 - uni-data-picker 修复 更改 modelValue 报错的 bug

+ 2 - 2
uni_modules/uni-ui/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-ui",
   "displayName": "uni-ui",
-  "version": "1.4.27",
+  "version": "1.5.0",
   "description": "uni-ui 是基于uni-app的、全端兼容的、高性能UI框架",
   "keywords": [
     "uni-ui",
@@ -126,4 +126,4 @@
       }
     }
   }
-}
+}

+ 6 - 0
uni_modules/uv-checkbox/changelog.md

@@ -1,3 +1,9 @@
+## 1.0.14(2023-11-04)
+1. 修复label文字较多不分行的问题
+## 1.0.13(2023-10-11)
+1. 优化同类问题:https://gitee.com/climblee/uv-ui/issues/I872VD
+## 1.0.12(2023-09-22)
+1. 修复change回调中v-model值不更新的BUG
 ## 1.0.11(2023-09-01)
 1. 修复点击空隙处无效的问题
 2. label支持插槽下可点击

+ 3 - 3
uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue

@@ -86,8 +86,6 @@
 						values.push(child.name)
 					}
 				})
-				// 发出事件
-				this.$emit('change', values)
 				// 修改通过v-model绑定的值
 				// #ifdef VUE2
 				this.$emit('input', values)
@@ -95,7 +93,9 @@
 				// #ifdef VUE3
 				this.$emit('update:modelValue',values)
 				// #endif
-			},
+				// 发出事件
+				this.$emit('change', values)
+			}
 		}
 	}
 </script>

+ 2 - 1
uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue

@@ -182,7 +182,7 @@
 				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle))
 			}
 		},
-		mounted() {
+		created() {
 			this.init()
 		},
 		methods: {
@@ -363,6 +363,7 @@
 		}
 		
 		&__label-wrap {
+			flex: 1;
 			padding-left: $uv-checkbox-label-wrap-padding-right;
 		}
 	}

+ 1 - 1
uni_modules/uv-checkbox/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uv-checkbox",
   "displayName": "uv-checkbox 复选框 全面兼容vue3+2、app、h5、小程序等多端",
-  "version": "1.0.11",
+  "version": "1.0.14",
   "description": "复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便。",
   "keywords": [
     "uv-checkbox",

+ 2 - 0
uni_modules/uv-empty/changelog.md

@@ -1,3 +1,5 @@
+## 1.0.5(2023-12-20)
+1. 优化
 ## 1.0.4(2023-08-04)
 1. icon支持base64图片
 ## 1.0.3(2023-07-17)

+ 1 - 1
uni_modules/uv-empty/components/uv-empty/uv-empty.vue

@@ -84,7 +84,7 @@
 				const style = {}
 				style.marginTop = this.$uv.addUnit(this.marginTop)
 				// 合并customStyle样式,此参数通过mixin中的props传递
-				return this.$uv.deepMerge(this.$uv.addStyle(this.customStyle), style)
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle))
 			},
 			// 文本样式
 			textStyle() {

+ 1 - 1
uni_modules/uv-empty/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uv-empty",
   "displayName": "uv-empty 内容为空 全面兼容vue3+2、app、h5、小程序等多端",
-  "version": "1.0.4",
+  "version": "1.0.5",
   "description": "该组件用于需要加载内容,但是加载的第一页数据就为空,提示一个 没有内容 的场景, 我们精心挑选了十几个场景的图标,方便您使用。",
   "keywords": [
     "empty",

+ 6 - 0
uni_modules/uv-icon/changelog.md

@@ -1,3 +1,9 @@
+## 1.0.13(2023-12-06)
+1. 优化
+## 1.0.12(2023-12-06)
+1. 阻止事件冒泡处理
+## 1.0.11(2023-10-29)
+1. imgMode默认值改成aspectFit
 ## 1.0.10(2023-08-13)
 1. 优化nvue,方便自定义图标
 ## 1.0.9(2023-07-28)

+ 1 - 1
uni_modules/uv-icon/components/uv-icon/props.js

@@ -63,7 +63,7 @@ export default {
 		// 图片的mode
 		imgMode: {
 			type: String,
-			default: ''
+			default: 'aspectFit'
 		},
 		// 用于显示图片小图标时,图片的宽度
 		width: {

+ 1 - 1
uni_modules/uv-icon/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uv-icon",
   "displayName": "uv-icon 图标 全面兼容vue3+2、app、h5、小程序等多端",
-  "version": "1.0.10",
+  "version": "1.0.13",
   "description": "基于字体的图标集,包含了大多数常见场景的图标,支持自定义,支持自定义图片图标等。可自定义颜色、大小。",
   "keywords": [
     "uv-ui,uvui,uv-icon,icon,图标,字体图标"

+ 4 - 0
uni_modules/uv-transition/changelog.md

@@ -1,3 +1,7 @@
+## 1.0.8(2023-10-18)
+1. 修复在APP上不能正常显示的BUG
+## 1.0.7(2023-10-12)
+1. 修复部分情况,修改某属性自动关闭的BUG
 ## 1.0.6(2023-07-24)
 1. 优化  nvue模式下增加cellChild参数,是否在list中cell节点下,nvue中cell下建议设置成true
 ## 1.0.5(2023-07-02)

+ 5 - 0
uni_modules/uv-transition/components/uv-transition/uv-transition.vue

@@ -210,6 +210,11 @@
 						this.$emit('change', {
 							detail: this.isShow
 						})
+						// #ifdef H5
+						// #ifdef VUE3
+						this.transform = '';
+						// #endif
+						// #endif
 					}, 20);
 				})
 			},

+ 1 - 1
uni_modules/uv-transition/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uv-transition",
   "displayName": "uv-transition 动画 全面兼容vue3+2、app、h5、小程序等多端",
-  "version": "1.0.6",
+  "version": "1.0.8",
   "description": "transition 该组件用于组件的动画过渡效果。",
   "keywords": [
     "uv-transition",

+ 28 - 0
uni_modules/uv-ui-tools/changelog.md

@@ -1,3 +1,31 @@
+## 1.1.25(2024-01-20)
+1.1.20版本更新
+## 1.1.24(2023-12-21)
+1. luch-request更新
+## 1.1.23(2023-12-12)
+1. 1.1.19版本
+## 1.1.22(2023-11-28)
+1. 优化
+## 1.1.21(2023-11-10)
+1. 1.1.17版本
+## 1.1.20(2023-10-30)
+1. 1.1.16版本
+## 1.1.19(2023-10-13)
+1. 兼容vue3
+## 1.1.18(2023-10-12)
+1. 1.1.15版本
+## 1.1.17(2023-09-27)
+1. 1.1.14版本发布
+## 1.1.16(2023-09-15)
+1. 1.1.13版本发布
+## 1.1.15(2023-09-15)
+1. 更新button.js相关按钮支持open-type="agreePrivacyAuthorization"
+## 1.1.14(2023-09-14)
+1. 优化dayjs
+## 1.1.13(2023-09-13)
+1. 优化,$uv中增加unit参数,方便组件中使用
+## 1.1.12(2023-09-10)
+1. 升级版本
 ## 1.1.11(2023-09-04)
 1. 1.1.11版本
 ## 1.1.10(2023-08-31)

+ 1 - 1
uni_modules/uv-ui-tools/index.js

@@ -6,7 +6,7 @@ import mixin from './libs/mixin/mixin.js'
 // 小程序特有的mixin
 import mpMixin from './libs/mixin/mpMixin.js'
 // #ifdef MP
-import mpShare from '@/uni_modules/uv-ui-tools/libs/mixin/mpShare.js'
+import mpShare from './libs/mixin/mpShare.js'
 // #endif
 
 // 路由封装

+ 2 - 2
uni_modules/uv-ui-tools/libs/config/config.js

@@ -1,5 +1,5 @@
-// 此版本发布于2023-09-02
-const version = '1.1.11'
+// 此版本发布于2024-01-20
+const version = '1.1.20'
 
 // 开发环境才提示,生产环境不会提示
 if (process.env.NODE_ENV === 'development') {

+ 107 - 72
uni_modules/uv-ui-tools/libs/luch-request/adapters/index.js

@@ -1,7 +1,7 @@
 import buildURL from '../helpers/buildURL'
 import buildFullPath from '../core/buildFullPath'
 import settle from '../core/settle'
-import { isUndefined } from '../utils'
+import {isUndefined} from "../utils"
 
 /**
  * 返回可选值存在的配置
@@ -10,88 +10,123 @@ import { isUndefined } from '../utils'
  * @return {{}} - 存在的配置项
  */
 const mergeKeys = (keys, config2) => {
-    const config = {}
-    keys.forEach((prop) => {
-        if (!isUndefined(config2[prop])) {
-            config[prop] = config2[prop]
-        }
-    })
-    return config
+  let config = {}
+  keys.forEach(prop => {
+    if (!isUndefined(config2[prop])) {
+      config[prop] = config2[prop]
+    }
+  })
+  return config
 }
-export default (config) => new Promise((resolve, reject) => {
-    const fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)
+export default (config) => {
+  return new Promise((resolve, reject) => {
+    let fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params, config.paramsSerializer)
     const _config = {
-        url: fullPath,
-        header: config.header,
-        complete: (response) => {
-            config.fullPath = fullPath
-            response.config = config
-            try {
-                // 对可能字符串不是json 的情况容错
-                if (typeof response.data === 'string') {
-                    response.data = JSON.parse(response.data)
-                }
-                // eslint-disable-next-line no-empty
-            } catch (e) {
-            }
-            settle(resolve, reject, response)
+      url: fullPath,
+      header: config.header,
+      complete: (response) => {
+        config.fullPath = fullPath
+        response.config = config
+        response.rawData = response.data
+        try {
+          let jsonParseHandle = false
+          const forcedJSONParsingType = typeof config.forcedJSONParsing
+          if (forcedJSONParsingType === 'boolean') {
+            jsonParseHandle = config.forcedJSONParsing
+          } else if (forcedJSONParsingType === 'object') {
+            const includesMethod = config.forcedJSONParsing.include || []
+            jsonParseHandle = includesMethod.includes(config.method)
+          }
+
+          // 对可能字符串不是json 的情况容错
+          if (jsonParseHandle && typeof response.data === 'string') {
+            response.data = JSON.parse(response.data)
+          }
+          // eslint-disable-next-line no-empty
+        } catch (e) {
         }
+        settle(resolve, reject, response)
+      }
     }
     let requestTask
     if (config.method === 'UPLOAD') {
-        delete _config.header['content-type']
-        delete _config.header['Content-Type']
-        const otherConfig = {
+      delete _config.header['content-type']
+      delete _config.header['Content-Type']
+      let otherConfig = {
         // #ifdef MP-ALIPAY
-            fileType: config.fileType,
-            // #endif
-            filePath: config.filePath,
-            name: config.name
-        }
-        const optionalKeys = [
+        fileType: config.fileType,
+        // #endif
+        filePath: config.filePath,
+        name: config.name
+      }
+      const optionalKeys = [
         // #ifdef APP-PLUS || H5
-            'files',
-            // #endif
-            // #ifdef H5
-            'file',
-            // #endif
-            // #ifdef H5 || APP-PLUS
-            'timeout',
-            // #endif
-            'formData'
-        ]
-        requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) })
+        'files',
+        // #endif
+        // #ifdef H5
+        'file',
+        // #endif
+        // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+        'timeout',
+        // #endif
+        'formData'
+      ]
+      requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)})
     } else if (config.method === 'DOWNLOAD') {
-        // #ifdef H5 || APP-PLUS
-        if (!isUndefined(config.timeout)) {
-            _config.timeout = config.timeout
-        }
+      const optionalKeys = [
+        // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+        'timeout',
         // #endif
-        requestTask = uni.downloadFile(_config)
+        // #ifdef MP
+        'filePath',
+        // #endif
+      ]
+      requestTask = uni.downloadFile({..._config, ...mergeKeys(optionalKeys, config)})
     } else {
-        const optionalKeys = [
-            'data',
-            'method',
-            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
-            'timeout',
-            // #endif
-            'dataType',
-            // #ifndef MP-ALIPAY
-            'responseType',
-            // #endif
-            // #ifdef APP-PLUS
-            'sslVerify',
-            // #endif
-            // #ifdef H5
-            'withCredentials',
-            // #endif
-            // #ifdef APP-PLUS
-            'firstIpv4'
-        // #endif
-        ]
-        requestTask = uni.request({ ..._config, ...mergeKeys(optionalKeys, config) })
+      const optionalKeys = [
+        'data',
+        'method',
+        // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+        'timeout',
+        // #endif
+        'dataType',
+        // #ifndef MP-ALIPAY
+        'responseType',
+        // #endif
+        // #ifdef APP-PLUS
+        'sslVerify',
+        // #endif
+        // #ifdef H5
+        'withCredentials',
+        // #endif
+        // #ifdef APP-PLUS
+        'firstIpv4',
+        // #endif
+        // #ifdef MP-WEIXIN
+        'enableHttp2',
+        'enableQuic',
+        // #endif
+        // #ifdef MP-TOUTIAO || MP-WEIXIN
+        'enableCache',
+        // #endif
+        // #ifdef MP-WEIXIN
+        'enableHttpDNS',
+        'httpDNSServiceId',
+        'enableChunked',
+        'forceCellularNetwork',
+        // #endif
+        // #ifdef MP-ALIPAY
+        'enableCookie',
+        // #endif
+        // #ifdef MP-BAIDU
+        'cloudCache',
+        'defer'
+        // #endif
+      ]
+      requestTask = uni.request({..._config, ...mergeKeys(optionalKeys, config)})
     }
     if (config.getTask) {
-        config.getTask(requestTask, config)
+      config.getTask(requestTask, config)
     }
-})
+  })
+}

+ 15 - 14
uni_modules/uv-ui-tools/libs/luch-request/core/InterceptorManager.js

@@ -1,7 +1,8 @@
 'use strict'
 
+
 function InterceptorManager() {
-    this.handlers = []
+  this.handlers = []
 }
 
 /**
@@ -13,11 +14,11 @@ function InterceptorManager() {
  * @return {Number} An ID used to remove interceptor later
  */
 InterceptorManager.prototype.use = function use(fulfilled, rejected) {
-    this.handlers.push({
-        fulfilled,
-        rejected
-    })
-    return this.handlers.length - 1
+  this.handlers.push({
+    fulfilled: fulfilled,
+    rejected: rejected
+  })
+  return this.handlers.length - 1
 }
 
 /**
@@ -26,9 +27,9 @@ InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  * @param {Number} id The ID that was returned by `use`
  */
 InterceptorManager.prototype.eject = function eject(id) {
-    if (this.handlers[id]) {
-        this.handlers[id] = null
-    }
+  if (this.handlers[id]) {
+    this.handlers[id] = null
+  }
 }
 
 /**
@@ -40,11 +41,11 @@ InterceptorManager.prototype.eject = function eject(id) {
  * @param {Function} fn The function to call for each interceptor
  */
 InterceptorManager.prototype.forEach = function forEach(fn) {
-    this.handlers.forEach((h) => {
-        if (h !== null) {
-            fn(h)
-        }
-    })
+  this.handlers.forEach(h => {
+    if (h !== null) {
+      fn(h)
+    }
+  })
 }
 
 export default InterceptorManager

+ 141 - 138
uni_modules/uv-ui-tools/libs/luch-request/core/Request.js

@@ -1,16 +1,14 @@
 /**
  * @Class Request
  * @description luch-request http请求插件
- * @version 3.0.7
  * @Author lu-ch
- * @Date 2021-09-04
  * @Email webwork.s@qq.com
  * 文档: https://www.quanzhan.co/luch-request/
  * github: https://github.com/lei-mu/luch-request
  * DCloud: http://ext.dcloud.net.cn/plugin?id=392
- * HBuilderX: beat-3.0.4 alpha-3.0.4
  */
 
+
 import dispatchRequest from './dispatchRequest'
 import InterceptorManager from './InterceptorManager'
 import mergeConfig from './mergeConfig'
@@ -19,7 +17,7 @@ import { isPlainObject } from '../utils'
 import clone from '../utils/clone'
 
 export default class Request {
-    /**
+  /**
    * @param {Object} arg - 全局配置
    * @param {String} arg.baseURL - 全局根路径
    * @param {Object} arg.header - 全局header
@@ -33,47 +31,47 @@ export default class Request {
    * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
    * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
    */
-    constructor(arg = {}) {
-        if (!isPlainObject(arg)) {
-            arg = {}
-            console.warn('设置全局参数必须接收一个Object')
-        }
-        this.config = clone({ ...defaults, ...arg })
-        this.interceptors = {
-            request: new InterceptorManager(),
-            response: new InterceptorManager()
-        }
+  constructor(arg = {}) {
+    if (!isPlainObject(arg)) {
+      arg = {}
+      console.warn('设置全局参数必须接收一个Object')
+    }
+    this.config = clone({...defaults, ...arg})
+    this.interceptors = {
+      request: new InterceptorManager(),
+      response: new InterceptorManager()
     }
+  }
 
-    /**
+  /**
    * @Function
    * @param {Request~setConfigCallback} f - 设置全局默认配置
    */
-    setConfig(f) {
-        this.config = f(this.config)
-    }
+  setConfig(f) {
+    this.config = f(this.config)
+  }
 
-    middleware(config) {
-        config = mergeConfig(this.config, config)
-        const chain = [dispatchRequest, undefined]
-        let promise = Promise.resolve(config)
+  middleware(config) {
+    config = mergeConfig(this.config, config)
+    let chain = [dispatchRequest, undefined]
+    let promise = Promise.resolve(config)
 
-        this.interceptors.request.forEach((interceptor) => {
-            chain.unshift(interceptor.fulfilled, interceptor.rejected)
-        })
+    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+      chain.unshift(interceptor.fulfilled, interceptor.rejected)
+    })
 
-        this.interceptors.response.forEach((interceptor) => {
-            chain.push(interceptor.fulfilled, interceptor.rejected)
-        })
+    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+      chain.push(interceptor.fulfilled, interceptor.rejected)
+    })
 
-        while (chain.length) {
-            promise = promise.then(chain.shift(), chain.shift())
-        }
-
-        return promise
+    while (chain.length) {
+      promise = promise.then(chain.shift(), chain.shift())
     }
 
-    /**
+    return promise
+  }
+
+  /**
    * @Function
    * @param {Object} config - 请求配置项
    * @prop {String} options.url - 请求路径
@@ -84,112 +82,117 @@ export default class Request {
    * @prop {Object} [options.method = config.method] - 请求方法
    * @returns {Promise<unknown>}
    */
-    request(config = {}) {
-        return this.middleware(config)
-    }
-
-    get(url, options = {}) {
-        return this.middleware({
-            url,
-            method: 'GET',
-            ...options
-        })
-    }
-
-    post(url, data, options = {}) {
-        return this.middleware({
-            url,
-            data,
-            method: 'POST',
-            ...options
-        })
-    }
-
-    // #ifndef MP-ALIPAY
-    put(url, data, options = {}) {
-        return this.middleware({
-            url,
-            data,
-            method: 'PUT',
-            ...options
-        })
-    }
-
-    // #endif
-
-    // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
-    delete(url, data, options = {}) {
-        return this.middleware({
-            url,
-            data,
-            method: 'DELETE',
-            ...options
-        })
-    }
-
-    // #endif
-
-    // #ifdef H5 || MP-WEIXIN
-    connect(url, data, options = {}) {
-        return this.middleware({
-            url,
-            data,
-            method: 'CONNECT',
-            ...options
-        })
-    }
-
-    // #endif
-
-    // #ifdef  H5 || MP-WEIXIN || MP-BAIDU
-    head(url, data, options = {}) {
-        return this.middleware({
-            url,
-            data,
-            method: 'HEAD',
-            ...options
-        })
-    }
-
-    // #endif
-
-    // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
-    options(url, data, options = {}) {
-        return this.middleware({
-            url,
-            data,
-            method: 'OPTIONS',
-            ...options
-        })
-    }
-
-    // #endif
-
-    // #ifdef H5 || MP-WEIXIN
-    trace(url, data, options = {}) {
-        return this.middleware({
-            url,
-            data,
-            method: 'TRACE',
-            ...options
-        })
-    }
-
-    // #endif
-
-    upload(url, config = {}) {
-        config.url = url
-        config.method = 'UPLOAD'
-        return this.middleware(config)
-    }
-
-    download(url, config = {}) {
-        config.url = url
-        config.method = 'DOWNLOAD'
-        return this.middleware(config)
-    }
+  request(config = {}) {
+    return this.middleware(config)
+  }
+
+  get(url, options = {}) {
+    return this.middleware({
+      url,
+      method: 'GET',
+      ...options
+    })
+  }
+
+  post(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: 'POST',
+      ...options
+    })
+  }
+
+  // #ifndef MP-ALIPAY || MP-KUAISHOU || MP-JD
+  put(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: 'PUT',
+      ...options
+    })
+  }
+
+  // #endif
+
+  // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+  delete(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: 'DELETE',
+      ...options
+    })
+  }
+
+  // #endif
+
+  // #ifdef H5 || MP-WEIXIN
+  connect(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: 'CONNECT',
+      ...options
+    })
+  }
+
+  // #endif
+
+  // #ifdef  H5 || MP-WEIXIN || MP-BAIDU
+  head(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: 'HEAD',
+      ...options
+    })
+  }
+
+  // #endif
+
+  // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+  options(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: 'OPTIONS',
+      ...options
+    })
+  }
+
+  // #endif
+
+  // #ifdef H5 || MP-WEIXIN
+  trace(url, data, options = {}) {
+    return this.middleware({
+      url,
+      data,
+      method: 'TRACE',
+      ...options
+    })
+  }
+
+  // #endif
+
+  upload(url, config = {}) {
+    config.url = url
+    config.method = 'UPLOAD'
+    return this.middleware(config)
+  }
+
+  download(url, config = {}) {
+    config.url = url
+    config.method = 'DOWNLOAD'
+    return this.middleware(config)
+  }
+
+  get version () {
+    return '3.1.0'
+  }
 }
 
+
 /**
  * setConfig回调
  * @return {Object} - 返回操作后的config

+ 4 - 4
uni_modules/uv-ui-tools/libs/luch-request/core/buildFullPath.js

@@ -13,8 +13,8 @@ import combineURLs from '../helpers/combineURLs'
  * @returns {string} The combined full path
  */
 export default function buildFullPath(baseURL, requestedURL) {
-    if (baseURL && !isAbsoluteURL(requestedURL)) {
-        return combineURLs(baseURL, requestedURL)
-    }
-    return requestedURL
+  if (baseURL && !isAbsoluteURL(requestedURL)) {
+    return combineURLs(baseURL, requestedURL)
+  }
+  return requestedURL
 }

+ 27 - 23
uni_modules/uv-ui-tools/libs/luch-request/core/defaults.js

@@ -2,28 +2,32 @@
  * 默认的全局配置
  */
 
+
 export default {
-    baseURL: '',
-    header: {},
-    method: 'GET',
-    dataType: 'json',
-    // #ifndef MP-ALIPAY
-    responseType: 'text',
-    // #endif
-    custom: {},
-    // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
-    timeout: 60000,
-    // #endif
-    // #ifdef APP-PLUS
-    sslVerify: true,
-    // #endif
-    // #ifdef H5
-    withCredentials: false,
-    // #endif
-    // #ifdef APP-PLUS
-    firstIpv4: false,
-    // #endif
-    validateStatus: function validateStatus(status) {
-        return status >= 200 && status < 300
-    }
+  baseURL: '',
+  header: {},
+  method: 'GET',
+  dataType: 'json',
+  paramsSerializer: null,
+  // #ifndef MP-ALIPAY
+  responseType: 'text',
+  // #endif
+  custom: {},
+  // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+  timeout: 60000,
+  // #endif
+  // #ifdef APP-PLUS
+  sslVerify: true,
+  // #endif
+  // #ifdef H5
+  withCredentials: false,
+  // #endif
+  // #ifdef APP-PLUS
+  firstIpv4: false,
+  // #endif
+  validateStatus: function validateStatus(status) {
+    return status >= 200 && status < 300
+  },
+  // 是否尝试将响应数据json化
+  forcedJSONParsing: true
 }

+ 4 - 1
uni_modules/uv-ui-tools/libs/luch-request/core/dispatchRequest.js

@@ -1,3 +1,6 @@
 import adapter from '../adapters/index'
 
-export default (config) => adapter(config)
+
+export default (config) => {
+  return adapter(config)
+}

+ 105 - 82
uni_modules/uv-ui-tools/libs/luch-request/core/mergeConfig.js

@@ -1,4 +1,4 @@
-import { deepMerge, isUndefined } from '../utils'
+import {deepMerge, isUndefined} from '../utils'
 
 /**
  * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局
@@ -8,15 +8,15 @@ import { deepMerge, isUndefined } from '../utils'
  * @return {{}}
  */
 const mergeKeys = (keys, globalsConfig, config2) => {
-    const config = {}
-    keys.forEach((prop) => {
-        if (!isUndefined(config2[prop])) {
-            config[prop] = config2[prop]
-        } else if (!isUndefined(globalsConfig[prop])) {
-            config[prop] = globalsConfig[prop]
-        }
-    })
-    return config
+  let config = {}
+  keys.forEach(prop => {
+    if (!isUndefined(config2[prop])) {
+      config[prop] = config2[prop]
+    } else if (!isUndefined(globalsConfig[prop])) {
+      config[prop] = globalsConfig[prop]
+    }
+  })
+  return config
 }
 /**
  *
@@ -25,79 +25,102 @@ const mergeKeys = (keys, globalsConfig, config2) => {
  * @return - 合并后的配置
  */
 export default (globalsConfig, config2 = {}) => {
-    const method = config2.method || globalsConfig.method || 'GET'
-    let config = {
-        baseURL: globalsConfig.baseURL || '',
-        method,
-        url: config2.url || '',
-        params: config2.params || {},
-        custom: { ...(globalsConfig.custom || {}), ...(config2.custom || {}) },
-        header: deepMerge(globalsConfig.header || {}, config2.header || {})
-    }
-    const defaultToConfig2Keys = ['getTask', 'validateStatus']
-    config = { ...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) }
+  const method = config2.method || globalsConfig.method || 'GET'
+  let config = {
+    baseURL: config2.baseURL || globalsConfig.baseURL || '',
+    method: method,
+    url: config2.url || '',
+    params: config2.params || {},
+    custom: {...(globalsConfig.custom || {}), ...(config2.custom || {})},
+    header: deepMerge(globalsConfig.header || {}, config2.header || {})
+  }
+  const defaultToConfig2Keys = ['getTask', 'validateStatus', 'paramsSerializer', 'forcedJSONParsing']
+  config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)}
 
-    // eslint-disable-next-line no-empty
-    if (method === 'DOWNLOAD') {
-    // #ifdef H5 || APP-PLUS
-        if (!isUndefined(config2.timeout)) {
-            config.timeout = config2.timeout
-        } else if (!isUndefined(globalsConfig.timeout)) {
-            config.timeout = globalsConfig.timeout
-        }
-    // #endif
-    } else if (method === 'UPLOAD') {
-        delete config.header['content-type']
-        delete config.header['Content-Type']
-        const uploadKeys = [
-            // #ifdef APP-PLUS || H5
-            'files',
-            // #endif
-            // #ifdef MP-ALIPAY
-            'fileType',
-            // #endif
-            // #ifdef H5
-            'file',
-            // #endif
-            'filePath',
-            'name',
-            // #ifdef H5 || APP-PLUS
-            'timeout',
-            // #endif
-            'formData'
-        ]
-        uploadKeys.forEach((prop) => {
-            if (!isUndefined(config2[prop])) {
-                config[prop] = config2[prop]
-            }
-        })
-        // #ifdef H5 || APP-PLUS
-        if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
-            config.timeout = globalsConfig.timeout
-        }
-    // #endif
-    } else {
-        const defaultsKeys = [
-            'data',
-            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
-            'timeout',
-            // #endif
-            'dataType',
-            // #ifndef MP-ALIPAY
-            'responseType',
-            // #endif
-            // #ifdef APP-PLUS
-            'sslVerify',
-            // #endif
-            // #ifdef H5
-            'withCredentials',
-            // #endif
-            // #ifdef APP-PLUS
-            'firstIpv4'
-            // #endif
-        ]
-        config = { ...config, ...mergeKeys(defaultsKeys, globalsConfig, config2) }
+  // eslint-disable-next-line no-empty
+  if (method === 'DOWNLOAD') {
+    const downloadKeys = [
+      // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+      'timeout',
+      // #endif
+      // #ifdef MP
+      'filePath',
+      // #endif
+    ]
+    config = {...config, ...mergeKeys(downloadKeys, globalsConfig, config2)}
+  } else if (method === 'UPLOAD') {
+    delete config.header['content-type']
+    delete config.header['Content-Type']
+    const uploadKeys = [
+      // #ifdef APP-PLUS || H5
+      'files',
+      // #endif
+      // #ifdef MP-ALIPAY
+      'fileType',
+      // #endif
+      // #ifdef H5
+      'file',
+      // #endif
+      'filePath',
+      'name',
+      // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+      'timeout',
+      // #endif
+      'formData',
+    ]
+    uploadKeys.forEach(prop => {
+      if (!isUndefined(config2[prop])) {
+        config[prop] = config2[prop]
+      }
+    })
+    // #ifdef H5 || APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-KUAISHOU
+    if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
+      config['timeout'] = globalsConfig['timeout']
     }
+    // #endif
+  } else {
+    const defaultsKeys = [
+      'data',
+      // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+      'timeout',
+      // #endif
+      'dataType',
+      // #ifndef MP-ALIPAY
+      'responseType',
+      // #endif
+      // #ifdef APP-PLUS
+      'sslVerify',
+      // #endif
+      // #ifdef H5
+      'withCredentials',
+      // #endif
+      // #ifdef APP-PLUS
+      'firstIpv4',
+      // #endif
+      // #ifdef MP-WEIXIN
+      'enableHttp2',
+      'enableQuic',
+      // #endif
+      // #ifdef MP-TOUTIAO || MP-WEIXIN
+      'enableCache',
+      // #endif
+      // #ifdef MP-WEIXIN
+      'enableHttpDNS',
+      'httpDNSServiceId',
+      'enableChunked',
+      'forceCellularNetwork',
+      // #endif
+      // #ifdef MP-ALIPAY
+      'enableCookie',
+      // #endif
+      // #ifdef MP-BAIDU
+      'cloudCache',
+      'defer'
+      // #endif
+
+    ]
+    config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)}
+  }
 
-    return config
+  return config
 }

+ 7 - 7
uni_modules/uv-ui-tools/libs/luch-request/core/settle.js

@@ -6,11 +6,11 @@
  * @param {object} response The response.
  */
 export default function settle(resolve, reject, response) {
-    const { validateStatus } = response.config
-    const status = response.statusCode
-    if (status && (!validateStatus || validateStatus(status))) {
-        resolve(response)
-    } else {
-        reject(response)
-    }
+  const validateStatus = response.config.validateStatus
+  const status = response.statusCode
+  if (status && (!validateStatus || validateStatus(status))) {
+    resolve(response)
+  } else {
+    reject(response)
+  }
 }

+ 42 - 47
uni_modules/uv-ui-tools/libs/luch-request/helpers/buildURL.js

@@ -1,16 +1,9 @@
 'use strict'
 
-import * as utils from '../utils'
+import * as utils from './../utils'
 
 function encode(val) {
-    return encodeURIComponent(val)
-        .replace(/%40/gi, '@')
-        .replace(/%3A/gi, ':')
-        .replace(/%24/g, '$')
-        .replace(/%2C/gi, ',')
-        .replace(/%20/g, '+')
-        .replace(/%5B/gi, '[')
-        .replace(/%5D/gi, ']')
+  return encodeURIComponent(val).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']')
 }
 
 /**
@@ -20,50 +13,52 @@ function encode(val) {
  * @param {object} [params] The params to be appended
  * @returns {string} The formatted url
  */
-export default function buildURL(url, params) {
-    /* eslint no-param-reassign:0 */
-    if (!params) {
-        return url
-    }
-
-    let serializedParams
-    if (utils.isURLSearchParams(params)) {
-        serializedParams = params.toString()
-    } else {
-        const parts = []
-
-        utils.forEach(params, (val, key) => {
-            if (val === null || typeof val === 'undefined') {
-                return
-            }
+export default function buildURL(url, params, paramsSerializer) {
+  /*eslint no-param-reassign:0*/
+  if (!params) {
+    return url
+  }
 
-            if (utils.isArray(val)) {
-                key = `${key}[]`
-            } else {
-                val = [val]
-            }
+  var serializedParams
+  if (paramsSerializer) {
+    serializedParams = paramsSerializer(params)
+  } else if (utils.isURLSearchParams(params)) {
+    serializedParams = params.toString()
+  } else {
+    var parts = []
 
-            utils.forEach(val, (v) => {
-                if (utils.isDate(v)) {
-                    v = v.toISOString()
-                } else if (utils.isObject(v)) {
-                    v = JSON.stringify(v)
-                }
-                parts.push(`${encode(key)}=${encode(v)}`)
-            })
-        })
+    utils.forEach(params, function serialize(val, key) {
+      if (val === null || typeof val === 'undefined') {
+        return
+      }
 
-        serializedParams = parts.join('&')
-    }
+      if (utils.isArray(val)) {
+        key = key + '[]'
+      } else {
+        val = [val]
+      }
 
-    if (serializedParams) {
-        const hashmarkIndex = url.indexOf('#')
-        if (hashmarkIndex !== -1) {
-            url = url.slice(0, hashmarkIndex)
+      utils.forEach(val, function parseValue(v) {
+        if (utils.isDate(v)) {
+          v = v.toISOString()
+        } else if (utils.isObject(v)) {
+          v = JSON.stringify(v)
         }
+        parts.push(encode(key) + '=' + encode(v))
+      })
+    })
+
+    serializedParams = parts.join('&')
+  }
 
-        url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
+  if (serializedParams) {
+    var hashmarkIndex = url.indexOf('#')
+    if (hashmarkIndex !== -1) {
+      url = url.slice(0, hashmarkIndex)
     }
 
-    return url
+    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
+  }
+
+  return url
 }

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