Prechádzať zdrojové kódy

密码过期功能完成

于添 5 mesiacov pred
rodič
commit
5d5ffae0bf

+ 4 - 0
src/views/auth/login/login.vue

@@ -90,6 +90,9 @@
 						<a-tab-pane key="userSms" :tab="$t('login.phoneSms')" force-render>
 							<phone-login-form />
 						</a-tab-pane>
+<!--						<a-tab-pane key="restPass" :tab="$t('login.phoneSms')" force-render>-->
+<!--							<Restlogin />-->
+<!--						</a-tab-pane>-->
 					</a-tabs>
 					<three-login />
 				</a-card>
@@ -102,6 +105,7 @@
 	import loginApi from '@/api/auth/loginApi'
 	import phoneLoginForm from './phoneLoginForm.vue'
 	import threeLogin from './threeLogin.vue'
+	// import Restlogin from './restlogin.vue'
 	import smCrypto from '@/utils/smCrypto'
 	import { required } from '@/utils/formRules'
 	import { afterLogin } from './util'

+ 38 - 33
src/views/auth/login/util.js

@@ -15,41 +15,46 @@ export const afterLogin = async (loginToken) => {
 	const loginUser = await loginApi.getLoginUser()
 	const globalStore = useGlobalStore()
 	const myResourceStore = useMyResourceStore()
-	globalStore.setUserInfo(loginUser)
-	myResourceStore.getUserInfo()
-	tool.data.set('USER_INFO', loginUser)
 
-	// 获取用户的菜单
-	const menu = await userCenterApi.userLoginMenu()
-	let indexMenu = routerUtil.getIndexMenu(menu).path
-	tool.data.set('MENU', menu)
-	// 重置系统默认应用
-	tool.data.set('SNOWY_MENU_MODULE_ID', menu[0].id)
-	message.success('登录成功')
-	if (!!tool.data.get('LAST_VIEWS_PATH')) {
-		// 如果有缓存,将其登录跳转到最后访问的路由
-		indexMenu = tool.data.get('LAST_VIEWS_PATH')
-	}
-	// 如果存在退出后换新账号登录,进行重新匹配,匹配无果则默认首页
-	if (menu) {
-		let routerTag = 0
-		menu.forEach((item) => {
-			if (item.children) {
-				if (JSON.stringify(item.children).indexOf(indexMenu) > -1) {
-					routerTag++
+	// loginUser expired
+
+		globalStore.setUserInfo(loginUser)
+		myResourceStore.getUserInfo()
+		tool.data.set('USER_INFO', loginUser)
+
+		// 获取用户的菜单
+		const menu = await userCenterApi.userLoginMenu()
+		let indexMenu = routerUtil.getIndexMenu(menu).path
+		tool.data.set('MENU', menu)
+		// 重置系统默认应用
+		tool.data.set('SNOWY_MENU_MODULE_ID', menu[0].id)
+		message.success('登录成功')
+		if (!!tool.data.get('LAST_VIEWS_PATH')) {
+			// 如果有缓存,将其登录跳转到最后访问的路由
+			indexMenu = tool.data.get('LAST_VIEWS_PATH')
+		}
+		// 如果存在退出后换新账号登录,进行重新匹配,匹配无果则默认首页
+		if (menu) {
+			let routerTag = 0
+			menu.forEach((item) => {
+				if (item.children) {
+					if (JSON.stringify(item.children).indexOf(indexMenu) > -1) {
+						routerTag++
+					}
 				}
+			})
+			if (routerTag === 0) {
+				// 取首页
+				indexMenu = routerUtil.getIndexMenu(menu).path
 			}
-		})
-		if (routerTag === 0) {
-			// 取首页
-			indexMenu = routerUtil.getIndexMenu(menu).path
 		}
-	}
-	dictApi.dictTree().then((data) => {
-		// 设置字典到store中
-		tool.data.set('DICT_TYPE_TREE_DATA', data)
-	})
-	await router.replace({
-		path: indexMenu
-	})
+		dictApi.dictTree().then((data) => {
+			// 设置字典到store中
+			tool.data.set('DICT_TYPE_TREE_DATA', data)
+		})
+		await router.replace({
+			path: indexMenu
+		})
+
+
 }

+ 13 - 4
src/views/tlogin/login.vue

@@ -1,12 +1,12 @@
 <template>
 	<div class="login_background">
 		<div style="display: flex;width: 100%; height: 100%; justify-content: center; align-items: center">
-				<a-card>
+				<a-card style="width: 387px">
 					<div style="margin-bottom: 20px">
 						<span style="font-size: 20px;">教师登录</span>
 					</div>
 
-					<a-form ref="loginForm" :model="ruleForm" :rules="rules">
+					<a-form ref="loginForm" v-show="activeKey == 'userAccount'" :model="ruleForm" :rules="rules">
 						<a-form-item name="account">
 							<a-input
 								v-model:value="ruleForm.account"
@@ -58,6 +58,7 @@
 							</a-button>
 						</a-form-item>
 					</a-form>
+					<Restlogin ref="restlogin" v-show="activeKey == 'restPass'"/>
 				</a-card>
 		</div>
 	</div>
@@ -67,6 +68,7 @@
 	import loginApi from '@/api/auth/loginApi'
 	import phoneLoginForm from './phoneLoginForm.vue'
 	import threeLogin from './threeLogin.vue'
+	import Restlogin from './restlogin.vue'
 	import smCrypto from '@/utils/smCrypto'
 	import { required } from '@/utils/formRules'
 	import { afterLogin } from './util'
@@ -80,7 +82,8 @@
 		name: 'Login',
 		components: {
 			phoneLoginForm,
-			threeLogin
+			threeLogin,
+			Restlogin
 		},
 		data() {
 			return {
@@ -178,13 +181,19 @@
 						password: smCrypto.doSm2Encrypt(this.ruleForm.password),
 						validCode: this.ruleForm.validCode,
 						validCodeReqNo: this.ruleForm.validCodeReqNo,
+
 						//根据平台不同传不同参0后台(管理员)1老师2学生
 						eduIdentity : 1
 					}
 					// 获取token
 					try {
 						const loginToken = await loginApi.login(loginData)
-						afterLogin(loginToken)
+						afterLogin(loginToken,()=>{
+							this.activeKey = 'restPass'
+							this.$nextTick(() => {
+								this.$refs.restlogin.setData(loginToken)
+							})
+						})
 					} catch (err) {
 						this.loading = false
 						this.loginCaptcha()

+ 210 - 0
src/views/tlogin/restlogin.vue

@@ -0,0 +1,210 @@
+<template>
+	<div >
+		<a-form ref="loginForm" :model="ruleForm" :rules="rules">
+<!--			<a-form-item name="account">-->
+<!--				<a-input-->
+<!--					v-model:value="ruleForm.account"-->
+<!--					:placeholder="$t('login.accountPlaceholder')"-->
+<!--					size="large"-->
+<!--					@keyup.enter="login"-->
+<!--				>-->
+<!--					<template #prefix>-->
+<!--						<UserOutlined class="login-icon-gray" />-->
+<!--					</template>-->
+<!--				</a-input>-->
+<!--			</a-form-item>-->
+			<span style="margin-bottom: 20px;  color: red">密码已过期请输入新密码</span>
+			<a-form-item name="password">
+				<a-input-password
+					v-model:value="ruleForm.password"
+					placeholder="请输入新密码"
+					size="large"
+					autocomplete="off"
+					@keyup.enter="login"
+				>
+					<template #prefix>
+						<LockOutlined class="login-icon-gray" />
+					</template>
+				</a-input-password>
+			</a-form-item>
+			<a-form-item name="newPassword">
+				<a-input-password
+					v-model:value="ruleForm.newPassword"
+					placeholder="请再次输入新密码"
+					size="large"
+					autocomplete="off"
+					@keyup.enter="login"
+				>
+					<template #prefix>
+						<LockOutlined class="login-icon-gray" />
+					</template>
+				</a-input-password>
+			</a-form-item>
+
+
+			<a-form-item>
+				<a-button type="primary" class="w-full" :loading="loading" round size="large" @click="login"
+				>{{ $t('login.signIn') }}
+				</a-button>
+			</a-form-item>
+		</a-form>
+	</div>
+</template>
+
+<script>
+	import loginApi from '@/api/auth/loginApi'
+	import phoneLoginForm from './phoneLoginForm.vue'
+	import threeLogin from './threeLogin.vue'
+	import smCrypto from '@/utils/smCrypto'
+	import { required } from '@/utils/formRules'
+	import { afterLogin } from './util'
+	import config from '@/config'
+	import configApi from '@/api/dev/configApi'
+	import tool from '@/utils/tool'
+	import { globalStore, iframeStore, keepAliveStore, viewTagsStore } from '@/store'
+	import { mapActions, mapState } from 'pinia'
+	import {message} from "ant-design-vue";
+	import userCenterApi from '@/api/sys/userCenterApi'
+
+	export default {
+		name: 'Login',
+		components: {
+			phoneLoginForm,
+			threeLogin
+		},
+		data() {
+			return {
+				token : '',
+				activeKey: 'userAccount',
+				captchaOpen: config.SYS_BASE_CONFIG.SNOWY_SYS_DEFAULT_CAPTCHA_OPEN,
+				validCodeBase64: '',
+				ruleForm: {
+					account: '',
+					password: '',
+					newPassword: '',
+					validCode: '',
+					validCodeReqNo: '',
+					autologin: false,
+					eduIdentity: '0'
+				},
+				rules: {
+					// account: [required(this.$t('login.accountError'), 'blur')],
+					password: [required(this.$t('login.PWError'), 'blur')],
+					reestpassword: [required(this.$t('login.PWError'), 'blur')]
+				},
+				loading: false,
+				config: {
+					lang: tool.data.get('APP_LANG') || this.$CONFIG.LANG,
+					theme: tool.data.get('APP_THEME') || 'default'
+				},
+				lang: [
+					{
+						name: '简体中文',
+						value: 'zh-cn'
+					},
+					{
+						name: 'English',
+						value: 'en'
+					}
+				]
+			}
+		},
+		computed: {
+			...mapState(globalStore, ['sysBaseConfig']),
+		},
+		watch: {
+			'config.theme': function (val) {
+				document.body.setAttribute('data-theme', val)
+			},
+			'config.lang': function (val) {
+				this.$i18n.locale = val
+				tool.data.set('APP_LANG', val)
+			}
+		},
+		created() {
+			this.clearViewTags()
+			this.clearKeepLive()
+			this.clearIframeList()
+		},
+		mounted() {
+			let formData = ref(config.SYS_BASE_CONFIG)
+			configApi.configSysBaseList().then((data) => {
+				if (data) {
+					data.forEach((item) => {
+						formData.value[item.configKey] = item.configValue
+					})
+					this.captchaOpen = formData.value.SNOWY_SYS_DEFAULT_CAPTCHA_OPEN
+					tool.data.set('SNOWY_SYS_BASE_CONFIG', formData.value)
+					this.setSysBaseConfig(formData.value)
+					this.refreshSwitch()
+				}
+			})
+		},
+		methods: {
+			...mapActions(keepAliveStore, ['clearKeepLive']),
+			...mapActions(viewTagsStore, ['clearViewTags']),
+			...mapActions(iframeStore, ['clearIframeList']),
+			...mapActions(globalStore, ['setSysBaseConfig']),
+			// 通过开关加载内容
+			refreshSwitch() {
+				// 判断是否开启验证码
+				if (this.captchaOpen === 'true') {
+					// 加载验证码
+					this.loginCaptcha()
+					// 加入校验
+					this.rules.validCode = [required(this.$t('login.validError'), 'blur')]
+				}
+			},
+			// 获取验证码
+			loginCaptcha() {
+				loginApi.getPicCaptcha().then((data) => {
+					this.validCodeBase64 = data.validCodeBase64
+					this.ruleForm.validCodeReqNo = data.validCodeReqNo
+				})
+			},
+			// 用户名密码登录
+			async login() {
+				this.$refs.loginForm.validate().then(async () => {
+					this.loading = true
+					const loginData = {
+						// account: this.ruleForm.account,
+						// 密码进行SM2加密,传输过程中看到的只有密文,后端存储使用hash
+						password: this.ruleForm.password,
+						newPassword: this.ruleForm.newPassword,
+						// validCode: this.ruleForm.validCode,
+						// validCodeReqNo: this.ruleForm.validCodeReqNo,
+						// eduIdentity: this.ruleForm.eduIdentity
+					}
+					if(loginData.password != loginData.newPassword){
+						message.error('两个密码不一致');
+						return
+					}
+					tool.data.set('TOKEN', this.token)
+					tool.cookie.set('Token', this.token)
+					let res = await userCenterApi.userUpdatePassword(loginData)
+					console.log('修改你密码',res)
+					afterLogin(this.token)
+					this.loading = false
+					// // 获取token
+					// try {
+					// 	const loginToken = await loginApi.login(loginData)
+					// 	afterLogin(loginToken)
+					// } catch (err) {
+					// 	this.loading = false
+					// 	this.loginCaptcha()
+					// }
+				})
+			},
+			configLang(key) {
+				this.config.lang = key
+			},
+			setData(token){
+				this.token = token
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	@import 'login';
+</style>

+ 44 - 34
src/views/tlogin/util.js

@@ -7,7 +7,7 @@ import { message } from 'ant-design-vue'
 import { useGlobalStore, useMyResourceStore } from '@/store'
 import routerUtil from '@/utils/routerUtil'
 
-export const afterLogin = async (loginToken) => {
+export const afterLogin = async (loginToken,callBack) => {
 	tool.data.set('TOKEN', loginToken)
 	//cookie里添加 token
 	tool.cookie.set('Token', loginToken)
@@ -15,43 +15,53 @@ export const afterLogin = async (loginToken) => {
 	const loginUser = await loginApi.getLoginUser()
 	const globalStore = useGlobalStore()
 	const myResourceStore = useMyResourceStore()
-	globalStore.setUserInfo(loginUser)
-	myResourceStore.getUserInfo()
-	tool.data.set('USER_INFO', loginUser)
+	console.log('应该是什么',loginUser)
+	// loginUser expired
+	if(loginUser.expired == 1 && callBack){
+		tool.data.remove('TOKEN', loginToken)
+		tool.cookie.remove('Token', loginToken)
+		message.error('密码已过期')
+		callBack()
+	}else{
+		globalStore.setUserInfo(loginUser)
+		myResourceStore.getUserInfo()
+		tool.data.set('USER_INFO', loginUser)
 
-	// 获取用户的菜单
-	const menu = await userCenterApi.userLoginMenu()
-	let indexMenu = routerUtil.getIndexMenu(menu).path
-	tool.data.set('MENU', menu)
-	// 重置系统默认应用
-	tool.data.set('SNOWY_MENU_MODULE_ID', menu[0].id)
-	message.success('登录成功')
-	if (!!tool.data.get('LAST_VIEWS_PATH')) {
-		// 如果有缓存,将其登录跳转到最后访问的路由
-		indexMenu = tool.data.get('LAST_VIEWS_PATH')
-	}
-	// 如果存在退出后换新账号登录,进行重新匹配,匹配无果则默认首页
-	if (menu) {
-		let routerTag = 0
-		menu.forEach((item) => {
-			if (item.children) {
-				if (JSON.stringify(item.children).indexOf(indexMenu) > -1) {
-					routerTag++
+		// 获取用户的菜单
+		const menu = await userCenterApi.userLoginMenu()
+		let indexMenu = routerUtil.getIndexMenu(menu).path
+		tool.data.set('MENU', menu)
+		// 重置系统默认应用
+		tool.data.set('SNOWY_MENU_MODULE_ID', menu[0].id)
+		message.success('登录成功')
+		if (!!tool.data.get('LAST_VIEWS_PATH')) {
+			// 如果有缓存,将其登录跳转到最后访问的路由
+			indexMenu = tool.data.get('LAST_VIEWS_PATH')
+		}
+		// 如果存在退出后换新账号登录,进行重新匹配,匹配无果则默认首页
+		if (menu) {
+			let routerTag = 0
+			menu.forEach((item) => {
+				if (item.children) {
+					if (JSON.stringify(item.children).indexOf(indexMenu) > -1) {
+						routerTag++
+					}
 				}
+			})
+			if (routerTag === 0) {
+				// 取首页
+				indexMenu = routerUtil.getIndexMenu(menu).path
 			}
-		})
-		if (routerTag === 0) {
-			// 取首页
-			indexMenu = routerUtil.getIndexMenu(menu).path
 		}
+		dictApi.dictTree().then((data) => {
+			// 设置字典到store中
+			tool.data.set('DICT_TYPE_TREE_DATA', data)
+		})
+		await router.replace({
+			path: '/'
+		})
+		location.reload()
 	}
-	dictApi.dictTree().then((data) => {
-		// 设置字典到store中
-		tool.data.set('DICT_TYPE_TREE_DATA', data)
-	})
-	await router.replace({
-		path: '/'
-	})
-	location.reload()
+
 
 }