Fly 2 years ago
parent
commit
aa3838e359

+ 81 - 0
api/index.js

@@ -0,0 +1,81 @@
+import {
+	axios
+} from '@/utils/request.js'
+
+ 
+
+// 发送邮箱验证码
+export function Api_getEmailCode(data) {
+	return axios.post(`/api/sms_mail` , data )
+}
+
+// 登陆页- 登陆
+export function Api_userLogin(data) {
+	return axios.post(`/api/user/login` , data )
+}
+
+// 获得个人信息
+export function Api_getUserInfo() {
+	return axios.get(`/api/user/info` )
+}
+
+//  轮播图/公告列表/新闻列表
+export function Api_getNewsList(data) {
+	return axios.post(`/api/news/list` , data )
+}
+
+
+// // 根据手机号登录
+// export function goAuthLogin_Api(data) {
+// 	return axios.post(`/auth/c/doMiniLoginByPhone` , data )
+// }
+
+// // 小程序根据用户(企业)ID登录
+// export function goEnterpriseId_Api(data) {
+// 	return axios.post(`/auth/c/doMiniLoginById` , data)
+// }
+
+// // 获取手机号
+// export function getWxPhone_Api(data) {
+// 	return axios.post(`/auth/c/getWxPhone` , data )
+// }
+
+// // 根据扫描发票返回信息获取发票信息
+// export function getCodeInvoice_Api(data) {
+// 	return axios.post(`/biz/c/get/invoice/info` , data )
+// }
+
+// // 获取发票信息表分页
+// export function getInvoicePage_Api(data) {
+// 	return axios.get(`/biz/c/invoice/page` , data )
+// }
+
+// // 确定录入
+// export function confirmEntry_Api(data) {
+// 	return axios.post(`/biz/c/confirm/entry` , data )
+// }
+// // 获取发票信息表详情
+// export function getInvoiceDetail_Api(data) {
+// 	return axios.get(`/biz/c/invoice/detail` , data )
+// }
+
+// // 删除发票
+// export function delInvoice_Api(data) {
+// 	return axios.post(`/biz/c/invoice/delete` , data )
+// }
+
+// // 发票导出
+// export function exportInvoice_Api(data) {
+// 	return axios.get(`/biz/c/invoice/export` , data , {responseType: 'arraybuffer', Blob : true} )
+// }
+
+// // 获取C端用户详情
+// export function getUserDetail_Api(data) {
+// 	return axios.get(`/client/c/user/detail` , data)
+// }
+
+
+// //更新用户信息
+// export function setUserInfo_Api(data) {
+// 	return axios.post(`/client/c/update/user` , data)
+// }

+ 14 - 8
components/carousels/carousels.vue

@@ -1,18 +1,16 @@
 <template>
 	<view class="swiper-content">
-	<!-- 	<uni-swiper-dot :info="info" :current="current" field="content" :mode="mode">
-		
-	</uni-swiper-dot> -->
 		<swiper class="swiper-box" autoplay :interval="3000" circular @change="change">
-			<swiper-item v-for="(item ,index) in info" :key="index">
+			<swiper-item v-for="(item ,index) in BannerList" :key="index">
 				<view class="swiper-item">
-					<image src="../../static/banner.png" mode="aspectFit"></image>
+					<image :src="item.thumbnail" mode="aspectFit"></image>
 				</view>
 			</swiper-item>
 		</swiper>
 		<div class="custom-indicator">
 			<span :class="['indicator' , current === index ? 'active-indicator' : '']"
-				v-for="(item , index) in info"></span>
+				v-for="(item , index) in BannerList">
+			</span>
 		</div>
 	</view>
 </template>
@@ -20,6 +18,12 @@
 <script>
 	export default {
 		name: "carousels",
+		props: {
+			BannerList: {
+				type: Array,
+				default: () => []
+			}
+		},
 		data() {
 			return {
 				info: [{
@@ -42,10 +46,11 @@
 </script>
 
 <style lang="scss" scoped>
-	.swiper-content{
+	.swiper-content {
 		background-color: $modules-box-bg;
 		padding: 0 $pages-padding;
 	}
+
 	.swiper-box {
 
 		.swiper-item {
@@ -77,7 +82,8 @@
 			background-color: #d9d9d9;
 			transform: rotate(45deg);
 		}
-		.indicator + .indicator{
+
+		.indicator+.indicator {
 			margin-left: 20rpx;
 		}
 

+ 13 - 3
components/headModules/login.vue

@@ -3,23 +3,33 @@
 		<view class="head-icon">
 			<image src="../../static/images/logo.png" mode="aspectFit"></image>
 		</view>
-		<view v-if="!userInfo" class="no-login">
+		<view v-if="!token" class="no-login">
 			登录/注册
 		</view>
 	</view>
 </template>
 
 <script>
+	import {
+		mapGetters
+	} from 'vuex'
+	// token
 	export default {
 		name: 'loginComponents',
 		data() {
 			return {
-				userInfo: true
+				userInfo: false
 			};
 		},
+
+		computed: {
+			...mapGetters([
+				'token'
+			]),
+		},
 		methods: {
 			getUserInfo() {
-				if (this.userInfo) {
+				if (this.token) {
 					uni.navigateTo({
 						url: '/pages/content/mine'
 					});

+ 377 - 0
components/slider-verify/slider-verify.vue

@@ -0,0 +1,377 @@
+<template>
+	<uni-popup ref="popupRef">
+
+		<view class="popup-box">
+			<view class="verifyBox">
+				<view class="verify-title">
+					<text>安全验证</text>
+					<text class="verify-close iconfont">&#xe605;</text>
+				</view>
+				<view class="verify-hint">
+					滑动下方滑块完成拼图
+				</view>
+				<view class="slide-content">
+
+					<view class="slider-pintu">
+						<image id="pintuImg" src="@/static/logo.png" class="pintu">
+						</image>
+						<!-- 	<image id="pintuImg" :src="'@/static/images/slider-verify/' + img + '.png'" class="pintu">
+						</image> -->
+						<view class="pintukuai" :style="{ top: top + 'px', left: oldx + 'px' }">
+							<image src="@/static/logo.png" :style="{ top: '-' + top + 'px', left: '-' + left + 'px'}">
+							</image>
+						</view>
+
+						<view class="yinying" :style="{ top: top + 'px', left: left + 'px' }"></view>
+
+						<view class="slider-success" v-show="moveSuccess">
+							<text class="slider-success-icon iconfont">&#xe627;</text>
+							<text class="slider-success-text">只用了{{ moveTime }}S,简直比闪电还快</text>
+						</view>
+
+					</view>
+
+					<view class="slider-movearea" @touchend="endTouchMove">
+						<movable-area :animation="true">
+							<movable-view :x="x" direction="horizontal" @change="startMove">
+								<text class="movable-item"></text>
+								<text class="movable-item"></text>
+								<text class="movable-item"></text>
+							</movable-view>
+						</movable-area>
+
+						<view class="huadao"></view>
+					</view>
+				</view>
+
+				<view class="slider-btn-group">
+					<text class="slider-err"> {{ sliderErrText }} </text>
+					<view class="slide-btn-refresh iconfont" @tap="refreshVerify">&#xec08;</view>
+				</view>
+			</view>
+
+		</view>
+	</uni-popup>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				x: 0, //初始距离
+				oldx: 0, //移动的距离
+				img: 'logo', //显示哪张图片
+				left: 0, //随机拼图的最终X轴距离
+				top: 0, //拼图的top距离
+				moveTime: 0,
+				moveInterval: null,
+				moveSuccess: false,
+				sliderErrText: '',
+			};
+		},
+		mounted() {
+		 
+			var that = this;
+			that.refreshVerify();
+		},
+		methods: {
+			open() {
+				this.$nextTick(() => {
+					this.$refs.popupRef.open();
+				})
+			},
+			//刷新验证
+			refreshVerify() {
+				this.clearMoveTime()
+				var gl = Math.random().toFixed(2);
+				const leftNum = uni.upx2px(560) * gl > uni.upx2px(280) ? uni.upx2px(280) : uni.upx2px(560) * gl + uni.upx2px(
+					150); //生成随机X轴最终距离
+				this.top = uni.upx2px(190) * gl; //生成随机Y轴初始距离 
+				const maxLeft = uni.upx2px(560) - uni.upx2px(90) - uni.upx2px(70)
+				this.left = leftNum > maxLeft ? maxLeft : leftNum
+
+
+				if (gl <= 0.2) {
+					this.img = 1;
+				}
+				if (gl > 0.2 && gl <= 0.4) {
+					this.img = 2;
+				}
+				if (gl > 0.4 && gl <= 0.6) {
+					this.img = 3;
+				}
+				if (gl > 0.6 && gl <= 0.8) {
+					this.img = 4;
+				}
+				if (gl > 0.8 && gl <= 1) {
+					this.img = 5;
+				}
+				this.resetMove(); //重置阴影位置
+			},
+
+			/* 滑动中 */
+			startMove(e) {
+				if (e.detail.source) {
+					this.setMoveTime();
+					const maxNum = uni.upx2px(560) - uni.upx2px(70)
+					if (e.detail.x <= maxNum) {
+						this.oldx = e.detail.x;
+					}
+				};
+				
+			},
+
+			setMoveTime(clear = false) {
+				if (!this.moveInterval) {
+					this.moveTime = 0;
+					this.moveInterval = setInterval(() => {
+						this.moveTime = Math.floor((this.moveTime + 0.1) * 100) / 100;
+						console.log('this.moveTime = ', this.moveTime)
+					}, 100)
+				}
+				if (clear) {
+					try {
+						setTimeout(() => {
+							clearInterval(this.moveInterval)
+							this.moveInterval = null;
+						}, 100)
+						console.log('this.moveInterval 1= ', this.moveInterval)
+
+						console.log('this.moveInterval 2= ', this.moveInterval)
+					} catch {}
+				}
+
+
+			},
+			clearMoveTime() {
+				this.setMoveTime(true)
+
+			},
+			/* 滑动结束 */
+			endTouchMove() {
+				var that = this;
+				this.clearMoveTime()
+				if (Math.abs(that.oldx - that.left) <= 5) {
+					// uni.showToast({
+					// 	title: '验证成功',
+					// 	duration: 2500,
+					// 	success() {
+					// 		that.$emit('touchSliderResult', true);
+					// 	}
+					// });
+					this.moveSuccess = true;
+					setTimeout(() => {
+						this.$emit('slideImgSuccess')
+					},1000)
+				} else {
+					this.sliderErrText = '请控制拼图对齐切口'
+					setTimeout(() => {
+						this.sliderErrText = ''
+						that.refreshVerify();
+					}, 1000)
+				}
+			},
+
+			/* 重置阴影位置 */
+			resetMove() {
+				this.x = 1;
+				this.oldx = 1;
+				setTimeout(() => {
+					this.x = 0;
+					this.oldx = 0;
+				}, 300);
+			},
+
+			// 关闭
+			closeSlider() {
+				this.$emit('touchSliderResult', false);
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	$imgSize: 70rpx;
+
+	.verifyBox {
+		// position: absolute;
+		// top: 50%;
+		// left: 50%;
+		// transform: translate(-50%, -50%);
+		// width: 560rpx;
+		background-color: #fff;
+		border-radius: 4rpx;
+		padding: 5px;
+
+		// box-shadow: 0 0 5upx rgba(0, 0, 0);
+		.verify-title {
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			font-size: 20rpx;
+			color: #ccc;
+
+			.verify-close {
+				font-size: 40rpx;
+				color: #666;
+			}
+		}
+
+		.verify-hint {
+			font-size: 28rpx;
+		}
+
+		.slide-content {
+			width: 100%;
+
+			padding: 5px 0;
+			margin: 0 auto;
+
+			.slide-tips {
+				font-size: 28rpx;
+				color: rgba(2, 20, 33, 0.45);
+				padding: 0.5em 0;
+			}
+
+			.slider-pintu {
+				position: relative;
+				width: 100%;
+				border-radius: 10rpx;
+				overflow: hidden;
+
+				.pintu {
+					width: 560rpx;
+					height: 300rpx;
+					display: block;
+					margin: 0 auto;
+				}
+
+				.pintukuai {
+					position: absolute;
+					top: 0;
+					left: 0;
+					width: $imgSize;
+					height: $imgSize;
+					z-index: 100;
+					box-shadow: 0 0 5upx rgba(0, 0, 0, 0.3);
+					overflow: hidden;
+
+					image {
+						display: block;
+						position: absolute;
+						top: 0;
+						left: 0;
+						width: 560rpx;
+						height: 300rpx;
+					}
+				}
+			}
+
+			.yinying {
+				position: absolute;
+				width: $imgSize;
+				height: $imgSize;
+				background-color: rgba(0, 0, 0, 0.5);
+			}
+
+			// <view class="slider-success">
+			// 	<text class="slider-success-icon">&#xe627;</text>
+			// 	<text class="slider-success-text">只用了2S,</text>
+			// </view>
+			.slider-success {
+				width: 100%;
+				height: 100%;
+				position: absolute;
+				z-index: 101;
+				left: 0;
+				top: 0;
+				background-color: rgba(255, 255, 255, 0.8);
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				flex-direction: column;
+
+				.slider-success-icon {
+					font-size: 80rpx;
+					color: $Theme-Color;
+				}
+
+				.slider-success-text {
+					padding-top: 20rpx;
+					font-size: 26rpx;
+					color: $Theme-Color;
+				}
+			}
+
+		}
+	}
+
+	.slider-movearea {
+		position: relative;
+		height: 50rpx;
+		width: 100%;
+		margin: 18rpx auto;
+
+		movable-area {
+			height: 50rpx;
+			width: calc(100% - 90rpx);
+
+			movable-view {
+				width: 90rpx;
+				height: 50rpx;
+				border-radius: 25rpx;
+				background-color: #007cff;
+				position: relative;
+				z-index: 100;
+				box-shadow: 0px 0px 10px -1px #007cff;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+
+				.movable-item {
+					width: 3rpx;
+					height: 20rpx;
+					background-color: #fff;
+					margin-right: 4px;
+
+					&:last-child {
+						margin-right: 0;
+					}
+				}
+			}
+		}
+	}
+
+	.huadao {
+		width: 100%;
+		height: 22rpx;
+		background: #c2c2c2;
+		box-shadow: inset 0 0 5upx #ccc;
+		border-radius: 40rpx;
+
+		position: absolute;
+		top: 50%;
+		left: 0;
+		transform: translateY(-50%);
+		font-size: 28rpx;
+		z-index: 99;
+	}
+
+	.slider-btn-group {
+		width: 100%;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		.slider-err {
+			font-size: 24rpx;
+			color: red;
+		}
+
+		.slide-btn-refresh {
+			font-size: 40rpx;
+			color: #c1c1c1;
+		}
+	}
+</style>

+ 88 - 71
manifest.json

@@ -1,72 +1,89 @@
 {
-    "name" : "币王",
-    "appid" : "__UNI__053A230",
-    "description" : "",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
-    /* 5+App特有相关 */
-    "app-plus" : {
-        "usingComponents" : true,
-        "nvueStyleCompiler" : "uni-app",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
-        },
-        /* 模块配置 */
-        "modules" : {},
-        /* 应用发布信息 */
-        "distribute" : {
-            /* android打包配置 */
-            "android" : {
-                "permissions" : [
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
-            },
-            /* ios打包配置 */
-            "ios" : {},
-            /* SDK配置 */
-            "sdkConfigs" : {}
-        }
-    },
-    /* 快应用特有相关 */
-    "quickapp" : {},
-    /* 小程序特有相关 */
-    "mp-weixin" : {
-        "appid" : "",
-        "setting" : {
-            "urlCheck" : false
-        },
-        "usingComponents" : true
-    },
-    "mp-alipay" : {
-        "usingComponents" : true
-    },
-    "mp-baidu" : {
-        "usingComponents" : true
-    },
-    "mp-toutiao" : {
-        "usingComponents" : true
-    },
-    "uniStatistics" : {
-        "enable" : false
-    },
-    "vueVersion" : "2"
-}
+	"name": "币王",
+	"appid": "__UNI__053A230",
+	"description": "",
+	"versionName": "1.0.0",
+	"versionCode": "100",
+	"transformPx": false,
+	/* 5+App特有相关 */
+	"app-plus": {
+		"usingComponents": true,
+		"nvueStyleCompiler": "uni-app",
+		"compilerVersion": 3,
+		"splashscreen": {
+			"alwaysShowBeforeRender": true,
+			"waiting": true,
+			"autoclose": true,
+			"delay": 0
+		},
+		/* 模块配置 */
+		"modules": {},
+		/* 应用发布信息 */
+		"distribute": {
+			/* android打包配置 */
+			"android": {
+				"permissions": [
+					"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+					"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
+					"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+					"<uses-feature android:name=\"android.hardware.camera\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+				]
+			},
+			/* ios打包配置 */
+			"ios": {},
+			/* SDK配置 */
+			"sdkConfigs": {}
+		}
+	},
+	/* 快应用特有相关 */
+	"quickapp": {},
+	/* 小程序特有相关 */
+	"mp-weixin": {
+		"appid": "",
+		"setting": {
+			"urlCheck": false
+		},
+		"usingComponents": true
+	},
+	"mp-alipay": {
+		"usingComponents": true
+	},
+	"mp-baidu": {
+		"usingComponents": true
+	},
+	"mp-toutiao": {
+		"usingComponents": true
+	},
+	// "h5": {
+	// 	"devServer": {
+	// 		// "port" : 8080, //浏览器运行端口
+	// 		"https": false,
+	// 		"proxy": {
+	// 			"/baseUrlTest": {
+	// 				"target": "https://doc.okenx.com",
+	// 				"changeOrigin": true,
+	// 				"secure": false,
+	// 				"pathRewrite": {
+	// 					"^": ""
+	// 				}
+	// 			}
+	// 		},
+	// 		"disableHostCheck":true
+	// 	}
+	// },
+	"uniStatistics": {
+		"enable": false
+	},
+	"vueVersion": "2"
+}

+ 23 - 1
pages.json

@@ -10,6 +10,18 @@
                 "navigationBarTitleText" : "币王"
             }
         },
+        {
+            "path" : "pages/login/register",
+            "style" : {
+                "navigationBarTitleText" : "注册"
+            }
+        },
+		{
+		    "path" : "pages/login/email-verify",
+		    "style" : {
+		        "navigationBarTitleText" : "邮箱验证"
+		    }
+		},
         {
             "path" : "pages/login/index",
             "style" : {
@@ -157,5 +169,15 @@
         "navigationBarBackgroundColor" : "#F8F8F8",
         "backgroundColor" : "#F8F8F8"
     },
-    "uniIdRouter" : {}
+    "uniIdRouter" : {},
+	"condition" : { //模式配置,仅开发期间生效
+		"current": 0, //当前激活的模式(list 的索引项)
+		"list": [
+			{
+				"name": "", //模式名称
+				"path": "pages/login/email-verify", //启动页面,必选
+				"query": "email=biking2023@163.com" //启动参数,在页面的onLoad函数里面得到
+			}
+		]
+	}
 }

+ 9 - 0
pages/content/mine.vue

@@ -164,6 +164,7 @@
 <script>
 	import reverseBack from "@/components/headModules/reverse-back.vue"
 	import pageStyle from "@/components/headModules/style.vue"
+	import { Api_getUserInfo } from "@/api/index.js"
 	export default {
 		components: {
 			pageStyle,
@@ -195,6 +196,9 @@
 				}]
 			};
 		},
+		onShow() {
+			this.getUserInfo()
+		},
 		methods:{
 			// 打开邀请
 			openShare(){
@@ -213,6 +217,11 @@
 				uni.navigateTo({
 					url:'/pages/content/safety-set'
 				})
+			},
+			getUserInfo(){
+				Api_getUserInfo().then(res => {
+					
+				})
 			}
 		}
 	}

+ 22 - 10
pages/index/index.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="content"  :rise-fall="stocksColor">
+	<view class="content" :rise-fall="stocksColor">
 		<!-- 头部 -->
 		<headContent>
 			<template #left>
@@ -17,7 +17,7 @@
 			</template>
 		</headContent>
 		<!-- 轮播图 -->
-		<carousels></carousels>
+		<carousels :BannerList="BannerList"></carousels>
 
 		<!-- 滚动消息 -->
 		<rollMessage></rollMessage>
@@ -37,7 +37,7 @@
 
 
 		<view style="width: 100%;height: 8rpx;"></view>
-		
+
 		<!-- 自选 / 市场 -->
 		<market></market>
 	</view>
@@ -51,10 +51,14 @@
 	import shortcut from "./modules/shortcut.vue"
 	import navMuen from "./modules/nav.vue"
 	import market from "./modules/market.vue"
-	
-		import {
-			mapGetters
-		} from 'vuex'
+
+	import {
+		Api_getNewsList
+	} from "@/api/index.js"
+
+	import {
+		mapGetters
+	} from 'vuex'
 	export default {
 		components: {
 			loginStatus,
@@ -67,7 +71,8 @@
 		},
 		data() {
 			return {
-				title: 'Hello'
+				title: 'Hello',
+				BannerList:[]
 			}
 		},
 		computed: {
@@ -76,10 +81,17 @@
 			]),
 		},
 		onLoad() {
-
+			this.getBanner()
 		},
 		methods: {
-
+			getBanner() {
+				Api_getNewsList({
+					cid: 5,
+					limit: 10
+				}).then(res => {
+					this.BannerList = res.list
+				})
+			}
 		}
 	}
 </script>

+ 174 - 0
pages/login/common.scss

@@ -0,0 +1,174 @@
+.head-revers-back{
+	font-size: 52rpx;
+	color: #000;
+}
+
+.page-content {
+		width: 100%;
+		padding: 30rpx 60rpx 0;
+
+		.login-title {
+			display: block;
+			font-size: 68rpx;
+			font-family: PingFang SC, PingFang SC-Bold;
+			font-weight: 700;
+			color: #333333;
+			line-height: 1.2;
+			letter-spacing: 0.96rpx;
+		}
+
+		.login-content {
+
+			display: block;
+			font-size: 28rpx;
+			font-family: PingFang SC, PingFang SC-Regular;
+			font-weight: 400;
+			color: #808080;
+			line-height: 1.2;
+			letter-spacing: 0.56rpx;
+			padding: 20rpx 0 40rpx;
+		}
+
+	}
+	
+	.tab-box{
+		padding-bottom: 44rpx;
+	}
+	
+	.tab {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		padding-top: 46rpx;
+
+		.tab-item {
+			font-size: 30rpx;
+			font-family: PingFang SC, PingFang SC-Bold;
+			font-weight: 700;
+			color: #1a1a1a;
+			line-height: 38rpx;
+			letter-spacing: 0.6rpx;
+
+			+.tab-item {
+				margin-left: 50rpx;
+			}
+		}
+
+		.active-tab-item {
+			color: $Theme-Color;
+			position: relative;
+
+			&::before {
+				position: absolute;
+				left: 0;
+				bottom: -11rpx;
+				content: '';
+				width: 100%;
+				height: 6rpx;
+				border-radius: 2rpx;
+				background-color: $Theme-Color;
+			}
+		}
+
+	}
+	
+	
+	.login-form{
+		width: 100%;
+		.form-item{
+			width: 100%;
+			height: 90rpx;
+			padding: 0 20rpx;
+			display: flex;
+			align-items: center;
+			background-color: $box-bg;
+			border-radius: 6rpx;
+			margin-top: 20rpx;
+			&:first-child{
+				margin-top: 0;
+			}
+			.form-lable{
+				width: 140rpx;
+				height: 100%;
+				font-size: 24rpx;
+				flex-wrap: 700;
+				display: flex;
+				align-items: center;
+				.form-lable-icon{
+					margin-left: 4px;
+					font-size: 18rpx;
+				}
+			}
+			.form-input{
+				flex: 1;
+				height: 100%;
+				font-size: 28rpx;
+			}
+			.form-input-place{
+				font-size: 28rpx;
+				color: #938989;
+			}
+		}
+		.form-agreement{
+			width: 100%;
+			display: flex;
+			align-items: center;
+			font-size: 26rpx;
+			color: #938989;
+			padding: 26rpx 0;
+			.agreement-confirm{
+				width: 30rpx;
+				height: 30rpx;
+				background-color: $box-bg;
+				margin-right: 10rpx;
+				border-radius: 6rpx;
+				.confirm-icon{
+					width: 100%;
+					height: 100%;
+				background-color: $Theme-Color;
+				color: #fff;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				font-size: 24rpx;
+				}
+			}
+			.agreement-name{
+				color: $Theme-Color;
+			}
+		}
+		
+		.form-btn{
+			width: 100%;
+			height:90rpx;
+			background-color: $Theme-Color;
+			border-radius: 8rpx;
+			text-align: center;
+			line-height: 90rpx;
+			color: #fff;
+			font-size: 32rpx;
+			font-weight: bold;
+		}
+		.form-hint{
+			width: 100%;
+			padding: 46rpx 0 0;
+			font-size: 26rpx;
+			text-align: center;
+			color: #ccc;
+			.hint-btn{
+				color: $Theme-Color;
+			}
+		}
+		
+	}
+	
+	.code-box{
+		width: 100%;
+		margin-top: 50rpx;
+		.code-hint{
+			margin-top: 50rpx;
+			font-size: 28rpx;
+			display: inline-block;
+			color: #666;
+		}
+	}

+ 69 - 0
pages/login/email-verify.vue

@@ -0,0 +1,69 @@
+<template>
+	<view>
+		<headContent>
+			<template #left>
+				<view class="head-revers-back iconfont" @click.stop="reversBackBtn()">&#xe604;</view>
+			</template>
+		</headContent>
+
+		<view class="page-content">
+			<text class="login-title">注册</text>
+			<text class="login-content">验证码已发送至{{email}}</text>
+
+			<view class="code-box">
+				<u-code-input v-model="emailCode" :maxlength="6" :focus="true"></u-code-input>
+				<view class="code-hint" @click.stop="resendCode()">重新发送</view>
+			</view>
+
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		Api_getEmailCode
+	} from "@/api/index.js"
+	import {
+		reverseBack
+	} from "@/utils/common.js"
+
+
+	export default {
+		name: 'emailVerify',
+
+		data() {
+			return {
+				email: '',
+				emailCode: ''
+			};
+		},
+		onLoad(opt) {
+			this.email = opt?.email;
+			this.getEmailCode()
+		},
+		methods: {
+			getEmailCode() {
+				Api_getEmailCode({
+					user_string: this.email
+				}).then(res => {
+
+				}).catch(err => {
+
+				})
+			},
+
+			reversBackBtn() {
+				reverseBack()
+			},
+			
+			resendCode(){
+				this.getEmailCode()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "~./common.scss"
+</style>

+ 8 - 73
pages/login/index.vue

@@ -3,14 +3,13 @@
 		<!-- 头部 -->
 		<headContent>
 			<template #left>
-				<view class="" @click.stop="reversBackBtn()">
-					<—— </view>
+				<view class="head-revers-back iconfont" @click.stop="reversBackBtn()">&#xe604;</view>
 			</template>
 		</headContent>
 
 		<view class="page-content">
 			<text class="login-title">登录</text>
-			<text class="login-content">立即注册属于您的BiKing账号</text>
+			<text class="login-content">Hi, 欢迎来到币王</text>
 
 			<view class="tab-box">
 				<view class="tab">
@@ -19,11 +18,11 @@
 						@click.stop="marketTabIndex = index">
 						{{ item }}
 					</view>
-					
+
 				</view>
 				<!-- <component :is="phoneLogin"/> -->
 			</view>
-				<phoneLogin />
+			<phoneLogin />
 		</view>
 
 
@@ -31,7 +30,9 @@
 </template>
 
 <script>
-	import { reverseBack } from "@/utils/common.js"
+	import {
+		reverseBack
+	} from "@/utils/common.js"
 	import phoneLogin from "./modules/phone.vue"
 	import mailboxLogin from "./modules/mailbox.vue"
 	export default {
@@ -62,71 +63,5 @@
 	}
 </style>
 <style lang="scss" scoped>
-	.page-content {
-		width: 100%;
-		padding: 110rpx 60rpx 0;
-
-		.login-title {
-			display: block;
-			font-size: 48rpx;
-			font-family: PingFang SC, PingFang SC-Bold;
-			font-weight: 700;
-			color: #333333;
-			line-height: 67rpx;
-			letter-spacing: 0.96rpx;
-		}
-
-		.login-content {
-
-			display: block;
-			font-size: 28rpx;
-			font-family: PingFang SC, PingFang SC-Regular;
-			font-weight: 400;
-			color: #808080;
-			line-height: 40rpx;
-			letter-spacing: 0.56rpx;
-		}
-
-	}
-	
-	.tab-box{
-		padding-bottom: 44rpx;
-	}
-	
-	.tab {
-		width: 100%;
-		display: flex;
-		align-items: center;
-		padding-top: 46rpx;
-
-		.tab-item {
-			font-size: 30rpx;
-			font-family: PingFang SC, PingFang SC-Bold;
-			font-weight: 700;
-			color: #1a1a1a;
-			line-height: 38rpx;
-			letter-spacing: 0.6rpx;
-
-			+.tab-item {
-				margin-left: 50rpx;
-			}
-		}
-
-		.active-tab-item {
-			color: #20B482;
-			position: relative;
-
-			&::before {
-				position: absolute;
-				left: 0;
-				bottom: -11rpx;
-				content: '';
-				width: 100%;
-				height: 4rpx;
-				border-radius: 2rpx;
-				background-color: #20B482;
-			}
-		}
-
-	}
+	@import "~./common.scss"
 </style>

+ 58 - 0
pages/login/modules/email-register.vue

@@ -0,0 +1,58 @@
+<template>
+	<form class="login-form">
+		<view class="form-item">
+			<input class="form-input" v-model="formData.email" type="email" inputmode="email" name="email"
+				placeholder-class="form-input-place" placeholder="请输入您的邮箱地址" />
+		</view>
+		<view class="form-item">
+			<input class="form-input" v-model="formData.code" name="code" placeholder-class="form-input-place"
+				placeholder="邀请码 (选填)" />
+		</view>
+		<view class="form-agreement">
+			<view class="agreement-confirm">
+				<text class="confirm-icon iconfont">&#xe6c5;</text>
+			</view>
+			<text>我已阅读并同意</text>
+			<text class="agreement-name">《用户协议》</text>
+		</view>
+		<view class="form-btn" @click.stop="formSubmit">
+			下一步
+		</view>
+		<view class="form-hint" >
+			已有账号?<text class="hint-btn"> 立即登录</text>
+		</view>
+
+		<slider-verify ref="sliderVerifyRef" @slideImgSuccess="slideImgSuccess"/>
+	</form>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				formData: {
+					email: 'biking2023@163.com',
+					code: ''
+				}
+			};
+		},
+		methods: {
+			formSubmit(e) {
+				console.log('formSubmit = ', this.formData)
+				this.$refs.sliderVerifyRef.open();
+			},
+			slideImgSuccess(){
+				uni.navigateTo({
+					url: `/pages/login/email-verify?email=${this.formData.email}`
+				})
+			},
+			formReset() {
+			
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "~./../common.scss"
+</style>

+ 0 - 3
pages/login/modules/mailbox.vue

@@ -1,8 +1,5 @@
 <template>
 	<form @submit="formSubmit" @reset="formReset">
-
-
-
 		<view class="uni-form-item uni-column">
 			<view class="title">input</view>
 			<input class="uni-input" name="input" placeholder="这是一个输入框" />

+ 48 - 0
pages/login/modules/phone-register.vue

@@ -0,0 +1,48 @@
+<template>
+	<form class="login-form" @submit="formSubmit" @reset="formReset">
+		<view class="form-item">
+			<view class="form-lable"><text>+86</text><text class="form-lable-icon iconfont">&#xe601;</text></view>
+			<input class="form-input" name="input" placeholder-class="form-input-place" placeholder="请输入您的手机号" />
+		</view>
+		<view class="form-item">
+			<input class="form-input" name="input" placeholder-class="form-input-place" placeholder="邀请码 (选填)" />
+		</view>
+		<view class="form-agreement">
+			<view class="agreement-confirm">
+				<text class="confirm-icon iconfont">&#xe6c5;</text>
+			</view>
+			<text>我已阅读并同意</text>
+			<text class="agreement-name">《用户协议》</text>
+		</view>
+		<view class="form-btn">
+			下一步
+		</view>
+		<view class="form-hint">
+			已有账号?<text class="hint-btn"> 立即登录</text>
+		</view>
+		
+		<slider-verify ref="sliderVerifyRef"/>
+	</form>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			formSubmit() {
+
+			},
+			formReset() {
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "~./../common.scss"
+</style>

+ 45 - 135
pages/login/modules/phone.vue

@@ -1,160 +1,70 @@
 <template>
-	<form class="form-box">
-
+	<form class="login-form">
 		<view class="form-item">
-			<text class="form-item-lable">+86</text>
-			<input class="form-item-input" placeholder-class="form-item-placeholder" placeholder="请输入您的手机号码" />
+			<view class="form-lable"><text>+86</text><text class="form-lable-icon iconfont">&#xe601;</text></view>
+			<input class="form-input" v-model="formData.user_string" name="user_string"
+				placeholder-class="form-input-place" placeholder="请输入您的手机号" />
 		</view>
 		<view class="form-item">
-			<input class="form-item-input" :password="showPassword" placeholder-class="form-item-placeholder"
-				placeholder="请输入密码" />
+			<input type="password" class="form-input" v-model="formData.password" name="password"
+				placeholder-class="form-input-place" placeholder="邀请码 (选填)" />
 		</view>
-		<view class="form-agreement">
-			<view class="form-item-agreement">
-				<image v-show="notarizeAgreement" class="notarize-icon" src="../../../static/images/notarize.png"
-					mode=""></image>
+		<!-- <view class="form-agreement">
+			<view class="agreement-confirm">
+				<text class="confirm-icon iconfont">&#xe6c5;</text>
 			</view>
-			<text class="agreement-text">我已阅读并同意</text>
+			<text>我已阅读并同意</text>
 			<text class="agreement-name">《用户协议》</text>
-		</view>
-		<!-- <view class="uni-btn-v">
-			<button form-type="submit">Submit</button> 
-			<button type="default" form-type="reset">Reset</button>
 		</view> -->
-		<view class="form-btn">
+		<view class="form-btn" style="margin-top: 28rpx;" @click.stop="formSubmit">
 			登录
 		</view>
-
-		<view class="more-operate">
-			<text>已有账号?</text>
-			<text class="operate-link">|</text>
-			<text class="register">立即登录</text>
+		<view class="form-hint">
+			已有账号?<text class="hint-btn"> 立即登录</text>
 		</view>
+
+		<slider-verify ref="sliderVerifyRef" />
 	</form>
 </template>
 
 <script>
+	import {
+		reverseBack
+	} from "@/utils/common.js"
+	import {
+		Api_userLogin
+	} from "@/api/index.js"
+
 	export default {
-		name: 'phoneLogin',
 		data() {
 			return {
-				showPassword: true,
-				notarizeAgreement: true
+				formData: {
+					user_string: '14100000001',
+					password: '123456'
+				}
 			};
+		},
+		methods: {
+			formSubmit() {
+				Api_userLogin(this.formData).then(res => {
+					// setToken(res)
+					if (res) {
+						this.$store.dispatch("app/setToken", res)
+						uni.showToast({
+							title: '登录成功',
+							icon: 'none'
+						});
+						setTimeout(() => {
+							reverseBack()
+						}, 1500)
+					}
+
+				})
+			}
 		}
 	}
 </script>
 
 <style lang="scss" scoped>
-	.form-box {
-		margin-top: 30rpx;
-
-		.form-item {
-			width: 630rpx;
-			height: 90rpx;
-			margin-bottom: 30rpx;
-			background: #f7f7f7;
-			border: 1rpx solid #cccccc;
-			border-radius: 14rpx;
-			display: flex;
-			align-items: center;
-
-			font-size: 28rpx;
-
-			color: #666666;
-			line-height: 38rpx;
-			letter-spacing: 0.56rpx;
-			padding: 0 14rpx;
-
-			.form-item-lable {
-				width: 130rpx;
-				flex-shrink: 0;
-			}
-
-			.form-item-input {
-				flex: 1;
-				height: 100%;
-			}
-
-			.form-item-placeholder {
-
-				font-size: 28rpx;
-				font-family: PingFang SC, PingFang SC-Regular;
-				font-weight: 400;
-
-				color: #b3b3b3;
-				letter-spacing: 0.56rpx;
-			}
-
-
-
-		}
-
-		.form-agreement {
-			display: flex;
-			align-items: center;
-
-
-			font-size: 24rpx;
-			font-family: PingFang SC, PingFang SC-Regular;
-			font-weight: 400;
-			color: #666666;
-
-			.form-item-agreement {
-				width: 29rpx;
-				height: 29rpx;
-				border: 1rpx solid #3b6afd;
-				display: flex;
-				justify-content: center;
-				align-items: center;
-
-				.notarize-icon {
-					width: 19rpx;
-					height: 14rpx;
-				}
-			}
-
-			.agreement-text {
-				padding: 0 0 0 15rpx;
-			}
-
-			.agreement-name {
-				color: #3BA2FD;
-			}
-		}
-
-		.form-btn {
-			margin-top: 54rpx;
-			background-color: #00B99A;
-			width: 630rpx;
-			height: 90rpx;
-			border-radius: 10rpx;
-			text-align: center;
-			line-height: 90rpx;
-
-			font-size: 32rpx;
-			font-family: PingFang SC, PingFang SC-Regular;
-			font-weight: 400;
-			color: #ffffff;
-			letter-spacing: 0.64rpx;
-		}
-		
-		.more-operate{
-			padding-top: 32rpx;
-			font-size: 28rpx;
-			font-family: PingFang SC, PingFang SC-Regular;
-			font-weight: 400;
-			text-align: center;
-			color: #999999;
-			line-height: 40rpx;
-			letter-spacing: 0.56rpx;
-			.operate-link{
-				padding: 0 20rpx;
-			}
-			.register{
-				color: #20b482;
-			}
-		}
-		
-	}
+	@import "~./../common.scss"
 </style>

+ 61 - 0
pages/login/modules/tab.vue

@@ -0,0 +1,61 @@
+<template>
+	<view class="tab-box">
+		<view class="tab">
+			<view v-for="(item , index) in marketTab"
+				:class="['tab-item' , index === marketTabIndex ? 'active-tab-item' : '' ]"
+				@click.stop="changTab(index)">
+				{{ item }}
+			</view>
+
+		</view>
+		<!-- <component :is="phoneLogin"/> -->
+	</view>
+</template>
+
+
+<script>
+	export default {
+		props: {
+			tabIndex: Number,
+			default: 0
+		},
+		data() {
+			return {
+				marketTabIndex: 0,
+				marketTab: [
+					'手机号',
+					'邮箱'
+				]
+			};
+		},
+		watch: {
+			tabIndex: {
+				handler(newVal) {
+					this.marketTabIndex = newVal || 0
+				},
+				immediate: true,
+				deep: true
+			},
+			marketTabIndex: {
+				handler(newVal, oldVal) {
+					if (newVal !== oldVal) {
+						this.$emit("update:tabIndex", newVal);
+					}
+				},
+				immediate: true,
+				deep: true
+			}
+		},
+		methods: {
+			// marketTabIndex = index
+			changTab(index) {
+				this.marketTabIndex = index
+				// this.$emit('updata:tabIndex', index)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "~./../common.scss"
+</style>

+ 52 - 0
pages/login/register.vue

@@ -0,0 +1,52 @@
+<template>
+	<view>
+		<headContent>
+			<template #left>
+				<view class="head-revers-back iconfont" @click.stop="reversBackBtn()">&#xe604;</view>
+			</template>
+		</headContent>
+
+		<view class="page-content">
+			<text class="login-title">注册</text>
+			<text class="login-content">立即注册属于您的币王账号</text>
+			<tabList ref="tabListRef" :tabIndex.sync="tabIndexs"/>
+
+			<phoneRegister v-show="tabIndexs === 0" />
+
+			<email-register v-show="tabIndexs === 1" />
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		reverseBack
+	} from "@/utils/common.js"
+	import tabList from "./modules/tab.vue"
+	import emailRegister from "./modules/email-register.vue"
+	import phoneRegister from "./modules/phone-register.vue"
+
+	export default {
+		name: 'register',
+		components: {
+			tabList,
+			emailRegister,
+			phoneRegister
+		},
+		data() {
+			return {
+				tabIndexs: 1
+			};
+		},
+		methods: {
+			reversBackBtn() {
+				reverseBack()
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "~./common.scss"
+</style>

+ 3 - 4
static/fontsize/iconfont.css

@@ -1,9 +1,8 @@
-
 @font-face {
   font-family: 'iconfont';  /* Project id 4023758 */
-  src: url('https://at.alicdn.com/t/c/font_4023758_5m3dyscqq3l.woff2?t=1682058406783') format('woff2'),
-       url('https://at.alicdn.com/t/c/font_4023758_5m3dyscqq3l.woff?t=1682058406783') format('woff'),
-       url('https://at.alicdn.com/t/c/font_4023758_5m3dyscqq3l.ttf?t=1682058406783') format('truetype');
+  src: url('https://at.alicdn.com/t/c/font_4023758_1pgy8jhfbhf.woff2?t=1682218358021') format('woff2'),
+       url('https://at.alicdn.com/t/c/font_4023758_1pgy8jhfbhf.woff?t=1682218358021') format('woff'),
+       url('https://at.alicdn.com/t/c/font_4023758_1pgy8jhfbhf.ttf?t=1682218358021') format('truetype');
 }
 .iconfont {
 	font-family: "iconfont" !important;

BIN
static/images/slider-verify/logo.png


+ 1 - 0
store/getters.js

@@ -1,4 +1,5 @@
 const getters = {
+	token: state => state.app.token,
 	stocksColor: state => state.app.stocksColor,
 	headHeight: state => state.app.headHeight,
 	statusBarHeight: state => state.app.statusBarHeight,

+ 21 - 5
store/modules/app.config.js

@@ -1,24 +1,40 @@
+ import {
+ 	getToken,
+ 	setToken
+ } from "@/utils/common.js"
  const state = {
+ 	token: getToken(),
  	headHeight: '100rpx',
  	statusBarHeight: 0,
-	
-	// 涨跌颜色
-	stocksColor: 'green_rise' , // green_rise:绿涨红跌 , red_rise:绿跌红涨 
-	
+
+ 	// 涨跌颜色
+ 	stocksColor: 'green_rise', // green_rise:绿涨红跌 , red_rise:绿跌红涨 
  }
 
  const mutations = {
  	SET_statusBarHeight: (state, Height) => {
  		state.statusBarHeight = Height
  	},
-	SET_STOCKS_COLOR: (state, code) => {
+ 	SET_STOCKS_COLOR: (state, code) => {
  		state.stocksColor = code
  	},
+ 	SET_TOKEN: (state, token) => {
+ 		setToken(token)
+ 		state.token = token
+ 	}
 
  }
 
  const actions = {
+ 	// setToken = (token) => {
+ 	// console.log('token = ' , token)
+ 	// }
+ 	setToken({
+ 		commit
+ 	}, token) {
+ 		commit('SET_TOKEN', token)
 
+ 	},
 
  }
 

+ 1 - 0
uni.scss

@@ -14,6 +14,7 @@
 @import 'uview-ui/theme.scss';
 $pages-padding: 30rpx;
 $page-bg:#F5F5F5;
+$box-bg: #f1f1f1;
 $modules-box-bg:#ffffff;
 $Theme-Color: #05C175;
 $border-color: rgba(204, 204, 204, 0.2);

+ 15 - 1
utils/common.js

@@ -1,8 +1,22 @@
 // import config from "./config"
 // import store from "@/store/index.js"
+import config from "./config.js"
+export const setToken = (tokenVal) => {
+	try {
+		uni.setStorageSync(config.tokenKey, tokenVal);
+	} catch (e) {
+		// error
+	}
+}
+
 
 export const getToken = () => {
-	return 'token'
+	try {
+		const value = uni.getStorageSync(config.tokenKey);
+		return value || ''
+	} catch (e) {
+		// error
+	}
 }
 
 // 判断是否登录

+ 21 - 16
utils/config.js

@@ -1,20 +1,23 @@
  const config = {
-	stocksColorObj:{
-		'green_rise':'绿涨红跌',
-		'red_rise':'红涨绿跌',
-	}
-	// stocksColorList: [
-	// 	{
-	// 		name: '绿涨红跌',
-	// 		code: 'green_rise'
-	// 	},
-	// 	{
-	// 		name: '红涨绿跌',
-	// 		code: 'red_rise'
-	// 	}
-	// ]
+ 	tokenKey: 'token', 
+ 	// baseUrl: 'baseUrlTest',
+ 	baseUrl: 'https://doc.okenx.com',
 
 
+ 	stocksColorObj: {
+ 		'green_rise': '绿涨红跌',
+ 		'red_rise': '红涨绿跌',
+ 	}
+ 	// stocksColorList: [
+ 	// 	{
+ 	// 		name: '绿涨红跌',
+ 	// 		code: 'green_rise'
+ 	// 	},
+ 	// 	{
+ 	// 		name: '红涨绿跌',
+ 	// 		code: 'red_rise'
+ 	// 	}
+ 	// ]
 
 
 
@@ -24,6 +27,8 @@
 
 
 
-}
 
-export default config
+
+ }
+
+ export default config

+ 135 - 0
utils/request.js

@@ -0,0 +1,135 @@
+// 封装请求
+
+
+import config from './config.js'
+import {
+	getToken
+} from "./common.js"
+
+// 请求域名
+// const baseUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro
+const baseUrl = config.baseUrl
+
+let LoginFailure = false
+// 存储请求信息,当接口正在请求中,不会进行下一次接口请求
+const pending = {}
+
+// 处理请求成功
+const isHttpSuccess = (stauts) => {
+	return stauts >= 200 && stauts < 300
+}
+
+// 处理请求错误
+const errorHandle = (res) => {
+	// 日志处理  全局错误提示
+	if (res && res.statusCode !== 200) {
+		// 浏览器错误
+		uni.showToast({
+			title: '系统错误,请联系管理员',
+			icon: 'none',
+			duration: 2000
+		})
+	} else {
+		// console.log('errorHandle1', res)
+		// 服务器错误
+		uni.showToast({
+			title: res.data.msg || '系统错误,请联系管理员',
+			icon: 'none',
+			duration: 2000
+		})
+	}
+
+}
+
+export const request = async (opt = {}) => {
+	// 考虑与uniapp的接口进行兼容
+
+
+	let headers = {
+		"Content-Type": "application/x-www-form-urlencoded"
+	}
+	const token = getToken();
+	if (token) {
+		headers['authorization'] = token;
+	}
+	console.log('headers = ', headers)
+	const {
+		data,
+		success,
+		fail
+	} = opt
+
+	// pending 中的键名
+	const key = opt.url + '&' + (opt.method || 'GET')
+
+	// 处理请求地址
+	opt.url = baseUrl + opt.url
+
+	// 处理公共参数
+
+	opt.data = data
+
+	opt.timeout = 5000 // 请求超时时间
+
+	opt.header = headers
+	const result = new Promise((resolve, reject) => {
+		const handler = uni.request(Object.assign({}, opt, {
+			success: (res) => {
+				const data = res.data;
+				console.log('data = ', res)
+				delete pending[key]
+				if (data.type === 'ok') {
+					resolve(data.message)
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: data.message || '系统错误'
+					})
+					reject(data)
+				}
+
+			},
+			fail: (e) => {
+				console.log('fail = ', e)
+			}
+		}))
+		if (pending[key]) {
+			// 中断请求
+			pending[key].abort()
+		}
+		// setTimeout 让pending[key].abort()执行完成后在存值
+		setTimeout(() => {
+			pending[key] = handler
+		}, 0)
+	})
+	return result
+}
+
+
+export const axios = {
+	get(url, data, options = {}) {
+		return request({
+			url,
+			data,
+			method: 'GET',
+			...options
+		})
+	},
+	post(url, data, options = {}) {
+		return request({
+			url,
+			data,
+			method: 'POST',
+			...options
+		})
+	},
+	getDow(url, data, options = {}) {
+		// console.log('getDow' , options)
+		return request({
+			url,
+			data,
+			method: 'GET',
+			...options
+		})
+	},
+}