Răsfoiți Sursa

登录页 首页

hi 6 zile în urmă
părinte
comite
9b2385136f

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 /erp-pda-app.txt
 /node_modules
+/unpackage

+ 56 - 1
common/css/public.scss

@@ -21,7 +21,62 @@ page{
 	font-size: 28rpx;
 	color: #333333;
 }
-
+@for $i from 0 through 100 {
+  // 只要双数和能被5除尽的数
+  @if $i % 2==0 or $i % 5==0 {
+    // 得出:u-margin-30或者u-m-30
+    .ss-margin-#{$i},
+    .ss-m-#{$i} {
+      margin: $i + rpx;
+    }
+    .ss-m-x-#{$i} {
+      margin-left: $i + rpx;
+      margin-right: $i + rpx;
+    }
+    .ss-m-y-#{$i} {
+      margin-top: $i + rpx;
+      margin-bottom: $i + rpx;
+    }
+
+    // 得出:u-padding-30或者u-p-30
+    .ss-padding-#{$i},
+    .ss-p-#{$i} {
+      padding: $i + rpx;
+    }
+    .ss-p-x-#{$i} {
+      padding-left: $i + rpx;
+      padding-right: $i + rpx;
+    }
+    .ss-p-y-#{$i} {
+      padding-top: $i + rpx;
+      padding-bottom: $i + rpx;
+    }
+
+    @each $short, $long in l left, t top, r right, b bottom {
+      // 缩写版,结果如: u-m-l-30
+      // 定义外边距
+      .ss-m-#{$short}-#{$i} {
+        margin-#{$long}: $i + rpx;
+      }
+
+      // 定义内边距
+      .ss-p-#{$short}-#{$i} {
+        padding-#{$long}: $i + rpx;
+      }
+
+      // 完整版,结果如:u-margin-left-30
+      // 定义外边距
+      .ss-margin-#{$long}-#{$i} {
+        margin-#{$long}: $i + rpx;
+      }
+
+      // 定义内边距
+      .ss-padding-#{$long}-#{$i} {
+        padding-#{$long}: $i + rpx;
+      }
+    }
+  }
+}
 /* flex布局 */
 .flex_box {
 	display: -webkit-flex;

+ 1 - 74
common/store/modules/user.js

@@ -25,8 +25,6 @@ const state = {
 	isLogin: uni.getStorageSync("isLogin") || false, // 是否登陆
 	isOneLogin: 0, // 是否登陆
 	userInfo: uni.getStorageSync("userInfo") || {}, // 用户信息
-	// 福利类型:1=咨询服务(数量),2=课程服务,3=Al使用[咨询+文书](限次),4=Al使用[咨询+文书](限时长),5=合同下载(次数),
-	// 6=合同审查(次数),7=诉前辅导(次数),8=文书代写[律师](次数),9=法律顾问(次数),10=应急法援(次数),11=风险查询(次数)
 	userEquity: uni.getStorageSync("userEquity") || {}, // 权益信息
 	imgUrl: '', //服务器图片baseUrl
 	videoHistory: uni.getStorageSync("videoHistory") || [], //查找视频历史记录
@@ -65,68 +63,6 @@ const actions = {
 		// 	root: true
 		// })
 		const user_id = uni.getStorageSync('user_id')
-		// 登录重新配置分享信息
-		// appShareConfig().then((res) => {
-		// 	if (res.code === 1) {
-		// 		const path = userInfo.user_id ?
-		// 			`/pages/index/index?user_id=${userInfo.id}` :
-		// 			`/pages/index/index`
-		// 		const href = userInfo.user_id ?
-		// 			`${this.H5_URL}/pages/h5/download?user_id=${userInfo.id}` :
-		// 			`${this.H5_URL}/pages/h5/download`
-		// 		res.data.forEach((item) => {
-		// 			if (item.type == 2) {
-		// 				// #ifdef MP-WEIXIN
-		// 				uni.$u.mpShare = {
-		// 					title: item.title,
-		// 					path: path,
-		// 					imageUrl: item.image
-		// 				}
-		// 				// #endif
-		// 			} else if (item.type == 1) {
-		// 				// #ifdef APP
-		// 				uni.$u.mpShare = {
-		// 					title: item.title,
-		// 					path: href,
-		// 					imageUrl: item.image,
-		// 					summary: item.subtitle
-		// 				}
-		// 				// #endif
-		// 			}
-		// 		})
-		// 	}
-		// })
-		// 分享绑定关系
-		if (user_id) {
-			bindUser({
-				share_id: user_id
-			}).then(res => {}).catch(err => {
-				uni.$u.toast(err.msg);
-				console.log(err)
-				// 错误提示框
-			});
-			uni.removeStorageSync('user_id')
-		}
-		// #ifdef MP-WEIXIN
-		// 获取openid
-		if (!uni.getStorageSync('openid')) {
-			uni.login({
-				success(res) {
-					Openid({
-						code: res.code
-					})
-						.then((res) => {
-							if (res.code == 1) {
-								uni.setStorageSync('openid', res.data.openid)
-							}
-						})
-						.catch((err) => {
-							uni.$u.toast(err.msg)
-						})
-				}
-			})
-		}
-		// #endif
 	},
 	// 退出登录
 	userLogout({
@@ -154,15 +90,6 @@ const actions = {
 			commit('setUserInfo', {});
 		}
 		
-		
-		// dispatch('chat/initChat', '', {
-		// 	root: true
-		// })
-		// dispatch('chat/close', '', {
-		// 	root: true
-		// })
-		// 重置全局分享信息
-		// share.setShareInfo();
 	},
 	// 获取权益信息
 	getUserEquity({
@@ -235,7 +162,7 @@ const actions = {
 				reject(err)
 			})
 		})
-	}
+	},
 }
 //静态数据 方法 可更改数据
 const mutations = {

+ 14 - 2
pages.json

@@ -1,10 +1,10 @@
 {
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		
 		{
 			"path": "pages/index/index",
 			"style": {
-				"navigationBarTitleText": "首页",
-				"navigationStyle": "default"
+				"navigationBarTitleText": "首页"
 			},
 			"meta": {
 				"auth": false,
@@ -18,6 +18,18 @@
 			"style": {
 				"navigationBarTitleText": ""
 			}
+		},
+		{
+			"path": "pages/login/login",
+			"style": {
+				"navigationBarTitleText": ""
+			}
+		},
+		{
+			"path": "pages/picking-task/index",
+			"style": {
+				"navigationBarTitleText": ""
+			}
 		}
 	],
 	/* 分包预载配置 */

+ 132 - 33
pages/index/index.vue

@@ -1,48 +1,147 @@
 <template>
 	<view class="container_box">
-		<!-- <u-navbar height="90rpx" :auto-back="true" title=" " bgColor="#fff" :placeholder="true">
-			<view class="u-nav-slot flex_box" slot="left">
-			
+		<u-navbar height="80rpx" title=" " bgColor="transparent">
+			<view class="u-nav-slot btn-left" slot="left" @click="meunClick">
+				<image src="@/static/image/home/bulletpoint.png" mode=""></image>
 			</view>
-		</u-navbar> -->
+			<view class="u-nav-slot btn-right" slot="right">
+				<image src="@/static/image/home/notice-icon.png" mode=""></image>
+			</view>
+		</u-navbar>
 		<view class="container_main">
-			erp pda app
+			<view class="header-box">
+				<image src="@/static/image/home/home-top-img.png" mode=""></image>
+			</view>
+			<view class="container_cont">
+				<view class="operate-item" v-for="(item,i) in operateList" :key="i" @click="operateClick(item)">
+					<view class="operate-img">
+						<image :src="item.src" mode=""></image>
+						<u-badge type="error" absolute max="99" :value="item.num" :offset="[-5,-5]"></u-badge>
+					</view>
+					<view class="operate-text">{{item.text}}</view>
+				</view>
+			</view>
 		</view>
 	</view>
 </template>
 
 <script>
-const Base64 = require('js-base64').Base64
-import { bannerList } from '@/common/request/apis/index'
-import { mapGetters } from 'vuex'
-export default {
-	data() {
-		return {
-			
+	const Base64 = require('js-base64').Base64
+	import {
+		bannerList
+	} from '@/common/request/apis/index'
+	import {
+		mapGetters
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+				operateList:[
+					{
+						src:require('@/static/image/home/icon-jhrw.png'),
+						text:'拣货任务',
+						num:5,
+						url:'/pages/picking-task/index'
+					},
+					{
+						src:require('@/static/image/home/icon-cgrk.png'),
+						text:'采购入库',
+						num:5,
+						url:''
+					},
+					{
+						src:require('@/static/image/home/icon-chcx.png'),
+						text:'存货查询',
+						num:0,
+						url:''
+					},
+					{
+						src:require('@/static/image/home/icon-pdrw.png'),
+						text:'盘点任务',
+						num:0,
+						url:''
+					}
+				]
+			}
+		},
+		onLoad() {
+			// JSON.parse(Base64.decode(that.$Route.query.classData))
+		},
+		onShow() {
+
+		},
+		computed: {
+			// ...mapGetters(['isLogin'])
+		},
+		methods: {
+			meunClick() {
+				console.log('菜单')
+			},
+			operateClick(item) {
+				uni.navigateTo({
+					url:item.url
+				})
+			}
 		}
-	},
-	onLoad() {
-		// JSON.parse(Base64.decode(that.$Route.query.classData))
-	},
-	onShow() {
-		
-	},
-	computed: {
-		// ...mapGetters(['isLogin'])
-	},
-	methods: {
-	
 	}
-}
 </script>
 
 <style lang="scss" scoped>
-.container_box {
-	background-color: #ffffff;
-	padding: 0 0 20rpx;
-	.container_main {
-		padding: 0 20rpx;
+	.btn-left {
+		image {
+			width: 48rpx;
+			height: 48rpx;
+		}
+	}
+	.btn-right {
+		image {
+			width: 40rpx;
+			height: 44rpx;
+		}
+	}
+
+	.container_box {
+		.container_main {
+			.header-box {
+				image {
+					width: 100%;
+					height: 375rpx;
+				}
+			}
+
+		}
+		.container_cont {
+			padding: 32rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			flex-wrap: wrap;
+			.operate-item {
+				width: 326rpx;
+				height: 262rpx;
+				border-radius: 16rpx;
+				background: #FFF;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				margin-bottom: 32rpx;
+				.operate-img {
+					position: relative;
+					image {
+						width: 128rpx;
+						height: 128rpx;
+					}
+				}
+				.operate-text {
+					color: #333;
+					font-family: "PingFang SC";
+					font-size: 32rpx;
+					font-weight: 500;
+					margin-top: 20rpx;
+				}
+			}
+		}
+
 	}
-	
-}
-</style>
+</style>

+ 154 - 0
pages/login/change-password.vue

@@ -0,0 +1,154 @@
+<!-- 修改密码 - changePassword  -->
+<template>
+	<s-layout title="修改密码" :bgStyle="{color:'#fff'}">
+		<view class="content-block">
+			<uni-forms ref="changePasswordRef" v-model="state.model" :rules="state.rules" validateTrigger="bind" labelWidth="140"
+				labelAlign="left" labelPosition="top">
+				<uni-forms-item name="mobile" label="手机号">
+					<view class="input-line">
+						<uni-easyinput placeholder="请输入手机号" v-model="state.model.mobile" type="number" :inputBorder="false">
+						</uni-easyinput>
+					</view>
+				</uni-forms-item>
+				<uni-forms-item name="newPassword" label="新密码">
+					<view class="input-line">
+						<uni-easyinput type="password" placeholder="请输入密码" v-model="state.model.newPassword" :inputBorder="false">
+						</uni-easyinput>
+					</view>
+				</uni-forms-item>
+				<uni-forms-item name="confirmPassword" label="确认密码">
+					<view class="input-line">
+						<uni-easyinput type="password" placeholder="请输入密码" v-model="state.model.confirmPassword" :inputBorder="false">
+						</uni-easyinput>
+					</view>
+				</uni-forms-item>
+				<uni-forms-item name="code" label="验证码">
+					<view class="ss-flex ss-row-between">
+						<view class="input-line w-370">
+							<uni-easyinput placeholder="请输入验证码" v-model="state.model.verificationCode" :inputBorder="false" type="number"
+								maxlength="6">
+							</uni-easyinput>
+						</view>
+						<button class="ss-reset-button code-btn code-btn-start" :disabled="getSmsTimer('changePassword') != '获取验证码'"
+							:class="{ 'code-btn-end': getSmsTimer('changePassword') != '获取验证码' }"
+							@tap="getSmsCode('changePassword', state.model.mobile)">
+							{{ getSmsTimer('changePassword') }}
+						</button>
+					</view>
+				</uni-forms-item>
+			
+			
+			</uni-forms>
+			
+			<button class="ss-reset-button toLoginBtn" @tap="changePasswordSubmit">
+				确认
+			</button>
+		</view>
+	</s-layout>
+</template>
+
+<script setup>
+	import {
+		computed,
+		watch,
+		ref,
+		reactive,
+		unref
+	} from 'vue';
+	import sheep from '@/sheep';
+	import {
+		code,
+		mobile,
+		password
+	} from '@/sheep/validate/form';
+	import {
+		getSmsCode,
+		getSmsTimer
+	} from '@/sheep/hooks/useModal';
+	import {Base64} from 'js-base64'
+
+	const changePasswordRef = ref(null);
+	const isLogin = computed(() => sheep.$store('user').isLogin);
+
+	// 数据
+	const state = reactive({
+		isMobileEnd: false, // 手机号输入完毕
+		model: {
+			mobile: '', //手机号
+			verificationCode: '', //验证码
+			newPassword: '', //密码
+			confirmPassword:'',
+		},
+		rules: {
+			code,
+			mobile,
+			newPassword:password,
+			confirmPassword: {
+			  rules: [
+			    {
+			      required: true,
+			      errorMessage: '请确认密码',
+			    },
+			    {
+			      validateFunction: function (rule, value, data, callback) {
+			        if (value !== state.model.newPassword) {
+			          callback('两次输入的密码不一致');
+			        }
+			        return true;
+			      },
+			    },
+			  ],
+			},
+		},
+	});
+
+	// 6.更改密码
+	const changePasswordSubmit = async () => {
+	  const validate = await unref(changePasswordRef)
+	    .validate()
+	    .catch((error) => {
+	      console.log('error: ', error);
+	    });
+	  if (!validate) return;
+		state.model.uuid = sheep.$store('user').getUUID('changePassword')
+		const data = Base64.encode(JSON.stringify(state.model))
+		console.log(state.model)
+	  sheep.$api.user.resetPassword(data).then((res) => {
+			if(res.code == 200) {
+				sheep.$helper.toast('修改成功')
+				setTimeout(()=>{
+					uni.navigateBack()
+				},1500)
+			}
+	    // if (res.error === 0) {
+	    //   sheep.$store('user').getInfo();
+	    //   closeAuthModal();
+	    // }
+	  });
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '@/sheep/components/s-auth-modal/index.scss';
+	.content-block {
+		padding: 0 30rpx;
+	}
+	.input-line {
+		background-color: #F5F7FB;
+		border-radius: 16rpx;
+		padding-left: 30rpx;
+		height: 88rpx;
+		box-sizing: border-box;
+	}
+	.toLoginBtn {
+		height: 88rpx;
+		background: #F39801;
+		border-radius: 16rpx;
+		color: #fff;
+		margin-bottom: 32rpx;
+		margin-top: 30rpx;
+	}
+	.w-370 {
+		width: 370rpx;
+	}
+</style>

+ 129 - 0
pages/login/components/account-login.vue

@@ -0,0 +1,129 @@
+<!-- 账号密码登录 accountLogin  -->
+<template>
+  <view>
+    <!-- 表单项 -->
+    <u-form
+      ref="accountLoginRef"
+      labelWidth="140"
+      labelAlign="left"
+      labelPosition="top"
+    >
+      <u-form-item prop="mobile" label="手机号">
+        <view class="input-line">
+					<u-input
+							placeholder="请输入手机号"
+							v-model="model.mobile"
+							border="none"
+							type="number"
+							maxlength="11"
+					></u-input>
+        </view>
+      </u-form-item>
+
+      <u-form-item prop="password" label="密码">
+        <view class="input-line">
+					<u-input
+						type="password"
+						placeholder="请输入密码"
+						v-model="model.password"
+						border="none"
+					></u-input>
+        </view>
+      </u-form-item>
+    </u-form>
+  </view>
+</template>
+
+<script>
+	export default{
+		data() {
+			return {
+				model:{
+					mobile:'',
+					password:''
+				},
+				rules:{
+					mobile: [
+					  {
+					    required: true,
+					    errorMessage: '请输入手机号',
+					  },
+					  {
+					    validateFunction: function (rule, value, data, callback) {
+					      if (!test.mobile(value)) {
+					        callback('手机号码格式不正确');
+					      }
+					      return true;
+					    },
+					  },
+					],
+					password: [
+					  {
+					    required: true,
+					    errorMessage: '请输入密码',
+					  },
+					],
+				}
+			}
+		},
+		methods:{
+			accountLoginSubmit() {
+			  if(!uni.$u.test.mobile(this.model.mobile)){
+			  	return uni.$u.toast("请输入正确手机号");
+			  }
+			  if(!this.model.password) {
+			  	return uni.$u.toast("请输入密码");
+			  }
+			  uni.$u.toast("登录成功!");
+			  setTimeout(()=>{
+					uni.redirectTo({
+						url:'/pages/index/index'
+					})
+			  },1000)
+			}
+		}
+	}
+// import { computed, watch, ref, reactive, unref } from "vue";
+// import sheep from "@/sheep";
+// import { mobile, password } from "@/sheep/validate/form";
+// import { showAuthModal, closeAuthModal } from "@/sheep/hooks/useModal";
+// import { Base64 } from "js-base64";
+
+// const accountLoginRef = ref(null);
+
+// const props = defineProps({
+//   agreeStatus: {
+//     type: Boolean,
+//     default: false,
+//   },
+// });
+// // 数据
+// const state = reactive({
+//   model: {
+//     mobile: "", // 账号
+//     password: "", // 密码
+//   },
+//   rules: {
+//     mobile,
+//     password,
+//   },
+// });
+
+// defineExpose({
+//   accountLoginSubmit,
+// });
+</script>
+
+<style lang="scss" scoped>
+// @import "../index.scss";
+.input-line {
+	display: flex;
+	align-items: center;
+	width: 100%;
+  background-color: #f5f7fb;
+  border-radius: 16rpx;
+  padding-left: 30rpx;
+  height: 88rpx;
+  box-sizing: border-box;
+}
+</style>

+ 120 - 0
pages/login/components/change-mobile.vue

@@ -0,0 +1,120 @@
+<!-- 绑定/更换手机号 changeMobile  -->
+<template>
+  <view>
+    <!-- 标题栏 -->
+    <view class="head-box ss-m-b-60">
+      <view class="head-title ss-m-b-20">
+        {{ userInfo.verification.mobile ? '更换手机号' : '绑定手机号' }}
+      </view>
+      <view class="head-subtitle">为了您的账号安全,请使用本人手机号码</view>
+    </view>
+
+    <!-- 表单项 -->
+    <uni-forms
+      ref="changeMobileRef"
+      v-model="state.model"
+      :rules="state.rules"
+      validateTrigger="bind"
+      labelWidth="140"
+      labelAlign="center"
+    >
+      <uni-forms-item name="mobile" label="手机号">
+        <uni-easyinput
+          placeholder="请输入手机号"
+          v-model="state.model.mobile"
+          :inputBorder="false"
+          type="number"
+        >
+          <template v-slot:right>
+            <button
+              class="ss-reset-button code-btn-start"
+              :disabled="state.isMobileEnd"
+              :class="{ 'code-btn-end': state.isMobileEnd }"
+              @tap="getSmsCode('changeMobile', state.model.mobile)"
+            >
+              {{ getSmsTimer('changeMobile') }}
+            </button>
+          </template>
+        </uni-easyinput>
+      </uni-forms-item>
+
+      <uni-forms-item name="code" label="验证码">
+        <uni-easyinput
+          placeholder="请输入验证码"
+          v-model="state.model.code"
+          :inputBorder="false"
+          type="number"
+          maxlength="6"
+        >
+          <template v-slot:right>
+            <button class="ss-reset-button login-btn-start" @tap="changeMobileSubmit">
+              确认
+            </button>
+          </template>
+        </uni-easyinput>
+      </uni-forms-item>
+    </uni-forms>
+    <button
+      v-if="'WechatMiniProgram' === sheep.$platform.name"
+      class="ss-reset-button type-btn"
+      open-type="getPhoneNumber"
+      @getphonenumber="getPhoneNumber"
+    >
+      使用微信手机号
+    </button>
+  </view>
+</template>
+
+<script setup>
+  import { computed, watch, ref, reactive, unref } from 'vue';
+  import sheep from '@/sheep';
+  import { code, mobile } from '@/sheep/validate/form';
+  import { showAuthModal, closeAuthModal, getSmsCode, getSmsTimer } from '@/sheep/hooks/useModal';
+
+  const changeMobileRef = ref(null);
+  const userInfo = computed(() => sheep.$store('user').userInfo);
+  // 数据
+  const state = reactive({
+    isMobileEnd: false, // 手机号输入完毕
+    model: {
+      mobile: '', // 手机号
+      code: '', // 验证码
+    },
+    rules: {
+      code,
+      mobile,
+    },
+  });
+
+  // 5.绑定手机号
+  async function changeMobileSubmit() {
+    const validate = await unref(changeMobileRef)
+      .validate()
+      .catch((error) => {
+        console.log('error: ', error);
+      });
+    if (!validate) return;
+    sheep.$api.user.changeMobile(state.model).then((res) => {
+      if (res.error === 0) {
+        sheep.$store('user').getInfo();
+        closeAuthModal();
+      }
+    });
+  }
+
+  // 使用微信手机号
+  async function getPhoneNumber(e) {
+    if (e.detail.errMsg !== 'getPhoneNumber:ok') {
+    } else {
+      let result = await sheep.$platform.useProvider().bindUserPhoneNumber(e.detail);
+      if (result) {
+        sheep.$store('user').getInfo();
+        closeAuthModal();
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  @import '../index.scss';
+</style>

+ 121 - 0
pages/login/components/change-password.vue

@@ -0,0 +1,121 @@
+<!-- 修改密码 - changePassword  -->
+<template>
+  <view>
+    <!-- 标题栏 -->
+    <view class="head-box ss-m-b-60">
+      <view class="head-title ss-m-b-20">修改密码</view>
+      <view class="head-subtitle">如密码丢失或未设置,请点击忘记密码重新设置</view>
+    </view>
+
+    <!-- 表单项 -->
+    <uni-forms
+      ref="changePasswordRef"
+      v-model="state.model"
+      :rules="state.rules"
+      validateTrigger="bind"
+      labelWidth="140"
+      labelAlign="center"
+    >
+      <uni-forms-item name="oldPassword" label="旧密码">
+        <uni-easyinput
+          placeholder="请输入旧密码"
+          v-model="state.model.oldPassword"
+          type="text"
+          :inputBorder="false"
+        />
+      </uni-forms-item>
+
+      <uni-forms-item name="newPassword" label="新密码">
+        <uni-easyinput
+          type="password"
+          placeholder="请输入新密码"
+          v-model="state.model.newPassword"
+          :inputBorder="false"
+        />
+      </uni-forms-item>
+
+      <uni-forms-item name="reNewPassword" label="确认密码">
+        <uni-easyinput
+          type="password"
+          placeholder="请重新输入您的新密码"
+          v-model="state.model.reNewPassword"
+          :inputBorder="false"
+        >
+          <template v-slot:right>
+            <button class="ss-reset-button login-btn-start" @tap="changePasswordSubmit">
+              确认
+            </button>
+          </template>
+        </uni-easyinput>
+      </uni-forms-item>
+    </uni-forms>
+
+    <view class="editPwd-btn-box ss-m-t-80">
+      <button class="ss-reset-button forgot-btn" @tap="showAuthModal('resetPassword')">
+        忘记密码
+      </button>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import { computed, watch, ref, reactive, unref } from 'vue';
+  import sheep from '@/sheep';
+  import { password } from '@/sheep/validate/form';
+  import { showAuthModal, closeAuthModal } from '@/sheep/hooks/useModal';
+
+  const changePasswordRef = ref(null);
+
+  // 数据
+  const state = reactive({
+    isMobileEnd: false, // 手机号输入完毕
+    model: {
+      oldPassword: '', //旧密码
+      newPassword: '', //新密码
+      reNewPassword: '', //确认密码
+    },
+    rules: {
+      oldPassword: password,
+      newPassword: password,
+      reNewPassword: {
+        rules: [
+          {
+            required: true,
+            errorMessage: '请确认密码',
+          },
+          {
+            validateFunction: function (rule, value, data, callback) {
+              if (value !== state.model.newPassword) {
+                callback('两次输入的密码不一致');
+              }
+              if (value === state.model.oldPassword) {
+                callback('新密码不能与旧密码相同');
+              }
+              return true;
+            },
+          },
+        ],
+      },
+    },
+  });
+
+  // 6.更改密码
+  async function changePasswordSubmit() {
+    const validate = await unref(changePasswordRef)
+      .validate()
+      .catch((error) => {
+        console.log('error: ', error);
+      });
+    if (!validate) return;
+    sheep.$api.user.changePassword(state.model).then((res) => {
+      if (res.error === 0) {
+        sheep.$store('user').getInfo();
+        closeAuthModal();
+      }
+    });
+  }
+</script>
+
+<style lang="scss" scoped>
+  @import '../index.scss';
+</style>

+ 72 - 0
pages/login/components/change-username.vue

@@ -0,0 +1,72 @@
+<!-- 修改用户名 changeUsername  -->
+<template>
+  <view>
+    <!-- 标题栏 -->
+    <view class="head-box ss-m-b-60">
+      <view class="head-title ss-m-b-20">修改用户名</view>
+      <view class="head-subtitle">用户名仅限修改一次</view>
+    </view>
+
+    <!-- 表单项 -->
+    <uni-forms
+      ref="formRef"
+      v-model="state.model"
+      :rules="state.rules"
+      validateTrigger="bind"
+      labelWidth="140"
+      labelAlign="center"
+    >
+      <uni-forms-item name="username" label="用户名">
+        <uni-easyinput
+          placeholder="请输入用户名"
+          v-model="state.model.username"
+          :inputBorder="false"
+        ></uni-easyinput>
+      </uni-forms-item>
+
+      <view class="editPwd-btn-box ss-m-t-80">
+        <button class="ss-reset-button save-btn ui-Shadow-Main" @tap="changeUsernameSubmit">
+          保存
+        </button>
+      </view>
+    </uni-forms>
+  </view>
+</template>
+
+<script setup>
+  import { computed, watch, ref, reactive, unref } from 'vue';
+  import sheep from '@/sheep';
+  import { username } from '@/sheep/validate/form';
+  import { showAuthModal, closeAuthModal } from '@/sheep/hooks/useModal';
+  const formRef = ref(null);
+
+  // 数据
+  const state = reactive({
+    model: {
+      username: '',
+    },
+    rules: {
+      username,
+    },
+  });
+
+  // 7.修改用户名
+  async function changeUsernameSubmit() {
+    const validate = await unref(formRef)
+      .validate()
+      .catch((error) => {
+        console.log('error: ', error);
+      });
+    if (!validate) return;
+    sheep.$api.user.changeUsername(state.model).then((res) => {
+      if (res.error === 0) {
+        sheep.$store('user').getInfo();
+        closeAuthModal();
+      }
+    });
+  }
+</script>
+
+<style lang="scss" scoped>
+  @import '../index.scss';
+</style>

+ 114 - 0
pages/login/components/reset-password.vue

@@ -0,0 +1,114 @@
+<!-- 重置密码 - resetPassword--  -->
+<template>
+  <view>
+    <!-- 标题栏 -->
+    <view class="head-box ss-m-b-60">
+      <view class="head-title ss-m-b-20">重置密码</view>
+      <view class="head-subtitle">为了您的账号安全,设置密码前请先进行安全验证</view>
+    </view>
+
+    <!-- 表单项 -->
+    <uni-forms
+      ref="resetPasswordRef"
+      v-model="state.model"
+      :rules="state.rules"
+      validateTrigger="bind"
+      labelWidth="140"
+      labelAlign="center"
+    >
+      <uni-forms-item name="mobile" label="手机号">
+        <uni-easyinput
+          placeholder="请输入手机号"
+          v-model="state.model.mobile"
+          type="number"
+          :inputBorder="false"
+        >
+          <template v-slot:right>
+            <button
+              class="ss-reset-button code-btn code-btn-start"
+              :disabled="state.isMobileEnd"
+              :class="{ 'code-btn-end': state.isMobileEnd }"
+              @tap="getSmsCode('resetPassword', state.model.mobile)"
+            >
+              {{ getSmsTimer('resetPassword') }}
+            </button>
+          </template>
+        </uni-easyinput>
+      </uni-forms-item>
+
+      <uni-forms-item name="code" label="验证码">
+        <uni-easyinput
+          placeholder="请输入验证码"
+          v-model="state.model.code"
+          type="number"
+          maxlength="6"
+          :inputBorder="false"
+        ></uni-easyinput>
+      </uni-forms-item>
+
+      <uni-forms-item name="password" label="密码">
+        <uni-easyinput
+          type="password"
+          placeholder="请输入密码"
+          v-model="state.model.password"
+          :inputBorder="false"
+        >
+          <template v-slot:right>
+            <button class="ss-reset-button login-btn-start" @tap="resetPasswordSubmit">
+              确认
+            </button>
+          </template>
+        </uni-easyinput>
+      </uni-forms-item>
+    </uni-forms>
+
+    <button v-if="!isLogin" class="ss-reset-button type-btn" @tap="showAuthModal('accountLogin')">
+      返回登录
+    </button>
+  </view>
+</template>
+
+<script setup>
+  import { computed, watch, ref, reactive, unref } from 'vue';
+  import sheep from '@/sheep';
+  import { code, mobile, password } from '@/sheep/validate/form';
+  import { showAuthModal, closeAuthModal, getSmsCode, getSmsTimer } from '@/sheep/hooks/useModal';
+
+  const resetPasswordRef = ref(null);
+  const isLogin = computed(() => sheep.$store('user').isLogin);
+
+  // 数据
+  const state = reactive({
+    isMobileEnd: false, // 手机号输入完毕
+    model: {
+      mobile: '', //手机号
+      code: '', //验证码
+      password: '', //密码
+    },
+    rules: {
+      code,
+      mobile,
+      password,
+    },
+  });
+
+  // 4.重置密码
+  const resetPasswordSubmit = async () => {
+    const validate = await unref(resetPasswordRef)
+      .validate()
+      .catch((error) => {
+        console.log('error: ', error);
+      });
+    if (!validate) return;
+    sheep.$api.user.resetPassword(state.model).then((res) => {
+      if (res.error === 0) {
+        sheep.$store('user').getInfo();
+        closeAuthModal();
+      }
+    });
+  };
+</script>
+
+<style lang="scss" scoped>
+  @import '../index.scss';
+</style>

+ 194 - 0
pages/login/components/sms-login.vue

@@ -0,0 +1,194 @@
+<!-- 短信登录 - smsLogin  -->
+<template>
+	<view>
+		<!-- 表单项 -->
+		<u-form ref="smsLoginRef" validateTrigger="bind" labelWidth="140" labelAlign="left"
+			labelPosition="top">
+			<u-form-item prop="mobile" label="手机号">
+				<view class="input-line">
+					<u-input placeholder="请输入手机号" v-model="model.mobile" border="none" type="number" maxlength="11">
+					</u-input>
+				</view>
+			</u-form-item>
+
+			<u-form-item prop="code" label="验证码">
+				<view class="code-line flex_box flex_row_between w">
+					<view class="input-line w-370">
+						<u-input placeholder="请输入验证码" v-model="model.code" border="none" type="number" maxlength="6">
+						</u-input>
+					</view>
+					<u-code keepRunning :seconds="seconds" @end="end" @start="start" ref="uCode" @change="codeChange"></u-code>
+					<u-button class="codeBtn" @tap="getCode">{{tips}}</u-button>
+					<!-- <button
+						class="ss-reset-button code-btn code-btn-start"
+						:disabled="getSmsTimer('smsLogin') != '获取验证码'"
+						:class="{ 'code-btn-end': getSmsTimer('smsLogin') != '获取验证码' }"
+						@tap="getSmsCode('smsLogin', model.mobile)"
+					>
+						{{ getSmsTimer('smsLogin') }}
+					</button> -->
+				</view>
+			</u-form-item>
+		</u-form>
+
+		<!--    <button class="ss-reset-button type-btn" @tap="showAuthModal('smsRegister')"> 立即注册 </button>-->
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				tips: '',
+				seconds: 60,
+				model: {
+					mobile: '',
+					code: ''
+				},
+				rules: {
+					mobile: [{
+							required: true,
+							errorMessage: '请输入手机号',
+						},
+						{
+							validateFunction: function(rule, value, data, callback) {
+								if (!test.mobile(value)) {
+									callback('手机号码格式不正确');
+								}
+								return true;
+							},
+						},
+					],
+				}
+			}
+		},
+		methods: {
+			codeChange(text) {
+				this.tips = text;
+			},
+			getCode() {
+				if (this.$refs.uCode.canGetCode) {
+					uni.showLoading({
+						title: '正在获取验证码'
+					})
+					setTimeout(() => {
+						uni.hideLoading();
+						// 这里此提示会被this.start()方法中的提示覆盖
+						uni.$u.toast('验证码已发送');
+						// 通知验证码组件内部开始倒计时
+						this.$refs.uCode.start();
+					}, 2000);
+				} else {
+					// uni.$u.toast('倒计时结束后再发送');
+				}
+			},
+			end() {
+				// uni.$u.toast('倒计时结束');
+			},
+			start() {
+				// uni.$u.toast('倒计时开始');
+			},
+			smsLoginSubmit() {
+				if(!uni.$u.test.mobile(this.model.mobile)){
+					return uni.$u.toast("请输入正确手机号");
+				}
+				if(!this.model.code) {
+					return uni.$u.toast("请输入验证码");
+				}
+				uni.$u.toast("登录成功!");
+				setTimeout(()=>{
+					uni.navigateTo({
+						url:'/pages/index/index'
+					})
+				},1000)
+			}
+		}
+	}
+	// import {reactive, ref, unref} from 'vue';
+	// import sheep from '@/sheep';
+	// import {code, mobile} from '@/sheep/validate/form';
+	// import {closeAuthModal, getSmsCode, getSmsTimer, showAuthModal} from '@/sheep/hooks/useModal';
+	// import {Base64} from 'js-base64'
+	// import {onLoad} from "@dcloudio/uni-app";
+
+	// const smsLoginRef = ref(null);
+
+	//   const props = defineProps({
+	//     agreeStatus: {
+	//       type: Boolean,
+	//       default: false,
+	//     },
+	//   });
+
+	//   // 数据
+	//   const state = reactive({
+	//     isMobileEnd: false, // 手机号输入完毕
+	//     codeText: '获取验证码',
+	//     model: {
+	//       mobile: '', // 手机号
+	//       code: '', // 验证码
+	//       uuid: null, // uuid
+	//       authInfo: {}
+	//     },
+	//     rules: {
+	//       code,
+	//       mobile,
+	//     },
+	//   });
+
+	//   // 2.短信登录
+	//   async function smsLoginSubmit() {
+	//     const validate = await unref(smsLoginRef)
+	//       .validate()
+	//       .catch((error) => {
+	//         console.log('error: ', error);
+	//       });
+	//     if (!validate) return;
+
+	//     state.model.uuid = sheep.$store('user').getUUID('smsLogin')
+	//     if (sheep.$store('app').authInfo){
+	//       state.model.authInfo = sheep.$store('app').authInfo
+	//       // sheep.$store('app').authInfo = null
+	//     }
+	//     // #ifdef MP
+	//     state.model.mpOpenId = uni.getStorageSync('openId');
+	//     // #endif
+	// 		console.log(state.model,'state.mode')
+	//     const data = Base64.encode(JSON.stringify(state.model))
+	//     sheep.$api.user.smsLogin(data).then((response) => {
+	//       sheep.$helper.toast('登录成功')
+	//       closeAuthModal();
+	//     })
+	//   }
+	// 	defineExpose({
+	// 		smsLoginSubmit
+	// 	})
+</script>
+
+<style lang="scss" scoped>
+	// @import '../index.scss';
+	.code-line {
+		width: 100%;
+	}
+	.input-line {
+		display: flex;
+		align-items: center;
+		width: 100%;
+		background-color: #F5F7FB;
+		border-radius: 16rpx;
+		padding-left: 30rpx;
+		height: 88rpx;
+		box-sizing: border-box;
+	}
+	.codeBtn {
+		width: 240rpx;
+		height: 88rpx;
+		background-color: #0256FF;
+		border-radius: 16rpx;
+		color: #fff;
+	}
+
+	.w-370 {
+		width: 370rpx;
+	}
+</style>

+ 202 - 0
pages/login/components/sms-register.vue

@@ -0,0 +1,202 @@
+<!-- 短信注册 - smsRegister  -->
+<template>
+  <view>
+    <!-- 表单项 -->
+    <uni-forms
+      ref="smsRegisterRef"
+      v-model="state.model"
+      :rules="state.rules"
+      validateTrigger="bind"
+      labelWidth="140"
+			labelAlign="left"
+			labelPosition="top"
+    >
+			<uni-forms-item name="mobile" label="手机号">
+				<view class="input-line">
+					 <uni-easyinput
+					   placeholder="请输入手机号"
+					   v-model="state.model.mobile"
+					   :inputBorder="false"
+					   type="number"
+					 >
+					 </uni-easyinput>
+				</view>
+			</uni-forms-item>
+
+			<uni-forms-item name="code" label="验证码">
+				<view class="ss-flex ss-row-between">
+					<view class="input-line w-370">
+						<uni-easyinput
+							placeholder="请输入验证码"
+							v-model="state.model.code"
+							:inputBorder="false"
+							type="number"
+							maxlength="6"
+						>
+						</uni-easyinput>
+					</view>
+					<button
+						class="ss-reset-button code-btn code-btn-start"
+						:disabled="getSmsTimer('smsRegister') != '获取验证码'"
+						:class="{ 'code-btn-end': getSmsTimer('smsRegister') != '获取验证码' }"
+						@tap="getSmsCode('smsRegister', state.model.mobile)"
+					>
+						{{ getSmsTimer('smsRegister') }}
+					</button>
+				</view>
+			</uni-forms-item>
+      <!-- <uni-forms-item name="password" label="密码">
+        <uni-easyinput
+          type="password"
+          placeholder="请输入密码"
+          v-model="state.model.password"
+          :inputBorder="false"
+        >
+          <template v-slot:right>
+            <button class="ss-reset-button login-btn-start" @tap="smsRegisterSubmit"> 注册 </button>
+          </template>
+        </uni-easyinput>
+      </uni-forms-item> -->
+    </uni-forms>
+  </view>
+</template>
+
+<script setup>
+ //  import { computed, ref, reactive, unref,watch } from 'vue';
+ //  import sheep from '@/sheep';
+ //  import { code, mobile } from '@/sheep/validate/form';
+ //  import { closeAuthModal, getSmsCode, getSmsTimer } from '@/sheep/hooks/useModal';
+ //  import {Base64} from 'js-base64'
+
+ //  const props = defineProps({
+ //    agreeStatus: {
+ //      type: Boolean,
+ //      default: false,
+ //    },
+ //  });
+
+ //  const smsRegisterRef = ref(null);
+	
+ //  // 数据
+ //  const state = reactive({
+ //    isMobileEnd: false, // 手机号输入完毕
+ //    model: {
+ //      mobile: '', // 手机号
+ //      code: '', // 验证码
+ //      uuid: '', //uuid
+ //    },
+ //    rules: {
+ //      code,
+ //      mobile,
+ //    },
+ //  });
+	
+
+ //  // 3.短信注册
+ //  async function smsRegisterSubmit() {
+ //    const validate = await unref(smsRegisterRef)
+ //      .validate()
+ //      .catch((error) => {
+ //        console.log('error: ', error);
+ //      });
+ //    if (!validate) return;
+	// 	state.model.uuid = sheep.$store('user').getUUID('smsRegister')
+	// 	let params = {
+	// 		phone:state.model.mobile,
+	// 		uuId:state.model.uuid,
+	// 		code:state.model.code
+	// 	}
+	// 	const res = await sheep.$api.user.verifyShopPhone(params)
+	// 	if(res.code == 200) {
+	// 		uni.navigateTo({
+	// 			url:`/pages/login/register?mobile=${state.model.mobile}`
+	// 		})
+	// 	}
+	// 	return res
+		
+		
+    
+ //    // new Promise((resolve, reject) => {
+ //    //   // let code = getUrlCode().code; //是否存在code
+ //    //   let code = '123456'; //是否存在code
+ //    //   console.log('code:',code)
+ //    //   if (!code) {
+ //    //     //不存在就打开上面的地址进行授权
+ //    //     window.location.href =
+ //    //         "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
+ //    //         import.meta.env.SHOPRO_APPID +
+ //    //         "&redirect_uri=" + encodeURIComponent(import.meta.env.SHOPRO_FRONT_DOMAIN + "/#/pages/index/user") +
+ //    //         "&response_type=code&scope=snsapi_base#wechat_redirect";
+ //    //     code = getUrlCode().code
+ //    //   }
+ //    //   if (code){
+ //    //     resolve(code)
+ //    //   }
+ //    //   else {
+ //    //     reject('code error')
+ //    //   }
+ //    // }).then(
+ //    //     value => {
+ //    //       state.model.uuid = sheep.$store('user').getUUID()
+ //    //       sheep.$api.user.smsRegister({
+ //    //         ...state.model,
+ //    //         // wechatCode: value
+ //    //       }).then((res) => {
+ //    //         closeAuthModal();
+ //    //         uni.showToast({
+ //    //           title: '注册成功',
+ //    //           icon: 'none',
+ //    //           mask: true,
+ //    //         });
+ //    //       });
+ //    //     }
+ //    // ).catch(err => {
+ //    //   sheep.$helper.toast(err)
+ //    // })
+
+ //  }
+	
+ //  function getUrlCode() {
+ //    // 截取url中的code方法
+ //    var url = location.search;
+ //    var theRequest = new Object();
+ //    if (url.indexOf("?") != -1) {
+ //      var str = url.substr(1);
+ //      var strs = str.split("&");
+ //      for (var i = 0; i < strs.length; i++) {
+ //        theRequest[strs[i].split("=")[0]] = strs[i].split("=")[1];
+ //      }
+ //    }
+ //    console.log(theRequest);
+ //    return theRequest;
+ //  }
+
+ //  // 发送验证码
+ //  async function send(){
+ //    sheep.$api.user.validatePhone(Base64.encode(state.model.mobile)).then((res) => {
+ //      console.log('res:',res)
+ //      if (res && res.ifSuccess){
+ //    getSmsCode('smsRegister', state.model.mobile)
+ //      }
+ //    })
+
+ //  }
+	
+	// defineExpose({
+	// 	smsRegisterSubmit
+	// })
+</script>
+
+<style lang="scss" scoped>
+  // @import '../index.scss';
+	.input-line {
+		background-color: #F5F7FB;
+		border-radius: 16rpx;
+		padding-left: 30rpx;
+		height: 88rpx;
+		box-sizing: border-box;
+	}
+	.w-370 {
+		width: 370rpx;
+	}
+</style>

+ 125 - 0
pages/login/components/wechat-login.vue

@@ -0,0 +1,125 @@
+<template>
+  <view>
+    <!--  <view class="head-box ss-flex-col">-->
+    <!--    <view class="ss-flex ss-m-b-20">-->
+    <!--      <view class="head-title ss-m-r-40 head-title-animation">微信登录</view>-->
+    <!--    </view>-->
+    <!--  </view>-->
+    <view>欢迎您登录【若依商城电商系统】</view>
+    <view style="margin-top: 200rpx">
+      <button
+        class="ss-reset-button buy-btn ui-Success-Main"
+        open-type="getPhoneNumber"
+        @getphonenumber="wechatLogin"
+      >
+        <view class="ss-flex">
+          <!--        <image class="auto-login-img" :src="sheep.$url.static('/image/weixin.svg')"/>-->
+          <view>手机号快捷登录</view>
+        </view>
+      </button>
+      <view style="height: 10rpx"></view>
+      <button
+        class="ss-reset-button cancel-btn ui-Shadow-Pioneer-Main"
+        @tap="closeAuthModal"
+      >
+        <view class="ss-flex">
+          <!--        <image class="auto-login-img" :src="sheep.$url.static('/image/weixin.svg')"/>-->
+          <view>暂不登录</view>
+        </view>
+      </button>
+    </view>
+
+    <view class="agreement-text ss-flex">
+      登录遇到问题?点此
+      <button class="btnStyle" open-type="contact">联系客服</button>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import sheep from "@/sheep";
+import { computed, reactive } from "vue";
+import { closeAuthModal } from "@/sheep/hooks/useModal";
+
+const appInfo = computed(() => sheep.$store("app").info);
+
+const state = reactive({
+  protocol: false,
+});
+
+//勾选协议
+function onChange() {
+  state.protocol = !state.protocol;
+}
+
+async function wechatLogin(e) {
+  const loginRes = await sheep.$platform.useProvider("wechat").login(e.detail);
+  if (loginRes) {
+    sheep.$helper.toast("登录成功");
+    closeAuthModal();
+  }
+}
+
+// 查看协议
+function onProtocol(id, title) {
+  closeAuthModal();
+  sheep.$router.go("/pages/public/richtext", {
+    id,
+    title,
+  });
+}
+
+// 请先登录提示
+function handleTip() {
+  uni.showToast({
+    title: "请勾选我已阅读并同意《用户协议》和《隐私政策》!",
+    icon: "none",
+    mask: true,
+  });
+}
+</script>
+
+<style lang="scss" scoped>
+.cancel-btn {
+  width: 100%;
+  height: 72rpx;
+  font-weight: 500;
+  font-size: 28rpx;
+
+  border-radius: 40rpx;
+  background: red;
+  color: $white;
+}
+.btnStyle {
+  border: none;
+  font-size: 15px;
+  padding: 0 !important;
+  color: #82abcc;
+  margin: 0;
+  background-color: transparent;
+  &::after {
+    border: none;
+  }
+}
+.agreement-text {
+  justify-content: center;
+  position: absolute;
+  bottom: 0;
+  width: calc(100% - 68rpx);
+}
+.buy-btn {
+  width: 100%;
+  height: 72rpx;
+  font-weight: 500;
+  font-size: 28rpx;
+
+  border-radius: 40rpx;
+  background: #0dd116;
+  color: $white;
+}
+.auto-login-img {
+  width: 48rpx;
+  height: 48rpx;
+  border-radius: 50%;
+}
+</style>

+ 128 - 0
pages/login/forget-password.vue

@@ -0,0 +1,128 @@
+<template>
+	<s-layout title="忘记密码" :bgStyle="{color:'#fff'}">
+		<view class="content-block">
+			<uni-forms ref="resetPasswordRef" v-model="state.model" :rules="state.rules" validateTrigger="bind" labelWidth="140"
+				labelAlign="left" labelPosition="top">
+				<uni-forms-item name="mobile" label="手机号">
+					<view class="input-line">
+						<uni-easyinput placeholder="请输入手机号" v-model="state.model.mobile" type="number" :inputBorder="false">
+						</uni-easyinput>
+					</view>
+				</uni-forms-item>
+				<uni-forms-item name="password" label="密码">
+					<view class="input-line">
+						<uni-easyinput type="password" placeholder="请输入密码" v-model="state.model.password" :inputBorder="false">
+						</uni-easyinput>
+					</view>
+				</uni-forms-item>
+				<uni-forms-item name="code" label="验证码">
+					<view class="ss-flex ss-row-between">
+						<view class="input-line w-370">
+							<uni-easyinput placeholder="请输入验证码" v-model="state.model.code" :inputBorder="false" type="number"
+								maxlength="6">
+							</uni-easyinput>
+						</view>
+						<button class="ss-reset-button code-btn code-btn-start" :disabled="getSmsTimer('resetPassword') != '获取验证码'"
+							:class="{ 'code-btn-end': getSmsTimer('resetPassword') != '获取验证码' }"
+							@tap="getSmsCode('resetPassword', state.model.mobile)">
+							{{ getSmsTimer('resetPassword') }}
+						</button>
+					</view>
+				</uni-forms-item>
+			
+			
+			</uni-forms>
+			
+			<button class="ss-reset-button toLoginBtn" @tap="resetPasswordSubmit">
+				确认
+			</button>
+		</view>
+	</s-layout>
+</template>
+
+<script setup>
+	import {
+		computed,
+		watch,
+		ref,
+		reactive,
+		unref
+	} from 'vue';
+	import sheep from '@/sheep';
+	import {
+		code,
+		mobile,
+		password
+	} from '@/sheep/validate/form';
+	import {
+		getSmsCode,
+		getSmsTimer
+	} from '@/sheep/hooks/useModal';
+	import {Base64} from 'js-base64'
+
+	const resetPasswordRef = ref(null);
+	const isLogin = computed(() => sheep.$store('user').isLogin);
+
+	// 数据
+	const state = reactive({
+		isMobileEnd: false, // 手机号输入完毕
+		model: {
+			mobile: '', //手机号
+			code: '', //验证码
+			password: '', //密码
+		},
+		rules: {
+			code,
+			mobile,
+			password,
+		},
+	});
+
+	// 4.重置密码
+	const resetPasswordSubmit = async () => {
+		const validate = await unref(resetPasswordRef)
+			.validate()
+			.catch((error) => {
+				console.log('error: ', error);
+			});
+		if (!validate) return;
+		state.model.uuid = sheep.$store('user').getUUID('resetPassword')
+		console.log(state.model,'model')
+		const data = Base64.encode(JSON.stringify(state.model))
+		sheep.$api.user.forgotPassword(data)
+		.then((res) => {
+			if (res.code == 200) {
+				sheep.$helper.toast('修改成功!')
+				setTimeout(()=>{
+					uni.navigateBack()
+				},1500)
+				// sheep.$store('user').getInfo();
+			}
+		})
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import '@/sheep/components/s-auth-modal/index.scss';
+	.content-block {
+		padding: 0 30rpx;
+	}
+	.input-line {
+		background-color: #F5F7FB;
+		border-radius: 16rpx;
+		padding-left: 30rpx;
+		height: 88rpx;
+		box-sizing: border-box;
+	}
+	.toLoginBtn {
+		height: 88rpx;
+		background: #F39801;
+		border-radius: 16rpx;
+		color: #fff;
+		margin-bottom: 32rpx;
+		margin-top: 30rpx;
+	}
+	.w-370 {
+		width: 370rpx;
+	}
+</style>

+ 264 - 0
pages/login/login.vue

@@ -0,0 +1,264 @@
+<template>
+    <view class="content-block">
+			<view class="text-box">
+				<view class="text-box-1">Hello!</view>
+				<view class="text-box-2">欢迎使用象力WMS系统</view>
+			</view>
+      <view class="input-box">
+        <!-- 登录 -->
+        <view class="login-box" v-if="isLogin">
+          <view class="login-box-tab">
+            <view
+              class="ss-m-r-16"
+              v-for="(item, i) in loginList"
+              :key="i"
+              :class="loginType == item.id ? 'activeLogin' : ''"
+              @click="loginTypeClick(item)"
+              >{{ item.name }}</view
+            >
+          </view>
+          <view>
+            <sms-login v-if="loginType == 1" ref="smsLoginRef"></sms-login>
+            <account-login
+              v-if="loginType == 2"
+              ref="accountLoginRef"
+            ></account-login>
+            <button class="toLoginBtn ss-reset-button" @tap="toLogin">
+              登  录
+            </button>
+            <view class="forget-box" @click="changePassword">忘记密码?</view>
+          </view>
+        </view>
+        <!-- <view class="agreement-box flex_box">
+					<radio
+						:checked="protocol"
+						color="var(&#45;&#45;ui-BG-Main)"
+						style="transform: scale(0.8)"
+						@tap.top="onChange"
+					/>
+					<view class="agreement-text flex_box" :class="{'isAgreement': protocol}">
+						我已阅读并同意
+						<view
+							class="tcp-text"
+							@tap.stop="
+								onProtocol(1, '用户协议', 'small:program:user:agreement')
+							"
+						>
+							《用户协议》
+						</view>
+						<view class="agreement-text" :class="{'isAgreement': protocol}">和</view>
+						<view
+							class="tcp-text"
+							@tap.stop="
+								onProtocol(2, '隐私条款', 'small:program:privacy:agreement')
+							"
+						>
+							《隐私条款》
+						</view>
+					</view> -->
+          <view class="safe-box"></view>
+        </view>
+      </view>
+    </view>
+</template>
+
+<script>
+import { onLoad, onShow } from "@dcloudio/uni-app";
+import accountLogin from "./components/account-login.vue";
+import smsLogin from "./components/sms-login.vue";
+// import smsRegister from "./components/sms-register.vue";
+export default {
+	components:{
+		accountLogin,
+		smsLogin
+	},
+	data(){
+		return {
+			loginList:[
+				{
+					name: "验证码登录",
+					id: 1,
+				},
+				{
+					name: "密码登录",
+					id: 2,
+				},
+			],
+			loginType:2,
+			barHeight:0.,
+			protocol:false,
+			isLogin:true,
+			isDisabled:false
+		}
+	},
+	onLoad() {
+		
+	},
+	methods:{
+		loginTypeClick(item) {
+			this.loginType = item.id;
+		},
+		// 忘记密码
+		changePassword() {
+		  uni.navigateTo({
+		    url: "/pages/login/forget-password",
+		  });
+		},
+		//勾选协议
+		onChange() {
+		  this.protocol = !this.protocol;
+		},
+		// 查看协议
+		onProtocol(id, title, key) {
+			uni.navigateTo({
+			  url: `/pages/public/richtext?id=${id}&title=${title}&key=${key}`,
+			});
+		},
+		// 登录
+		toLogin(){
+		  // 同意协议
+		  // if (!this.protocol) {
+				// uni.$u.toast("请先阅读并勾选协议");
+		  //   return;
+		  // }
+		  if (this.loginType == 1) {
+		    this.$refs.smsLoginRef.smsLoginSubmit();
+		  } else {
+		    this.$refs.accountLoginRef.accountLoginSubmit();
+		  }
+		},
+		// 注册下一步
+		nextClick(){
+		  if (this.protocol) {
+		    uni.$u.toast("请先阅读并勾选协议");
+		    return;
+		  }
+		  this.isDisabled = true;
+		  // const res = await smsRegisterRef.value.smsRegisterSubmit();
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.content-block {
+	min-height: 100vh;
+  display: flex;
+  flex-direction: column;
+  // align-items: center;
+  // height: calc(100vh - v-bind(barHeight));
+  padding: 0 30rpx;
+	padding-top: var(--status-bar-height);
+	background: url('@/static/image/login/page-bg.png') no-repeat;
+	background-size: 100% 100%;
+
+	.text-box {
+		color: #1A1A1A;
+		margin-top: 74rpx;
+		.text-box-1 {
+			font-family: "PingFang SC";
+			font-size: 80rpx;
+			font-weight: 600;
+		}
+		.text-box-2 {
+			font-family: "PingFang SC";
+			font-size: 32rpx;
+			font-weight: 500;
+		}
+	}
+
+  .input-box {
+		z-index: 3;
+    border-radius: 40rpx 40rpx 0 0;
+    flex: 1;
+    width: 100%;
+    padding: 40rpx 30rpx 30rpx;
+		margin-top: 30rpx;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+		background: url('@/static/image/login/box-bg.png') no-repeat;
+		background-size: 100% 100%;
+
+    .login-box {
+      &-tab {
+        color: #999;
+        font-size: 32rpx;
+        font-weight: 400;
+        line-height: normal;
+        display: flex;
+        margin-bottom: 50rpx;
+      }
+
+      .activeLogin {
+        color: #333;
+        font-weight: 600;
+        position: relative;
+        z-index: 2;
+
+        &::after {
+          content: "";
+          display: block;
+          width: 66rpx;
+          height: 12rpx;
+          background-color: #0256FF;
+          border-radius: 52rpx;
+          position: absolute;
+          bottom: 0;
+          left: 50%;
+          transform: translateX(-50%);
+          z-index: -1;
+        }
+      }
+    }
+  }
+
+  .toLoginBtn {
+    height: 88rpx;
+    background: linear-gradient(90deg, #59C0E9 0%, #0256FF 100%);
+    border-radius: 16rpx;
+    color: #fff;
+    margin-bottom: 32rpx;
+    margin-top: 30rpx;
+  }
+
+  .toRegisterBtn {
+    color: #333;
+    border: 1px solid #bfc8db;
+    border-radius: 16rpx;
+    height: 88rpx;
+  }
+
+  .forget-box {
+    color: #adb5bd;
+    font-size: 24rpx;
+    font-style: normal;
+    font-weight: 400;
+    line-height: normal;
+    text-align: right;
+    margin-top: 14rpx;
+    text {
+      color: #f39801;
+    }
+  }
+
+  .agreement-box {
+    .tcp-text {
+      color: #f49700;
+    }
+
+    .agreement-text {
+      color: #adb5bd;
+      font-size: 24rpx;
+    }
+		.isAgreement {
+			color: #333;
+		}
+    .safe-box {
+      height: calc(constant(safe-area-inset-bottom) / 5 * 3);
+      height: calc(env(safe-area-inset-bottom) / 5 * 3);
+    }
+  }
+}
+</style>

+ 551 - 0
pages/login/register.vue

@@ -0,0 +1,551 @@
+<template>
+  <s-layout title="新用户注册" :bgStyle="{ color: '#fff' }">
+    <view class="content-block">
+      <uni-forms
+        ref="registerRef"
+        v-model="state.model"
+        :rules="state.rules"
+        validateTrigger="bind"
+        labelWidth="140"
+        labelAlign="left"
+        labelPosition="top"
+      >
+        <uni-forms-item name="shopName" label="店铺名" required>
+          <uni-easyinput
+            placeholder="请输入店铺名"
+            v-model="state.model.shopName"
+            paddingLeft="15"
+          >
+          </uni-easyinput>
+        </uni-forms-item>
+        <uni-forms-item name="shopkeeperName" label="店主姓名" required>
+          <uni-easyinput
+            placeholder="请输入店主姓名"
+            v-model="state.model.shopkeeperName"
+            paddingLeft="15"
+          >
+          </uni-easyinput>
+        </uni-forms-item>
+        <uni-forms-item
+          name="fullArea"
+          label="省市区"
+          required
+          @tap="state.showRegion = true"
+        >
+          <uni-easyinput
+            placeholder="点击选择"
+            v-model="state.fullArea"
+            type="number"
+            paddingLeft="15"
+            :styles="{ disableColor: 'transparent', borderColor: '#e5e5e5' }"
+            disabled
+          >
+            <template #right>
+              <image
+                style="width: 24rpx; height: 15rpx; margin-right: 30rpx"
+                :src="sheep.$url.static('/static/icons/arrow-down-icon.png')"
+                mode=""
+              ></image>
+            </template>
+          </uni-easyinput>
+        </uni-forms-item>
+        <uni-forms-item name="address" label="详细地址" required @tap="chooseAddress">
+          <uni-easyinput
+            placeholder="请输入详细地址"
+            v-model="state.model.address"
+            paddingLeft="15"
+						disabled
+          >
+            <template #right>
+							<view class="right-box" >
+								<image
+								  style="width: 32rpx; height: 30rpx; margin-right: 30rpx"
+								  :src="sheep.$url.static('/static/icons/address-icon.png')"
+								  mode=""
+								></image>
+							</view>
+            </template>
+          </uni-easyinput>
+        </uni-forms-item>
+        <uni-forms-item name="images" label="门头照片" required>
+          <s-uploader
+            v-model:url="state.images"
+            fileMediatype="image"
+            limit="5"
+            mode="grid"
+            :imageStyles="{ width: '200rpx', height: '200rpx' }"
+          />
+        </uni-forms-item>
+        <uni-forms-item
+          name="businessTime"
+          label="营业时间"
+          required
+          @tap="showTime('businessTime')"
+        >
+          <uni-easyinput
+            placeholder="请选择营业时间"
+            v-model="state.model.businessTime"
+            paddingLeft="15"
+            :styles="{ disableColor: 'transparent', borderColor: '#e5e5e5' }"
+            disabled
+          >
+            <template #right>
+              <image
+                style="width: 32rpx; height: 32rpx; margin-right: 30rpx"
+                :src="sheep.$url.static('/static/icons/calendar-icon.png')"
+                mode=""
+              ></image>
+            </template>
+          </uni-easyinput>
+        </uni-forms-item>
+        <uni-forms-item
+          name="deliveryTime"
+          label="送货时间"
+          required
+          @tap="showTime('deliveryTime')"
+        >
+          <!-- 时间弹窗 -->
+          <uni-easyinput
+            placeholder="请选择送货时间"
+            v-model="state.model.deliveryTime"
+            paddingLeft="15"
+            :styles="{ disableColor: 'transparent', borderColor: '#e5e5e5' }"
+            disabled
+          >
+            <template #right>
+              <image
+                style="width: 32rpx; height: 32rpx; margin-right: 30rpx"
+                :src="sheep.$url.static('/static/icons/calendar-icon.png')"
+                mode=""
+              ></image>
+            </template>
+          </uni-easyinput>
+        </uni-forms-item>
+				<uni-forms-item label="邀请码">
+				  <uni-easyinput
+				    placeholder="请输入邀请码"
+				    v-model="state.model.inviteCode"
+				    paddingLeft="15"
+						type="number"
+				  >
+				  </uni-easyinput>
+				</uni-forms-item>
+      </uni-forms>
+      <button class="toLoginBtn ss-reset-button" @tap="toRegister">注册</button>
+      <view class="agreement-box ss-flex">
+       <!-- <radio-group @change="onChange" class="ss-flex ss-col-center">
+          <label class="radio ss-flex"> -->
+            <radio
+              :checked="protocol"
+              color="var(&#45;&#45;ui-BG-Main)"
+              style="transform: scale(0.8)"
+							@tap.top="onChange"
+            />
+            <view class="agreement-text ss-flex ss-col-center ss-m-l-8" :class="{'isAgreement': protocol}">
+              我已阅读并同意
+              <view
+                class="tcp-text"
+                @tap.stop="
+                  onProtocol(1, '用户协议', 'small:program:user:agreement')
+                "
+              >
+                《用户协议》
+              </view>
+            </view>
+        <!--  </label>
+        </radio-group> -->
+      </view>
+    </view>
+		<view class="safe-box"></view>
+
+    <uni-popup
+      ref="timePopupRef"
+      background-color="#fff"
+      :mask-click="false"
+      borderRadius="24rpx"
+    >
+      <su-toolbar
+        cancelColor="#6666"
+        confirmColor="var(--ui-BG-Main)"
+        cancelText="取消"
+        confirmText="确定"
+        @cancel="timePopupRef.close()"
+        @confirm="confirm"
+      ></su-toolbar>
+      <picker-view
+        @change="bindChange"
+        class="picker-view"
+        :value="defaultIndex"
+      >
+        <picker-view-column>
+          <view class="item" v-for="(item, index) in columns[0]" :key="index">{{
+            item
+          }}</view>
+        </picker-view-column>
+        <picker-view-column>
+          <view class="item" v-for="(item, index) in columns[1]" :key="index">{{
+            item
+          }}</view>
+        </picker-view-column>
+      </picker-view>
+    </uni-popup>
+    <!-- 省市区弹窗 -->
+    <su-region-picker
+      v-if="state.showRegion"
+      :show="state.showRegion"
+      @cancel="state.showRegion = false"
+      @confirm="onRegionConfirm"
+    >
+    </su-region-picker>
+
+    <!-- 注册成功提示 -->
+    <uni-popup
+      ref="popupRef"
+      background-color="#fff"
+      :mask-click="false"
+      borderRadius="24rpx"
+    >
+      <view class="popup-box">
+        <view class="ss-flex ss-row-center">
+          <image
+            class="scuss-img"
+            :src="sheep.$url.static('/static/registerScu-img.png')"
+            mode=""
+          ></image>
+        </view>
+        <view class="scuss-text"
+          >您的注册申请已经提交,审核通过之后我们将会短信通知您</view
+        >
+        <button class="toHomeBtn ss-reset-button" @tap="toHome">
+          返回主页
+        </button>
+      </view>
+    </uni-popup>
+    <!-- 	<up-popup :show="registerScuShow" mode="center" :round="12" :closeOnClickOverlay="false" :safeAreaInsetBottom="false">
+		</up-popup> -->
+  </s-layout>
+</template>
+
+<script setup>
+import { onLoad } from "@dcloudio/uni-app";
+import sheep from "@/sheep";
+import _ from "lodash";
+import {
+  shopName,
+  shopkeeperName,
+  fullArea,
+  businessTime,
+  deliveryTime,
+  address,
+  images,
+} from "@/sheep/validate/form";
+import { reactive, ref, unref } from "vue";
+const state = reactive({
+  showRegion: false,
+  codeText: "获取验证码",
+  model: {
+    phone: "",
+    shopName: "",
+    shopkeeperName: "",
+    province: "",
+    city: "",
+    area: "",
+    address: "",
+    businessTime: "",
+    deliveryTime: "",
+		inviteCode:"",
+		latitude:"",//纬度
+		longitude:"",//经度
+  },
+  fullArea: "",
+  images: [],
+  rules: {
+    shopName,
+    shopkeeperName,
+    fullArea,
+    businessTime,
+    deliveryTime,
+    address,
+    images,
+  },
+});
+const protocol = ref(false);
+const popupRef = ref(null);
+const timePopupRef = ref(null);
+
+const registerScuShow = ref(false);
+const defaultIndex = ref([0, 0]);
+const timeType = ref();
+const timeShow = ref(true);
+const timeValue = ref([0, 0]);
+const columns = reactive([
+  [
+    "00:00",
+    "01:00",
+    "02:00",
+    "03:00",
+    "04:00",
+    "05:00",
+    "06:00",
+    "07:00",
+    "08:00",
+    "09:00",
+    "10:00",
+    "11:00",
+    "12:00",
+    "13:00",
+    "14:00",
+    "15:00",
+    "16:00",
+    "17:00",
+    "18:00",
+    "19:00",
+    "20:00",
+    "21:00",
+    "22:00",
+    "23:00",
+  ],
+  [
+    "00:00",
+    "01:00",
+    "02:00",
+    "03:00",
+    "04:00",
+    "05:00",
+    "06:00",
+    "07:00",
+    "08:00",
+    "09:00",
+    "10:00",
+    "11:00",
+    "12:00",
+    "13:00",
+    "14:00",
+    "15:00",
+    "16:00",
+    "17:00",
+    "18:00",
+    "19:00",
+    "20:00",
+    "21:00",
+    "22:00",
+    "23:00",
+  ],
+]);
+
+onLoad((e) => {
+  state.model.phone = e.mobile;
+  getAreaData();
+});
+// 获取省市区
+const getAreaData = () => {
+  if (_.isEmpty(uni.getStorageSync("areaData"))) {
+    sheep.$api.data.area().then((res) => {
+      if (res.code === 200) {
+        uni.setStorageSync("areaData", res.data);
+      }
+    });
+  }
+};
+const chooseAddress = ()=>{
+	uni.chooseLocation({
+		success:(res)=> {
+			state.model.address = res.name
+			state.model.latitude = res.latitude
+			state.model.longitude = res.longitude
+			// console.log('位置名称:' + res.name);
+			// console.log('详细地址:' + res.address);
+			// console.log('纬度:' + res.latitude);
+			// console.log('经度:' + res.longitude);
+		},
+		fail:(err)=>{
+			console.log(err,'err')
+		}
+	});
+}
+// 时间选择
+const showTime = (type) => {
+  timeType.value = type;
+  defaultIndex.value = [0, 0];
+  timePopupRef.value.open("bottom");
+};
+const confirm = () => {
+  state.model[timeType.value] =
+    columns[0][timeValue.value[0]] + "-" + columns[1][timeValue.value[1]];
+  timePopupRef.value.close();
+};
+const bindChange = (e) => {
+  timeValue.value = e.detail.value;
+};
+//勾选协议
+function onChange() {
+  protocol.value = !protocol.value;
+}
+
+const onRegionConfirm = (e) => {
+  const { city_name, district_name, province_name } = e;
+  state.fullArea = `${province_name}-${city_name}-${district_name}`;
+  state.model = {
+    ...state.model,
+    province: province_name,
+    city: city_name,
+    area: district_name,
+  };
+  state.showRegion = false;
+};
+
+const toHome = () => {
+  popupRef.value.close();
+  uni.switchTab({
+    url: "/pages/index/index",
+  });
+};
+
+// async function onSelect({ type, data }) {
+// 	console.log(data,'data')
+//   let msg = '';
+// 	const { data } = await sheep.$api.app.upload(data.tempFiles[0].path, 'default');
+// 	msg = {
+// 		from: 'customer',
+// 		mode: 'image',
+// 		date: new Date().getTime(),
+// 		content: {
+// 			url: fullurl,
+// 			path: path,
+// 		},
+// 	};
+// 	console.log(msg)
+//   // if (msg) {
+//   //   socketSendMsg(msg, () => {
+//   //     scrollBottom();
+//   //   });
+//   //   // scrollBottom();
+//   //   chat.showTools = false;
+//   //   chat.showSelect = false;
+//   //   chat.selectMode = '';
+//   // }
+// }
+
+// 查看协议
+function onProtocol(id, title, key) {
+  sheep.$router.go("/pages/public/richtext", {
+    id,
+    title,
+    key,
+  });
+}
+
+// 注册
+const registerRef = ref(null);
+const toRegister = async () => {
+  if (!protocol.value) {
+    sheep.$helper.toast("请先阅读并勾选协议");
+    return;
+  }
+  const validate = await unref(registerRef)
+    .validate()
+    .catch((error) => {
+      console.log("error: ", error);
+    });
+  if (!validate) return;
+  if (state.images.length == 0) {
+    return sheep.$helper.toast("请上传门头照片");
+  }
+  let params = {
+    ...state.model,
+    picture: state.images.toString(),
+  };
+  sheep.$api.user
+    .addShopRegistration(params)
+    .then((res) => {
+      console.log(res, "res");
+      if (res.code == 200) {
+        // registerScuShow.value = true
+        popupRef.value.open("center");
+      } else {
+        sheep.$helper.toast(res.msg);
+      }
+    })
+    .catch((err) => {
+      sheep.$helper.toast(res.msg);
+    });
+};
+</script>
+
+<style lang="scss" scoped>
+.picker-view {
+  height: 400rpx;
+  margin-top: 20rpx;
+}
+.item {
+  line-height: 34px;
+  text-align: center;
+}
+.content-block {
+  padding: 0 60rpx;
+}
+::v-deep .is-disabled {
+  color: #333;
+}
+.icon {
+  width: 199rpx;
+  height: 199rpx;
+}
+.toLoginBtn {
+  height: 88rpx;
+  background: #f39801;
+  border-radius: 16rpx;
+  color: #fff;
+  margin-bottom: 32rpx;
+  margin-top: 30rpx;
+}
+
+.agreement-box {
+  .tcp-text {
+    color: #f49700;
+  }
+
+  .agreement-text {
+    color: #adb5bd;
+    font-size: 24rpx;
+  }
+	.isAgreement {
+		color: #333;
+	}
+}
+
+.safe-box {
+		width: 100%;
+    height: calc(constant(safe-area-inset-bottom) / 5 * 3);
+    height: calc(env(safe-area-inset-bottom) / 5 * 3);
+  }
+
+.popup-box {
+  width: 590rpx;
+  padding: 40rpx;
+  .scuss-img {
+    width: 240rpx;
+    height: 240rpx;
+  }
+  .scuss-text {
+    color: #17191c;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: bold;
+    margin: 10rpx 0 28rpx;
+    padding: 0 28rpx;
+  }
+  .toHomeBtn {
+    height: 80rpx;
+    background: #f39801;
+    border-radius: 16rpx;
+    color: #fff;
+    font-size: 32rpx;
+  }
+}
+
+.right-box {
+	height: 100%;
+}
+
+</style>

+ 18 - 0
pages/picking-task/index.vue

@@ -0,0 +1,18 @@
+<template>
+	<view>
+		<u-navbar height="80rpx" title="拣货任务" bgColor="transparent" autoBack>
+		<!-- 	<view class="u-nav-slot btn-left" slot="left" @click="meunClick">
+				<image src="@/static/image/home/bulletpoint.png" mode=""></image>
+			</view> -->
+			<!-- <view class="u-nav-slot btn-right" slot="right">
+				<image src="@/static/image/home/notice-icon.png" mode=""></image>
+			</view> -->
+		</u-navbar>
+	</view>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

BIN
static/image/home/bulletpoint.png


BIN
static/image/home/home-top-img.png


BIN
static/image/home/icon-cgrk.png


BIN
static/image/home/icon-chcx.png


BIN
static/image/home/icon-jhrw.png


BIN
static/image/home/icon-pdrw.png


BIN
static/image/home/notice-icon.png


BIN
static/image/login/box-bg.png


BIN
static/image/login/login-img.png


BIN
static/image/login/page-bg-2.png


BIN
static/image/login/page-bg.png