瀏覽代碼

Your commit message

yuanyiming 1 年之前
父節點
當前提交
7a13f71c27
共有 100 個文件被更改,包括 5669 次插入964 次删除
  1. 2 0
      App.vue
  2. 5 3
      components/detailBlock/detailBlock.vue
  3. 6 10
      components/statusBar/statusBar.vue
  4. 113 0
      components/tabBar/tabBar.vue
  5. 154 89
      components/teaching-case/teaching-case.vue
  6. 2 2
      components/viewX-Case/viewX-Case.vue
  7. 31 11
      pages.json
  8. 15 11
      pages/activityDetail/activityDetail.vue
  9. 69 12
      pages/activityList/activityList.vue
  10. 205 82
      pages/activityPage/activityPage.vue
  11. 100 74
      pages/dy/dy.vue
  12. 60 43
      pages/hd/hd.vue
  13. 2 2
      pages/hdxx/hdxx.vue
  14. 172 97
      pages/index/index.vue
  15. 58 38
      pages/jys/jys.vue
  16. 2 2
      pages/login/login.vue
  17. 1 1
      pages/login_two/login_two.vue
  18. 52 47
      pages/message/message.vue
  19. 95 0
      pages/messageDy/messageDy.vue
  20. 112 0
      pages/messageSystem/messageSystem.vue
  21. 15 14
      pages/mine/mine.vue
  22. 73 10
      pages/mineActive/mineActive.vue
  23. 91 19
      pages/mineClass/mineClass.vue
  24. 61 7
      pages/mineCollect/mineCollect.vue
  25. 16 14
      pages/mineEdit/mineEdit.vue
  26. 314 158
      pages/mineSubscribe/mineSubscribe.vue
  27. 132 34
      pages/publish/publish.vue
  28. 332 156
      pages/resource/resource.vue
  29. 46 21
      pages/teachingDetail/teachingDetail.vue
  30. 62 7
      pages/teachingList/teachingList.vue
  31. 二進制
      static/mine/Collect.png
  32. 二進制
      static/mine/Subscribe.png
  33. 二進制
      static/mine/Subscribe_gray.png
  34. 二進制
      static/mine/help.png
  35. 二進制
      static/mine/myClass.png
  36. 二進制
      static/mine/myactive.png
  37. 二進制
      static/tabBarIcon/activity-selected.png
  38. 二進制
      static/tabBarIcon/activity.png
  39. 二進制
      static/tabBarIcon/home-selected.png
  40. 二進制
      static/tabBarIcon/home.png
  41. 二進制
      static/tabBarIcon/message-selected.png
  42. 二進制
      static/tabBarIcon/message.png
  43. 二進制
      static/tabBarIcon/mine-selected.png
  44. 二進制
      static/tabBarIcon/mine.png
  45. 二進制
      static/tabBarIcon/resource-selected.png
  46. 二進制
      static/tabBarIcon/resource.png
  47. 二進制
      static/tabbar/Fill 1.png
  48. 二進制
      static/tabbar/Fill 2.png
  49. 二進制
      static/tabbar/hd.png
  50. 二進制
      static/tabbar/hd2.png
  51. 二進制
      static/tabbar/wd.png
  52. 二進制
      static/tabbar/wd2.png
  53. 二進制
      static/tabbar/xx.png
  54. 二進制
      static/tabbar/xx2.png
  55. 二進制
      static/tabbar/zyk.png
  56. 二進制
      static/tabbar/zyk2.png
  57. 二進制
      static/yym/Ellipse 10.png
  58. 二進制
      static/yym/Star 1 (Stroke) (2).png
  59. 二進制
      static/yym/Vector (Stroke) (1).png
  60. 二進制
      static/yym/Vector (Stroke) (2).png
  61. 二進制
      static/yym/jia.png
  62. 二進制
      static/yym/union.png
  63. 7 0
      uni_modules/uv-badge/changelog.md
  64. 73 0
      uni_modules/uv-badge/components/uv-badge/props.js
  65. 176 0
      uni_modules/uv-badge/components/uv-badge/uv-badge.vue
  66. 87 0
      uni_modules/uv-badge/package.json
  67. 11 0
      uni_modules/uv-badge/readme.md
  68. 25 0
      uni_modules/uv-icon/changelog.md
  69. 160 0
      uni_modules/uv-icon/components/uv-icon/icons.js
  70. 90 0
      uni_modules/uv-icon/components/uv-icon/props.js
  71. 226 0
      uni_modules/uv-icon/components/uv-icon/uv-icon.vue
  72. 二進制
      uni_modules/uv-icon/components/uv-icon/uvicons.ttf
  73. 83 0
      uni_modules/uv-icon/package.json
  74. 15 0
      uni_modules/uv-icon/readme.md
  75. 11 0
      uni_modules/uv-safe-bottom/changelog.md
  76. 67 0
      uni_modules/uv-safe-bottom/components/uv-safe-bottom/uv-safe-bottom.vue
  77. 87 0
      uni_modules/uv-safe-bottom/package.json
  78. 11 0
      uni_modules/uv-safe-bottom/readme.md
  79. 14 0
      uni_modules/uv-tabbar/changelog.md
  80. 40 0
      uni_modules/uv-tabbar/components/uv-tabbar-item/props.js
  81. 146 0
      uni_modules/uv-tabbar/components/uv-tabbar-item/uv-tabbar-item.vue
  82. 50 0
      uni_modules/uv-tabbar/components/uv-tabbar/props.js
  83. 146 0
      uni_modules/uv-tabbar/components/uv-tabbar/uv-tabbar.vue
  84. 90 0
      uni_modules/uv-tabbar/package.json
  85. 21 0
      uni_modules/uv-tabbar/readme.md
  86. 64 0
      uni_modules/uv-ui-tools/changelog.md
  87. 6 0
      uni_modules/uv-ui-tools/components/uv-ui-tools/uv-ui-tools.vue
  88. 79 0
      uni_modules/uv-ui-tools/index.js
  89. 7 0
      uni_modules/uv-ui-tools/index.scss
  90. 34 0
      uni_modules/uv-ui-tools/libs/config/config.js
  91. 32 0
      uni_modules/uv-ui-tools/libs/css/color.scss
  92. 100 0
      uni_modules/uv-ui-tools/libs/css/common.scss
  93. 23 0
      uni_modules/uv-ui-tools/libs/css/components.scss
  94. 111 0
      uni_modules/uv-ui-tools/libs/css/variable.scss
  95. 40 0
      uni_modules/uv-ui-tools/libs/css/vue.scss
  96. 134 0
      uni_modules/uv-ui-tools/libs/function/colorGradient.js
  97. 29 0
      uni_modules/uv-ui-tools/libs/function/debounce.js
  98. 167 0
      uni_modules/uv-ui-tools/libs/function/digit.js
  99. 734 0
      uni_modules/uv-ui-tools/libs/function/index.js
  100. 75 0
      uni_modules/uv-ui-tools/libs/function/platform.js

+ 2 - 0
App.vue

@@ -71,6 +71,8 @@
 					    Vue.prototype.customBar = customBarHeight;
 				}
 				
+			},
+			onShow() {
 			},
 			onLoad() {
 				

+ 5 - 3
components/detailBlock/detailBlock.vue

@@ -14,7 +14,6 @@
 			   </view>
 				<text class="zdwz" style="color: #0056a8;float: right;" @click="zdwz">收起</text> -->
 			<view class="content">
-
 				<view ref="p" :class="getClassNames">
 					<text style="color: #999999;">教研室概况:</text>
 					这是一段需要展开收起的文字,可以有很多很多的字,可能会占据很多的空间。因此,在默认情况下,我们只会显示部分文字,而把其余的部分折叠起
@@ -25,6 +24,8 @@
 					{{isAll ? '收起' : '展开'}}
 				</view>
 			</view>
+			
+			
 		</view>
 	</view>
 </template>
@@ -44,7 +45,8 @@
 		},
 		data() {
 			return {
-				isAll: false
+				isAll: false,
+				meunButtonInfo:this.meunButtonInfo, //胶囊高度
 			};
 		},
 		computed: {
@@ -82,7 +84,7 @@
 	.detailBlock {
 		background-color: #ffffff;
 		border-radius: 10rpx;
-		padding: 15px 10px;
+		padding: 30rpx;
 
 		.tit {
 			font-weight: 600;

+ 6 - 10
components/statusBar/statusBar.vue

@@ -69,23 +69,19 @@
 		}
 		.nav{
 			width: 750rpx;
-			// position: relative;
-			// border-bottom-left-radius: 30rpx;
-			// border-bottom-right-radius: 30rpx;
+			
 			background-color: #FFFFFF;
-			// background-color: #000;
-			// background: linear-gradient( 100deg ,#65cff4 20%,#c8b8ee 80%);
-			// position: sticky;
+			
 			position: fixed;
 			top: 0;
 			z-index: 11;
 			.backBtnSty{
-				// position: absolute;
-				width: 40rpx;height: 40rpx;		
-				margin-left: 15rpx;
+				width: 40rpx;
+				height: 40rpx;		
+				margin-left: 30rpx;
 				margin-top:50rpx;
 				image{
-					width: 40rpx;height: 40rpx;
+					width: 16rpx;height: 28rpx;
 				}
 			}
 			.navTit{

+ 113 - 0
components/tabBar/tabBar.vue

@@ -0,0 +1,113 @@
+<template>
+	<view class="tabBar">
+		<uv-tabbar :value="value" @change="gotoBar">
+				<uv-tabbar-item class="txt" text="首页">
+					<template v-slot:active-icon>
+						<image class="icon" style="width: 36rpx;height: 36rpx;" src="../../static/tabbar/Fill 2.png"></image>
+					</template>
+					<template v-slot:inactive-icon>
+						<image class="icon" style="width: 36rpx;height: 36rpx;" src="../../static/tabbar/Fill 1.png"></image>
+					</template>
+				</uv-tabbar-item>
+				
+				<uv-tabbar-item text="资源库">
+					<template v-slot:active-icon>
+						<image class="icon" style="width: 40rpx;height: 32rpx;" src="/static/tabbar/zyk2.png"></image>
+					</template>
+					
+					<template v-slot:inactive-icon>
+						<image class="icon" style="width: 40rpx;height: 32rpx;" src="/static/tabbar/zyk.png"></image>
+					</template>
+				</uv-tabbar-item>
+				
+				<uv-tabbar-item text="活动">
+					<template v-slot:active-icon>
+						<image class="icon" style="width: 40rpx;height: 40rpx;" src="/static/tabbar/hd2.png"></image>
+					</template>
+					
+					<template v-slot:inactive-icon>
+						<image class="icon" style="width: 40rpx;height: 40rpx;" src="/static/tabbar/hd.png"></image>
+					</template>
+				</uv-tabbar-item>
+				
+				<uv-tabbar-item text="消息">
+					<template v-slot:active-icon>
+						<image class="icon" style="width: 38rpx;height: 34rpx;" src="/static/tabbar/xx2.png"></image>
+					</template>
+					<template v-slot:inactive-icon>
+						<image class="icon" style="width: 38rpx;height: 34rpx;" src="/static/tabbar/xx.png"></image>
+					</template>
+				</uv-tabbar-item>
+				
+				<uv-tabbar-item text="我的">
+					<template v-slot:active-icon>
+						<image class="icon" style="width: 34rpx;height: 38rpx;" src="/static/tabbar/wd2.png"></image>
+					</template>
+					<template v-slot:inactive-icon>
+						<image class="icon" style="width: 34rpx;height: 38rpx;" src="/static/tabbar/wd.png"></image>
+					</template>
+				</uv-tabbar-item>
+			</uv-tabbar>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"tabBar",
+		data() {
+			return {
+				value: 0
+			};
+		},
+		methods:{
+			gotoBar(e){
+				// this.value=index
+				console.log(e);
+				switch(e){
+					case 0:
+						uni.switchTab({
+							url:'/pages/index/index'
+						})
+						break;
+					case 1:
+						uni.switchTab({
+							url:'/pages/resource/resource'
+						})
+						break;
+					case 2:
+						uni.switchTab({
+							url:'/pages/activityPage/activityPage'
+						})
+						break;
+					case 3:
+						uni.switchTab({
+							url:'/pages/message/message'
+						})
+						break;
+					default:
+						uni.switchTab({
+							url:'/pages/mine/mine'
+						})
+						break;
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tabBar{
+		// position: fixed;
+		.icon {
+				width: 36rpx;
+				height: 36rpx;
+		}
+		/deep/ .uni-tabbar__label{
+			 font-size: 100rpx !important;
+			 font-weight: 400;
+			 line-height: 24rpx;
+			 
+		 }
+		
+	}
+</style>

+ 154 - 89
components/teaching-case/teaching-case.vue

@@ -1,92 +1,119 @@
 <template>
-	<view class="teaching_case"  @click="gotoTeDetail">
+	<view class="teaching_case" @click="gotoTeDetail">
 		<view class="img cell-img">
 			<!-- <slot name="img"></slot> -->
-			<image src="../../static/yym/Rectangle23.png" mode="aspectFill"></image>
+			<image :src="classList.img" v-if="!item.btn" mode="aspectFill"></image>
+			<image :src="activeList.img" v-else mode="aspectFill"></image>
 		</view>
-		
+
 		<view class="right">
-			<view class="title">
-				<view v-if="!item.btn" class="tag bqZ-font">类型</view>
-				<view v-else class="tag bqZ-font" >类型</view>
-				
-				<text class="btn-font" v-if="!item.btn" style="font-size: 33rpx;">这是教研标题这是教研标题这是教研标题</text>
-				<text class="three-font" v-else>这是活动活动活动活动活动活动活动活动活动</text>
-			</view>
-			
-			<view v-if="!item.btn" class="introduce fz-font">
-				查看详情查看详情查看详情查看详情查看详情查看详情查看详情查看详情查看详情查看详情
-			</view>
-			<view  v-else class="introduce fz-font">
-				活动描述活动描述活动描述活动描述活动描述活动描述活动描述
+			<view class="">
+				<view class="title">
+					<view v-if="!item.btn" class="tag bqZ-font">类型</view>
+					<view v-else class="tag bqZ-font">类型</view>
+
+
+
+					<text class="btn-font" v-if="!item.btn" style="">{{ classList.className }}</text>
+					<text class="three-font" v-else>{{ activeList.className }}</text>
+				</view>
+
+				<view v-if="!item.btn" class="introduce fwb-font">
+					{{ classList.intro }}
+				</view>
+				<view v-else class="introduce fwb-font">
+					{{ activeList.intro }}
+				</view>
 			</view>
-			
+
+
 			<view class="operate" v-if="!item.btn">
 				<view class="left">
 					<view class="opr" style="padding-right: 25rpx;">
-						<uni-icons type="star" size="22"></uni-icons>
+						<view class="icon">
+							<image src="http://43.139.158.220:5007/img/static/yym/Star 1 (Stroke).png" style="width: 28rpx;height: 26rpx;"
+								mode="aspectFill"></image>
+						</view>
 						<text class="fz-font">收藏</text>
 					</view>
 					<view class="opr">
-						<uni-icons type="cloud-download"  size="22"></uni-icons>
-						<!-- <image src="../../static/yym/Vector (Stroke).png" style="width: 30rpx;height: 30rpx;" mode="aspectFill"></image> -->
+						<view class="icon">
+							<image src="http://43.139.158.220:5007/img/static/yym/Vector (Stroke).png" style="width: 22rpx;height: 26rpx;"
+								mode="aspectFill"></image>
+						</view>
 						<text class="fz-font">订阅</text>
 					</view>
 				</view>
-				<button class="btn sBtn-font" disableEventPropagation="true" @click.stop="join">立即参与</button>
+				<view class="">
+					<button class="btn sBtn-font" disableEventPropagation="true" @click.stop="join">立即参与</button>
+				</view>
 			</view>
 			<view class="operate" v-else>
 				<view class="left">
 					<view class="price num-font"><text class="three-font">¥</text> 188</view>
-					<view class="pernum fz-font">已报名123人</view>
+					<view class="pernum fz-font">已报名{{ activeList.count }}人</view>
+				</view>
+				<view class="">
+					<button class="btn sBtn-font" @click.stop="actApply">立即报名</button>
 				</view>
-				<button class="btn sBtn-font" @click.stop="actApply">立即报名</button>
-				
 			</view>
 		</view>
+		<!-- <view class="" style="height: 50rpx;width: 100%;background-color: #ffffff;"></view> -->
 	</view>
-	
+
 </template>
 
 <script>
 	export default {
-		name:"teaching-case",
-		props:{
-			item:{
-				type:Object,
-				default (){
-					return{
-						btn:0    //0教研列表 1活动列表
+		name: "teaching-case",
+		props: {
+			item: {
+				type: Object,
+				default () {
+					return {
+						btn: 0 //0教研列表 1活动列表
 					}
 				}
+			},
+			classList: {
+				type: Object,
+				default () {
+					return []
+				}
+			},
+			activeList: {
+				type: Object,
+				default () {
+					return []
+				}
 			}
 		},
 		data() {
 			return {
-				
+
 			};
 		},
-		methods:{
-			gotoTeDetail(){
-				if(this.item.btn){
+		methods: {
+			gotoTeDetail() {
+				if (this.item.btn) {
 					uni.navigateTo({
-						url:"/pages/activityDetail/activityDetail"
+						url: "/pages/activityDetail/activityDetail"
 					})
-				}else{
+				} else {
 					uni.navigateTo({
-						url:"/pages/teachingDetail/teachingDetail"
+						url: "/pages/teachingDetail/teachingDetail"
 					})
 				}
-				
+
 			},
-			join(){
+			join() {
 				uni.navigateTo({
-					url:'/pages/jys/jys'
+					url: '/pages/jys/jys'
 				})
 			},
-			actApply(){
+			actApply() {
 				uni.navigateTo({
-					url:'/pages/hd/hd'
+					url: '/pages/hd/hd'
 				})
 			}
 		}
@@ -94,23 +121,27 @@
 </script>
 
 <style lang="scss">
-	.teaching_case{
+	.teaching_case {
 		display: flex;
 		justify-content: space-between;
-		margin-bottom: 10px;
+		// margin-bottom: 10px;
 		background-color: #ffffff;
 		padding: 20rpx 30rpx;
-		// padding-bottom: 20rpx;
-		.img{
+		
+		// padding-bottom: 50rpx;
+		.img {
 			width: 160rpx;
 			height: 160rpx;
-			image{
+
+			image {
 				width: 100%;
-				height:100%;
+				height: 100%;
+				border-radius: 10rpx;
 			}
 		}
-		.right{
-			padding-left: 15px;
+
+		.right {
+			padding-left: 20rpx;
 			flex: 1;
 			// height: 300px;
 			width: 100rpx;
@@ -119,88 +150,122 @@
 			// align-content: flex-end ;
 			justify-content: space-between;
 			// align-content: space-between;
-			
-			.title{
+
+			.title {
 				display: flex;
+				justify-content: flex-start;
 				align-items: center;
-				margin-bottom: 5px;
+				margin-bottom: 15rpx;
+
 				// margin-bottom: 10rpx;
-				.tag{
+				.tag {
 					border: 1px #00b2b6 solid;
-					// font-size: 12px;
+					flex-shrink: 0;
+					letter-spacing: 2rpx;
 					width: 64rpx;
-					height: 38rpx;
+					height: 32rpx;
 					display: flex;
 					white-space: nowrap;
 					justify-content: center;
 					align-items: center;
-					// padding: 2px 4px;
-					padding: 1rpx 6rpx;
-					border-radius: 3px;
+					border-radius: 4rpx;
 					margin-right: 10rpx;
 					color: #00b2b6;
+					line-height: 32rpx;
+					// border: 1px #00b2b6 solid;
+					// font-size: 20rpx;
+					// width: 94rpx;
+					// display: flex;
+					// height: 36rpx;
+					// white-space: nowrap;
+					// justify-content: center;
+					// align-items: center;
+					// // padding: 4px 12px 4px 12px;
+					// border-radius: 5rpx;
+					// margin-right: 10rpx;
+					// color: #00b2b6;
 				}
-				text{
+
+				text {
 					font-weight: bold;
 					overflow: hidden;
-					text-overflow:ellipsis;
+					text-overflow: ellipsis;
 					white-space: nowrap;
 				}
-				
+
 			}
-			.introduce{
+
+			.introduce {
 				// font-size: 28rpx;
 				color: #a7a7a7;
 				// padding: 20rpx 0;
+				// width: 560rpx;
+				height: 40rpx;
 				overflow: hidden;
-				text-overflow:ellipsis;
+				text-overflow: ellipsis;
 				white-space: nowrap;
 			}
-			.operate{
+
+			.operate {
 				display: flex;
 				justify-content: space-between;
-				align-items: flex-end;
 				// align-items: baseline;
-				
-				.left{
+				align-items: flex-end;
+
+				.left {
 					display: flex;
 					// justify-content: space-between;
 					// align-items: center;
-					// align-items: baseline;
+					align-items: baseline;
+
 					// width: 200rpx;
-					.opr{
+					.opr {
 						display: flex;
 						align-items: center;
-						text{
+
+						.icon {
+							width: 32rpx;
+							height: 32rpx;
+							display: flex;
+							justify-content: center;
+							align-items: center;
+						}
+
+						text {
 							padding-left: 3rpx;
 							color: #666666;
 						}
 					}
-					.pernum{
+
+					.pernum {
 						color: #666666;
+
 						// font-size: 30rpx;
 					}
-					.price{
+
+					.price {
 						// font-size: 40rpx;
 						font-weight: bold;
 						color: #f8a551;
 						padding-right: 10rpx;
 					}
 				}
-					.btn{
-						z-index: 5;
-						// font-size: 12px;
-						background-color: #3081e8;
-						color: #fff;
-						border-radius: 30px;
-						margin: 0;
-						float: right;
-						height: 28px;
-						line-height: 28px;
-						// margin-top: 10px;
-						// padding: 0 15rpx;
-						letter-spacing:1px;
-					}
+
+				.btn {
+					z-index: 5;
+					border: none;
+					padding: 0;
+					text-align: center;
+					// padding: 8px, 24px, 8px, 24px;
+					background-color: rgba(48, 129, 232, 1);
+					color: #fff;
+					border-radius: 100rpx;
+					float: right;
+					width: 144rpx;
+					height: 48rpx;
+					line-height: 48rpx;
+					letter-spacing: 1px;
+				}
 			}
 		}
 	}

+ 2 - 2
components/viewX-Case/viewX-Case.vue

@@ -12,7 +12,7 @@
 		</view>
 		
 		<!-- 首页精选活动类 -->
-		<scroll-view class="scroll-view_H" scroll-x="true" show-scrollbar="false">
+		<scroll-view class="scroll-view_H" scroll-x="true" :enhanced="true" :show-scrollbar="false">
 			<slot name="activeBlock"></slot>
 		</scroll-view>
 		
@@ -38,7 +38,7 @@
 	.view_x_case{
 		width: 750rpx;
 		background-color: #fff;
-		margin-bottom: 20rpx;
+		// margin-bottom: 50rpx;
 		// padding-left: 25rpx;
 		.tit{
 			// margin-bottom: 15px;

+ 31 - 11
pages.json

@@ -200,45 +200,65 @@
 		    }
 		    
 		}
+        ,{
+            "path" : "pages/messageSystem/messageSystem",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/messageDy/messageDy",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
     ],
     "tabBar": {
+		// "custom": true,
 		"backgroundColor": "#ffffff",
-		"fontSize": "16px",
+		"fontSize": "25rpx",
 		"selectedColor":"#0056a8",
         "list": [
 
             {
                 "pagePath": "pages/index/index",
                 "text": "首页",
-                "iconPath": "static/tabBarIcon/home.png",
-                "selectedIconPath": "static/tabBarIcon/home-selected.png"
+                "iconPath": "static/tabbar/Fill 1.png", 
+                "selectedIconPath": "static/tabbar/Fill 2.png"
             },
             {
                 "pagePath": "pages/resource/resource",
                 "text": "资源库",
-                "iconPath": "static/tabBarIcon/resource.png",
-                "selectedIconPath": "static/tabBarIcon/resource-selected.png"
+                "iconPath": "static/tabbar/zyk.png",
+                "selectedIconPath": "static/tabbar/zyk2.png"
             },
             {
                 "pagePath": "pages/activityPage/activityPage",
                 "text": "活动",
-                "iconPath": "static/tabBarIcon/activity.png",
-                "selectedIconPath": "static/tabBarIcon/activity-selected.png"
+                "iconPath": "static/tabbar/hd.png",
+                "selectedIconPath": "static/tabbar/hd2.png"
             },
             {
                 "pagePath": "pages/message/message",
                 "text": "消息",
-                "iconPath": "static/tabBarIcon/message.png",
-                "selectedIconPath": "static/tabBarIcon/message-selected.png"
+                "iconPath": "static/tabbar/xx.png",
+                "selectedIconPath": "static/tabbar/xx2.png"
             },
             {
                 "pagePath": "pages/mine/mine",
                 "text": "我的",
-                "iconPath": "static/tabBarIcon/mine.png",
-                "selectedIconPath": "static/tabBarIcon/mine-selected.png"
+                "iconPath": "static/tabbar/wd.png",
+                "selectedIconPath": "static/tabbar/wd2.png"
             }
         ]
     },
+	
     "globalStyle": {
 		"navigationStyle": "custom",
         "navigationBarTextStyle": "black",

+ 15 - 11
pages/activityDetail/activityDetail.vue

@@ -5,7 +5,7 @@
 		
 		<!-- 顶部 -->
 			<view class="backPic">
-				<image src="../../static/yym/Rectangle 40.png" mode="aspectFill"></image>
+				<image src="http://43.139.158.220:5007/img/static/yym/Rectangle 40.png" mode="aspectFill"></image>
 				<view style="padding: 0 30rpx;margin-bottom: 20px;">
 					<view class="card">
 						<view class="cardTop three-font">
@@ -26,9 +26,9 @@
 			</view>
 		
 		<!-- 创建者用户名 -->
-		<view style="padding: 0 30rpx;margin-bottom: 20px;">
+		<view style="padding: 0 30rpx;">
 			<view class="creator">
-				<image src="../../static/mine/Avatar.png" mode="aspectFill"></image>
+				<image src="http://43.139.158.220:5007/img/static/mine/Avatar.png" mode="aspectFill"></image>
 				<view class="creName btn-font">
 					发起者爱谁谁
 				</view>
@@ -55,7 +55,7 @@
 				
 				<view class="pers">
 					<view class="per" v-for="i in 6">
-						<image src="../../static/mine/Avatar.png" mode="aspectFill"></image>
+						<image src="http://43.139.158.220:5007/img/static/mine/Avatar.png" mode="aspectFill"></image>
 						<view class="perName fz-font">
 							袁一鸣
 						</view>
@@ -115,7 +115,8 @@
 				// height: 150px;
 				bottom: -20px;
 				left: 50%;
-				padding: 30rpx 16px;
+				// padding: 30rpx 16px;
+				padding: 30rpx;
 				border-radius: 10px;
 				background-color: #ffffff;
 				transform: translate(-50%,0);
@@ -157,16 +158,18 @@
 					display: flex;
 				}
 			}
-			// background-image: url(../../static/resource/jqr.png);
+			// background-image: url(http://43.139.158.220:5007/img/static/resource/jqr.png);
 		}
 	
 		
 		.creator{
 			display: flex;
-			padding: 10px 30px;
+			// padding: 10px 30px;
+			padding: 30rpx 20rpx;
 			background-color: #ffffff;
 			align-items: center;
 			margin-top: 30px;
+			margin-bottom: 20rpx;
 			border-radius: 10px;
 			image{
 				width: 96rpx;
@@ -181,9 +184,10 @@
 		
 		.member{
 			background-color: #ffffff;
-			margin-top: 20px;
-			padding: 10px 10px;
-			border: 10px;
+			margin-top: 20rpx;
+			// padding: 10px 10px;
+			padding: 30rpx;
+			// border: 10px;
 			border-radius: 10px;
 			.memberTop{
 				display: flex;
@@ -193,7 +197,7 @@
 				
 				.pers{
 					display: flex;
-					justify-content: space-around;
+					justify-content: space-between;
 					align-items: center;
 					.per{
 						// display: inline-block;

+ 69 - 12
pages/activityList/activityList.vue

@@ -1,8 +1,12 @@
 <template>
 	<view class="activeList">
 		<statusBar :item="navbarData"></statusBar>
-		<teaching-case :item="teaData"></teaching-case>
-		
+		<!-- <teaching-case :item="teaData"></teaching-case> -->
+		<view class="" style="padding-bottom: 50rpx;">
+			<teaching-case v-for="(item,index) in activeList" :item="teaData" :key="index" :activeList="item"></teaching-case>
+		</view>
+
+
 	</view>
 </template>
 
@@ -10,20 +14,73 @@
 	export default {
 		data() {
 			return {
-				navbarData:{
-					title:'活动列表',
-					btn:1
+				navbarData: {
+					title: '活动列表',
+					btn: 1
 				},
-				teaData:{
-					btn:1
-				}
+				teaData: {
+					btn: 1
+				},
+				activeList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img10.jpg',
+						count: '1790',
+						className: '创新思维开发与落地',
+						intro: '《暂无简介》'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img11.jpg',
+						count: '3842',
+						className: '创业意识与商机识别',
+						intro: '在创新创业的大氛围下,课堂上常常强调要以项目为中心,你却苦于迟迟无法最终确定具体的项目?那么,《创业意识与商机识别》这门课程可以帮助你。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img12.png',
+						count: '701',
+						className: '机电(机械)技术创新创业实务',
+						intro: '该课程是针对机电、机械行业、企业用户的一门关于创新创业的培训类课程。在国家“大众创业、万众创新”的新时代背景下,创新是引领一个企业发展的第一动力。为推动科技不断进步、促进企业快速健康发展,开发了《机电(机械)技术创新创业实务》课程。计划为36学时,理论讲授30学时,实践案例分析和操作6学时'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img13.jpg',
+						count: '823',
+						className: '打造黄金创始人团队',
+						intro: '如何摆正自己的工作态度和位置,清醒认识到自己的职责,学会选人用人,努力提高领导力和执行力,带好团队,并最终成为一个卓越的管理者呢?本课程提供给你建议'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img14.jpg',
+						count: '2287',
+						className: '创业素质测评与团队组建',
+						intro: '本课程采取案例分析、研讨、游戏的方式使同学们的聪明才智能够有发挥的空间,话语权能够得到满足。通过完成团队任务的方式使大家逐渐与陌生人建立良好沟通关系,掌握沟通技巧,使自己具有使命感、懂得感恩。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img15.jpg',
+						count: '2076',
+						className: '创业素质测评与团队组建',
+						intro: '《创业素质测评与团队建设课程》根据心理学者荣格所提的“人格特质”理论,围绕心智结构,以特质测评为基础,让同学们运用人格特质的分析了解不同人群之间的思维差异,学会根据不同特质的人才采取不同的行为沟通模式,确定其在创业团队的角色和地位,从而更好的促进创业团队建设及创业团队能力提升。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img16.jpg',
+						count: '11390',
+						className: '行业创业实践',
+						intro: '行业创业实践'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img17.jpg',
+						count: '1639',
+						className: '创业就业指导',
+						intro: '本课程是公共基础课和必修课。课程根据国务院、广东省教育厅关于高校双创教育改革实施意见的有关通知精神,结合提升学生就业、创业竞争力和发展力需求,突出就业知识与技能、创业发展及职业素养的培养。通过本课程的学习,能够使学生掌握     的基础知识,初步具备就业与创业的核心能力;并为学生在职业发展的阶段特点;较为清晰地认识自己的个性特性、职业特性;个性创业素养、个体创业能力等方面提供必要的知识。为个人的生涯发展和社会的创新推动、提高自身就业竞争力,展现良好职业素养,为今后职业发展与事业发展拓展通道。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img18.jpg',
+						count: '2129',
+						className: '营销管理实务与创新',
+						intro: '课程基于线上线下协同的教学方式,注重提升学生自主学习、市场运营创新能力的培养,不断蓄积其专业底蕴;通过学练一体的教学模式,实现对学生营销技术素养与职业人格的协同培养,建立面向复杂市场的商业逻辑。课程线上部分共24学时,开课一学期 ;线下部分一般以24~36学时为宜。'
+					},
+				]
 			};
 		}
 	}
 </script>
 
 <style lang="scss">
-	.activeList{
-		
-	}
-</style>
+	.activeList {}
+</style>

+ 205 - 82
pages/activityPage/activityPage.vue

@@ -1,7 +1,6 @@
 <template>
 	<view class="activity">
 		<statusBar :item="navBarData"></statusBar>
-		
 		<viewX-Case class="mid">
 			<template #title>
 				<view class="title three-font">活动直播</view>
@@ -12,32 +11,38 @@
 				</view>
 			</template>
 			<template #activeBlock>
-				<view class="activeData" v-for="i in 4" :key="i">
-					<image src="../../static/activity/bg1.png" mode="aspectFill"></image>
+				<view class="activeData" v-for="(item,index) in liveList" :key="index">
+					<!-- <image src="http://43.139.158.220:5007/img/static/activity/bg1.png" mode="aspectFill"></image> -->
+					<image :src="liveList[index].img" mode="aspectFill"></image>
+
 					<view class="liveBroadcast">
 						<view class="title">
 							<view class="tag bqZ-font">类型</view>
-							<text three-font>直播活动标题标题标题标题标题标题标题</text>
+							<text three-font>{{ item.className }}</text>
 						</view>
-						
+
 						<view class="operate">
 							<view class="left">
 								<view class="img">
-									<image src="../../static/jys/jys.png"></image>
+									<image :src="liveList[index].imgName"></image>
 								</view>
-								<view class="user fwb-font">用户名</view>
+								<view class="user fwb-font">{{ item.name }}</view>
 							</view>
 							<view class="collection">
-								<uni-icons type="star" size="20"></uni-icons>
+
+								<!-- <view class="" style="display: flex;margin-right: 10rpx;align-items: center;"> -->
+								<view class="img">
+									<image src="http://43.139.158.220:5007/img/static/yym/Vector (Stroke) (2).png" mode="aspectFill"></image>
+								</view>
 								<text class="fz-font">收藏</text>
-								
+
 							</view>
 						</view>
 					</view>
 				</view>
 			</template>
 		</viewX-Case>
-		
+
 		<viewX-Case style="margin-top: 10px;">
 			<template #title>
 				<view class="title three-font">活动推荐</view>
@@ -47,19 +52,26 @@
 			</template>
 			<template #activeBlock>
 				<!-- <activity-case v-for="i in 10" :key="i"></activity-case> -->
-				<teaching-case v-for="i in 10" :item="actData" :key="i"></teaching-case>
+				<teaching-case v-for="(item,index) in activeList" :item="actData" :key="index"
+					:activeList="item"></teaching-case>
 			</template>
 		</viewX-Case>
-		
-		
-		
-		<uni-fab ref="fab" 
+
+
+
+		<!-- 		<uni-fab ref="fab" 
 		:pattern="pattern" 
 		:horizontal="horizontal" 
 		:vertical="vertical"
 		:direction="direction"
-		 
-		@fabClick="fabClick" />
+		buttonColor="#0056a8"
+		@fabClick="fabClick" /> -->
+<view class="" style="height: 30rpx;width: 100%;">
+	
+</view>
+		<view class="qiu" @click="fabClick">
+			<image src="/static/yym/jia.png" mode="aspectFill"></image>
+		</view>
 	</view>
 </template>
 
@@ -67,143 +79,254 @@
 	export default {
 		data() {
 			return {
-				navBarData:{
-					title:'活动', //导航栏标题
-					btn:0        //是否显示返回按钮 0不显示  1 显示
+				navBarData: {
+					title: '活动', //导航栏标题
+					btn: 0 //是否显示返回按钮 0不显示  1 显示
 				},
-				actData:{
-					btn:1
+				actData: {
+					btn: 1
 				},
 				title: 'uni-fab',
-				directionStr: '垂直',
-				horizontal: 'right',
-				vertical: 'bottom',
-				direction: 'horizontal',
-				pattern: {
-					color: '#7A7E83',
-					backgroundColor: '#fff',
-					selectedColor: '#007AFF',
-					buttonColor: '#007AFF',
-					iconColor: '#fff'
-				},
+				liveList: [{
+						img: "http://43.139.158.220:5007/img/static/mine/img1.jpg",
+						className: "创业者管理能力训练基础",
+						imgName: "http://43.139.158.220:5007/img/static/activity/Name1.png",
+						name: "李芳"
+					},
+					{
+						img: "http://43.139.158.220:5007/img/static/mine/img2.jpg",
+						className: '创业融资实务',
+						imgName: "http://43.139.158.220:5007/img/static/activity/Name2.png",
+						name: "郑秀"
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img3.jpg',
+						className: '创业基础',
+						imgName: "http://43.139.158.220:5007/img/static/activity/Name3.png",
+						name: "杨哲旗"
+					},
+					{
+						img: "http://43.139.158.220:5007/img/static/mine/img4.jpg",
+						className: "打造无敌商业计划书",
+						imgName: "http://43.139.158.220:5007/img/static/activity/Name2.png",
+						name: "杨广"
+					}
+				],
+				activeList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img10.jpg',
+						count: '1790',
+						className: '创新思维开发与落地',
+						intro: '《暂无简介》'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img11.jpg',
+						count: '3842',
+						className: '创业意识与商机识别',
+						intro: '在创新创业的大氛围下,课堂上常常强调要以项目为中心,你却苦于迟迟无法最终确定具体的项目?那么,《创业意识与商机识别》这门课程可以帮助你。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img12.png',
+						count: '701',
+						className: '机电(机械)技术创新创业实务',
+						intro: '该课程是针对机电、机械行业、企业用户的一门关于创新创业的培训类课程。在国家“大众创业、万众创新”的新时代背景下,创新是引领一个企业发展的第一动力。为推动科技不断进步、促进企业快速健康发展,开发了《机电(机械)技术创新创业实务》课程。计划为36学时,理论讲授30学时,实践案例分析和操作6学时'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img13.jpg',
+						count: '823',
+						className: '打造黄金创始人团队',
+						intro: '如何摆正自己的工作态度和位置,清醒认识到自己的职责,学会选人用人,努力提高领导力和执行力,带好团队,并最终成为一个卓越的管理者呢?本课程提供给你建议'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img14.jpg',
+						count: '2287',
+						className: '创业素质测评与团队组建',
+						intro: '本课程采取案例分析、研讨、游戏的方式使同学们的聪明才智能够有发挥的空间,话语权能够得到满足。通过完成团队任务的方式使大家逐渐与陌生人建立良好沟通关系,掌握沟通技巧,使自己具有使命感、懂得感恩。'
+					},
+				],
 			};
 		},
-		methods:{
-			lookMore(){
+		methods: {
+			lookMore() {
 				uni.navigateTo({
-					url:'/pages/activityList/activityList'
+					url: '/pages/activityList/activityList'
 				})
 			},
-			fabClick(){
+			fabClick() {
 				// console.log(111);
 				uni.navigateTo({
-					url:'/pages/publish/publish'
+					url: '/pages/publish/publish'
 				})
+			},
+			onChange: function(e) {
+				this.old.x = e.detail.x
+				this.old.y = e.detail.y
 			}
 		}
 	}
 </script>
 
 <style lang="scss">
-	.activity{
-		.mid{
+	.activity {
+		.qiu {
+			width: 90rpx;
+			height: 90rpx;
+			position: fixed;
+			z-index: 19;
+			right: 30rpx;
+			bottom: 10vh;
+			border-radius: 50%;
+			background-color: rgba(0, 86, 168, 1);
+			display: flex;
+			justify-content: center;
+			align-items: center;
+
+			image {
+				position: absolute;
+
+				width: 36rpx;
+				height: 36rpx;
+			}
+
+		}
+
+		.mid {
+
 			// margin:20px 0;
-			.activeData{
+			.activeData {
 				width: 460rpx;
 				display: inline-block;
 				margin-right: 20px;
-				image{
+
+				image {
 					width: 100%;
 					height: 120px;
 					border-radius: 10px;
 					margin-bottom: 10px;
 				}
-				.liveBroadcast{
+
+				.liveBroadcast {
 					flex: 1;
 					width: 460rpx;
 					display: flex;
 					flex-direction: column;
-					align-content: flex-end ;
-					.title{
+					align-content: flex-end;
+
+					.title {
 						display: flex;
-						margin-bottom: 5px;
-						.tag{
+						align-items: center;
+						margin-bottom: 10rpx;
+
+						.tag {
+							// border: 1px #00b2b6 solid;
+							// // font-size: 12px;
+							// width: 64rpx;
+							// height: 38rpx;
+							// display: flex;
+							// white-space: nowrap;
+							// justify-content: center;
+							// align-items: center;
+							// // padding: 2px 4px;
+							// padding: 1rpx 4rpx;
+							// border-radius: 3px;
+							// margin-right: 10rpx;
+							// color: #00b2b6;
 							border: 1px #00b2b6 solid;
-							// font-size: 12px;
+							font-size: 20rpx;
 							width: 64rpx;
-							height: 38rpx;
 							display: flex;
+							height: 34rpx;
 							white-space: nowrap;
 							justify-content: center;
 							align-items: center;
-							// padding: 2px 4px;
-							padding: 1rpx 4rpx;
-							border-radius: 3px;
+							// padding: 4px 12px 4px 12px;
+							border-radius: 5rpx;
 							margin-right: 10rpx;
 							color: #00b2b6;
 						}
-						text{
+
+						text {
 							// display: -webkit-box;//对象作为弹性伸缩盒子模型显示
 							// overflow: hidden;//溢出隐藏
 							// -webkit-box-orient: vertical;//设置伸缩盒子对象的子元素的排列方式
 							// -webkit-line-clamp: 2;//设置 块元素包含的文本行数
 							overflow: hidden;
-							text-overflow:ellipsis;
+							text-overflow: ellipsis;
 							white-space: nowrap;
 						}
-						
+
 					}
-					.operate{
+
+					.operate {
 						display: flex;
 						justify-content: space-between;
 						align-items: center;
 						padding: 20rpx 0;
 						color: #666666;
+
 						// margin-bottom: 20rpx;
 						// padding-bottom: 20rpx;
-						.left{
+						.left {
 							display: flex;
-							// justify-content: flex-start;
 							align-items: center;
-							.img{
-								width:30px;
-								height:30px;
-								// padding-right: 20rpx;
-								margin-right: 20rpx;
-								
-								image{
+
+							.img {
+								width: 48rpx;
+								height: 48rpx;
+								margin-right: 10rpx;
+
+								image {
 									width: 100%;
 									height: 100%;
 									border-radius: 50%;
 								}
 							}
-							
-							.user{
-								// font-size: 16px;
-								// padding-left: 15rpx;
-							}
-							
+
+							.user {}
+
 						}
-						.collection{
+
+						.collection {
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							width: 88rpx;
+							height: 32rpx;
+							position: relative;
+
+							.img {
+								position: absolute;
+								left: 0;
+								top: 6rpx;
+								transform: translate(-130%, 0);
+							}
+
+							image {
+								width: 27rpx;
+								height: 25rpx;
+								display: block;
+							}
+
 							// float: right;
 							// font-size: 14px;
 							// padding-top: 10px;
 						}
 					}
-				}	
-			}	
-			.activeData:nth-child(1){
+				}
+			}
+
+			.activeData:nth-child(1) {
 				margin-left: 15px;
 			}
 		}
-		
-		.title{
-				font-weight: bold;
-				// color: #999999;
-			}		
-		.lookMore{
+
+		.title {
+			font-weight: bold;
+			// color: #999999;
+		}
+
+		.lookMore {
 			color: #666666;
 			// font-size: 14px;
 		}
 	}
-</style>
+</style>

+ 100 - 74
pages/dy/dy.vue

@@ -1,44 +1,26 @@
 <template>
 	<view>
 		<statusBar :item="navBarData"></statusBar>
-		<view class="main_part">
+		<view class="bigBox" v-for=" i in items">
 			<view class="content">
-				<!-- <img class="image" src="../../static/logo.png" alt="" /> -->
-				<image class="image" src="../../static/mine/Avatar.png" mode=""></image>
-				<view class="text">
-					<p class="t1">橘子很橘子</p>
-					<p class="dy">订阅了您的教研室&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2023-04-01</p>
+				<view class="left">
+					<image class="image" src="../../static/mine/Avatar.png" mode=""></image>
+					<view class="text">
+						<view class="fwb-font">橘子很橘子</view>
+						<view class="brief fz-font">
+							<text class="fz-font" style="margin-right: 20rpx;">订阅了您的教研室</text> 
+							<text class="fz-font">2023-04-01</text>
+						</view>
+					</view>
 				</view>
-				<button class="btn">回粉</button>
-			</view>
-			<view class="content">
-				<!-- <img class="image" src="../../static/logo.png" alt="" /> -->
-				 <image class="image" src="../../static/mine/Avatar.png" mode=""></image>
-				<view class="text">
-					<p class="t1">橘子很橘子</p>
-					<p class="dy">订阅了您的教研室&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2023-04-01</p>
-				</view>
-				<button class="btn">回粉</button>
-			</view>
-			<view class="content">
-				<!-- <img class="image" src="../../static/logo.png" alt="" /> -->
-				 <image class="image" src="../../static/mine/Avatar.png" mode=""></image>
-				<view class="text">
-					<p class="t1">橘子很橘子</p>
-					<p class="dy">订阅了您的教研室&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2023-04-01</p>
+				<view class="right">
+					<button v-if="i.btn==1" class="btn sBtn-font" @click="btn1(i.tit)">回粉</button>
+					<button v-else-if="i.btn==2" class="btn2 sBtn-font" @click="btn2(i.tit)">+关注</button>
+					<button v-else class="btn3 sBtn-font" @click="btn3(i.tit)">相互关注</button>
 				</view>
-				<button class="btn">+关注</button>
-			</view>
-			<view class="content">
-				<!-- <img class="image" src="../../logo.png" alt="" /> -->
-				<image class="image" src="../../static/mine/Avatar.png" mode=""></image>
-				<view class="text">
-					<p class="t1">橘子很橘子</p>
-					<p class="dy">订阅了您的教研室&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2023-04-01</p>
-				</view>
-				<button class="btn">互相关注</button>
 			</view>
 		</view>
+		
 	</view>
 </template>
 
@@ -49,60 +31,104 @@ export default {
 			navBarData: {
 				title: '新增订阅',
 				btn: 1
-			}
+			},
+			items:[   //1回粉 2关注 3相互关注
+				{tit:'hf',btn:1},
+				{tit:'hf2',btn:1},
+				{tit:'gz',btn:2},
+				{tit:'hx',btn:3},
+			]
 		};
+	},
+	methods:{
+		btn1(e){
+			// console.log(e.btn==1);
+			// console.log(e);
+			this.items.find(i=>{
+				if(i.tit==e) return i.btn=3
+			})
+		},
+		btn2(e){
+			this.items.find(i=>{
+				if(i.tit==e) return i.btn=2
+			})
+		},
+		btn3(e){
+			this.items.find(i=>{
+				if(i.tit==e) return i.btn=1
+			})
+		}
 	}
 };
 </script>
 
 <style lang="scss" scoped>
+	.bigBox{
+		background-color: white;
+		width: 750rpx;
+		padding: 24rpx 30rpx 24rpx 30rpx;
+	}
 .content {
-	// margin-top: 5px;
-	background-color: white;
 	display: flex;
+	justify-content: space-between;
 	align-items: center;
-	// flex-direction: row; /* 使内容垂直排列 */
-	padding: 10px;
-	.image {
-		width: 100rpx;
-		height: 100rpx;
-		border-radius: 50%;
+	width: 690rpx;
+	height: 88rpx;
+	.left{
+		display: flex;
+		.image {
+			width: 88rpx;
+			height: 88rpx;
+			border-radius: 50%;
+		}
+		.text{
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+			margin-left: 20rpx;
+			.brief{
+				color: rgba(0, 0, 0, 0.6);
+			}
+		}
 	}
-	.text {
-		flex-grow: 1; /* 填充剩余空间,并根据其内容自适应宽度 */
-
-		padding: 5px;
-		line-height: 25px;
-		.t1,
-		.dy {
-			white-space: nowrap;
+	.right{
+		.btn {
+			background-color: #adadad;
+			width: 144rpx;
+			height: 56rpx;
+			padding: 0;
+			// padding: 8rpx 24rpx 8rpx 24rpx ;
+			border-radius: 32rpx;
+			// text-align: center;
+			line-height: 56rpx;
+			color: white;
 		}
-		.t1 {
-			font-weight: 600px;
-			font-size: 16px;
-			color: black;
+		.btn2{
+			background-color: #0056a9;
+			width: 144rpx;
+			height: 56rpx;
+			padding: 0;
+			// padding: 8rpx 24rpx 8rpx 24rpx ;
+			// border-radius: 42px;
+			border-radius: 32rpx;
+			// text-align: center;
+			line-height: 56rpx;
+			color: white;
 		}
-		.dy {
-			font-size: 12px;
-			color: #999999;
+		.btn3{
+			background-color: #d1e5fe;
+			width: 144rpx;
+			height: 56rpx;
+			padding: 0;
+			// padding: 8rpx 24rpx 8rpx 24rpx;
+			border-radius: 32rpx;
+			// text-align: center;
+			line-height: 56rpx;
+			color: #105eaa;
 		}
 	}
-	.btn {
-		// flex-grow: 1; /* 填充剩余空间 */
-		// display: flex;
-		// justify-content: center; /* 水平居中 */
-		// align-items: center; /* 垂直居中 */
-		background-color: #adadad;
-		width: 180rpx;
-		height: 60rpx;
-		
-		border-radius: 42px;
-		// margin-top: 15px;
-		// margin-left: 25px;
-		font-size: 28rpx;
-		text-align: center;
-		line-height: 60rpx;
-		color: white;
-	}
+	
+
+	
 }
 </style>

+ 60 - 43
pages/hd/hd.vue

@@ -1,53 +1,49 @@
 <template>
-	<view class="main">
+	<view class="hd">
 		<statusBar :item="navBarData"></statusBar>
-		<uni-card :is-shadow="false">
-			<view class="uni-body">
+		
+		<view class="top">
 				<view class="card">
-					<!-- <img src="../../static/jys/jys.png" alt="" class="image" /> -->
 					<image class="image" src="../../static/jys/jys.png" mode=""></image>
 					<view class="text">
-						<!-- <view class="text_title">
-							<text class="manage">类型</text>
-							<text class="t1">这里是教研室名22222称</text>
-						</view> -->
+						
 						<view class="text_title">
 							<view class="manage bqZ-font">类型</view>
 							<view class="t1 bmTit-font">这里是活动名活动名活动名活动名</view>
 						</view>
-						<view class="">
+						<view class="col sZw-font">
 							活动日期:5.12~5.13
 						</view>
-						<view class="">
+						<view class="col sZw-font">
 							招募人数:23/50
 						</view>
 					</view>
 				</view>
-			</view>
-		</uni-card>
-		<uni-card :is-shadow="false">
-			<view class="uni-body">
+		</view>
+		
+		<!-- <uni-card :is-shadow="false"> -->
+			<view class="xinxi">
 				<view class="card2">
 					<view class="hdxx">
-						<view class="hd btn-font">活动信息</view>
+						<view class="xxTit btn-font">活动信息</view>
 						<view class="textcolor">
-							<view class="name fz-font">
+							<view class="name  sZw-font">
 								姓名:
-								<text class="name1 fz-font">李某某</text>
+								<text class="name1  sZw-font">李某某</text>
 							</view>
-							<view class="name fz-font">
+							<view class="name  sZw-font">
 								联系方式:
-								<text class="lx1 fz-font">172xxxxx5678</text>
+								<text class="lx1  sZw-font">172xxxxx5678</text>
 							</view>
-							<view class="name fz-font">
+							<view class="name  sZw-font">
 								单位:
-								<text class="dw1 fz-font">xx实验中学学校</text>
+								<text class="dw1  sZw-font">xx实验中学学校</text>
 							</view>
 						</view>
 					</view>
 				</view>
 			</view>
-		</uni-card>
+		<!-- </uni-card> -->
 		<view class="buttons">
 			<view class="button-container">
 				<button @click="button1Action" class="btn1 sZw-font">清空填写信息</button>
@@ -83,42 +79,52 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.main {
+.hd {
+	.top{
+		width: 690rpx;
+		height: 192rpx;
+		background-color: #ffffff;
+		margin: auto;
+		margin-top: 30rpx;
+		// padding: 24rpx;
+		padding: 16rpx 24rpx;
+		border-radius: 10rpx;
+		.col{
+			color: #999999;
+		}
+	}
 	.card {
+		// margin-top: 40rpx;
 		display: flex;
-		justify-content: flex-start;
 		.image {
 			flex-shrink: 0;
 			width: 160rpx;
 			height: 160rpx;
 			border-radius: 4px;
 		}
-
+		
 		.text {
 			margin-left: 10px; // 增加一点空间
 			display: flex;
 			flex-direction: column;
 			justify-content: space-between;
-			// line-height: 35px; // 根据你的需求调整,使/文本与图片保持
 			.text_title {
 				display: flex;
-				// align-items: center;
+				align-items: center;
 				.manage {
-					// flex-shrink: 0;
-					padding:0 10rpx;
-					// font-size: 25rpx;
-					// width: 40rpx;
-					// height: 24rpx;
+					// padding:4rpx 12rpx 4rpx 12rpx;
 					display: flex;
+					justify-content: center;
 					align-items: center;
-					min-width: 50rpx;
+					width: 68rpx;
+					height: 36rpx;
+					border-radius: 5rpx;
 					color: #00b2b6;
 					border: 1px solid #00b2b6;
-					border-radius: 3px;
+					// border-radius: 10rpx;
 					margin-right: 10rpx;
 				}
 				.t1 {
-					// font-size: 35rpx;
 					color: black;
 					width: 350rpx;
 					font-weight: 550;
@@ -130,11 +136,20 @@ export default {
 
 		}
 	}
+	.xinxi{
+		background-color: #ffffff;
+		width: 690rpx;
+		// height: 272rpx;
+		margin: auto;
+		margin-top: 20rpx;
+		padding: 20rpx 24rpx;
+		border-radius: 12rpx;
+	}
 	.hdxx {
-		.hd {
+		.xxTit {
 			color: black;
 			// font-size: 18px;
-			font-weight: 400px;
+			// font-weight: 400px;
 			line-height: 42px;
 		}
 		.textcolor {
@@ -155,16 +170,17 @@ export default {
 		width: 100%;
 		display: flex;
 		justify-content: space-around;
-		box-sizing: border-box;
-		padding: 30rpx 0;
-		padding-bottom: 50rpx;
+		align-items: center;
+		height: 137rpx;
+		// padding-bottom: 50rpx;
 		// font-size: 30rpx;
 		.button-container {
 			width: 100%;
 			display: flex;
 			justify-content: space-around;
 			.btn1{
-				width: 45%;
+				width: 326rpx;
+				height: 71rpx;
 				border: 1px solid #666666;
 				border-radius: 50px;
 				height: 70rpx;
@@ -173,16 +189,17 @@ export default {
 				color: #666666;
 			}
 			.btn2{
-				width: 45%;
+				width: 326rpx;
+				height: 71rpx;
 				background-color: #0056a8;
 				border-radius: 50px;
 				height: 70rpx;
 				line-height: 70rpx;
-				// font-size: 35rpx;
 				color: #ffffff;
 			}
 		}
 		
+		
 	}
 }
 </style>

+ 2 - 2
pages/hdxx/hdxx.vue

@@ -78,7 +78,7 @@
 				</view>
 			</view>
 		</view> -->
-		<view class="content">
+<!-- 		<view class="content">
 			<view class="text">
 				<view class="header">
 					<view class="disC three-font">
@@ -99,7 +99,7 @@
 					</view>
 				</view>
 			</view>
-		</view>
+		</view> -->
 	</view>
 </template>
 

+ 172 - 97
pages/index/index.vue

@@ -1,46 +1,48 @@
 <template>
 	<view class="content">
 		<statusBar :item="navBarData"></statusBar>
-			<view class="top">
-				<!-- <image src="../../static/logo.png" mode="aspectFill"></image> -->
-				<image src="../../static/yym/Rectangle25.png" mode="aspectFill"></image>
-			</view>
-			
-			<viewX-Case class="mid">
-				<template #title>
-					<view class="title three-font" >精选活动</view>
-				</template>
-				<template #lookMore>
-					<view class="lookMore fz-font" @click="gotoActivity">查看更多</view>
-				</template>
-				<template #activeBlock>
-					<view class="activeData" @click="gotoActivityDetail" v-for="i in 5" :key="i">
-						<image src="../../static/resource/jqr.png" mode="aspectFill"></image>
-						<view class="activeTit sBtn-font">
-							这里是活动标题这里是活动标题这里是活动标题这里是活动标题
-							<!-- <slot name="ac这里是活动标题这里是活动标题这里是活动标题tiveTit"></slot> -->
-						</view>
-						<view class="numData">
-							<view class="proNum bqZ-font">74 人报名</view>
-							<view class="price num-font"> <text class="fz-font">¥</text>299</view>
-						</view>
-						<button class="btn sBtn-font" @click.stop="gotoHd">立即报名</button>
+		<view class="top">
+			<!-- <image src="http://43.139.158.220:5007/img/static/logo.png" mode="aspectFill"></image> -->
+			<image src="http://43.139.158.220:5007/img/static/yym/Rectangle25.png" mode="aspectFill"></image>
+		</view>
+
+		<viewX-Case class="mid">
+			<template #title>
+				<view class="title three-font">精选活动</view>
+			</template>
+			<template #lookMore>
+				<view class="lookMore fz-font" @click="gotoActivity">查看更多</view>
+			</template>
+			<template #activeBlock>
+				<view class="activeData" @click="gotoActivityDetail" v-for="(item,index) in activeList" :key="index">
+					<image :src="item.img" mode="aspectFill"></image>
+					<view class="activeTit sBtn-font" style="font-weight: bold;">
+						{{ item.className }}
+					</view>
+					<view class="numData">
+						<view class="proNum bqZ-font">{{ item.count }} 人报名</view>
+						<view class="price num-font"> <text class="fz-font">¥</text>299</view>
 					</view>
-				</template>
-			</viewX-Case>
-			
-			
-			<viewX-Case>
-				<template #title>
-					<view class="title three-font">教研室活动</view>
-				</template>
-				<template #lookMore>
-					<view class="lookMore fz-font" @click="teachmore">查看更多</view>
-				</template>
-				<template #teaching>
-					<teaching-case v-for="i in 10" :key="i"></teaching-case>
-				</template>
-			</viewX-Case>
+					<button class="btn sBtn-font" @click.stop="gotoHd">立即报名</button>
+				</view>
+			</template>
+		</viewX-Case>
+
+
+		<viewX-Case>
+			<template #title>
+				<view class="title three-font">教研室活动</view>
+			</template>
+			<template #lookMore>
+				<view class="lookMore fz-font" @click="teachmore">查看更多</view>
+			</template>
+			<template #teaching>
+				<teaching-case v-for="(item,index) in classList" :key="index" :classList='item'></teaching-case>
+			</template>
+		</viewX-Case>
+<view class="" style="height: 30rpx;width: 100%;">
+	
+</view>
 	</view>
 </template>
 
@@ -49,133 +51,206 @@
 		data() {
 			return {
 				title: 'Hello',
-				navBarData:{
-					title:'首页', //导航栏标题
-					btn:0        //是否显示返回按钮 0不显示  1 显示
-				}
+				navBarData: {
+					title: '首页', //导航栏标题
+					btn: 0 //是否显示返回按钮 0不显示  1 显示
+				},
+				activeList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img10.jpg',
+						count: '1790',
+						className: '创新思维开发与落地',
+						intro: '《暂无简介》'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img11.jpg',
+						count: '3842',
+						className: '创业意识与商机识别',
+						intro: '在创新创业的大氛围下,课堂上常常强调要以项目为中心,你却苦于迟迟无法最终确定具体的项目?那么,《创业意识与商机识别》这门课程可以帮助你。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img12.png',
+						count: '701',
+						className: '机电(机械)技术创新创业实务',
+						intro: '该课程是针对机电、机械行业、企业用户的一门关于创新创业的培训类课程。在国家“大众创业、万众创新”的新时代背景下,创新是引领一个企业发展的第一动力。为推动科技不断进步、促进企业快速健康发展,开发了《机电(机械)技术创新创业实务》课程。计划为36学时,理论讲授30学时,实践案例分析和操作6学时'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img13.jpg',
+						count: '823',
+						className: '打造黄金创始人团队',
+						intro: '如何摆正自己的工作态度和位置,清醒认识到自己的职责,学会选人用人,努力提高领导力和执行力,带好团队,并最终成为一个卓越的管理者呢?本课程提供给你建议'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img14.jpg',
+						count: '2287',
+						className: '创业素质测评与团队组建',
+						intro: '本课程采取案例分析、研讨、游戏的方式使同学们的聪明才智能够有发挥的空间,话语权能够得到满足。通过完成团队任务的方式使大家逐渐与陌生人建立良好沟通关系,掌握沟通技巧,使自己具有使命感、懂得感恩。'
+					},
+				],
+				classList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img1.jpg',
+						className: '创业者管理能力训练基础',
+						intro: '《创业者管理能力训练基础》通过管理学、营销学、财税理论、创业基础知识及创业操作实务的提炼,以专题化的形式面向高职类所有专业的学生。本课程一共有三大部分、七个专题。分别为:第一部分,一般管理者能力训练基础,四个专题,即自我管理能力训练、团队管理能力训练、社会关系管理能力训练与团队建设能力训练。第二部分,创业者重要能力的领悟与训练,二个专题,即成功创业者的智力要素、成功创业者商务能力的领悟与训练。第三部分是咖啡厅实践训练。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img2.jpg',
+						className: '创业融资实务',
+						intro: '本课程是创业管理专业、创业班的核心课程,根据专业培养目标的定位,主要面向创投机构服务专员岗位,培养该岗位应具备的相关创业融资知识和技能。课程主要采用“做中学”体验式的设计理念,引入真实项目进行“理实一体实战训练”。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img3.jpg',
+						className: '创业基础',
+						intro: '《创业基础》是一门面向高等院校学生与社会青年开设一门必修的基础理论和易于实际操作的创业综合基础课程。旨激发学员创业激情,增强创业意识,培养学员具备创业基础知识与基本能力,为大学生自主创业、拓展就业及开创事业等提供系统的理论与实践支持。是顺应新时代社会经济与高校教育发展的要求,以市场变化及其趋势为前提,从人才培养机理与中小企业成长规律的角度出发,结合教师多年创业教育与企业家人才培养成功经验,运用企业现代管理新观念,让学员掌握中小企业开办与管理全过程的理论和实务的一门创业综合基础课程。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img4.jpg',
+						className: '打造无敌商业计划书',
+						intro: '暂无简介'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img5.jpg',
+						className: '创新思维',
+						intro: '将创新思维意识与方法技能双元结合,综合微课学习与创造力实践训练融合演进,实现在线学习与配套教材混合驱动。'
+					},
+				]
 			}
 		},
 		onLoad() {
 
 		},
 		methods: {
-			teachmore(){
+			teachmore() {
 				uni.navigateTo({
-					url:"/pages/teachingList/teachingList"
+					url: "/pages/teachingList/teachingList"
 				})
 			},
-			gotoTeDetail(){
+			gotoTeDetail() {
 				uni.navigateTo({
-					url:"/pages/teachingDetail/teachingDetail"
+					url: "/pages/teachingDetail/teachingDetail"
 				})
 			},
-			gotoActivity(){
+			gotoActivity() {
 				uni.navigateTo({
-					url:"/pages/activityList/activityList"
+					url: "/pages/activityList/activityList"
 				})
 			},
-			gotoActivityDetail(){
+			gotoActivityDetail() {
 				uni.navigateTo({
-					url:'/pages/activityDetail/activityDetail'
+					url: '/pages/activityDetail/activityDetail'
 				})
 			},
-			gotoHd(){
+			gotoHd() {
 				uni.navigateTo({
-					url:'/pages/hd/hd'
+					url: '/pages/hd/hd'
 				})
-			}
+			},
+
 		}
 	}
 </script>
 
 <style lang="scss" scoped>
 	.content {
+
 		// background-color: ;
 		// background-color: #f0f2f5;
-		.top{
+		.top {
 			width: 750rpx;
-			height: 150px;
+			height: 288rpx;
 			display: flex;
 			margin-bottom: 20rpx;
 			align-items: center;
 			background-color: #fff;
 			justify-content: center;
-			image{
-				height: 130px;
-				width: 700rpx;
-				border-radius: 10px;
+
+			image {
+				height: 246rpx;
+				width: 690rpx;
+				border-radius: 12rpx;
 			}
 		}
-		.mid{
+
+		.mid {
 			margin: 10px 0;
-			.activeData{
+			height: 498rpx;
+
+			.activeData {
 				width: 290rpx;
 				display: inline-block;
 				padding-right: 20rpx;
-				image{
+
+				image {
 					width: 100%;
 					height: 80px;
 					border-radius: 10px;
 					margin-bottom: 10rpx;
 				}
-				.activeTit{
-					// width: 100rpx;
-					// overflow:hidden; 
-					// text-overflow:ellipsis;
-					font-weight: 600;
-					// font-size: 30rpx;
-					white-space:normal;
+
+				.activeTit {
+					// font-weight: 600;
+					height: 64rpx;
+					white-space: normal;
 					/*隐藏溢出*/
 					/*当文本溢出包含元素时显示省略符号来代表被修剪的文本*/
 					/*规定段落中的文本不进行换行*/
 					letter-spacing: 2rpx;
-					 display: -webkit-box;
-					 word-break: break-all;
-					 text-overflow: ellipsis;
-					 overflow: hidden;
-					 -webkit-box-orient: vertical;
-					 -webkit-line-clamp:2;/*设置 需要显示的行数*/
+					display: -webkit-box;
+					word-break: break-all;
+					text-overflow: ellipsis;
+					overflow: hidden;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					/*设置 需要显示的行数*/
 				}
-				.numData{
+
+				.numData {
 					display: flex;
 					justify-content: space-between;
 					align-items: baseline;
-					padding: 10rpx 0;
-					.proNum{
+
+					// padding: 10rpx 0;
+					.proNum {
 						color: #999999;
 						// font-size: 14px;
 					}
-					.price{
+
+					.price {
 						color: #f68717;
 						// font-size: 18px;
 					}
 				}
-				.btn{
-					// font-size: 12px;
+
+				.btn {
+					border: none;
+					padding: 0;
+					float: left;
+					text-align: center;
+					// padding: 8px 24px 8px 24px;
 					background-color: #3081e8;
 					color: #fff;
-					float: left;
-					height: 28px;
-					line-height: 28px;
-					border-radius: 30px;
-					margin: 15rpx 0;
+					border-radius: 100rpx;
+					width: 144rpx;
+					height: 48rpx;
+					line-height: 48rpx;
+					letter-spacing: 1px;
 					margin-bottom: 30rpx;
-					// margin-top: 0px;
 				}
 			}
-			.activeData:nth-child(1){
+
+			.activeData:nth-child(1) {
 				margin-left: 15px;
 			}
 		}
-		.title{
-				font-weight: bold;
-			}		
-		.lookMore{
+
+		.title {
+			font-weight: bold;
+		}
+
+		.lookMore {
 			color: #666666;
 			// font-size: 14px;
 		}
-		
-		
-		
+
+
+
 	}
-</style>
+</style>

+ 58 - 38
pages/jys/jys.vue

@@ -1,53 +1,48 @@
 <template>
-	<view class="main">
+	<view class="jys">
 		<statusBar :item="navBarData"></statusBar>
-		<uni-card :is-shadow="false">
-			<view class="uni-body">
+		<view class="top">
 				<view class="card">
-					<!-- <img src="../../static/jys/jys.png" alt="" class="image" /> -->
 					<image class="image" src="../../static/jys/jys.png" mode=""></image>
 					<view class="text">
-						<!-- <view class="text_title">
-							<text class="manage">类型</text>
-							<text class="t1">这里是教研室名22222称</text>
-						</view> -->
+						
 						<view class="text_title">
 							<view class="manage bqZ-font">类型</view>
-							<view class="t1 bmTit-font">这里是教研室名这里是教研室名这里是教研室名这里是教研室名</view>
+							<view class="t1 bmTit-font">这里是活动名活动名活动名活动名</view>
 						</view>
-						<view class="">
-							负责人:xxx
+						<view class="col sZw-font">
+							活动日期:5.12~5.13
 						</view>
-						<view class="">
-							教研室标签:
+						<view class="col sZw-font">
+							招募人数:23/50
 						</view>
 					</view>
 				</view>
-			</view>
-		</uni-card>
-		<uni-card :is-shadow="false">
-			<view class="uni-body">
+		</view>
+		
+<!-- <uni-card :is-shadow="false"> -->
+			<view class="xinxi">
 				<view class="card2">
 					<view class="hdxx">
 						<view class="hd btn-font">活动信息</view>
 						<view class="textcolor">
-							<view class="name fz-font">
+							<view class="name  sZw-font">
 								姓名:
-								<text class="name1 fz-font">李某某</text>
+								<text class="name1  sZw-font">李某某</text>
 							</view>
-							<view class="name fz-font">
+							<view class="name  sZw-font">
 								联系方式:
-								<text class="lx1 fz-font">172xxxxx5678</text>
+								<text class="lx1  sZw-font">172xxxxx5678</text>
 							</view>
-							<view class="name fz-font">
+							<view class="name  sZw-font">
 								单位:
-								<text class="dw1 fz-font">xx实验中学学校</text>
+								<text class="dw1  sZw-font">xx实验中学学校</text>
 							</view>
 						</view>
 					</view>
 				</view>
 			</view>
-		</uni-card>
+		<!-- </uni-card> -->
 		<view class="buttons">
 			<view class="button-container">
 				<button @click="button1Action" class="btn1 sZw-font">清空填写信息</button>
@@ -83,7 +78,19 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.main {
+.jys {
+	.top{
+		width: 690rpx;
+		// height: 192rpx;
+		background-color: #ffffff;
+		margin: auto;
+		margin-top: 30rpx;
+		padding: 16rpx 24rpx;
+		border-radius: 10rpx;
+		.col{
+			color: #999999;
+		}
+	}
 	.card {
 		display: flex;
 		justify-content: flex-start;
@@ -102,19 +109,20 @@ export default {
 			// line-height: 35px; // 根据你的需求调整,使/文本与图片保持
 			.text_title {
 				display: flex;
-				// align-items: center;
+				align-items: center;
 				.manage {
-					// flex-shrink: 0;
-					padding:0 10rpx;
-					// font-size: 25rpx;
-					// width: 40rpx;
-					// height: 24rpx;
+					// padding:4rpx 12rpx 4rpx 12rpx;
 					display: flex;
 					align-items: center;
-					min-width: 50rpx;
+					justify-content: center;
+					width: 68rpx;
+					// line-height: 68rpx;
+					height: 36rpx;
+					font-weight: 600rpx;
+					// text-align: center;
 					color: #00b2b6;
 					border: 1px solid #00b2b6;
-					border-radius: 3px;
+					border-radius: 5rpx;
 					margin-right: 10rpx;
 				}
 				.t1 {
@@ -130,6 +138,15 @@ export default {
 
 		}
 	}
+	.xinxi{
+		background-color: #ffffff;
+		width: 690rpx;
+		// height: 272rpx;
+		margin: auto;
+		margin-top: 20rpx;
+		padding: 20rpx 24rpx;
+		border-radius: 12rpx;
+	}
 	.hdxx {
 		.hd {
 			color: black;
@@ -155,16 +172,18 @@ export default {
 		width: 100%;
 		display: flex;
 		justify-content: space-around;
-		box-sizing: border-box;
-		padding: 30rpx 0;
-		padding-bottom: 50rpx;
+		align-items: center;
+		// padding: 30rpx 0;
+		height: 137rpx;
+		// padding-bottom: 50rpx;
 		// font-size: 30rpx;
 		.button-container {
 			width: 100%;
 			display: flex;
 			justify-content: space-around;
 			.btn1{
-				width: 45%;
+				width: 326rpx;
+				height: 71rpx;
 				border: 1px solid #666666;
 				border-radius: 50px;
 				height: 70rpx;
@@ -173,7 +192,8 @@ export default {
 				color: #666666;
 			}
 			.btn2{
-				width: 45%;
+				width: 326rpx;
+				height: 71rpx;
 				background-color: #0056a8;
 				border-radius: 50px;
 				height: 70rpx;

+ 2 - 2
pages/login/login.vue

@@ -2,7 +2,7 @@
 	<view class="login">
 		<statusBar :item='navBarData'></statusBar>
 		<view class="img">
-			<image src="../../static/logo.png"  mode="aspectFill"></image>
+			<image src="http://43.139.158.220:5007/img/static/yym/image7.png"  mode="aspectFill"></image>
 		</view>
 		
 		<view class="mid">
@@ -77,7 +77,7 @@
 				width: 15px;
 				height: 15px;
 				border-radius: 50%;
-				margin-top: 1px;
+				margin-top: 5rpx;
 				// background-color: #4a97f2;
 				margin-right: 10rpx;
 				border: 1px #bdbdbd solid;

+ 1 - 1
pages/login_two/login_two.vue

@@ -183,7 +183,7 @@
 				width: 15px;
 				height: 15px;
 				border-radius: 50%;
-				margin-top: 1px;
+				margin-top: 5rpx;
 				// background-color: #4a97f2;
 				margin-right: 10rpx;
 				border: 1px #bdbdbd solid;

+ 52 - 47
pages/message/message.vue

@@ -5,58 +5,66 @@
 		<view class="mesItem" @click="goToMesDetail">
 			<view class="leftBox" >
 				<view class="mesImg">
-					<image src="../../static/message/notice.svg"  mode="aspectFill"></image>
+					<image src="http://43.139.158.220:5007/img/static/message/notice.svg"  mode="aspectFill"></image>
 				</view>
 				
 				<view class="mesBrief">
-					<view class="tit zw-font">活动通知</view>
-					<view class="breif fz-font">活动报名成功</view>
+					<view class="tit">活动通知</view>
+					<view class="breif fz-font" style="line-height: 40rpx;">活动报名成功</view>
 				</view>
 			</view>
 			
 			<view class="right">
-				<view class="newMessage"></view>
+				<view class="">
+					<view v-if="isAll" class="newMessage"></view>
+				</view>
 				<view class="mesTime fz-font">07-12</view>
 			</view>
 		</view>
 		
-		<view class="mesItem" >
+		
+		<view class="mesItem" @click="goToMeGXt">
 			<view class="leftBox">
 				<view class="mesImg">
-					<image src="../../static/message/system.svg" mode=""></image>
+					<image src="http://43.139.158.220:5007/img/static/message/system.svg" mode=""></image>
 				</view>
 				
 				<view class="mesBrief">
-					<view class="tit zw-font">系统通知</view>
-					<view class="breif">已加入xxxxxx教研室</view>
+					<view class="tit ">系统通知</view>
+					<view class="breif fz-font" style="line-height: 40rpx;">已加入xxxxxx教研室</view>
 				</view>
 			</view>
 			
 			<view class="right">
-				<view class="newMessage"></view>
+				<view class="">
+					<view v-if="xt" class="newMessage"></view>
+				</view>
 				<view class="mesTime fz-font" >07-12</view>
 			</view>
 		</view>
 		
-		<view class="mesItem" >
+		<view class="mesItem" @click="goToMegDy">
 			<view class="leftBox">
 				<view class="mesImg">
-					<image src="../../static/message/subscribe.svg" mode=""></image>
+					<image src="http://43.139.158.220:5007/img/static/message/subscribe.svg" mode=""></image>
 				</view>
 				
 				<view class="mesBrief">
-					<view class="tit zw-font">订阅消息</view>
-					<view class="breif">xxx教研室更新了课程</view>
+					<view class="tit ">订阅消息</view>
+					<view class="breif fz-font" style="line-height: 40rpx;">xxx教研室更新了课程</view>
 				</view>
 			</view>
 			
 			<view class="right">
-				<view class="newMessage"></view>
+			
+				<view class="">
+					<view v-if="dy" class="newMessage"></view>
+				</view>
+				
 				<view class="mesTime fz-font">07-12</view>
 			</view>
 		</view>
 		
-
 	</view>
 </template>
 
@@ -67,8 +75,15 @@
 				navbarData:{
 					title:'消息'
 				},
-				isAll:false,
-				aaa:'rerererererererere'
+				// msgList:[
+				// 	{tit:'hd',isClick:0},
+				// 	{tit:'hd',isClick:0},
+				// 	{tit:'hd',isClick:0},
+				// ]
+				isAll:1,
+				xt:1,
+				dy:1
+				
 			};
 		},
 		methods: {
@@ -76,38 +91,27 @@
 				uni.navigateTo({
 					url: '/pages/hdxx/hdxx'
 				});
+				this.isAll=0
 			},
-			qqq(){
-				this.isAll=!this.isAll
-				if(this.isAll){
-					this.$refs.p.$el.classList.add('is-expanded')
-					console.log(this.$refs.p.$el.classList);
-				}else{
-					this.$refs.p.$el.classList.remove('is-expanded')
-					console.log(this.$refs.p.$el.classList);
-				}
-			}
+			goToMeGXt(){
+				uni.navigateTo({
+					url: '/pages/messageSystem/messageSystem'
+				});
+				this.xt=0
+			},
+			goToMegDy() {
+				uni.navigateTo({
+					url: '/pages/messageDy/messageDy'
+				});
+				this.dy=0
+			},
+
 		}
 	}
 </script>
 
 <style lang="scss">
 	
-	// .content .p{
-	// 	display:block;
-	// 	overflow:hidden;
-	// 	text-overflow:ellipsis;
-	// 	white-space:nowrap;
-	// 	/*设置文字溢出时显示省略号*/
-		
-	// }
-	// .content .p.is-expanded{
-	// 	overflow:visible;
-	// 	white-space:normal;
-	// 	/*文字溢出时不再显示省略号*/
-	// }
-	
-	
 	.messBox {
 		background: #fff;
 		display: flex;
@@ -148,12 +152,14 @@
 					flex-direction: column;
 					justify-content: space-between;
 					.tit{
-						// font-size: 20px;
+						font-size: 32rpx;
+						font-weight: 400;
+						line-height: 48rpx;
 						color: #333333;
 					}
 					.breif{
 						// font-size: 16px;
-						color: #999999;
+						color: rgba(51, 51, 51, 1);
 					}
 				}
 				// .mesBrief:nth-child(1){
@@ -176,9 +182,8 @@
 				}
 				
 				.newMessage {
-					
-					width: 20rpx;
-					height: 20rpx;
+					width: 16rpx;
+					height: 16rpx;
 					background: red;
 					border-radius: 10rpx;
 				}

+ 95 - 0
pages/messageDy/messageDy.vue

@@ -0,0 +1,95 @@
+<template>
+	<view class="messageDy">
+		<statusBar :item="navBarData"></statusBar>
+
+		<view class="content">
+			<view class="text">
+				<view class="header">
+					<view class="disC three-font">
+						欢迎订阅“XXXX讲座”
+						<text class="sj fwb-font">13:28</text>
+					</view>
+				</view>
+				<view class="main">
+					<view style="text-indent: 0em">
+						尊敬的
+						<text>XXX</text>
+					</view>
+
+					<view>
+						您已成功订阅
+						<text class="btn-font" style="color: #0056a8;">[XXXX讲座名称]</text>
+						!欢迎加入我们的团队,我们期待与您一同合作并共同追求卓越教育。
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			navBarData: {
+				title: '系统消息',
+				btn: 1
+			}
+		};
+	}
+};
+</script>
+
+<style lang="scss">
+	.messageDy{
+		padding-bottom: 80rpx;
+	}
+.content {
+	padding: 10px;
+	margin: 10px;
+	background-color: white;
+	border-radius: 8px;
+	// margin-top: 5px;
+	.disC{
+		display: flex;
+		justify-content: space-between;
+		align-items: baseline;
+	}
+	.text {
+		.header {
+			view {
+				color: black;
+				// font-size: 16px;
+				font-weight: 600;
+				margin-bottom: 10px;
+				display: flex;
+				justify-content: space-between;
+				.sj {
+					color: #999999;
+					// font-size: 13px;
+					font-weight: 500;
+				}
+			}
+		}
+		.main {
+			color: #999999;
+			view {
+				font-weight: 400;
+				// font-size: 14px;
+				text-indent: 2em;
+				view {
+					color: #0056a8;
+					font-weight: 600;
+				}
+			}
+			.custom-list {
+				padding-left: 5px;
+				padding-top: 3px;
+			}
+			.custom-list .list-item::before {
+				content: '• ';
+			}
+		}
+	}
+}
+</style>

+ 112 - 0
pages/messageSystem/messageSystem.vue

@@ -0,0 +1,112 @@
+<template>
+	<view class="messageSys">
+		<statusBar :item="navBarData"></statusBar>
+<!-- 		<view class="content">
+			<view class="text">
+				<view class="header">
+					<view class="disC three-font">
+						活动发布成功
+						<text class="sj fwb-font">13:28</text>
+					</view>
+				</view>
+				<view class="main">
+					<view class="fwb-font">
+						恭喜!您已成功完成
+						<text class="btn-font" style="color: #0056a8;">“XXXX讲座”</text>
+						活动发布过程。您的活动现在已经在我们的平台上正式上线,可以被其他用户浏览和参加。请随时返回您的活动管理页面,以进行任何进一步的编辑、更新或促进活动的操作。
+					</view>
+				</view>
+			</view>
+		</view> -->
+		
+		<view class="content">
+			<view class="text">
+				<view class="header">
+					<view class="disC three-font">
+						成功加入教研室
+						<text class="sj fwb-font">13:28</text>
+					</view>
+				</view>
+				<view class="main">
+					<view style="text-indent: 0em">
+						尊敬的
+						<text>XXX</text>
+					</view>
+
+					<view>
+						我们很高兴通知您,您已成功加入
+						<text class="btn-font" style="color: #0056a8;">[教研室名称]</text>
+						!欢迎加入我们的团队,我们期待与您一同合作并共同追求卓越教育。
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			navBarData: {
+				title: '系统消息',
+				btn: 1
+			}
+		};
+	}
+};
+</script>
+
+<style lang="scss">
+	.messageSys{
+		padding-bottom: 80rpx;
+	}
+.content {
+	padding: 10px;
+	margin: 10px;
+	background-color: white;
+	border-radius: 8px;
+	// margin-top: 5px;
+	.disC{
+		display: flex;
+		justify-content: space-between;
+		align-items: baseline;
+	}
+	.text {
+		.header {
+			view {
+				color: black;
+				// font-size: 16px;
+				font-weight: 600;
+				margin-bottom: 10px;
+				display: flex;
+				justify-content: space-between;
+				.sj {
+					color: #999999;
+					// font-size: 13px;
+					font-weight: 500;
+				}
+			}
+		}
+		.main {
+			color: #999999;
+			view {
+				font-weight: 400;
+				// font-size: 14px;
+				text-indent: 2em;
+				view {
+					color: #0056a8;
+					font-weight: 600;
+				}
+			}
+			.custom-list {
+				padding-left: 5px;
+				padding-top: 3px;
+			}
+			.custom-list .list-item::before {
+				content: '• ';
+			}
+		}
+	}
+}
+</style>

+ 15 - 14
pages/mine/mine.vue

@@ -4,7 +4,7 @@
 		<view class="mineBox">
 			<view class="userInformation" @click="gotoMineEdit">
 				<view class="userAvatar">
-					<image :src="userAvatar ? userAvatar : '../../static/mine/Avatar_default.png'" mode="aspectFill"></image>
+					<image :src="userAvatar ? userAvatar : 'http://43.139.158.220:5007/img/static/mine/Avatar_default.png'" mode="aspectFill"></image>
 				</view>
 				<view class="userInfo">
 					<view class="infoTextone">
@@ -21,45 +21,45 @@
 					<view class="optionItem" @click="goToSub(1)">
 						<view class="option_left">
 							<span class="option_icon">
-								<image src="../../static/mine/Subscribe.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/Subscribe.png" mode="aspectFill"></image>
 							</span>
 							<text class="option_text fwb-font">我的订阅</text>
 						</view>
 						<view class="option_right">
-							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
+							<image src="http://43.139.158.220:5007/img/static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
 					<view class="optionItem" @click="gotoMineCollect">
 						<view class="option_left">
 							<span class="option_icon">
-								<image src="../../static/mine/Collect.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/Collect.png" mode="aspectFill"></image>
 							</span>
 							<text class="option_text fwb-font">我的收藏</text>
 						</view>
 						<view class="option_right">
-							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
+							<image src="http://43.139.158.220:5007/img/static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
 					<view class="optionItem" @click="gotoMineActive">
 						<view class="option_left">
 							<span class="option_icon">
-								<image src="../../static/mine/active.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/active.png" mode="aspectFill"></image>
 							</span>
 							<text class="option_text fwb-font">我的活动</text>
 						</view>
 						<view class="option_right">
-							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
+							<image src="http://43.139.158.220:5007/img/static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
 					<view class="optionItem" @click="gotoMineClass">
 						<view class="option_left">
 							<span class="option_icon">
-								<image src="../../static/mine/myClass.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/myClass.png" mode="aspectFill"></image>
 							</span>
 							<text class="option_text fwb-font">我的教研室</text>
 						</view>
 						<view class="option_right">
-							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
+							<image src="http://43.139.158.220:5007/img/static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
 				</view>
@@ -67,23 +67,23 @@
 					<view class="optionItem">
 						<view class="option_left">
 							<span class="option_icon">
-								<image src="../../static/mine/help.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/help.png" mode="aspectFill"></image>
 							</span>
 							<text class="option_text fwb-font">反馈帮助</text>
 						</view>
 						<view class="option_right">
-							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
+							<image src="http://43.139.158.220:5007/img/static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
 					<view class="optionItem" @click="gotoMineEdit">
 						<view class="option_left">
 							<span class="option_icon">
-								<image src="../../static/mine/setting.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/setting.png" mode="aspectFill"></image>
 							</span>
 							<text class="option_text fwb-font">我的设置</text>
 						</view>
 						<view class="option_right">
-							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
+							<image src="http://43.139.158.220:5007/img/static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
 				</view>
@@ -101,7 +101,7 @@ export default {
 				btn: 0
 			},
 			username: '情绪稳定的疯子',
-			userAvatar: '../../static/mine/Avatar.png',
+			userAvatar: 'http://43.139.158.220:5007/img/static/mine/Avatar.png',
 			isManage: true
 		};
 	},
@@ -247,6 +247,7 @@ export default {
 
 					.option_text {
 						margin-left: 10px;
+						color:rgba(0, 0, 0, 0.8);
 					}
 				}
 

+ 73 - 10
pages/mineActive/mineActive.vue

@@ -2,39 +2,45 @@
 	<view>
 		<statusBar :item="navBarData"></statusBar>
 
-		<view class="activeBox" v-for="i in 5" :key="i">
+
+		<view class="activeBox" v-for="(item,index) in activeList" :key="index">
 			<view class="teaching_case">
 				<view class="img">
-					<image src="../../static/activity/bg2.png" mode="aspectFill"></image>
+					<!-- <image src="http://43.139.158.220:5007/img/static/activity/bg2.png" mode="aspectFill"></image> -->
+					<image :src="activeList[index].img" mode="aspectFill"></image>
+
 				</view>
 
 				<view class="right">
 					<view class="title">
 						<view class="tag bqZ-font">类型</view>
-						<text class="three-font" style="font-weight: 600;">这里是活动标题标题标题标题标题</text>
+						<text class="three-font" style="font-weight: 600;">{{ item.className }}</text>
 					</view>
 
 					<view class="introduce">
-						活动描述活动描述活动描述活动描述活动描述活动描述活动描述
+						{{ item.intro }}
 					</view>
 
 					<view class="operate">
 						<view class="left">
 							<view class="money fNum-font"><text class="three-font">¥</text> 188</view>
-							<view class="person">已报名123人</view>
+							<view class="person">已报名{{ item.count }}人</view>
 						</view>
-						
+
 						<view class="Oright">
 							<view class="text">查看详情</view>
 							<view class="arrow">
-								<image src="../../static/mine/arrow-right-blue.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/arrow-right-blue.png" mode="aspectFill"></image>
 							</view>
 						</view>
-						
+
 					</view>
 				</view>
 			</view>
 		</view>
+		<view class="" style="width: 100%;height: 50rpx;">
+			
+		</view>
 	</view>
 </template>
 
@@ -46,6 +52,61 @@
 					title: '我的活动',
 					btn: 1
 				},
+				activeList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img10.jpg',
+						count: '1790',
+						className: '创新思维开发与落地',
+						intro: '《暂无简介》'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img11.jpg',
+						count: '3842',
+						className: '创业意识与商机识别',
+						intro: '在创新创业的大氛围下,课堂上常常强调要以项目为中心,你却苦于迟迟无法最终确定具体的项目?那么,《创业意识与商机识别》这门课程可以帮助你。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img12.png',
+						count: '701',
+						className: '机电(机械)技术创新创业实务',
+						intro: '该课程是针对机电、机械行业、企业用户的一门关于创新创业的培训类课程。在国家“大众创业、万众创新”的新时代背景下,创新是引领一个企业发展的第一动力。为推动科技不断进步、促进企业快速健康发展,开发了《机电(机械)技术创新创业实务》课程。计划为36学时,理论讲授30学时,实践案例分析和操作6学时'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img13.jpg',
+						count: '823',
+						className: '打造黄金创始人团队',
+						intro: '如何摆正自己的工作态度和位置,清醒认识到自己的职责,学会选人用人,努力提高领导力和执行力,带好团队,并最终成为一个卓越的管理者呢?本课程提供给你建议'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img14.jpg',
+						count: '2287',
+						className: '创业素质测评与团队组建',
+						intro: '本课程采取案例分析、研讨、游戏的方式使同学们的聪明才智能够有发挥的空间,话语权能够得到满足。通过完成团队任务的方式使大家逐渐与陌生人建立良好沟通关系,掌握沟通技巧,使自己具有使命感、懂得感恩。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img15.jpg',
+						count: '2076',
+						className: '创业素质测评与团队组建',
+						intro: '《创业素质测评与团队建设课程》根据心理学者荣格所提的“人格特质”理论,围绕心智结构,以特质测评为基础,让同学们运用人格特质的分析了解不同人群之间的思维差异,学会根据不同特质的人才采取不同的行为沟通模式,确定其在创业团队的角色和地位,从而更好的促进创业团队建设及创业团队能力提升。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img16.jpg',
+						count: '11390',
+						className: '行业创业实践',
+						intro: '行业创业实践'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img17.jpg',
+						count: '1639',
+						className: '创业就业指导',
+						intro: '本课程是公共基础课和必修课。课程根据国务院、广东省教育厅关于高校双创教育改革实施意见的有关通知精神,结合提升学生就业、创业竞争力和发展力需求,突出就业知识与技能、创业发展及职业素养的培养。通过本课程的学习,能够使学生掌握     的基础知识,初步具备就业与创业的核心能力;并为学生在职业发展的阶段特点;较为清晰地认识自己的个性特性、职业特性;个性创业素养、个体创业能力等方面提供必要的知识。为个人的生涯发展和社会的创新推动、提高自身就业竞争力,展现良好职业素养,为今后职业发展与事业发展拓展通道。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img18.jpg',
+						count: '2129',
+						className: '营销管理实务与创新',
+						intro: '课程基于线上线下协同的教学方式,注重提升学生自主学习、市场运营创新能力的培养,不断蓄积其专业底蕴;通过学练一体的教学模式,实现对学生营销技术素养与职业人格的协同培养,建立面向复杂市场的商业逻辑。课程线上部分共24学时,开课一学期 ;线下部分一般以24~36学时为宜。'
+					},
+				]
 			};
 		}
 	}
@@ -84,7 +145,7 @@
 				.title {
 					display: flex;
 					align-items: center;
-					
+
 					margin-bottom: 5px;
 
 					.tag {
@@ -162,11 +223,13 @@
 							font-size: 24rpx;
 							color: #3081E8;
 						}
+
 						.arrow {
 							display: flex;
 							justify-content: center;
 							margin-top: 5rpx;
-							image{
+
+							image {
 								width: 32rpx;
 								height: 32rpx;
 							}

+ 91 - 19
pages/mineClass/mineClass.vue

@@ -2,27 +2,31 @@
 	<view>
 		<statusBar :item="navBarData"></statusBar>
 
-		<view class="activeBox" v-for="i in 5" :key="i">
+		<!-- <view class="activeBox" v-for="i in 5" :key="i"> -->
+		<view class="activeBox" v-for="(item,index) in classList" :key="index">
+
 			<view class="teaching_case">
 				<view class="img">
-					<image src="../../static/mine/Rectangle 23.png" mode="aspectFill"></image>
+					<!-- <image src="http://43.139.158.220:5007/img/static/mine/Rectangle 23.png" mode="aspectFill"></image> -->
+					<image :src="classList[index].img" mode="aspectFill"></image>
 				</view>
 
 				<view class="right">
 					<view class="title">
 						<view class="tag">类型</view>
-						<text>这里是教研室标题标题标题标题标题</text>
+						<text>{{ item.className }}</text>
 					</view>
 
 					<view class="introduce">
-						详细介绍详细介绍详细介绍详细介绍详细介绍详细介绍详细介绍详细介绍
+						{{ item.intro }}
 					</view>
 
 					<view class="operate">
 						<view class="left">
 							<view class="leftCollect">
 								<view class="icon">
-									<image src="../../static/mine/Collect_yellow.png" mode="aspectFill"></image>
+									<image src="http://43.139.158.220:5007/img/static/mine/Collect_yellow.png"
+										mode="aspectFill"></image>
 								</view>
 								<view class="text">
 									<span>收藏</span>
@@ -30,23 +34,27 @@
 							</view>
 							<view class="leftSubscribe">
 								<view class="icon">
-									<image src="../../static/mine/Subscribe_gray.png" mode="aspectFill"></image>
+									<image src="http://43.139.158.220:5007/img/static/mine/Subscribe_gray.png"
+										mode="aspectFill"></image>
 								</view>
 								<view class="text">
 									<span>订阅</span>
 								</view>
 							</view>
 						</view>
-						<view class="right">
+						<view class="btnGoto">
 							<view class="text">查看详情</view>
 							<view class="arrow">
-								<image src="../../static/mine/arrow-right-blue.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/arrow-right-blue.png"
+									mode="aspectFill"></image>
 							</view>
 						</view>
 					</view>
 				</view>
 			</view>
 		</view>
+		<view class="" style="padding-bottom: 50rpx;">
+		</view>
 	</view>
 </template>
 
@@ -58,6 +66,57 @@
 					title: '我的教研室',
 					btn: 1
 				},
+				classList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img1.jpg',
+						className: '创业者管理能力训练基础',
+						intro: '《创业者管理能力训练基础》通过管理学、营销学、财税理论、创业基础知识及创业操作实务的提炼,以专题化的形式面向高职类所有专业的学生。本课程一共有三大部分、七个专题。分别为:第一部分,一般管理者能力训练基础,四个专题,即自我管理能力训练、团队管理能力训练、社会关系管理能力训练与团队建设能力训练。第二部分,创业者重要能力的领悟与训练,二个专题,即成功创业者的智力要素、成功创业者商务能力的领悟与训练。第三部分是咖啡厅实践训练。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img2.jpg',
+						className: '创业融资实务',
+						intro: '本课程是创业管理专业、创业班的核心课程,根据专业培养目标的定位,主要面向创投机构服务专员岗位,培养该岗位应具备的相关创业融资知识和技能。课程主要采用“做中学”体验式的设计理念,引入真实项目进行“理实一体实战训练”。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img3.jpg',
+						className: '创业基础',
+						intro: '《创业基础》是一门面向高等院校学生与社会青年开设一门必修的基础理论和易于实际操作的创业综合基础课程。旨激发学员创业激情,增强创业意识,培养学员具备创业基础知识与基本能力,为大学生自主创业、拓展就业及开创事业等提供系统的理论与实践支持。是顺应新时代社会经济与高校教育发展的要求,以市场变化及其趋势为前提,从人才培养机理与中小企业成长规律的角度出发,结合教师多年创业教育与企业家人才培养成功经验,运用企业现代管理新观念,让学员掌握中小企业开办与管理全过程的理论和实务的一门创业综合基础课程。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img4.jpg',
+						className: '打造无敌商业计划书',
+						intro: '暂无简介'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img5.jpg',
+						className: '创新思维',
+						intro: '将创新思维意识与方法技能双元结合,综合微课学习与创造力实践训练融合演进,实现在线学习与配套教材混合驱动。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+						className: '创业经营',
+						intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+						className: '创业经营',
+						intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img7.jpg',
+						className: '跨境电商创业',
+						intro: '跨境电商所有平台中利润最高、要求最高的就是亚马逊平台。 跨境电商企业需求最多的也是亚马逊运营人才。 《跨境电商创业》课程汇聚了一批有丰富亚马逊实战经验的高校创业导师、企业大卖家和大学生创业者,以经验分享、后台实操演示和创业案例剖析等形式,手把手教您亚马逊平台实操运营,带您开启跨境电商创业之路。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img8.jpg',
+						className: '精益创业方法论',
+						intro: '暂无简介'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img9.png',
+						className: '互联网营销策划实务',
+						intro: '课程开发以创业就业能力培养为导向;以培养学生职业生涯发展、专业技能、自主学习与创新能力、职业素质为指导。使课程实现“项目化、任务化、碎片化、实战化”。便于学生利用零碎时间、移动设备学习。课程配有成套微课程视频外,还提供全套的教学与自学材料的国家及省级精品在线开放课程。'
+					},
+				],
 			};
 		}
 	}
@@ -81,6 +140,7 @@
 				image {
 					width: 100%;
 					height: 100%;
+					border-radius: 10rpx;
 				}
 			}
 
@@ -94,17 +154,20 @@
 
 				.title {
 					display: flex;
+					align-items: center;
 					margin-bottom: 5px;
 
 					.tag {
 						border: 1px #00b2b6 solid;
 						font-size: 20rpx;
+						width: 64rpx;
 						display: flex;
+						height: 32rpx;
 						white-space: nowrap;
 						justify-content: center;
 						align-items: center;
-						padding: 2px 4px;
-						border-radius: 3px;
+						// padding: 4px 12px 4px 12px;
+						border-radius: 5rpx;
 						margin-right: 10rpx;
 						color: #00b2b6;
 					}
@@ -146,13 +209,16 @@
 							display: flex;
 							align-items: flex-end;
 							margin-right: 15px;
-							.text{
+
+							.text {
 								display: flex;
 								margin-left: 5px;
 							}
-							.icon{
+
+							.icon {
 								display: flex;
-								image{
+
+								image {
 									width: 32rpx;
 									height: 32rpx;
 								}
@@ -162,14 +228,17 @@
 						.leftSubscribe {
 							display: flex;
 							align-items: flex-end;
+
 							// margin-left: 15px;
-							.text{
+							.text {
 								display: flex;
 								margin-left: 5px;
 							}
-							.icon{
+
+							.icon {
 								display: flex;
-								image{
+
+								image {
 									width: 32rpx;
 									height: 32rpx;
 								}
@@ -177,21 +246,24 @@
 						}
 					}
 
-					.right {
+					.btnGoto {
 						width: 80px;
 						// height: 24px;
 						display: flex;
 						flex-direction: row;
-						justify-content: space-around;
+						justify-content: flex-start;
+						align-items: center;
 						align-items: flex-end;
 
 						.text {
 							font-size: 24rpx;
 							color: #3081E8;
 						}
+
 						.arrow {
 							line-height: 10px;
-							image{
+
+							image {
 								width: 32rpx;
 								height: 32rpx;
 							}

+ 61 - 7
pages/mineCollect/mineCollect.vue

@@ -6,10 +6,12 @@
 			<view class="collect_length">
 				<span>共3条收藏</span>
 			</view>
-			<view class="classBox" v-for="i in 3" :key="i">
+			<view class="classBox" v-for="(item,index) in classList" :key="index">
+
 				<view class="classTitle">
-					<span>这里是教研室标题</span>
-					<image src="../../static/mine/Collect_yellow.png" mode="aspectFill"></image>
+					<span>{{ item.className }}</span>
+					<image src="http://43.139.158.220:5007/img/static/mine/Collect_yellow.png" mode="aspectFill"></image>
+
 				</view>
 				<view class="classContent">
 					<view class="contentLeft">
@@ -20,11 +22,11 @@
 							<span class="c_time">21:07</span>
 						</view>
 						<view class="classIntro">
-							<span>说明文字教研室简介,最多两行教研室简介教研室简介教研室简介教研室简介教研室简介</span>
+							<span>{{ item.intro }}</span>
 						</view>
 					</view>
 					<view class="contentRight">
-						<image src="../../static/mine/Collect_default.png" mode="aspectFill"></image>
+						<image :src="classList[index].img" mode="aspectFill"></image>
 					</view>
 				</view>
 			</view>
@@ -40,6 +42,57 @@
 					title: '我的收藏',
 					btn: 1
 				},
+				classList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img1.jpg',
+						className: '创业者管理能力训练基础',
+						intro: '《创业者管理能力训练基础》通过管理学、营销学、财税理论、创业基础知识及创业操作实务的提炼,以专题化的形式面向高职类所有专业的学生。本课程一共有三大部分、七个专题。分别为:第一部分,一般管理者能力训练基础,四个专题,即自我管理能力训练、团队管理能力训练、社会关系管理能力训练与团队建设能力训练。第二部分,创业者重要能力的领悟与训练,二个专题,即成功创业者的智力要素、成功创业者商务能力的领悟与训练。第三部分是咖啡厅实践训练。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img2.jpg',
+						className: '创业融资实务',
+						intro: '本课程是创业管理专业、创业班的核心课程,根据专业培养目标的定位,主要面向创投机构服务专员岗位,培养该岗位应具备的相关创业融资知识和技能。课程主要采用“做中学”体验式的设计理念,引入真实项目进行“理实一体实战训练”。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img3.jpg',
+						className: '创业基础',
+						intro: '《创业基础》是一门面向高等院校学生与社会青年开设一门必修的基础理论和易于实际操作的创业综合基础课程。旨激发学员创业激情,增强创业意识,培养学员具备创业基础知识与基本能力,为大学生自主创业、拓展就业及开创事业等提供系统的理论与实践支持。是顺应新时代社会经济与高校教育发展的要求,以市场变化及其趋势为前提,从人才培养机理与中小企业成长规律的角度出发,结合教师多年创业教育与企业家人才培养成功经验,运用企业现代管理新观念,让学员掌握中小企业开办与管理全过程的理论和实务的一门创业综合基础课程。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img4.jpg',
+						className: '打造无敌商业计划书',
+						intro: '暂无简介'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img5.jpg',
+						className: '创新思维',
+						intro: '将创新思维意识与方法技能双元结合,综合微课学习与创造力实践训练融合演进,实现在线学习与配套教材混合驱动。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+						className: '创业经营',
+						intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+						className: '创业经营',
+						intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img7.jpg',
+						className: '跨境电商创业',
+						intro: '跨境电商所有平台中利润最高、要求最高的就是亚马逊平台。 跨境电商企业需求最多的也是亚马逊运营人才。 《跨境电商创业》课程汇聚了一批有丰富亚马逊实战经验的高校创业导师、企业大卖家和大学生创业者,以经验分享、后台实操演示和创业案例剖析等形式,手把手教您亚马逊平台实操运营,带您开启跨境电商创业之路。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img8.jpg',
+						className: '精益创业方法论',
+						intro: '暂无简介'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img9.png',
+						className: '互联网营销策划实务',
+						intro: '课程开发以创业就业能力培养为导向;以培养学生职业生涯发展、专业技能、自主学习与创新能力、职业素质为指导。使课程实现“项目化、任务化、碎片化、实战化”。便于学生利用零碎时间、移动设备学习。课程配有成套微课程视频外,还提供全套的教学与自学材料的国家及省级精品在线开放课程。'
+					},
+				],
 			};
 		}
 	}
@@ -48,7 +101,8 @@
 <style lang="scss">
 	.collectBox {
 		margin: 0 30rpx;
-
+		// margin-bottom: 30rpx;
+		padding-bottom: 50rpx;
 		.collect_length {
 			width: 100%;
 			height: 40rpx;
@@ -67,7 +121,7 @@
 			background-color: #fff;
 			border-radius: 20rpx;
 			padding: 0 16rpx;
-			margin-bottom: 8px;
+			margin-bottom: 20rpx;
 
 			.classTitle {
 				display: flex;

+ 16 - 14
pages/mineEdit/mineEdit.vue

@@ -5,19 +5,19 @@
 		<view class="editBox">
 			<view class="edit_avatar">
 				<view class="edit_title">
-					<span>头像</span>
+					<text>头像</text>
 				</view>
 				<view class="userAvatar">
-					<image src="../../static/mine/Rectangle 1547.png" mode="aspectFill"></image>
+					<image src="http://43.139.158.220:5007/img/static/mine/Rectangle 1547.png" mode="aspectFill"></image>
 				</view>
 			</view>
 			<view class="setName">
 				<view class="edit_title">
-					<span>昵称</span>
+					<text>昵称</text>
 				</view>
 				<view class="input_details">
 					<view class="nickname">
-						<input type="text" maxlength="10" placeholder="请输入一个昵称"
+						<input type="text" style=" text-align: right;" maxlength="10" placeholder="请输入一个昵称"
 							placeholder-style="font-size: 28rpx; color: rgb(153, 153, 153);" v-model="nickname" />
 					</view>
 				</view>
@@ -26,14 +26,14 @@
 				<picker mode="selector" :range="genderList" @change="handelGender">
 					<view class="content">
 						<view class="edit_title">
-							<span>性别</span>
+							<text>性别</text>
 						</view>
 						<view class="input_details">
 							<view class="details">
 								<view class="uni-input text">{{gender}}</view>
 							</view>
 							<view class="arrow">
-								<image src="../../static/mine/arrow-right_gray.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/arrow-right_gray.png" mode="aspectFill"></image>
 							</view>
 						</view>
 					</view>
@@ -43,14 +43,14 @@
 				<picker mode="selector" :range="schoolList" @change="handelSchool">
 					<view class="content">
 						<view class="edit_title">
-							<span>学校</span>
+							<text>学校</text>
 						</view>
 						<view class="input_details">
 							<view class="details">
 								<view class="uni-input text">{{school}}</view>
 							</view>
 							<view class="arrow">
-								<image src="../../static/mine/arrow-right_gray.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/arrow-right_gray.png" mode="aspectFill"></image>
 							</view>
 						</view>
 					</view>
@@ -60,14 +60,14 @@
 				<picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange">
 					<view class="content">
 						<view class="edit_title">
-							<span>生日</span>
+							<text>生日</text>
 						</view>
 						<view class="input_details">
 							<view class="details">
 								<view class="uni-input text">{{date}}</view>
 							</view>
 							<view class="arrow">
-								<image src="../../static/mine/arrow-right_gray.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/arrow-right_gray.png" mode="aspectFill"></image>
 							</view>
 						</view>
 					</view>
@@ -77,14 +77,14 @@
 				<picker mode="selector" :range="hobbyList" @change="handelHobby">
 					<view class="content">
 						<view class="edit_title">
-							<span>兴趣标签</span>
+							<text>兴趣标签</text>
 						</view>
 						<view class="input_details">
 							<view class="details">
 								<view class="uni-input text">{{hobby}}</view>
 							</view>
 							<view class="arrow">
-								<image src="../../static/mine/arrow-right_gray.png" mode="aspectFill"></image>
+								<image src="http://43.139.158.220:5007/img/static/mine/arrow-right_gray.png" mode="aspectFill"></image>
 							</view>
 						</view>
 					</view>
@@ -92,7 +92,7 @@
 			</view>
 			<view class="setIntro">
 				<view class="edit_title">
-					<span>简介</span>
+					<text>简介</text>
 				</view>
 				<view class="input_details">
 					<view class="selfdomIntro">
@@ -226,8 +226,10 @@
 				flex-direction: row;
 
 				.nickname {
-					width: 100px;
+					width: 350rpx;
 					text-align: end;
+					// padding-right: 10rpx;
+					// margin-right: 10rpx;
 					font-size: 28rpx;
 					color: rgb(153, 153, 153);
 				}

+ 314 - 158
pages/mineSubscribe/mineSubscribe.vue

@@ -1,7 +1,7 @@
 <template>
-	<view class="content" >
+	<view class="content">
 		<statusBar :item="navBarData"></statusBar>
-		
+
 		<view class="" style="width: 750rpx;height: 60px;">
 			<view class="activeTitle">
 				<view class="left" @click="phoneLogin" :class="current==0?active:test">
@@ -9,62 +9,68 @@
 					<view :class="current==0?yun:test"></view>
 				</view>
 				<view class="right" @click="accountLogin" :class="current==1?active:test">
-					<text class="zw-font">非常规活动</text>
+					<text class="zw-font">特色活动</text>
 					<view :class="current==1?yun:test"></view>
 				</view>
 			</view>
 		</view>
-		
+
 		<swiper class="scroll-view-height" @change="swipeIndex" :current="current" :duration="300">
 			<swiper-item>
 				<scroll-view scroll-y="true" style="height: 80vh;">
 					<view class="activeClass">
-						<view class="classBox" v-for="i in 20" :key="i">
+						<view class="classBox" v-for="(item,index) in classList" :key="index">
+
 							<view class="classLeft">
 								<view class="class_Img">
-									<image src="../../static/mine/activeclass.png" mode=""></image>
+									<image :src="classList[index].img" mode="aspectFill"></image>
 								</view>
 								<view class="class_Text">
 									<view class="text_Title">
 										<text class="manage">类型</text>
-										<text>教研室标题</text>
+										<text>{{ item.className }}</text>
+
 									</view>
 									<view class="text_Intro">
-										<text>说明文字教研室简介</text>
+										<text>{{ item.intro }}</text>
 									</view>
 								</view>
 							</view>
 							<view class="classright">
-								<image src="../../static/mine/Union.png" mode=""></image>
+								<!-- <image src="../../static/mine/Union.png" mode="aspectFill"></image> -->
+								<image src="../../static/mine/Union.png" mode="aspectFill"></image>
+
 							</view>
 						</view>
 					</view>
 				</scroll-view>
-					
-				
+
+
 			</swiper-item>
 			<swiper-item>
-				<view class="activeClass">
-					<view class="classBox" v-for="i in 7" :key="i">
-						<view class="classLeft">
-							<view class="class_Img">
-								<image src="../../static/mine/myactive.png" mode=""></image>
-							</view>
-							<view class="class_Text">
-								<view class="text_Title">
-									<text class="manage">类型</text>
-									<text>活动标题</text>
+				<scroll-view scroll-y="true" style="height: 80vh;">
+					<view class="activeClass">
+						<view class="classBox" v-for="(item,index) in activeList" :key="index">
+							<view class="classLeft">
+								<view class="class_Img">
+									<image :src="activeList[index].img" mode="aspectFill"></image>
 								</view>
-								<view class="text_Intro">
-									<text>说明文字教研室简介</text>
+								<view class="class_Text">
+									<view class="text_Title">
+										<text class="manage">类型</text>
+										<text>{{ item.className }}</text>
+									</view>
+									<view class="text_Intro">
+										<text>{{ item.intro }}</text>
+									</view>
 								</view>
 							</view>
-						</view>
-						<view class="classright">
-							<image src="../../static/mine/Union.png" mode=""></image>
+							<view class="classright">
+								<image src="http://43.139.158.220:5007/img/static/mine/Union.png" mode=""></image>
+							</view>
 						</view>
 					</view>
-				</view>
+				</scroll-view>
 			</swiper-item>
 		</swiper>
 	</view>
@@ -78,163 +84,313 @@
 					title: '我的订阅',
 					btn: 1
 				},
-				current:0,//切换
-				
-				aaa:`calc(100vh-60vh)`,
-				
-				navheight:this.navheight,		//导航栏高度
-				
-				active:'active',  //类名
-				test:'test',
-				yun:'yun',
+				current: 0, //切换
+
+				aaa: `calc(100vh-60vh)`,
+
+				navheight: this.navheight, //导航栏高度
+
+				active: 'active', //类名
+				test: 'test',
+				yun: 'yun',
+				classList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img1.jpg',
+						className: '创业者管理能力训练基础',
+						intro: '《创业者管理能力训练基础》通过管理学、营销学、财税理论、创业基础知识及创业操作实务的提炼,以专题化的形式面向高职类所有专业的学生。本课程一共有三大部分、七个专题。分别为:第一部分,一般管理者能力训练基础,四个专题,即自我管理能力训练、团队管理能力训练、社会关系管理能力训练与团队建设能力训练。第二部分,创业者重要能力的领悟与训练,二个专题,即成功创业者的智力要素、成功创业者商务能力的领悟与训练。第三部分是咖啡厅实践训练。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img2.jpg',
+						className: '创业融资实务',
+						intro: '本课程是创业管理专业、创业班的核心课程,根据专业培养目标的定位,主要面向创投机构服务专员岗位,培养该岗位应具备的相关创业融资知识和技能。课程主要采用“做中学”体验式的设计理念,引入真实项目进行“理实一体实战训练”。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img3.jpg',
+						className: '创业基础',
+						intro: '《创业基础》是一门面向高等院校学生与社会青年开设一门必修的基础理论和易于实际操作的创业综合基础课程。旨激发学员创业激情,增强创业意识,培养学员具备创业基础知识与基本能力,为大学生自主创业、拓展就业及开创事业等提供系统的理论与实践支持。是顺应新时代社会经济与高校教育发展的要求,以市场变化及其趋势为前提,从人才培养机理与中小企业成长规律的角度出发,结合教师多年创业教育与企业家人才培养成功经验,运用企业现代管理新观念,让学员掌握中小企业开办与管理全过程的理论和实务的一门创业综合基础课程。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img4.jpg',
+						className: '打造无敌商业计划书',
+						intro: '暂无简介'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img5.jpg',
+						className: '创新思维',
+						intro: '将创新思维意识与方法技能双元结合,综合微课学习与创造力实践训练融合演进,实现在线学习与配套教材混合驱动。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+						className: '创业经营',
+						intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+						className: '创业经营',
+						intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img7.jpg',
+						className: '跨境电商创业',
+						intro: '跨境电商所有平台中利润最高、要求最高的就是亚马逊平台。 跨境电商企业需求最多的也是亚马逊运营人才。 《跨境电商创业》课程汇聚了一批有丰富亚马逊实战经验的高校创业导师、企业大卖家和大学生创业者,以经验分享、后台实操演示和创业案例剖析等形式,手把手教您亚马逊平台实操运营,带您开启跨境电商创业之路。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img8.jpg',
+						className: '精益创业方法论',
+						intro: '暂无简介'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img9.png',
+						className: '互联网营销策划实务',
+						intro: '课程开发以创业就业能力培养为导向;以培养学生职业生涯发展、专业技能、自主学习与创新能力、职业素质为指导。使课程实现“项目化、任务化、碎片化、实战化”。便于学生利用零碎时间、移动设备学习。课程配有成套微课程视频外,还提供全套的教学与自学材料的国家及省级精品在线开放课程。'
+					},
+				],
+				activeList: [{
+						img: 'http://43.139.158.220:5007/img/static/mine/img10.jpg',
+						count: '1790',
+						className: '创新思维开发与落地',
+						intro: '《暂无简介》'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img11.jpg',
+						count: '3842',
+						className: '创业意识与商机识别',
+						intro: '在创新创业的大氛围下,课堂上常常强调要以项目为中心,你却苦于迟迟无法最终确定具体的项目?那么,《创业意识与商机识别》这门课程可以帮助你。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img12.png',
+						count: '701',
+						className: '机电(机械)技术创新创业实务',
+						intro: '该课程是针对机电、机械行业、企业用户的一门关于创新创业的培训类课程。在国家“大众创业、万众创新”的新时代背景下,创新是引领一个企业发展的第一动力。为推动科技不断进步、促进企业快速健康发展,开发了《机电(机械)技术创新创业实务》课程。计划为36学时,理论讲授30学时,实践案例分析和操作6学时'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img13.jpg',
+						count: '823',
+						className: '打造黄金创始人团队',
+						intro: '如何摆正自己的工作态度和位置,清醒认识到自己的职责,学会选人用人,努力提高领导力和执行力,带好团队,并最终成为一个卓越的管理者呢?本课程提供给你建议'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img14.jpg',
+						count: '2287',
+						className: '创业素质测评与团队组建',
+						intro: '本课程采取案例分析、研讨、游戏的方式使同学们的聪明才智能够有发挥的空间,话语权能够得到满足。通过完成团队任务的方式使大家逐渐与陌生人建立良好沟通关系,掌握沟通技巧,使自己具有使命感、懂得感恩。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img15.jpg',
+						count: '2076',
+						className: '创业素质测评与团队组建',
+						intro: '《创业素质测评与团队建设课程》根据心理学者荣格所提的“人格特质”理论,围绕心智结构,以特质测评为基础,让同学们运用人格特质的分析了解不同人群之间的思维差异,学会根据不同特质的人才采取不同的行为沟通模式,确定其在创业团队的角色和地位,从而更好的促进创业团队建设及创业团队能力提升。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img16.jpg',
+						count: '11390',
+						className: '行业创业实践',
+						intro: '行业创业实践'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img17.jpg',
+						count: '1639',
+						className: '创业就业指导',
+						intro: '本课程是公共基础课和必修课。课程根据国务院、广东省教育厅关于高校双创教育改革实施意见的有关通知精神,结合提升学生就业、创业竞争力和发展力需求,突出就业知识与技能、创业发展及职业素养的培养。通过本课程的学习,能够使学生掌握     的基础知识,初步具备就业与创业的核心能力;并为学生在职业发展的阶段特点;较为清晰地认识自己的个性特性、职业特性;个性创业素养、个体创业能力等方面提供必要的知识。为个人的生涯发展和社会的创新推动、提高自身就业竞争力,展现良好职业素养,为今后职业发展与事业发展拓展通道。'
+					},
+					{
+						img: 'http://43.139.158.220:5007/img/static/mine/img18.jpg',
+						count: '2129',
+						className: '营销管理实务与创新',
+						intro: '课程基于线上线下协同的教学方式,注重提升学生自主学习、市场运营创新能力的培养,不断蓄积其专业底蕴;通过学练一体的教学模式,实现对学生营销技术素养与职业人格的协同培养,建立面向复杂市场的商业逻辑。课程线上部分共24学时,开课一学期 ;线下部分一般以24~36学时为宜。'
+					},
+				]
 			};
 		},
-		  computed: {
-		     dynamicStyle() {
-		       return {
-		         height: `calc(100vh - 10px)`
-		       };
-		     }
-		   },
+		computed: {
+			dynamicStyle() {
+				return {
+					height: `calc(100vh - 10px)`
+				};
+			}
+		},
 		methods: {
-			swipeIndex(index){
-				this.current=index.detail.current;
+			swipeIndex(index) {
+				this.current = index.detail.current;
 			},
-			phoneLogin(){
-				this.current=0
+			phoneLogin() {
+				this.current = 0
 			},
-			accountLogin(){
-				this.current=1
+			accountLogin() {
+				this.current = 1
 			},
 		}
 	}
 </script>
 
 <style lang="scss">
-.content{
-	height: 100vh;
-	width: 750rpx;
-	background-color: #ffffff;
-	.activeTitle{
-		position: fixed;
-		z-index: 9;
-		width: 100%;
-		height: 60px;
-		background-color: white;
-		border-top: 1px solid lightgray;
-		display: flex;
-		justify-content: center;
-		padding: 0 30px;
-		font-size: 34rpx;
-		.test{
-			// height: ;
-		}
-		.active{
-			position: relative;
-			font-weight: bold;
-			.yun{
-				width: 80rpx;
-				height: 0rpx;
-				position: absolute;
-				left: 50%;
-				top: 65%;
-				transform: translate(-50%,-50%);
-				box-shadow: 0px 0px 10px 2px #4a97f2;
-			}
-		}
-		.left{
-			width: 50%;
-			height: 100%;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-		}
-		.right{
-			width: 50%;
-			height: 100%;
+	.content {
+		height: 100vh;
+		width: 750rpx;
+		background-color: #ffffff;
+
+		.activeTitle {
+			position: fixed;
+			z-index: 9;
+			width: 100%;
+			height: 60px;
+			background-color: white;
+			border-top: 1px solid lightgray;
 			display: flex;
 			justify-content: center;
-			align-items: center;
+			padding: 0 30px;
+			font-size: 34rpx;
+
+			.test {
+				// height: ;
+			}
+
+			.active {
+				position: relative;
+				font-weight: bold;
+
+				.yun {
+					width: 80rpx;
+					height: 0rpx;
+					position: absolute;
+					left: 50%;
+					top: 65%;
+					transform: translate(-50%, -50%);
+					box-shadow: 0px 0px 10px 2px #4a97f2;
+				}
+			}
+
+			.left {
+				width: 50%;
+				height: 100%;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+			}
+
+			.right {
+				width: 50%;
+				height: 100%;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+			}
 		}
-	}
-	.scroll-view-height{
-		// height: 200vmin;
-		height: 80vh;
-		// height: auto;
-		.activeClass{
-			width: 100%;
+
+		.scroll-view-height {
+			// height: 200vmin;
+			height: 80vh;
+
 			// height: auto;
-			.classBox{
-				display: flex;
-				justify-content: space-between;
-				padding: 0 47rpx;
-				background-color: #fff;
-				height: 144rpx;
-				.classLeft{
+			.activeClass {
+				width: 100%;
+
+				// height: auto;
+				.classBox {
 					display: flex;
-					height: 100%;
-					.class_Img{
-						display: flex;
-						align-items: center;
-						flex-grow: 1;
-						image{
-							width: 80rpx;
-							height: 80rpx;
-						}
-					}
-					.class_Text{
+					justify-content: space-between;
+					padding: 0 47rpx;
+					background-color: #fff;
+					height: 144rpx;
+
+					.classLeft {
 						display: flex;
-						justify-content: center;
-						flex-grow: 2;
-						flex-direction: column;
-						.text_Title{
+						height: 100%;
+
+						.class_Img {
 							display: flex;
-							margin-bottom: 6px;
-							text{
-								&:last-child {
-									color: #000;
-									font-size: 28rpx;
-									font-weight: 600;
-								}
-								
-								&.manage {
-									border: 1px #00b2b6 solid;
-									font-size: 10px;
-									display: flex;
-									white-space: nowrap;
-									justify-content: center;
-									align-items: center;
-									padding: 1px 6px;
-									border-radius: 3px;
-									margin-right: 10rpx;
-									color: #00b2b6;
-									margin-left: 6px;
-									font-weight: 600;
-								}
+							align-items: center;
+							flex-grow: 1;
+
+							image {
+								width: 80rpx;
+								height: 80rpx;
+								border-radius: 10rpx;
 							}
 						}
-						.text_Intro{
+
+						.class_Text {
 							display: flex;
-							text{
-								font-size: 24rpx;
-								font-weight: 400;
-								color: rgb(191, 191, 191);
-								margin-left: 6px;
+							justify-content: center;
+							flex-grow: 2;
+							flex-direction: column;
+							margin-left: 20rpx;
+
+							.text_Title {
+								display: flex;
+								margin-bottom: 6px;
+								align-items: center;
+
+								text {
+									&:last-child {
+										color: #000;
+										font-size: 28rpx;
+										font-weight: 600;
+									}
+
+									&.manage {
+										// border: 1px #00b2b6 solid;
+										// font-size: 10px;
+										// display: flex;
+										// white-space: nowrap;
+										// justify-content: center;
+										// align-items: center;
+										// padding: 1px 6px;
+										// border-radius: 3px;
+										// margin-right: 10rpx;
+										// color: #00b2b6;
+										// margin-left: 6px;
+										// font-weight: 600;
+										border: 1px #00b2b6 solid;
+										font-size: 20rpx;
+										width: 64rpx;
+										display: flex;
+										height: 32rpx;
+										white-space: nowrap;
+										justify-content: center;
+										align-items: center;
+										// padding: 4px 12px 4px 12px;
+										border-radius: 5rpx;
+										margin-right: 10rpx;
+										color: #00b2b6;
+									}
+								}
+							}
+
+							.text_Intro {
+								display: flex;
+
+								text {
+									font-size: 24rpx;
+									font-weight: 400;
+									color: rgb(191, 191, 191);
+									width: 90%;
+									letter-spacing: 2rpx;
+									display: -webkit-box;
+									word-break: break-all;
+									text-overflow: ellipsis;
+									overflow: hidden;
+									-webkit-box-orient: vertical;
+									-webkit-line-clamp: 1;
+									/*设置 需要显示的行数*/
+
+									// margin-left: 6px;
+								}
 							}
 						}
 					}
-				}
-				.classright{
-					display: flex;
-					height: 100%;
-					align-items: center;
-					image{
-						width: 38rpx;
-						height: 42rpx;
+
+					.classright {
+						display: flex;
+						height: 100%;
+						align-items: center;
+
+						image {
+							width: 38rpx;
+							height: 42rpx;
+						}
 					}
 				}
 			}
 		}
 	}
-}
-</style>
+</style>

+ 132 - 34
pages/publish/publish.vue

@@ -3,19 +3,31 @@
 		<statusBar :item="navBarData"></statusBar>
 		
 		<view class="" style="background-color: #ffffff;">
-		<input class="title" style="font-size: 40rpx;" placeholder="活动标题" />
-		<textarea class="textCont" placeholder="请输入内容"></textarea>
+			
+		
+		<view class="pubTitle">
+			<input class="title" style="" placeholder="活动标题" />
+		</view>	
 		
-		<template>
-			<u-upload>
-				<view class="addPhoto">
-					<image src="../../static/publish/photo.png" mode="aspectFill"></image>
-					<view class="photo">添加图片</view>
-					<view class="num">(0/9)</view>
+		<view class="pubMid">
+			<view class="mid">
+				<view class="txt">
+					<textarea class="txtClass" value="" placeholder="请输入内容" />
 				</view>
-			</u-upload>
-		</template>
-
+				<view class="pic">
+					<view class="picCont">
+						<image src="../../static/publish/photo.png" mode="aspectFill"></image>
+						<view style="font-size: 24rpx;line-height: 40rpx;font-weight: 400;color: rgba(0, 0, 0, 0.6);">
+							添加图片
+						</view>
+						<view style="font-size: 20rpx;line-height: 36rpx;font-weight: 400;color: rgba(0, 0, 0, 0.4);">
+							(0/9)
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		
 			<view class="userOptionsBox">
 				<view class="optionsItemBox">
 					<view class="optionItem">
@@ -28,6 +40,11 @@
 							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
+
+				</view>
+			</view>
+			<view class="userOptionsBox">
+				<view class="optionsItemBox">
 					<view class="optionItem">
 						<view class="option_left">
 							<text class="option_text">
@@ -38,6 +55,11 @@
 							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
+			
+				</view>
+			</view>
+			<view class="userOptionsBox">
+				<view class="optionsItemBox">
 					<view class="optionItem">
 						<view class="option_left">
 							<text class="option_text">
@@ -48,6 +70,11 @@
 							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
+			
+				</view>
+			</view>
+			<view class="userOptionsBox">
+				<view class="optionsItemBox">
 					<view class="optionItem">
 						<view class="option_left">
 							<text class="option_text">
@@ -58,6 +85,11 @@
 							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
+			
+				</view>
+			</view>
+			<view class="userOptionsBox">
+				<view class="optionsItemBox">
 					<view class="optionItem">
 						<view class="option_left">
 							<text class="option_text">
@@ -68,6 +100,11 @@
 							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
+			
+				</view>
+			</view>
+			<view class="userOptionsBox">
+				<view class="optionsItemBox">
 					<view class="optionItem">
 						<view class="option_left">
 							<text class="option_text">
@@ -78,12 +115,18 @@
 							<image src="../../static/mine/arrow-right.png" mode="aspectFill"></image>
 						</view>
 					</view>
+			
 				</view>
 			</view>
+			
+			
 		</view>
 			<view class="publish_now">
 				<button class="btn">立即发布</button>
 			</view>
+			<view class="liu">
+				
+			</view>
 	</view>
 </template>
 
@@ -102,15 +145,70 @@
 
 <style lang="scss" scoped>
 	.publish{
+		.liu{
+			//留白
+			width: 750rpx;
+			height: 68rpx;
+			position: absolute;
+			bottom: 0;
+			background-color: #ffffff;
+		}
+		.pubTitle{
+			width: 750rpx;
+			height: 96rpx;
+			padding: 24rpx 30rpx 0 30rpx;
+			.title{
+				font-size: 32rpx;
+				line-height: 48rpx;
+				font-weight: 500;
+			}
+		}
+		.pubMid{
+			width: 750rpx;
+			// height: 504rpx;
+			padding: 24rpx 30rpx 0 30rpx;
+			// background-color: #8BBEFF;
+			.mid{
+				width: 690rpx;
+				height: 440rpx;
+				// background-color: #f2f2f2;
+				.txt{
+					width: 690rpx;
+					height: 192rpx;
+					.txtClass{
+						width: 100%;
+						height: 100%;
+						font-size: 28rpx;
+						font-weight: 400;
+						line-height: 48rpx;
+					}
+				}
+				.pic{
+					width: 224rpx;
+					height: 224rpx;
+					background-color: rgba(242, 242, 242, 1);
+					display: flex;
+					
+					justify-content: center;
+					align-items: center;
+					.picCont{
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						align-items: center;
+						image{
+							width: 56rpx;
+							height: 66rpx;
+						}
+					}
+				}
+			}
+		}
+		
+		
 		// background-color: #fff;
 		height: 100vh;
-		.title{
-			font-size: 32rpx;
-			padding: 16px;
-			line-height: 48rpx;
-			font-weight: 500;
-			// color: #d9d9d933
-		}
+		
 		
 		.textCont{
 			padding: 16px;
@@ -144,25 +242,23 @@
 		}
 		.userOptionsBox {
 			
-			width: 100%;
-			margin-top: 10px;
-		
+			width: 750rpx;
+			height: 96rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
 			.optionsItemBox {
-				width: 100%;
-				margin-bottom: 10px;
-				padding: 5px 23px;
-		
+				width: 690rpx;
 				.optionItem {
 					display: flex;
 					justify-content: space-between;
 					align-items: center;
-					height: 81rpx;
-					// font-size: 24rpx;
-		
 					.option_left {
 						display: flex;
 						align-items: center;
-						height: 40rpx;
+						font-size: 28rpx;
+						line-height: 48rpx;
+						font-weight: 400;
 					}
 		
 					.option_right {
@@ -177,16 +273,18 @@
 			}
 		}
 		.publish_now{
+			position: absolute;
+			bottom: 100rpx;
 			display: flex;
-			// background-color: #d9d9d933;
+			width: 750rpx;
+			justify-content: center;
+			
 			.btn{
-				width: 420rpx;
-				height: 70rpx;
+				width: 432rpx;
+				height: 88rpx;
 				background-color: #8BBEFF;
 				color: #fff;
 				margin-top: 20px;
-				margin-bottom: 100rpx;
-				line-height: 70rpx;
 			}
 		}
 		

+ 332 - 156
pages/resource/resource.vue

@@ -2,206 +2,382 @@
 	<view class="resource">
 		<statusBar :item="navBarData"></statusBar>
 		<view class="search">
-			<!-- <uni-search-bar @confirm="search" @input="input" ></uni-search-bar> -->
-			
-			<uni-search-bar bgColor="#f0f2f5" placeholder="搜索" cancelButton="none" clearButton="none" :focus="true"></uni-search-bar>
+			<view class="inpSer">
+				<!-- <input type="text" class="inpTxt" placeholder="搜索"> -->
+				<input type="text" class="inpTxt" placeholder-class="fwb-font" placeholder="请输入文本" />
+				<view class="ico">
+					<image src="http://43.139.158.220:5007/img/static/yym/union.png" style="width: 28rpx;height: 28rpx;"
+						mode="aspectFill"></image>
+					<!-- <text class="fwb-font">搜索</text> -->
+				</view>
+			</view>
+			<!-- <view class="inpSer">
+				
+			</view> -->
+			<!-- <uni-search-bar bgColor="#f0f2f5" placeholder="搜索" cancelButton="none" clearButton="none"></uni-search-bar> -->
 		</view>
 
 		<view class="top">
 			<view class="left" @click="phoneLogin" :class="current==0?info1:info2">
-				<text class="three-font">资源库</text>
-				<view :class="current==0?yun:info2"></view>
+				<text class="">资源库</text>
+				<view v-if="current==0" class="yun">
+					<image src="http://43.139.158.220:5007/img/static/yym/Ellipse 10.png" mode="aspectFill"></image>
+				</view>
 			</view>
 			<view class="right" @click="accountLogin" :class="current==1?info1:info2">
-				<text class="three-font">精品慕课</text>
-				<view :class="current==1?yun:info2"></view>
+				<text class="">精品慕课</text>
+				<view v-if="current==1" class="yun">
+					<image src="http://43.139.158.220:5007/img/static/yym/Ellipse 10.png" mode="aspectFill"></image>
+				</view>
 			</view>
 		</view>
-		
-		<swiper class="scroll-view-height" :style="{height:swiper+'px'}" @change="swipeIndex" :current="current" :duration="300">
-		    <swiper-item>
+
+		<swiper class="scroll-view-height" :style="{height:swiper+'px'}" @change="swipeIndex" :current="current"
+			:duration="300">
+			<swiper-item>
 				<scroll-view scroll-y="true" :style="{height:swiper+'px'}">
 					<view class="contBox">
-						<view class="cont" v-for="i in 10">
-							<image src="../../static/yym/Rectangle 1918.png" mode=""></image>
-							<view class="tit btn-font">
-								这里是课程名称课程名称课程名称课程名称课程名称
-							</view>
-							<view class="teacher fz-font">
-								主讲老师:舒某某
-							</view>
+						<!-- <view class="cont" v-for="i in 10"> -->
+						<view class="cont" v-for="(item, index) in classList" :index="index" :key="index">
+
+							<image class="image" :src="item.url" mode="aspectFill" />
+							<view class="tit btn-font">{{ item.className }}</view>
+							<view class="teacher fz-font">{{ item.th_name }}</view>
 						</view>
 					</view>
 				</scroll-view>
-					
-		    </swiper-item>
-			
-		    <swiper-item>
+
+			</swiper-item>
+
+			<swiper-item>
 				<scroll-view scroll-y="true" :style="{height:swiper+'px'}">
 					<view class="contBox">
-						<view class="cont" v-for="i in 10">
-							<image src="../../static/yym/Rectangle 1918.png" mode=""></image>
-							<view class="tit btn-font">
-								这里是课程名称课程名称课程名称课程名称课程名称
-							</view>
-							<view class="teacher fz-font">
-								主讲老师:舒某某
-							</view>
+						<!-- <view class="cont" v-for="i in 10"> -->
+						<view class="cont" v-for="(item, index) in classList2" :index="index" :key="index">
+
+							<image class="image" :src="item.url" mode="aspectFill" />
+							<view class="tit btn-font">{{ item.className }}</view>
+							<view class="teacher fz-font">{{ item.th_name }}</view>
 						</view>
 					</view>
 				</scroll-view>
-		  </swiper-item>
+			</swiper-item>
 		</swiper>
 
 
-	
 	</view>
 </template>
 
 <script>
-export default {
-	data() {
-		return {
+	export default {
+		data() {
+			return {
 				navBarData: {
 					title: '资源库',
 					btn: 0
 				},
+				current: 0, //登录方式切换
+				info1: 'info1', //类名
+				info2: 'info2',
+				swiper: 0,
 
-				current:0,//登录方式切换
-				
-				info1:'info1',  //类名
-				info2:'info2',
-				yun:'yun',
-				
-				swiper:0
-
-
-			
-			
-		};
-	},
-	methods: {
-		toggleActive1() {
-			this.isActive1 = true;
-			this.isActive2 = false;
-			this.tab = true;
-		},
-		toggleActive2() {
-			this.isActive1 = false;
-			this.isActive2 = true;
-			this.tab = false;
-		},
-		swipeIndex(index){
-			this.current=index.detail.current;			
+				classList: [{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img5.jpg',
+						className: '创新思维',
+						th_name: '主讲教师: 吴伟'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img4.jpg',
+						className: '打造无敌商业计划书',
+						th_name: '主讲教师: '
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img6.jpg',
+						className: '创业经营',
+						th_name: '主讲教师: 黄伟贤'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img1.jpg',
+						className: '创业者管理能力训练基础',
+						th_name: '主讲教师: 李芳'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img3.jpg',
+						className: '创业基础',
+						th_name: '主讲教师: 杨哲气'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img2.jpg',
+						className: '创业融资实务',
+						th_name: '主讲教师: 郑修'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img8.jpg',
+						className: '精益创业方法论',
+						th_name: '主讲教师: 陈旭华'
+					}, {
+						url: 'http://43.139.158.220:5007/img/static/pubic/img6.jpg',
+						className: '创业经营',
+						th_name: '主讲教师: 黄伟贤'
+					},
+
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img7.jpg',
+						className: '跨境电商创业',
+						th_name: '主讲教师: 陈旭华'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img8.jpg',
+						className: '精益创业方法论',
+						th_name: '主讲教师: 陈旭华'
+					},
+
+
+				],
+				classList2: [
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img1.jpg',
+						className: '创业者管理能力训练基础',
+						th_name: '主讲教师: 李芳'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img3.jpg',
+						className: '创业基础',
+						th_name: '主讲教师: 杨哲气'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img2.jpg',
+						className: '创业融资实务',
+						th_name: '主讲教师: 郑修'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img5.jpg',
+						className: '创新思维',
+						th_name: '主讲教师: 吴伟'
+					},
+					
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img7.jpg',
+						className: '跨境电商创业',
+						th_name: '主讲教师: 陈旭华'
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img4.jpg',
+						className: '打造无敌商业计划书',
+						th_name: '主讲教师: '
+					},
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img6.jpg',
+						className: '创业经营',
+						th_name: '主讲教师: 黄伟贤'
+					},
+					
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img8.jpg',
+						className: '精益创业方法论',
+						th_name: '主讲教师: 陈旭华'
+					}, {
+						url: 'http://43.139.158.220:5007/img/static/pubic/img6.jpg',
+						className: '创业经营',
+						th_name: '主讲教师: 黄伟贤'
+					},
+
+					{
+						url: 'http://43.139.158.220:5007/img/static/pubic/img8.jpg',
+						className: '精益创业方法论',
+						th_name: '主讲教师: 陈旭华'
+					},
+
+
+				],
+			};
 		},
-		phoneLogin(){
-			this.current=0
+		methods: {
+			toggleActive1() {
+				this.isActive1 = true;
+				this.isActive2 = false;
+				this.tab = true;
+			},
+			toggleActive2() {
+				this.isActive1 = false;
+				this.isActive2 = true;
+				this.tab = false;
+			},
+			swipeIndex(index) {
+				this.current = index.detail.current;
+			},
+			phoneLogin() {
+				this.current = 0
+			},
+			accountLogin() {
+				this.current = 1
+			},
 		},
-		accountLogin(){
-			this.current=1
+		onReady() {
+
 		},
-	},
-	onReady() {
-		 uni.createSelectorQuery().select('.uni-tabbar').boundingClientRect((rect) => {
-		    if (rect) {
-		      const tabBarHeight = rect.height;
-		      console.log('底部导航栏高度:', tabBarHeight);
-		    }
-		  }).exec();
-	},
-	onLoad() {
-		// console.log(this.screenHeight);
-		// console.log(this.navheight);
-		console.log(this.tabBarHeight);
-		if(this.navheight){
-			this.swiper=this.screenHeight-this.navheight-140
-		}else{
-			this.swiper=this.screenHeight-this.customBar-150			
+		onLoad() {
+			// console.log(this.screenHeight);
+			// console.log(this.navheight);
+			console.log(this.tabBarHeight);
+			if (this.navheight) {
+				this.swiper = this.screenHeight - this.navheight - 140
+			} else {
+				this.swiper = this.screenHeight - this.customBar - 150
+			}
 		}
-	}
-};
+	};
 </script>
 
 <style lang="scss" scoped>
-	
-.resource{
-	// background-color: #4a97f2;
-	// padding-bottom: 50px;
-	// margin-bottom: 50px;
-	.search{
-		background-color: #ffffff;
-		padding: 0 10rpx;
-	}
-	.top{
-		// width: 500rpx;
-		display: flex;
-		justify-content: space-between;
-		margin: auto;
-		background-color: #ffffff;
-		padding: 10px 150rpx;
-		// margin-bottom: 40px;
-		// font-size: 18px;
-		// padding-top: 0;
-		.info1{
-			font-weight: bold;
+	.resource {
+		.search {
+			background-color: #ffffff;
 			position: relative;
-			.yun{
-				width: 80rpx;
-				height: 0rpx;
-				position: absolute;
-				left: 50%;
-				transform: translate(-50%,-50%);
-				box-shadow: 0px 0px 10px 2px #4a97f2;
+			display: flex;
+			width: 750rpx;
+			height: 88rpx;
+			justify-content: center;
+			align-items: center;
+
+			// background-color: rebeccapurple;
+			.inpSer {
+				width: 690rpx;
+				height: 65rpx;
+				margin: auto;
+				background-color: rgba(240, 242, 245, 1);
+				border-radius: 5rpx;
+				color: rgba(0, 0, 0, 0.26);
+				position: relative;
+
+				.inpTxt {
+					// padding: 0px, 12rpx, 0px, 12rpx;
+					color: #000;
+					padding-left: 60rpx;
+					height: 100%;
+					width: 100%;
+				}
+
+				input::placeholder {
+					color: #000;
+				}
+
+				.ico {
+					position: absolute;
+					top: 50%;
+					left: 20rpx;
+					transform: translate(0, -50%);
+					display: flex;
+					align-items: center;
+
+					image {
+						margin-right: 10rpx;
+					}
+				}
 			}
 		}
-		.info2{
-			color: #666666;
-		}
-	}
-	
-	.scroll-view-height{
-		// background-color: ;
-		// height: 68vh;
-		// background-color: red;
-		// padding-bottom: 50px;
-		.contBox{
-			width: 100%;
-			padding: 10px 30rpx;
-			// height: 100%;
+
+		.top {
+			// width: 500rpx;
 			display: flex;
-			flex-wrap: wrap;
 			justify-content: space-between;
-			// background-color: greenyellow;
-			margin-bottom: 50px;
-			.cont{
-				background-color: #ffffff;
-				width: 332rpx;
-				padding: 20rpx 15rpx;
-				border-radius: 10px;
-				margin-bottom: 20rpx;
-				image{
-					width: 300rpx;
-					height: 170rpx;
-				}
-				.tit{
-					width: 257rpx;
-					margin: 10rpx 0;
-					font-weight: bold;
-					white-space:normal;
-					 display: -webkit-box;
-					 word-break: break-all;
-					 text-overflow: ellipsis;
-					 overflow: hidden;
-					 -webkit-box-orient: vertical;
-					 -webkit-line-clamp:2;/*设置 需要显示的行数*/
+			margin: auto;
+			background-color: #ffffff;
+			padding: 10px 150rpx;
+
+			// margin-bottom: 40px;
+			// font-size: 18px;
+			// padding-top: 0;
+			.info1 {
+				font-weight: bold !important;
+				position: relative;
+				color: rgba(0, 0, 0, 0.8);
+				font-size: 34rpx;
+				line-height: 48rpx;
+				width: 136rpx;
+				height: 48rpx;
+				text-align: center;
+
+				// font-family: PingFang SC;
+				// font-family: \9ed1\4f53;
+				.yun {
+					width: 134rpx;
+					height: 32rpx;
+					position: absolute;
+					left: 0;
+					bottom: -10rpx;
+
+					// transform: translate(-50%,0%);
+					// box-shadow: 0px 10rpx 30rpx 6rpx #4a97f2;
+					image {
+						width: 100%;
+						height: 100%;
+					}
 				}
-				.teacher{
-					// font-size: 14px;
-					color: #999999;
+			}
+
+			.info2 {
+				color: rgba(0, 0, 0, 0.6);
+				font-size: 34rpx;
+				font-weight: 400;
+				line-height: 48rpx;
+				width: 136rpx;
+				height: 48rpx;
+				text-align: center;
+				font-family: 微软雅黑;
+
+			}
+		}
+
+		.scroll-view-height {
+
+			// background-color: ;
+			// height: 68vh;
+			// background-color: red;
+			// padding-bottom: 50px;
+			.contBox {
+				width: 100%;
+				padding: 10px 30rpx;
+				// height: 100%;
+				display: flex;
+				flex-wrap: wrap;
+				justify-content: space-between;
+				// background-color: greenyellow;
+				margin-bottom: 50px;
+
+				.cont {
+					background-color: #ffffff;
+					width: 332rpx;
+					padding: 20rpx 15rpx;
+					border-radius: 10px;
+					margin-bottom: 20rpx;
+
+					image {
+						width: 300rpx;
+						height: 170rpx;
+						border-radius: 10rpx;
+					}
+
+					.tit {
+						width: 257rpx;
+						margin: 10rpx 0;
+						// height: 80rpx;
+						font-weight: bold;
+						white-space: normal;
+						display: -webkit-box;
+						word-break: break-all;
+						text-overflow: ellipsis;
+						overflow: hidden;
+						-webkit-box-orient: vertical;
+						-webkit-line-clamp: 2;
+						/*设置 需要显示的行数*/
+					}
+
+					.teacher {
+						color: #999999;
+					}
 				}
 			}
 		}
 	}
-}
-
-</style>
+</style>

+ 46 - 21
pages/teachingDetail/teachingDetail.vue

@@ -5,13 +5,17 @@
 		
 		<!-- 顶部 -->
 		<view class="backPic">
-			<image src="../../static/yym/Rectangle 40.png" mode="aspectFill"></image>
+			<image src="http://43.139.158.220:5007/img/static/yym/Rectangle 40.png" mode="aspectFill"></image>
 			<view class="card">
 				<view class="cardTop">
 					<view class="title three-font">xxxx虚拟教研教室</view>
-					<view class="">
-						<uni-icons type="star" size="48rpx" color="#ffffff" style="margin-right: 20rpx;"></uni-icons>
-						<uni-icons type="folder-add" size="48rpx" color="#ffffff"></uni-icons>
+					<view class="icons">
+						<view class="icon">
+							<image src="http://43.139.158.220:5007/img/static/yym/Star 1 (Stroke) (2).png" style="width: 42rpx;height: 40rpx;" mode="aspectFill"></image>
+						</view>
+						<view class="icon">
+							<image src="http://43.139.158.220:5007/img/static/yym/Vector (Stroke) (1).png" style="width: 38rpx;height: 42rpx;" mode="aspectFill"></image>
+						</view>
 					</view>
 				</view>
 				<view class="col fz-font">
@@ -51,7 +55,7 @@
 		<!-- 创建者用户名 -->
 		<view style="padding: 0 30rpx;">
 			<view class="creator">
-				<image src="../../static/mine/Avatar.png" mode="aspectFill"></image>
+				<image src="http://43.139.158.220:5007/img/static/mine/Avatar.png" mode="aspectFill"></image>
 				<view class="creName btn-font">
 					创建者用户名
 				</view>
@@ -71,7 +75,7 @@
 				
 				<view class="pers">
 					<view class="per" v-for="i in 6">
-						<image src="../../static/mine/Avatar.png" mode="aspectFill"></image>
+						<image src="http://43.139.158.220:5007/img/static/mine/Avatar.png" mode="aspectFill"></image>
 						<view class="perName fz-font">
 							袁一鸣
 						</view>
@@ -124,44 +128,66 @@
 			}
 			.card{
 				position: absolute;
-				// width: 650rpx;
 				width: 690rpx;
 				height: 256rpx;
 				bottom: 10px;
 				left: 50%;
-				padding: 30rpx 20rpx;
-				backdrop-filter: blur(2px);
+				padding: 30rpx;
+				background-color: rgba(0, 0, 0, 0.26);
 				border-radius: 10px;
 				transform: translate(-50%,0);
 				border: 1rpx #667870 solid;
 				color: #ffffff;
-				// background-color: #34453f;
+				// display: flex;
+				// flex-direction: column;
+				// justify-content: space-between;
 				.cardTop{
 					display: flex;
 					justify-content: space-between;
 					.title{
-						// font-weight: 500;
-						padding-bottom: 20rpx;
+						// padding-bottom: 20rpx;
+						margin-bottom: 20rpx;
+						width: 506rpx;
+						height: 48rpx;
 						color: #ffffff;
-						// font-size: 35rpx;
+						font-family: PingFang SC;
+						// font-weight: 550;
+						overflow: hidden;
+						text-overflow:ellipsis;
+						white-space: nowrap;
 					}
+					.icons{
+						flex: 1;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						.icon{
+							width: 48rpx;
+							height: 48rpx;
+							display: flex;
+							align-items: center;
+							justify-content: center;
+						}
+					}
+					
 				}
 				.col{
 					margin-bottom: 10rpx;
 					font-weight: 100;
+					color: #f0edea;
 					// font-size: 30rpx;
 				}
 				.tag{
 					display: flex;
 				}
 			}
-			// background-image: url(../../static/resource/jqr.png);
+			// background-image: url(http://43.139.158.220:5007/img/static/resource/jqr.png);
 		}
 		
 		.teaData{
 			width: 750rpx;
 			display: flex;
-			padding:20px 30rpx;
+			padding:20rpx 30rpx;
 			justify-content: space-between;
 			// padding: 20px 0;
 			.cla{
@@ -203,10 +229,10 @@
 		
 		.creator{
 			display: flex;
-			padding: 10px 30px;
+			padding: 30rpx;
 			background-color: #ffffff;
 			align-items: center;
-			margin-top: 20px;
+			margin-top: 20rpx;
 			border-radius: 10px;
 			image{
 				width: 96rpx;
@@ -221,9 +247,8 @@
 		
 		.member{
 			background-color: #ffffff;
-			margin-top: 20px;
-			padding: 10px 10px;
-			border: 10px;
+			margin-top: 20rpx;
+			padding: 30rpx;
 			border-radius: 10px;
 			.memberTop{
 				display: flex;
@@ -233,7 +258,7 @@
 				
 				.pers{
 					display: flex;
-					justify-content: space-around;
+					justify-content: space-between;
 					align-items: center;
 					.per{
 						display: flex;

+ 62 - 7
pages/teachingList/teachingList.vue

@@ -1,7 +1,11 @@
 <template>
 	<view class="teachingDetail">
 		<statusBar :item="navbarBata"></statusBar>
-		<teaching-case></teaching-case>
+		<!-- <teaching-case></teaching-case> -->
+		<view class="" style="padding-bottom: 50rpx;">
+			<teaching-case v-for="(item,index) in classList" :key="index" :classList='item'></teaching-case>
+		</view>
+
 	</view>
 </template>
 
@@ -9,17 +13,68 @@
 	export default {
 		data() {
 			return {
-				navbarBata:{
-					title:'教研室列表',
-					btn:1
-				}
+				navbarBata: {
+					title: '教研室列表',
+					btn: 1
+				},
+				classList: [{
+										img: 'http://43.139.158.220:5007/img/static/mine/img1.jpg',
+										className: '创业者管理能力训练基础',
+										intro: '《创业者管理能力训练基础》通过管理学、营销学、财税理论、创业基础知识及创业操作实务的提炼,以专题化的形式面向高职类所有专业的学生。本课程一共有三大部分、七个专题。分别为:第一部分,一般管理者能力训练基础,四个专题,即自我管理能力训练、团队管理能力训练、社会关系管理能力训练与团队建设能力训练。第二部分,创业者重要能力的领悟与训练,二个专题,即成功创业者的智力要素、成功创业者商务能力的领悟与训练。第三部分是咖啡厅实践训练。'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img2.jpg',
+										className: '创业融资实务',
+										intro: '本课程是创业管理专业、创业班的核心课程,根据专业培养目标的定位,主要面向创投机构服务专员岗位,培养该岗位应具备的相关创业融资知识和技能。课程主要采用“做中学”体验式的设计理念,引入真实项目进行“理实一体实战训练”。'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img3.jpg',
+										className: '创业基础',
+										intro: '《创业基础》是一门面向高等院校学生与社会青年开设一门必修的基础理论和易于实际操作的创业综合基础课程。旨激发学员创业激情,增强创业意识,培养学员具备创业基础知识与基本能力,为大学生自主创业、拓展就业及开创事业等提供系统的理论与实践支持。是顺应新时代社会经济与高校教育发展的要求,以市场变化及其趋势为前提,从人才培养机理与中小企业成长规律的角度出发,结合教师多年创业教育与企业家人才培养成功经验,运用企业现代管理新观念,让学员掌握中小企业开办与管理全过程的理论和实务的一门创业综合基础课程。'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img4.jpg',
+										className: '打造无敌商业计划书',
+										intro: '暂无简介'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img5.jpg',
+										className: '创新思维',
+										intro: '将创新思维意识与方法技能双元结合,综合微课学习与创造力实践训练融合演进,实现在线学习与配套教材混合驱动。'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+										className: '创业经营',
+										intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img6.jpg',
+										className: '创业经营',
+										intro: '课程主要讲授初创企业负责人如何展开科学经营的基本知识和技能,通过“创业者说创业”、“经营原理讲解”、“企业家说经营”、“经营实训练习”四个板块,帮助学员了解创业的意义,树立正确的创业理念和经营意识,提高社会责任感、提升创业能力,培养企业家精神,促进质量创业。'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img7.jpg',
+										className: '跨境电商创业',
+										intro: '跨境电商所有平台中利润最高、要求最高的就是亚马逊平台。 跨境电商企业需求最多的也是亚马逊运营人才。 《跨境电商创业》课程汇聚了一批有丰富亚马逊实战经验的高校创业导师、企业大卖家和大学生创业者,以经验分享、后台实操演示和创业案例剖析等形式,手把手教您亚马逊平台实操运营,带您开启跨境电商创业之路。'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img8.jpg',
+										className: '精益创业方法论',
+										intro: '暂无简介'
+									},
+									{
+										img: 'http://43.139.158.220:5007/img/static/mine/img9.png',
+										className: '互联网营销策划实务',
+										intro: '课程开发以创业就业能力培养为导向;以培养学生职业生涯发展、专业技能、自主学习与创新能力、职业素质为指导。使课程实现“项目化、任务化、碎片化、实战化”。便于学生利用零碎时间、移动设备学习。课程配有成套微课程视频外,还提供全套的教学与自学材料的国家及省级精品在线开放课程。'
+									},
+								],
 			};
 		}
 	}
 </script>
 
 <style lang="scss">
-	.teachingDetail{
+	.teachingDetail {
 		// background-color: red;
 	}
-</style>
+</style>

二進制
static/mine/Collect.png


二進制
static/mine/Subscribe.png


二進制
static/mine/Subscribe_gray.png


二進制
static/mine/help.png


二進制
static/mine/myClass.png


二進制
static/mine/myactive.png


二進制
static/tabBarIcon/activity-selected.png


二進制
static/tabBarIcon/activity.png


二進制
static/tabBarIcon/home-selected.png


二進制
static/tabBarIcon/home.png


二進制
static/tabBarIcon/message-selected.png


二進制
static/tabBarIcon/message.png


二進制
static/tabBarIcon/mine-selected.png


二進制
static/tabBarIcon/mine.png


二進制
static/tabBarIcon/resource-selected.png


二進制
static/tabBarIcon/resource.png


二進制
static/tabbar/Fill 1.png


二進制
static/tabbar/Fill 2.png


二進制
static/tabbar/hd.png


二進制
static/tabbar/hd2.png


二進制
static/tabbar/wd.png


二進制
static/tabbar/wd2.png


二進制
static/tabbar/xx.png


二進制
static/tabbar/xx2.png


二進制
static/tabbar/zyk.png


二進制
static/tabbar/zyk2.png


二進制
static/yym/Ellipse 10.png


二進制
static/yym/Star 1 (Stroke) (2).png


二進制
static/yym/Vector (Stroke) (1).png


二進制
static/yym/Vector (Stroke) (2).png


二進制
static/yym/jia.png


二進制
static/yym/union.png


+ 7 - 0
uni_modules/uv-badge/changelog.md

@@ -0,0 +1,7 @@
+## 1.0.2(2023-06-04)
+1. 修复type等属性为null的时候不显示徽标的BUG
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-badge 徽标数,数字角标

+ 73 - 0
uni_modules/uv-badge/components/uv-badge/props.js

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

+ 176 - 0
uni_modules/uv-badge/components/uv-badge/uv-badge.vue

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

+ 87 - 0
uni_modules/uv-badge/package.json

@@ -0,0 +1,87 @@
+{
+	"id": "uv-badge",
+	"displayName": "uv-badge 徽标数,数字角标 全面兼容小程序、nvue、vue2、vue3等多端",
+	"version": "1.0.2",
+	"description": "徽标数一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。",
+	"keywords": [
+        "uv-badge",
+        "uvui",
+        "uv-ui",
+        "徽标数",
+        "数字角标"
+    ],
+	"repository": "",
+	"engines": {
+		"HBuilderX": "^3.1.0"
+	},
+	"dcloudext": {
+		"type": "component-vue",
+		"sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": ""
+		},
+		"declaration": {
+			"ads": "无",
+			"data": "插件不采集任何数据",
+			"permissions": "无"
+		},
+		"npmurl": ""
+	},
+	"uni_modules": {
+		"dependencies": [
+			"uv-ui-tools"
+		],
+		"encrypt": [],
+		"platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"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",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+	}
+}

+ 11 - 0
uni_modules/uv-badge/readme.md

@@ -0,0 +1,11 @@
+## Badge 徽标数
+
+> **组件名:uv-badge**
+
+该组件一般用于图标右上角显示未读的消息数量,提示用户点击,有圆点和圆包含文字两种形式。
+
+### <a href="https://www.uvui.cn/components/badge.html" target="_blank">查看文档</a>
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:<a href="https://ext.dcloud.net.cn/plugin?id=12287" target="_blank">uv-ui</a>、<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

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

@@ -0,0 +1,25 @@
+## 1.0.10(2023-08-13)
+1. 优化nvue,方便自定义图标
+## 1.0.9(2023-07-28)
+1. 修改几个对应错误图标的BUG
+## 1.0.8(2023-07-24)
+1. 优化 支持base64图片
+## 1.0.7(2023-07-17)
+1. 修复  uv-icon 恢复uv-empty相关的图标
+## 1.0.6(2023-07-13)
+1. 修复icon设置name属性对应图标错误的BUG
+## 1.0.5(2023-07-04)
+1. 更新图标,删除一些不常用的图标
+2. 删除base64,修改成ttf文件引入读取图标
+3. 自定义图标文档说明:https://www.uvui.cn/guide/customIcon.html
+## 1.0.4(2023-07-03)
+1. 修复主题颜色在APP不生效的BUG
+## 1.0.3(2023-05-24)
+1. 将线上ttf字体包替换成base64,避免加载时或者网络差时候显示白色方块
+## 1.0.2(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.1(2023-05-10)
+1. 修复小程序中异常显示
+## 1.0.0(2023-05-04)
+新发版

+ 160 - 0
uni_modules/uv-icon/components/uv-icon/icons.js

@@ -0,0 +1,160 @@
+export default {
+	'uvicon-level': 'e68f',
+	'uvicon-checkbox-mark': 'e659',
+	'uvicon-folder': 'e694',
+	'uvicon-movie': 'e67c',
+	'uvicon-star-fill': 'e61e',
+	'uvicon-star': 'e618',
+	'uvicon-phone-fill': 'e6ac',
+	'uvicon-phone': 'e6ba',
+	'uvicon-apple-fill': 'e635',
+	'uvicon-backspace': 'e64d',
+	'uvicon-attach': 'e640',
+	'uvicon-empty-data': 'e671',
+	'uvicon-empty-address': 'e68a',
+	'uvicon-empty-favor': 'e662',
+	'uvicon-empty-car': 'e657',
+	'uvicon-empty-order': 'e66b',
+	'uvicon-empty-list': 'e672',
+	'uvicon-empty-search': 'e677',
+	'uvicon-empty-permission': 'e67d',
+	'uvicon-empty-news': 'e67e',
+	'uvicon-empty-history': 'e685',
+	'uvicon-empty-coupon': 'e69b',
+	'uvicon-empty-page': 'e60e',
+	'uvicon-empty-wifi-off': 'e6cc',
+	'uvicon-reload': 'e627',
+	'uvicon-order': 'e695',
+	'uvicon-server-man': 'e601',
+	'uvicon-search': 'e632',
+	'uvicon-more-dot-fill': 'e66f',
+	'uvicon-scan': 'e631',
+	'uvicon-map': 'e665',
+	'uvicon-map-fill': 'e6a8',
+	'uvicon-tags': 'e621',
+	'uvicon-tags-fill': 'e613',
+	'uvicon-eye': 'e664',
+	'uvicon-eye-fill': 'e697',
+	'uvicon-eye-off': 'e69c',
+	'uvicon-eye-off-outline': 'e688',
+	'uvicon-mic': 'e66d',
+	'uvicon-mic-off': 'e691',
+	'uvicon-calendar': 'e65c',
+	'uvicon-trash': 'e623',
+	'uvicon-trash-fill': 'e6ce',
+	'uvicon-play-left': 'e6bf',
+	'uvicon-play-right': 'e6b3',
+	'uvicon-minus': 'e614',
+	'uvicon-plus': 'e625',
+	'uvicon-info-circle': 'e69f',
+	'uvicon-info-circle-fill': 'e6a7',
+	'uvicon-question-circle': 'e622',
+	'uvicon-question-circle-fill': 'e6bc',
+	'uvicon-close': 'e65a',
+	'uvicon-checkmark': 'e64a',
+	'uvicon-checkmark-circle': 'e643',
+	'uvicon-checkmark-circle-fill': 'e668',
+	'uvicon-setting': 'e602',
+	'uvicon-setting-fill': 'e6d0',
+	'uvicon-heart': 'e6a2',
+	'uvicon-heart-fill': 'e68b',
+	'uvicon-camera': 'e642',
+	'uvicon-camera-fill': 'e650',
+	'uvicon-more-circle': 'e69e',
+	'uvicon-more-circle-fill': 'e684',
+	'uvicon-chat': 'e656',
+	'uvicon-chat-fill': 'e63f',
+	'uvicon-bag': 'e647',
+	'uvicon-error-circle': 'e66e',
+	'uvicon-error-circle-fill': 'e655',
+	'uvicon-close-circle': 'e64e',
+	'uvicon-close-circle-fill': 'e666',
+	'uvicon-share': 'e629',
+	'uvicon-share-fill': 'e6bb',
+	'uvicon-share-square': 'e6c4',
+	'uvicon-shopping-cart': 'e6cb',
+	'uvicon-shopping-cart-fill': 'e630',
+	'uvicon-bell': 'e651',
+	'uvicon-bell-fill': 'e604',
+	'uvicon-list': 'e690',
+	'uvicon-list-dot': 'e6a9',
+	'uvicon-zhifubao-circle-fill': 'e617',
+	'uvicon-weixin-circle-fill': 'e6cd',
+	'uvicon-weixin-fill': 'e620',
+	'uvicon-qq-fill': 'e608',
+	'uvicon-qq-circle-fill': 'e6b9',
+	'uvicon-moments-circel-fill': 'e6c2',
+	'uvicon-moments': 'e6a0',
+	'uvicon-car': 'e64f',
+	'uvicon-car-fill': 'e648',
+	'uvicon-warning-fill': 'e6c7',
+	'uvicon-warning': 'e6c1',
+	'uvicon-clock-fill': 'e64b',
+	'uvicon-clock': 'e66c',
+	'uvicon-edit-pen': 'e65d',
+	'uvicon-edit-pen-fill': 'e679',
+	'uvicon-email': 'e673',
+	'uvicon-email-fill': 'e683',
+	'uvicon-minus-circle': 'e6a5',
+	'uvicon-plus-circle': 'e603',
+	'uvicon-plus-circle-fill': 'e611',
+	'uvicon-file-text': 'e687',
+	'uvicon-file-text-fill': 'e67f',
+	'uvicon-pushpin': 'e6d1',
+	'uvicon-pushpin-fill': 'e6b6',
+	'uvicon-grid': 'e68c',
+	'uvicon-grid-fill': 'e698',
+	'uvicon-play-circle': 'e6af',
+	'uvicon-play-circle-fill': 'e62a',
+	'uvicon-pause-circle-fill': 'e60c',
+	'uvicon-pause': 'e61c',
+	'uvicon-pause-circle': 'e696',
+	'uvicon-gift-fill': 'e6b0',
+	'uvicon-gift': 'e680',
+	'uvicon-kefu-ermai': 'e660',
+	'uvicon-server-fill': 'e610',
+	'uvicon-coupon-fill': 'e64c',
+	'uvicon-coupon': 'e65f',
+	'uvicon-integral': 'e693',
+	'uvicon-integral-fill': 'e6b1',
+	'uvicon-home-fill': 'e68e',
+	'uvicon-home': 'e67b',
+	'uvicon-account': 'e63a',
+	'uvicon-account-fill': 'e653',
+	'uvicon-thumb-down-fill': 'e628',
+	'uvicon-thumb-down': 'e60a',
+	'uvicon-thumb-up': 'e612',
+	'uvicon-thumb-up-fill': 'e62c',
+	'uvicon-lock-fill': 'e6a6',
+	'uvicon-lock-open': 'e68d',
+	'uvicon-lock-opened-fill': 'e6a1',
+	'uvicon-lock': 'e69d',
+	'uvicon-red-packet': 'e6c3',
+	'uvicon-photo-fill': 'e6b4',
+	'uvicon-photo': 'e60d',
+	'uvicon-volume-off-fill': 'e6c8',
+	'uvicon-volume-off': 'e6bd',
+	'uvicon-volume-fill': 'e624',
+	'uvicon-volume': 'e605',
+	'uvicon-download': 'e670',
+	'uvicon-arrow-up-fill': 'e636',
+	'uvicon-arrow-down-fill': 'e638',
+	'uvicon-play-left-fill': 'e6ae',
+	'uvicon-play-right-fill': 'e6ad',
+	'uvicon-arrow-downward': 'e634',
+	'uvicon-arrow-leftward': 'e63b',
+	'uvicon-arrow-rightward': 'e644',
+	'uvicon-arrow-upward': 'e641',
+	'uvicon-arrow-down': 'e63e',
+	'uvicon-arrow-right': 'e63c',
+	'uvicon-arrow-left': 'e646',
+	'uvicon-arrow-up': 'e633',
+	'uvicon-skip-back-left': 'e6c5',
+	'uvicon-skip-forward-right': 'e61f',
+	'uvicon-arrow-left-double': 'e637',
+	'uvicon-man': 'e675',
+	'uvicon-woman': 'e626',
+	'uvicon-en': 'e6b8',
+	'uvicon-twitte': 'e607',
+	'uvicon-twitter-circle-fill': 'e6cf'
+}

+ 90 - 0
uni_modules/uv-icon/components/uv-icon/props.js

@@ -0,0 +1,90 @@
+export default {
+	props: {
+		// 图标类名
+		name: {
+			type: String,
+			default: ''
+		},
+		// 图标颜色,可接受主题色
+		color: {
+			type: String,
+			default: '#606266'
+		},
+		// 字体大小,单位px
+		size: {
+			type: [String, Number],
+			default: '16px'
+		},
+		// 是否显示粗体
+		bold: {
+			type: Boolean,
+			default: false
+		},
+		// 点击图标的时候传递事件出去的index(用于区分点击了哪一个)
+		index: {
+			type: [String, Number],
+			default: null
+		},
+		// 触摸图标时的类名
+		hoverClass: {
+			type: String,
+			default: ''
+		},
+		// 自定义扩展前缀,方便用户扩展自己的图标库
+		customPrefix: {
+			type: String,
+			default: 'uvicon'
+		},
+		// 图标右边或者下面的文字
+		label: {
+			type: [String, Number],
+			default: ''
+		},
+		// label的位置,只能右边或者下边
+		labelPos: {
+			type: String,
+			default: 'right'
+		},
+		// label的大小
+		labelSize: {
+			type: [String, Number],
+			default: '15px'
+		},
+		// label的颜色
+		labelColor: {
+			type: String,
+			default: '#606266'
+		},
+		// label与图标的距离
+		space: {
+			type: [String, Number],
+			default: '3px'
+		},
+		// 图片的mode
+		imgMode: {
+			type: String,
+			default: ''
+		},
+		// 用于显示图片小图标时,图片的宽度
+		width: {
+			type: [String, Number],
+			default: ''
+		},
+		// 用于显示图片小图标时,图片的高度
+		height: {
+			type: [String, Number],
+			default: ''
+		},
+		// 用于解决某些情况下,让图标垂直居中的用途
+		top: {
+			type: [String, Number],
+			default: 0
+		},
+		// 是否阻止事件传播
+		stop: {
+			type: Boolean,
+			default: false
+		},
+		...uni.$uv?.props?.icon
+	}
+}

+ 226 - 0
uni_modules/uv-icon/components/uv-icon/uv-icon.vue

@@ -0,0 +1,226 @@
+<template>
+	<view
+	  class="uv-icon"
+	  @tap="clickHandler"
+	  :class="['uv-icon--' + labelPos]"
+	>
+		<image
+		  class="uv-icon__img"
+		  v-if="isImg"
+		  :src="name"
+		  :mode="imgMode"
+		  :style="[imgStyle, $uv.addStyle(customStyle)]"
+		></image>
+		<text
+		  v-else
+		  class="uv-icon__icon"
+		  :class="uClasses"
+		  :style="[iconStyle, $uv.addStyle(customStyle)]"
+		  :hover-class="hoverClass"
+		>{{icon}}</text>
+		<!-- 这里进行空字符串判断,如果仅仅是v-if="label",可能会出现传递0的时候,结果也无法显示 -->
+		<text
+		  v-if="label !== ''" 
+		  class="uv-icon__label"
+		  :style="{
+			color: labelColor,
+			fontSize: $uv.addUnit(labelSize),
+			marginLeft: labelPos == 'right' ? $uv.addUnit(space) : 0,
+			marginTop: labelPos == 'bottom' ? $uv.addUnit(space) : 0,
+			marginRight: labelPos == 'left' ? $uv.addUnit(space) : 0,
+			marginBottom: labelPos == 'top' ? $uv.addUnit(space) : 0
+		}"
+		>{{ label }}</text>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	// #ifdef APP-NVUE
+	// nvue通过weex的dom模块引入字体,相关文档地址如下:
+	// https://weex.apache.org/zh/docs/modules/dom.html#addrule
+	import iconUrl from './uvicons.ttf';
+	const domModule = weex.requireModule('dom')
+	domModule.addRule('fontFace', {
+		'fontFamily': "uvicon-iconfont",
+		'src': "url('" + iconUrl + "')"
+	})
+	// #endif
+	// 引入图标名称,已经对应的unicode
+	import icons from './icons';
+	import props from './props.js';
+	/**
+	 * icon 图标
+	 * @description 基于字体的图标集,包含了大多数常见场景的图标。
+	 * @tutorial https://www.uvui.cn/components/icon.html
+	 * @property {String}			name			图标名称,见示例图标集
+	 * @property {String}			color			图标颜色,可接受主题色 (默认 color['uv-content-color'] )
+	 * @property {String | Number}	size			图标字体大小,单位px (默认 '16px' )
+	 * @property {Boolean}			bold			是否显示粗体 (默认 false )
+	 * @property {String | Number}	index			点击图标的时候传递事件出去的index(用于区分点击了哪一个)
+	 * @property {String}			hoverClass		图标按下去的样式类,用法同uni的view组件的hoverClass参数,详情见官网
+	 * @property {String}			customPrefix	自定义扩展前缀,方便用户扩展自己的图标库 (默认 'uicon' )
+	 * @property {String | Number}	label			图标右侧的label文字
+	 * @property {String}			labelPos		label相对于图标的位置,只能right或bottom (默认 'right' )
+	 * @property {String | Number}	labelSize		label字体大小,单位px (默认 '15px' )
+	 * @property {String}			labelColor		图标右侧的label文字颜色 ( 默认 color['uv-content-color'] )
+	 * @property {String | Number}	space			label与图标的距离,单位px (默认 '3px' )
+	 * @property {String}			imgMode			图片的mode
+	 * @property {String | Number}	width			显示图片小图标时的宽度
+	 * @property {String | Number}	height			显示图片小图标时的高度
+	 * @property {String | Number}	top				图标在垂直方向上的定位 用于解决某些情况下,让图标垂直居中的用途  (默认 0 )
+	 * @property {Boolean}			stop			是否阻止事件传播 (默认 false )
+	 * @property {Object}			customStyle		icon的样式,对象形式
+	 * @event {Function} click 点击图标时触发
+	 * @event {Function} touchstart 事件触摸时触发
+	 * @example <uv-icon name="photo" color="#2979ff" size="28"></uv-icon>
+	 */
+	export default {
+		name: 'uv-icon',
+		emits: ['click'],
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				colorType: [
+					'primary',
+					'success',
+					'info',
+					'error',
+					'warning'
+				]
+			}
+		},
+		computed: {
+			uClasses() {
+				let classes = []
+				classes.push(this.customPrefix)
+				classes.push(this.customPrefix + '-' + this.name)
+				// 主题色,通过类配置
+				if (this.color && this.colorType.includes(this.color)) classes.push('uv-icon__icon--' + this.color)
+				// 阿里,头条,百度小程序通过数组绑定类名时,无法直接使用[a, b, c]的形式,否则无法识别
+				// 故需将其拆成一个字符串的形式,通过空格隔开各个类名
+				//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
+				classes = classes.join(' ')
+				//#endif
+				return classes
+			},
+			iconStyle() {
+				let style = {}
+				style = {
+					fontSize: this.$uv.addUnit(this.size),
+					lineHeight: this.$uv.addUnit(this.size),
+					fontWeight: this.bold ? 'bold' : 'normal',
+					// 某些特殊情况需要设置一个到顶部的距离,才能更好的垂直居中
+					top: this.$uv.addUnit(this.top)
+				}
+				// 非主题色值时,才当作颜色值
+				if (this.color && !this.colorType.includes(this.color)) style.color = this.color
+				return style
+			},
+			// 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
+			isImg() {
+				const isBase64 = this.name.indexOf('data:') > -1 && this.name.indexOf('base64') > -1;
+				return this.name.indexOf('/') !== -1 || isBase64;
+			},
+			imgStyle() {
+				let style = {}
+				// 如果设置width和height属性,则优先使用,否则使用size属性
+				style.width = this.width ? this.$uv.addUnit(this.width) : this.$uv.addUnit(this.size)
+				style.height = this.height ? this.$uv.addUnit(this.height) : this.$uv.addUnit(this.size)
+				return style
+			},
+			// 通过图标名,查找对应的图标
+			icon() {
+				// 如果内置的图标中找不到对应的图标,就直接返回name值,因为用户可能传入的是unicode代码
+				const code = icons['uvicon-' + this.name];
+				// #ifdef APP-NVUE
+				if(!code) {
+					return code ? unescape(`%u${code}`) : ['uvicon'].indexOf(this.customPrefix) > -1 ? unescape(`%u${this.name}`) : '';
+				}
+				// #endif
+				return code ? unescape(`%u${code}`) : ['uvicon'].indexOf(this.customPrefix) > -1 ? this.name : '';
+			}
+		},
+		methods: {
+			clickHandler(e) {
+				this.$emit('click', this.index)
+				// 是否阻止事件冒泡
+				this.stop && this.preventEvent(e)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/color.scss';
+	// 变量定义
+	$uv-icon-primary: $uv-primary !default;
+	$uv-icon-success: $uv-success !default;
+	$uv-icon-info: $uv-info !default;
+	$uv-icon-warning: $uv-warning !default;
+	$uv-icon-error: $uv-error !default;
+	$uv-icon-label-line-height: 1 !default;
+	/* #ifndef APP-NVUE */
+	// 非nvue下加载字体
+	@font-face {
+		font-family: 'uvicon-iconfont';
+		src: url('./uvicons.ttf') format('truetype');
+	}
+	/* #endif */
+	.uv-icon {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		&--left {
+			flex-direction: row-reverse;
+			align-items: center;
+		}
+		&--right {
+			flex-direction: row;
+			align-items: center;
+		}
+		&--top {
+			flex-direction: column-reverse;
+			justify-content: center;
+		}
+		&--bottom {
+			flex-direction: column;
+			justify-content: center;
+		}
+		&__icon {
+			font-family: uvicon-iconfont;
+			position: relative;
+			@include flex;
+			align-items: center;
+			&--primary {
+				color: $uv-icon-primary;
+			}
+			&--success {
+				color: $uv-icon-success;
+			}
+			&--error {
+				color: $uv-icon-error;
+			}
+			&--warning {
+				color: $uv-icon-warning;
+			}
+			&--info {
+				color: $uv-icon-info;
+			}
+		}
+		&__img {
+			/* #ifndef APP-NVUE */
+			height: auto;
+			will-change: transform;
+			/* #endif */
+		}
+		&__label {
+			/* #ifndef APP-NVUE */
+			line-height: $uv-icon-label-line-height;
+			/* #endif */
+		}
+	}
+</style>

二進制
uni_modules/uv-icon/components/uv-icon/uvicons.ttf


+ 83 - 0
uni_modules/uv-icon/package.json

@@ -0,0 +1,83 @@
+{
+  "id": "uv-icon",
+  "displayName": "uv-icon 图标 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.10",
+  "description": "基于字体的图标集,包含了大多数常见场景的图标,支持自定义,支持自定义图片图标等。可自定义颜色、大小。",
+  "keywords": [
+    "uv-ui,uvui,uv-icon,icon,图标,字体图标"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "Vue": {
+          "vue2": "y",
+          "vue3": "y"
+        },
+        "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",
+          "飞书": "u",
+          "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 15 - 0
uni_modules/uv-icon/readme.md

@@ -0,0 +1,15 @@
+## uv-icon 图标库
+
+> **组件名:uv-icon**
+
+基于字体的图标集,包含了大多数常见场景的图标,支持自定义,支持自定义图片图标等。
+
+# <a href="https://www.uvui.cn/components/icon.html" target="_blank">查看文档</a>
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png)
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 11 - 0
uni_modules/uv-safe-bottom/changelog.md

@@ -0,0 +1,11 @@
+## 1.0.4(2023-09-14)
+1. 飞书小程序支持
+## 1.0.3(2023-08-14)
+1. 修复百度报错的BUG
+## 1.0.2(2023-07-02)
+uv-safe-bottom 修复,在百度程序,抖音小程序不生效的BUG
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-safe-bottom 底部安全区组件

+ 67 - 0
uni_modules/uv-safe-bottom/components/uv-safe-bottom/uv-safe-bottom.vue

@@ -0,0 +1,67 @@
+<template>
+	<view
+		class="uv-safe-bottom"
+		:style="[style]"
+		:class="[!isNvue && 'uv-safe-area-inset-bottom']"
+	>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	/**
+	 * SafeBottom 底部安全区
+	 * @description 这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
+	 * @tutorial https://www.uvui.cn/components/safeAreaInset.html
+	 * @property {type}		prop_name
+	 * @property {Object}	customStyle	定义需要用到的外部样式
+	 *
+	 * @event {Function()}
+	 * @example <uv-status-bar></uv-status-bar>
+	 */
+	export default {
+		name: "uv-safe-bottom",
+		mixins: [mpMixin, mixin],
+		data() {
+			return {
+				safeAreaBottomHeight: 0,
+				isNvue: false,
+			};
+		},
+		computed: {
+			style() {
+				const style = {};
+				// #ifdef APP-NVUE || MP-TOUTIAO || MP-LARK
+				// nvue下,高度使用js计算填充
+				style.height = this.$uv.addUnit(this.$uv.sys()?.safeAreaInsets?.bottom, 'px');
+				// #endif
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle));
+			},
+		},
+		mounted() {
+			// #ifdef APP-NVUE
+			// 标识为是否nvue
+			this.isNvue = true;
+			// #endif
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	.uv-safe-bottom {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+	}
+	/* #ifndef APP-NVUE */
+	// 历遍生成4个方向的底部安全区
+	@each $d in top, right, bottom, left {
+		.uv-safe-area-inset-#{$d} {
+			padding-#{$d}: 0;
+			padding-#{$d}: constant(safe-area-inset-#{$d});  
+			padding-#{$d}: env(safe-area-inset-#{$d});  
+		}
+	}
+	/* #endif */
+</style>

+ 87 - 0
uni_modules/uv-safe-bottom/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uv-safe-bottom",
+  "displayName": "uv-safe-bottom 底部安全区  全面兼容小程序、nvue、vue2、vue3等多端",
+  "version": "1.0.4",
+  "description": "这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。",
+  "keywords": [
+    "uv-safe-bottom",
+    "uvui",
+    "uv-ui",
+    "bottom",
+    "底部安全区"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"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",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 11 - 0
uni_modules/uv-safe-bottom/readme.md

@@ -0,0 +1,11 @@
+## SafeBottom 底部安全区 
+
+> **组件名:uv-safe-bottom**
+
+这个适配,主要是针对IPhone X等一些底部带指示条的机型,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行底部安全区适配。
+
+### <a href="https://www.uvui.cn/guide/safeAreaInset.html" target="_blank">查看文档</a>
+
+### [完整示例项目下载 | 关注更多组件](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+#### 如使用过程中有任何问题,或者您对uv-ui有一些好的建议,欢迎加入 uv-ui 交流群:<a href="https://ext.dcloud.net.cn/plugin?id=12287" target="_blank">uv-ui</a>、<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

+ 14 - 0
uni_modules/uv-tabbar/changelog.md

@@ -0,0 +1,14 @@
+## 1.0.5(2023-07-17)
+1. 优化文档
+2. 优化其他
+## 1.0.4(2023-06-13)
+1. 底部安全距离依赖添加
+## 1.0.3(2023-06-09)
+1. 增加iconSize参数
+## 1.0.2(2023-06-01)
+1. 修复点击触发两次事件的BUG 
+## 1.0.1(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.0(2023-05-10)
+uv-tabbar 底部导航栏 

+ 40 - 0
uni_modules/uv-tabbar/components/uv-tabbar-item/props.js

@@ -0,0 +1,40 @@
+export default {
+	props: {
+		// item标签的名称,作为与uv-tabbar的value参数匹配的标识符
+		name: {
+			type: [String, Number, null],
+			default: null
+		},
+		// uv-ui内置图标或者绝对路径的图片
+		icon: {
+			icon: String,
+			default: ''
+		},
+		// 图标大小,默认uv-tabbar的iconSize=20
+		iconSize: {
+			type: [String, Number],
+			default: ''
+		},
+		// 右上角的角标提示信息
+		badge: {
+			type: [String, Number, null],
+			default: null
+		},
+		// 是否显示圆点,将会覆盖badge参数
+		dot: {
+			type: Boolean,
+			default: false
+		},
+		// 描述文本
+		text: {
+			type: String,
+			default: ''
+		},
+		// 控制徽标的位置,对象或者字符串形式,可以设置top和right属性
+		badgeStyle: {
+			type: [Object, String],
+			default: 'top: 6px;right:2px;'
+		},
+		...uni.$uv?.props?.tabbarItem
+	}
+}

+ 146 - 0
uni_modules/uv-tabbar/components/uv-tabbar-item/uv-tabbar-item.vue

@@ -0,0 +1,146 @@
+<template>
+	<view
+	    class="uv-tabbar-item"
+	    :style="[$uv.addStyle(customStyle)]"
+	    @tap="clickHandler"
+	>
+		<view class="uv-tabbar-item__icon">
+			<uv-icon
+			    v-if="icon"
+			    :name="icon"
+			    :color="isActive? parentData.activeColor : parentData.inactiveColor"
+			    :size="iconSize? iconSize: parentData.iconSize"
+			></uv-icon>
+			<template v-else>
+				<slot
+				    v-if="isActive"
+				    name="active-icon"
+				/>
+				<slot
+				    v-else
+				    name="inactive-icon"
+				/>
+			</template>
+			<uv-badge
+				absolute
+				:offset="[0, dot ? '34rpx' : badge > 9 ? '14rpx' : '20rpx']"
+			    :customStyle="badgeStyle"
+			    :isDot="dot"
+			    :value="badge || (dot ? 1 : null)"
+			    :show="dot || badge > 0"
+			></uv-badge>
+		</view>
+		
+		<slot name="text">
+			<text
+			    class="uv-tabbar-item__text"
+			    :style="{
+					color: isActive? parentData.activeColor : parentData.inactiveColor
+				}"
+			>{{ text }}</text>
+		</slot>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import props from './props.js';
+	/**
+	 * TabbarItem 底部导航栏子组件
+	 * @description 此组件提供了自定义tabbar的能力。
+	 * @tutorial https://www.uvui.cn/components/tabbar.html
+	 * @property {String | Number}	name		item标签的名称,作为与uv-tabbar的value参数匹配的标识符
+	 * @property {String}			icon		uvui内置图标或者绝对路径的图片
+	 * @property {String | Number}	badge		右上角的角标提示信息
+	 * @property {Boolean}			dot			是否显示圆点,将会覆盖badge参数(默认 false )
+	 * @property {String}			text		描述文本
+	 * @property {Object | String}	badgeStyle	控制徽标的位置,对象或者字符串形式,可以设置top和right属性(默认 'top: 6px;right:2px;' )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * 
+	 * @example <uv-tabbar :value="value2" :placeholder="false" @change="name => value2 = name" :fixed="false" :safeAreaInsetBottom="false"><uv-tabbar-item text="首页" icon="home" dot ></uv-tabbar-item></uv-tabbar>
+	 */
+	export default {
+		name: 'uv-tabbar-item',
+		mixins: [mpMixin, mixin, props],
+		emits: ['click','change'],
+		data() {
+			return {
+				isActive: false, // 是否处于激活状态
+				parentData: {
+					value: null,
+					activeColor: '',
+					inactiveColor: '',
+					iconSize: 20
+				}
+			}
+		},
+		created() {
+			this.init()
+		},
+		methods: {
+			init() {
+				// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环引用
+				this.updateParentData()
+				if (!this.parent) {
+					this.$uv.error('uv-tabbar-item必须搭配uv-tabbar组件使用')
+				}
+				// 本子组件在uv-tabbar的children数组中的索引
+				const index = this.parent.children.indexOf(this)
+				// 判断本组件的name(如果没有定义name,就用index索引)是否等于父组件的value参数
+				this.isActive = (this.name || index) === this.parentData.value
+			},
+			updateParentData() {
+				// 此方法在mixin中
+				this.getParentData('uv-tabbar')
+			},
+			// 此方法将会被父组件uv-tabbar调用
+			updateFromParent() {
+				// 重新初始化
+				this.init()
+			},
+			clickHandler() {
+				this.$nextTick(() => {
+					const index = this.parent.children.indexOf(this)
+					const name = this.name || index
+					// 点击的item为非激活的item才发出change事件
+					if (name !== this.parent.value) {
+						this.parent.$emit('change', name)
+					}
+					this.$emit('click', name)
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/color.scss';
+	.uv-tabbar-item {
+		@include flex(column);
+		align-items: center;
+		justify-content: center;
+		flex: 1;
+		
+		&__icon {
+			@include flex;
+			position: relative;
+			width: 150rpx;
+			justify-content: center;
+		}
+
+		&__text {
+			margin-top: 2px;
+			font-size: 12px;
+			color: $uv-content-color;
+		}
+	}
+
+	/* #ifdef MP */
+	// 由于小程序都使用shadow DOM形式实现,需要给影子宿主设置flex: 1才能让其撑开
+	:host {
+		flex: 1
+	}
+	/* #endif */
+</style>

+ 50 - 0
uni_modules/uv-tabbar/components/uv-tabbar/props.js

@@ -0,0 +1,50 @@
+export default {
+	props: {
+		// 当前匹配项的name
+		value: {
+			type: [String, Number, null],
+			default: null
+		},
+		// 是否为iPhoneX留出底部安全距离
+		safeAreaInsetBottom: {
+			type: Boolean,
+			default: true
+		},
+		// 是否显示上方边框
+		border: {
+			type: Boolean,
+			default: true
+		},
+		// 元素层级z-index
+		zIndex: {
+			type: [String, Number],
+			default: 9
+		},
+		// 选中标签的颜色
+		activeColor: {
+			type: String,
+			default: '#1989fa'
+		},
+		// 未选中标签的颜色
+		inactiveColor: {
+			type: String,
+			default: '#7d7e80'
+		},
+		// 是否固定在底部
+		fixed: {
+			type: Boolean,
+			default: true
+		},
+		// fixed定位固定在底部时,是否生成一个等高元素防止塌陷
+		placeholder: {
+			type: Boolean,
+			default: true
+		},
+		// 图标大小
+		iconSize: {
+			type: [String, Number],
+			default: 20
+		},
+		...uni.$uv?.props?.tabbar
+	}
+}

+ 146 - 0
uni_modules/uv-tabbar/components/uv-tabbar/uv-tabbar.vue

@@ -0,0 +1,146 @@
+<template>
+	<view class="uv-tabbar">
+		<view
+		    class="uv-tabbar__content"
+		    ref="uv-tabbar__content"
+		    @touchmove.stop.prevent="noop"
+		    :class="[border && 'uv-border-top', fixed && 'uv-tabbar--fixed']"
+		    :style="[tabbarStyle]"
+		>
+			<view class="uv-tabbar__content__item-wrapper">
+				<slot />
+			</view>
+			<uv-safe-bottom v-if="safeAreaInsetBottom"></uv-safe-bottom>
+		</view>
+		<view
+		    class="uv-tabbar__placeholder"
+			v-if="placeholder"
+		    :style="{
+				height: placeholderHeight + 'px',
+			}"
+		></view>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js'
+	import props from './props.js';
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom')
+	// #endif
+	/**
+	 * Tabbar 底部导航栏
+	 * @description 此组件提供了自定义tabbar的能力。
+	 * @tutorial https://www.uvui.cn/components/tabbar.html
+	 * @property {String | Number}	value				当前匹配项的name
+	 * @property {Boolean}			safeAreaInsetBottom	是否为iPhoneX留出底部安全距离(默认 true )
+	 * @property {Boolean}			border				是否显示上方边框(默认 true )
+	 * @property {String | Number}	zIndex				元素层级z-index(默认 1 )
+	 * @property {String}			activeColor			选中标签的颜色(默认 '#1989fa' )
+	 * @property {String}			inactiveColor		未选中标签的颜色(默认 '#7d7e80' )
+	 * @property {Boolean}			fixed				是否固定在底部(默认 true )
+	 * @property {Boolean}			placeholder			fixed定位固定在底部时,是否生成一个等高元素防止塌陷(默认 true )
+	 * @property {Object}			customStyle			定义需要用到的外部样式
+	 * 
+	 * @example <uv-tabbar :value="value2" :placeholder="false" @change="name => value2 = name" :fixed="false" :safeAreaInsetBottom="false"><uv-tabbar-item text="首页" icon="home" dot ></uv-tabbar-item></uv-tabbar>
+	 */
+	export default {
+		name: 'uv-tabbar',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				placeholderHeight: 0
+			}
+		},
+		computed: {
+			tabbarStyle() {
+				const style = {
+					zIndex: this.zIndex
+				}
+				// 合并来自父组件的customStyle样式
+				return this.$uv.deepMerge(style, this.$uv.addStyle(this.customStyle))
+			},
+			// 监听多个参数的变化,通过在computed执行对应的操作
+			updateChild() {
+				return [this.value, this.activeColor, this.inactiveColor]
+			},
+			updatePlaceholder() {
+				return [this.fixed, this.placeholder]
+			}
+		},
+		watch: {
+			updateChild() {
+				// 如果updateChildren中的元素发生了变化,则执行子元素初始化操作
+				this.updateChildren()
+			},
+			updatePlaceholder() {
+				// 如果fixed,placeholder等参数发生变化,重新计算占位元素的高度
+				this.setPlaceholderHeight()
+			}
+		},
+		created() {
+			this.children = []
+		},
+		mounted() {
+			this.setPlaceholderHeight()
+		},
+		methods: {
+			updateChildren() {
+				// 如果存在子元素,则执行子元素的updateFromParent进行更新数据
+				this.children.length && this.children.map(child => child.updateFromParent())
+			},
+			// 设置用于防止塌陷元素的高度
+			async setPlaceholderHeight() {
+				if (!this.fixed || !this.placeholder) return
+				// 延时一定时间
+				await this.$uv.sleep(20)
+				// #ifndef APP-NVUE
+				this.$uvGetRect('.uv-tabbar__content').then(({height = 50}) => {
+					// 修复IOS safearea bottom 未填充高度
+					this.placeholderHeight = height
+				})
+				// #endif
+
+				// #ifdef APP-NVUE
+				dom.getComponentRect(this.$refs['uv-tabbar__content'], (res) => {
+					const {
+						size
+					} = res
+					this.placeholderHeight = size.height
+				})
+				// #endif
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	$show-border: 1;
+	$show-border-top: 1;
+	@import '@/uni_modules/uv-ui-tools/libs/css/variable.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/uv-ui-tools/libs/css/color.scss';
+	.uv-tabbar {
+		@include flex(column);
+		flex: 1;
+		justify-content: center;
+		
+		&__content {
+			@include flex(column);
+			background-color: #fff;
+			
+			&__item-wrapper {
+				height: 50px;
+				@include flex(row);
+			}
+		}
+
+		&--fixed {
+			position: fixed;
+			bottom: 0;
+			left: 0;
+			right: 0;
+		}
+	}
+</style>

+ 90 - 0
uni_modules/uv-tabbar/package.json

@@ -0,0 +1,90 @@
+{
+  "id": "uv-tabbar",
+  "displayName": "uv-tabbar 底部导航栏 全面兼容vue3+2、app、h5、小程序等多端",
+  "version": "1.0.5",
+  "description": "底部导航栏组件提供了自定义tabbar的能力,可以满足某些需要鉴权跳转等场景。",
+  "keywords": [
+    "uv-tabbar",
+    "uvui",
+    "uv-ui",
+    "tabbar",
+    "底部导航栏"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "无",
+    	"data": "插件不采集任何数据",
+    	"permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uv-ui-tools",
+			"uv-icon",
+			"uv-badge",
+			"uv-safe-bottom"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"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",
+					"飞书": "u",
+					"京东": "u"
+				},
+				"快应用": {
+					"华为": "u",
+					"联盟": "u"
+				}
+			}
+		}
+  }
+}

+ 21 - 0
uni_modules/uv-tabbar/readme.md

@@ -0,0 +1,21 @@
+## Tabbar 底部导航栏
+
+> **组件名:uv-tabbar**
+
+此组件提供了自定义`tabbar`的能力。
+
+一般固定在底部,可以满足某些需要鉴权跳转等场景。一旦自定义底部导航栏后,为了达到不闪烁的效果,建议在`tabbar`页面进行组件切换。
+
+# <a href="https://www.uvui.cn/components/tabbar.html" target="_blank">查看文档</a>
+
+## [下载完整示例项目](https://ext.dcloud.net.cn/plugin?name=uv-ui) <span style="font-size:14px;font-weight:700;">(请不要 下载插件ZIP)</span>
+
+### [更多插件,请关注uv-ui组件库](https://ext.dcloud.net.cn/plugin?name=uv-ui)
+
+<a href="https://ext.dcloud.net.cn/plugin?name=uv-ui" target="_blank">
+
+![image](https://mp-a667b617-c5f1-4a2d-9a54-683a67cff588.cdn.bspapp.com/uv-ui/banner.png)
+
+</a>
+
+#### 如使用过程中有任何问题反馈,或者您对uv-ui有一些好的建议,欢迎加入uv-ui官方交流群:<a href="https://www.uvui.cn/components/addQQGroup.html" target="_blank">官方QQ群</a>

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

@@ -0,0 +1,64 @@
+## 1.1.19(2023-10-13)
+1. 兼容vue3
+## 1.1.18(2023-10-12)
+1. 1.1.15版本
+## 1.1.17(2023-09-27)
+1. 1.1.14版本发布
+## 1.1.16(2023-09-15)
+1. 1.1.13版本发布
+## 1.1.15(2023-09-15)
+1. 更新button.js相关按钮支持open-type="agreePrivacyAuthorization"
+## 1.1.14(2023-09-14)
+1. 优化dayjs
+## 1.1.13(2023-09-13)
+1. 优化,$uv中增加unit参数,方便组件中使用
+## 1.1.12(2023-09-10)
+1. 升级版本
+## 1.1.11(2023-09-04)
+1. 1.1.11版本
+## 1.1.10(2023-08-31)
+1. 修复customStyle和customClass存在冲突的问题
+## 1.1.9(2023-08-27)
+1. 版本升级
+2. 优化
+## 1.1.8(2023-08-24)
+1. 版本升级
+## 1.1.7(2023-08-22)
+1. 版本升级
+## 1.1.6(2023-08-18)
+uvui版本:1.1.6
+## 1.0.15(2023-08-14)
+1. 更新uvui版本号
+## 1.0.13(2023-08-06)
+1. 优化
+## 1.0.12(2023-08-06)
+1. 修改版本号
+## 1.0.11(2023-08-06)
+1. 路由增加events参数
+2. 路由拦截修复
+## 1.0.10(2023-08-01)
+1. 优化
+## 1.0.9(2023-06-28)
+优化openType.js
+## 1.0.8(2023-06-15)
+1. 修改支付宝报错的BUG
+## 1.0.7(2023-06-07)
+1. 解决微信小程序使用uvui提示 Some selectors are not allowed in component wxss, including tag name selectors, ID selectors, and attribute selectors
+2. 解决上述提示,需要在uni.scss配置$uvui-nvue-style: false; 然后在APP.vue下面引入uvui内置的基础样式:@import '@/uni_modules/uv-ui-tools/index.scss';
+## 1.0.6(2023-06-04)
+1.  uv-ui-tools 优化工具组件,兼容更多功能
+2.  小程序分享功能优化等
+## 1.0.5(2023-06-02)
+1. 修改扩展使用mixin中方法的问题
+## 1.0.4(2023-05-23)
+1. 兼容百度小程序修改bem函数
+## 1.0.3(2023-05-16)
+1. 优化组件依赖,修改后无需全局引入,组件导入即可使用
+2. 优化部分功能
+## 1.0.2(2023-05-10)
+1. 增加Http请求封装
+2. 优化
+## 1.0.1(2023-05-04)
+1. 修改名称及备注
+## 1.0.0(2023-05-04)
+1. uv-ui工具集首次发布

+ 6 - 0
uni_modules/uv-ui-tools/components/uv-ui-tools/uv-ui-tools.vue

@@ -0,0 +1,6 @@
+<template>
+</template>
+<script>
+</script>
+<style>
+</style>

+ 79 - 0
uni_modules/uv-ui-tools/index.js

@@ -0,0 +1,79 @@
+// 全局挂载引入http相关请求拦截插件
+import Request from './libs/luch-request'
+
+// 引入全局mixin
+import mixin from './libs/mixin/mixin.js'
+// 小程序特有的mixin
+import mpMixin from './libs/mixin/mpMixin.js'
+// #ifdef MP
+import mpShare from '@/uni_modules/uv-ui-tools/libs/mixin/mpShare.js'
+// #endif
+
+// 路由封装
+import route from './libs/util/route.js'
+// 公共工具函数
+import * as index from './libs/function/index.js'
+// 防抖方法
+import debounce from './libs/function/debounce.js'
+// 节流方法
+import throttle from './libs/function/throttle.js'
+// 规则检验
+import * as test from './libs/function/test.js'
+
+// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制
+import * as colorGradient from './libs/function/colorGradient.js'
+
+// 配置信息
+import config from './libs/config/config.js'
+// 平台
+import platform from './libs/function/platform'
+
+const $uv = {
+	route,
+	config,
+	test,
+	date: index.timeFormat, // 另名date
+	...index,
+	colorGradient: colorGradient.colorGradient,
+	hexToRgb: colorGradient.hexToRgb,
+	rgbToHex: colorGradient.rgbToHex,
+	colorToRgba: colorGradient.colorToRgba,
+	http: new Request(),
+	debounce,
+	throttle,
+	platform,
+	mixin,
+	mpMixin
+}
+uni.$uv = $uv;
+const install = (Vue,options={}) => {
+		// #ifndef APP-NVUE
+		const cloneMixin = index.deepClone(mixin);
+		delete cloneMixin?.props?.customClass;
+		delete cloneMixin?.props?.customStyle;
+		Vue.mixin(cloneMixin);
+		// #ifdef MP
+		if(options.mpShare){
+			Vue.mixin(mpShare);
+		}
+		// #endif
+		// #endif
+		// #ifdef VUE2
+		// 时间格式化,同时两个名称,date和timeFormat
+		Vue.filter('timeFormat', (timestamp, format) => uni.$uv.timeFormat(timestamp, format));
+		Vue.filter('date', (timestamp, format) => uni.$uv.timeFormat(timestamp, format));
+		// 将多久以前的方法,注入到全局过滤器
+		Vue.filter('timeFrom', (timestamp, format) => uni.$uv.timeFrom(timestamp, format));
+		// 同时挂载到uni和Vue.prototype中
+		// #ifndef APP-NVUE
+		// 只有vue,挂载到Vue.prototype才有意义,因为nvue中全局Vue.prototype和Vue.mixin是无效的
+		Vue.prototype.$uv = $uv;
+		// #endif
+		// #endif
+		// #ifdef VUE3
+		Vue.config.globalProperties.$uv = $uv;
+		// #endif
+}
+export default {
+	install
+}

+ 7 - 0
uni_modules/uv-ui-tools/index.scss

@@ -0,0 +1,7 @@
+// 引入公共基础类
+@import "./libs/css/common.scss";
+
+// 非nvue的样式
+/* #ifndef APP-NVUE */
+@import "./libs/css/vue.scss";
+/* #endif */

+ 34 - 0
uni_modules/uv-ui-tools/libs/config/config.js

@@ -0,0 +1,34 @@
+// 此版本发布于2023-10-12
+const version = '1.1.15'
+
+// 开发环境才提示,生产环境不会提示
+if (process.env.NODE_ENV === 'development') {
+	console.log(`\n %c uvui V${version} https://www.uvui.cn/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;');
+}
+
+export default {
+    v: version,
+    version,
+    // 主题名称
+    type: [
+        'primary',
+        'success',
+        'info',
+        'error',
+        'warning'
+    ],
+    // 颜色部分,本来可以通过scss的:export导出供js使用,但是奈何nvue不支持
+    color: {
+        'uv-primary': '#2979ff',
+        'uv-warning': '#ff9900',
+        'uv-success': '#19be6b',
+        'uv-error': '#fa3534',
+        'uv-info': '#909399',
+        'uv-main-color': '#303133',
+        'uv-content-color': '#606266',
+        'uv-tips-color': '#909399',
+        'uv-light-color': '#c0c4cc'
+    },
+	// 默认单位,可以通过配置为rpx,那么在用于传入组件大小参数为数值时,就默认为rpx
+	unit: 'px'
+}

+ 32 - 0
uni_modules/uv-ui-tools/libs/css/color.scss

@@ -0,0 +1,32 @@
+$uv-main-color: #303133 !default;
+$uv-content-color: #606266 !default;
+$uv-tips-color: #909193 !default;
+$uv-light-color: #c0c4cc !default;
+$uv-border-color: #dadbde !default;
+$uv-bg-color: #f3f4f6 !default;
+$uv-disabled-color: #c8c9cc !default;
+
+$uv-primary: #3c9cff !default;
+$uv-primary-dark: #398ade !default;
+$uv-primary-disabled: #9acafc !default;
+$uv-primary-light: #ecf5ff !default;
+
+$uv-warning: #f9ae3d !default;
+$uv-warning-dark: #f1a532 !default;
+$uv-warning-disabled: #f9d39b !default;
+$uv-warning-light: #fdf6ec !default;
+
+$uv-success: #5ac725 !default;
+$uv-success-dark: #53c21d !default;
+$uv-success-disabled: #a9e08f !default;
+$uv-success-light: #f5fff0;
+
+$uv-error: #f56c6c !default;
+$uv-error-dark: #e45656 !default;
+$uv-error-disabled: #f7b2b2 !default;
+$uv-error-light: #fef0f0 !default;
+
+$uv-info: #909399 !default;
+$uv-info-dark: #767a82 !default;
+$uv-info-disabled: #c4c6c9 !default;
+$uv-info-light: #f4f4f5 !default;

+ 100 - 0
uni_modules/uv-ui-tools/libs/css/common.scss

@@ -0,0 +1,100 @@
+// 超出行数,自动显示行尾省略号,最多5行
+// 来自uvui的温馨提示:当您在控制台看到此报错,说明需要在App.vue的style标签加上【lang="scss"】
+@for $i from 1 through 5 {
+	.uv-line-#{$i} {
+		/* #ifdef APP-NVUE */
+		// nvue下,可以直接使用lines属性,这是weex特有样式
+		lines: $i;
+		text-overflow: ellipsis;
+		overflow: hidden;
+		flex: 1;
+		/* #endif */
+
+		/* #ifndef APP-NVUE */
+		// vue下,单行和多行显示省略号需要单独处理
+		@if $i == '1' {
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		} @else {
+			display: -webkit-box!important;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-break: break-all;
+			-webkit-line-clamp: $i;
+			-webkit-box-orient: vertical!important;
+		}
+		/* #endif */
+	}
+}
+$uv-bordercolor: #dadbde;
+@if variable-exists(uv-border-color) {
+	$uv-bordercolor: $uv-border-color;
+}
+
+// 此处加上!important并非随意乱用,而是因为目前*.nvue页面编译到H5时,
+// App.vue的样式会被uni-app的view元素的自带border属性覆盖,导致无效
+// 综上,这是uni-app的缺陷导致我们为了多端兼容,而必须要加上!important
+// 移动端兼容性较好,直接使用0.5px去实现细边框,不使用伪元素形式实现
+.uv-border {
+	border-width: 0.5px!important;
+	border-color: $uv-bordercolor!important;
+    border-style: solid;
+}
+
+.uv-border-top {
+	border-top-width: 0.5px!important;
+	border-color: $uv-bordercolor!important;
+    border-top-style: solid;
+}
+
+.uv-border-left {
+	border-left-width: 0.5px!important;
+	border-color: $uv-bordercolor!important;
+    border-left-style: solid;
+}
+
+.uv-border-right {
+	border-right-width: 0.5px!important;
+	border-color: $uv-bordercolor!important;
+    border-right-style: solid;
+}
+
+.uv-border-bottom {
+	border-bottom-width: 0.5px!important;
+	border-color: $uv-bordercolor!important;
+    border-bottom-style: solid;
+}
+
+.uv-border-top-bottom {
+	border-top-width: 0.5px!important;
+	border-bottom-width: 0.5px!important;
+	border-color: $uv-bordercolor!important;
+    border-top-style: solid;
+    border-bottom-style: solid;
+}
+
+// 去除button的所有默认样式,让其表现跟普通的view、text元素一样
+.uv-reset-button {
+	padding: 0;
+	background-color: transparent;
+	/* #ifndef APP-PLUS */
+	font-size: inherit;
+	line-height: inherit;
+	color: inherit;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	border-width: 0;
+	/* #endif */
+}
+
+/* #ifndef APP-NVUE */
+.uv-reset-button::after {
+   border: none;
+}
+/* #endif */
+
+.uv-hover-class {
+	opacity: 0.7;
+}
+

+ 23 - 0
uni_modules/uv-ui-tools/libs/css/components.scss

@@ -0,0 +1,23 @@
+@mixin flex($direction: row) {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: $direction;
+}
+
+/* #ifndef APP-NVUE */
+// 由于uvui是基于nvue环境进行开发的,此环境中普通元素默认为flex-direction: column;
+// 所以在非nvue中,需要对元素进行重置为flex-direction: column; 否则可能会表现异常
+$uvui-nvue-style: true !default;
+@if $uvui-nvue-style == true {
+	view, scroll-view, swiper-item {
+		display: flex;
+		flex-direction: column;
+		flex-shrink: 0;
+		flex-grow: 0;
+		flex-basis: auto;
+		align-items: stretch;
+		align-content: flex-start;
+	}
+}
+/* #endif */

+ 111 - 0
uni_modules/uv-ui-tools/libs/css/variable.scss

@@ -0,0 +1,111 @@
+// 超出行数,自动显示行尾省略号,最多5行
+// 来自uvui的温馨提示:当您在控制台看到此报错,说明需要在App.vue的style标签加上【lang="scss"】
+@if variable-exists(show-lines) {
+	@for $i from 1 through 5 {
+		.uv-line-#{$i} {
+			/* #ifdef APP-NVUE */
+			// nvue下,可以直接使用lines属性,这是weex特有样式
+			lines: $i;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			flex: 1;
+			/* #endif */
+
+			/* #ifndef APP-NVUE */
+			// vue下,单行和多行显示省略号需要单独处理
+			@if $i == '1' {
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			} @else {
+				display: -webkit-box!important;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				word-break: break-all;
+				-webkit-line-clamp: $i;
+				-webkit-box-orient: vertical!important;
+			}
+			/* #endif */
+		}
+	}
+}
+@if variable-exists(show-border) {
+	$uv-bordercolor: #dadbde;
+	@if variable-exists(uv-border-color) {
+		$uv-bordercolor: $uv-border-color;
+	}
+	// 此处加上!important并非随意乱用,而是因为目前*.nvue页面编译到H5时,
+	// App.vue的样式会被uni-app的view元素的自带border属性覆盖,导致无效
+	// 综上,这是uni-app的缺陷导致我们为了多端兼容,而必须要加上!important
+	// 移动端兼容性较好,直接使用0.5px去实现细边框,不使用伪元素形式实现
+	@if variable-exists(show-border-surround) {
+		.uv-border {
+			border-width: 0.5px!important;
+			border-color: $uv-bordercolor!important;
+			border-style: solid;
+		}
+	}
+	@if variable-exists(show-border-top) {
+		.uv-border-top {
+			border-top-width: 0.5px!important;
+			border-color: $uv-bordercolor!important;
+			border-top-style: solid;
+		}
+	}
+	@if variable-exists(show-border-left) {
+		.uv-border-left {
+			border-left-width: 0.5px!important;
+			border-color: $uv-bordercolor!important;
+			border-left-style: solid;
+		}
+	}
+	@if variable-exists(show-border-right) {
+		.uv-border-right {
+			border-right-width: 0.5px!important;
+			border-color: $uv-bordercolor!important;
+			border-right-style: solid;
+		}
+	}
+	@if variable-exists(show-border-bottom) {
+		.uv-border-bottom {
+			border-bottom-width: 0.5px!important;
+			border-color: $uv-bordercolor!important;
+				border-bottom-style: solid;
+		}
+	}
+	@if variable-exists(show-border-top-bottom) {
+		.uv-border-top-bottom {
+			border-top-width: 0.5px!important;
+			border-bottom-width: 0.5px!important;
+			border-color: $uv-bordercolor!important;
+			border-top-style: solid;
+			border-bottom-style: solid;
+		}
+	}
+}
+@if variable-exists(show-reset-button) {
+	// 去除button的所有默认样式,让其表现跟普通的view、text元素一样
+	.uv-reset-button {
+		padding: 0;
+		background-color: transparent;
+		/* #ifndef APP-PLUS */
+		font-size: inherit;
+		line-height: inherit;
+		color: inherit;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		border-width: 0;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.uv-reset-button::after {
+		 border: none;
+	}
+	/* #endif */
+}
+@if variable-exists(show-hover) {
+	.uv-hover-class {
+		opacity: 0.7;
+	}
+}

+ 40 - 0
uni_modules/uv-ui-tools/libs/css/vue.scss

@@ -0,0 +1,40 @@
+// 历遍生成4个方向的底部安全区
+@each $d in top, right, bottom, left {
+	.uv-safe-area-inset-#{$d} {
+		padding-#{$d}: 0;
+		padding-#{$d}: constant(safe-area-inset-#{$d});  
+		padding-#{$d}: env(safe-area-inset-#{$d});  
+	}
+}
+
+//提升H5端uni.toast()的层级,避免被uvui的modal等遮盖
+/* #ifdef H5 */
+uni-toast {
+    z-index: 10090;
+}
+uni-toast .uni-toast {
+   z-index: 10090;
+}
+/* #endif */
+
+// 隐藏scroll-view的滚动条
+::-webkit-scrollbar {
+    display: none;  
+    width: 0 !important;  
+    height: 0 !important;  
+    -webkit-appearance: none;  
+    background: transparent;  
+}
+
+$uvui-nvue-style: true !default;
+@if $uvui-nvue-style == false {
+	view, scroll-view, swiper-item {
+		display: flex;
+		flex-direction: column;
+		flex-shrink: 0;
+		flex-grow: 0;
+		flex-basis: auto;
+		align-items: stretch;
+		align-content: flex-start;
+	}
+}

+ 134 - 0
uni_modules/uv-ui-tools/libs/function/colorGradient.js

@@ -0,0 +1,134 @@
+/**
+ * 求两个颜色之间的渐变值
+ * @param {string} startColor 开始的颜色
+ * @param {string} endColor 结束的颜色
+ * @param {number} step 颜色等分的份额
+ * */
+function colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) {
+    const startRGB = hexToRgb(startColor, false) // 转换为rgb数组模式
+    const startR = startRGB[0]
+    const startG = startRGB[1]
+    const startB = startRGB[2]
+
+    const endRGB = hexToRgb(endColor, false)
+    const endR = endRGB[0]
+    const endG = endRGB[1]
+    const endB = endRGB[2]
+
+    const sR = (endR - startR) / step // 总差值
+    const sG = (endG - startG) / step
+    const sB = (endB - startB) / step
+    const colorArr = []
+    for (let i = 0; i < step; i++) {
+        // 计算每一步的hex值
+        let hex = rgbToHex(`rgb(${Math.round((sR * i + startR))},${Math.round((sG * i + startG))},${Math.round((sB
+			* i + startB))})`)
+        // 确保第一个颜色值为startColor的值
+        if (i === 0) hex = rgbToHex(startColor)
+        // 确保最后一个颜色值为endColor的值
+        if (i === step - 1) hex = rgbToHex(endColor)
+        colorArr.push(hex)
+    }
+    return colorArr
+}
+
+// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)
+function hexToRgb(sColor, str = true) {
+    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+    sColor = String(sColor).toLowerCase()
+    if (sColor && reg.test(sColor)) {
+        if (sColor.length === 4) {
+            let sColorNew = '#'
+            for (let i = 1; i < 4; i += 1) {
+                sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+            }
+            sColor = sColorNew
+        }
+        // 处理六位的颜色值
+        const sColorChange = []
+        for (let i = 1; i < 7; i += 2) {
+            sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))
+        }
+        if (!str) {
+            return sColorChange
+        }
+        return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`
+    } if (/^(rgb|RGB)/.test(sColor)) {
+        const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',')
+        return arr.map((val) => Number(val))
+    }
+    return sColor
+}
+
+// 将rgb表示方式转换为hex表示方式
+function rgbToHex(rgb) {
+    const _this = rgb
+    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+    if (/^(rgb|RGB)/.test(_this)) {
+        const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',')
+        let strHex = '#'
+        for (let i = 0; i < aColor.length; i++) {
+            let hex = Number(aColor[i]).toString(16)
+            hex = String(hex).length == 1 ? `${0}${hex}` : hex // 保证每个rgb的值为2位
+            if (hex === '0') {
+                hex += hex
+            }
+            strHex += hex
+        }
+        if (strHex.length !== 7) {
+            strHex = _this
+        }
+        return strHex
+    } if (reg.test(_this)) {
+        const aNum = _this.replace(/#/, '').split('')
+        if (aNum.length === 6) {
+            return _this
+        } if (aNum.length === 3) {
+            let numHex = '#'
+            for (let i = 0; i < aNum.length; i += 1) {
+                numHex += (aNum[i] + aNum[i])
+            }
+            return numHex
+        }
+    } else {
+        return _this
+    }
+}
+
+/**
+* JS颜色十六进制转换为rgb或rgba,返回的格式为 rgba(255,255,255,0.5)字符串
+* sHex为传入的十六进制的色值
+* alpha为rgba的透明度
+*/
+function colorToRgba(color, alpha) {
+    color = rgbToHex(color)
+    // 十六进制颜色值的正则表达式
+    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+    /* 16进制颜色转为RGB格式 */
+    let sColor = String(color).toLowerCase()
+    if (sColor && reg.test(sColor)) {
+        if (sColor.length === 4) {
+            let sColorNew = '#'
+            for (let i = 1; i < 4; i += 1) {
+                sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+            }
+            sColor = sColorNew
+        }
+        // 处理六位的颜色值
+        const sColorChange = []
+        for (let i = 1; i < 7; i += 2) {
+            sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))
+        }
+        // return sColorChange.join(',')
+        return `rgba(${sColorChange.join(',')},${alpha})`
+    }
+
+    return sColor
+}
+
+export {
+    colorGradient,
+    hexToRgb,
+    rgbToHex,
+    colorToRgba
+}

+ 29 - 0
uni_modules/uv-ui-tools/libs/function/debounce.js

@@ -0,0 +1,29 @@
+let timeout = null
+
+/**
+ * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数
+ *
+ * @param {Function} func 要执行的回调函数
+ * @param {Number} wait 延时的时间
+ * @param {Boolean} immediate 是否立即执行
+ * @return null
+ */
+function debounce(func, wait = 500, immediate = false) {
+    // 清除定时器
+    if (timeout !== null) clearTimeout(timeout)
+    // 立即执行,此类情况一般用不到
+    if (immediate) {
+        const callNow = !timeout
+        timeout = setTimeout(() => {
+            timeout = null
+        }, wait)
+        if (callNow) typeof func === 'function' && func()
+    } else {
+        // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
+        timeout = setTimeout(() => {
+            typeof func === 'function' && func()
+        }, wait)
+    }
+}
+
+export default debounce

+ 167 - 0
uni_modules/uv-ui-tools/libs/function/digit.js

@@ -0,0 +1,167 @@
+let _boundaryCheckingState = true; // 是否进行越界检查的全局开关
+
+/**
+ * 把错误的数据转正
+ * @private
+ * @example strip(0.09999999999999998)=0.1
+ */
+function strip(num, precision = 15) {
+  return +parseFloat(Number(num).toPrecision(precision));
+}
+
+/**
+ * Return digits length of a number
+ * @private
+ * @param {*number} num Input number
+ */
+function digitLength(num) {
+  // Get digit length of e
+  const eSplit = num.toString().split(/[eE]/);
+  const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+  return len > 0 ? len : 0;
+}
+
+/**
+ * 把小数转成整数,如果是小数则放大成整数
+ * @private
+ * @param {*number} num 输入数
+ */
+function float2Fixed(num) {
+  if (num.toString().indexOf('e') === -1) {
+    return Number(num.toString().replace('.', ''));
+  }
+  const dLen = digitLength(num);
+  return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+
+/**
+ * 检测数字是否越界,如果越界给出提示
+ * @private
+ * @param {*number} num 输入数
+ */
+function checkBoundary(num) {
+  if (_boundaryCheckingState) {
+    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+      console.warn(`${num} 超出了精度限制,结果可能不正确`);
+    }
+  }
+}
+
+/**
+ * 把递归操作扁平迭代化
+ * @param {number[]} arr 要操作的数字数组
+ * @param {function} operation 迭代操作
+ * @private
+ */
+function iteratorOperation(arr, operation) {
+  const [num1, num2, ...others] = arr;
+  let res = operation(num1, num2);
+
+  others.forEach((num) => {
+    res = operation(res, num);
+  });
+
+  return res;
+}
+
+/**
+ * 高精度乘法
+ * @export
+ */
+export function times(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, times);
+  }
+
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  const baseNum = digitLength(num1) + digitLength(num2);
+  const leftValue = num1Changed * num2Changed;
+
+  checkBoundary(leftValue);
+
+  return leftValue / Math.pow(10, baseNum);
+}
+
+/**
+ * 高精度加法
+ * @export
+ */
+export function plus(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, plus);
+  }
+
+  const [num1, num2] = nums;
+  // 取最大的小数位
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  // 把小数都转为整数然后再计算
+  return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 高精度减法
+ * @export
+ */
+export function minus(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, minus);
+  }
+
+  const [num1, num2] = nums;
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 高精度除法
+ * @export
+ */
+export function divide(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, divide);
+  }
+
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  checkBoundary(num1Changed);
+  checkBoundary(num2Changed);
+  // 重要,这里必须用strip进行修正
+  return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+}
+
+/**
+ * 四舍五入
+ * @export
+ */
+export function round(num, ratio) {
+  const base = Math.pow(10, ratio);
+  let result = divide(Math.round(Math.abs(times(num, base))), base);
+  if (num < 0 && result !== 0) {
+    result = times(result, -1);
+  }
+  // 位数不足则补0
+  return result;
+}
+
+/**
+ * 是否进行边界检查,默认开启
+ * @param flag 标记开关,true 为开启,false 为关闭,默认为 true
+ * @export
+ */
+export function enableBoundaryChecking(flag = true) {
+  _boundaryCheckingState = flag;
+}
+
+
+export default {
+  times,
+  plus,
+  minus,
+  divide,
+  round,
+  enableBoundaryChecking,
+};
+

+ 734 - 0
uni_modules/uv-ui-tools/libs/function/index.js

@@ -0,0 +1,734 @@
+import { number, empty } from './test.js'
+import { round } from './digit.js'
+/**
+ * @description 如果value小于min,取min;如果value大于max,取max
+ * @param {number} min
+ * @param {number} max
+ * @param {number} value
+ */
+function range(min = 0, max = 0, value = 0) {
+	return Math.max(min, Math.min(max, Number(value)))
+}
+
+/**
+ * @description 用于获取用户传递值的px值  如果用户传递了"xxpx"或者"xxrpx",取出其数值部分,如果是"xxxrpx"还需要用过uni.upx2px进行转换
+ * @param {number|string} value 用户传递值的px值
+ * @param {boolean} unit
+ * @returns {number|string}
+ */
+function getPx(value, unit = false) {
+	if (number(value)) {
+		return unit ? `${value}px` : Number(value)
+	}
+	// 如果带有rpx,先取出其数值部分,再转为px值
+	if (/(rpx|upx)$/.test(value)) {
+		return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)))
+	}
+	return unit ? `${parseInt(value)}px` : parseInt(value)
+}
+
+/**
+ * @description 进行延时,以达到可以简写代码的目的 比如: await uni.$uv.sleep(20)将会阻塞20ms
+ * @param {number} value 堵塞时间 单位ms 毫秒
+ * @returns {Promise} 返回promise
+ */
+function sleep(value = 30) {
+	return new Promise((resolve) => {
+		setTimeout(() => {
+			resolve()
+		}, value)
+	})
+}
+/**
+ * @description 运行期判断平台
+ * @returns {string} 返回所在平台(小写)
+ * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台
+ */
+function os() {
+	return uni.getSystemInfoSync().platform.toLowerCase()
+}
+/**
+ * @description 获取系统信息同步接口
+ * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync
+ */
+function sys() {
+	return uni.getSystemInfoSync()
+}
+
+/**
+ * @description 取一个区间数
+ * @param {Number} min 最小值
+ * @param {Number} max 最大值
+ */
+function random(min, max) {
+	if (min >= 0 && max > 0 && max >= min) {
+		const gab = max - min + 1
+		return Math.floor(Math.random() * gab + min)
+	}
+	return 0
+}
+
+/**
+ * @param {Number} len uuid的长度
+ * @param {Boolean} firstU 将返回的首字母置为"u"
+ * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
+ */
+function guid(len = 32, firstU = true, radix = null) {
+	const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
+	const uuid = []
+	radix = radix || chars.length
+
+	if (len) {
+		// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
+		for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
+	} else {
+		let r
+		// rfc4122标准要求返回的uuid中,某些位为固定的字符
+		uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
+		uuid[14] = '4'
+
+		for (let i = 0; i < 36; i++) {
+			if (!uuid[i]) {
+				r = 0 | Math.random() * 16
+				uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
+			}
+		}
+	}
+	// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
+	if (firstU) {
+		uuid.shift()
+		return `u${uuid.join('')}`
+	}
+	return uuid.join('')
+}
+
+/**
+* @description 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法
+   this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx
+   这里默认值等于undefined有它的含义,因为最顶层元素(组件)的$parent就是undefined,意味着不传name
+   值(默认为undefined),就是查找最顶层的$parent
+*  @param {string|undefined} name 父组件的参数名
+*/
+function $parent(name = undefined) {
+	let parent = this.$parent
+	// 通过while历遍,这里主要是为了H5需要多层解析的问题
+	while (parent) {
+		// 父组件
+		if (parent.$options && parent.$options.name !== name) {
+			// 如果组件的name不相等,继续上一级寻找
+			parent = parent.$parent
+		} else {
+			return parent
+		}
+	}
+	return false
+}
+
+/**
+ * @description 样式转换
+ * 对象转字符串,或者字符串转对象
+ * @param {object | string} customStyle 需要转换的目标
+ * @param {String} target 转换的目的,object-转为对象,string-转为字符串
+ * @returns {object|string}
+ */
+function addStyle(customStyle, target = 'object') {
+	// 字符串转字符串,对象转对象情形,直接返回
+	if (empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' &&
+		typeof(customStyle) === 'string') {
+		return customStyle
+	}
+	// 字符串转对象
+	if (target === 'object') {
+		// 去除字符串样式中的两端空格(中间的空格不能去掉,比如padding: 20px 0如果去掉了就错了),空格是无用的
+		customStyle = trim(customStyle)
+		// 根据";"将字符串转为数组形式
+		const styleArray = customStyle.split(';')
+		const style = {}
+		// 历遍数组,拼接成对象
+		for (let i = 0; i < styleArray.length; i++) {
+			// 'font-size:20px;color:red;',如此最后字符串有";"的话,会导致styleArray最后一个元素为空字符串,这里需要过滤
+			if (styleArray[i]) {
+				const item = styleArray[i].split(':')
+				style[trim(item[0])] = trim(item[1])
+			}
+		}
+		return style
+	}
+	// 这里为对象转字符串形式
+	let string = ''
+	for (const i in customStyle) {
+		// 驼峰转为中划线的形式,否则css内联样式,无法识别驼峰样式属性名
+		const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()
+		string += `${key}:${customStyle[i]};`
+	}
+	// 去除两端空格
+	return trim(string)
+}
+
+/**
+ * @description 添加单位,如果有rpx,upx,%,px等单位结尾或者值为auto,直接返回,否则加上px单位结尾
+ * @param {string|number} value 需要添加单位的值
+ * @param {string} unit 添加的单位名 比如px
+ */
+function addUnit(value = 'auto', unit = uni?.$uv?.config?.unit ? uni?.$uv?.config?.unit : 'px') {
+	value = String(value)
+	// 用uvui内置验证规则中的number判断是否为数值
+	return number(value) ? `${value}${unit}` : value
+}
+
+/**
+ * @description 深度克隆
+ * @param {object} obj 需要深度克隆的对象
+ * @param cache 缓存
+ * @returns {*} 克隆后的对象或者原值(不是对象)
+ */
+function deepClone(obj, cache = new WeakMap()) {
+	if (obj === null || typeof obj !== 'object') return obj;
+	if (cache.has(obj)) return cache.get(obj);
+	let clone;
+	if (obj instanceof Date) {
+		clone = new Date(obj.getTime());
+	} else if (obj instanceof RegExp) {
+		clone = new RegExp(obj);
+	} else if (obj instanceof Map) {
+		clone = new Map(Array.from(obj, ([key, value]) => [key, deepClone(value, cache)]));
+	} else if (obj instanceof Set) {
+		clone = new Set(Array.from(obj, value => deepClone(value, cache)));
+	} else if (Array.isArray(obj)) {
+		clone = obj.map(value => deepClone(value, cache));
+	} else if (Object.prototype.toString.call(obj) === '[object Object]') {
+		clone = Object.create(Object.getPrototypeOf(obj));
+		cache.set(obj, clone);
+		for (const [key, value] of Object.entries(obj)) {
+			clone[key] = deepClone(value, cache);
+		}
+	} else {
+		clone = Object.assign({}, obj);
+	}
+	cache.set(obj, clone);
+	return clone;
+}
+
+/**
+ * @description JS对象深度合并
+ * @param {object} target 需要拷贝的对象
+ * @param {object} source 拷贝的来源对象
+ * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)
+ */
+function deepMerge(target = {}, source = {}) {
+	target = deepClone(target)
+	if (typeof target !== 'object' || target === null || typeof source !== 'object' || source === null) return target;
+	const merged = Array.isArray(target) ? target.slice() : Object.assign({}, target);
+	for (const prop in source) {
+		if (!source.hasOwnProperty(prop)) continue;
+		const sourceValue = source[prop];
+		const targetValue = merged[prop];
+		if (sourceValue instanceof Date) {
+			merged[prop] = new Date(sourceValue);
+		} else if (sourceValue instanceof RegExp) {
+			merged[prop] = new RegExp(sourceValue);
+		} else if (sourceValue instanceof Map) {
+			merged[prop] = new Map(sourceValue);
+		} else if (sourceValue instanceof Set) {
+			merged[prop] = new Set(sourceValue);
+		} else if (typeof sourceValue === 'object' && sourceValue !== null) {
+			merged[prop] = deepMerge(targetValue, sourceValue);
+		} else {
+			merged[prop] = sourceValue;
+		}
+	}
+	return merged;
+}
+
+/**
+ * @description error提示
+ * @param {*} err 错误内容
+ */
+function error(err) {
+	// 开发环境才提示,生产环境不会提示
+	if (process.env.NODE_ENV === 'development') {
+		console.error(`uvui提示:${err}`)
+	}
+}
+
+/**
+ * @description 打乱数组
+ * @param {array} array 需要打乱的数组
+ * @returns {array} 打乱后的数组
+ */
+function randomArray(array = []) {
+	// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0
+	return array.sort(() => Math.random() - 0.5)
+}
+
+// padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序
+// 所以这里做一个兼容polyfill的兼容处理
+if (!String.prototype.padStart) {
+	// 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解
+	String.prototype.padStart = function(maxLength, fillString = ' ') {
+		if (Object.prototype.toString.call(fillString) !== '[object String]') {
+			throw new TypeError(
+				'fillString must be String'
+			)
+		}
+		const str = this
+		// 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉
+		if (str.length >= maxLength) return String(str)
+
+		const fillLength = maxLength - str.length
+		let times = Math.ceil(fillLength / fillString.length)
+		while (times >>= 1) {
+			fillString += fillString
+			if (times === 1) {
+				fillString += fillString
+			}
+		}
+		return fillString.slice(0, fillLength) + str
+	}
+}
+
+/**
+ * @description 格式化时间
+ * @param {String|Number} dateTime 需要格式化的时间戳
+ * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd
+ * @returns {string} 返回格式化后的字符串
+ */
+function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {
+	let date
+	// 若传入时间为假值,则取当前时间
+	if (!dateTime) {
+		date = new Date()
+	}
+	// 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容)
+	else if (/^\d{10}$/.test(dateTime?.toString().trim())) {
+		date = new Date(dateTime * 1000)
+	}
+	// 若用户传入字符串格式时间戳,new Date无法解析,需做兼容
+	else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) {
+		date = new Date(Number(dateTime))
+	}
+	// 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间
+	// 处理 '2022-07-10 01:02:03',跳过 '2022-07-10T01:02:03'
+	else if (typeof dateTime === 'string' && dateTime.includes('-') && !dateTime.includes('T')) {
+		date = new Date(dateTime.replace(/-/g, '/'))
+	}
+	// 其他都认为符合 RFC 2822 规范
+	else {
+		date = new Date(dateTime)
+	}
+
+	const timeSource = {
+		'y': date.getFullYear().toString(), // 年
+		'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月
+		'd': date.getDate().toString().padStart(2, '0'), // 日
+		'h': date.getHours().toString().padStart(2, '0'), // 时
+		'M': date.getMinutes().toString().padStart(2, '0'), // 分
+		's': date.getSeconds().toString().padStart(2, '0') // 秒
+		// 有其他格式化字符需求可以继续添加,必须转化成字符串
+	}
+
+	for (const key in timeSource) {
+		const [ret] = new RegExp(`${key}+`).exec(formatStr) || []
+		if (ret) {
+			// 年可能只需展示两位
+			const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0
+			formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))
+		}
+	}
+
+	return formatStr
+}
+
+/**
+ * @description 时间戳转为多久之前
+ * @param {String|Number} timestamp 时间戳
+ * @param {String|Boolean} format
+ * 格式化规则如果为时间格式字符串,超出一定时间范围,返回固定的时间格式;
+ * 如果为布尔值false,无论什么时间,都返回多久以前的格式
+ * @returns {string} 转化后的内容
+ */
+function timeFrom(timestamp = null, format = 'yyyy-mm-dd') {
+	if (timestamp == null) timestamp = Number(new Date())
+	timestamp = parseInt(timestamp)
+	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
+	if (timestamp.toString().length == 10) timestamp *= 1000
+	let timer = (new Date()).getTime() - timestamp
+	timer = parseInt(timer / 1000)
+	// 如果小于5分钟,则返回"刚刚",其他以此类推
+	let tips = ''
+	switch (true) {
+		case timer < 300:
+			tips = '刚刚'
+			break
+		case timer >= 300 && timer < 3600:
+			tips = `${parseInt(timer / 60)}分钟前`
+			break
+		case timer >= 3600 && timer < 86400:
+			tips = `${parseInt(timer / 3600)}小时前`
+			break
+		case timer >= 86400 && timer < 2592000:
+			tips = `${parseInt(timer / 86400)}天前`
+			break
+		default:
+			// 如果format为false,则无论什么时间戳,都显示xx之前
+			if (format === false) {
+				if (timer >= 2592000 && timer < 365 * 86400) {
+					tips = `${parseInt(timer / (86400 * 30))}个月前`
+				} else {
+					tips = `${parseInt(timer / (86400 * 365))}年前`
+				}
+			} else {
+				tips = timeFormat(timestamp, format)
+			}
+	}
+	return tips
+}
+
+/**
+ * @description 去除空格
+ * @param String str 需要去除空格的字符串
+ * @param String pos both(左右)|left|right|all 默认both
+ */
+function trim(str, pos = 'both') {
+	str = String(str)
+	if (pos == 'both') {
+		return str.replace(/^\s+|\s+$/g, '')
+	}
+	if (pos == 'left') {
+		return str.replace(/^\s*/, '')
+	}
+	if (pos == 'right') {
+		return str.replace(/(\s*$)/g, '')
+	}
+	if (pos == 'all') {
+		return str.replace(/\s+/g, '')
+	}
+	return str
+}
+
+/**
+ * @description 对象转url参数
+ * @param {object} data,对象
+ * @param {Boolean} isPrefix,是否自动加上"?"
+ * @param {string} arrayFormat 规则 indices|brackets|repeat|comma
+ */
+function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {
+	const prefix = isPrefix ? '?' : ''
+	const _result = []
+	if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'
+	for (const key in data) {
+		const value = data[key]
+		// 去掉为空的参数
+		if (['', undefined, null].indexOf(value) >= 0) {
+			continue
+		}
+		// 如果值为数组,另行处理
+		if (value.constructor === Array) {
+			// e.g. {ids: [1, 2, 3]}
+			switch (arrayFormat) {
+				case 'indices':
+					// 结果: ids[0]=1&ids[1]=2&ids[2]=3
+					for (let i = 0; i < value.length; i++) {
+						_result.push(`${key}[${i}]=${value[i]}`)
+					}
+					break
+				case 'brackets':
+					// 结果: ids[]=1&ids[]=2&ids[]=3
+					value.forEach((_value) => {
+						_result.push(`${key}[]=${_value}`)
+					})
+					break
+				case 'repeat':
+					// 结果: ids=1&ids=2&ids=3
+					value.forEach((_value) => {
+						_result.push(`${key}=${_value}`)
+					})
+					break
+				case 'comma':
+					// 结果: ids=1,2,3
+					let commaStr = ''
+					value.forEach((_value) => {
+						commaStr += (commaStr ? ',' : '') + _value
+					})
+					_result.push(`${key}=${commaStr}`)
+					break
+				default:
+					value.forEach((_value) => {
+						_result.push(`${key}[]=${_value}`)
+					})
+			}
+		} else {
+			_result.push(`${key}=${value}`)
+		}
+	}
+	return _result.length ? prefix + _result.join('&') : ''
+}
+
+/**
+ * 显示消息提示框
+ * @param {String} title 提示的内容,长度与 icon 取值有关。
+ * @param {Number} duration 提示的延迟时间,单位毫秒,默认:2000
+ */
+function toast(title, duration = 2000) {
+	uni.showToast({
+		title: String(title),
+		icon: 'none',
+		duration
+	})
+}
+
+/**
+ * @description 根据主题type值,获取对应的图标
+ * @param {String} type 主题名称,primary|info|error|warning|success
+ * @param {boolean} fill 是否使用fill填充实体的图标
+ */
+function type2icon(type = 'success', fill = false) {
+	// 如果非预置值,默认为success
+	if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'
+	let iconName = ''
+	// 目前(2019-12-12),info和primary使用同一个图标
+	switch (type) {
+		case 'primary':
+			iconName = 'info-circle'
+			break
+		case 'info':
+			iconName = 'info-circle'
+			break
+		case 'error':
+			iconName = 'close-circle'
+			break
+		case 'warning':
+			iconName = 'error-circle'
+			break
+		case 'success':
+			iconName = 'checkmark-circle'
+			break
+		default:
+			iconName = 'checkmark-circle'
+	}
+	// 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的
+	if (fill) iconName += '-fill'
+	return iconName
+}
+
+/**
+ * @description 数字格式化
+ * @param {number|string} number 要格式化的数字
+ * @param {number} decimals 保留几位小数
+ * @param {string} decimalPoint 小数点符号
+ * @param {string} thousandsSeparator 千分位符号
+ * @returns {string} 格式化后的数字
+ */
+function priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') {
+	number = (`${number}`).replace(/[^0-9+-Ee.]/g, '')
+	const n = !isFinite(+number) ? 0 : +number
+	const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
+	const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator
+	const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint
+	let s = ''
+
+	s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')
+	const re = /(-?\d+)(\d{3})/
+	while (re.test(s[0])) {
+		s[0] = s[0].replace(re, `$1${sep}$2`)
+	}
+
+	if ((s[1] || '').length < prec) {
+		s[1] = s[1] || ''
+		s[1] += new Array(prec - s[1].length + 1).join('0')
+	}
+	return s.join(dec)
+}
+
+/**
+ * @description 获取duration值
+ * 如果带有ms或者s直接返回,如果大于一定值,认为是ms单位,小于一定值,认为是s单位
+ * 比如以30位阈值,那么300大于30,可以理解为用户想要的是300ms,而不是想花300s去执行一个动画
+ * @param {String|number} value 比如: "1s"|"100ms"|1|100
+ * @param {boolean} unit  提示: 如果是false 默认返回number
+ * @return {string|number}
+ */
+function getDuration(value, unit = true) {
+	const valueNum = parseInt(value)
+	if (unit) {
+		if (/s$/.test(value)) return value
+		return value > 30 ? `${value}ms` : `${value}s`
+	}
+	if (/ms$/.test(value)) return valueNum
+	if (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000
+	return valueNum
+}
+
+/**
+ * @description 日期的月或日补零操作
+ * @param {String} value 需要补零的值
+ */
+function padZero(value) {
+	return `00${value}`.slice(-2)
+}
+
+/**
+ * @description 在uv-form的子组件内容发生变化,或者失去焦点时,尝试通知uv-form执行校验方法
+ * @param {*} instance
+ * @param {*} event
+ */
+function formValidate(instance, event) {
+	const formItem = $parent.call(instance, 'uv-form-item')
+	const form = $parent.call(instance, 'uv-form')
+	// 如果发生变化的input或者textarea等,其父组件中有uv-form-item或者uv-form等,就执行form的validate方法
+	// 同时将form-item的pros传递给form,让其进行精确对象验证
+	if (formItem && form) {
+		form.validateField(formItem.prop, () => {}, event)
+	}
+}
+
+/**
+ * @description 获取某个对象下的属性,用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式
+ * @param {object} obj 对象
+ * @param {string} key 需要获取的属性字段
+ * @returns {*}
+ */
+function getProperty(obj, key) {
+	if (!obj) {
+		return
+	}
+	if (typeof key !== 'string' || key === '') {
+		return ''
+	}
+	if (key.indexOf('.') !== -1) {
+		const keys = key.split('.')
+		let firstObj = obj[keys[0]] || {}
+
+		for (let i = 1; i < keys.length; i++) {
+			if (firstObj) {
+				firstObj = firstObj[keys[i]]
+			}
+		}
+		return firstObj
+	}
+	return obj[key]
+}
+
+/**
+ * @description 设置对象的属性值,如果'a.b.c'的形式进行设置
+ * @param {object} obj 对象
+ * @param {string} key 需要设置的属性
+ * @param {string} value 设置的值
+ */
+function setProperty(obj, key, value) {
+	if (!obj) {
+		return
+	}
+	// 递归赋值
+	const inFn = function(_obj, keys, v) {
+		// 最后一个属性key
+		if (keys.length === 1) {
+			_obj[keys[0]] = v
+			return
+		}
+		// 0~length-1个key
+		while (keys.length > 1) {
+			const k = keys[0]
+			if (!_obj[k] || (typeof _obj[k] !== 'object')) {
+				_obj[k] = {}
+			}
+			const key = keys.shift()
+			// 自调用判断是否存在属性,不存在则自动创建对象
+			inFn(_obj[k], keys, v)
+		}
+	}
+
+	if (typeof key !== 'string' || key === '') {
+
+	} else if (key.indexOf('.') !== -1) { // 支持多层级赋值操作
+		const keys = key.split('.')
+		inFn(obj, keys, value)
+	} else {
+		obj[key] = value
+	}
+}
+
+/**
+ * @description 获取当前页面路径
+ */
+function page() {
+	const pages = getCurrentPages();
+	const route = pages[pages.length - 1]?.route;
+	// 某些特殊情况下(比如页面进行redirectTo时的一些时机),pages可能为空数组
+	return `/${route ? route : ''}`
+}
+
+/**
+ * @description 获取当前路由栈实例数组
+ */
+function pages() {
+	const pages = getCurrentPages()
+	return pages
+}
+
+/**
+ * 获取页面历史栈指定层实例
+ * @param back {number} [0] - 0或者负数,表示获取历史栈的哪一层,0表示获取当前页面实例,-1 表示获取上一个页面实例。默认0。
+ */
+function getHistoryPage(back = 0) {
+	const pages = getCurrentPages()
+	const len = pages.length
+	return pages[len - 1 + back]
+}
+
+
+
+/**
+ * @description 修改uvui内置属性值
+ * @param {object} props 修改内置props属性
+ * @param {object} config 修改内置config属性
+ * @param {object} color 修改内置color属性
+ * @param {object} zIndex 修改内置zIndex属性
+ */
+function setConfig({
+	props = {},
+	config = {},
+	color = {},
+	zIndex = {}
+}) {
+	const {
+		deepMerge,
+	} = uni.$uv
+	uni.$uv.config = deepMerge(uni.$uv.config, config)
+	uni.$uv.props = deepMerge(uni.$uv.props, props)
+	uni.$uv.color = deepMerge(uni.$uv.color, color)
+	uni.$uv.zIndex = deepMerge(uni.$uv.zIndex, zIndex)
+}
+
+export {
+	range,
+	getPx,
+	sleep,
+	os,
+	sys,
+	random,
+	guid,
+	$parent,
+	addStyle,
+	addUnit,
+	deepClone,
+	deepMerge,
+	error,
+	randomArray,
+	timeFormat,
+	timeFrom,
+	trim,
+	queryParams,
+	toast,
+	type2icon,
+	priceFormat,
+	getDuration,
+	padZero,
+	formValidate,
+	getProperty,
+	setProperty,
+	page,
+	pages,
+	getHistoryPage,
+	setConfig
+}

+ 75 - 0
uni_modules/uv-ui-tools/libs/function/platform.js

@@ -0,0 +1,75 @@
+/**
+ * 注意:
+ * 此部分内容,在vue-cli模式下,需要在vue.config.js加入如下内容才有效:
+ * module.exports = {
+ *     transpileDependencies: ['uview-v2']
+ * }
+ */
+
+let platform = 'none'
+
+// #ifdef VUE3
+platform = 'vue3'
+// #endif
+
+// #ifdef VUE2
+platform = 'vue2'
+// #endif
+
+// #ifdef APP-PLUS
+platform = 'plus'
+// #endif
+
+// #ifdef APP-NVUE
+platform = 'nvue'
+// #endif
+
+// #ifdef H5
+platform = 'h5'
+// #endif
+
+// #ifdef MP-WEIXIN
+platform = 'weixin'
+// #endif
+
+// #ifdef MP-ALIPAY
+platform = 'alipay'
+// #endif
+
+// #ifdef MP-BAIDU
+platform = 'baidu'
+// #endif
+
+// #ifdef MP-TOUTIAO
+platform = 'toutiao'
+// #endif
+
+// #ifdef MP-QQ
+platform = 'qq'
+// #endif
+
+// #ifdef MP-KUAISHOU
+platform = 'kuaishou'
+// #endif
+
+// #ifdef MP-360
+platform = '360'
+// #endif
+
+// #ifdef MP
+platform = 'mp'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW
+platform = 'quickapp-webview'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-HUAWEI
+platform = 'quickapp-webview-huawei'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-UNION
+platform = 'quckapp-webview-union'
+// #endif
+
+export default platform

部分文件因文件數量過多而無法顯示