wangtao 2 年 前
コミット
e850354158

BIN
public/favicon.png


+ 20 - 19
public/index.html

@@ -6,7 +6,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta name="renderer" content="webkit">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <link rel="icon" href="<%= BASE_URL %>favicon.png">
     <title>
         <%= webpackConfig.name %>
     </title>
@@ -20,13 +20,14 @@
             padding: 0px;
             /* background-color: #7171C6; */
         }
+
         .chromeframe {
             margin: 0.2em 0;
             background: #ccc;
             color: #000;
             padding: 0.2em 0;
         }
-        
+
         #loader-wrapper {
             position: fixed;
             top: 0;
@@ -35,7 +36,7 @@
             height: 100%;
             z-index: 999999;
         }
-        
+
         #loader {
             display: block;
             position: relative;
@@ -54,7 +55,7 @@
             animation: spin 2s linear infinite;
             z-index: 1001;
         }
-        
+
         #loader:before {
             content: "";
             position: absolute;
@@ -71,7 +72,7 @@
             -ms-animation: spin 3s linear infinite;
             animation: spin 3s linear infinite;
         }
-        
+
         #loader:after {
             content: "";
             position: absolute;
@@ -88,7 +89,7 @@
             -webkit-animation: spin 1.5s linear infinite;
             animation: spin 1.5s linear infinite;
         }
-        
+
         @-webkit-keyframes spin {
             0% {
                 -webkit-transform: rotate(0deg);
@@ -101,7 +102,7 @@
                 transform: rotate(360deg);
             }
         }
-        
+
         @keyframes spin {
             0% {
                 -webkit-transform: rotate(0deg);
@@ -114,7 +115,7 @@
                 transform: rotate(360deg);
             }
         }
-        
+
         #loader-wrapper .loader-section {
             position: fixed;
             top: 0;
@@ -126,15 +127,15 @@
             -ms-transform: translateX(0);
             transform: translateX(0);
         }
-        
+
         #loader-wrapper .loader-section.section-left {
             left: 0;
         }
-        
+
         #loader-wrapper .loader-section.section-right {
             right: 0;
         }
-        
+
         .loaded #loader-wrapper .loader-section.section-left {
             -webkit-transform: translateX(-100%);
             -ms-transform: translateX(-100%);
@@ -142,7 +143,7 @@
             -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
             transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
         }
-        
+
         .loaded #loader-wrapper .loader-section.section-right {
             -webkit-transform: translateX(100%);
             -ms-transform: translateX(100%);
@@ -150,13 +151,13 @@
             -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
             transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
         }
-        
+
         .loaded #loader {
             opacity: 0;
             -webkit-transition: all 0.3s ease-out;
             transition: all 0.3s ease-out;
         }
-        
+
         .loaded #loader-wrapper {
             visibility: hidden;
             -webkit-transform: translateY(-100%);
@@ -165,15 +166,15 @@
             -webkit-transition: all 0.3s 1s ease-out;
             transition: all 0.3s 1s ease-out;
         }
-        
+
         .no-js #loader-wrapper {
             display: none;
         }
-        
+
         .no-js h1 {
             color: #222222;
         }
-        
+
         #loader-wrapper .load_title {
             font-family: 'Open Sans';
             color: #FFF;
@@ -186,7 +187,7 @@
             opacity: 1;
             line-height: 30px;
         }
-        
+
         #loader-wrapper .load_title span {
             font-weight: normal;
             font-style: italic;
@@ -208,4 +209,4 @@
     </div>
 </body>
 
-</html>
+</html>

+ 45 - 38
src/api/login.js

@@ -2,59 +2,66 @@ import request from '@/utils/request'
 
 // 登录方法(常规)
 export function login(username, password, code, uuid) {
-  const data = {
-    username,
-    password,
-    code,
-    uuid
-  }
-  return request({
-    url: '/login',
-    method: 'post',
-    data: data
-  })
+    const data = {
+        username,
+        password,
+        code,
+        uuid
+    }
+    return request({
+        url: '/login',
+        method: 'post',
+        data: data
+    })
 }
 // 登录方法(ERP)
 export function loginERP(data) {
-  return request({
-    url: '/loginByCenter',
-    method: 'post',
-    data
-  })
+    return request({
+        url: '/loginByCenter',
+        method: 'post',
+        data
+    })
 }
 
 // 注册方法
 export function register(data) {
-  return request({
-    url: '/register',
-    headers: {
-      isToken: false
-    },
-    method: 'post',
-    data: data
-  })
+    return request({
+        url: '/register',
+        headers: {
+            isToken: false
+        },
+        method: 'post',
+        data: data
+    })
+}
+// 登录方法(SaaS)
+export function loginSaaS(data) {
+    return request({
+        url: '/loginBySa',
+        method: 'post',
+        data
+    })
 }
-
 // 获取用户详细信息
 export function getInfo() {
-  return request({
-    url: '/getInfo',
-    method: 'get'
-  })
+    return request({
+        url: '/getInfo',
+        method: 'get'
+    })
 }
 
 // 退出方法
 export function logout() {
-  return request({
-    url: '/logout',
-    method: 'post'
-  })
+    return request({
+        url: '/logout',
+        method: 'post'
+    })
 }
 
 // 获取验证码
 export function getCodeImg() {
-  return request({
-    url: '/captchaImage',
-    method: 'get'
-  })
-}
+    return request({
+        url: '/captchaImage',
+        method: 'get'
+    })
+}

BIN
src/assets/images/bg.png


BIN
src/assets/logo/logo-b.png


BIN
src/assets/logo/logo.png


+ 49 - 23
src/permission.js

@@ -11,43 +11,69 @@ const whiteList = ['/login', '/auth-redirect', '/bind', '/register']
 
 router.beforeEach((to, from, next) => {
     NProgress.start()
-    if (getToken()) {
-        to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
-            /* has token*/
-        if (to.path === '/login') {
-            next({ path: '/' })
-            NProgress.done()
-        } else {
-            if (store.getters.roles.length === 0) {
-                // 判断当前用户是否已拉取完user_info信息
+    let url = window.location.hash
+    if (url.indexOf("userNameSaaS") > 0 && url.indexOf("passWordSaaS") > 0) {
+        if (store.getters.roles.length === 0) {
+            let params = {
+                username: undefined,
+                password: undefined
+            }
+            let data = url.split("login?userNameSaaS=")[1].split("&passWordSaaS=")
+            params.username = decrypt(decodeURIComponent(data[0]))
+            params.password = decrypt(decodeURIComponent(data[1]))
+            store.dispatch("LoginSaaS", params).then((res) => {
                 store.dispatch('GetInfo').then(() => {
                     store.dispatch('GenerateRoutes').then(accessRoutes => {
                         // 根据roles权限生成可访问的路由表
                         router.addRoutes(accessRoutes) // 动态添加可访问路由表
                         next({...to, replace: true }) // hack方法 确保addRoutes已完成
                     })
-                }).catch(err => {
-                    store.dispatch('LogOut').then(() => {
-                        // Message.error(err)
-                        next({ path: '/deviceManager/#/' })
-                    })
                 })
-            } else {
+            }).catch(() => {
                 next()
-            }
+            })
+        } else {
+            next()
         }
     } else {
-        // 没有token
-        if (whiteList.indexOf(to.path) !== -1) {
-            // 在免登录白名单,直接进入
-            next()
+        if (getToken()) {
+            to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
+                /* has token*/
+            if (to.path === '/login') {
+                next({ path: '/' })
+                NProgress.done()
+            } else {
+                if (store.getters.roles.length === 0) {
+                    // 判断当前用户是否已拉取完user_info信息
+                    store.dispatch('GetInfo').then(() => {
+                        store.dispatch('GenerateRoutes').then(accessRoutes => {
+                            // 根据roles权限生成可访问的路由表
+                            router.addRoutes(accessRoutes) // 动态添加可访问路由表
+                            next({...to, replace: true }) // hack方法 确保addRoutes已完成
+                        })
+                    }).catch(err => {
+                        store.dispatch('LogOut').then(() => {
+                            // Message.error(err)
+                            next({ path: '/deviceManager/#/' })
+                        })
+                    })
+                } else {
+                    next()
+                }
+            }
         } else {
-            next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
-            NProgress.done()
+            // 没有token
+            if (whiteList.indexOf(to.path) !== -1) {
+                // 在免登录白名单,直接进入
+                next()
+            } else {
+                next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
+                NProgress.done()
+            }
         }
     }
 })
 
 router.afterEach(() => {
     NProgress.done()
-})
+})

+ 14 - 2
src/store/modules/user.js

@@ -1,4 +1,4 @@
-import { login, loginERP, logout, getInfo } from '@/api/login'
+import { login, loginERP, logout, loginSaaS, getInfo } from '@/api/login'
 import { getToken, setToken, removeToken } from '@/utils/auth'
 
 const user = {
@@ -61,6 +61,18 @@ const user = {
                 })
             })
         },
+        // 登录SaaS
+        LoginSaaS({ commit }, userInfo) {
+            return new Promise((resolve, reject) => {
+                loginSaaS({ username: userInfo.username, password: userInfo.password }).then(res => {
+                    setToken(res.data)
+                    commit('SET_TOKEN', res.data)
+                    resolve()
+                }).catch(error => {
+                    reject(error)
+                })
+            })
+        },
 
         // 获取用户信息
         GetInfo({ commit, state }) {
@@ -110,4 +122,4 @@ const user = {
     }
 }
 
-export default user
+export default user

+ 19 - 3
src/views/login.vue

@@ -130,7 +130,16 @@ export default {
       let url = this.$route.query
       if(url.username && url.password){
         let data = {username:url.username,password:url.password}
+        data.password = encrypt(encodeuricomponent(this.loginForm.password));
         this.handleLoginERP(data)
+      }else if(url.userNameSaaS && url.passWordSaaS){
+        let data = {
+          username:decrypt(decodeURIComponent(url.userNameSaaS)),
+          password:decrypt(decodeURIComponent(url.passWordSaaS))
+        }
+        Cookies.set("username20220313", data.username, { expires: 30 });
+        Cookies.set("password20220313", url.passWordSaaS, { expires: 30 });
+        this.handleLoginSaaS(data)
       }else{
         this.getCode();
         this.getCookie();
@@ -164,7 +173,7 @@ export default {
       const rememberMe = Cookies.get('rememberMe20220313')
       this.loginForm = {
         username: username === undefined ? this.loginForm.username : username,
-        password: password === undefined ? this.loginForm.password : decrypt(password),
+        password: password === undefined ? this.loginForm.password : decrypt(decodeURIComponent(password)),
         rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
       };
     },
@@ -186,7 +195,7 @@ export default {
     memory(){
       if (this.loginForm.rememberMe) {
         Cookies.set("username20220313", this.loginForm.username, { expires: 30 });
-        Cookies.set("password20220313", encrypt(this.loginForm.password), { expires: 30 });
+        Cookies.set("password20220313", encrypt(encodeuricomponent(this.loginForm.password)), { expires: 30 });
         Cookies.set('rememberMe20220313', this.loginForm.rememberMe, { expires: 30 });
       } else {
         Cookies.remove("username20220313");
@@ -198,8 +207,15 @@ export default {
       this.$store.dispatch("LoginERP", data).then((res) => {
         this.$router.push({ path: "/index"}).catch(()=>{});
       }).catch((err) => {
-        location.href = '/deviceManager/#/';
+        location.href = '/vdm/#/login';
       });
+    },
+    handleLoginSaaS(data) {//SaaS登录
+        this.$store.dispatch("LoginSaaS", data).then((res) => {
+          this.$router.push({ path: "/index"});
+        }).catch(()=>{
+          location.href = '';
+        })
     }
   }
 };

+ 3 - 4
vue.config.js

@@ -16,9 +16,9 @@ module.exports = {
     // 部署生产环境和开发环境下的URL。
     // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
     // 例如 https://www.yongtian.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.yongtian.vip/admin/,则设置 baseUrl 为 /admin/。
-    publicPath: process.env.NODE_ENV === "production" ? "/deviceManager/" : "/deviceManager/",
+    publicPath: process.env.NODE_ENV === "production" ? "/vdm/" : "/vdm/",
     // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
-    outputDir: 'deviceManager',
+    outputDir: 'vdm',
     // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
     assetsDir: 'static',
     // 是否开启eslint保存检测,有效值:ture | false | 'error'
@@ -33,8 +33,7 @@ module.exports = {
         proxy: {
             // detail: https://cli.vuejs.org/config/#devserver-proxy
             [process.env.VUE_APP_BASE_API]: {
-                //target: 'http://172.16.120.49/dmapi/', //49
-                target: 'https://smartpark.caih.com/dmapi/', //
+                target: 'http://172.16.120.49/dmapi/', //东信
                 changeOrigin: true,
                 pathRewrite: {
                     ['^' + process.env.VUE_APP_BASE_API]: ''