pruple_boy 1 рік тому
батько
коміт
be92ccf339

+ 2 - 1
.env.production

@@ -18,4 +18,5 @@ DIR_OUT_PUT = ''
 VUE_APP_DEV_PROXY = ''
 
 # 基础 URL: 直连不配nginx反向代理
-VUE_APP_BASE_URL = 'https://mc.cloudpure.cn'
+# VUE_APP_BASE_URL = 'https://mc.cloudpure.cn'
+VUE_APP_BASE_URL = 'http://192.168.88.88:9012'

+ 28 - 0
package-lock.json

@@ -5,6 +5,7 @@
   "requires": true,
   "packages": {
     "": {
+      "name": "vue-mcli",
       "version": "0.1.0",
       "dependencies": {
         "@quasar/extras": "^1.0.0",
@@ -12,6 +13,7 @@
         "axios": "^0.19.2",
         "core-js": "^3.6.4",
         "crypto-js": "^4.0.0",
+        "dingtalk-jsapi": "^3.0.27",
         "element-ui": "^2.15.1",
         "fecha": "^4.2.0",
         "file-saver": "^2.0.5",
@@ -5429,6 +5431,14 @@
       "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
       "dev": true
     },
+    "node_modules/dingtalk-jsapi": {
+      "version": "3.0.27",
+      "resolved": "https://registry.npmjs.org/dingtalk-jsapi/-/dingtalk-jsapi-3.0.27.tgz",
+      "integrity": "sha512-VUUKiIGDZU9gqB1xzvQxe5FUqZGLjkEHcJUFpYgt3Bn7J8J7SC9PI9+NHVtkiXSFQPMCNdX9rtdmimzMYhnJ+w==",
+      "dependencies": {
+        "promise-polyfill": "^7.1.0"
+      }
+    },
     "node_modules/dir-glob": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
@@ -12703,6 +12713,11 @@
       "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
       "dev": true
     },
+    "node_modules/promise-polyfill": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz",
+      "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ=="
+    },
     "node_modules/proxy-addr": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
@@ -22736,6 +22751,14 @@
         }
       }
     },
+    "dingtalk-jsapi": {
+      "version": "3.0.27",
+      "resolved": "https://registry.npmjs.org/dingtalk-jsapi/-/dingtalk-jsapi-3.0.27.tgz",
+      "integrity": "sha512-VUUKiIGDZU9gqB1xzvQxe5FUqZGLjkEHcJUFpYgt3Bn7J8J7SC9PI9+NHVtkiXSFQPMCNdX9rtdmimzMYhnJ+w==",
+      "requires": {
+        "promise-polyfill": "^7.1.0"
+      }
+    },
     "dir-glob": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
@@ -28756,6 +28779,11 @@
       "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
       "dev": true
     },
+    "promise-polyfill": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.2.tgz",
+      "integrity": "sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ=="
+    },
     "proxy-addr": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",

+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "axios": "^0.19.2",
     "core-js": "^3.6.4",
     "crypto-js": "^4.0.0",
+    "dingtalk-jsapi": "^3.0.27",
     "element-ui": "^2.15.1",
     "fecha": "^4.2.0",
     "file-saver": "^2.0.5",

+ 8 - 1
src/modules/opay/service/api.js

@@ -1,5 +1,6 @@
 import request from "@/service/request";
 import { devProxy } from "@/service/network";
+import { KEY_NO_LOAD_TOKEN, KEY_NO_LOADING } from "@/service/request";
 
 
 /////////////////////  业务逻辑: thunk包装调用  /////////////////////
@@ -19,7 +20,13 @@ export function queryDetails (data = {}) {
   return request.doPost(devProxy("/fengkaili/queryAttendanceDays"), {}, data)
 }
 
-
 export function exportDetails (data = {}) {
   return request.doExport(devProxy("/fengkaili/exportAttendanceDays"), {}, data);
 }
+
+export function authCode (code) {
+  return request.doPost(devProxy("/fengkaili/user/code"), {}, { code }, {
+    [KEY_NO_LOAD_TOKEN]: true,
+    [KEY_NO_LOADING]: true
+  });
+}

+ 28 - 4
src/modules/opay/views/layout.vue

@@ -4,7 +4,7 @@ el-container.main
     .aside-top
       el-avatar(:src="avatar", :size="48") {{ role }}
       div
-        p 丰凯利
+        p {{ name }}
         span 考勤月度报表
     el-menu(:default-active="$route.path", router, unique-opened, :collapse="collapse")
       el-submenu(v-for="menu of menus", :index="menu.path", :key="menu.path")
@@ -24,6 +24,9 @@ el-container.main
 <script>
 import menuRouter from "opay/router";
 import { mapState } from "vuex";
+import ding from "@/vendor/dingApi";
+import { authCode } from "../service/api"
+import progress from "@/service/progress"
 
 // arr to obj, such as { CN : "China", US : "USA" }
 const menus = [];
@@ -63,14 +66,35 @@ export default {
     ...mapState({
       avatar: state =>
         state.user.avatar || require("opay/assets/logo/logo.png"),
-      name: state => state.user.name || "OPay",
+      name: state => state.user.name || "丰凯利",
       role: state => state.user.desc || "假勤管理"
     })
   },
   watch: {},
-  created () { },
+  created () {
+    this.loginAuth()
+  },
   mounted () { },
-  methods: {}
+  methods: {
+    // 钉钉免登 [H5无需配置, 但宜搭内需要配置鉴权, 才能获取到code]
+    loginAuth () {
+      if (ding.dd.env.platform == "notInDingTalk") {
+        progress.dialogConfirm("操作提示", "请在钉钉工作台打开!")
+        return
+      }
+      ding.dd.runtime.permission.requestAuthCode({
+        corpId: "dingade22a8c4fd34b8535c2f4657eb6378f", // 企业id
+        onSuccess: async info => {
+          const rsp = await authCode(info.code);
+          this.$store.dispatch("user/updateUser", rsp.data)
+        },
+        onFail (err) {
+          console.log("onFail", err)
+        }
+
+      });
+    }
+  }
 };
 </script>
 

+ 6 - 6
src/service/progress.js

@@ -21,7 +21,7 @@ const quasar = _env.VUE_APP_PRIORITY == _env.VUE_APP_UI_QUASAR;
 const elementUI = _env.VUE_APP_PRIORITY == _env.VUE_APP_UI_ELEMENT;
 
 // loading 显示
-progress.showLoading = function(message = "拼命加载中...") {
+progress.showLoading = function (message = "拼命加载中...") {
   // 避免多个可用对象存在, 尽量避免闪屏
   if (this.$loading) return;
   if (quasar) {
@@ -43,7 +43,7 @@ progress.showLoading = function(message = "拼命加载中...") {
 };
 
 // loading 关闭
-progress.hideLoading = function() {
+progress.hideLoading = function () {
   if (!this.$loading) return;
   if (quasar) this.$loading.hide();
   if (elementUI) this.$loading.close();
@@ -51,7 +51,7 @@ progress.hideLoading = function() {
 };
 
 // 错误提示提示
-progress.showErrorMessage = function(message, duration = 2000) {
+progress.showErrorMessage = function (message, duration = 2000) {
   if (!message) return;
   if (quasar) {
     _vm.$q.notify({
@@ -72,7 +72,7 @@ progress.showErrorMessage = function(message, duration = 2000) {
 };
 
 // 成功提示信息
-progress.showSuccessMessage = function(message, duration = 2000) {
+progress.showSuccessMessage = function (message, duration = 2000) {
   if (!message) return;
   if (quasar) {
     _vm.$q.notify({
@@ -93,7 +93,7 @@ progress.showSuccessMessage = function(message, duration = 2000) {
 };
 
 // token 失效处理
-progress.invalidToken = async function(message) {
+progress.invalidToken = async function (message) {
   await store.dispatch("user/resetToken");
   redirectIndex(message); // 若当前路由非首页, 提示登录失效信息, 跳转首页
   bus.$vm.$emit(bus.$sel.login_timeout);
@@ -101,7 +101,7 @@ progress.invalidToken = async function(message) {
 };
 
 // 弹出确认框
-progress.dialogConfirm = function(title, message) {
+progress.dialogConfirm = function (title, message) {
   return new Promise((resolve, reject) => {
     if (quasar) {
       _vm.$q

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

@@ -14,7 +14,7 @@ const KEY_AVATAR = "mc_user_avatar"
 const state = {
   // token
   token: SS.GET_TOKEN() ?? "",
-  name: LS.GET(KEY_NAME) ?? "未登录",
+  name: LS.GET(KEY_NAME) ?? "",
   nick: LS.GET(KEY_NICK_NAME) ?? "",
   avatar: LS.GET(KEY_AVATAR) ?? "",
   userId: LS.GET(KEY_USER_ID) ?? "",
@@ -106,7 +106,15 @@ const actions = {
       commit("SET_TOKEN");
       resolve();
     });
-  }
+  },
+  // update
+  updateUser ({ commit }, payload) {
+    commit("SET_TOKEN", payload.userid);
+    commit("SET_NAME", payload.name);
+    commit("SET_AVATAR", payload.avatar);
+    commit("SET_USER_ID", payload.userid);
+  },
+
 };
 
 export default {

+ 174 - 0
src/vendor/dingApi.js

@@ -0,0 +1,174 @@
+import * as dd from "dingtalk-jsapi";
+
+const ding = {}; // 钉钉jsapi对象
+let $loading = false; // 避免多个请求闪屏
+
+import progress from "@/service/progress";
+
+// loading 显示
+ding.showLoading = function (message = "拼命加载中...") {
+  if ($loading) return;
+  $loading = true;
+  dd.device.notification.showPreloader({
+    showIcon: true,
+    text: message,
+  });
+};
+
+// loading 关闭
+ding.hideLoading = function () {
+  if (!$loading) return;
+  dd.device.notification.hidePreloader();
+  $loading = false;
+};
+
+// toast 提示: info 详见 https://ding-doc.dingtalk.com/doc#/dev/oo98ye/6pwsuy
+ding.showMessageToast = function (info = {}) {
+  if (!info.message) return;
+  dd.device.notification.toast(info);
+};
+
+// 获取定位
+ding.getLocation = function () {
+  return new Promise((resolve, reject) => {
+    dd.device.geolocation.get({
+      targetAccuracy: 200,
+      coordinate: 1,
+      withReGeocode: true,
+      useCache: true,
+      onSuccess (result) {
+        resolve(result);
+      },
+      onFail (err) {
+        reject(err);
+      },
+    });
+  });
+};
+
+// 根据chatId跳转到对应会话
+ding.toConversation = function (chatId) {
+  return new Promise((resolve, reject) => {
+    dd.biz.chat.toConversation({
+      corpId: conf.corpId,
+      chatId,
+      onSuccess: () => resolve(),
+      onFail: (err) => reject(err),
+    });
+  });
+};
+
+// 图片预览: 支持缩放和左右切换
+ding.previewImageScale = function (urls, index = 0) {
+  if (!urls) return;
+  dd.biz.previewImage({
+    urls,
+    current: urls[index],
+  });
+};
+
+// 获取UUID
+ding.getUUID = function () {
+  return new Promise((resolve) => {
+    dd.device.base.getUUID({
+      onSuccess (data) {
+        resolve(data);
+      },
+    });
+  });
+};
+
+/** @exports 钉钉新开页面方法 */
+ding.openNavigation = function (url, isReplace) {
+  if (!url) return;
+  // 区分环境, 兼容分享
+  if (dd.env.platform === "notInDingTalk") {
+    window.open(url, isReplace ? "_self" : "");
+  } else {
+    if (isReplace) {
+      dd.biz.navigation.replace({ url });
+    } else {
+      dd.biz.util.openLink({ url });
+    }
+  }
+};
+
+/** @exports 设置右侧导航栏: [{ id: "1", text: "附 件", url: "http://alading-20210318.oss-cn-shanghai.aliyuncs.com/assets/nav-link.png",},] */
+ding.settingNavigationMenu = function (menus = [], isClear, callback) {
+  if (isClear) {
+    menus = [
+      {
+        id: "999",
+        text: " ",
+      },
+    ];
+  }
+  dd.biz.navigation.setMenu({
+    items: menus,
+    onSuccess (result) {
+      callback && callback(result);
+    },
+  });
+};
+
+// 注册钉钉js接口鉴权 [H5无需配置, 但宜搭内需要配置鉴权, 才能获取到code]
+ding.registerConfig = function () {
+
+  if (dd.env.platform == "notInDingTalk") {
+    progress.dialogConfirm("操作提示", "请在钉钉工作台打开!")
+    return
+  }
+
+  /** // 页面环境:0提交(其它),1查看,2编辑(审批)
+    if (!mjs.env) {
+  
+      // 注册jsApi ticket
+      const rsp = await mjs.request.xhr.doPost("https://mc.cloudpure.cn/api/hangshi/register", {}, {
+        url: mjs.conf.ticketUrl,
+        nonceStr: mjs.conf.nonceStr
+      }, { noLoading: true });
+      dd.config({
+        ...rsp.data,
+        type: 0,
+        jsApiList: ["runtime.permission.requestAuthCode"]
+      });
+      // 钉钉免登逻辑
+      const _this = this;
+      mjs.ding.dd.ready(function () {
+        mjs.ding.dd.runtime.permission.requestAuthCode({
+          corpId: mjs.conf.corpId, // 企业id
+          onSuccess: async function (info) {
+            const res = await mjs.request.xhr.doPost("https://mc.cloudpure.cn/api/hangshi/user/code", {}, {
+              code: info.code
+            }, { noLoading: true });
+            console.log("钉钉免登", res.data)
+            _this.$('textField_ll3m8vz5').setValue(res.data.name)
+            _this.$('textField_ll3m8vz6').setValue(res.data.userid)
+          }
+        });
+      });
+    } */
+
+  dd.ready(function () {
+    // dd.config({
+    //   agentId,
+    //   corpId,
+    //   timeStamp,
+    //   nonceStr,
+    //   signature,
+    //   type: 0,
+    //   jsApiList: ["biz.chat.toConversation"], // 注意:不要带dd。
+    // });
+  })
+
+
+};
+
+// 注册配置异常抛出
+dd.error(function (error) {
+  window.alert(JSON.stringify(error));
+});
+
+ding.dd = dd;
+
+export default ding;