瀏覽代碼

增加 手持机 安全检查登录相关逻辑

dedsudiyu 2 周之前
父節點
當前提交
c68dc46c24

+ 9 - 3
api/request/request.js

@@ -448,8 +448,14 @@ export function loginTimeout(params) {
 	uni.removeStorageSync('userId');
 	uni.removeStorageSync('userType');
 	setTimeout(function() {
-		uni.redirectTo({
-			url: '/pages/views/login/login',
-		});
+		if(uni.getStorageSync('patrolLoginType')){
+			uni.redirectTo({
+				url: '/pages/views/login/patrolLogin',
+			});
+		}else{
+			uni.redirectTo({
+				url: '/pages/views/login/login',
+			});
+		}
 	}, 2000);
 }

+ 8 - 0
pages.json

@@ -45,6 +45,14 @@
 				"navigationStyle": "custom" //关闭原生导航
 			}
 		},
+		{
+			"path": "pages/views/login/patrolLogin", //登录
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationBarTextStyle": "white", //导航文字颜色
+				"navigationStyle": "custom" //关闭原生导航
+			}
+		},
 		// {
 		// 	"path": "pages/views/login/accountLogin", //账号密码登录
 		// 	"style": {

+ 6 - 0
pages/views/home/home.vue

@@ -25,6 +25,12 @@
 
 		},
 		onShow() {
+			if(uni.getStorageSync('patrolLoginType')){
+				uni.reLaunch({
+					url: '/pages_safetyCheck/views/safetyCheck',
+				});
+				return
+			}
 			uni.removeStorageSync('planSensorList');
 			if (uni.getStorageSync('token') && uni.getStorageSync('userId') && uni.getStorageSync('userType')) {
 				this.systemUserPersonalData();

+ 2 - 1
pages/views/login/login.vue

@@ -80,6 +80,7 @@
 			}
 		},
 		onShow() {
+			uni.setStorageSync('patrolLoginType',false);
 			this.getConfigInfo();
 		},
 		methods: {
@@ -159,7 +160,7 @@
 						})
 					}else{
 						uni.showToast({
-							title: '非教职工/学生账号,无法登录本系统.',
+							title: '该账号无法登录本系统,请联系管理员.',
 							icon: "none",
 							duration: 3000
 						});

+ 524 - 0
pages/views/login/patrolLogin.vue

@@ -0,0 +1,524 @@
+<!-- 登录 -->
+<template>
+	<view id="patrolLogin">
+		<img class="login-max-big" :src="loginBanner">
+		<view class="login-box">
+			<view class="tabTitle">
+				<view class="tabTitle_li" @tap="tabClick(index)" :key="index" v-for="(item,index) in tabText">
+					<view :class="{on:curTab==index}" class="tabTitle_text">{{item}}</view>
+					<!-- <view :class="{on:curTab==index}" class="tabTitle_across"></view> -->
+				</view>
+			</view>
+			<view class="input-max-box-one">
+				<view class="input-box">
+					<img :src="imagesUrl('commonality/img_log_in_account.png')">
+					<input type="text" v-model="username" @confirm="login()"
+					placeholder="请输入账号" maxlength="20">
+				</view>
+			</view>
+			<view class="input-max-box-two">
+				<view class="input-box">
+					<img :src="imagesUrl('commonality/img_log_in_password.png')">
+					<input type="password" v-model="password" @confirm="login()"
+					placeholder="请输入密码" maxlength="20">
+				</view>
+			</view>
+			<view class="check-box" @click="checkboxChange()">
+				<img v-if="checkedType" :src="imagesUrl('commonality/icon_13.png')">
+				<img v-if="!checkedType" :src="imagesUrl('commonality/icon_12.png')"/>
+				<view>记住我</view>
+			</view>
+			<view class="button-box" @click="login()">登录</view>
+			<view class="passwrod-button-box" @click="forgotPasswordButton()">忘记密码?</view>
+		</view>
+		<!-- <view class="loginButton" @click="backButton()">统一身份认证登录</view> -->
+	</view>
+</template>
+
+<script>
+	import md5 from '@/utils/md5.js'
+	import {
+		config
+	} from '@/api/request/config.js'
+	import {
+		login,
+		configInfo,
+		getConfigByType,
+		systemAppletRolePermission,
+		systemSubjectCheckIsAdminOrSafeUser,
+		securityDataStatisticsGetUserIdentity
+	} from '@/pages/api/index.js'
+	import {
+		Encrypt,
+		Decrypt
+	} from '@/utils/secret.js'
+	export default {
+		data() {
+			return {
+				identityStatus: 1,
+				username: "",
+				password: "",
+				checkedType: false,
+				loginBanner: uni.getStorageSync('loginBanner'),
+				infoList: [], //模板消息Id
+				tabText: ['师生登录'],
+				curTab: 0,
+				pageType: 0,
+				supplierType: false,
+			}
+		},
+
+		onLoad(option) {
+			//供应商注册成功后返回到供应商注册页面
+			if (option.status) {
+				this.identityStatus = 2
+			}
+			if (uni.getStorageSync('userName') && uni.getStorageSync('password')) {
+				this.username = uni.getStorageSync('userName');
+				this.password = uni.getStorageSync('password');
+				this.checkedType = true;
+			}
+		},
+		onShow() {
+			uni.setStorageSync('patrolLoginType',true);
+			this.getConfigInfo();
+		},
+		methods: {
+			backButton(){
+				uni.navigateBack();
+			},
+			//顶部tab点击
+			tabClick(index) {
+				this.curTab = index;
+			},
+			//跳转忘记密码
+			forgotPasswordButton(){
+				uni.navigateTo({
+					url: '/pages_basics/views/forgotPassword/forgotPassword',
+				});
+			},
+			//登录
+			async login() {
+				let self = this;
+				let obj = {
+					account: this.username,
+					password: md5.hex_md5(this.password),
+				}
+				const {
+					data
+				} = await login(obj)
+				if (data.code == 200) {
+					if(data.data.userType == 0 || data.data.userType == 1 || data.data.userType == 2){
+						uni.setStorageSync('dataBoardType', false);
+						uni.setStorageSync('token', data.data.token);
+						uni.setStorageSync('userId', data.data.userId);
+						uni.setStorageSync('isInitPwd', true);
+						// userType 0-系统 1-教职工 2-学生 3-大屏
+						uni.setStorageSync('userType', data.data.userType == 0 || data.data.userType == 1 ? '1' :
+							(data.data.userType == 2 ? '2' : (data.data.userType == 3 ? '3' : 'none')));
+						if (this.checkedType) {
+							uni.setStorageSync('userName', this.username)
+							uni.setStorageSync('password', this.password)
+						} else {
+							uni.removeStorageSync('userName')
+							uni.removeStorageSync('password')
+						}
+						//等待配置与字段获取到后跳转
+						Promise.all([
+							//获取开发配置
+							this.getConfigByType(),
+							//获取权限字段
+							this.systemAppletRolePermission(),
+							//查询是否是管理员/安全员
+							this.systemSubjectCheckIsAdminOrSafeUser()
+							//查询身份
+							// this.securityDataStatisticsGetUserIdentity()
+						]).then((result) => {
+							uni.reLaunch({
+								url: '/pages_safetyCheck/views/safetyCheck',
+							});
+						}).catch((error) => {
+							uni.showToast({
+								title: '数据异常,请稍候再试!',
+								icon: "none",
+								duration: 3000
+							});
+						})
+					}else{
+						uni.showToast({
+							title: '该账号无法登录本系统,请联系管理员.',
+							icon: "none",
+							duration: 3000
+						});
+					}
+				}
+			},
+			//获取权限字段
+			async systemAppletRolePermission() {
+				let self = this;
+				const {
+					data
+				} = await systemAppletRolePermission();
+				if (data.code == 200) {
+					uni.setStorageSync('permissions', data.data.data)
+					uni.setStorageSync('controlsRestrict', data.data.roleKeys ? data.data.roleKeys : [])
+					uni.setStorageSync('user', data.data.userInfo)
+				}
+			},
+			switchClick() {
+				if (this.identityStatus == 1) {
+					this.identityStatus = 2;
+				} else {
+					this.identityStatus = 1;
+				}
+			},
+			//查询公共配置
+			async getConfigInfo() {
+				const {
+					data
+				} = await configInfo({
+					type: '1,2,4'
+				});
+				if (data.code == 200) {
+					let list = JSON.parse(data.data)
+					let newData = {};
+					list.forEach((item) => {
+						let obj = JSON.parse(item.configValue)
+						newData = {
+							...newData,
+							...obj
+						}
+					})
+					uni.setStorageSync('circularLogo', config.base_url + newData.circularLogo)
+					uni.setStorageSync('rectangleLogo', config.base_url + newData.rectangleLogo)
+					uni.setStorageSync('videoCover', config.base_url + newData.videoCover)
+					this.$set(this, 'loginBanner', config.base_url + newData.loginBanner);
+					uni.setStorageSync('loginBanner', config.base_url + newData.loginBanner)
+					this.$set(this, 'supplierType', newData.supplier);
+					uni.setStorageSync('supplierType', newData.supplier)
+					uni.setStorageSync('homepageBanner', config.base_url + newData.homepageBanner)
+				}
+			},
+			//获取开发配置
+			async getConfigByType() {
+				const {
+					data
+				} = await getConfigByType({
+					category: 2,
+					configType: 5
+				});
+				if (data.code == 200) {
+					let obj = JSON.parse(data.data.configValue)
+					//文件预览地址
+					uni.setStorageSync('filePreviewUrl', 'https://' + obj.fileExtranetUrl)
+					//小程序视频地址
+					uni.setStorageSync('cameraExtranetAgent', 'https://' + obj.cameraExtranetAgent)
+					//MQTT地址
+					uni.setStorageSync('mqttUrl', Decrypt(obj.mqttExtranetUrl))
+					//MQTT地址-内网
+					uni.setStorageSync('mqttIntranetUrl', Decrypt(obj.mqttIntranetUrl))
+					//MQTT账号
+					uni.setStorageSync('mqttUser', Decrypt(obj.mqttExtranetUser))
+					//MQTT密码
+					uni.setStorageSync('mqttPassword', Decrypt(obj.mqttExtranetPassword))
+					//文件浏览环境
+					uni.setStorageSync('fileBrowseEnvironment','http://'+Decrypt(obj.fileBrowseEnvironment))
+					uni.setStorageSync('fileBrowseEnvironmentS','https://'+Decrypt(obj.fileBrowseEnvironment))
+					uni.setStorageSync('fileBrowseEnvironmentExtranet','http://'+Decrypt(obj.fileBrowseEnvironmentExtranet))
+					uni.setStorageSync('fileBrowseEnvironmentExtranetS','https://'+Decrypt(obj.fileBrowseEnvironmentExtranet))
+				}
+			},
+			//查询是否是管理员/安全员
+			async systemSubjectCheckIsAdminOrSafeUser(){
+				let self = this;
+				const {
+					data
+				} = await systemSubjectCheckIsAdminOrSafeUser();
+				if (data.code == 200) {
+					if(data.data.isSafe || data.data.isAdmin){
+						uni.setStorageSync('subAdmin','1');
+					}else{
+						uni.setStorageSync('subAdmin','0');
+					}
+				}
+			},
+			//查询身份
+			async securityDataStatisticsGetUserIdentity(routeUrl) {
+				let self = this;
+				const {
+					data
+				} = await securityDataStatisticsGetUserIdentity();
+				if(data.schoolAdmin){
+					//校级管理员
+					uni.setStorageSync('identityData',{
+						type:'schoolAdmin'
+					});
+				}else if(data.collegeAdmin){
+					//院级管理员
+					uni.setStorageSync('identityData',{
+						type:'collegeAdmin'
+					});
+				}else if(data.schoolGroup){
+					//校级督导组
+					uni.setStorageSync('identityData',{
+						type:'schoolGroup',
+						groupIds:data.groupIds
+					});
+				}else if(data.collegeGroup){
+					//院级督导组
+					uni.setStorageSync('identityData',{
+						type:'collegeGroup',
+						groupIds:data.groupIds
+					});
+				}else{
+					uni.removeStorageSync('identityData');
+				}
+			},
+			checkboxChange() {
+				this.checkedType = !this.checkedType;
+			},
+
+		},
+
+	}
+</script>
+
+<style lang="stylus" scoped>
+	#patrolLogin {
+		height: 100%;
+		width: 100%;
+
+		background #f5f5f5;
+		position relative;
+		.login-max-big {
+			width: 750rpx;
+			height: 1177rpx;
+			z-index: 0;
+		}
+
+		.login-box {
+			z-index: 3;
+			position: absolute;
+			top: 430rpx;
+			left: 46rpx;
+			width: 658rpx;
+			height: 700rpx;
+
+			// background #fff
+			/* 切换按钮 */
+			.tabTitle {
+				display flex;
+				width: 100%;
+				height: 100rpx;
+				position: absolute;
+				// top: 50rpx;
+				justify-content: center;
+
+				.tabTitle_li {
+					width: 168rpx;
+					text-align center;
+
+					.tabTitle_text {
+						display: inline-block;
+						font-size: 32rpx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #333333;
+						line-height: 90rpx;
+
+						&.on {
+							color: #0183FA;
+						}
+					}
+
+					.tabTitle_across {
+						width: 100rpx;
+						height: 4rpx;
+						background: #0183FA;
+						border-radius: 2rpx;
+						margin-left 30rpx;
+						display none;
+
+						&.on {
+							display block;
+						}
+					}
+
+				}
+			}
+
+			border-radius:20rpx;
+
+			.input-max-box-one {
+				overflow: hidden;
+				// margin-top: 68rpx;
+
+				.input-box {
+					display flex;
+					width: 600rpx;
+					height: 80rpx;
+					border: 1rpx solid #e0e0e0;
+					border-radius: 40rpx;
+					margin: 147rpx auto 0;
+
+					img {
+						width: 28rpx;
+						height: 32rpx;
+						margin: 24rpx 31rpx;
+					}
+
+					input {
+						flex: 1;
+						font-size: 24rpx;
+						height: 80rpx;
+						line-height: 80rpx;
+						margin-right: 31rpx;
+					}
+				}
+
+				.text-box {
+					height: 59rpx;
+					line-height: 59rpx;
+					color: #DC1616;
+					font-size: 24rpx;
+					margin-left: 102rpx;
+				}
+			}
+
+			.input-max-box-two {
+				margin-top: 40rpx;
+
+				.input-box {
+					display flex;
+					width: 600rpx;
+					height: 80rpx;
+					border: 1rpx solid #e0e0e0;
+					border-radius: 40rpx;
+					margin: 0 auto 0;
+
+					img {
+						width: 30rpx;
+						height: 32rpx;
+						margin: 24rpx 30rpx;
+					}
+
+					input {
+						flex: 1;
+						font-size: 24rpx;
+						height: 80rpx;
+						line-height: 80rpx;
+						margin-right: 31rpx;
+					}
+				}
+
+				.text-box {
+					height: 59rpx;
+					line-height: 59rpx;
+					color: #DC1616;
+					font-size: 24rpx;
+					margin-left: 102rpx;
+				}
+			}
+
+			.check-box {
+				margin: 30rpx 0 30rpx 104rpx;
+				width: 300rpx;
+				height: 50rpx;
+				display: flex;
+
+				img {
+					margin-top: 10rpx;
+					width: 32rpx;
+					height: 32rpx;
+					margin-right: 10rpx;
+				}
+
+				view {
+					font-size: 24rpx;
+					line-height: 50rpx;
+				}
+			}
+
+			.button-box {
+				width: 600rpx;
+				line-height: 80rpx;
+				background: #0183FA;
+				border-radius: 40rpx;
+				font-size: 36rpx;
+				color: #fff;
+				text-align center;
+				margin: 0 auto 0;
+			}
+			.passwrod-button-box{
+				line-height:60rpx;
+				width:120rpx;
+				margin:20rpx 0 0 40rpx;
+				color:#333;
+				font-size:24rpx;
+			}
+			/* 供应商注册 */
+			.supplier {
+				display: flex;
+				justify-content: space-between;
+				margin: 30rpx 40rpx 0;
+
+				.supplier_l {
+					font-size: 24rpx;
+					font-family: PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					line-height: 24rpx;
+				}
+
+				.supplier_r {
+					font-size: 24rpx;
+					font-family: PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					line-height: 24rpx;
+
+					>text {
+						color: #0183FA;
+					}
+				}
+			}
+
+			/* 供应商切换 */
+			.switch_btn {
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				font-size: 24rpx;
+				font-family: PingFang SC;
+				font-weight: 400;
+				color: #0183FA;
+				line-height: 24rpx;
+				margin-top: 60rpx;
+
+				>img {
+					width: 24rpx;
+					height: 24rpx;
+					margin-left: 12rpx;
+				}
+			}
+		}
+		.loginButton{
+			position: absolute;
+			width:100%;
+			bottom:40rpx;
+			height:80rpx;
+			line-height:80rpx;
+			text-align: center;
+			color:#0183fa;
+			font-size:28rpx;
+		}
+		.top-back {
+			z-index: 2;
+			position: absolute;
+			top: 261rpx;
+			left: 375rpx;
+			height: 296rpx;
+			width: 366rpx;
+		}
+	}
+</style>

+ 48 - 0
pages_safetyCheck/views/safetyCheck.vue

@@ -39,6 +39,7 @@
 			<img class="subBtn-img" @click="saoCode()"
 				:src="imagesUrl('safetyCheck/icon_aqjc_saoma.png')">
 		</view>
+		<view class="patrolLoginButton" v-if="patrolLoginType" @click="clickOut()">退出登录</view>
 		<!-- 弹窗部分 -->
 		<view class="shade" v-if="dialogVisible">
 			<view class="null-box" @click="dialogClose()"></view>
@@ -85,6 +86,9 @@
 
 <script>
 	import {
+		logout
+	} from '@/pages/api/index.js'
+	import {
 		config
 	} from '@/api/request/config.js'
 	import {
@@ -98,6 +102,7 @@
 		name: "planDetail",
 		data() {
 			return {
+				patrolLoginType:uni.getStorageSync('patrolLoginType'),
 				pageType: 0,
 				tabText: [{
 						name: '校级检查',
@@ -151,6 +156,37 @@
 
 		},
 		methods: {
+			
+			//退出按钮
+			clickOut() {
+				let self = this;
+				uni.showModal({
+					// title: '确认要退出吗?',
+					content: '确认要退出吗',
+					cancelColor: "#999",
+					confirmColor: "#0183FA",
+					success: function(res) {
+						if (res.confirm) {
+							self.logout();
+						} else if (res.cancel) {}
+					}
+				});
+			},
+			//退出登录
+			async logout() {
+				let self = this;
+				const {
+					data
+				} = await logout();
+				if (data.code == 200) {
+					uni.removeStorageSync('token');
+					uni.removeStorageSync('userId');
+					uni.removeStorageSync('userType');
+					uni.redirectTo({
+						url: '/pages/views/login/patrolLogin',
+					});
+				}
+			},
 			//滚动加载事件
 			scrollGet() {
 				let self = this;
@@ -638,6 +674,18 @@
 				height: 160rpx;
 			}
 		}
+		.patrolLoginButton{
+			position: absolute;
+			top:80rpx;
+			right:20rpx;
+			color:#fff;
+			background-color: red;
+			padding:10rpx 20rpx;
+			border-radius:10rpx;
+			font-size:24rpx;
+			line-height:30rpx;
+			height:32rpx;
+		}
 		.shade-box {
 			height: 100%;
 			width: 100%;