李万涛 1 سال پیش
والد
کامیت
d1c78f1294
59فایلهای تغییر یافته به همراه6780 افزوده شده و 716 حذف شده
  1. 225 202
      App.vue
  2. 27 0
      api/robot/index.js
  3. 3 0
      common/config.js
  4. 36 27
      components/wike-tabbar/wike-tabbar.vue
  5. 8 1
      main.js
  6. 78 73
      node_modules/uview-ui/components/u-picker/props.js
  7. 183 211
      node_modules/uview-ui/components/u-picker/u-picker.vue
  8. 5 19
      node_modules/uview-ui/components/u-slider/u-slider.vue
  9. 37 33
      node_modules/uview-ui/components/u-toolbar/props.js
  10. 28 31
      node_modules/uview-ui/components/u-toolbar/u-toolbar.vue
  11. 153 114
      pages.json
  12. 5 5
      pages/painting/details.vue
  13. 639 0
      pages/robot/generate/index.scss
  14. 637 0
      pages/robot/generate/index.vue
  15. 174 0
      pages/robot/index.scss
  16. 343 0
      pages/robot/index.vue
  17. 27 0
      pages/robot/workDetail/index.scss
  18. 62 0
      pages/robot/workDetail/index.vue
  19. 31 0
      static/fonts/iconfont.css
  20. BIN
      static/fonts/iconfont.ttf
  21. BIN
      static/fonts/iconfont.woff
  22. BIN
      static/fonts/iconfont.woff2
  23. BIN
      static/images/closeBtn.png
  24. BIN
      static/images/selected.png
  25. 97 0
      uni_modules/uni-easyinput/changelog.md
  26. 56 0
      uni_modules/uni-easyinput/components/uni-easyinput/common.js
  27. 657 0
      uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
  28. 87 0
      uni_modules/uni-easyinput/package.json
  29. 11 0
      uni_modules/uni-easyinput/readme.md
  30. 22 0
      uni_modules/uni-icons/changelog.md
  31. 1169 0
      uni_modules/uni-icons/components/uni-icons/icons.js
  32. 96 0
      uni_modules/uni-icons/components/uni-icons/uni-icons.vue
  33. 663 0
      uni_modules/uni-icons/components/uni-icons/uniicons.css
  34. BIN
      uni_modules/uni-icons/components/uni-icons/uniicons.ttf
  35. 86 0
      uni_modules/uni-icons/package.json
  36. 8 0
      uni_modules/uni-icons/readme.md
  37. 8 0
      uni_modules/uni-scss/changelog.md
  38. 1 0
      uni_modules/uni-scss/index.scss
  39. 82 0
      uni_modules/uni-scss/package.json
  40. 4 0
      uni_modules/uni-scss/readme.md
  41. 7 0
      uni_modules/uni-scss/styles/index.scss
  42. 3 0
      uni_modules/uni-scss/styles/setting/_border.scss
  43. 66 0
      uni_modules/uni-scss/styles/setting/_color.scss
  44. 55 0
      uni_modules/uni-scss/styles/setting/_radius.scss
  45. 56 0
      uni_modules/uni-scss/styles/setting/_space.scss
  46. 167 0
      uni_modules/uni-scss/styles/setting/_styles.scss
  47. 24 0
      uni_modules/uni-scss/styles/setting/_text.scss
  48. 146 0
      uni_modules/uni-scss/styles/setting/_variables.scss
  49. 19 0
      uni_modules/uni-scss/styles/tools/functions.scss
  50. 31 0
      uni_modules/uni-scss/theme.scss
  51. 62 0
      uni_modules/uni-scss/variables.scss
  52. 15 0
      utils/auth.js
  53. 29 0
      utils/cache.js
  54. 26 0
      utils/constant/constant.js
  55. 174 0
      utils/download.js
  56. 41 0
      utils/download3.js
  57. 33 0
      utils/request/index.js
  58. 25 0
      utils/request/requestInterceptors.js
  59. 53 0
      utils/request/responseInterceptors.js

+ 225 - 202
App.vue

xqd xqd
@@ -8,7 +8,7 @@
 			// #ifndef MP-TOUTIAO
 			uni.hideTabBar({});
 			// #endif		
-			
+
 		}
 	};
 </script>
@@ -18,267 +18,290 @@
 	@import "uview-ui/index.scss";
 	@import "animate.css";
 	@import "static/iconfont/iconfont.css";
+	@import "@/static/fonts/iconfont.css";
 	@import './tuniao-ui/index.scss';
 	@import './tuniao-ui/iconfont.css';
-	.flxe{
+
+	.flxe {
 		display: flex;
 	}
-	.justify-between{
+
+	.justify-between {
 		justify-content: space-between;
 	}
-	.flxe-column{
+
+	.flxe-column {
 		flex-direction: column;
 	}
-	.align-center{
+
+	.align-center {
 		align-items: center;
 	}
-	.justify-center{
+
+	.justify-center {
 		justify-content: center;
 	}
-	.flex-wrap{
+
+	.flex-wrap {
 		flex-wrap: wrap;
 	}
 
 
-.u-relative,
-.u-rela {
-	position: relative;
-}
+	.u-relative,
+	.u-rela {
+		position: relative;
+	}
 
-.u-absolute,
-.u-abso {
-	position: absolute;
-}
+	.u-absolute,
+	.u-abso {
+		position: absolute;
+	}
 
-// nvue不能用标签命名样式,不能放在微信组件中,否则微信开发工具会报警告,无法使用标签名当做选择器
-/* #ifndef APP-NVUE */
-image {
-	display: inline-block;
-}
+	// nvue不能用标签命名样式,不能放在微信组件中,否则微信开发工具会报警告,无法使用标签名当做选择器
+	/* #ifndef APP-NVUE */
+	image {
+		display: inline-block;
+	}
 
-// 在weex,也即nvue中,所有元素默认为border-box
-view,
-text {
-	box-sizing: border-box;
-}
-/* #endif */
+	// 在weex,也即nvue中,所有元素默认为border-box
+	view,
+	text {
+		box-sizing: border-box;
+	}
 
-.u-font-xs {
-	font-size: 22rpx;
-}
+	/* #endif */
 
-.u-font-sm {
-	font-size: 26rpx;
-}
+	.u-font-xs {
+		font-size: 22rpx;
+	}
 
-.u-font-md {
-	font-size: 28rpx;
-}
+	.u-font-sm {
+		font-size: 26rpx;
+	}
 
-.u-font-lg {
-	font-size: 30rpx;
-}
+	.u-font-md {
+		font-size: 28rpx;
+	}
 
-.u-font-xl {
-	font-size: 34rpx;
-}
+	.u-font-lg {
+		font-size: 30rpx;
+	}
 
-.u-flex {
-	/* #ifndef APP-NVUE */
-	display: flex;
-	/* #endif */
-	flex-direction: row;
-	align-items: center;
-}
+	.u-font-xl {
+		font-size: 34rpx;
+	}
 
-.u-flex-wrap {
-	flex-wrap: wrap;
-}
+	.u-flex {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+	}
 
-.u-flex-nowrap {
-	flex-wrap: nowrap;
-}
+	.u-flex-wrap {
+		flex-wrap: wrap;
+	}
 
-.u-col-center {
-	align-items: center;
-}
+	.u-flex-nowrap {
+		flex-wrap: nowrap;
+	}
 
-.u-col-top {
-	align-items: flex-start;
-}
+	.u-col-center {
+		align-items: center;
+	}
 
-.u-col-bottom {
-	align-items: flex-end;
-}
+	.u-col-top {
+		align-items: flex-start;
+	}
 
-.u-row-center {
-	justify-content: center;
-}
+	.u-col-bottom {
+		align-items: flex-end;
+	}
 
-.u-row-left {
-	justify-content: flex-start;
-}
+	.u-row-center {
+		justify-content: center;
+	}
 
-.u-row-right {
-	justify-content: flex-end;
-}
+	.u-row-left {
+		justify-content: flex-start;
+	}
 
-.u-row-between {
-	justify-content: space-between;
-}
+	.u-row-right {
+		justify-content: flex-end;
+	}
 
-.u-row-around {
-	justify-content: space-around;
-}
+	.u-row-between {
+		justify-content: space-between;
+	}
 
-.u-text-left {
-	text-align: left;
-}
+	.u-row-around {
+		justify-content: space-around;
+	}
 
-.u-text-center {
-	text-align: center;
-}
+	.u-text-left {
+		text-align: left;
+	}
 
-.u-text-right {
-	text-align: right;
-}
+	.u-text-center {
+		text-align: center;
+	}
 
-.u-flex-col {
-	/* #ifndef APP-NVUE */
-	display: flex;
-	/* #endif */
-	flex-direction: column;
-}
+	.u-text-right {
+		text-align: right;
+	}
+
+	.u-flex-col {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
 
-/**
+	/**
 * 弹性盒三段式布局
 */
-.page_box {
-	height: 100%;
-	width: 100%;
-	display: flex;
-	flex-direction: column;
-	justify-content: space-between;
-	overflow-x: hidden;
-	background: $u-bg-color;
-}
-.scroll-box {
-	flex: 1;
-	height: 100%;
-	position: relative;
-}
-.content_box {
-	flex: 1;
-	overflow-y: auto;
-}
-
-/**
+	.page_box {
+		height: 100%;
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		overflow-x: hidden;
+		background: $u-bg-color;
+	}
+
+	.scroll-box {
+		flex: 1;
+		height: 100%;
+		position: relative;
+	}
+
+	.content_box {
+		flex: 1;
+		overflow-y: auto;
+	}
+
+	/**
 * 溢出省略号
 * @param {Number} 行数
 */
-@mixin ellipsis($rowCount: 1) {
-	@if $rowCount <=1 {
-		overflow: hidden;
-		text-overflow: ellipsis;
-		white-space: nowrap;
-	} @else {
-		min-width: 0;
-		overflow: hidden;
-		text-overflow: ellipsis;
-		display: -webkit-box;
-		-webkit-line-clamp: $rowCount;
-		-webkit-box-orient: vertical;
-	}
-}
-@for $i from 1 through 12 {
-	.u-ellipsis-#{$i} {
-		@include ellipsis($i);
-	}
-}
-
-// 定义flex等分
-@for $i from 0 through 12 {
-	.u-flex-#{$i} {
-		flex: $i;
-	}
-}
-
-// 定义字体(px)单位,小于20都为px单位字体
-@for $i from 9 to 20 {
-	.u-font-#{$i} {
-		font-size: $i + px;
-	}
-}
-
-// 定义字体(rpx)单位,大于或等于20的都为rpx单位字体
-@for $i from 20 through 40 {
-	.u-font-#{$i} {
-		font-size: $i + rpx;
-	}
-}
-
-// 定义内外边距,历遍1-100
-@for $i from 0 through 100 {
-	// 只要双数和能被5除尽的数
-	@if $i % 2 == 0 or $i % 5 == 0 {
-		// 得出:u-margin-30或者u-m-30
-		.u-margin-#{$i},
-		.u-m-#{$i} {
-			margin: $i + rpx !important;
+	@mixin ellipsis($rowCount: 1) {
+		@if $rowCount <=1 {
+			overflow: hidden;
+			text-overflow: ellipsis;
+			white-space: nowrap;
 		}
-		.u-m-x-#{$i} {
-			margin-left: $i + rpx !important;
-			margin-right: $i + rpx !important;
+
+		@else {
+			min-width: 0;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			display: -webkit-box;
+			-webkit-line-clamp: $rowCount;
+			-webkit-box-orient: vertical;
 		}
-		.u-m-y-#{$i} {
-			margin-top: $i + rpx !important;
-			margin-bottom: $i + rpx !important;
+	}
+
+	@for $i from 1 through 12 {
+		.u-ellipsis-#{$i} {
+			@include ellipsis($i);
 		}
+	}
 
-		// 得出:u-padding-30或者u-p-30
-		.u-padding-#{$i},
-		.u-p-#{$i} {
-			padding: $i + rpx !important;
+	// 定义flex等分
+	@for $i from 0 through 12 {
+		.u-flex-#{$i} {
+			flex: $i;
 		}
-		.u-p-x-#{$i} {
-			padding-left: $i + rpx !important;
-			padding-right: $i + rpx !important;
+	}
+
+	// 定义字体(px)单位,小于20都为px单位字体
+	@for $i from 9 to 20 {
+		.u-font-#{$i} {
+			font-size: $i + px;
 		}
-		.u-p-y-#{$i} {
-			padding-top: $i + rpx !important;
-			padding-bottom: $i + rpx !important;
+	}
+
+	// 定义字体(rpx)单位,大于或等于20的都为rpx单位字体
+	@for $i from 20 through 40 {
+		.u-font-#{$i} {
+			font-size: $i + rpx;
 		}
+	}
+
+	// 定义内外边距,历遍1-100
+	@for $i from 0 through 100 {
+
+		// 只要双数和能被5除尽的数
+		@if $i % 2==0 or $i % 5==0 {
 
-		@each $short, $long in l left, t top, r right, b bottom {
-			// 缩写版,结果如: u-m-l-30
-			// 定义外边距
-			.u-m-#{$short}-#{$i} {
-				margin-#{$long}: $i + rpx !important;
+			// 得出:u-margin-30或者u-m-30
+			.u-margin-#{$i},
+			.u-m-#{$i} {
+				margin: $i + rpx !important;
 			}
 
-			// 定义内边距
-			.u-p-#{$short}-#{$i} {
-				padding-#{$long}: $i + rpx !important;
+			.u-m-x-#{$i} {
+				margin-left: $i + rpx !important;
+				margin-right: $i + rpx !important;
 			}
 
-			// 完整版,结果如:u-margin-left-30
-			// 定义外边距
-			.u-margin-#{$long}-#{$i} {
-				margin-#{$long}: $i + rpx !important;
+			.u-m-y-#{$i} {
+				margin-top: $i + rpx !important;
+				margin-bottom: $i + rpx !important;
 			}
 
-			// 定义内边距
-			.u-padding-#{$long}-#{$i} {
-				padding-#{$long}: $i + rpx !important;
+			// 得出:u-padding-30或者u-p-30
+			.u-padding-#{$i},
+			.u-p-#{$i} {
+				padding: $i + rpx !important;
+			}
+
+			.u-p-x-#{$i} {
+				padding-left: $i + rpx !important;
+				padding-right: $i + rpx !important;
+			}
+
+			.u-p-y-#{$i} {
+				padding-top: $i + rpx !important;
+				padding-bottom: $i + rpx !important;
+			}
+
+			@each $short,
+			$long in l left,
+			t top,
+			r right,
+			b bottom {
+
+				// 缩写版,结果如: u-m-l-30
+				// 定义外边距
+				.u-m-#{$short}-#{$i} {
+					margin-#{$long}: $i + rpx !important;
+				}
+
+				// 定义内边距
+				.u-p-#{$short}-#{$i} {
+					padding-#{$long}: $i + rpx !important;
+				}
+
+				// 完整版,结果如:u-margin-left-30
+				// 定义外边距
+				.u-margin-#{$long}-#{$i} {
+					margin-#{$long}: $i + rpx !important;
+				}
+
+				// 定义内边距
+				.u-padding-#{$long}-#{$i} {
+					padding-#{$long}: $i + rpx !important;
+				}
 			}
 		}
 	}
-}
-
-// 重置nvue的默认关于flex的样式
-.u-reset-nvue {
-	flex-direction: row;
-	align-items: center;
-}
 
-</style>
+	// 重置nvue的默认关于flex的样式
+	.u-reset-nvue {
+		flex-direction: row;
+		align-items: center;
+	}
+</style>

+ 27 - 0
api/robot/index.js

xqd
@@ -0,0 +1,27 @@
+//我的相关:
+const {
+	http
+} = uni.$u
+
+
+//数字人作品列表
+export const workList = (params, config = {}) => http.post('index.php/api.Digit/list', params, config)
+
+//生成数字人作品
+export const generateWork = (params, config = {}) => http.post('index.php/api.Digit/addDigit', params, config)
+
+//删除数字人作品
+export const delWork = (params, config = {}) => http.post('index.php/api.Digit/deleteDigit', params, config)
+
+//数字人角色列表
+export const roleList = (params, config = {}) => http.post('index.php/api.Digit/getRoleList', params, config)
+
+//数字人声音列表
+export const voiceList = (params, config = {}) => http.post('index.php/api.Digit/getAudioList', params, config)
+
+
+//数字人背景列表
+export const backList = (params, config = {}) => http.post('index.php/api.Digit/getBackList', params, config)
+
+//数字人草稿列表
+export const draftList = (params, config = {}) => http.post('index.php/api.Digit/draftList', params, config)

+ 3 - 0
common/config.js

xqd
@@ -0,0 +1,3 @@
+module.exports = {
+	baseUrl: 'https://t20.9026.com/api/'
+}

+ 36 - 27
components/wike-tabbar/wike-tabbar.vue

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -1,15 +1,17 @@
 <template>
 	<view>
-		<view class="tabbar cu-bar flex-between bg-white" :class="isShowAnimate ? 'fadeInUp' : ''" :style="{'background-color':tabBar.bgColor,'border-top-color':tabBar.borderColor}"
-		 v-show="onTabbar">
+		<view class="tabbar cu-bar flex-between bg-white" :class="isShowAnimate ? 'fadeInUp' : ''"
+			:style="{'background-color':tabBar.bgColor,'border-top-color':tabBar.borderColor}" v-show="onTabbar">
 			<block v-for="(item, index) in tabBar.list" :key="index">
-				<view class="action tabbar-item" :class="[item.showBig?'add-action':'']" :style="{color:item.pagePath==('/'+nowPath)?themecolor:tabBar.color}"
-				 @click="clickTab(item)">
+				<view class="action tabbar-item" :class="[item.showBig?'add-action':'']"
+					:style="{color:item.pagePath==('/'+nowPath)?themecolor:tabBar.color}" @click="clickTab(item)">
 					<block v-if="tabBar.showType=='img'">
-						<image class="tabbar-icon" :src="item.pagePath==('/'+nowPath)? item.selectedIconPath : item.iconPath"></image>
+						<image class="tabbar-icon"
+							:src="item.pagePath==('/'+nowPath)? item.selectedIconPath : item.iconPath"></image>
 					</block>
 					<block v-if="tabBar.showType=='iconfont'">
-						<view :class="['tabbar-icon',item.fontClass]" :style="{'font-size':'22px','background-color':item.showBig?themecolor:''}"></view>
+						<view :class="['tabbar-icon',item.fontClass]"
+							:style="{'font-size':'22px','background-color':item.showBig?themecolor:''}"></view>
 					</block>
 					<text class="tabbar-text">{{ item.text }}</text>
 					<text class="tabbar-item-num" v-if="item.num">{{item.num}}</text>
@@ -48,7 +50,7 @@
 				type: String,
 				default: '#26B3A0'
 			},
-			is_aipainting:{
+			is_aipainting: {
 				type: String,
 				default: ''
 			}
@@ -84,23 +86,33 @@
 							"text": "应用"
 						},
 						{
-							pagePath: "/pages/painting/painting",
+							pagePath: "/pages/robot/index",
 							navigateType: "switchTab",
 							showBig: false,
-							fontClass: "tn-icon-image",
+							fontClass: "tn-icon-funds",
 							"iconPath": "/static/images/tabs/joblist.png",
 							"selectedIconPath": "/static/images/tabs/joblists.png",
-							"text": "绘画"
+							"text": "数字人"
 						},
 						{
-							pagePath: "/pages/signin/signin",
+							pagePath: "/pages/painting/painting",
 							navigateType: "switchTab",
 							showBig: false,
-							fontClass: "tn-icon-funds",
+							fontClass: "tn-icon-image",
 							"iconPath": "/static/images/tabs/joblist.png",
 							"selectedIconPath": "/static/images/tabs/joblists.png",
-							"text": "任务"
+							"text": "绘画"
 						},
+						// {
+						// 	pagePath: "/pages/signin/signin",
+						// 	navigateType: "switchTab",
+						// 	showBig: false,
+						// 	fontClass: "tn-icon-funds",
+						// 	"iconPath": "/static/images/tabs/joblist.png",
+						// 	"selectedIconPath": "/static/images/tabs/joblists.png",
+						// 	"text": "任务"
+						// },
+
 						{
 							pagePath: "/pages/user/user",
 							navigateType: "switchTab",
@@ -116,9 +128,9 @@
 
 			};
 		},
-		
+
 		onReady() {
-			
+
 			try {
 				uni.hideTabBar({
 					animation: false
@@ -132,10 +144,10 @@
 		},
 		mounted() {
 			// console.log(this.is_aipainting);
-			if(this.tabBar.list.length>4&&this.is_aipainting == '2'){
+			if (this.tabBar.list.length > 4 && this.is_aipainting == '2') {
 				this.tabBar.list.splice(2, 1)
 			}
-			
+
 			try {
 				uni.hideTabBar({
 					animation: false
@@ -146,7 +158,7 @@
 		},
 		methods: {
 			clickTab(item) {
-				
+
 				if (item.showBig == true) {
 					this.showBig = true
 				} else {
@@ -157,7 +169,7 @@
 				}
 			},
 			toggleDialog() {
-				
+
 				this.showBig = !this.showBig
 			},
 			toPost(e) {
@@ -176,7 +188,7 @@
 				} else {
 					this.$store.commit('LOGIN_TIP', true);
 				}
-				
+
 			}
 		},
 		computed: {
@@ -207,9 +219,9 @@
 		padding-bottom: env(safe-area-inset-bottom);
 		box-shadow: 0 -10rpx 20rpx 0 rgba(137, 148, 143, .1);
 		min-height: 128rpx;
-		    padding: 0;
-		    height: calc(100rpx + env(safe-area-inset-bottom) / 2);
-		    padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+		padding: 0;
+		height: calc(100rpx + env(safe-area-inset-bottom) / 2);
+		padding-bottom: calc(env(safe-area-inset-bottom) / 2);
 	}
 
 	.tabbar::before {
@@ -432,7 +444,4 @@
 		animation-duration: .5s;
 		animation-delay: 0s;
 	}
-	
-	
-	
-</style>
+</style>

+ 8 - 1
main.js

xqd
@@ -2,12 +2,19 @@ import Vue from 'vue'
 import App from './App'
 import uView from "uview-ui";
 import store from "@/common/store";
-import {router,RouterMount} from "@/common/router";
+import {
+	router,
+	RouterMount
+} from "@/common/router";
 import common from "@/common";
 import TuniaoUI from 'tuniao-ui';
 import Tuniaostore from './store';
 import ws from "@/store/ws.js";
 import base64 from '@/store/base64';
+
+// 引入请求封装 
+require('./utils/request/index')(app)
+
 let vuexStore = require('@/store/$t.mixin.js');
 async function bootstrap() {
 	App.mpType = "app";

+ 78 - 73
node_modules/uview-ui/components/u-picker/props.js

xqd
@@ -1,79 +1,84 @@
 export default {
-    props: {
-        // 是否展示picker弹窗
-        show: {
-            type: Boolean,
-            default: uni.$u.props.picker.show
-        },
-        // 是否展示顶部的操作栏
-        showToolbar: {
-            type: Boolean,
-            default: uni.$u.props.picker.showToolbar
-        },
-        // 顶部标题
-        title: {
-            type: String,
-            default: uni.$u.props.picker.title
-        },
-        // 对象数组,设置每一列的数据
-        columns: {
-            type: Array,
-            default: uni.$u.props.picker.columns
-        },
-        // 是否显示加载中状态
-        loading: {
-            type: Boolean,
-            default: uni.$u.props.picker.loading
-        },
-        // 各列中,单个选项的高度
-        itemHeight: {
-            type: [String, Number],
-            default: uni.$u.props.picker.itemHeight
-        },
-        // 取消按钮的文字
-        cancelText: {
-            type: String,
-            default: uni.$u.props.picker.cancelText
-        },
-        // 确认按钮的文字
-        confirmText: {
-            type: String,
-            default: uni.$u.props.picker.confirmText
-        },
-        // 取消按钮的颜色
-        cancelColor: {
-            type: String,
-            default: uni.$u.props.picker.cancelColor
-        },
-        // 确认按钮的颜色
-        confirmColor: {
-            type: String,
-            default: uni.$u.props.picker.confirmColor
-        },
-        // 每列中可见选项的数量
-        visibleItemCount: {
-            type: [String, Number],
-            default: uni.$u.props.picker.visibleItemCount
-        },
-        // 选项对象中,需要展示的属性键名
-        keyName: {
-            type: String,
-            default: uni.$u.props.picker.keyName
-        },
-        // 是否允许点击遮罩关闭选择器
-        closeOnClickOverlay: {
-            type: Boolean,
-            default: uni.$u.props.picker.closeOnClickOverlay
-        },
-        // 各列的默认索引
-        defaultIndex: {
-            type: Array,
-            default: uni.$u.props.picker.defaultIndex
-        },
+	props: {
+		showIcon: {
+			type: Boolean,
+			default: uni.$u.props.picker.show
+		},
+
+		// 是否展示picker弹窗
+		show: {
+			type: Boolean,
+			default: uni.$u.props.picker.show
+		},
+		// 是否展示顶部的操作栏
+		showToolbar: {
+			type: Boolean,
+			default: uni.$u.props.picker.showToolbar
+		},
+		// 顶部标题
+		title: {
+			type: String,
+			default: uni.$u.props.picker.title
+		},
+		// 对象数组,设置每一列的数据
+		columns: {
+			type: Array,
+			default: uni.$u.props.picker.columns
+		},
+		// 是否显示加载中状态
+		loading: {
+			type: Boolean,
+			default: uni.$u.props.picker.loading
+		},
+		// 各列中,单个选项的高度
+		itemHeight: {
+			type: [String, Number],
+			default: uni.$u.props.picker.itemHeight
+		},
+		// 取消按钮的文字
+		cancelText: {
+			type: String,
+			default: uni.$u.props.picker.cancelText
+		},
+		// 确认按钮的文字
+		confirmText: {
+			type: String,
+			default: uni.$u.props.picker.confirmText
+		},
+		// 取消按钮的颜色
+		cancelColor: {
+			type: String,
+			default: uni.$u.props.picker.cancelColor
+		},
+		// 确认按钮的颜色
+		confirmColor: {
+			type: String,
+			default: uni.$u.props.picker.confirmColor
+		},
+		// 每列中可见选项的数量
+		visibleItemCount: {
+			type: [String, Number],
+			default: uni.$u.props.picker.visibleItemCount
+		},
+		// 选项对象中,需要展示的属性键名
+		keyName: {
+			type: String,
+			default: uni.$u.props.picker.keyName
+		},
+		// 是否允许点击遮罩关闭选择器
+		closeOnClickOverlay: {
+			type: Boolean,
+			default: uni.$u.props.picker.closeOnClickOverlay
+		},
+		// 各列的默认索引
+		defaultIndex: {
+			type: Array,
+			default: uni.$u.props.picker.defaultIndex
+		},
 		// 是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件,只在微信2.21.1及以上有效
 		immediateChange: {
 			type: Boolean,
 			default: uni.$u.props.picker.immediateChange
 		}
-    }
-}
+	}
+}

+ 183 - 211
node_modules/uview-ui/components/u-picker/u-picker.vue

xqd xqd xqd
@@ -1,51 +1,23 @@
 <template>
-	<u-popup
-		:show="show"
-		@close="closeHandler"
-	>
+	<u-popup :show="show" @close="closeHandler">
 		<view class="u-picker">
-			<u-toolbar
-				v-if="showToolbar"
-				:cancelColor="cancelColor"
-				:confirmColor="confirmColor"
-				:cancelText="cancelText"
-				:confirmText="confirmText"
-				:title="title"
-				@cancel="cancel"
-				@confirm="confirm"
-			></u-toolbar>
-			<picker-view
-				class="u-picker__view"
-				:indicatorStyle="`height: ${$u.addUnit(itemHeight)}`"
-				:value="innerIndex"
-				:immediateChange="immediateChange"
-				:style="{
+			<u-toolbar v-if="showToolbar" :showIcon="showIcon" :cancelColor="cancelColor" :confirmColor="confirmColor"
+				:cancelText="cancelText" :confirmText="confirmText" :title="title" @cancel="cancel"
+				@confirm="confirm"></u-toolbar>
+			<picker-view class="u-picker__view" :indicatorStyle="`height: ${$u.addUnit(itemHeight)}`"
+				:value="innerIndex" :immediateChange="immediateChange" :style="{
 					height: `${$u.addUnit(visibleItemCount * itemHeight)}`
-				}"
-				@change="changeHandler"
-			>
-				<picker-view-column
-					v-for="(item, index) in innerColumns"
-					:key="index"
-					class="u-picker__view__column"
-				>
-					<text
-						v-if="$u.test.array(item)"
-						class="u-picker__view__column__item u-line-1"
-						v-for="(item1, index1) in item"
-						:key="index1"
-						:style="{
+				}" @change="changeHandler">
+				<picker-view-column v-for="(item, index) in innerColumns" :key="index" class="u-picker__view__column">
+					<text v-if="$u.test.array(item)" class="u-picker__view__column__item u-line-1"
+						v-for="(item1, index1) in item" :key="index1" :style="{
 							height: $u.addUnit(itemHeight),
 							lineHeight: $u.addUnit(itemHeight),
 							fontWeight: index1 === innerIndex[index] ? 'bold' : 'normal'
-						}"
-					>{{ getItemText(item1) }}</text>
+						}">{{ getItemText(item1) }}</text>
 				</picker-view-column>
 			</picker-view>
-			<view
-				v-if="loading"
-				class="u-picker--loading"
-			>
+			<view v-if="loading" class="u-picker--loading">
 				<u-loading-icon mode="circle"></u-loading-icon>
 			</view>
 		</view>
@@ -53,184 +25,184 @@
 </template>
 
 <script>
-/**
- * u-picker
- * @description 选择器
- * @property {Boolean}			show				是否显示picker弹窗(默认 false )
- * @property {Boolean}			showToolbar			是否显示顶部的操作栏(默认 true )
- * @property {String}			title				顶部标题
- * @property {Array}			columns				对象数组,设置每一列的数据
- * @property {Boolean}			loading				是否显示加载中状态(默认 false )
- * @property {String | Number}	itemHeight			各列中,单个选项的高度(默认 44 )
- * @property {String}			cancelText			取消按钮的文字(默认 '取消' )
- * @property {String}			confirmText			确认按钮的文字(默认 '确定' )
- * @property {String}			cancelColor			取消按钮的颜色(默认 '#909193' )
- * @property {String}			confirmColor		确认按钮的颜色(默认 '#3c9cff' )
- * @property {String | Number}	visibleItemCount	每列中可见选项的数量(默认 5 )
- * @property {String}			keyName				选项对象中,需要展示的属性键名(默认 'text' )
- * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩关闭选择器(默认 false )
- * @property {Array}			defaultIndex		各列的默认索引
- * @property {Boolean}			immediateChange		是否在手指松开时立即触发change事件(默认 false )
- * @event {Function} close		关闭选择器时触发
- * @event {Function} cancel		点击取消按钮触发
- * @event {Function} change		当选择值变化时触发
- * @event {Function} confirm	点击确定按钮,返回当前选择的值
- */
-import props from './props.js';
-export default {
-	name: 'u-picker',
-	mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
-	data() {
-		return {
-			// 上一次选择的列索引
-			lastIndex: [],
-			// 索引值 ,对应picker-view的value
-			innerIndex: [],
-			// 各列的值
-			innerColumns: [],
-			// 上一次的变化列索引
-			columnIndex: 0,
-		}
-	},
-	watch: {
-		// 监听默认索引的变化,重新设置对应的值
-		defaultIndex: {
-			immediate: true,
-			handler(n) {
-				this.setIndexs(n, true)
-			}
-		},
-		// 监听columns参数的变化
-		columns: {
-			immediate: true,
-			handler(n) {
-				this.setColumns(n)
-			}
-		},
-	},
-	methods: {
-		// 获取item需要显示的文字,判别为对象还是文本
-		getItemText(item) {
-			if (uni.$u.test.object(item)) {
-				return item[this.keyName]
-			} else {
-				return item
-			}
-		},
-		// 关闭选择器
-		closeHandler() {
-			if (this.closeOnClickOverlay) {
-				this.$emit('close')
+	/**
+	 * u-picker
+	 * @description 选择器
+	 * @property {Boolean}			show				是否显示picker弹窗(默认 false )
+	 * @property {Boolean}			showToolbar			是否显示顶部的操作栏(默认 true )
+	 * @property {String}			title				顶部标题
+	 * @property {Array}			columns				对象数组,设置每一列的数据
+	 * @property {Boolean}			loading				是否显示加载中状态(默认 false )
+	 * @property {String | Number}	itemHeight			各列中,单个选项的高度(默认 44 )
+	 * @property {String}			cancelText			取消按钮的文字(默认 '取消' )
+	 * @property {String}			confirmText			确认按钮的文字(默认 '确定' )
+	 * @property {String}			cancelColor			取消按钮的颜色(默认 '#909193' )
+	 * @property {String}			confirmColor		确认按钮的颜色(默认 '#3c9cff' )
+	 * @property {String | Number}	visibleItemCount	每列中可见选项的数量(默认 5 )
+	 * @property {String}			keyName				选项对象中,需要展示的属性键名(默认 'text' )
+	 * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩关闭选择器(默认 false )
+	 * @property {Array}			defaultIndex		各列的默认索引
+	 * @property {Boolean}			immediateChange		是否在手指松开时立即触发change事件(默认 false )
+	 * @event {Function} close		关闭选择器时触发
+	 * @event {Function} cancel		点击取消按钮触发
+	 * @event {Function} change		当选择值变化时触发
+	 * @event {Function} confirm	点击确定按钮,返回当前选择的值
+	 */
+	import props from './props.js';
+	export default {
+		name: 'u-picker',
+		mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
+		data() {
+			return {
+				// 上一次选择的列索引
+				lastIndex: [],
+				// 索引值 ,对应picker-view的value
+				innerIndex: [],
+				// 各列的值
+				innerColumns: [],
+				// 上一次的变化列索引
+				columnIndex: 0,
 			}
 		},
-		// 点击工具栏的取消按钮
-		cancel() {
-			this.$emit('cancel')
-		},
-		// 点击工具栏的确定按钮
-		confirm() {
-			this.$emit('confirm', {
-				indexs: this.innerIndex,
-				value: this.innerColumns.map((item, index) => item[this.innerIndex[index]]),
-				values: this.innerColumns
-			})
+		watch: {
+			// 监听默认索引的变化,重新设置对应的值
+			defaultIndex: {
+				immediate: true,
+				handler(n) {
+					this.setIndexs(n, true)
+				}
+			},
+			// 监听columns参数的变化
+			columns: {
+				immediate: true,
+				handler(n) {
+					this.setColumns(n)
+				}
+			},
 		},
-		// 选择器某一列的数据发生变化时触发
-		changeHandler(e) {
-			const {
-				value
-			} = e.detail
-			let index = 0,
-				columnIndex = 0
-			// 通过对比前后两次的列索引,得出当前变化的是哪一列
-			for (let i = 0; i < value.length; i++) {
-				let item = value[i]
-				if (item !== (this.lastIndex[i] || 0)) { // 把undefined转为合法假值0
-					// 设置columnIndex为当前变化列的索引
-					columnIndex = i
-					// index则为变化列中的变化项的索引
-					index = item
-					break // 终止循环,即使少一次循环,也是性能的提升
+		methods: {
+			// 获取item需要显示的文字,判别为对象还是文本
+			getItemText(item) {
+				if (uni.$u.test.object(item)) {
+					return item[this.keyName]
+				} else {
+					return item
 				}
-			}
-			this.columnIndex = columnIndex
-			const values = this.innerColumns
-			// 将当前的各项变化索引,设置为"上一次"的索引变化值
-			this.setLastIndex(value)
-			this.setIndexs(value)
+			},
+			// 关闭选择器
+			closeHandler() {
+				if (this.closeOnClickOverlay) {
+					this.$emit('close')
+				}
+			},
+			// 点击工具栏的取消按钮
+			cancel() {
+				this.$emit('cancel')
+			},
+			// 点击工具栏的确定按钮
+			confirm() {
+				this.$emit('confirm', {
+					indexs: this.innerIndex,
+					value: this.innerColumns.map((item, index) => item[this.innerIndex[index]]),
+					values: this.innerColumns
+				})
+			},
+			// 选择器某一列的数据发生变化时触发
+			changeHandler(e) {
+				const {
+					value
+				} = e.detail
+				let index = 0,
+					columnIndex = 0
+				// 通过对比前后两次的列索引,得出当前变化的是哪一列
+				for (let i = 0; i < value.length; i++) {
+					let item = value[i]
+					if (item !== (this.lastIndex[i] || 0)) { // 把undefined转为合法假值0
+						// 设置columnIndex为当前变化列的索引
+						columnIndex = i
+						// index则为变化列中的变化项的索引
+						index = item
+						break // 终止循环,即使少一次循环,也是性能的提升
+					}
+				}
+				this.columnIndex = columnIndex
+				const values = this.innerColumns
+				// 将当前的各项变化索引,设置为"上一次"的索引变化值
+				this.setLastIndex(value)
+				this.setIndexs(value)
 
-			this.$emit('change', {
-				// #ifndef MP-WEIXIN || MP-LARK
-				// 微信小程序不能传递this,会因为循环引用而报错
-				picker: this,
-				// #endif
-				value: this.innerColumns.map((item, index) => item[value[index]]),
-				index,
-				indexs: value,
-				// values为当前变化列的数组内容
-				values,
-				columnIndex
-			})
-		},
-		// 设置index索引,此方法可被外部调用设置
-		setIndexs(index, setLastIndex) {
-			this.innerIndex = uni.$u.deepClone(index)
-			if (setLastIndex) {
-				this.setLastIndex(index)
-			}
-		},
-		// 记录上一次的各列索引位置
-		setLastIndex(index) {
-			// 当能进入此方法,意味着当前设置的各列默认索引,即为“上一次”的选中值,需要记录,是因为changeHandler中
-			// 需要拿前后的变化值进行对比,得出当前发生改变的是哪一列
-			this.lastIndex = uni.$u.deepClone(index)
-		},
-		// 设置对应列选项的所有值
-		setColumnValues(columnIndex, values) {
-			// 替换innerColumns数组中columnIndex索引的值为values,使用的是数组的splice方法
-			this.innerColumns.splice(columnIndex, 1, values)
-			// 拷贝一份原有的innerIndex做临时变量,将大于当前变化列的所有的列的默认索引设置为0
-			let tmpIndex = uni.$u.deepClone(this.innerIndex)
-			for (let i = 0; i < this.innerColumns.length; i++) {
-				if (i > this.columnIndex) {
-					tmpIndex[i] = 0
+				this.$emit('change', {
+					// #ifndef MP-WEIXIN || MP-LARK
+					// 微信小程序不能传递this,会因为循环引用而报错
+					picker: this,
+					// #endif
+					value: this.innerColumns.map((item, index) => item[value[index]]),
+					index,
+					indexs: value,
+					// values为当前变化列的数组内容
+					values,
+					columnIndex
+				})
+			},
+			// 设置index索引,此方法可被外部调用设置
+			setIndexs(index, setLastIndex) {
+				this.innerIndex = uni.$u.deepClone(index)
+				if (setLastIndex) {
+					this.setLastIndex(index)
 				}
-			}
-			// 一次性赋值,不能单个修改,否则无效
-			this.setIndexs(tmpIndex)
-		},
-		// 获取对应列的所有选项
-		getColumnValues(columnIndex) {
-			// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
-			// 索引如果在外部change的回调中调用getColumnValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
-			(async () => {
-				await uni.$u.sleep()
-			})()
-			return this.innerColumns[columnIndex]
-		},
-		// 设置整体各列的columns的值
-		setColumns(columns) {
-			this.innerColumns = uni.$u.deepClone(columns)
-			// 如果在设置各列数据时,没有被设置默认的各列索引defaultIndex,那么用0去填充它,数组长度为列的数量
-			if (this.innerIndex.length === 0) {
-				this.innerIndex = new Array(columns.length).fill(0)
+			},
+			// 记录上一次的各列索引位置
+			setLastIndex(index) {
+				// 当能进入此方法,意味着当前设置的各列默认索引,即为“上一次”的选中值,需要记录,是因为changeHandler中
+				// 需要拿前后的变化值进行对比,得出当前发生改变的是哪一列
+				this.lastIndex = uni.$u.deepClone(index)
+			},
+			// 设置对应列选项的所有值
+			setColumnValues(columnIndex, values) {
+				// 替换innerColumns数组中columnIndex索引的值为values,使用的是数组的splice方法
+				this.innerColumns.splice(columnIndex, 1, values)
+				// 拷贝一份原有的innerIndex做临时变量,将大于当前变化列的所有的列的默认索引设置为0
+				let tmpIndex = uni.$u.deepClone(this.innerIndex)
+				for (let i = 0; i < this.innerColumns.length; i++) {
+					if (i > this.columnIndex) {
+						tmpIndex[i] = 0
+					}
+				}
+				// 一次性赋值,不能单个修改,否则无效
+				this.setIndexs(tmpIndex)
+			},
+			// 获取对应列的所有选项
+			getColumnValues(columnIndex) {
+				// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
+				// 索引如果在外部change的回调中调用getColumnValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
+				(async () => {
+					await uni.$u.sleep()
+				})()
+				return this.innerColumns[columnIndex]
+			},
+			// 设置整体各列的columns的值
+			setColumns(columns) {
+				this.innerColumns = uni.$u.deepClone(columns)
+				// 如果在设置各列数据时,没有被设置默认的各列索引defaultIndex,那么用0去填充它,数组长度为列的数量
+				if (this.innerIndex.length === 0) {
+					this.innerIndex = new Array(columns.length).fill(0)
+				}
+			},
+			// 获取各列选中值对应的索引
+			getIndexs() {
+				return this.innerIndex
+			},
+			// 获取各列选中的值
+			getValues() {
+				// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
+				// 索引如果在外部change的回调中调用getValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
+				(async () => {
+					await uni.$u.sleep()
+				})()
+				return this.innerColumns.map((item, index) => item[this.innerIndex[index]])
 			}
 		},
-		// 获取各列选中值对应的索引
-		getIndexs() {
-			return this.innerIndex
-		},
-		// 获取各列选中的值
-		getValues() {
-			// 进行同步阻塞,因为外部得到change事件之后,可能需要执行setColumnValues更新列的值
-			// 索引如果在外部change的回调中调用getValues的话,可能无法得到变更后的列值,这里进行一定延时,保证值的准确性
-			(async () => {
-				await uni.$u.sleep()
-			})()
-			return this.innerColumns.map((item, index) => item[this.innerIndex[index]])
-		}
-	},
-}
+	}
 </script>
 
 <style lang="scss" scoped>
@@ -280,4 +252,4 @@ export default {
 			z-index: 1000;
 		}
 	}
-</style>
+</style>

+ 5 - 19
node_modules/uview-ui/components/u-slider/u-slider.vue

xqd xqd
@@ -1,22 +1,8 @@
 <template>
-	<view
-		class="u-slider"
-		:style="[$u.addStyle(customStyle)]"
-	>
-		<slider
-			:min="min"
-			:max="max"
-			:step="step"
-			:value="value"
-			:activeColor="activeColor"
-			:inactiveColor="inactiveColor"
-			:blockSize="$u.getPx(blockSize)"
-			:blockColor="blockColor"
-			:showValue="showValue"
-			:disabled="disabled"
-			@changing="changingHandler"
-			@change="changeHandler"
-		></slider>
+	<view class="u-slider" :style="[$u.addStyle(customStyle)]">
+		<slider :min="min" :max="max" :step="step" :value="value" :activeColor="activeColor"
+			:inactiveColor="inactiveColor" :blockSize="$u.getPx(blockSize)" :blockColor="blockColor"
+			:showValue="showValue" :disabled="disabled" @changing="changingHandler" @change="changeHandler"></slider>
 	</view>
 </template>
 
@@ -52,4 +38,4 @@
 
 <style lang="scss" scoped>
 	@import "../../libs/css/components.scss";
-</style>
+</style>

+ 37 - 33
node_modules/uview-ui/components/u-toolbar/props.js

xqd
@@ -1,34 +1,38 @@
 export default {
-    props: {
-        // 是否展示工具条
-        show: {
-            type: Boolean,
-            default: uni.$u.props.toolbar.show
-        },
-        // 取消按钮的文字
-        cancelText: {
-            type: String,
-            default: uni.$u.props.toolbar.cancelText
-        },
-        // 确认按钮的文字
-        confirmText: {
-            type: String,
-            default: uni.$u.props.toolbar.confirmText
-        },
-        // 取消按钮的颜色
-        cancelColor: {
-            type: String,
-            default: uni.$u.props.toolbar.cancelColor
-        },
-        // 确认按钮的颜色
-        confirmColor: {
-            type: String,
-            default: uni.$u.props.toolbar.confirmColor
-        },
-        // 标题文字
-        title: {
-            type: String,
-            default: uni.$u.props.toolbar.title
-        }
-    }
-}
+	props: {
+		showIcon: {
+			type: Boolean,
+			default: uni.$u.props.toolbar.show
+		},
+		// 是否展示工具条
+		show: {
+			type: Boolean,
+			default: uni.$u.props.toolbar.show
+		},
+		// 取消按钮的文字
+		cancelText: {
+			type: String,
+			default: uni.$u.props.toolbar.cancelText
+		},
+		// 确认按钮的文字
+		confirmText: {
+			type: String,
+			default: uni.$u.props.toolbar.confirmText
+		},
+		// 取消按钮的颜色
+		cancelColor: {
+			type: String,
+			default: uni.$u.props.toolbar.cancelColor
+		},
+		// 确认按钮的颜色
+		confirmColor: {
+			type: String,
+			default: uni.$u.props.toolbar.confirmColor
+		},
+		// 标题文字
+		title: {
+			type: String,
+			default: uni.$u.props.toolbar.title
+		}
+	}
+}

+ 28 - 31
node_modules/uview-ui/components/u-toolbar/u-toolbar.vue

xqd xqd xqd xqd
@@ -1,36 +1,19 @@
 <template>
-	<view
-		class="u-toolbar"
-		@touchmove.stop.prevent="noop"
-		v-if="show"
-	>
-		<view
-			class="u-toolbar__cancel__wrapper"
-			hover-class="u-hover-class"
-		>
-			<text
-				class="u-toolbar__wrapper__cancel"
-				@tap="cancel"
-				:style="{
+	<view class="u-toolbar" @touchmove.stop.prevent="noop" v-if="show">
+		<view class="u-toolbar__cancel__wrapper" hover-class="u-hover-class">
+			<text v-if="!showIcon" class="u-toolbar__wrapper__cancel" @tap="cancel" :style="{
 					color: cancelColor
-				}"
-			>{{ cancelText }}</text>
+				}">{{ cancelText }}</text>
+
+			<image class="closeBtn" v-else src="/static/images/closeBtn.png" mode="" @tap="cancel"></image>
 		</view>
-		<text
-			class="u-toolbar__title u-line-1"
-			v-if="title"
-		>{{ title }}</text>
-		<view
-			class="u-toolbar__confirm__wrapper"
-			hover-class="u-hover-class"
-		>
-			<text
-				class="u-toolbar__wrapper__confirm"
-				@tap="confirm"
-				:style="{
+		<text class="u-toolbar__title u-line-1" v-if="title">{{ title }}</text>
+		<view class="u-toolbar__confirm__wrapper" hover-class="u-hover-class">
+			<text v-if="!showIcon" class="u-toolbar__wrapper__confirm" @tap="confirm" :style="{
 				color: confirmColor
-			}"
-			>{{ confirmText }}</text>
+			}">{{ confirmText }}</text>
+
+			<image class="confirmBtn" v-else src="/static/images/selected.png" mode="" @tap="confirm"></image>
 		</view>
 	</view>
 </template>
@@ -52,7 +35,7 @@
 	 */
 	export default {
 		name: 'u-toolbar',
-		mixins: [uni.$u.mpMixin, uni.$u.mixin,props],
+		mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
 		methods: {
 			// 点击取消按钮
 			cancel() {
@@ -69,6 +52,20 @@
 <style lang="scss" scoped>
 	@import "../../libs/css/components.scss";
 
+	.closeBtn {
+		width: 30rpx;
+		height: 30rpx;
+		margin-left: 15px;
+		margin-right: 15px;
+	}
+
+	.confirmBtn {
+		width: 38rpx;
+		height: 30rpx;
+		margin-left: 15px;
+		margin-right: 15px;
+	}
+
 	.u-toolbar {
 		height: 42px;
 		@include flex;
@@ -99,4 +96,4 @@
 			}
 		}
 	}
-</style>
+</style>

+ 153 - 114
pages.json

xqd xqd xqd xqd xqd xqd xqd xqd
@@ -7,8 +7,22 @@
 		"^(?!z-paging-refresh|z-paging-load-more)z-paging(.*)": "z-paging/components/z-paging$1/z-paging$1.vue"
 	},
 	"pages": [{
-			"path": "pages/index/index",
+			"path": "pages/robot/index",
 			"aliasPath": "/",
+			"style": {
+				"navigationBarTitleText": "数字人",
+				"navigationBarBackgroundColor": "#F5FFFD",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				"enablePullDownRefresh": true,
+				"backgroundColor": "#F2F2F2"
+			}
+
+		},
+		{
+			"path": "pages/index/index",
+			// "aliasPath": "/",
 			"style": {
 				"navigationBarTextStyle": "black",
 				"navigationBarTitleText": "首页",
@@ -85,7 +99,7 @@
 		}
 
 		,
-		 {
+		{
 			"path": "pages/user/member/member",
 			"style": {
 				"navigationBarTitleText": "",
@@ -100,7 +114,7 @@
 				"title": ""
 			}
 		}, {
-		 "path": "pages/user/public/paymentdetail",
+			"path": "pages/user/public/paymentdetail",
 			"style": {
 				"navigationBarTitleText": "",
 				"enablePullDownRefresh": false,
@@ -109,8 +123,8 @@
 			},
 			"meta": {
 				"auth": true,
-		 	"title": ""
-		 }
+				"title": ""
+			}
 		}, {
 			"path": "pages/user/member/record",
 			"style": {
@@ -160,18 +174,16 @@
 		},
 		{
 			"path": "pages/painting/painting",
-			"style": 
-		    {
-		        "navigationBarTitleText": "AI绘画",
-		    	"navigationBarBackgroundColor": "#F5FFFD",
-		    	// #ifdef H5
-		    	"navigationStyle": "custom",
-		    	// #endif
-		        "enablePullDownRefresh": false,
-		    	"backgroundColor": "#fff"
-		    }
-		}
-		, {
+			"style": {
+				"navigationBarTitleText": "AI绘画",
+				"navigationBarBackgroundColor": "#F5FFFD",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#fff"
+			}
+		}, {
 			"path": "pages/user/takenotes/takenotes",
 			"style": {
 				"navigationBarTitleText": "",
@@ -264,109 +276,134 @@
 				"enablePullDownRefresh": false,
 				"navigationBarBackgroundColor": "#ffffff"
 			}
-		
+
 		}
-		
-        ,{
-            "path" : "pages/template/template",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "提问模板",
+
+		, {
+			"path": "pages/template/template",
+			"style": {
+				"navigationBarTitleText": "提问模板",
 				"navigationBarBackgroundColor": "#F5FFFD",
 				// #ifdef H5
 				"navigationStyle": "custom",
 				// #endif
-                "enablePullDownRefresh": false,
+				"enablePullDownRefresh": false,
 				"backgroundColor": "#fff"
-            }
-            
-        }
-        ,{
-            "path" : "pages/template/detail",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "enablePullDownRefresh": false,
+			}
+
+		}, {
+			"path": "pages/template/detail",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false,
 				"navigationStyle": "custom",
 				"backgroundColor": "#fff"
-				
-            }
-        }
-       
-        ,{
-            "path" : "pages/signin/signin",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "每日任务",
-                "navigationBarBackgroundColor": "#F5FFFD",
-                // #ifdef H5
-                "navigationStyle": "custom",
-                // #endif
-                "enablePullDownRefresh": false,
+
+			}
+		}
+
+		, {
+			"path": "pages/signin/signin",
+			"style": {
+				"navigationBarTitleText": "每日任务",
+				"navigationBarBackgroundColor": "#F5FFFD",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				"enablePullDownRefresh": false,
 				"backgroundColor": "#F2F2F2"
-            }
-            
-        }
-        ,{
-            "path" : "pages/user/draw/draw",
-            "style" :                                                                                    
-            {
-               "navigationBarTitleText": "",
-               "navigationStyle": "custom",
-               "enablePullDownRefresh": false,
-               "navigationBarBackgroundColor": "#ffffff"
-            }
-            
-        }
-        ,{
-            "path" : "pages/user/orderrecord/orderrecord",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "navigationStyle": "custom",
-                "enablePullDownRefresh": false,
-                "navigationBarBackgroundColor": "#ffffff"
-            }
-            
-        }
-        ,{
-            "path" : "pages/painting/draw",
-            "style" :                                                                                    
-            {
-               "navigationBarTitleText": "AI绘画",
-               "navigationStyle": "custom",
-               "enablePullDownRefresh": false,
-               "navigationBarBackgroundColor": "#ffffff"
-            }
-            
-        }
-        ,{
-            "path" : "pages/painting/details",
-            "style" :                                                                                    
-            {
-               "navigationBarTitleText": "AI绘图",
-               // #ifdef H5
-               "navigationStyle": "custom",
-               // #endif
-               "enablePullDownRefresh": false,
-			   "navigationBarTextStyle": "white",
-               "navigationBarBackgroundColor": "#000"
-            }
-            
-        }
-        ,{
-            "path" : "pages/painting/generate",
-            "style" :                                                                                    
-            {
-                "navigationBarTitleText": "",
-                "navigationStyle": "custom",
-                "enablePullDownRefresh": false,
-                "navigationBarBackgroundColor": "#ffffff",
+			}
+
+		}, {
+			"path": "pages/user/draw/draw",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+
+		}, {
+			"path": "pages/user/orderrecord/orderrecord",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+
+		}, {
+			"path": "pages/painting/draw",
+			"style": {
+				"navigationBarTitleText": "AI绘画",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+
+		}, {
+			"path": "pages/painting/details",
+			"style": {
+				"navigationBarTitleText": "AI绘图",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				"enablePullDownRefresh": false,
+				"navigationBarTextStyle": "white",
+				"navigationBarBackgroundColor": "#000"
+			}
+
+		}, {
+			"path": "pages/painting/generate",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
 				"disableSwipeBack": true
-            }
-            
-        }
-    ],
+			}
+
+		},
+		{
+			"path": "pages/robot/index",
+			"style": {
+				"navigationBarTitleText": "数字人",
+				"navigationBarBackgroundColor": "#F5FFFD",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#F2F2F2"
+			}
+
+		},
+		{
+			"path": "pages/robot/generate/index",
+			"style": {
+				"navigationBarTitleText": "数字人创建",
+				"navigationBarBackgroundColor": "#F5FFFD",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#F2F2F2"
+			}
+
+		},
+		{
+			"path": "pages/robot/workDetail/index",
+			"style": {
+				"navigationBarTitleText": "数字人预览",
+				"navigationBarBackgroundColor": "#F5FFFD",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#F2F2F2"
+			}
+
+		}
+	],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
 		"navigationBarTitleText": "首页",
@@ -378,8 +415,7 @@
 		"selectedColor": "#26B3A0",
 		"borderStyle": "white",
 		"backgroundColor": "#fff",
-		"list": [
-			{
+		"list": [{
 				"pagePath": "pages/index/index"
 			},
 			{
@@ -389,12 +425,15 @@
 				"pagePath": "pages/painting/painting"
 			},
 			{
-				"pagePath": "pages/signin/signin"
+				"pagePath": "pages/robot/index"
 			},
+			// {
+			// 	"pagePath": "pages/signin/signin"
+			// },
 			{
 				"pagePath": "pages/user/user"
 			}
 		]
 	}
 
-}
+}

+ 5 - 5
pages/painting/details.vue

xqd xqd xqd xqd
@@ -30,7 +30,7 @@
 					<view></view>
 				</view>
 				<view class="drawing">
-					{{drawingtitle}}
+					{{drawingtitle}}1
 				</view>
 				<view v-if="showprogress" class="progress">
 					<u-line-progress :percentage="percentage" activeColor="#9b59b6" height="18"></u-line-progress>
@@ -322,8 +322,8 @@
 			},
 			aiPlay() {
 
-				console.log('aiPlay()传递给后端的参数:',this.form);
-				
+				console.log('aiPlay()传递给后端的参数:', this.form);
+
 				let that = this;
 				this.showdrawing = true
 				if (that.failnum == 0) {
@@ -331,7 +331,7 @@
 				}
 
 				this.$http('gallery.create', this.form).then(res => {
-					console.log('aiPlay()返回值:',res);
+					console.log('aiPlay()返回值:', res);
 					if (res.code == 0) {
 						this.showTask(res.data.id)
 					} else {
@@ -368,7 +368,7 @@
 				this.$http('gallery.getOpensdDetail', {
 					id: id,
 				}).then(res => {
-					console.log('showTask--gallery.getOpensdDetail返回值:',res,res.data.state);
+					console.log('showTask--gallery.getOpensdDetail返回值:', res, res.data.state);
 					if (res.code == 0) {
 						if (res.data.state == "success") {
 							this.percentage = 99

+ 639 - 0
pages/robot/generate/index.scss

xqd
@@ -0,0 +1,639 @@
+page {
+		// background: #f2f2f2;
+	}
+	.pos{
+		height: 45px;
+	}
+
+	view {
+		box-sizing: border-box;
+	}
+	.u-textarea{
+		min-height:400rpx;
+	}
+	.container{
+		// padding-bottom:130rpx;
+		.context{
+			padding: 40rpx;
+			padding-left: 0;
+			padding-right: 0;
+			padding-bottom: 0;
+			.top{
+				display: flex;
+				justify-content: center;
+				.videoBox{
+					// width: 442rpx;
+					// height: 786rpx;
+					width: 80%;
+					min-height: 465rpx;
+					background: #ccc;
+					image{
+						width: 100%;
+						// height: 100%;
+					}
+				}
+			}
+			
+			.centerMenuBar{
+				display: flex;
+				justify-content: space-between;
+				height: 96rpx;
+				background: #ccc;
+				margin-top: 30rpx;
+				padding-left: 40rpx;
+				padding-right: 40rpx;
+				.barItem{
+					display: flex;
+					align-items: center;
+					.left{
+						width: 64rpx;
+						height: 64rpx;
+						margin-right: 10rpx;
+						image{
+							width: 100%;
+							height: 100%;
+							border-radius: 50%;
+						}
+					}
+					.right{
+						
+					}
+				}
+			}
+			.btnBox{
+			padding: 0 40rpx;
+			// position: fixed;
+			// bottom: 0rpx;
+			background: #fff;
+			height: 150rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			width: 100%;
+			border-top: 1px solid #ccc;
+				.btn{
+					background: #26b3a0;
+					color: #fff;
+					width: 45%;
+					height: 94rpx;
+					border-radius: 15rpx;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					font-size: 32rpx;
+				}
+				.draft{
+					background: #fff;
+					border:2rpx solid  #26b3a0;
+					color: #26b3a0;
+				}
+			}
+		}
+		
+	}
+	::v-deep .u-popup__content{
+		border-radius: 15rpx;
+	}
+	
+	.contentBox2{
+		.toolBar{
+			height: 100rpx;
+			display: flex;
+			align-items: center;
+			border-radius: 15rpx 15rpx 0 0;
+			.cancel{
+				width: 10%;
+				height: 35rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image{
+					width: 35rpx;
+					height: 35rpx;
+				}
+			}
+			.center{
+				width: 80%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			.confirm{
+				width: 10%;
+				height: 35rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image{
+					width: 40rpx;
+					height: 35rpx;
+				}
+			}
+			
+		}
+		.toolBar2{
+			height: 100rpx;
+			display: flex;
+			align-items: center;
+			justify-content:flex-end;
+			border-radius: 15rpx 15rpx 0 0;
+			.closeBtn{
+				width: 44rpx;
+				height: 44rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				background: #999;
+				margin-right: 30rpx;
+				color: white;
+				border-radius: 50%;
+				// image{
+				// 	width: 40rpx;
+				// 	height: 35rpx;
+				// }
+			}
+		}
+		.content{
+			.videoRatioBox{
+				display: flex;
+				justify-content: space-between;
+				padding: 20rpx 60rpx;
+				padding-bottom: 50rpx;
+				.item{
+					background: #ccc;
+					width: 45%;
+					height: 154rpx;
+					border-radius: 10rpx;
+					display: flex;
+					
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					.top{
+						margin-bottom: 10rpx;
+					}
+					.bottom{	
+					}
+				}
+			}
+			
+			.slider{
+				margin-top: 0;
+				width: 85%;
+				margin-left: 50%;
+				transform: translateX(-50%);
+			}
+			.sliderValue{
+				text-align: center;
+			}
+			
+			
+			// 声音
+			.filterBox{
+				display: flex;
+				.tabList{
+					width: 90%;
+					overflow-x: scroll;
+					white-space: nowrap;
+					padding: 0 20rpx;
+					.item1{
+						padding: 10rpx 30rpx;
+						display: inline-block;
+						margin-right: 20rpx;
+						border-radius: 10rpx;
+						background:#ccc ;
+					}
+					.tabActive{
+						background:#26b3a0 ;
+						color: white;
+					}
+
+				}
+				.filterBtn{
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					width: 10%;
+					image{
+						width: 44rpx;
+						height: 44rpx;
+					}
+				}
+				
+			}
+				
+			.filterConList2{
+				.pictureBox{
+					padding-top: 30rpx;
+					padding-bottom: 50rpx;
+					display: flex;
+					flex-wrap: wrap;
+					.sel{
+						border: 2rpx solid #26b3a0;
+					}
+					image{
+						width: 128rpx;
+						height: 176rpx;
+						margin:10rpx  30rpx;
+					}
+					.color{
+						width: 128rpx;
+						height: 176rpx;
+						margin:10rpx  30rpx;
+					}
+				}
+				
+				}
+			
+			.filterConList{
+				display: flex;
+				padding-top: 30rpx;
+				flex-wrap: wrap;
+				min-height: 500rpx;
+				max-height: 500rpx;
+				overflow-y: scroll;
+				.item{
+					width: 128rpx;
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					align-items: center;
+					margin: 0 30rpx;
+					margin-bottom: 20rpx;
+					image{
+						width: 128rpx;
+						height: 128rpx;
+						border-radius: 50%;
+					}
+					.name{
+						margin-top: 10rpx;
+					}
+				}
+				.sel{
+					border: 2rpx solid #26b3a0;
+				}
+			}
+			
+			
+			.scenList{
+				// background: #26b3a0;
+				display: flex;
+				flex-wrap: wrap;
+				padding:0 40rpx;
+				margin-bottom: 20rpx;
+				.item{
+					background: #ccc;
+					padding: 10rpx 20rpx;
+					margin-right: 20rpx;
+					margin-bottom: 20rpx;
+					border-radius: 10rpx;
+				}
+			}
+			.sexList{
+				// background: #26b3a0;
+				display: flex;
+				flex-wrap: wrap;
+				padding:0 40rpx;
+				margin-bottom: 20rpx;
+				.item{
+					background: #ccc;
+					padding: 10rpx 20rpx;
+					margin-right: 20rpx;
+					margin-bottom: 20rpx;
+					border-radius: 10rpx;
+				}
+			}
+			.ageList{
+				display: flex;
+				flex-wrap: wrap;
+				padding:0 40rpx;
+				margin-bottom: 20rpx;
+				.item{
+					background: #ccc;
+					padding: 10rpx 20rpx;
+					margin-right: 20rpx;
+					margin-bottom: 20rpx;
+					border-radius: 10rpx;
+				}
+			}
+			.active{
+				background: #26b3a0!important;
+				color:white;
+			}
+			
+			.filterBtn2{
+				color: white;
+				background: #26b3a0;
+				height: 94rpx;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				border-radius: 15rpx;
+				margin-bottom: 50rpx;
+				width: 670rpx;
+				margin-left: 50%;
+				transform: translateX(-50%);
+			}
+
+		}
+	}
+	
+	.contentBox{
+	
+		.toolBar{
+			height: 100rpx;
+			display: flex;
+			align-items: center;
+			border-radius: 15rpx 15rpx 0 0;
+			.cancel{
+				width: 10%;
+				height: 35rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image{
+					width: 35rpx;
+					height: 35rpx;
+				}
+			}
+			.center{
+				width: 80%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			.confirm{
+				width: 10%;
+				height: 35rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image{
+					width: 40rpx;
+					height: 35rpx;
+				}
+			}
+			
+		}
+		.toolBar2{
+			height: 100rpx;
+			display: flex;
+			align-items: center;
+			justify-content:flex-end;
+			border-radius: 15rpx 15rpx 0 0;
+			.closeBtn{
+				width: 44rpx;
+				height: 44rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				background: #999;
+				margin-right: 30rpx;
+				color: white;
+				border-radius: 50%;
+				// image{
+				// 	width: 40rpx;
+				// 	height: 35rpx;
+				// }
+			}
+		}
+		.content{
+			.videoRatioBox{
+				display: flex;
+				justify-content: space-between;
+				padding: 20rpx 60rpx;
+				padding-bottom: 50rpx;
+				.item{
+					background: #ccc;
+					width: 45%;
+					height: 154rpx;
+					border-radius: 10rpx;
+					display: flex;
+					
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					.top{
+						margin-bottom: 10rpx;
+					}
+					.bottom{	
+					}
+				}
+			}
+			
+			.slider{
+				margin-top: 20%;
+				width: 85%;
+				margin-left: 50%;
+				transform: translateX(-50%);
+			}
+			.sliderValue{
+				text-align: center;
+			}
+			
+			
+			// 声音
+			.filterBox{
+				display: flex;
+				.tabList{
+					width: 90%;
+					overflow-x: scroll;
+					white-space: nowrap;
+					padding: 0 20rpx;
+					.item1{
+						padding: 10rpx 30rpx;
+						display: inline-block;
+						margin-right: 20rpx;
+						border-radius: 10rpx;
+						background:#ccc ;
+					}
+					.tabActive{
+						background:#26b3a0 ;
+						color: white;
+					}
+	
+				}
+				.filterBtn{
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					width: 10%;
+					image{
+						width: 44rpx;
+						height: 44rpx;
+					}
+				}
+				
+			}
+				
+			.filterConList2{	
+				
+				.pictureBox{
+					padding-top: 30rpx;
+					padding-bottom: 50rpx;
+					display: flex;
+					flex-wrap: wrap;
+					.sel{
+						border: 2rpx solid #26b3a0;
+					}
+					image{
+						width: 128rpx;
+						height: 176rpx;
+						margin:10rpx  30rpx;
+					}
+					.color{
+						width: 128rpx;
+						height: 176rpx;
+						margin:10rpx  30rpx;
+					}
+				}
+				
+				}
+			
+			.filterConList{
+				display: flex;
+				padding-top: 30rpx;
+				flex-wrap: wrap;
+			
+				.item{
+					width: 128rpx;
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					align-items: center;
+					margin: 0 30rpx;
+					margin-bottom: 20rpx;
+					image{
+						width: 128rpx;
+						height: 128rpx;
+						border-radius: 50%;
+					}
+					.name{
+						margin-top: 10rpx;
+					}
+				}
+				.sel{
+					border: 2rpx solid #26b3a0;
+				}
+			}
+			
+			
+			.scenList{
+				// background: #26b3a0;
+				display: flex;
+				flex-wrap: wrap;
+				padding:0 40rpx;
+				margin-bottom: 20rpx;
+				.item{
+					background: #ccc;
+					padding: 10rpx 20rpx;
+					margin-right: 20rpx;
+					margin-bottom: 20rpx;
+					border-radius: 10rpx;
+				}
+			}
+			.sexList{
+				// background: #26b3a0;
+				display: flex;
+				flex-wrap: wrap;
+				padding:0 40rpx;
+				margin-bottom: 20rpx;
+				.item{
+					background: #ccc;
+					padding: 10rpx 20rpx;
+					margin-right: 20rpx;
+					margin-bottom: 20rpx;
+					border-radius: 10rpx;
+				}
+			}
+			.ageList{
+				display: flex;
+				flex-wrap: wrap;
+				padding:0 40rpx;
+				margin-bottom: 20rpx;
+				.item{
+					background: #ccc;
+					padding: 10rpx 20rpx;
+					margin-right: 20rpx;
+					margin-bottom: 20rpx;
+					border-radius: 10rpx;
+				}
+			}
+			.active{
+				background: #26b3a0!important;
+				color:white;
+			}
+			
+			.filterBtn2{
+				color: white;
+				background: #26b3a0;
+				height: 94rpx;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				border-radius: 15rpx;
+				margin-bottom: 50rpx;
+				width: 670rpx;
+				margin-left: 50%;
+				transform: translateX(-50%);
+			}
+	
+		}
+	}
+	
+	::v-deep uni-slider .uni-slider-handle-wrapper{
+		height: 15rpx;
+	}
+	::v-deep .tn-custom-nav-bar__bar--fixed{
+		z-index:999!important;
+	}
+
+	
+	
+	.robotNameBox{
+		padding: 20rpx 10rpx;
+		.name{
+			margin-bottom: 10rpx;
+			margin-top: 20rpx;
+		}
+	}
+	
+	::v-deep .is-focused{
+		border-color: #26b3a0!important;
+	}
+	
+	.selCon{
+		margin-top: 30rpx;
+		padding-left: 30rpx;
+		
+		display: flex;
+		justify-content: space-around;
+		.item{
+			display: flex;
+			align-items: center;
+			.label{
+			}
+			.con{
+				
+			}
+			.conImg{
+				width:50rpx;
+				height:50rpx;
+				margin-left: 20rpx;
+			}
+		}
+	}
+	
+	
+	
+	.nameDes{
+		margin-top:  10rpx;
+		font-size: 24rpx;
+		color: #999;
+		text-align: center;
+	}
+	
+	.selTxt{
+		color:#26b3a0 !important;
+		font-weight: 600;
+	}

+ 637 - 0
pages/robot/generate/index.vue

xqd
@@ -0,0 +1,637 @@
+<template>
+	<view class="container">
+		<tn-nav-bar :isBack="true" backgroundColor="#fff" :bottomShadow="false">数字人创建</tn-nav-bar>
+		<view class="pos">
+		</view>
+		<view class="context">
+			<view class="top">
+				<view class="videoBox">
+					<image v-if="selBgPic" :src="selBgPic"></image>
+					<view v-else class="emptyVideo"></view>
+				</view>
+			</view>
+			<view class="selCon">
+				<view class="item">
+					<view class="label">
+						语速:
+					</view>
+					<view class="con">
+						{{roundRate}}X
+					</view>
+				</view>
+				<view class="item">
+					<view class="label">
+						声音:{{selVoiceItem.name}}
+					</view>
+					<image class="conImg" :src="selVoiceItem.url">
+					</image>
+				</view>
+				<view class="item">
+					<view class="label">
+						角色:{{selRoleItem.name}}
+					</view>
+					<image class="conImg" :src="selRoleItem.url">
+					</image>
+				</view>
+			</view>
+			<view class="centerMenuBar">
+				<view class="barItem" v-for="(item,index) in menuList" @click="handleSetBox(item)">
+					<view class="left">
+						<image src="/static/images/head.jpg" mode=""></image>
+					</view>
+					<view class="right">
+						{{item.name}}
+					</view>
+				</view>
+			</view>
+			<view class="robotNameBox">
+				<!-- 	<view class="name">
+					播报标题:
+				</view> -->
+				<uni-easyinput :inputBorder="true" :clearable="false" v-model="robotName"
+					placeholder="请输入播报标题"></uni-easyinput>
+			</view>
+			<u--textarea height="" border="none" :autoHeight="true" maxlength="9999" v-model="textAreaValue"
+				placeholder="请输入播报内容"></u--textarea>
+
+			<view class="btnBox">
+				<view class="btn" @click="genRobot">
+					合成
+				</view>
+				<view class="btn draft" @click="saveDraft">
+					存草稿
+				</view>
+			</view>
+
+		</view>
+		<u-picker :showIcon="true" :show="showMoreMenu" :columns="columns" title="更多" confirmColor=""
+			@cancel="showMoreMenu=false" @confirm="handleConfirm"></u-picker>
+
+		<u-popup :show="show" @close="close" @open="open">
+			<view class="contentBox">
+				<view class="toolBar">
+					<view class="cancel" @click="show=false">
+						<image src="/static/images/closeBtn.png" mode=""></image>
+					</view>
+					<view class="center">
+						全局语速
+					</view>
+					<view class="confirm" @click="handleBtnConfirm">
+						<image src="/static/images/selected.png" mode=""></image>
+					</view>
+				</view>
+				<view class="content" style="min-height: 300rpx;">
+					<u-slider height="50" min="0.7" max="1.3" step="0.1" class="slider" :showValue='false'
+						@change="handleChange" activeColor="#26b3a0" v-model="voiceRate"></u-slider>
+					<view class="sliderValue">
+						{{roundRate}}X
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		<!-- 声音 -->
+		<u-popup :show="show1" @close="close" @open="open">
+			<view class="contentBox">
+				<view class="toolBar">
+					<view class="cancel" @click="show1=false">
+						<image src="/static/images/closeBtn.png" mode=""></image>
+					</view>
+					<view class="center">
+						声音
+					</view>
+					<view class="confirm" @click="handleBtnConfirm1">
+						<image src="/static/images/selected.png" mode=""></image>
+					</view>
+				</view>
+				<view class="content">
+					<!-- 			<view class="filterBox">
+						<view class="tabList">
+							<view class="item1" v-for="(item,index) in voiceList"
+								:class="[currTabIndex==index?'tabActive':'']" @click="currTabIndex=index">
+								{{item}}
+							</view>
+						</view>
+						<view class="filterBtn" @click="handleFilter">
+							<text class="iconfont icon-shaixuanguolv" style="font-size: 44rpx; color: #26b3a0;"></text>
+
+						</view>
+					</view> -->
+
+					<view class="filterConList" style="max-height: 500rpx;min-height: 500rpx;overflow-y: scroll;">
+						<view class="item" v-for="(item,index) in allList" @click="handleVoiceSel(item,index)">
+							<image :class="[currTabIndexAll==index?'sel':'']" :src="item.url" mode="">
+							</image>
+							<view class="nameDes">
+								{{item.title}}
+							</view>
+							<view class="name" :class="[currTabIndexAll==index?'selTxt':'']">
+								{{item.name}}
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		<!-- 模型 -->
+		<u-popup :show="show3" @close="close" @open="open">
+			<view class="contentBox2">
+				<view class="toolBar">
+					<view class="cancel" @click="show3=false">
+						<image src="/static/images/closeBtn.png" mode=""></image>
+					</view>
+					<view class="center">
+						角色
+					</view>
+					<view class="confirm" @click="handleBtnConfirm2">
+						<image src="/static/images/selected.png" mode=""></image>
+					</view>
+				</view>
+				<view class="content">
+					<!-- 	<view class="filterBox">
+						<view class="tabList">
+							<view class="item1" style="padding-left: 40rpx;padding-right: 40rpx;"
+								v-for="(item,index) in viewList" :class="[currTabIndex1==index?'tabActive':'']"
+								@click="currTabIndex1=index">
+								{{item}}
+							</view>
+						</view>
+					</view> -->
+
+					<view class="filterConList">
+						<view class="item" v-for="(item,index) in roleList" @click="handleRoleSel(item,index)">
+							<image :class="[currTabIndexModal==index?'sel':'']" :src="item.url" mode="">
+							</image>
+							<view class="name" :class="[currTabIndexModal==index?'selTxt':'']">
+								{{item.name}}
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+
+		<!-- 背景 -->
+		<u-popup :show="show4" @close="close" @open="open">
+			<view class="contentBox2">
+				<view class="toolBar">
+					<view class="cancel" @click="show4=false">
+						<image src="/static/images/closeBtn.png" mode=""></image>
+					</view>
+					<view class="center">
+						背景
+					</view>
+					<view class="confirm" @click="handleBtnConfirm3">
+						<image src="/static/images/selected.png" mode=""></image>
+					</view>
+				</view>
+				<view class="content">
+					<!-- 	<view class="filterBox">
+						<view class="tabList">
+							<view class="item1" style="padding-left: 40rpx;padding-right: 40rpx;"
+								v-for="(item,index) in bgList" :class="[currTabIndex2==index?'tabActive':'']"
+								@click="currTabIndex2=index">
+								{{item}}
+							</view>
+						</view>
+					</view> -->
+
+					<view class="filterConList2" style="max-height: 500rpx;min-height: 500rpx;overflow-y: scroll;">
+						<view class="pictureBox" v-if="currTabIndex2==0">
+							<image :class="[currTabIndexBg==index?'sel':'']" :src="item.url" mode=""
+								v-for="(item,index) in bgPicList" @click="handleSelBg(item,index)"></image>
+						</view>
+						<view class="pictureBox" v-if="currTabIndex2==1">
+							<view class="color" :style="{background:item}" :class="[currTabIndexBgc==index?'sel':'']"
+								v-for="(item,index) in bgColorList" @click="currTabIndexBgc=index"></view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+
+		<!-- 声音筛选弹框 -->
+		<u-popup :show="show2" @close="close" @open="open">
+			<view class="contentBox">
+				<view class="toolBar2">
+					<view class="closeBtn" @click="show2=false">
+						<!-- <image src="/static/images/selected.png" mode=""></image> -->
+						X
+					</view>
+				</view>
+				<view class="content">
+					<!-- 场景 -->
+					<view class="scenList">
+						<view class="item " v-for="(item, index) in scenList"
+							:class="[currScenIndex==index?'active':'']" @click="currScenIndex=index">
+							{{item}}
+						</view>
+					</view>
+					<!-- 性别-->
+					<view class="sexList">
+						<view class="item " v-for="(item, index) in sexList" :class="[currSexIndex==index?'active':'']"
+							@click="currSexIndex=index">
+							{{item}}
+						</view>
+					</view>
+					<!-- 年龄-->
+					<view class="ageList">
+						<view class="item " v-for="(item, index) in ageList" :class="[currAgeIndex==index?'active':'']"
+							@click="currAgeIndex=index">
+							{{item}}
+						</view>
+					</view>
+
+					<view class="filterBtn2" @click="filter">
+						确认
+					</view>
+				</view>
+			</view>
+		</u-popup>
+
+		<!-- 备用-视频尺寸 -->
+		<u-popup :show="show5" @close="close" @open="open">
+			<view class="contentBox">
+				<!-- 	<view class="toolBar2">
+					<view class="closeBtn" @click="show5=false">
+						X
+					</view>
+				</view> -->
+				<view class="toolBar toolBar2">
+					<view class="cancel">
+					</view>
+					<view class="center">
+						视频尺寸
+					</view>
+					<view class="confirm" @click="handleBtnConfirm2">
+						<!-- <image src="/static/images/selected.png" mode=""></image> -->
+						<view class="closeBtn" @click="show5=false">
+							X
+						</view>
+					</view>
+				</view>
+				<view class="content">
+					<view class="videoRatioBox">
+						<view class="item">
+							<view class="top">
+								竖版视频
+							</view>
+							<view class="bottom">
+								9:16
+							</view>
+						</view>
+						<view class="item">
+							<view class="top">
+								横版视频
+							</view>
+							<view class="bottom">
+								16:9
+							</view>
+						</view>
+					</view>
+					<view class="filterBtn2" @click="show5=false">
+						确认
+					</view>
+				</view>
+			</view>
+		</u-popup>
+
+		<!-- <wike-tabbar :onTabbar="true" :isShowAnimate="true"></wike-tabbar> -->
+	</view>
+	</view>
+</template>
+
+<script>
+	import {
+		generateWork,
+		roleList,
+		voiceList,
+		backList
+	} from '@/api/robot/index.js'
+	import indexVue from './index.vue';
+	export default {
+		data() {
+			return {
+				show5: false,
+
+				show4: false,
+				bgList: ['图片', '颜色'],
+				currTabIndex2: 0,
+				currTabIndexBg: -1,
+				currTabIndexBgc: -1,
+				bgPicList: [],
+				bgColorList: ['red', 'green', 'blue', 'orange', 'green', 'blue', 'orange'],
+
+				show3: false,
+				viewList: ['2D', '3D'],
+				currTabIndex1: 0,
+				currTabIndexModal: -1,
+				modalList: [{
+						img: '',
+						name: '模型名称'
+					},
+					{
+						img: '',
+						name: '模型名称'
+					},
+					{
+						img: '',
+						name: '模型名称'
+					},
+					{
+						img: '',
+						name: '模型名称'
+					},
+					{
+						img: '',
+						name: '模型名称'
+					},
+					{
+						img: '',
+						name: '模型名称'
+					},
+					{
+						img: '',
+						name: '模型名称'
+					},
+				],
+
+				show2: false,
+				currTabIndexAll: -1,
+
+				scenList: ['全部场景', '热门', '新闻咨询', '影视咨询', '热门', '新闻咨询', '影视咨询'],
+				currScenIndex: 0,
+
+				sexList: ['全部性别', '男声', '女声'],
+				currSexIndex: 0,
+
+				ageList: ['全部年龄', '儿童', '少年', '青年', '中年', '老年'],
+				currAgeIndex: 0,
+
+				allList: [],
+				// voiceList: ['全部', '热门', '新闻咨询', '影视综艺', '其他'],
+				show1: false,
+				currTabIndex: 0,
+
+				robotName: '',
+				textAreaValue: '',
+				voiceRate: 1,
+				selRoleId: -1,
+				selVoiceId: -1,
+				selBgId: -1,
+				selBgPic: '',
+
+				roleList: [],
+
+				value: 1,
+				show: false,
+				menuList: [{
+						icon: '',
+						name: '全局语速'
+					},
+					{
+						icon: '',
+						name: '声音'
+					},
+					{
+						icon: '',
+						name: '角色'
+					},
+					{
+						icon: '',
+						name: '背景'
+					},
+				],
+				videoSrc: '',
+				showMoreMenu: false,
+				columns: [
+					[]
+				],
+				selVoiceItem: {
+					name: '',
+					url: ''
+				},
+				selRoleItem: {
+					name: '',
+					url: ''
+				},
+
+				detail: {},
+
+				roundRate: 1,
+				isGenerate: false
+			};
+		},
+		computed: {
+
+		},
+
+		onReady() {
+
+		},
+		onUnload() {
+
+		},
+		onLoad() {
+			this.detail = getApp().draftDetail
+
+			this.robotName = getApp().draftDetail.name
+			this.textAreaValue = getApp().draftDetail.content
+			this.selRoleId = getApp().draftDetail.role - 1
+			this.selBgId = getApp().draftDetail.back - 1
+			this.selVoiceId = getApp().draftDetail.audio - 1
+			this.voiceRate = getApp().draftDetail.stage
+
+			this.selBgPic = getApp().draftDetail.backs.url
+			this.roundRate = getApp().draftDetail.stage
+			this.selVoiceItem = getApp().draftDetail.audios
+			this.selRoleItem = getApp().draftDetail.roles
+
+			console.log('传过来的草稿项:', this.detail);
+		},
+		async onShow() {
+			let res = await roleList({})
+			if (res.code == 0) {
+				// this.roleList = res.data
+				this.roleList = res.msg
+				console.log('数字人角色列表返回值:', res);
+				this.currTabIndexModal = res.msg.findIndex((item, index) => {
+					return item.id == this.selRoleId + 1
+				})
+			} else {
+				uni.showToast({
+					title: res.msg,
+					icon: 'none'
+				})
+			}
+
+			let res1 = await voiceList({})
+			if (res1.code == 0) {
+				// this.roleList = res.data
+				this.allList = res1.msg
+				console.log('数字人声音列表返回值:', res1);
+				this.currTabIndexAll = res1.msg.findIndex((item, index) => {
+					return item.id == this.selVoiceId + 1
+				})
+
+			} else {
+				uni.showToast({
+					title: res1.msg,
+					icon: 'none'
+				})
+			}
+
+			let res3 = await backList({})
+			if (res3.code == 0) {
+				// this.roleList = res.data
+				this.bgPicList = res3.msg
+				console.log('数字人背景列表返回值:', res3);
+				this.currTabIndexBg = res3.msg.findIndex((item, index) => {
+					return item.id == this.selBgId + 1
+				})
+				console.log('index3', this.currTabIndexBgc);
+			} else {
+				uni.showToast({
+					title: res3.msg,
+					icon: 'none'
+				})
+			}
+		},
+		onShareAppMessage: function(res) {
+
+		},
+
+		methods: {
+			handleSelBg(item, index) {
+				this.selBgPic = item.url
+				this.selBgId = item.id - 1
+				this.currTabIndexBg = index
+			},
+			handleVoiceSel(item, index) {
+				this.selVoiceItem = item
+				this.selVoiceId = item.id - 1
+				this.currTabIndexAll = index
+			},
+			handleRoleSel(item, index) {
+				this.selRoleItem = item
+				this.selRoleId = item.id - 1
+				this.currTabIndexModal = index
+			},
+			async saveDraft() {
+				let parmas = {
+					name: this.robotName,
+					content: this.textAreaValue,
+					role: this.selRoleId,
+					back: this.selBgId,
+					audio: this.selVoiceId,
+					stage: this.roundRate,
+					is_draft: 1
+				}
+				console.log('保存数字人草稿参数:', parmas);
+				let res = await generateWork(parmas)
+				if (res.code == 0) {
+					uni.showToast({
+						title: '保存成功!',
+						icon: 'success'
+					})
+					setTimeout(() => {
+						uni.navigateBack()
+					}, 1500)
+				}
+				console.log('保存数字人草稿返回值:', res);
+			},
+			async genRobot() {
+
+				if (this.isGenerate) {
+					uni.showToast({
+						title: '请等待上一次生成完成后提交!',
+						icon: 'none'
+					})
+					return
+				}
+
+
+				let parmas = {
+					name: this.robotName,
+					content: this.textAreaValue,
+					role: this.selRoleId,
+					back: this.selBgId,
+					audio: this.selVoiceId,
+					stage: this.roundRate
+				}
+				console.log('创建数字人参数:', parmas);
+				// return
+				let res = await generateWork(parmas)
+				if (res.code == 0) {
+					this.isGenerate = true
+					uni.showToast({
+						title: '创建数字人成功!',
+						icon: 'success'
+					})
+					setTimeout(() => {
+						uni.navigateBack()
+					}, 1500)
+				}
+				console.log('生成数字人返回值:', res);
+			},
+
+			filter() {
+				this.show2 = false
+			},
+			handleFilter() {
+				// this.show1 = false
+				this.show2 = true
+			},
+			handleBtnConfirm1() {
+				this.show1 = false
+			},
+			handleBtnConfirm2() {
+				this.show3 = false
+			},
+			handleBtnConfirm3() {
+				this.show4 = false
+			},
+
+			handleSetBox(item) {
+				if (item.name == '全局语速') {
+					this.show = true
+				} else if (item.name == '声音') {
+					this.show1 = true
+				} else if (item.name == '角色') {
+					this.show3 = true
+				} else if (item.name == '背景') {
+					this.show4 = true
+				}
+			},
+			handleChange(e) {
+				console.log(e);
+				this.roundRate = e.toFixed(1)
+			},
+
+			handleBtnConfirm() {
+				this.show = false
+			},
+
+			handleCreatePro() {
+				uni.navigateTo({
+					url: ''
+				})
+			},
+			handleShowMoreMenu() {
+				this.showMoreMenu = true
+			},
+			handleConfirm(e) {
+				this.showMoreMenu = false
+			},
+			close() {
+				// console.log('close()');
+			},
+			open() {
+				// console.log('open() ');
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import './index.scss';
+</style>

+ 174 - 0
pages/robot/index.scss

xqd
@@ -0,0 +1,174 @@
+page {
+		// background: #f2f2f2;
+	}
+	.pos{
+		height: 45px;
+	}
+
+	view {
+		box-sizing: border-box;
+	}
+	.container{
+		padding-bottom:85rpx;
+		.context{
+			padding: 40rpx;
+		}
+		.createPro{
+			border-radius: 15rpx;
+			height: 306rpx;
+			background: #999;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			.centerAdd{
+				display: flex;
+				align-items: center;
+				flex-direction: column;
+				justify-content: center;
+				.addIcon{
+					width: 72rpx;
+					height: 72rpx;	
+					
+					text{
+						font-size: 72rpx;
+					}
+					image{
+						width: 100%;
+						height: 100%;
+					}
+				}
+				.addTxt{
+					margin-top: 20rpx;
+					// color:#26b3a0 ;
+					font-weight: 600;
+				}
+			}
+		}
+			.draft{
+				margin-top: 30rpx;
+				.draftLabel{
+					font-weight: 600;
+					margin-bottom: 30rpx;
+				}
+				.draftList{
+					display: flex;
+					flex-wrap: wrap;
+					.itemBox{
+						width: 50%;
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+						margin-bottom: 30rpx;
+						.top{
+							width: 320rpx;
+							min-height: 470rpx;
+							background: #ccc;
+							border-radius: 15rpx;
+							position: relative;
+							image{
+								width: 100%;
+								// height: auto;
+								border-radius: 15rpx;
+							}
+							
+							.preloader_1 {
+								position: absolute;
+								// right: 8%;
+								// bottom: 12%;
+								// position: fixed;
+								// right: 58%;
+								margin-right: 65px;
+								top:50%;
+								left: 30%;
+								transform: translateX(-50%);
+								background: #ccc;
+							}
+							
+							.preloader_1 view {
+								display: block;
+								bottom: 0px;
+								width: 9px;
+								height: 5px;
+								background: #9b59b6;
+								position: absolute;
+								animation: preloader_1 1.5s infinite ease-in-out;
+							}
+							
+							.preloader_1 view:nth-child(2) {
+								left: 11px;
+								animation-delay: .2s;
+							}
+							
+							.preloader_1 view:nth-child(3) {
+								left: 22px;
+								animation-delay: .4s;
+							}
+							
+							.preloader_1 view:nth-child(4) {
+								left: 33px;
+								animation-delay: .6s;
+							}
+							
+							.preloader_1 view:nth-child(5) {
+								left: 44px;
+								animation-delay: .8s;
+							}
+							
+							@keyframes preloader_1 {
+								0% {
+									height: 5px;
+									transform: translateY(0px);
+									background: #9b59b6;
+								}
+							
+								25% {
+									height: 30px;
+									transform: translateY(15px);
+									background: #3498db;
+								}
+							
+								50% {
+									height: 5px;
+									transform: translateY(0px);
+									background: #9b59b6;
+								}
+							
+								100% {
+									height: 5px;
+									transform: translateY(0px);
+									background: #9b59b6;
+								}
+							}
+						}
+						.bottom{
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							margin-top: 15rpx;
+							width: 320rpx;
+							padding-right: 25rpx;
+							.left{
+								
+							}
+							.delIcon{
+								width: 32rpx;
+								height: 32rpx;
+								image{
+									width: 100%;
+									height: 100%;
+								}
+							}
+						}
+					}
+				}
+			}
+	}
+
+	.tipBox{
+		// position: relative;
+		.tip{
+			position: absolute;
+			bottom: 25%;
+			left: 30%;
+		}
+	}

+ 343 - 0
pages/robot/index.vue

xqd
@@ -0,0 +1,343 @@
+<template>
+	<view class="container">
+		<!-- <tn-nav-bar :isBack="false" backgroundColor="#fff" :bottomShadow="false">数字人</tn-nav-bar> -->
+		<!-- <view class="pos">
+		</view> -->
+		<view class="context">
+			<view class="createPro" @click="handleCreatePro">
+				<view class="centerAdd">
+					<view class="addIcon">
+						<!-- <image src="/static/images/buy.png" mode=""></image> -->
+						<text class="iconfont icon-chuangjian" style="color: white;"></text>
+					</view>
+
+					<view class="addTxt">
+						创建项目
+					</view>
+				</view>
+			</view>
+			<view class="draft">
+				<view class="draftLabel">
+					草稿
+				</view>
+				<view class="draftList">
+					<view class="itemBox" v-for="(item,index) in draftList" @click="toCreateDetail(item)">
+						<view class="top">
+							<image src="/static/images/head.jpg" mode=""></image>
+						</view>
+						<view class="bottom">
+							<view class="left">
+								{{item.name}}
+							</view>
+							<view class="delIcon" @click.stop="delDraft(item,index)">
+								<!-- <image src="/static/images/head.jpg" mode=""></image> -->
+								<text class="iconfont icon-shanchu" style="font-size: 32rpx;"></text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<view class="draft">
+				<view class="draftLabel">
+					数字人作品
+				</view>
+				<view class="draftList">
+					<view class="itemBox" v-for="(item,index) in workList" @click="goWorkDetail(item)">
+						<view class="top">
+							<image :src="item.cover" mode="" v-if="item.state"></image>
+
+							<view class="tipBox" v-else>
+								<view class="preloader_1">
+									<view></view>
+									<view></view>
+									<view></view>
+									<view></view>
+									<view></view>
+								</view>
+								<view class="tip" style="color:#26b3a0">
+									生成中...
+								</view>
+							</view>
+
+						</view>
+						<view class="bottom">
+							<view class="left">
+								{{item.name}}
+							</view>
+							<!-- <view class="left">
+								{{item.state==1?"已生成":'生成中'}}
+							</view> -->
+							<view class="delIcon" @click.stop="handleShowMoreMenu(item,index)">
+								<!-- <image src="/static/images/head.jpg" mode=""></image> -->
+								<text class="iconfont icon-gengduo-shuxiang" style="font-size: 32rpx;"></text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+
+
+			<!-- <button @click="test">测试网络请求</button> -->
+
+
+			<u-picker :showIcon="true" :show="showMoreMenu" :columns="columns" title="更多" confirmColor=""
+				@cancel="showMoreMenu=false" @confirm="handleConfirm"></u-picker>
+
+			<wike-tabbar :onTabbar="true" :isShowAnimate="true"></wike-tabbar>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		workList,
+		delWork,
+		draftList
+	} from '@/api/robot/index.js'
+	import {
+		downLoad3
+	} from '@/utils/download3.js'
+	export default {
+		data() {
+			return {
+				showMoreMenu: false,
+				columns: [
+					['删除', '下载视频', '复制链接']
+				],
+				draftList: [],
+				workList: [],
+
+				delItem: {},
+				delIndex: -1,
+
+				is_wx: false
+			};
+		},
+		computed: {
+
+		},
+
+		onReady() {
+
+		},
+		onUnload() {
+
+		},
+		onLoad() {
+
+		},
+		onShow() {
+			// console.log('1213', download);
+			this.getIndexData()
+			this.is_wx = this.is_weixin()
+			console.log('this.is_wx', this.is_wx);
+		},
+		onShareAppMessage: function(res) {
+
+		},
+		async onPullDownRefresh() {
+			this.getIndexData()
+		},
+		methods: {
+			toCreateDetail(item) {
+				getApp().draftDetail = item
+				uni.navigateTo({
+					url: '/pages/robot/generate/index'
+				})
+			},
+			async delDraft(item, index) {
+				let res = await delWork({
+					id: item.id
+				})
+				if (res.code == 0) {
+					this.draftList.splice(index, 1)
+
+					console.log('删除数字人草稿返回值:', res);
+					uni.showToast({
+						title: '数字人:' + item.name + '草稿删除成功!',
+						icon: 'success'
+					})
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+			},
+			downLoad(url) {
+				uni.downloadFile({
+					url: url,
+					header: {
+						// 'Authorization':this.$utils.localData.getToken(), 
+					},
+					success: (res) => {
+						if (res.statusCode === 200) {
+							console.log('res.tempFilePath', res.tempFilePath);
+							return
+							//res.tempFilePath; //此参数为本地的缓存地址
+							var link = document.createElement('a');
+							link.href = url; //url 为获取的本地缓存地址或者直接是url地址
+							link.download = name + '.file'; //name为自定义的文件名称  .file为文件后缀名
+							document.body.appendChild(link)
+							link.click()
+							//移除
+							setTimeout(() => document.body.removeChild(link), 1000)
+
+						}
+					},
+					fail: (e) => {
+						uni.showToast({
+							title: '数据处理错误,请刷新重试',
+							icon: 'none',
+							duration: 2000
+						});
+					}
+				})
+			},
+			downLoad2(url) {
+				var link = document.createElement('a');
+				link.href = url; //url 为获取的本地缓存地址或者直接是url地址
+				link.download = '数字人视频' + '.mp4'; //name为自定义的文件名称  .file为文件后缀名
+				document.body.appendChild(link)
+				link.click()
+				//移除
+				setTimeout(() => document.body.removeChild(link), 1000)
+			},
+			// 判断是否是微信浏览器 
+			is_weixin() {
+				var ua = window.navigator.userAgent.toLowerCase();
+				if (ua.match(/MicroMessenger/i) == 'micromessenger') {
+					console.log('微信浏览器');
+					return true;
+				} else {
+					console.log("不是微信浏览器");
+					return false;
+				}
+			},
+			async getIndexData() {
+				let res = await workList({})
+				if (res.code == 0) {
+					uni.stopPullDownRefresh()
+					this.workList = res.data
+					console.log('数字人作品列表返回值:', res);
+				} else {
+					uni.showToast({
+						title: res.msg,
+						icon: 'none'
+					})
+				}
+
+				let res1 = await draftList({})
+				if (res1.code == 0) {
+					uni.stopPullDownRefresh()
+					this.draftList = res1.data
+					console.log('数字人草稿列表返回值:', res1);
+				} else {
+					uni.showToast({
+						title: res1.msg,
+						icon: 'none'
+					})
+				}
+			},
+			goWorkDetail(item) {
+				if (item.state == 0) {
+					uni.showToast({
+						title: '数字人正在生成中,请稍后查看',
+						icon: 'none'
+					})
+					return
+				}
+				getApp().url = item.url
+				uni.navigateTo({
+					url: '/pages/robot/workDetail/index'
+				})
+			},
+			handleCreatePro() {
+				uni.navigateTo({
+					url: '/pages/robot/generate/index'
+				})
+			},
+			handleShowMoreMenu(item, index) {
+				this.delIndex = index
+				this.delItem = item
+				this.showMoreMenu = true
+			},
+			async handleConfirm(e) {
+				this.showMoreMenu = false
+				if (e.value[0] == '删除') {
+					let res = await delWork({
+						id: this.delItem.id
+					})
+					if (res.code == 0) {
+						this.workList.splice(this.delIndex, 1)
+
+						console.log('删除数字人返回值:', res);
+						uni.showToast({
+							title: '数字人:' + this.delItem.name + '删除成功!',
+							icon: 'success'
+						})
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+					}
+
+				} else if (e.value[0] == '复制链接') {
+					uni.setClipboardData({
+						data: this.delItem.url,
+						success: function() {
+							uni.showToast({
+								title: '链接复制成功!',
+								duration: 1500
+							});
+						}
+					});
+				} else if (e.value[0] == '下载视频') {
+					const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i
+						.test(
+							navigator.userAgent) ? false : true;
+					if (this.is_wx) {
+						// 微信内置浏览器
+						// this.downLoad2(this.delItem.url)
+						let _that = this
+						uni.showModal({
+							title: '温馨提示',
+							content: '微信内置浏览器不支持视频文件下载,请复制视频链接至手机浏览器打开',
+							confirmText: '复制',
+							confirmColor: '#26B3A0',
+							success: function(res) {
+								if (res.confirm) {
+									uni.setClipboardData({
+										data: _that.delItem.url,
+										success: function() {
+											uni.showToast({
+												title: "复制成功",
+												icon: 'success',
+											})
+										}
+									});
+								} else if (res.cancel) {}
+							}
+						})
+						return
+					} else {
+						if (detectDeviceType()) {
+							// PC端
+							downLoad3(this.delItem.url, '数字人' + this.delItem.name + '视频', 'video/mp4')
+						} else {
+							// 其他移动端浏览器
+							window.open(this.delItem.url)
+						}
+					}
+				}
+
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import './index.scss';
+</style>

+ 27 - 0
pages/robot/workDetail/index.scss

xqd
@@ -0,0 +1,27 @@
+page {
+		// background: #f2f2f2;
+	}
+	.pos{
+		height: 45px;
+	}
+
+	view {
+		box-sizing: border-box;
+	}
+	.container{
+		// padding-bottom:85rpx;
+		width: 100%;
+		height: 100%;
+		.context{
+			padding: 40rpx;
+			width: 100%;
+			height: 100%;
+			video{
+				width: 100%;
+				height:calc(100vh - 200rpx);
+			}
+		}
+	}
+	
+
+	

+ 62 - 0
pages/robot/workDetail/index.vue

xqd
@@ -0,0 +1,62 @@
+<template>
+	<view class="container">
+		<tn-nav-bar :isBack="true" backgroundColor="#fff" :bottomShadow="false">数字人预览</tn-nav-bar>
+		<view class="pos">
+		</view>
+		<view class="context">
+			<video autoplay :src="url"></video>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		workList
+	} from '@/api/robot/index.js'
+	export default {
+		data() {
+			return {
+				url: ''
+			};
+		},
+		computed: {
+
+		},
+
+		onReady() {
+
+		},
+		onUnload() {
+
+		},
+		onLoad(o) {
+			this.url = getApp().url
+			console.log('数字人详情页url:', getApp().url);
+		},
+		onShow() {
+
+		},
+		onShareAppMessage: function(res) {
+
+		},
+
+		methods: {
+
+			handleCreatePro() {
+				uni.navigateTo({
+					url: '/pages/robot/generate/index'
+				})
+			},
+			handleShowMoreMenu() {
+				this.showMoreMenu = true
+			},
+			handleConfirm(e) {
+				this.showMoreMenu = false
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import './index.scss';
+</style>

+ 31 - 0
static/fonts/iconfont.css

xqd
@@ -0,0 +1,31 @@
+@font-face {
+	font-family: "iconfont";
+	/* Project id 4174490 */
+	src: url('@/static/fonts/iconfont.woff2?t=1689754571387') format('woff2'),
+		url('@/static/fonts/iconfont.woff?t=1689754571387') format('woff'),
+		url('@/static/fonts/iconfont.ttf?t=1689754571387') format('truetype');
+}
+
+.iconfont {
+	font-family: "iconfont" !important;
+	font-size: 16px;
+	font-style: normal;
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+
+.icon-shaixuanguolv:before {
+	content: "\e8d7";
+}
+
+.icon-shanchu:before {
+	content: "\e621";
+}
+
+.icon-gengduo-shuxiang:before {
+	content: "\e8c4";
+}
+
+.icon-chuangjian:before {
+	content: "\e636";
+}

BIN
static/fonts/iconfont.ttf


BIN
static/fonts/iconfont.woff


BIN
static/fonts/iconfont.woff2


BIN
static/images/closeBtn.png


BIN
static/images/selected.png


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

xqd
@@ -0,0 +1,97 @@
+## 1.1.9(2023-04-11)
+- 修复 vue3 下 keyboardheightchange 事件报错的bug
+## 1.1.8(2023-03-29)
+- 优化 trim 属性默认值
+## 1.1.7(2023-03-29)
+- 新增 cursor-spacing 属性
+## 1.1.6(2023-01-28)
+- 新增 keyboardheightchange 事件,可监听键盘高度变化
+## 1.1.5(2022-11-29)
+- 优化 主题样式
+## 1.1.4(2022-10-27)
+- 修复 props 中背景颜色无默认值的bug
+## 1.1.0(2022-06-30)
+
+- 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容
+- 新增 clear 事件,点击右侧叉号图标触发
+- 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发
+- 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等
+
+## 1.0.5(2022-06-07)
+
+- 优化 clearable 显示策略
+
+## 1.0.4(2022-06-07)
+
+- 优化 clearable 显示策略
+
+## 1.0.3(2022-05-20)
+
+- 修复 关闭图标某些情况下无法取消的 bug
+
+## 1.0.2(2022-04-12)
+
+- 修复 默认值不生效的 bug
+
+## 1.0.1(2022-04-02)
+
+- 修复 value 不能为 0 的 bug
+
+## 1.0.0(2021-11-19)
+
+- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+
+## 0.1.4(2021-08-20)
+
+- 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug
+
+## 0.1.3(2021-08-11)
+
+- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
+
+## 0.1.2(2021-07-30)
+
+- 优化 vue3 下事件警告的问题
+
+## 0.1.1
+
+- 优化 errorMessage 属性支持 Boolean 类型
+
+## 0.1.0(2021-07-13)
+
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+
+## 0.0.16(2021-06-29)
+
+- 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug
+
+## 0.0.15(2021-06-21)
+
+- 修复 passwordIcon 属性拼写错误的 bug
+
+## 0.0.14(2021-06-18)
+
+- 新增 passwordIcon 属性,当 type=password 时是否显示小眼睛图标
+- 修复 confirmType 属性不生效的问题
+
+## 0.0.13(2021-06-04)
+
+- 修复 disabled 状态可清出内容的 bug
+
+## 0.0.12(2021-05-12)
+
+- 新增 组件示例地址
+
+## 0.0.11(2021-05-07)
+
+- 修复 input-border 属性不生效的问题
+
+## 0.0.10(2021-04-30)
+
+- 修复 ios 遮挡文字、显示一半的问题
+
+## 0.0.9(2021-02-05)
+
+- 调整为 uni_modules 目录规范
+- 优化 兼容 nvue 页面

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

xqd
@@ -0,0 +1,56 @@
+/**
+ * @desc 函数防抖
+ * @param func 目标函数
+ * @param wait 延迟执行毫秒数
+ * @param immediate true - 立即执行, false - 延迟执行
+ */
+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);
+		if (immediate) {
+			let callNow = !timer;
+			timer = setTimeout(() => {
+				timer = null;
+			}, wait);
+			if (callNow) func.apply(context, args);
+		} else {
+			timer = setTimeout(() => {
+				func.apply(context, args);
+			}, wait)
+		}
+	}
+}
+/**
+ * @desc 函数节流
+ * @param func 函数
+ * @param wait 延迟执行毫秒数
+ * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发
+ */
+export const throttle = (func, wait = 1000, type = 1) => {
+	let previous = 0;
+	let timeout;
+	return function() {
+		let context = this;
+		let args = arguments;
+		if (type === 1) {
+			let now = Date.now();
+
+			if (now - previous > wait) {
+				func.apply(context, args);
+				previous = now;
+			}
+		} else if (type === 2) {
+			if (!timeout) {
+				timeout = setTimeout(() => {
+					timeout = null;
+					func.apply(context, args)
+				}, wait)
+			}
+		}
+	}
+}

+ 657 - 0
uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue

xqd
@@ -0,0 +1,657 @@
+<template>
+	<view class="uni-easyinput" :class="{ 'uni-easyinput-error': msg }" :style="boxStyle">
+		<view class="uni-easyinput__content" :class="inputContentClass" :style="inputContentStyle">
+			<uni-icons v-if="prefixIcon" class="content-clear-icon" :type="prefixIcon" color="#c0c4cc" @click="onClickIcon('prefix')" size="22"></uni-icons>
+			<textarea
+				v-if="type === 'textarea'"
+				class="uni-easyinput__content-textarea"
+				:class="{ 'input-padding': inputBorder }"
+				:name="name"
+				:value="val"
+				:placeholder="placeholder"
+				:placeholderStyle="placeholderStyle"
+				:disabled="disabled"
+				placeholder-class="uni-easyinput__placeholder-class"
+				:maxlength="inputMaxlength"
+				:focus="focused"
+				:autoHeight="autoHeight"
+				:cursor-spacing="cursorSpacing"
+				@input="onInput"
+				@blur="_Blur"
+				@focus="_Focus"
+				@confirm="onConfirm"
+        @keyboardheightchange="onkeyboardheightchange"
+			></textarea>
+			<input
+				v-else
+				:type="type === 'password' ? 'text' : type"
+				class="uni-easyinput__content-input"
+				:style="inputStyle"
+				:name="name"
+				:value="val"
+				:password="!showPassword && type === 'password'"
+				:placeholder="placeholder"
+				:placeholderStyle="placeholderStyle"
+				placeholder-class="uni-easyinput__placeholder-class"
+				:disabled="disabled"
+				:maxlength="inputMaxlength"
+				:focus="focused"
+				:confirmType="confirmType"
+				:cursor-spacing="cursorSpacing"
+				@focus="_Focus"
+				@blur="_Blur"
+				@input="onInput"
+				@confirm="onConfirm"
+        @keyboardheightchange="onkeyboardheightchange"
+			/>
+			<template v-if="type === 'password' && passwordIcon">
+				<!-- 开启密码时显示小眼睛 -->
+				<uni-icons
+					v-if="isVal"
+					class="content-clear-icon"
+					:class="{ 'is-textarea-icon': type === 'textarea' }"
+					:type="showPassword ? 'eye-slash-filled' : 'eye-filled'"
+					:size="22"
+					:color="focusShow ? primaryColor : '#c0c4cc'"
+					@click="onEyes"
+				></uni-icons>
+			</template>
+			<template v-else-if="suffixIcon">
+				<uni-icons v-if="suffixIcon" class="content-clear-icon" :type="suffixIcon" color="#c0c4cc" @click="onClickIcon('suffix')" size="22"></uni-icons>
+			</template>
+			<template v-else>
+				<uni-icons
+					v-if="clearable && isVal && !disabled && type !== 'textarea'"
+					class="content-clear-icon"
+					:class="{ 'is-textarea-icon': type === 'textarea' }"
+					type="clear"
+					:size="clearSize"
+					:color="msg ? '#dd524d' : focusShow ? primaryColor : '#c0c4cc'"
+					@click="onClear"
+				></uni-icons>
+			</template>
+			<slot name="right"></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * Easyinput 输入框
+ * @description 此组件可以实现表单的输入与校验,包括 "text" 和 "textarea" 类型。
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=3455
+ * @property {String}	value	输入内容
+ * @property {String }	type	输入框的类型(默认text) password/text/textarea/..
+ * 	@value text			文本输入键盘
+ * 	@value textarea	多行文本输入键盘
+ * 	@value password	密码输入键盘
+ * 	@value number		数字输入键盘,注意iOS上app-vue弹出的数字键盘并非9宫格方式
+ * 	@value idcard		身份证输入键盘,信、支付宝、百度、QQ小程序
+ * 	@value digit		带小数点的数字键盘	,App的nvue页面、微信、支付宝、百度、头条、QQ小程序支持
+ * @property {Boolean}	clearable	是否显示右侧清空内容的图标控件,点击可清空输入框内容(默认true)
+ * @property {Boolean}	autoHeight	是否自动增高输入区域,type为textarea时有效(默认true)
+ * @property {String }	placeholder	输入框的提示文字
+ * @property {String }	placeholderStyle	placeholder的样式(内联样式,字符串),如"color: #ddd"
+ * @property {Boolean}	focus	是否自动获得焦点(默认false)
+ * @property {Boolean}	disabled	是否禁用(默认false)
+ * @property {Number }	maxlength	最大输入长度,设置为 -1 的时候不限制最大长度(默认140)
+ * @property {String }	confirmType	设置键盘右下角按钮的文字,仅在type="text"时生效(默认done)
+ * @property {Number }	clearSize	清除图标的大小,单位px(默认15)
+ * @property {String}	prefixIcon	输入框头部图标
+ * @property {String}	suffixIcon	输入框尾部图标
+ * @property {String}	primaryColor	设置主题色(默认#2979ff)
+ * @property {Boolean}	trim	是否自动去除两端的空格
+ * @property {Boolean}	cursorSpacing	指定光标与键盘的距离,单位 px
+ * @value both	去除两端空格
+ * @value left	去除左侧空格
+ * @value right	去除右侧空格
+ * @value start	去除左侧空格
+ * @value end		去除右侧空格
+ * @value all		去除全部空格
+ * @value none	不去除空格
+ * @property {Boolean}	inputBorder	是否显示input输入框的边框(默认true)
+ * @property {Boolean}	passwordIcon	type=password时是否显示小眼睛图标
+ * @property {Object}	styles	自定义颜色
+ * @event {Function}	input	输入框内容发生变化时触发
+ * @event {Function}	focus	输入框获得焦点时触发
+ * @event {Function}	blur	输入框失去焦点时触发
+ * @event {Function}	confirm	点击完成按钮时触发
+ * @event {Function}	iconClick	点击图标时触发
+ * @example <uni-easyinput v-model="mobile"></uni-easyinput>
+ */
+function obj2strClass(obj) {
+	let classess = '';
+	for (let key in obj) {
+		const val = obj[key];
+		if (val) {
+			classess += `${key} `;
+		}
+	}
+	return classess;
+}
+
+function obj2strStyle(obj) {
+	let style = '';
+	for (let key in obj) {
+		const val = obj[key];
+		style += `${key}:${val};`;
+	}
+	return style;
+}
+export default {
+	name: 'uni-easyinput',
+	emits: ['click', 'iconClick', 'update:modelValue', 'input', 'focus', 'blur', 'confirm', 'clear', 'eyes', 'change', 'keyboardheightchange'],
+	model: {
+		prop: 'modelValue',
+		event: 'update:modelValue'
+	},
+	options: {
+		virtualHost: true
+	},
+	inject: {
+		form: {
+			from: 'uniForm',
+			default: null
+		},
+		formItem: {
+			from: 'uniFormItem',
+			default: null
+		}
+	},
+	props: {
+		name: String,
+		value: [Number, String],
+		modelValue: [Number, String],
+		type: {
+			type: String,
+			default: 'text'
+		},
+		clearable: {
+			type: Boolean,
+			default: true
+		},
+		autoHeight: {
+			type: Boolean,
+			default: false
+		},
+		placeholder: {
+			type: String,
+			default: ' '
+		},
+		placeholderStyle: String,
+		focus: {
+			type: Boolean,
+			default: false
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		maxlength: {
+			type: [Number, String],
+			default: 140
+		},
+		confirmType: {
+			type: String,
+			default: 'done'
+		},
+		clearSize: {
+			type: [Number, String],
+			default: 24
+		},
+		inputBorder: {
+			type: Boolean,
+			default: true
+		},
+		prefixIcon: {
+			type: String,
+			default: ''
+		},
+		suffixIcon: {
+			type: String,
+			default: ''
+		},
+		trim: {
+			type: [Boolean, String],
+			default: false
+		},
+		cursorSpacing: {
+			type: Number,
+			default: 0
+		},
+		passwordIcon: {
+			type: Boolean,
+			default: true
+		},
+		primaryColor: {
+			type: String,
+			default: '#2979ff'
+		},
+		styles: {
+			type: Object,
+			default() {
+				return {
+					color: '#333',
+					backgroundColor: '#fff',
+					disableColor: '#F7F6F6',
+					borderColor: '#e5e5e5'
+				};
+			}
+		},
+		errorMessage: {
+			type: [String, Boolean],
+			default: ''
+		}
+	},
+	data() {
+		return {
+			focused: false,
+			val: '',
+			showMsg: '',
+			border: false,
+			isFirstBorder: false,
+			showClearIcon: false,
+			showPassword: false,
+			focusShow: false,
+			localMsg: '',
+			isEnter: false // 用于判断当前是否是使用回车操作
+		};
+	},
+	computed: {
+		// 输入框内是否有值
+		isVal() {
+			const val = this.val;
+			// fixed by mehaotian 处理值为0的情况,字符串0不在处理范围
+			if (val || val === 0) {
+				return true;
+			}
+			return false;
+		},
+
+		msg() {
+			// console.log('computed', this.form, this.formItem);
+			// if (this.form) {
+			// 	return this.errorMessage || this.formItem.errMsg;
+			// }
+			// TODO 处理头条 formItem 中 errMsg 不更新的问题
+			return this.localMsg || this.errorMessage;
+		},
+		// 因为uniapp的input组件的maxlength组件必须要数值,这里转为数值,用户可以传入字符串数值
+		inputMaxlength() {
+			return Number(this.maxlength);
+		},
+
+		// 处理外层样式的style
+		boxStyle() {
+			return `color:${this.inputBorder && this.msg ? '#e43d33' : this.styles.color};`;
+		},
+		// input 内容的类和样式处理
+		inputContentClass() {
+			return obj2strClass({
+				'is-input-border': this.inputBorder,
+				'is-input-error-border': this.inputBorder && this.msg,
+				'is-textarea': this.type === 'textarea',
+				'is-disabled': this.disabled,
+				'is-focused': this.focusShow
+			});
+		},
+		inputContentStyle() {
+			const focusColor = this.focusShow ? this.primaryColor : this.styles.borderColor;
+			const borderColor = this.inputBorder && this.msg ? '#dd524d' : focusColor;
+			return obj2strStyle({
+				'border-color': borderColor || '#e5e5e5',
+				'background-color': this.disabled ? this.styles.disableColor : this.styles.backgroundColor
+			});
+		},
+		// input右侧样式
+		inputStyle() {
+			const paddingRight = this.type === 'password' || this.clearable || this.prefixIcon ? '' : '10px';
+			return obj2strStyle({
+				'padding-right': paddingRight,
+				'padding-left': this.prefixIcon ? '' : '10px'
+			});
+		}
+	},
+	watch: {
+		value(newVal) {
+			this.val = newVal;
+		},
+		modelValue(newVal) {
+			this.val = newVal;
+		},
+		focus(newVal) {
+			this.$nextTick(() => {
+				this.focused = this.focus;
+				this.focusShow = this.focus;
+			});
+		}
+	},
+	created() {
+		this.init();
+		// TODO 处理头条vue3 computed 不监听 inject 更改的问题(formItem.errMsg)
+		if (this.form && this.formItem) {
+			this.$watch('formItem.errMsg', newVal => {
+				this.localMsg = newVal;
+			});
+		}
+	},
+	mounted() {
+		this.$nextTick(() => {
+			this.focused = this.focus;
+			this.focusShow = this.focus;
+		});
+	},
+	methods: {
+		/**
+		 * 初始化变量值
+		 */
+		init() {
+			if (this.value || this.value === 0) {
+				this.val = this.value;
+			} else if (this.modelValue || this.modelValue === 0 || this.modelValue === '') {
+				this.val = this.modelValue;
+			} else {
+				this.val = null;
+			}
+		},
+
+		/**
+		 * 点击图标时触发
+		 * @param {Object} type
+		 */
+		onClickIcon(type) {
+			this.$emit('iconClick', type);
+		},
+
+		/**
+		 * 显示隐藏内容,密码框时生效
+		 */
+		onEyes() {
+			this.showPassword = !this.showPassword;
+			this.$emit('eyes', this.showPassword);
+		},
+
+		/**
+		 * 输入时触发
+		 * @param {Object} event
+		 */
+		onInput(event) {
+			let value = event.detail.value;
+			// 判断是否去除空格
+			if (this.trim) {
+				if (typeof this.trim === 'boolean' && this.trim) {
+					value = this.trimStr(value);
+				}
+				if (typeof this.trim === 'string') {
+					value = this.trimStr(value, this.trim);
+				}
+			}
+			if (this.errMsg) this.errMsg = '';
+			this.val = value;
+			// TODO 兼容 vue2
+			this.$emit('input', value);
+			// TODO 兼容 vue3
+			this.$emit('update:modelValue', value);
+		},
+
+		/**
+		 * 外部调用方法
+		 * 获取焦点时触发
+		 * @param {Object} event
+		 */
+		onFocus() {
+			this.$nextTick(() => {
+				this.focused = true;
+			});
+			this.$emit('focus', null);
+		},
+
+		_Focus(event) {
+			this.focusShow = true;
+			this.$emit('focus', event);
+		},
+
+		/**
+		 * 外部调用方法
+		 * 失去焦点时触发
+		 * @param {Object} event
+		 */
+		onBlur() {
+			this.focused = false;
+			this.$emit('focus', null);
+		},
+		_Blur(event) {
+			let value = event.detail.value;
+			this.focusShow = false;
+			this.$emit('blur', event);
+			// 根据类型返回值,在event中获取的值理论上讲都是string
+			if (this.isEnter === false) {
+				this.$emit('change', this.val);
+			}
+			// 失去焦点时参与表单校验
+			if (this.form && this.formItem) {
+				const { validateTrigger } = this.form;
+				if (validateTrigger === 'blur') {
+					this.formItem.onFieldChange();
+				}
+			}
+		},
+
+		/**
+		 * 按下键盘的发送键
+		 * @param {Object} e
+		 */
+		onConfirm(e) {
+			this.$emit('confirm', this.val);
+			this.isEnter = true;
+			this.$emit('change', this.val);
+			this.$nextTick(() => {
+				this.isEnter = false;
+			});
+		},
+
+		/**
+		 * 清理内容
+		 * @param {Object} event
+		 */
+		onClear(event) {
+			this.val = '';
+			// TODO 兼容 vue2
+			this.$emit('input', '');
+			// TODO 兼容 vue2
+			// TODO 兼容 vue3
+			this.$emit('update:modelValue', '');
+			// 点击叉号触发
+			this.$emit('clear');
+		},
+
+    /**
+     * 键盘高度发生变化的时候触发此事件
+     * 兼容性:微信小程序2.7.0+、App 3.1.0+
+     * @param {Object} event
+     */
+    onkeyboardheightchange(event) {
+      this.$emit("keyboardheightchange",event);
+    },
+
+		/**
+		 * 去除空格
+		 */
+		trimStr(str, pos = 'both') {
+			if (pos === 'both') {
+				return str.trim();
+			} else if (pos === 'left') {
+				return str.trimLeft();
+			} else if (pos === 'right') {
+				return str.trimRight();
+			} else if (pos === 'start') {
+				return str.trimStart();
+			} else if (pos === 'end') {
+				return str.trimEnd();
+			} else if (pos === 'all') {
+				return str.replace(/\s+/g, '');
+			} else if (pos === 'none') {
+				return str;
+			}
+			return str;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+$uni-error: #e43d33;
+$uni-border-1: #dcdfe6 !default;
+
+.uni-easyinput {
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	/* #endif */
+	flex: 1;
+	position: relative;
+	text-align: left;
+	color: #333;
+	font-size: 14px;
+}
+
+.uni-easyinput__content {
+	flex: 1;
+	/* #ifndef APP-NVUE */
+	width: 100%;
+	display: flex;
+	box-sizing: border-box;
+	// min-height: 36px;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+	// 处理border动画刚开始显示黑色的问题
+	border-color: #fff;
+	transition-property: border-color;
+	transition-duration: 0.3s;
+}
+
+.uni-easyinput__content-input {
+	/* #ifndef APP-NVUE */
+	width: auto;
+	/* #endif */
+	position: relative;
+	overflow: hidden;
+	flex: 1;
+	line-height: 1;
+	font-size: 14px;
+	height: 35px;
+	// min-height: 36px;
+}
+
+.uni-easyinput__placeholder-class {
+	color: #999;
+	font-size: 12px;
+	// font-weight: 200;
+}
+
+.is-textarea {
+	align-items: flex-start;
+}
+
+.is-textarea-icon {
+	margin-top: 5px;
+}
+
+.uni-easyinput__content-textarea {
+	position: relative;
+	overflow: hidden;
+	flex: 1;
+	line-height: 1.5;
+	font-size: 14px;
+	margin: 6px;
+	margin-left: 0;
+	height: 80px;
+	min-height: 80px;
+	/* #ifndef APP-NVUE */
+	min-height: 80px;
+	width: auto;
+	/* #endif */
+}
+
+.input-padding {
+	padding-left: 10px;
+}
+
+.content-clear-icon {
+	padding: 0 5px;
+}
+
+.label-icon {
+	margin-right: 5px;
+	margin-top: -1px;
+}
+
+// 显示边框
+.is-input-border {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	box-sizing: border-box;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+	border: 1px solid $uni-border-1;
+	border-radius: 4px;
+	/* #ifdef MP-ALIPAY */
+	overflow: hidden;
+	/* #endif */
+}
+
+.uni-error-message {
+	position: absolute;
+	bottom: -17px;
+	left: 0;
+	line-height: 12px;
+	color: $uni-error;
+	font-size: 12px;
+	text-align: left;
+}
+
+.uni-error-msg--boeder {
+	position: relative;
+	bottom: 0;
+	line-height: 22px;
+}
+
+.is-input-error-border {
+	border-color: $uni-error;
+
+	.uni-easyinput__placeholder-class {
+		color: mix(#fff, $uni-error, 50%);
+	}
+}
+
+.uni-easyinput--border {
+	margin-bottom: 0;
+	padding: 10px 15px;
+	// padding-bottom: 0;
+	border-top: 1px #eee solid;
+}
+
+.uni-easyinput-error {
+	padding-bottom: 0;
+}
+
+.is-first-border {
+	/* #ifndef APP-NVUE */
+	border: none;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	border-width: 0;
+	/* #endif */
+}
+
+.is-disabled {
+	background-color: #f7f6f6;
+	color: #d5d5d5;
+
+	.uni-easyinput__placeholder-class {
+		color: #d5d5d5;
+		font-size: 12px;
+	}
+}
+</style>

+ 87 - 0
uni_modules/uni-easyinput/package.json

xqd
@@ -0,0 +1,87 @@
+{
+  "id": "uni-easyinput",
+  "displayName": "uni-easyinput 增强输入框",
+  "version": "1.1.9",
+  "description": "Easyinput 组件是对原生input组件的增强",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "input",
+    "uni-easyinput",
+    "输入框"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+      "uni-icons"
+    ],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 11 - 0
uni_modules/uni-easyinput/readme.md

xqd
@@ -0,0 +1,11 @@
+
+
+### Easyinput 增强输入框
+> **组件名:uni-easyinput**
+> 代码块: `uEasyinput`
+
+
+easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

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

xqd
@@ -0,0 +1,22 @@
+## 1.3.5(2022-01-24)
+- 优化 size 属性可以传入不带单位的字符串数值
+## 1.3.4(2022-01-24)
+- 优化 size 支持其他单位
+## 1.3.3(2022-01-17)
+- 修复 nvue 有些图标不显示的bug,兼容老版本图标
+## 1.3.2(2021-12-01)
+- 优化 示例可复制图标名称
+## 1.3.1(2021-11-23)
+- 优化 兼容旧组件 type 值
+## 1.3.0(2021-11-19)
+- 新增 更多图标
+- 优化 自定义图标使用方式
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
+## 1.1.7(2021-11-08)
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.5(2021-05-12)
+- 新增 组件示例地址
+## 1.1.4(2021-02-05)
+- 调整为uni_modules目录规范

+ 1169 - 0
uni_modules/uni-icons/components/uni-icons/icons.js

xqd
@@ -0,0 +1,1169 @@
+export default {
+  "id": "2852637",
+  "name": "uniui图标库",
+  "font_family": "uniicons",
+  "css_prefix_text": "uniui-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "25027049",
+      "name": "yanse",
+      "font_class": "color",
+      "unicode": "e6cf",
+      "unicode_decimal": 59087
+    },
+    {
+      "icon_id": "25027048",
+      "name": "wallet",
+      "font_class": "wallet",
+      "unicode": "e6b1",
+      "unicode_decimal": 59057
+    },
+    {
+      "icon_id": "25015720",
+      "name": "settings-filled",
+      "font_class": "settings-filled",
+      "unicode": "e6ce",
+      "unicode_decimal": 59086
+    },
+    {
+      "icon_id": "25015434",
+      "name": "shimingrenzheng-filled",
+      "font_class": "auth-filled",
+      "unicode": "e6cc",
+      "unicode_decimal": 59084
+    },
+    {
+      "icon_id": "24934246",
+      "name": "shop-filled",
+      "font_class": "shop-filled",
+      "unicode": "e6cd",
+      "unicode_decimal": 59085
+    },
+    {
+      "icon_id": "24934159",
+      "name": "staff-filled-01",
+      "font_class": "staff-filled",
+      "unicode": "e6cb",
+      "unicode_decimal": 59083
+    },
+    {
+      "icon_id": "24932461",
+      "name": "VIP-filled",
+      "font_class": "vip-filled",
+      "unicode": "e6c6",
+      "unicode_decimal": 59078
+    },
+    {
+      "icon_id": "24932462",
+      "name": "plus_circle_fill",
+      "font_class": "plus-filled",
+      "unicode": "e6c7",
+      "unicode_decimal": 59079
+    },
+    {
+      "icon_id": "24932463",
+      "name": "folder_add-filled",
+      "font_class": "folder-add-filled",
+      "unicode": "e6c8",
+      "unicode_decimal": 59080
+    },
+    {
+      "icon_id": "24932464",
+      "name": "yanse-filled",
+      "font_class": "color-filled",
+      "unicode": "e6c9",
+      "unicode_decimal": 59081
+    },
+    {
+      "icon_id": "24932465",
+      "name": "tune-filled",
+      "font_class": "tune-filled",
+      "unicode": "e6ca",
+      "unicode_decimal": 59082
+    },
+    {
+      "icon_id": "24932455",
+      "name": "a-rilidaka-filled",
+      "font_class": "calendar-filled",
+      "unicode": "e6c0",
+      "unicode_decimal": 59072
+    },
+    {
+      "icon_id": "24932456",
+      "name": "notification-filled",
+      "font_class": "notification-filled",
+      "unicode": "e6c1",
+      "unicode_decimal": 59073
+    },
+    {
+      "icon_id": "24932457",
+      "name": "wallet-filled",
+      "font_class": "wallet-filled",
+      "unicode": "e6c2",
+      "unicode_decimal": 59074
+    },
+    {
+      "icon_id": "24932458",
+      "name": "paihangbang-filled",
+      "font_class": "medal-filled",
+      "unicode": "e6c3",
+      "unicode_decimal": 59075
+    },
+    {
+      "icon_id": "24932459",
+      "name": "gift-filled",
+      "font_class": "gift-filled",
+      "unicode": "e6c4",
+      "unicode_decimal": 59076
+    },
+    {
+      "icon_id": "24932460",
+      "name": "fire-filled",
+      "font_class": "fire-filled",
+      "unicode": "e6c5",
+      "unicode_decimal": 59077
+    },
+    {
+      "icon_id": "24928001",
+      "name": "refreshempty",
+      "font_class": "refreshempty",
+      "unicode": "e6bf",
+      "unicode_decimal": 59071
+    },
+    {
+      "icon_id": "24926853",
+      "name": "location-ellipse",
+      "font_class": "location-filled",
+      "unicode": "e6af",
+      "unicode_decimal": 59055
+    },
+    {
+      "icon_id": "24926735",
+      "name": "person-filled",
+      "font_class": "person-filled",
+      "unicode": "e69d",
+      "unicode_decimal": 59037
+    },
+    {
+      "icon_id": "24926703",
+      "name": "personadd-filled",
+      "font_class": "personadd-filled",
+      "unicode": "e698",
+      "unicode_decimal": 59032
+    },
+    {
+      "icon_id": "24923351",
+      "name": "back",
+      "font_class": "back",
+      "unicode": "e6b9",
+      "unicode_decimal": 59065
+    },
+    {
+      "icon_id": "24923352",
+      "name": "forward",
+      "font_class": "forward",
+      "unicode": "e6ba",
+      "unicode_decimal": 59066
+    },
+    {
+      "icon_id": "24923353",
+      "name": "arrowthinright",
+      "font_class": "arrow-right",
+      "unicode": "e6bb",
+      "unicode_decimal": 59067
+    },
+		{
+		  "icon_id": "24923353",
+		  "name": "arrowthinright",
+		  "font_class": "arrowthinright",
+		  "unicode": "e6bb",
+		  "unicode_decimal": 59067
+		},
+    {
+      "icon_id": "24923354",
+      "name": "arrowthinleft",
+      "font_class": "arrow-left",
+      "unicode": "e6bc",
+      "unicode_decimal": 59068
+    },
+		{
+		  "icon_id": "24923354",
+		  "name": "arrowthinleft",
+		  "font_class": "arrowthinleft",
+		  "unicode": "e6bc",
+		  "unicode_decimal": 59068
+		},
+    {
+      "icon_id": "24923355",
+      "name": "arrowthinup",
+      "font_class": "arrow-up",
+      "unicode": "e6bd",
+      "unicode_decimal": 59069
+    },
+		{
+		  "icon_id": "24923355",
+		  "name": "arrowthinup",
+		  "font_class": "arrowthinup",
+		  "unicode": "e6bd",
+		  "unicode_decimal": 59069
+		},
+    {
+      "icon_id": "24923356",
+      "name": "arrowthindown",
+      "font_class": "arrow-down",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    },{
+      "icon_id": "24923356",
+      "name": "arrowthindown",
+      "font_class": "arrowthindown",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    },
+    {
+      "icon_id": "24923349",
+      "name": "arrowdown",
+      "font_class": "bottom",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },{
+      "icon_id": "24923349",
+      "name": "arrowdown",
+      "font_class": "arrowdown",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },
+    {
+      "icon_id": "24923346",
+      "name": "arrowright",
+      "font_class": "right",
+      "unicode": "e6b5",
+      "unicode_decimal": 59061
+    },
+		{
+		  "icon_id": "24923346",
+		  "name": "arrowright",
+		  "font_class": "arrowright",
+		  "unicode": "e6b5",
+		  "unicode_decimal": 59061
+		},
+    {
+      "icon_id": "24923347",
+      "name": "arrowup",
+      "font_class": "top",
+      "unicode": "e6b6",
+      "unicode_decimal": 59062
+    },
+		{
+		  "icon_id": "24923347",
+		  "name": "arrowup",
+		  "font_class": "arrowup",
+		  "unicode": "e6b6",
+		  "unicode_decimal": 59062
+		},
+    {
+      "icon_id": "24923348",
+      "name": "arrowleft",
+      "font_class": "left",
+      "unicode": "e6b7",
+      "unicode_decimal": 59063
+    },
+		{
+		  "icon_id": "24923348",
+		  "name": "arrowleft",
+		  "font_class": "arrowleft",
+		  "unicode": "e6b7",
+		  "unicode_decimal": 59063
+		},
+    {
+      "icon_id": "24923334",
+      "name": "eye",
+      "font_class": "eye",
+      "unicode": "e651",
+      "unicode_decimal": 58961
+    },
+    {
+      "icon_id": "24923335",
+      "name": "eye-filled",
+      "font_class": "eye-filled",
+      "unicode": "e66a",
+      "unicode_decimal": 58986
+    },
+    {
+      "icon_id": "24923336",
+      "name": "eye-slash",
+      "font_class": "eye-slash",
+      "unicode": "e6b3",
+      "unicode_decimal": 59059
+    },
+    {
+      "icon_id": "24923337",
+      "name": "eye-slash-filled",
+      "font_class": "eye-slash-filled",
+      "unicode": "e6b4",
+      "unicode_decimal": 59060
+    },
+    {
+      "icon_id": "24923305",
+      "name": "info-filled",
+      "font_class": "info-filled",
+      "unicode": "e649",
+      "unicode_decimal": 58953
+    },
+    {
+      "icon_id": "24923299",
+      "name": "reload-01",
+      "font_class": "reload",
+      "unicode": "e6b2",
+      "unicode_decimal": 59058
+    },
+    {
+      "icon_id": "24923195",
+      "name": "mic_slash_fill",
+      "font_class": "micoff-filled",
+      "unicode": "e6b0",
+      "unicode_decimal": 59056
+    },
+    {
+      "icon_id": "24923165",
+      "name": "map-pin-ellipse",
+      "font_class": "map-pin-ellipse",
+      "unicode": "e6ac",
+      "unicode_decimal": 59052
+    },
+    {
+      "icon_id": "24923166",
+      "name": "map-pin",
+      "font_class": "map-pin",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "24923167",
+      "name": "location",
+      "font_class": "location",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "24923064",
+      "name": "starhalf",
+      "font_class": "starhalf",
+      "unicode": "e683",
+      "unicode_decimal": 59011
+    },
+    {
+      "icon_id": "24923065",
+      "name": "star",
+      "font_class": "star",
+      "unicode": "e688",
+      "unicode_decimal": 59016
+    },
+    {
+      "icon_id": "24923066",
+      "name": "star-filled",
+      "font_class": "star-filled",
+      "unicode": "e68f",
+      "unicode_decimal": 59023
+    },
+    {
+      "icon_id": "24899646",
+      "name": "a-rilidaka",
+      "font_class": "calendar",
+      "unicode": "e6a0",
+      "unicode_decimal": 59040
+    },
+    {
+      "icon_id": "24899647",
+      "name": "fire",
+      "font_class": "fire",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "24899648",
+      "name": "paihangbang",
+      "font_class": "medal",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "24899649",
+      "name": "font",
+      "font_class": "font",
+      "unicode": "e6a3",
+      "unicode_decimal": 59043
+    },
+    {
+      "icon_id": "24899650",
+      "name": "gift",
+      "font_class": "gift",
+      "unicode": "e6a4",
+      "unicode_decimal": 59044
+    },
+    {
+      "icon_id": "24899651",
+      "name": "link",
+      "font_class": "link",
+      "unicode": "e6a5",
+      "unicode_decimal": 59045
+    },
+    {
+      "icon_id": "24899652",
+      "name": "notification",
+      "font_class": "notification",
+      "unicode": "e6a6",
+      "unicode_decimal": 59046
+    },
+    {
+      "icon_id": "24899653",
+      "name": "staff",
+      "font_class": "staff",
+      "unicode": "e6a7",
+      "unicode_decimal": 59047
+    },
+    {
+      "icon_id": "24899654",
+      "name": "VIP",
+      "font_class": "vip",
+      "unicode": "e6a8",
+      "unicode_decimal": 59048
+    },
+    {
+      "icon_id": "24899655",
+      "name": "folder_add",
+      "font_class": "folder-add",
+      "unicode": "e6a9",
+      "unicode_decimal": 59049
+    },
+    {
+      "icon_id": "24899656",
+      "name": "tune",
+      "font_class": "tune",
+      "unicode": "e6aa",
+      "unicode_decimal": 59050
+    },
+    {
+      "icon_id": "24899657",
+      "name": "shimingrenzheng",
+      "font_class": "auth",
+      "unicode": "e6ab",
+      "unicode_decimal": 59051
+    },
+    {
+      "icon_id": "24899565",
+      "name": "person",
+      "font_class": "person",
+      "unicode": "e699",
+      "unicode_decimal": 59033
+    },
+    {
+      "icon_id": "24899566",
+      "name": "email-filled",
+      "font_class": "email-filled",
+      "unicode": "e69a",
+      "unicode_decimal": 59034
+    },
+    {
+      "icon_id": "24899567",
+      "name": "phone-filled",
+      "font_class": "phone-filled",
+      "unicode": "e69b",
+      "unicode_decimal": 59035
+    },
+    {
+      "icon_id": "24899568",
+      "name": "phone",
+      "font_class": "phone",
+      "unicode": "e69c",
+      "unicode_decimal": 59036
+    },
+    {
+      "icon_id": "24899570",
+      "name": "email",
+      "font_class": "email",
+      "unicode": "e69e",
+      "unicode_decimal": 59038
+    },
+    {
+      "icon_id": "24899571",
+      "name": "personadd",
+      "font_class": "personadd",
+      "unicode": "e69f",
+      "unicode_decimal": 59039
+    },
+    {
+      "icon_id": "24899558",
+      "name": "chatboxes-filled",
+      "font_class": "chatboxes-filled",
+      "unicode": "e692",
+      "unicode_decimal": 59026
+    },
+    {
+      "icon_id": "24899559",
+      "name": "contact",
+      "font_class": "contact",
+      "unicode": "e693",
+      "unicode_decimal": 59027
+    },
+    {
+      "icon_id": "24899560",
+      "name": "chatbubble-filled",
+      "font_class": "chatbubble-filled",
+      "unicode": "e694",
+      "unicode_decimal": 59028
+    },
+    {
+      "icon_id": "24899561",
+      "name": "contact-filled",
+      "font_class": "contact-filled",
+      "unicode": "e695",
+      "unicode_decimal": 59029
+    },
+    {
+      "icon_id": "24899562",
+      "name": "chatboxes",
+      "font_class": "chatboxes",
+      "unicode": "e696",
+      "unicode_decimal": 59030
+    },
+    {
+      "icon_id": "24899563",
+      "name": "chatbubble",
+      "font_class": "chatbubble",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    },
+    {
+      "icon_id": "24881290",
+      "name": "upload-filled",
+      "font_class": "upload-filled",
+      "unicode": "e68e",
+      "unicode_decimal": 59022
+    },
+    {
+      "icon_id": "24881292",
+      "name": "upload",
+      "font_class": "upload",
+      "unicode": "e690",
+      "unicode_decimal": 59024
+    },
+    {
+      "icon_id": "24881293",
+      "name": "weixin",
+      "font_class": "weixin",
+      "unicode": "e691",
+      "unicode_decimal": 59025
+    },
+    {
+      "icon_id": "24881274",
+      "name": "compose",
+      "font_class": "compose",
+      "unicode": "e67f",
+      "unicode_decimal": 59007
+    },
+    {
+      "icon_id": "24881275",
+      "name": "qq",
+      "font_class": "qq",
+      "unicode": "e680",
+      "unicode_decimal": 59008
+    },
+    {
+      "icon_id": "24881276",
+      "name": "download-filled",
+      "font_class": "download-filled",
+      "unicode": "e681",
+      "unicode_decimal": 59009
+    },
+    {
+      "icon_id": "24881277",
+      "name": "pengyouquan",
+      "font_class": "pyq",
+      "unicode": "e682",
+      "unicode_decimal": 59010
+    },
+    {
+      "icon_id": "24881279",
+      "name": "sound",
+      "font_class": "sound",
+      "unicode": "e684",
+      "unicode_decimal": 59012
+    },
+    {
+      "icon_id": "24881280",
+      "name": "trash-filled",
+      "font_class": "trash-filled",
+      "unicode": "e685",
+      "unicode_decimal": 59013
+    },
+    {
+      "icon_id": "24881281",
+      "name": "sound-filled",
+      "font_class": "sound-filled",
+      "unicode": "e686",
+      "unicode_decimal": 59014
+    },
+    {
+      "icon_id": "24881282",
+      "name": "trash",
+      "font_class": "trash",
+      "unicode": "e687",
+      "unicode_decimal": 59015
+    },
+    {
+      "icon_id": "24881284",
+      "name": "videocam-filled",
+      "font_class": "videocam-filled",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "24881285",
+      "name": "spinner-cycle",
+      "font_class": "spinner-cycle",
+      "unicode": "e68a",
+      "unicode_decimal": 59018
+    },
+    {
+      "icon_id": "24881286",
+      "name": "weibo",
+      "font_class": "weibo",
+      "unicode": "e68b",
+      "unicode_decimal": 59019
+    },
+    {
+      "icon_id": "24881288",
+      "name": "videocam",
+      "font_class": "videocam",
+      "unicode": "e68c",
+      "unicode_decimal": 59020
+    },
+    {
+      "icon_id": "24881289",
+      "name": "download",
+      "font_class": "download",
+      "unicode": "e68d",
+      "unicode_decimal": 59021
+    },
+    {
+      "icon_id": "24879601",
+      "name": "help",
+      "font_class": "help",
+      "unicode": "e679",
+      "unicode_decimal": 59001
+    },
+    {
+      "icon_id": "24879602",
+      "name": "navigate-filled",
+      "font_class": "navigate-filled",
+      "unicode": "e67a",
+      "unicode_decimal": 59002
+    },
+    {
+      "icon_id": "24879603",
+      "name": "plusempty",
+      "font_class": "plusempty",
+      "unicode": "e67b",
+      "unicode_decimal": 59003
+    },
+    {
+      "icon_id": "24879604",
+      "name": "smallcircle",
+      "font_class": "smallcircle",
+      "unicode": "e67c",
+      "unicode_decimal": 59004
+    },
+    {
+      "icon_id": "24879605",
+      "name": "minus-filled",
+      "font_class": "minus-filled",
+      "unicode": "e67d",
+      "unicode_decimal": 59005
+    },
+    {
+      "icon_id": "24879606",
+      "name": "micoff",
+      "font_class": "micoff",
+      "unicode": "e67e",
+      "unicode_decimal": 59006
+    },
+    {
+      "icon_id": "24879588",
+      "name": "closeempty",
+      "font_class": "closeempty",
+      "unicode": "e66c",
+      "unicode_decimal": 58988
+    },
+    {
+      "icon_id": "24879589",
+      "name": "clear",
+      "font_class": "clear",
+      "unicode": "e66d",
+      "unicode_decimal": 58989
+    },
+    {
+      "icon_id": "24879590",
+      "name": "navigate",
+      "font_class": "navigate",
+      "unicode": "e66e",
+      "unicode_decimal": 58990
+    },
+    {
+      "icon_id": "24879591",
+      "name": "minus",
+      "font_class": "minus",
+      "unicode": "e66f",
+      "unicode_decimal": 58991
+    },
+    {
+      "icon_id": "24879592",
+      "name": "image",
+      "font_class": "image",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    },
+    {
+      "icon_id": "24879593",
+      "name": "mic",
+      "font_class": "mic",
+      "unicode": "e671",
+      "unicode_decimal": 58993
+    },
+    {
+      "icon_id": "24879594",
+      "name": "paperplane",
+      "font_class": "paperplane",
+      "unicode": "e672",
+      "unicode_decimal": 58994
+    },
+    {
+      "icon_id": "24879595",
+      "name": "close",
+      "font_class": "close",
+      "unicode": "e673",
+      "unicode_decimal": 58995
+    },
+    {
+      "icon_id": "24879596",
+      "name": "help-filled",
+      "font_class": "help-filled",
+      "unicode": "e674",
+      "unicode_decimal": 58996
+    },
+    {
+      "icon_id": "24879597",
+      "name": "plus-filled",
+      "font_class": "paperplane-filled",
+      "unicode": "e675",
+      "unicode_decimal": 58997
+    },
+    {
+      "icon_id": "24879598",
+      "name": "plus",
+      "font_class": "plus",
+      "unicode": "e676",
+      "unicode_decimal": 58998
+    },
+    {
+      "icon_id": "24879599",
+      "name": "mic-filled",
+      "font_class": "mic-filled",
+      "unicode": "e677",
+      "unicode_decimal": 58999
+    },
+    {
+      "icon_id": "24879600",
+      "name": "image-filled",
+      "font_class": "image-filled",
+      "unicode": "e678",
+      "unicode_decimal": 59000
+    },
+    {
+      "icon_id": "24855900",
+      "name": "locked-filled",
+      "font_class": "locked-filled",
+      "unicode": "e668",
+      "unicode_decimal": 58984
+    },
+    {
+      "icon_id": "24855901",
+      "name": "info",
+      "font_class": "info",
+      "unicode": "e669",
+      "unicode_decimal": 58985
+    },
+    {
+      "icon_id": "24855903",
+      "name": "locked",
+      "font_class": "locked",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "24855884",
+      "name": "camera-filled",
+      "font_class": "camera-filled",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "24855885",
+      "name": "chat-filled",
+      "font_class": "chat-filled",
+      "unicode": "e659",
+      "unicode_decimal": 58969
+    },
+    {
+      "icon_id": "24855886",
+      "name": "camera",
+      "font_class": "camera",
+      "unicode": "e65a",
+      "unicode_decimal": 58970
+    },
+    {
+      "icon_id": "24855887",
+      "name": "circle",
+      "font_class": "circle",
+      "unicode": "e65b",
+      "unicode_decimal": 58971
+    },
+    {
+      "icon_id": "24855888",
+      "name": "checkmarkempty",
+      "font_class": "checkmarkempty",
+      "unicode": "e65c",
+      "unicode_decimal": 58972
+    },
+    {
+      "icon_id": "24855889",
+      "name": "chat",
+      "font_class": "chat",
+      "unicode": "e65d",
+      "unicode_decimal": 58973
+    },
+    {
+      "icon_id": "24855890",
+      "name": "circle-filled",
+      "font_class": "circle-filled",
+      "unicode": "e65e",
+      "unicode_decimal": 58974
+    },
+    {
+      "icon_id": "24855891",
+      "name": "flag",
+      "font_class": "flag",
+      "unicode": "e65f",
+      "unicode_decimal": 58975
+    },
+    {
+      "icon_id": "24855892",
+      "name": "flag-filled",
+      "font_class": "flag-filled",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "24855893",
+      "name": "gear-filled",
+      "font_class": "gear-filled",
+      "unicode": "e661",
+      "unicode_decimal": 58977
+    },
+    {
+      "icon_id": "24855894",
+      "name": "home",
+      "font_class": "home",
+      "unicode": "e662",
+      "unicode_decimal": 58978
+    },
+    {
+      "icon_id": "24855895",
+      "name": "home-filled",
+      "font_class": "home-filled",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "24855896",
+      "name": "gear",
+      "font_class": "gear",
+      "unicode": "e664",
+      "unicode_decimal": 58980
+    },
+    {
+      "icon_id": "24855897",
+      "name": "smallcircle-filled",
+      "font_class": "smallcircle-filled",
+      "unicode": "e665",
+      "unicode_decimal": 58981
+    },
+    {
+      "icon_id": "24855898",
+      "name": "map-filled",
+      "font_class": "map-filled",
+      "unicode": "e666",
+      "unicode_decimal": 58982
+    },
+    {
+      "icon_id": "24855899",
+      "name": "map",
+      "font_class": "map",
+      "unicode": "e667",
+      "unicode_decimal": 58983
+    },
+    {
+      "icon_id": "24855825",
+      "name": "refresh-filled",
+      "font_class": "refresh-filled",
+      "unicode": "e656",
+      "unicode_decimal": 58966
+    },
+    {
+      "icon_id": "24855826",
+      "name": "refresh",
+      "font_class": "refresh",
+      "unicode": "e657",
+      "unicode_decimal": 58967
+    },
+    {
+      "icon_id": "24855808",
+      "name": "cloud-upload",
+      "font_class": "cloud-upload",
+      "unicode": "e645",
+      "unicode_decimal": 58949
+    },
+    {
+      "icon_id": "24855809",
+      "name": "cloud-download-filled",
+      "font_class": "cloud-download-filled",
+      "unicode": "e646",
+      "unicode_decimal": 58950
+    },
+    {
+      "icon_id": "24855810",
+      "name": "cloud-download",
+      "font_class": "cloud-download",
+      "unicode": "e647",
+      "unicode_decimal": 58951
+    },
+    {
+      "icon_id": "24855811",
+      "name": "cloud-upload-filled",
+      "font_class": "cloud-upload-filled",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "24855813",
+      "name": "redo",
+      "font_class": "redo",
+      "unicode": "e64a",
+      "unicode_decimal": 58954
+    },
+    {
+      "icon_id": "24855814",
+      "name": "images-filled",
+      "font_class": "images-filled",
+      "unicode": "e64b",
+      "unicode_decimal": 58955
+    },
+    {
+      "icon_id": "24855815",
+      "name": "undo-filled",
+      "font_class": "undo-filled",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "24855816",
+      "name": "more",
+      "font_class": "more",
+      "unicode": "e64d",
+      "unicode_decimal": 58957
+    },
+    {
+      "icon_id": "24855817",
+      "name": "more-filled",
+      "font_class": "more-filled",
+      "unicode": "e64e",
+      "unicode_decimal": 58958
+    },
+    {
+      "icon_id": "24855818",
+      "name": "undo",
+      "font_class": "undo",
+      "unicode": "e64f",
+      "unicode_decimal": 58959
+    },
+    {
+      "icon_id": "24855819",
+      "name": "images",
+      "font_class": "images",
+      "unicode": "e650",
+      "unicode_decimal": 58960
+    },
+    {
+      "icon_id": "24855821",
+      "name": "paperclip",
+      "font_class": "paperclip",
+      "unicode": "e652",
+      "unicode_decimal": 58962
+    },
+    {
+      "icon_id": "24855822",
+      "name": "settings",
+      "font_class": "settings",
+      "unicode": "e653",
+      "unicode_decimal": 58963
+    },
+    {
+      "icon_id": "24855823",
+      "name": "search",
+      "font_class": "search",
+      "unicode": "e654",
+      "unicode_decimal": 58964
+    },
+    {
+      "icon_id": "24855824",
+      "name": "redo-filled",
+      "font_class": "redo-filled",
+      "unicode": "e655",
+      "unicode_decimal": 58965
+    },
+    {
+      "icon_id": "24841702",
+      "name": "list",
+      "font_class": "list",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    },
+    {
+      "icon_id": "24841489",
+      "name": "mail-open-filled",
+      "font_class": "mail-open-filled",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "24841491",
+      "name": "hand-thumbsdown-filled",
+      "font_class": "hand-down-filled",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "24841492",
+      "name": "hand-thumbsdown",
+      "font_class": "hand-down",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "24841493",
+      "name": "hand-thumbsup-filled",
+      "font_class": "hand-up-filled",
+      "unicode": "e63e",
+      "unicode_decimal": 58942
+    },
+    {
+      "icon_id": "24841494",
+      "name": "hand-thumbsup",
+      "font_class": "hand-up",
+      "unicode": "e63f",
+      "unicode_decimal": 58943
+    },
+    {
+      "icon_id": "24841496",
+      "name": "heart-filled",
+      "font_class": "heart-filled",
+      "unicode": "e641",
+      "unicode_decimal": 58945
+    },
+    {
+      "icon_id": "24841498",
+      "name": "mail-open",
+      "font_class": "mail-open",
+      "unicode": "e643",
+      "unicode_decimal": 58947
+    },
+    {
+      "icon_id": "24841488",
+      "name": "heart",
+      "font_class": "heart",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "24839963",
+      "name": "loop",
+      "font_class": "loop",
+      "unicode": "e633",
+      "unicode_decimal": 58931
+    },
+    {
+      "icon_id": "24839866",
+      "name": "pulldown",
+      "font_class": "pulldown",
+      "unicode": "e632",
+      "unicode_decimal": 58930
+    },
+    {
+      "icon_id": "24813798",
+      "name": "scan",
+      "font_class": "scan",
+      "unicode": "e62a",
+      "unicode_decimal": 58922
+    },
+    {
+      "icon_id": "24813786",
+      "name": "bars",
+      "font_class": "bars",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "24813788",
+      "name": "cart-filled",
+      "font_class": "cart-filled",
+      "unicode": "e629",
+      "unicode_decimal": 58921
+    },
+    {
+      "icon_id": "24813790",
+      "name": "checkbox",
+      "font_class": "checkbox",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "24813791",
+      "name": "checkbox-filled",
+      "font_class": "checkbox-filled",
+      "unicode": "e62c",
+      "unicode_decimal": 58924
+    },
+    {
+      "icon_id": "24813794",
+      "name": "shop",
+      "font_class": "shop",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    },
+    {
+      "icon_id": "24813795",
+      "name": "headphones",
+      "font_class": "headphones",
+      "unicode": "e630",
+      "unicode_decimal": 58928
+    },
+    {
+      "icon_id": "24813796",
+      "name": "cart",
+      "font_class": "cart",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    }
+  ]
+}

+ 96 - 0
uni_modules/uni-icons/components/uni-icons/uni-icons.vue

xqd
@@ -0,0 +1,96 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<text :style="{ color: color, 'font-size': iconSize }" 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>
+	<!-- #endif -->
+</template>
+
+<script>
+	import icons from './icons.js';
+	const getVal = (val) => {
+		const reg = /^[0-9]*$/g
+		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+"')"
+	});
+	// #endif
+
+	/**
+	 * Icons 图标
+	 * @description 用于展示 icons 图标
+	 * @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: 'UniIcons',
+		emits:['click'],
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#333333'
+			},
+			size: {
+				type: [Number, String],
+				default: 16
+			},
+			customPrefix:{
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				icons: icons.glyphs
+			}
+		},
+		computed:{
+			unicode(){
+				let code = this.icons.find(v=>v.font_class === this.type)
+				if(code){
+					return unescape(`%u${code.unicode}`)
+				}
+				return ''
+			},
+			iconSize(){
+				return getVal(this.size)
+			}
+		},
+		methods: {
+			_onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/* #ifndef APP-NVUE */
+	@import './uniicons.css';
+	@font-face {
+		font-family: uniicons;
+		src: url('./uniicons.ttf') format('truetype');
+	}
+
+	/* #endif */
+	.uni-icons {
+		font-family: uniicons;
+		text-decoration: none;
+		text-align: center;
+	}
+
+</style>

+ 663 - 0
uni_modules/uni-icons/components/uni-icons/uniicons.css

xqd
@@ -0,0 +1,663 @@
+.uniui-color:before {
+  content: "\e6cf";
+}
+
+.uniui-wallet:before {
+  content: "\e6b1";
+}
+
+.uniui-settings-filled:before {
+  content: "\e6ce";
+}
+
+.uniui-auth-filled:before {
+  content: "\e6cc";
+}
+
+.uniui-shop-filled:before {
+  content: "\e6cd";
+}
+
+.uniui-staff-filled:before {
+  content: "\e6cb";
+}
+
+.uniui-vip-filled:before {
+  content: "\e6c6";
+}
+
+.uniui-plus-filled:before {
+  content: "\e6c7";
+}
+
+.uniui-folder-add-filled:before {
+  content: "\e6c8";
+}
+
+.uniui-color-filled:before {
+  content: "\e6c9";
+}
+
+.uniui-tune-filled:before {
+  content: "\e6ca";
+}
+
+.uniui-calendar-filled:before {
+  content: "\e6c0";
+}
+
+.uniui-notification-filled:before {
+  content: "\e6c1";
+}
+
+.uniui-wallet-filled:before {
+  content: "\e6c2";
+}
+
+.uniui-medal-filled:before {
+  content: "\e6c3";
+}
+
+.uniui-gift-filled:before {
+  content: "\e6c4";
+}
+
+.uniui-fire-filled:before {
+  content: "\e6c5";
+}
+
+.uniui-refreshempty:before {
+  content: "\e6bf";
+}
+
+.uniui-location-filled:before {
+  content: "\e6af";
+}
+
+.uniui-person-filled:before {
+  content: "\e69d";
+}
+
+.uniui-personadd-filled:before {
+  content: "\e698";
+}
+
+.uniui-back:before {
+  content: "\e6b9";
+}
+
+.uniui-forward:before {
+  content: "\e6ba";
+}
+
+.uniui-arrow-right:before {
+  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-bottom:before {
+  content: "\e6b8";
+}
+
+.uniui-arrowdown:before {
+  content: "\e6b8";
+}
+
+.uniui-right:before {
+  content: "\e6b5";
+}
+
+.uniui-arrowright:before {
+  content: "\e6b5";
+}
+
+.uniui-top:before {
+  content: "\e6b6";
+}
+
+.uniui-arrowup:before {
+  content: "\e6b6";
+}
+
+.uniui-left:before {
+  content: "\e6b7";
+}
+
+.uniui-arrowleft:before {
+  content: "\e6b7";
+}
+
+.uniui-eye:before {
+  content: "\e651";
+}
+
+.uniui-eye-filled:before {
+  content: "\e66a";
+}
+
+.uniui-eye-slash:before {
+  content: "\e6b3";
+}
+
+.uniui-eye-slash-filled:before {
+  content: "\e6b4";
+}
+
+.uniui-info-filled:before {
+  content: "\e649";
+}
+
+.uniui-reload:before {
+  content: "\e6b2";
+}
+
+.uniui-micoff-filled:before {
+  content: "\e6b0";
+}
+
+.uniui-map-pin-ellipse:before {
+  content: "\e6ac";
+}
+
+.uniui-map-pin:before {
+  content: "\e6ad";
+}
+
+.uniui-location:before {
+  content: "\e6ae";
+}
+
+.uniui-starhalf:before {
+  content: "\e683";
+}
+
+.uniui-star:before {
+  content: "\e688";
+}
+
+.uniui-star-filled:before {
+  content: "\e68f";
+}
+
+.uniui-calendar:before {
+  content: "\e6a0";
+}
+
+.uniui-fire:before {
+  content: "\e6a1";
+}
+
+.uniui-medal:before {
+  content: "\e6a2";
+}
+
+.uniui-font:before {
+  content: "\e6a3";
+}
+
+.uniui-gift:before {
+  content: "\e6a4";
+}
+
+.uniui-link:before {
+  content: "\e6a5";
+}
+
+.uniui-notification:before {
+  content: "\e6a6";
+}
+
+.uniui-staff:before {
+  content: "\e6a7";
+}
+
+.uniui-vip:before {
+  content: "\e6a8";
+}
+
+.uniui-folder-add:before {
+  content: "\e6a9";
+}
+
+.uniui-tune:before {
+  content: "\e6aa";
+}
+
+.uniui-auth:before {
+  content: "\e6ab";
+}
+
+.uniui-person:before {
+  content: "\e699";
+}
+
+.uniui-email-filled:before {
+  content: "\e69a";
+}
+
+.uniui-phone-filled:before {
+  content: "\e69b";
+}
+
+.uniui-phone:before {
+  content: "\e69c";
+}
+
+.uniui-email:before {
+  content: "\e69e";
+}
+
+.uniui-personadd:before {
+  content: "\e69f";
+}
+
+.uniui-chatboxes-filled:before {
+  content: "\e692";
+}
+
+.uniui-contact:before {
+  content: "\e693";
+}
+
+.uniui-chatbubble-filled:before {
+  content: "\e694";
+}
+
+.uniui-contact-filled:before {
+  content: "\e695";
+}
+
+.uniui-chatboxes:before {
+  content: "\e696";
+}
+
+.uniui-chatbubble:before {
+  content: "\e697";
+}
+
+.uniui-upload-filled:before {
+  content: "\e68e";
+}
+
+.uniui-upload:before {
+  content: "\e690";
+}
+
+.uniui-weixin:before {
+  content: "\e691";
+}
+
+.uniui-compose:before {
+  content: "\e67f";
+}
+
+.uniui-qq:before {
+  content: "\e680";
+}
+
+.uniui-download-filled:before {
+  content: "\e681";
+}
+
+.uniui-pyq:before {
+  content: "\e682";
+}
+
+.uniui-sound:before {
+  content: "\e684";
+}
+
+.uniui-trash-filled:before {
+  content: "\e685";
+}
+
+.uniui-sound-filled:before {
+  content: "\e686";
+}
+
+.uniui-trash:before {
+  content: "\e687";
+}
+
+.uniui-videocam-filled:before {
+  content: "\e689";
+}
+
+.uniui-spinner-cycle:before {
+  content: "\e68a";
+}
+
+.uniui-weibo:before {
+  content: "\e68b";
+}
+
+.uniui-videocam:before {
+  content: "\e68c";
+}
+
+.uniui-download:before {
+  content: "\e68d";
+}
+
+.uniui-help:before {
+  content: "\e679";
+}
+
+.uniui-navigate-filled:before {
+  content: "\e67a";
+}
+
+.uniui-plusempty:before {
+  content: "\e67b";
+}
+
+.uniui-smallcircle:before {
+  content: "\e67c";
+}
+
+.uniui-minus-filled:before {
+  content: "\e67d";
+}
+
+.uniui-micoff:before {
+  content: "\e67e";
+}
+
+.uniui-closeempty:before {
+  content: "\e66c";
+}
+
+.uniui-clear:before {
+  content: "\e66d";
+}
+
+.uniui-navigate:before {
+  content: "\e66e";
+}
+
+.uniui-minus:before {
+  content: "\e66f";
+}
+
+.uniui-image:before {
+  content: "\e670";
+}
+
+.uniui-mic:before {
+  content: "\e671";
+}
+
+.uniui-paperplane:before {
+  content: "\e672";
+}
+
+.uniui-close:before {
+  content: "\e673";
+}
+
+.uniui-help-filled:before {
+  content: "\e674";
+}
+
+.uniui-paperplane-filled:before {
+  content: "\e675";
+}
+
+.uniui-plus:before {
+  content: "\e676";
+}
+
+.uniui-mic-filled:before {
+  content: "\e677";
+}
+
+.uniui-image-filled:before {
+  content: "\e678";
+}
+
+.uniui-locked-filled:before {
+  content: "\e668";
+}
+
+.uniui-info:before {
+  content: "\e669";
+}
+
+.uniui-locked:before {
+  content: "\e66b";
+}
+
+.uniui-camera-filled:before {
+  content: "\e658";
+}
+
+.uniui-chat-filled:before {
+  content: "\e659";
+}
+
+.uniui-camera:before {
+  content: "\e65a";
+}
+
+.uniui-circle:before {
+  content: "\e65b";
+}
+
+.uniui-checkmarkempty:before {
+  content: "\e65c";
+}
+
+.uniui-chat:before {
+  content: "\e65d";
+}
+
+.uniui-circle-filled:before {
+  content: "\e65e";
+}
+
+.uniui-flag:before {
+  content: "\e65f";
+}
+
+.uniui-flag-filled:before {
+  content: "\e660";
+}
+
+.uniui-gear-filled:before {
+  content: "\e661";
+}
+
+.uniui-home:before {
+  content: "\e662";
+}
+
+.uniui-home-filled:before {
+  content: "\e663";
+}
+
+.uniui-gear:before {
+  content: "\e664";
+}
+
+.uniui-smallcircle-filled:before {
+  content: "\e665";
+}
+
+.uniui-map-filled:before {
+  content: "\e666";
+}
+
+.uniui-map:before {
+  content: "\e667";
+}
+
+.uniui-refresh-filled:before {
+  content: "\e656";
+}
+
+.uniui-refresh:before {
+  content: "\e657";
+}
+
+.uniui-cloud-upload:before {
+  content: "\e645";
+}
+
+.uniui-cloud-download-filled:before {
+  content: "\e646";
+}
+
+.uniui-cloud-download:before {
+  content: "\e647";
+}
+
+.uniui-cloud-upload-filled:before {
+  content: "\e648";
+}
+
+.uniui-redo:before {
+  content: "\e64a";
+}
+
+.uniui-images-filled:before {
+  content: "\e64b";
+}
+
+.uniui-undo-filled:before {
+  content: "\e64c";
+}
+
+.uniui-more:before {
+  content: "\e64d";
+}
+
+.uniui-more-filled:before {
+  content: "\e64e";
+}
+
+.uniui-undo:before {
+  content: "\e64f";
+}
+
+.uniui-images:before {
+  content: "\e650";
+}
+
+.uniui-paperclip:before {
+  content: "\e652";
+}
+
+.uniui-settings:before {
+  content: "\e653";
+}
+
+.uniui-search:before {
+  content: "\e654";
+}
+
+.uniui-redo-filled:before {
+  content: "\e655";
+}
+
+.uniui-list:before {
+  content: "\e644";
+}
+
+.uniui-mail-open-filled:before {
+  content: "\e63a";
+}
+
+.uniui-hand-down-filled:before {
+  content: "\e63c";
+}
+
+.uniui-hand-down:before {
+  content: "\e63d";
+}
+
+.uniui-hand-up-filled:before {
+  content: "\e63e";
+}
+
+.uniui-hand-up:before {
+  content: "\e63f";
+}
+
+.uniui-heart-filled:before {
+  content: "\e641";
+}
+
+.uniui-mail-open:before {
+  content: "\e643";
+}
+
+.uniui-heart:before {
+  content: "\e639";
+}
+
+.uniui-loop:before {
+  content: "\e633";
+}
+
+.uniui-pulldown:before {
+  content: "\e632";
+}
+
+.uniui-scan:before {
+  content: "\e62a";
+}
+
+.uniui-bars:before {
+  content: "\e627";
+}
+
+.uniui-cart-filled:before {
+  content: "\e629";
+}
+
+.uniui-checkbox:before {
+  content: "\e62b";
+}
+
+.uniui-checkbox-filled:before {
+  content: "\e62c";
+}
+
+.uniui-shop:before {
+  content: "\e62f";
+}
+
+.uniui-headphones:before {
+  content: "\e630";
+}
+
+.uniui-cart:before {
+  content: "\e631";
+}

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


+ 86 - 0
uni_modules/uni-icons/package.json

xqd
@@ -0,0 +1,86 @@
+{
+  "id": "uni-icons",
+  "displayName": "uni-icons 图标",
+  "version": "1.3.5",
+  "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "icon",
+    "图标"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.2.14"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 8 - 0
uni_modules/uni-icons/readme.md

xqd
@@ -0,0 +1,8 @@
+## Icons 图标
+> **组件名:uni-icons**
+> 代码块: `uIcons`
+
+用于展示 icons 图标 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 8 - 0
uni_modules/uni-scss/changelog.md

xqd
@@ -0,0 +1,8 @@
+## 1.0.3(2022-01-21)
+- 优化 组件示例
+## 1.0.2(2021-11-22)
+- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题
+## 1.0.1(2021-11-22)
+- 修复 vue3中scss语法兼容问题
+## 1.0.0(2021-11-18)
+- init

+ 1 - 0
uni_modules/uni-scss/index.scss

xqd
@@ -0,0 +1 @@
+@import './styles/index.scss';

+ 82 - 0
uni_modules/uni-scss/package.json

xqd
@@ -0,0 +1,82 @@
+{
+  "id": "uni-scss",
+  "displayName": "uni-scss 辅助样式",
+  "version": "1.0.3",
+  "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。",
+  "keywords": [
+    "uni-scss",
+    "uni-ui",
+    "辅助样式"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "category": [
+        "JS SDK",
+        "通用 SDK"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "n",
+          "联盟": "n"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 4 - 0
uni_modules/uni-scss/readme.md

xqd
@@ -0,0 +1,4 @@
+`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 7 - 0
uni_modules/uni-scss/styles/index.scss

xqd
@@ -0,0 +1,7 @@
+@import './setting/_variables.scss';
+@import './setting/_border.scss';
+@import './setting/_color.scss';
+@import './setting/_space.scss';
+@import './setting/_radius.scss';
+@import './setting/_text.scss';
+@import './setting/_styles.scss';

+ 3 - 0
uni_modules/uni-scss/styles/setting/_border.scss

xqd
@@ -0,0 +1,3 @@
+.uni-border {
+	border: 1px $uni-border-1 solid;
+}

+ 66 - 0
uni_modules/uni-scss/styles/setting/_color.scss

xqd
@@ -0,0 +1,66 @@
+
+// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐
+// @mixin get-styles($k,$c) {
+// 	@if $k == size or $k == weight{
+// 		font-#{$k}:#{$c}
+// 	}@else{
+// 		#{$k}:#{$c}
+// 	}
+// }
+$uni-ui-color:(
+	// 主色
+	primary: $uni-primary,
+	primary-disable: $uni-primary-disable,
+	primary-light: $uni-primary-light,
+	// 辅助色
+	success: $uni-success,
+	success-disable: $uni-success-disable,
+	success-light: $uni-success-light,
+	warning: $uni-warning,
+	warning-disable: $uni-warning-disable,
+	warning-light: $uni-warning-light,
+	error: $uni-error,
+	error-disable: $uni-error-disable,
+	error-light: $uni-error-light,
+	info: $uni-info,
+	info-disable: $uni-info-disable,
+	info-light: $uni-info-light,
+	// 中性色
+	main-color: $uni-main-color,
+	base-color: $uni-base-color,
+	secondary-color: $uni-secondary-color,
+	extra-color: $uni-extra-color,
+	// 背景色
+	bg-color: $uni-bg-color,
+	// 边框颜色
+	border-1: $uni-border-1,
+	border-2: $uni-border-2,
+	border-3: $uni-border-3,
+	border-4: $uni-border-4,
+	// 黑色
+	black:$uni-black,
+	// 白色
+	white:$uni-white,
+	// 透明
+	transparent:$uni-transparent
+) !default;
+@each $key, $child in $uni-ui-color {
+	.uni-#{"" + $key} {
+		color: $child;
+	}
+	.uni-#{"" + $key}-bg {
+		background-color: $child;
+	}
+}
+.uni-shadow-sm {
+	box-shadow: $uni-shadow-sm;
+}
+.uni-shadow-base {
+	box-shadow: $uni-shadow-base;
+}
+.uni-shadow-lg {
+	box-shadow: $uni-shadow-lg;
+}
+.uni-mask {
+	background-color:$uni-mask;
+}

+ 55 - 0
uni_modules/uni-scss/styles/setting/_radius.scss

xqd
@@ -0,0 +1,55 @@
+@mixin radius($r,$d:null ,$important: false){
+  $radius-value:map-get($uni-radius, $r) if($important, !important, null);
+  // Key exists within the $uni-radius variable
+  @if (map-has-key($uni-radius, $r) and  $d){
+		@if $d == t {
+				border-top-left-radius:$radius-value;
+				border-top-right-radius:$radius-value;
+		}@else if $d == r {
+				border-top-right-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == b {
+				border-bottom-left-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == l {
+				border-top-left-radius:$radius-value;
+				border-bottom-left-radius:$radius-value;
+		}@else if $d == tl {
+				border-top-left-radius:$radius-value;
+		}@else if $d == tr {
+				border-top-right-radius:$radius-value;
+		}@else if $d == br {
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == bl {
+				border-bottom-left-radius:$radius-value;
+		}
+  }@else{
+		border-radius:$radius-value;
+  }
+}
+
+@each $key, $child in $uni-radius {
+	@if($key){
+		.uni-radius-#{"" + $key} {
+				@include radius($key)
+		}
+	}@else{
+		.uni-radius {
+				@include radius($key)
+		}
+	}
+}
+
+@each $direction in t, r, b, l,tl, tr, br, bl {
+	@each $key, $child in $uni-radius {
+		@if($key){
+			.uni-radius-#{"" + $direction}-#{"" + $key} {
+				@include radius($key,$direction,false)
+			}
+		}@else{
+			.uni-radius-#{$direction} {
+				@include radius($key,$direction,false)
+			}
+		}
+	}
+}

+ 56 - 0
uni_modules/uni-scss/styles/setting/_space.scss

xqd
@@ -0,0 +1,56 @@
+
+@mixin fn($space,$direction,$size,$n) {
+	@if $n {
+		#{$space}-#{$direction}: #{$size*$uni-space-root}px
+	} @else {
+		 #{$space}-#{$direction}: #{-$size*$uni-space-root}px
+	}
+}
+@mixin get-styles($direction,$i,$space,$n){
+	@if $direction == t {
+		@include fn($space, top,$i,$n);
+	} 
+	@if $direction == r {
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == b {
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == l {
+	 @include fn($space, left,$i,$n);
+	} 
+	@if $direction == x {
+		@include fn($space, left,$i,$n);
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == y {
+		@include fn($space, top,$i,$n);
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == a {
+		@if $n {
+			#{$space}:#{$i*$uni-space-root}px;
+		} @else {
+			#{$space}:#{-$i*$uni-space-root}px;
+		}
+	} 
+}
+
+@each $orientation in m,p {
+	$space: margin;
+	@if $orientation == m {
+		$space: margin;
+	} @else {
+		$space: padding;
+	}
+	@for $i from 0 through 16 {
+		@each $direction in t, r, b, l, x, y, a {
+			.uni-#{$orientation}#{$direction}-#{$i} { 
+				@include  get-styles($direction,$i,$space,true);
+			} 
+			.uni-#{$orientation}#{$direction}-n#{$i} { 
+				@include  get-styles($direction,$i,$space,false);
+			}
+		}
+	}
+}

+ 167 - 0
uni_modules/uni-scss/styles/setting/_styles.scss

xqd
@@ -0,0 +1,167 @@
+/* #ifndef APP-NVUE */
+
+$-color-white:#fff;
+$-color-black:#000;
+@mixin base-style($color) {
+	color: #fff;
+	background-color: $color;
+	border-color: mix($-color-black, $color, 8%);
+	&:not([hover-class]):active {
+		background: mix($-color-black, $color, 10%);
+		border-color: mix($-color-black, $color, 20%);
+		color: $-color-white;
+		outline: none;
+	}
+}
+@mixin is-color($color) {
+	@include base-style($color);
+	&[loading] {
+		@include base-style($color);
+		&::before {
+			margin-right:5px;
+		}
+	}
+	&[disabled] {
+	  &,
+		&[loading],
+	  &:not([hover-class]):active {
+	    color: $-color-white;
+			border-color: mix(darken($color,10%), $-color-white);
+	    background-color: mix($color, $-color-white);
+	  }
+	}
+
+}
+@mixin base-plain-style($color) {
+	color:$color;
+	background-color: mix($-color-white, $color, 90%);
+	border-color: mix($-color-white, $color, 70%);
+	&:not([hover-class]):active {
+	  background: mix($-color-white, $color, 80%);
+	  color: $color;
+	  outline: none;
+		border-color: mix($-color-white, $color, 50%);
+	}
+}
+@mixin is-plain($color){
+	&[plain] {
+		@include base-plain-style($color);
+		&[loading] {
+			@include base-plain-style($color);
+			&::before {
+				margin-right:5px;
+			}
+		}
+		&[disabled] {
+		  &,
+		  &:active {
+		    color: mix($-color-white, $color, 40%);
+		    background-color: mix($-color-white, $color, 90%);
+				border-color: mix($-color-white, $color, 80%);
+		  }
+		}
+	}
+}
+
+
+.uni-btn {
+	margin: 5px;
+	color: #393939;
+	border:1px solid #ccc;
+	font-size: 16px;
+	font-weight: 200;
+	background-color: #F9F9F9;
+	// TODO 暂时处理边框隐藏一边的问题
+	overflow: visible;
+	&::after{
+		border: none;
+	}
+
+	&:not([type]),&[type=default] {
+		color: #999;
+		&[loading] {
+			background: none;
+			&::before {
+				margin-right:5px;
+			}
+		}
+
+
+
+		&[disabled]{
+			color: mix($-color-white, #999, 60%);
+		  &,
+			&[loading],
+		  &:active {
+				color: mix($-color-white, #999, 60%);
+		    background-color: mix($-color-white,$-color-black , 98%);
+				border-color: mix($-color-white,  #999, 85%);
+		  }
+		}
+
+		&[plain] {
+			color: #999;
+			background: none;
+			border-color: $uni-border-1;
+			&:not([hover-class]):active {
+				background: none;
+			  color: mix($-color-white, $-color-black, 80%);
+				border-color: mix($-color-white, $-color-black, 90%);
+			  outline: none;
+			}
+			&[disabled]{
+			  &,
+				&[loading],
+			  &:active {
+			    background: none;
+					color: mix($-color-white, #999, 60%);
+					border-color: mix($-color-white,  #999, 85%);
+			  }
+			}
+		}
+	}
+
+	&:not([hover-class]):active {
+	  color: mix($-color-white, $-color-black, 50%);
+	}
+
+	&[size=mini] {
+		font-size: 16px;
+		font-weight: 200;
+		border-radius: 8px;
+	}
+
+
+
+	&.uni-btn-small {
+		font-size: 14px;
+	}
+	&.uni-btn-mini {
+		font-size: 12px;
+	}
+
+	&.uni-btn-radius {
+		border-radius: 999px;
+	}
+	&[type=primary] {
+		@include is-color($uni-primary);
+		@include is-plain($uni-primary)
+	}
+	&[type=success] {
+		@include is-color($uni-success);
+		@include is-plain($uni-success)
+	}
+	&[type=error] {
+		@include is-color($uni-error);
+		@include is-plain($uni-error)
+	}
+	&[type=warning] {
+		@include is-color($uni-warning);
+		@include is-plain($uni-warning)
+	}
+	&[type=info] {
+		@include is-color($uni-info);
+		@include is-plain($uni-info)
+	}
+}
+/* #endif */

+ 24 - 0
uni_modules/uni-scss/styles/setting/_text.scss

xqd
@@ -0,0 +1,24 @@
+@mixin get-styles($k,$c) {
+	@if $k == size or $k == weight{
+		font-#{$k}:#{$c}
+	}@else{
+		#{$k}:#{$c}
+	}
+}
+
+@each $key, $child in $uni-headings {
+	/* #ifndef APP-NVUE */
+	.uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	.container .uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+}

+ 146 - 0
uni_modules/uni-scss/styles/setting/_variables.scss

xqd
@@ -0,0 +1,146 @@
+// @use "sass:math";
+@import  '../tools/functions.scss';
+// 间距基础倍数
+$uni-space-root: 2 !default;
+// 边框半径默认值
+$uni-radius-root:5px !default;
+$uni-radius: () !default;
+// 边框半径断点
+$uni-radius: map-deep-merge(
+  (
+    0: 0,
+		// TODO 当前版本暂时不支持 sm 属性
+    // 'sm': math.div($uni-radius-root, 2),
+    null: $uni-radius-root,
+    'lg': $uni-radius-root * 2,
+    'xl': $uni-radius-root * 6,
+    'pill': 9999px,
+    'circle': 50%
+  ),
+  $uni-radius
+);
+// 字体家族
+$body-font-family: 'Roboto', sans-serif !default;
+// 文本
+$heading-font-family: $body-font-family !default;
+$uni-headings: () !default;
+$letterSpacing: -0.01562em;
+$uni-headings: map-deep-merge(
+  (
+    'h1': (
+      size: 32px,
+			weight: 300,
+			line-height: 50px,
+			// letter-spacing:-0.01562em
+    ),
+    'h2': (
+      size: 28px,
+      weight: 300,
+      line-height: 40px,
+      // letter-spacing: -0.00833em
+    ),
+    'h3': (
+      size: 24px,
+      weight: 400,
+      line-height: 32px,
+      // letter-spacing: normal
+    ),
+    'h4': (
+      size: 20px,
+      weight: 400,
+      line-height: 30px,
+      // letter-spacing: 0.00735em
+    ),
+    'h5': (
+      size: 16px,
+      weight: 400,
+      line-height: 24px,
+      // letter-spacing: normal
+    ),
+    'h6': (
+      size: 14px,
+      weight: 500,
+      line-height: 18px,
+      // letter-spacing: 0.0125em
+    ),
+    'subtitle': (
+      size: 12px,
+      weight: 400,
+      line-height: 20px,
+      // letter-spacing: 0.00937em
+    ),
+    'body': (
+      font-size: 14px,
+			font-weight: 400,
+			line-height: 22px,
+			// letter-spacing: 0.03125em
+    ),
+    'caption': (
+      'size': 12px,
+      'weight': 400,
+      'line-height': 20px,
+      // 'letter-spacing': 0.03333em,
+      // 'text-transform': false
+    )
+  ),
+  $uni-headings
+);
+
+
+
+// 主色
+$uni-primary: #2979ff !default;
+$uni-primary-disable:lighten($uni-primary,20%) !default;
+$uni-primary-light: lighten($uni-primary,25%) !default;
+
+// 辅助色
+// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
+$uni-success: #18bc37 !default;
+$uni-success-disable:lighten($uni-success,20%) !default;
+$uni-success-light: lighten($uni-success,25%) !default;
+
+$uni-warning: #f3a73f !default;
+$uni-warning-disable:lighten($uni-warning,20%) !default;
+$uni-warning-light: lighten($uni-warning,25%) !default;
+
+$uni-error: #e43d33 !default;
+$uni-error-disable:lighten($uni-error,20%) !default;
+$uni-error-light: lighten($uni-error,25%) !default;
+
+$uni-info: #8f939c !default;
+$uni-info-disable:lighten($uni-info,20%) !default;
+$uni-info-light: lighten($uni-info,25%) !default;
+
+// 中性色
+// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
+$uni-main-color: #3a3a3a !default; 			// 主要文字
+$uni-base-color: #6a6a6a !default;			// 常规文字
+$uni-secondary-color: #909399 !default;	// 次要文字
+$uni-extra-color: #c7c7c7 !default;			// 辅助说明
+
+// 边框颜色
+$uni-border-1: #F0F0F0 !default;
+$uni-border-2: #EDEDED !default;
+$uni-border-3: #DCDCDC !default;
+$uni-border-4: #B9B9B9 !default;
+
+// 常规色
+$uni-black: #000000 !default;
+$uni-white: #ffffff !default;
+$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
+
+// 背景色
+$uni-bg-color: #f7f7f7 !default;
+
+/* 水平间距 */
+$uni-spacing-sm: 8px !default;
+$uni-spacing-base: 15px !default;
+$uni-spacing-lg: 30px !default;
+
+// 阴影
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
+
+// 蒙版
+$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;

+ 19 - 0
uni_modules/uni-scss/styles/tools/functions.scss

xqd
@@ -0,0 +1,19 @@
+// 合并 map
+@function map-deep-merge($parent-map, $child-map){
+	$result: $parent-map;
+	@each $key, $child in $child-map {
+		$parent-has-key: map-has-key($result, $key);
+		$parent-value: map-get($result, $key);
+		$parent-type: type-of($parent-value);
+		$child-type: type-of($child);
+		$parent-is-map: $parent-type == map;
+		$child-is-map: $child-type == map;
+			
+		@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
+			$result: map-merge($result, ( $key: $child ));
+		}@else {
+			$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
+		}
+	}
+	@return $result;
+};

+ 31 - 0
uni_modules/uni-scss/theme.scss

xqd
@@ -0,0 +1,31 @@
+// 间距基础倍数
+$uni-space-root: 2;
+// 边框半径默认值
+$uni-radius-root:5px;
+// 主色
+$uni-primary: #2979ff;
+// 辅助色
+$uni-success: #4cd964;
+// 警告色
+$uni-warning: #f0ad4e;
+// 错误色
+$uni-error: #dd524d;
+// 描述色
+$uni-info: #909399;
+// 中性色
+$uni-main-color: #303133;
+$uni-base-color: #606266;
+$uni-secondary-color: #909399;
+$uni-extra-color: #C0C4CC;
+// 背景色
+$uni-bg-color: #f5f5f5;
+// 边框颜色
+$uni-border-1: #DCDFE6;
+$uni-border-2: #E4E7ED;
+$uni-border-3: #EBEEF5;
+$uni-border-4: #F2F6FC;
+
+// 常规色
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);

+ 62 - 0
uni_modules/uni-scss/variables.scss

xqd
@@ -0,0 +1,62 @@
+@import './styles/setting/_variables.scss';
+// 间距基础倍数
+$uni-space-root: 2;
+// 边框半径默认值
+$uni-radius-root:5px;
+
+// 主色
+$uni-primary: #2979ff;
+$uni-primary-disable:mix(#fff,$uni-primary,50%);
+$uni-primary-light: mix(#fff,$uni-primary,80%);
+
+// 辅助色
+// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
+$uni-success: #18bc37;
+$uni-success-disable:mix(#fff,$uni-success,50%);
+$uni-success-light: mix(#fff,$uni-success,80%);
+
+$uni-warning: #f3a73f;
+$uni-warning-disable:mix(#fff,$uni-warning,50%);
+$uni-warning-light: mix(#fff,$uni-warning,80%);
+
+$uni-error: #e43d33;
+$uni-error-disable:mix(#fff,$uni-error,50%);
+$uni-error-light: mix(#fff,$uni-error,80%);
+
+$uni-info: #8f939c;
+$uni-info-disable:mix(#fff,$uni-info,50%);
+$uni-info-light: mix(#fff,$uni-info,80%);
+
+// 中性色
+// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
+$uni-main-color: #3a3a3a; 			// 主要文字
+$uni-base-color: #6a6a6a;			// 常规文字
+$uni-secondary-color: #909399;	// 次要文字
+$uni-extra-color: #c7c7c7;			// 辅助说明
+
+// 边框颜色
+$uni-border-1: #F0F0F0;
+$uni-border-2: #EDEDED;
+$uni-border-3: #DCDCDC;
+$uni-border-4: #B9B9B9;
+
+// 常规色
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
+
+// 背景色
+$uni-bg-color: #f7f7f7;
+
+/* 水平间距 */
+$uni-spacing-sm: 8px;
+$uni-spacing-base: 15px;
+$uni-spacing-lg: 30px;
+
+// 阴影
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
+
+// 蒙版
+$uni-mask: rgba($color: #000000, $alpha: 0.4);

+ 15 - 0
utils/auth.js

xqd
@@ -0,0 +1,15 @@
+import Cache from './cache'
+
+const TokenKey = 'auth_token'
+
+export function getToken() {
+  return Cache.get(TokenKey)
+}
+
+export function setToken(token) {
+  return Cache.set(TokenKey, token)
+}
+
+export function removeToken() {
+  return Cache.remove(TokenKey)
+}

+ 29 - 0
utils/cache.js

xqd
@@ -0,0 +1,29 @@
+function set(key, value) {
+  return uni.setStorageSync(key, JSON.stringify(value))
+}
+
+function get(key) {
+  try {
+    const result = uni.getStorageSync(key)
+    if (result) {
+      return JSON.parse(result)
+    }
+  } catch (e) {
+    return null
+  }
+}
+
+function remove(key) {
+  return uni.removeStorageSync(key)
+}
+
+function clear(key) {
+  return uni.clearStorageSync(key)
+}
+
+export default {
+  get,
+  set,
+  remove,
+  clear
+}

+ 26 - 0
utils/constant/constant.js

xqd
@@ -0,0 +1,26 @@
+let ress = []
+let res1 = []
+for (let i = 0; i < 24; i++) {
+	if (i < 10) {
+		i = '0' + i
+	} else {
+		i = "" + i
+	}
+	res1.push(i)
+}
+let res2 = []
+for (let i = 0; i < 60; i++) {
+	if (i < 10) {
+		i = '0' + i
+	} else {
+		i = "" + i
+	}
+	res2.push(i)
+}
+ress[0] = res1
+ress[1] = res2
+ress[2] = res2
+
+
+
+export const constant_time = ress

+ 174 - 0
utils/download.js

xqd
@@ -0,0 +1,174 @@
+(function(root, factory) {
+	if (typeof define === 'function' && define.amd) {
+		// AMD. Register as an anonymous module.
+		define([], factory);
+	} else if (typeof exports === 'object') {
+		// Node. Does not work with strict CommonJS, but
+		// only CommonJS-like environments that support module.exports,
+		// like Node.
+		module.exports = factory();
+	} else {
+		// Browser globals (root is window)
+		root.download = factory();
+	}
+}(this, function() {
+
+	return function download(data, strFileName, strMimeType) {
+
+		var self = window, // this script is only for browsers anyway...
+			defaultMime = "application/octet-stream", // this default mime also triggers iframe downloads
+			mimeType = strMimeType || defaultMime,
+			payload = data,
+			url = !strFileName && !strMimeType && payload,
+			anchor = document.createElement("a"),
+			toString = function(a) {
+				return String(a);
+			},
+			myBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString),
+			fileName = strFileName || "download",
+			blob,
+			reader;
+		myBlob = myBlob.call ? myBlob.bind(self) : Blob;
+
+		if (String(this) ===
+			"true") { //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback
+			payload = [payload, mimeType];
+			mimeType = payload[0];
+			payload = payload[1];
+		}
+
+
+		if (url && url.length <
+			2048) { // if no filename and no mime, assume a url was passed as the only argument
+			fileName = url.split("/").pop().split("?")[0];
+			anchor.href = url; // assign href prop to temp anchor
+			if (anchor.href.indexOf(url) !== -
+				1) { // if the browser determines that it's a potentially valid url path:
+				var ajax = new XMLHttpRequest();
+				ajax.open("GET", url, true);
+				ajax.responseType = 'blob';
+				ajax.onload = function(e) {
+					download(e.target.response, fileName, defaultMime);
+				};
+				setTimeout(function() {
+					ajax.send();
+				}, 0); // allows setting custom ajax headers using the return:
+				return ajax;
+			} // end if valid url?
+		} // end if url?
+
+
+		//go ahead and download dataURLs right away
+		if (/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)) {
+
+			if (payload.length > (1024 * 1024 * 1.999) && myBlob !== toString) {
+				payload = dataUrlToBlob(payload);
+				mimeType = payload.type || defaultMime;
+			} else {
+				return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:
+					navigator.msSaveBlob(dataUrlToBlob(payload), fileName) :
+					saver(payload); // everyone else can save dataURLs un-processed
+			}
+
+		} //end if dataURL passed?
+
+		blob = payload instanceof myBlob ?
+			payload :
+			new myBlob([payload], {
+				type: mimeType
+			});
+
+
+		function dataUrlToBlob(strUrl) {
+			var parts = strUrl.split(/[:;,]/),
+				type = parts[1],
+				decoder = parts[2] == "base64" ? atob : decodeURIComponent,
+				binData = decoder(parts.pop()),
+				mx = binData.length,
+				i = 0,
+				uiArr = new Uint8Array(mx);
+
+			for (i; i < mx; ++i) uiArr[i] = binData.charCodeAt(i);
+
+			return new myBlob([uiArr], {
+				type: type
+			});
+		}
+
+		function saver(url, winMode) {
+
+			if ('download' in anchor) { //html5 A[download]
+				anchor.href = url;
+				anchor.setAttribute("download", fileName);
+				anchor.className = "download-js-link";
+				anchor.innerHTML = "downloading...";
+				anchor.style.display = "none";
+				document.body.appendChild(anchor);
+				setTimeout(function() {
+					anchor.click();
+					document.body.removeChild(anchor);
+					if (winMode === true) {
+						setTimeout(function() {
+							self.URL.revokeObjectURL(anchor.href);
+						}, 250);
+					}
+				}, 66);
+				return true;
+			}
+
+			// handle non-a[download] safari as best we can:
+			if (/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent)) {
+				url = url.replace(/^data:([\w\/\-\+]+)/, defaultMime);
+				if (!window.open(url)) { // popup blocked, offer direct download:
+					if (confirm(
+							"Displaying New Document\n\nUse Save As... to download, then click back to return to this page."
+							)) {
+						location.href = url;
+					}
+				}
+				return true;
+			}
+
+			//do iframe dataURL download (old ch+FF):
+			var f = document.createElement("iframe");
+			document.body.appendChild(f);
+
+			if (!winMode) { // force a mime that will download:
+				url = "data:" + url.replace(/^data:([\w\/\-\+]+)/, defaultMime);
+			}
+			f.src = url;
+			setTimeout(function() {
+				document.body.removeChild(f);
+			}, 333);
+
+		} //end saver
+
+
+
+
+		if (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)
+			return navigator.msSaveBlob(blob, fileName);
+		}
+
+		if (self.URL) { // simple fast and modern way using Blob and URL:
+			saver(self.URL.createObjectURL(blob), true);
+		} else {
+			// handle non-Blob()+non-URL browsers:
+			if (typeof blob === "string" || blob.constructor === toString) {
+				try {
+					return saver("data:" + mimeType + ";base64," + self.btoa(blob));
+				} catch (y) {
+					return saver("data:" + mimeType + "," + encodeURIComponent(blob));
+				}
+			}
+
+			// Blob but not URL support:
+			reader = new FileReader();
+			reader.onload = function(e) {
+				saver(this.result);
+			};
+			reader.readAsDataURL(blob);
+		}
+		return true;
+	}; /* end download() */
+}));

+ 41 - 0
utils/download3.js

xqd
@@ -0,0 +1,41 @@
+// 仅支持视频下载和图片下载
+/**
+ * 
+ * @param {文件路径} url 
+ * @param {文件名称} name 
+ */
+export function downLoad3(url, name, type) {
+	var xhr = new XMLHttpRequest();
+	xhr.open('GET', url, true);
+	xhr.responseType = 'arraybuffer'; // 返回类型blob
+	xhr.onload = function() {
+		if (xhr.readyState === 4 && xhr.status === 200) {
+			let blob = this.response;
+			console.log(blob);
+			// 转换一个blob链接
+			// 注: URL.createObjectURL() 静态方法会创建一个 DOMString(DOMString 是一个UTF-16字符串),
+			// 其中包含一个表示参数中给出的对象的URL。这个URL的生命周期和创建它的窗口中的document绑定
+
+
+			let downLoadUrl = window.URL.createObjectURL(new Blob([blob], {
+				type: type
+			}));
+			// 视频的type是video/mp4,图片是image/jpeg
+			// 01.创建a标签
+			let a = document.createElement('a');
+			// 02.给a标签的属性download设定名称
+			a.download = name;
+			// 03.设置下载的文件名
+			a.href = downLoadUrl;
+			// 04.对a标签做一个隐藏处理
+			a.style.display = 'none';
+			// 05.向文档中添加a标签
+			document.body.appendChild(a);
+			// 06.启动点击事件
+			a.click();
+			// 07.下载完毕删除此标签
+			a.remove();
+		};
+	};
+	xhr.send()
+}

+ 33 - 0
utils/request/index.js

xqd
@@ -0,0 +1,33 @@
+// 引入配置
+import config from '@/common/config.js'
+// import store from '@/store'
+uni.$u.http.setConfig((config) => {
+	console.log('到config配置');
+	/* config 为默认全局配置 */
+
+	// 数趣Ai项目接口根路径
+	// config.baseURL = 'https://www.ai5566.top/api/'
+	// 本地
+	config.baseURL = 'http://192.168.31.102/'
+	// 线上
+	config.baseURL = 'http://t3.9026.com/'
+
+
+	config.header = {
+		// 'Content-Type': 'application/x-www-form-urlencoded',
+		'Content-type': 'application/json',
+		'X-Requested-With': 'XMLHttpRequest',
+		'Accept': 'application/vnd.api.v1+json'
+	}
+	// if (store.getters.token) {
+	if (true) {
+		// config.header['Authorization'] = store.getters.token
+	}
+
+	return config
+})
+
+module.exports = (vm) => {
+	require('./requestInterceptors')(vm)
+	require('./responseInterceptors')(vm)
+}

+ 25 - 0
utils/request/requestInterceptors.js

xqd
@@ -0,0 +1,25 @@
+import {
+	getToken
+} from '../auth'
+
+/**
+ * 请求拦截
+ * @param {Object} http
+ */
+// import store from '@/store'
+module.exports = vm => {
+
+	uni.$u.http.interceptors.request.use(
+		config => { // 可使用async await 做异步操作
+			config.data = config.data || {}
+			if (uni.getStorageSync('token')) {
+				// config.header['Authorization'] = getToken()
+				config.header['Authorization'] = uni.getStorageSync('token')
+				// console.log('请求封装的token', uni.getStorageSync('token'));
+			}
+			return config
+		}, (config) => { // 可使用async await 做异步操作
+			console.log(config);
+			return Promise.reject(config)
+		})
+}

+ 53 - 0
utils/request/responseInterceptors.js

xqd
@@ -0,0 +1,53 @@
+/**
+ * 响应拦截
+ * @param {Object} http 
+ */
+module.exports = (vm) => {
+	uni.$u.http.interceptors.response.use((response) => {
+		/* 对响应成功做点什么 可使用async await 做异步操作*/
+		// uni.hideLoading()
+		const data = response.data
+		// 自定义参数
+		const custom = response.config?.custom
+		// if (data.code == 0) {
+		// 	return data || {}
+		// } else { // 服务端返回的状态码不等于200,则reject()
+		// 	// 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示
+		// 	if (custom.toast !== false) {
+		// 		uni.$u.toast(data.msg)
+		// 	}
+		// 	// 如果需要catch返回,则进行reject
+		// 	if (custom?.catch) {
+		// 		return Promise.reject(data)
+		// 	} else {
+		// 		// 否则返回一个pending中的promise
+		// 		return new Promise(() => {})
+		// 	}
+		// }
+		return data || {}
+
+	}, (response) => {
+		/*  对响应错误做点什么 (statusCode !== 200)*/
+		let statusCode = response.statusCode
+		if (statusCode == 401) {
+			console.log('当前接口401----------------------------');
+			uni.clearStorageSync()
+			uni.redirectTo({
+				url: '/pages/user/signin'
+			})
+		} else if (statusCode == 403 && response.data.code == 403 && response.data.msg == '您的账号已被拉黑!') {
+			uni.setStorageSync('hasForbidden', {
+				status: 0,
+				msg: response.data.msg
+			})
+			return uni.showToast({
+				title: response.data.msg,
+				icon: 'none'
+			});
+
+		} else if (statusCode == 500) {
+			uni.$u.toast('接口报错')
+		}
+		return Promise.reject(response)
+	})
+}