瀏覽代碼

钉钉登录

OnePsycho 5 年之前
父節點
當前提交
288678f4aa
共有 7 個文件被更改,包括 163 次插入63 次删除
  1. 1 1
      src/api/basisMG.js
  2. 9 2
      src/api/loginMG.js
  3. 27 10
      src/components/BaseRegister.vue
  4. 3 4
      src/components/leftnav.vue
  5. 106 43
      src/views/login.vue
  6. 16 2
      src/views/member/Member.vue
  7. 1 1
      src/views/orgs/Orgs.vue

+ 1 - 1
src/api/basisMG.js

@@ -48,5 +48,5 @@ export const updateLecturer = (params) => { return req("post", "/api/Lecturer/up
 // 个人中心 更新
 // 个人中心 更新
 export const updateSelf = (params) => { return req("post", "/api/Lecturer/updateSelf", params) };
 export const updateSelf = (params) => { return req("post", "/api/Lecturer/updateSelf", params) };
 
 
-// 个人中心 更新
+// 个人中心 上传头像
 export const uploadBase64 = (params) => { return req("post", "/api/file/uploadBase64", params) };
 export const uploadBase64 = (params) => { return req("post", "/api/file/uploadBase64", params) };

+ 9 - 2
src/api/loginMG.js

@@ -1,4 +1,4 @@
-import { loginreq } from './axiosFun';
+import { loginreq, req } from './axiosFun';
 
 
 // 登录初始化获取图形验证码
 // 登录初始化获取图形验证码
 export const init = (params) => { return loginreq("post", "/api/login/init", params) };
 export const init = (params) => { return loginreq("post", "/api/login/init", params) };
@@ -10,6 +10,13 @@ export const sendSMS = (params) => { return loginreq("post", "/api/login/sendSMS
 export const phoneLogin = (params) => { return loginreq("post", "/api/login/phoneLogin", params) };
 export const phoneLogin = (params) => { return loginreq("post", "/api/login/phoneLogin", params) };
 
 
 // 手机短信验证登录
 // 手机短信验证登录
-export const register = (params) => { return loginreq("post", "/api/login/register", params) };
+export const register = (params) => { return loginreq("post", "/api/Lecturer/register", params) };
+
+
+// 钉钉登录接口
+export const dingLogin = (params) => { return loginreq("post", "/api/login/dingLogin", params) };
+
+// 钉钉绑定手机号
+export const bindDing = (params) => { return req("post", "/api/Lecturer/bindDing", params) };
 
 
 
 

+ 27 - 10
src/components/BaseRegister.vue

@@ -49,7 +49,7 @@
   </div>
   </div>
 </template>
 </template>
 <script type="text/ecmascript-6">
 <script type="text/ecmascript-6">
-import { init, sendSMS, phoneLogin, register } from "../api/loginMG";
+import { init, sendSMS, phoneLogin, register, bindDing } from "../api/loginMG";
 export default {
 export default {
   name: "login",
   name: "login",
   props: {
   props: {
@@ -64,6 +64,10 @@ export default {
     smsCode: {
     smsCode: {
       type: String,
       type: String,
       default: ""
       default: ""
+    },
+    dingLoginCode: {
+      type: String,
+      default: ""
     }
     }
   },
   },
   data() {
   data() {
@@ -116,7 +120,7 @@ export default {
           this.isLoginLoading = true;
           this.isLoginLoading = true;
           register({ ticket: this.ticket, user: this.registerForm }).then(
           register({ ticket: this.ticket, user: this.registerForm }).then(
             res => {
             res => {
-              if (res.result.data) this.onPhoneLogin();
+              if (!res.error) this.onPhoneLogin();
             }
             }
           );
           );
         } else {
         } else {
@@ -132,18 +136,31 @@ export default {
 
 
       if (cellphone && smsCode) {
       if (cellphone && smsCode) {
         phoneLogin({ cellphone: cellphone, smsCode: smsCode }).then(res => {
         phoneLogin({ cellphone: cellphone, smsCode: smsCode }).then(res => {
-          let tokenInfo = this.$jwtDecode(res.result.data.jwt.access_token)
-          localStorage.setItem("token", res.result.data.jwt.access_token);
-          localStorage.setItem('user',JSON.stringify(res.result.data.user))
-          localStorage.setItem('tokenInfo',JSON.stringify(tokenInfo))
-          this.$message.success("登录成功!");
-          this.$store.commit("login", "true");
-          this.$router.push({ path: tokenInfo.role.includes('root') ? "/orgs/Orgs" : "/member/Member" });
-          this.isLoginLoading = false;
+          if (!res.error) this.onLoginSuccess(res.result.data);
         });
         });
       } else {
       } else {
         this.$message.error("手机号与验证码不能为空!");
         this.$message.error("手机号与验证码不能为空!");
       }
       }
+    },
+
+    onLoginSuccess(data) {
+      let tokenInfo = this.$jwtDecode(data.jwt.access_token);
+      localStorage.setItem("token", data.jwt.access_token);
+      localStorage.setItem("tokenInfo", JSON.stringify(tokenInfo));
+      localStorage.setItem("user", JSON.stringify(data.user));
+      this.$message.success("登录成功!");
+      this.dingLoginCode && this.onBindDing();
+      this.$store.commit("login", "true");
+      this.$router.push({
+        path: tokenInfo.role.includes("root") ? "/orgs/Orgs" : "/member/Member"
+      });
+      this.isLoginLoading = false;
+    },
+
+    onBindDing() {
+      bindDing(this.dingLoginCode).then(res => {
+        if (!res.error) this.$message.success("绑定成功!");
+      });
     }
     }
   }
   }
 };
 };

+ 3 - 4
src/components/leftnav.vue

@@ -56,7 +56,7 @@ export default {
           menus: [
           menus: [
             {
             {
               menuid: 1,
               menuid: 1,
-              icon: "icon-order-manage",
+              icon: "icon-cs-manage",
               menuname: "组织机构管理",
               menuname: "组织机构管理",
               hasThird: "N",
               hasThird: "N",
               url: "orgs/Orgs",
               url: "orgs/Orgs",
@@ -65,7 +65,7 @@ export default {
             },
             },
             {
             {
               menuid: 2,
               menuid: 2,
-              icon: "icon-order-manage",
+              icon: "icon-cus-manage",
               menuname: "成员管理",
               menuname: "成员管理",
               hasThird: "N",
               hasThird: "N",
               url: "member/Member",
               url: "member/Member",
@@ -74,7 +74,7 @@ export default {
             },
             },
             {
             {
               menuid: 4,
               menuid: 4,
-              icon: "icon-order-manage",
+              icon: "li-icon-xitongguanli",
               menuname: "讲师管理",
               menuname: "讲师管理",
               hasThird: "N",
               hasThird: "N",
               url: "lecturer/Lecturer",
               url: "lecturer/Lecturer",
@@ -96,7 +96,6 @@ export default {
   },
   },
   methods:{
   methods:{
     checkPermission(arr1,arr2){
     checkPermission(arr1,arr2){
-      console.log(arr1,arr2)
       let arr = Array.from(new Set([...arr2].filter(x => new Set(arr1).has(x))));
       let arr = Array.from(new Set([...arr2].filter(x => new Set(arr1).has(x))));
       return arr.length > 0
       return arr.length > 0
     }
     }

+ 106 - 43
src/views/login.vue

@@ -11,12 +11,17 @@
         label-width="0px"
         label-width="0px"
         class="demo-loginForm login-container"
         class="demo-loginForm login-container"
       >
       >
-        <h3 class="title">欢迎登录</h3>
+        <h3 class="title">{{ isBindDing ? '绑定手机号' : '欢迎登录'}}</h3>
         <el-form-item prop="username">
         <el-form-item prop="username">
           <el-input type="text" v-model="loginForm.username" auto-complete="off" placeholder="账号"></el-input>
           <el-input type="text" v-model="loginForm.username" auto-complete="off" placeholder="账号"></el-input>
         </el-form-item>
         </el-form-item>
         <el-form-item prop="password" v-show="isLoginByPsw">
         <el-form-item prop="password" v-show="isLoginByPsw">
-          <el-input type="password" v-model="loginForm.password" auto-complete="off" placeholder="密码"></el-input>
+          <el-input
+            type="password"
+            v-model="loginForm.password"
+            auto-complete="off"
+            placeholder="密码"
+          ></el-input>
         </el-form-item>
         </el-form-item>
         <el-row>
         <el-row>
           <el-col :span="12">
           <el-col :span="12">
@@ -52,29 +57,40 @@
             :loading="isLoginLoading"
             :loading="isLoginLoading"
           >登录</el-button>
           >登录</el-button>
         </el-form-item>
         </el-form-item>
-        <el-form-item style="width:100%">
+        <el-form-item style="width:100%" v-show="!isBindDing">
           <el-button
           <el-button
             type="primary"
             type="primary"
             style="width:100%;background:#258489;border:none;"
             style="width:100%;background:#258489;border:none;"
             @click="isLoginByPsw = !isLoginByPsw"
             @click="isLoginByPsw = !isLoginByPsw"
           >{{ isLoginByPsw ? '验证码登录' : '密码登录'}}</el-button>
           >{{ isLoginByPsw ? '验证码登录' : '密码登录'}}</el-button>
           <div class="ding-box">
           <div class="ding-box">
-            <img src="@/assets/img/ding.png" alt="" width="40" style="cursor:pointer" @click="isDingLogin = !isDingLogin">
+            <img
+              src="@/assets/img/ding.png"
+              alt
+              width="40"
+              style="cursor:pointer"
+              @click="isDingLogin = !isDingLogin"
+            />
             <span style="color:#6d6d6d">第三方登录</span>
             <span style="color:#6d6d6d">第三方登录</span>
           </div>
           </div>
         </el-form-item>
         </el-form-item>
       </el-form>
       </el-form>
       <div class="login-container ding-login-container" v-show="isDingLogin">
       <div class="login-container ding-login-container" v-show="isDingLogin">
-          <p style="font-weight:bold;font-size:18px">钉钉扫码登录</p>
-          <div id="login_container"></div>
-          <p style="font-weight:bold;font-size:16px;margin-bottom:20px;cursor:pointer" @click="isDingLogin = !isDingLogin"><u>账号密码登录</u></p>
+        <p style="font-weight:bold;font-size:18px">钉钉扫码登录</p>
+        <div id="login_container"></div>
+        <p
+          style="font-weight:bold;font-size:16px;margin-bottom:20px;cursor:pointer"
+          @click="isDingLogin = !isDingLogin"
+        >
+          <u>账号密码登录</u>
+        </p>
       </div>
       </div>
     </div>
     </div>
-    <BaseRegister v-else :ticket="curTicket" :user="newUser" :smsCode="curSmsCode"></BaseRegister>
+    <BaseRegister v-else :ticket="curTicket" :user="newUser" :smsCode="curSmsCode" :dingLoginCode="dingLoginCode"></BaseRegister>
   </div>
   </div>
 </template>
 </template>
 <script type="text/ecmascript-6">
 <script type="text/ecmascript-6">
-import { init, sendSMS, phoneLogin } from "../api/loginMG";
+import { init, sendSMS, phoneLogin, dingLogin, bindDing } from "../api/loginMG";
 import { setCookie, getCookie, delCookie } from "../utils/util";
 import { setCookie, getCookie, delCookie } from "../utils/util";
 import BaseRegister from "../components/BaseRegister";
 import BaseRegister from "../components/BaseRegister";
 import md5 from "js-md5";
 import md5 from "js-md5";
@@ -83,7 +99,9 @@ export default {
   components: { BaseRegister },
   components: { BaseRegister },
   data() {
   data() {
     return {
     return {
-      isDingLogin:true,
+      dingLoginCode: "",
+      isDingLogin: true,
+      isBindDing:false,
       timer: 10,
       timer: 10,
       curTicket: "",
       curTicket: "",
       curSmsCode: "",
       curSmsCode: "",
@@ -129,13 +147,47 @@ export default {
     // 获取图形验证码
     // 获取图形验证码
     this.getCode();
     this.getCode();
 
 
+    this.getScanCode();
   },
   },
   methods: {
   methods: {
-    testDing() {
-      const appid = 'dingoabikplouc0kaoq7io'
-      var url = encodeURIComponent('http://localhost:9999/');
-      var goto = encodeURIComponent(`https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${ appid }&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=${ url }`)
-       
+    getScanCode() {
+      // 获取钉钉扫码登录后返回的CODE
+      this.dingLoginCode = this.getQueryVariable("code");
+      if (!this.dingLoginCode) return;
+      dingLogin(this.dingLoginCode).then(res => {
+        let status = res.result.data.status
+        // 如果返回为1  则代表未绑定手机号 需要去进行手机号绑定
+        if(status === 1){
+          this.isDingLogin = false
+          this.isBindDing = true
+        }else{
+          // 其余返回则为用户身份信息 直接进行登录操作
+          this.onLoginSuccess(res.result.data)
+        }
+      }).catch(err => {
+        this.$message.error(err)
+      })
+    },
+
+    getQueryVariable(variable) {
+      var query = window.location.search.substring(1);
+      var vars = query.split("&");
+      for (var i = 0; i < vars.length; i++) {
+        var pair = vars[i].split("=");
+        if (pair[0] == variable) {
+          return pair[1];
+        }
+      }
+      return false;
+    },
+
+    onDingScan() {
+      const appid = "dingoabikplouc0kaoq7io";
+      var url = encodeURIComponent("http://localhost:9999/");
+      var goto = encodeURIComponent(
+        `https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${appid}&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=${url}`
+      );
+
       var obj = DDLogin({
       var obj = DDLogin({
         id: "login_container",
         id: "login_container",
         goto: goto,
         goto: goto,
@@ -144,20 +196,20 @@ export default {
         height: "350"
         height: "350"
       });
       });
 
 
-      var handleMessage = function (event) {
+      var handleMessage = function(event) {
         var origin = event.origin;
         var origin = event.origin;
-        if( origin == "https://login.dingtalk.com" ) { //判断是否来自ddLogin扫码事件。
-          var loginTmpCode = event.data; 
-          const URL = `https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${appid}&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=${url}&loginTmpCode=${loginTmpCode}`
-          window.location.href = URL
+        if (origin == "https://login.dingtalk.com") {
+          //判断是否来自ddLogin扫码事件。
+          var loginTmpCode = event.data;
+          const URL = `https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${appid}&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=${url}&loginTmpCode=${loginTmpCode}`;
+          window.location.href = URL;
         }
         }
       };
       };
-      if (typeof window.addEventListener != 'undefined') {
-          window.addEventListener('message', handleMessage, false);
-      } else if (typeof window.attachEvent != 'undefined') {
-          window.attachEvent('onmessage', handleMessage);
+      if (typeof window.addEventListener != "undefined") {
+        window.addEventListener("message", handleMessage, false);
+      } else if (typeof window.attachEvent != "undefined") {
+        window.attachEvent("onmessage", handleMessage);
       }
       }
-
     },
     },
 
 
     /** 发送短信验证码 */
     /** 发送短信验证码 */
@@ -212,18 +264,7 @@ export default {
             this.newUser = res.result.data.user;
             this.newUser = res.result.data.user;
             this.isShowRegister = true;
             this.isShowRegister = true;
           } else {
           } else {
-            let tokenInfo = this.$jwtDecode(res.result.data.jwt.access_token);
-            localStorage.setItem("token", res.result.data.jwt.access_token);
-            localStorage.setItem("tokenInfo", JSON.stringify(tokenInfo));
-            localStorage.setItem("user", JSON.stringify(res.result.data.user));
-            this.$message.success("登录成功!");
-            this.$store.commit("login", "true");
-            this.$router.push({
-              path: tokenInfo.role.includes("root")
-                ? "/orgs/Orgs"
-                : "/member/Member"
-            });
-            this.isLoginLoading = false;
+            this.onLoginSuccess(res.result.data)
           }
           }
         });
         });
       } else {
       } else {
@@ -231,6 +272,29 @@ export default {
       }
       }
     },
     },
 
 
+    onLoginSuccess(data){
+        console.log(data)
+        let tokenInfo = this.$jwtDecode(data.jwt.access_token);
+        localStorage.setItem("token", data.jwt.access_token);
+        localStorage.setItem("tokenInfo", JSON.stringify(tokenInfo));
+        localStorage.setItem("user", JSON.stringify(data.user));
+        this.$message.success("登录成功!");
+        this.isBindDing && this.onBindDing()
+        this.$store.commit("login", "true");
+        this.$router.push({
+          path: tokenInfo.role.includes("root")
+            ? "/orgs/Orgs"
+            : "/member/Member"
+        });
+        this.isLoginLoading = false;
+    },
+
+    onBindDing(){
+        bindDing(this.dingLoginCode).then(res => {
+          if(!res.error) this.$message.success('绑定成功!')
+        })
+    },
+
     /** 初始化登录随机UUID */
     /** 初始化登录随机UUID */
     getUUID() {
     getUUID() {
       function S4() {
       function S4() {
@@ -280,8 +344,8 @@ export default {
     }
     }
   },
   },
 
 
-  mounted(){
-    this.testDing();
+  mounted() {
+    this.onDingScan();
   }
   }
 };
 };
 </script>
 </script>
@@ -295,7 +359,7 @@ export default {
   cursor: pointer;
   cursor: pointer;
 }
 }
 
 
-.login_qrcode_content{
+.login_qrcode_content {
   width: 300px !important;
   width: 300px !important;
   height: 300px !important;
   height: 300px !important;
   margin-top: 50px !important;
   margin-top: 50px !important;
@@ -317,7 +381,7 @@ export default {
   background-size: 100%;
   background-size: 100%;
   font-family: 微軟正黑體, "Heiti TC" !important;
   font-family: 微軟正黑體, "Heiti TC" !important;
 }
 }
-.ding-login-container{
+.ding-login-container {
   display: flex;
   display: flex;
   flex-direction: column;
   flex-direction: column;
   justify-content: center;
   justify-content: center;
@@ -363,8 +427,7 @@ export default {
   user-select: none;
   user-select: none;
 }
 }
 
 
-
-.ding-box{
+.ding-box {
   margin-top: 20px;
   margin-top: 20px;
   display: flex;
   display: flex;
   flex-direction: column;
   flex-direction: column;

+ 16 - 2
src/views/member/Member.vue

@@ -16,7 +16,9 @@
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
       <el-form-item>
       <el-form-item>
-        <el-tag>{{ getActivationStatus() }}</el-tag>
+        <el-tag :type="getOrgStatus() ? 'success' : 'danger'">{{ getOrgStatus() ? '组织状态:正常' : '组织状态:停用'}}</el-tag>
+        <el-tag :type="getActivationStatus() ? 'success' : 'danger'">{{ getActivationStatus()  ? '授权状态:正常' : '授权状态:停用'}}</el-tag>
+        <el-tag :type="getActivationExpires() !== '未授权' ? 'success' : 'danger'">{{ getActivationExpires() }}</el-tag>
         <el-button size="small" type="primary" icon="el-icon-plus" @click="handleEdit()">添加成员</el-button>
         <el-button size="small" type="primary" icon="el-icon-plus" @click="handleEdit()">添加成员</el-button>
       </el-form-item>
       </el-form-item>
     </el-form>
     </el-form>
@@ -299,11 +301,23 @@ export default {
       });
       });
     },
     },
 
 
-    getActivationStatus(){
+    getActivationExpires(){
       let list = this.activationList.filter(i => i.orgCode === this.defaultParams.data.orgCode)
       let list = this.activationList.filter(i => i.orgCode === this.defaultParams.data.orgCode)
       return  list.length ? '到期时间:' + timestampToTime(list[0].expires) : '未授权'
       return  list.length ? '到期时间:' + timestampToTime(list[0].expires) : '未授权'
     },
     },
 
 
+    getActivationStatus(){
+      let list = this.activationList.filter(i => i.orgCode === this.defaultParams.data.orgCode)
+      if(!list.length) return false
+      return list[0].status === 1
+    },
+
+    getOrgStatus(){
+      let list = this.orgList.filter(i => i.code === this.defaultParams.data.orgCode)
+      if(!list.length) return false
+      return list[0].status === 1
+    },
+
     handleExit(index, row) {
     handleExit(index, row) {
       exitMember({
       exitMember({
         unionid: row.unionid,
         unionid: row.unionid,

+ 1 - 1
src/views/orgs/Orgs.vue

@@ -316,7 +316,7 @@ export default {
             expires : this.updateForm.expires , 
             expires : this.updateForm.expires , 
             maximum : this.updateForm.maximum ,
             maximum : this.updateForm.maximum ,
             orgCode : this.updateForm.code,
             orgCode : this.updateForm.code,
-            status : this.updateForm.status
+            status : this.updateForm.activeStatus
           }
           }
           saveOrUpdateCode(params)
           saveOrUpdateCode(params)
             .then(res => {
             .then(res => {