|
@@ -0,0 +1,419 @@
|
|
|
+<template>
|
|
|
+ <el-container class="login-container">
|
|
|
+ <el-header height="40px" style="background: #fff6e8;" class="p0">
|
|
|
+ <top v-if="topLoadin" @userNavTo="userTo"></top>
|
|
|
+ </el-header>
|
|
|
+ <el-main class="p0">
|
|
|
+ <login-top-menus :routers="visibleRouters"></login-top-menus>
|
|
|
+ <login-form-banner ref="loginForm" :is-login="isLogin" :login-form="loginForm" :login-rules="loginRules"
|
|
|
+ :loading="loading"></login-form-banner>
|
|
|
+ <div class="fx-column fx-cen-cen">
|
|
|
+ <index-card-elective class="mt20" style="width: 1350px; overflow: hidden;"/>
|
|
|
+ </div>
|
|
|
+ <bottom-p class="mt20"></bottom-p>
|
|
|
+ <el-dialog v-if="dialogVisible" title :visible.sync="dialogVisible" width="850px">
|
|
|
+ <complete-profile @completed="handleProfileCompleted"
|
|
|
+ style="margin-left:250px; padding:0 30px"></complete-profile>
|
|
|
+ </el-dialog>
|
|
|
+ <el-dialog v-if="forgetDialogVisiable" :visible.sync="forgetDialogVisiable" title="忘记密码" width="650px"
|
|
|
+ style="height:600px">
|
|
|
+ <forget-password @resetPwdSuccess="forgetDialogVisiable=false"></forget-password>
|
|
|
+ </el-dialog>
|
|
|
+ </el-main>
|
|
|
+ </el-container>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import store from '@/store'
|
|
|
+import router from '@/router'
|
|
|
+import { mapActions, mapGetters } from 'vuex'
|
|
|
+import auth from '@/utils/auth'
|
|
|
+import { getFrontInitialRouters } from '@/api/system/user'
|
|
|
+import forgetPassword from '@/views/components/forget-pwd.vue'
|
|
|
+import CompleteProfile from '@/views/components/complete-profile.vue'
|
|
|
+import RouterHelpMixin from '@/router/router-help-mixin'
|
|
|
+import LoginTopInfo from '@/views/index/components/login-top-info'
|
|
|
+import LoginFormBanner from '@/views/index/components/login-form-banner'
|
|
|
+import LoginTopMenus from '@/views/index/components/login-top-menus'
|
|
|
+import loginCheckMixin from '@/views/components/blocks/index-login-check-mixin'
|
|
|
+import IndexCardElective from '@/views/index/components/index-card-elective'
|
|
|
+
|
|
|
+export default {
|
|
|
+ mixins: [RouterHelpMixin, loginCheckMixin],
|
|
|
+ components: {
|
|
|
+ IndexCardElective,
|
|
|
+ LoginTopMenus,
|
|
|
+ LoginFormBanner,
|
|
|
+ LoginTopInfo,
|
|
|
+ forgetPassword,
|
|
|
+ CompleteProfile
|
|
|
+ },
|
|
|
+ provide() {
|
|
|
+ return {
|
|
|
+ to: this.to,
|
|
|
+ userTo: this.userTo,
|
|
|
+ handleLogin: this.handleLogin,
|
|
|
+ logout: this.logout,
|
|
|
+ handleForgetPwd: this.handleForgetPwd
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ forgetDialogVisiable: false,
|
|
|
+ topLoadin: true,
|
|
|
+ isLogin: auth.getToken(),
|
|
|
+ loginObj: {},
|
|
|
+ loading: false,
|
|
|
+ gradeLoading: false,
|
|
|
+ navList: [],
|
|
|
+ loginForm: {
|
|
|
+ username: '',
|
|
|
+ password: '',
|
|
|
+ // rememberMe: false,
|
|
|
+ // code: "",
|
|
|
+ // uuid: "",
|
|
|
+ relation: 1,
|
|
|
+ grade: 2,
|
|
|
+ year: ''
|
|
|
+ },
|
|
|
+ loginRules: {
|
|
|
+ relation: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ trigger: 'blur',
|
|
|
+ message: '请选择学生端或者老师端'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ grade: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ trigger: 'blur',
|
|
|
+ message: '请选择学校类别'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ username: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ trigger: 'blur',
|
|
|
+ message: '用户名不能为空'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ password: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ trigger: 'blur',
|
|
|
+ message: '密码不能为空'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ code: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ trigger: 'change',
|
|
|
+ message: '验证码不能为空'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ options: {
|
|
|
+ img: store.getters.avatar //裁剪图片的地址
|
|
|
+ },
|
|
|
+ submitLoading: false,
|
|
|
+ schoolData: [],
|
|
|
+ gradeData: [],
|
|
|
+ classData: [],
|
|
|
+ areaSchoolAndYears: {},
|
|
|
+ isSecd: false,
|
|
|
+ times: 120,
|
|
|
+ form: {
|
|
|
+ username: '',
|
|
|
+ phoneNumber: '',
|
|
|
+ code: '',
|
|
|
+ schoolId: '',
|
|
|
+ gradeId: [],
|
|
|
+ clazzId: []
|
|
|
+ },
|
|
|
+ subjectData: [],
|
|
|
+ dialogVisible: false,
|
|
|
+ id: 0,
|
|
|
+ props: {
|
|
|
+ lazy: true,
|
|
|
+ lazyLoad(node, resolve) {
|
|
|
+ const { level } = node
|
|
|
+ setTimeout(() => {
|
|
|
+ const nodes = Array.from({
|
|
|
+ length: level + 1
|
|
|
+ }).map((item) => {
|
|
|
+ let a = ''
|
|
|
+ if (level == '0') {
|
|
|
+ a = '省'
|
|
|
+ } else if (level == '1') {
|
|
|
+ a = '市'
|
|
|
+ } else {
|
|
|
+ a = '区'
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ value: 1212,
|
|
|
+ label: `选项${a} `,
|
|
|
+ leaf: level >= 2
|
|
|
+ }
|
|
|
+ })
|
|
|
+ // 通过调用resolve将子节点数据返回,通知组件数据加载完成
|
|
|
+ resolve(nodes)
|
|
|
+ }, 1000)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapGetters([
|
|
|
+ 'isFrontStudent',
|
|
|
+ 'isFrontTeacher',
|
|
|
+ 'isFrontMaster',
|
|
|
+ 'currentUser'
|
|
|
+ ]),
|
|
|
+ visibleRouters() {
|
|
|
+ return this.navList.filter((r) => r.meta?.title && !r.hidden)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ let u = navigator.userAgent
|
|
|
+ let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
|
|
|
+ if (isAndroid) {
|
|
|
+ let url = this.$route.fullPath.split('?')[1]
|
|
|
+ if (url && !this.isLogin) {
|
|
|
+ let urlData = url.split('&')
|
|
|
+ for (let i = 0; i < urlData.length; i++) {
|
|
|
+ this.loginObj[urlData[i].split('=')[0]] =
|
|
|
+ urlData[i].split('=')[1]
|
|
|
+ }
|
|
|
+ if (this.loginObj.username && this.loginObj.password) {
|
|
|
+ // 直接发起登录
|
|
|
+ this.loading = true
|
|
|
+ this.Login(this.loginObj)
|
|
|
+ .then(() => {
|
|
|
+ this.isLogin = true
|
|
|
+ this.loading = false
|
|
|
+ this.getUser()
|
|
|
+ this.getNav()
|
|
|
+ // this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.loading = false
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.getUser()
|
|
|
+ this.getNav()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ ...mapActions(['GenerateRoutes', 'Login', 'LogOut', 'GetInfo']),
|
|
|
+ getNav() {
|
|
|
+ console.log(
|
|
|
+ 'getNav called',
|
|
|
+ 'real menu=' + !!(this.islogin && this.currentUser.isBind),
|
|
|
+ this.currentUser,
|
|
|
+ this.isLogin
|
|
|
+ )
|
|
|
+ if (this.isLogin) {
|
|
|
+ this.GenerateRoutes().then((accessRoutes) => {
|
|
|
+ console.log('GenerateRoutes accessRoutes', accessRoutes)
|
|
|
+ router.addRoutes(accessRoutes) // 动态添加可访问路由表
|
|
|
+ this.navList = JSON.parse(
|
|
|
+ JSON.stringify(
|
|
|
+ this.$store.state.permission.topbarRouters
|
|
|
+ )
|
|
|
+ )
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ getFrontInitialRouters().then((res) => {
|
|
|
+ this.navList = res.data.map((r) => ({
|
|
|
+ path: r.path,
|
|
|
+ meta: r.meta
|
|
|
+ }))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ gouAction(data) {
|
|
|
+ // 22.6.7 hht 作废此方法,只处理了有限级跳转
|
|
|
+ if (data && data.length > 0) {
|
|
|
+ if (data[0].children && data[0].children.length > 0) {
|
|
|
+ if (
|
|
|
+ data[0].children[0].children &&
|
|
|
+ data[0].children[0].children.length > 0
|
|
|
+ ) {
|
|
|
+ return data[0].children[0].children.path
|
|
|
+ } else {
|
|
|
+ return data[0].path + '/' + data[0].children[0].path
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return data[0].path
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleClick(data) {
|
|
|
+ let item = JSON.parse(JSON.stringify(data))
|
|
|
+ let routes = [] //三级菜单
|
|
|
+ let second = [] //二级
|
|
|
+ let routesTo = []
|
|
|
+ if (item.children) {
|
|
|
+ //有二级菜单
|
|
|
+ item.children.forEach((item2) => {
|
|
|
+ if (item2.children) {
|
|
|
+ item2.children.forEach((item3) => {
|
|
|
+ item3.path =
|
|
|
+ item.path + '/' + item2.path + '/' + item3.path
|
|
|
+ })
|
|
|
+ if (routes.length == 0 && item2.children.length) {
|
|
|
+ //一级菜单下面第一个有3个菜单的二级菜单
|
|
|
+ routes = item2.children
|
|
|
+ routesTo = item2.children
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ routesTo = item.children
|
|
|
+ }
|
|
|
+ item2.path = item.path + '/' + item2.path
|
|
|
+ item2.level = 2
|
|
|
+ second.push(item2)
|
|
|
+ })
|
|
|
+ let fal = false
|
|
|
+ second.forEach((item) => {
|
|
|
+ if (!fal && item.children && item.children.length > 0) {
|
|
|
+ auth.setActiveMenu(item.path)
|
|
|
+ fal = true
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ auth.setMenuTab(second)
|
|
|
+ this.three = true
|
|
|
+ this.$store.commit('SET_SIDEBAR_ROUTERS', routes)
|
|
|
+ } else {
|
|
|
+ //没有二级菜单
|
|
|
+ this.$store.commit('SET_SIDEBAR_ROUTERS', [])
|
|
|
+ this.$router.push({
|
|
|
+ path: item.path
|
|
|
+ })
|
|
|
+ }
|
|
|
+ let path = this.findLeafDescendantPath(data)
|
|
|
+ if (path) {
|
|
|
+ this.$router.push({
|
|
|
+ path: path
|
|
|
+ })
|
|
|
+ auth.setMenuListAction(path)
|
|
|
+ } else {
|
|
|
+ }
|
|
|
+ auth.setMenuList(routes)
|
|
|
+ },
|
|
|
+ logout() {
|
|
|
+ this.$confirm('确定注销并退出系统吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }).then(() => {
|
|
|
+ this.LogOut().then(() => {
|
|
|
+ this.isLogin = false
|
|
|
+ this.getNav()
|
|
|
+ this.topLoadin = false
|
|
|
+ this.loginObj = {}
|
|
|
+ setTimeout(() => {
|
|
|
+ this.topLoadin = true
|
|
|
+ this.$router.push({ path: '/login' })
|
|
|
+ }, 10)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ getUser() {
|
|
|
+ if (!this.isLogin) return
|
|
|
+ this.GetInfo().then((response) => {
|
|
|
+ this.dialogVisible = !this.currentUser.isBind
|
|
|
+ this.topLoadin = false
|
|
|
+ setTimeout(() => {
|
|
|
+ this.topLoadin = true
|
|
|
+ }, 10)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ userTo() {
|
|
|
+ //跳转至个人中心
|
|
|
+ if (this.isLogin && !this.currentUser.isBind) {
|
|
|
+ this.dialogVisible = true
|
|
|
+ this.$message.error('请先完善信息!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const pcRouter = this.navList.find((r) => r.path == '/user')
|
|
|
+ if (pcRouter) this.to(pcRouter)
|
|
|
+ },
|
|
|
+ to(url) {
|
|
|
+ console.log('will go to', url)
|
|
|
+ auth.removeMenuTab()
|
|
|
+ auth.removeMenuList()
|
|
|
+ if (this.isLogin && this.currentUser.isBind) {
|
|
|
+ if (url == '/login') {
|
|
|
+ window.location.reload()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ url ==
|
|
|
+ '/index?type=http://8.134.76.179/index.php?m=login&token=94c750ea0f7f41d7753327792e937589'
|
|
|
+ ) {
|
|
|
+ window.open(
|
|
|
+ 'http://8.134.76.179/index.php?m=login&token=' +
|
|
|
+ this.currentUser.code
|
|
|
+ )
|
|
|
+ } else if (url == '/user/profile') {
|
|
|
+ this.$router.push({
|
|
|
+ path: url
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.handleClick(url)
|
|
|
+ }
|
|
|
+ } else if (this.isLogin && this.currentUser.isBind) {
|
|
|
+ this.dialogVisible = true
|
|
|
+ this.$message.error('请先完善信息!')
|
|
|
+ } else {
|
|
|
+ this.$message.error('请先登陆!')
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleForgetPwd() {
|
|
|
+ this.forgetDialogVisiable = true
|
|
|
+ },
|
|
|
+ handleLogin() {
|
|
|
+ this.$refs.loginForm.validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ this.loading = true
|
|
|
+ this.Login(this.loginForm)
|
|
|
+ .then(() => {
|
|
|
+ this.isLogin = true
|
|
|
+ this.loading = false
|
|
|
+ this.getUser()
|
|
|
+ this.getNav()
|
|
|
+ // this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.loading = false
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleProfileCompleted() {
|
|
|
+ this.dialogVisible = !this.currentUser.isBind
|
|
|
+ this.getNav() //重新获取菜单
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.login-container {
|
|
|
+ background-color: #F2F2F2;
|
|
|
+}
|
|
|
+
|
|
|
+/deep/ .el-dialog {
|
|
|
+ background: url("../../assets/images/img_bg1.png") no-repeat;
|
|
|
+ /* background-size: 100% 100%;
|
|
|
+ height: 580px; */
|
|
|
+ max-height: 520px;
|
|
|
+ width: 800px;
|
|
|
+}
|
|
|
+</style>
|