Quellcode durchsuchen

feat:完成自适应,完成编外人员管理

DESKTOP-07F1812\coder vor 2 Jahren
Ursprung
Commit
f23c26193b

+ 4 - 1
package.json

@@ -11,11 +11,14 @@
     "postinstall": "npx simple-git-hooks"
   },
   "dependencies": {
-    "@element-plus/icons-vue": "^2.1.0",
     "@vueuse/core": "^10.1.2",
+    "amfe-flexible": "^2.2.1",
+    "autoprefixer": "^10.4.14",
     "axios": "^1.4.0",
+    "lib-flexible": "^0.3.2",
     "pinia": "^2.1.1",
     "pinia-plugin-persistedstate": "^3.1.0",
+    "postcss-pxtorem": "^6.0.0",
     "sass": "^1.62.1",
     "vant": "^4.4.1",
     "vue": "^3.3.2",

+ 91 - 12
pnpm-lock.yaml

@@ -1,21 +1,30 @@
 lockfileVersion: '6.0'
 
 dependencies:
-  '@element-plus/icons-vue':
-    specifier: ^2.1.0
-    version: 2.1.0(vue@3.3.2)
   '@vueuse/core':
     specifier: ^10.1.2
     version: 10.1.2(vue@3.3.2)
+  amfe-flexible:
+    specifier: ^2.2.1
+    version: 2.2.1
+  autoprefixer:
+    specifier: ^10.4.14
+    version: 10.4.14(postcss@8.4.23)
   axios:
     specifier: ^1.4.0
     version: 1.4.0
+  lib-flexible:
+    specifier: ^0.3.2
+    version: 0.3.2
   pinia:
     specifier: ^2.1.1
     version: 2.1.1(typescript@5.0.4)(vue@3.3.2)
   pinia-plugin-persistedstate:
     specifier: ^3.1.0
     version: 3.1.0(pinia@2.1.1)
+  postcss-pxtorem:
+    specifier: ^6.0.0
+    version: 6.0.0(postcss@8.4.23)
   sass:
     specifier: ^1.62.1
     version: 1.62.1
@@ -244,14 +253,6 @@ packages:
       '@babel/helper-validator-identifier': 7.19.1
       to-fast-properties: 2.0.0
 
-  /@element-plus/icons-vue@2.1.0(vue@3.3.2):
-    resolution: {integrity: sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==}
-    peerDependencies:
-      vue: ^3.2.0
-    dependencies:
-      vue: 3.3.2
-    dev: false
-
   /@esbuild/android-arm64@0.17.14:
     resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==}
     engines: {node: '>=12'}
@@ -1507,6 +1508,10 @@ packages:
       uri-js: 4.4.1
     dev: true
 
+  /amfe-flexible@2.2.1:
+    resolution: {integrity: sha512-L2VfvDzoETBjhRptg5u/IUuzHSuxm22JpSRb404p/TBGeRfwWmmNEbB+TFPIP/sS/+pbM18bCFH9QnMojLuPNw==}
+    dev: false
+
   /ansi-regex@5.0.1:
     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
     engines: {node: '>=8'}
@@ -1615,6 +1620,22 @@ packages:
   /asynckit@0.4.0:
     resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
 
+  /autoprefixer@10.4.14(postcss@8.4.23):
+    resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
+    engines: {node: ^10 || ^12 || >=14}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      browserslist: 4.21.7
+      caniuse-lite: 1.0.30001495
+      fraction.js: 4.2.0
+      normalize-range: 0.1.2
+      picocolors: 1.0.0
+      postcss: 8.4.23
+      postcss-value-parser: 4.2.0
+    dev: false
+
   /available-typed-arrays@1.0.5:
     resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
     engines: {node: '>= 0.4'}
@@ -1665,6 +1686,17 @@ packages:
     dependencies:
       fill-range: 7.0.1
 
+  /browserslist@4.21.7:
+    resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+    dependencies:
+      caniuse-lite: 1.0.30001495
+      electron-to-chromium: 1.4.423
+      node-releases: 2.0.12
+      update-browserslist-db: 1.0.11(browserslist@4.21.7)
+    dev: false
+
   /builtin-modules@3.3.0:
     resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
     engines: {node: '>=6'}
@@ -1737,6 +1769,10 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
+  /caniuse-lite@1.0.30001495:
+    resolution: {integrity: sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg==}
+    dev: false
+
   /chai@4.3.7:
     resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==}
     engines: {node: '>=4'}
@@ -2097,6 +2133,10 @@ packages:
       sigmund: 1.0.1
     dev: true
 
+  /electron-to-chromium@1.4.423:
+    resolution: {integrity: sha512-y4A7YfQcDGPAeSWM1IuoWzXpg9RY1nwHzHSwRtCSQFp9FgAVDgdWlFf0RbdWfLWQ2WUI+bddUgk5RgTjqRE6FQ==}
+    dev: false
+
   /emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
     dev: true
@@ -2242,7 +2282,6 @@ packages:
   /escalade@3.1.1:
     resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
     engines: {node: '>=6'}
-    dev: true
 
   /escape-string-regexp@1.0.5:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
@@ -2788,6 +2827,10 @@ packages:
       combined-stream: 1.0.8
       mime-types: 2.1.35
 
+  /fraction.js@4.2.0:
+    resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
+    dev: false
+
   /fs-minipass@2.1.0:
     resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
     engines: {node: '>= 8'}
@@ -3510,6 +3553,10 @@ packages:
       type-check: 0.4.0
     dev: true
 
+  /lib-flexible@0.3.2:
+    resolution: {integrity: sha512-9yowMWA70tKhKdCJDaltY0mNQG4OWo7pWKScnTp9aiSxS7s20ZYlwBRE3335nweOf5qKXVC7sDxJwMPM8/MFZg==}
+    dev: false
+
   /lines-and-columns@1.2.4:
     resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
     dev: true
@@ -3882,6 +3929,10 @@ packages:
       - supports-color
     dev: true
 
+  /node-releases@2.0.12:
+    resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
+    dev: false
+
   /nopt@5.0.0:
     resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
     engines: {node: '>=6'}
@@ -3929,6 +3980,11 @@ packages:
     resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
     engines: {node: '>=0.10.0'}
 
+  /normalize-range@0.1.2:
+    resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+    engines: {node: '>=0.10.0'}
+    dev: false
+
   /npm-bundled@3.0.0:
     resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==}
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -4270,6 +4326,14 @@ packages:
     hasBin: true
     dev: true
 
+  /postcss-pxtorem@6.0.0(postcss@8.4.23):
+    resolution: {integrity: sha512-ZRXrD7MLLjLk2RNGV6UA4f5Y7gy+a/j1EqjAfp9NdcNYVjUMvg5HTYduTjSkKBkRkfqbg/iKrjMO70V4g1LZeg==}
+    peerDependencies:
+      postcss: ^8.0.0
+    dependencies:
+      postcss: 8.4.23
+    dev: false
+
   /postcss-selector-parser@6.0.10:
     resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
     engines: {node: '>=4'}
@@ -4278,6 +4342,10 @@ packages:
       util-deprecate: 1.0.2
     dev: true
 
+  /postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+    dev: false
+
   /postcss@8.4.23:
     resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==}
     engines: {node: ^10 || ^12 || >=14}
@@ -5175,6 +5243,17 @@ packages:
       webpack-virtual-modules: 0.5.0
     dev: true
 
+  /update-browserslist-db@1.0.11(browserslist@4.21.7):
+    resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+    dependencies:
+      browserslist: 4.21.7
+      escalade: 3.1.1
+      picocolors: 1.0.0
+    dev: false
+
   /uri-js@4.4.1:
     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
     dependencies:

+ 9 - 0
postcss.config.js

@@ -0,0 +1,9 @@
+// postcss.config.js
+module.exports = {
+  plugins: {
+    'postcss-pxtorem': {
+      rootValue: 37.5,
+      propList: ['*'],
+    },
+  },
+}

+ 167 - 0
public/auto-login.html

@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<html>
+
+<head>
+    <title>景宁教育魔方</title>
+    <!-- 这个必须引入的啊,钉钉的前端js SDK, 使用框架的请自行参照开发文档 -->
+    <script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.7.13/dingtalk.open.js"></script>
+    <!-- 这个jquery 想不想引入自己决定,没什么影响 -->
+    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
+    <style type="text/css">
+        .loading {
+            position: fixed;
+            left: 0;
+            top: 0;
+            width: 100%;
+            height: 100%;
+            z-index: 100;
+            background: url("loading.gif") center no-repeat rgba(255, 255, 255, .55);
+        }
+    </style>
+</head>
+
+<body>
+
+    <!--TODO...替换成之前亲亲云的一个登录中转过度loading-->
+    <div class="loading"></div>
+    <!--<div id="user_info" style="color: #000;font-size: 15px;position: fixed;left: 0;top: 0;width: 100%;height: 100%;z-index: 150"></div>-->
+    <!--<hr>-->
+    <!--<h1>教育魔方-免登验证-线上环境</h1>-->
+    <!--<p>当前页面的url:</p>-->
+    <!--<p id="url"></p>-->
+    <!--<br>-->
+    <!--<p>解析url,获取的corpID:</p>-->
+    <!--<p id="corpId"></p>-->
+    <!--<br>-->
+    <!--<p>SDK初始化获取的code:</p>-->
+    <!--<p id="code"></p>-->
+    <!--<br>-->
+    <!--<p>请求我们服务端,登录返回的结果:</p>-->
+    <p id="myresponse"></p>
+
+    <script type="text/javascript">
+        let login_obj = {
+            url: '',
+            code: '',
+            api: ''
+        };
+        if (location.href.includes('.bozedu.')) {
+            login_obj = {
+                url: 'https://daily-cube.zjedu.com',
+                code: 'suitemie4qeftvmhnufp1',
+                api: 'http://jnjymf_api.bozedu.top'
+            }
+        } else {
+            login_obj = {
+                url: 'https://cube.zjedu.com',
+                code: 'suiteecoywfohhm68lkix',
+                api: 'http://60.188.226.44:8090'
+            }
+        }
+        $(function () {
+            var params = new Object();
+            params = GetRequest();
+            if (localStorage.getItem('userInfo')) {
+                localStorage.removeItem('userInfo');
+            }
+            // {
+            //     var corpId = params.corpId ? params.corpId : '';
+            //     var tag = params.tag ? params.tag : '';
+            //     let follow = '';
+            //     const t = tag.split('_');
+            //     if (t.length > 1) {
+            //         tag = t.splice(0, 1)[0];
+            //         follow = t.join('/');
+            //     }
+            //     console.log(' href : ', '/app/' + tag + '/' + (follow ? ('#/' + follow) : ''))
+            //     return
+            // }
+            //钉钉sdk 初始化
+            // dd.ready参数为回调函数,在环境准备就绪时触发,jsapi的调用需要保证在该回调函数触发后调用,否则无效。
+            dd.ready(function () {
+                var corpId = params.corpId ? params.corpId : '';
+                var tag = params.tag ? params.tag : '';
+                let follow = '';
+                const t = tag.split('_');
+                if (t.length > 1) {
+                    tag = t.splice(0, 1)[0];
+                    follow = t.join('/');
+                }
+                // console.log(' href : ', '/app/' + tag + '/' + (follow ? ('#/' + follow) : ''))
+
+                //使用SDK 获取免登授权码
+                dd.runtime.permission.requestAuthCode({
+                    corpId: corpId,
+                    onSuccess: function (result) {
+                        var code = result.code;
+
+                        $.ajax({
+                            type: "POST",
+                            //TODO...下面的域名要从配置文件中获取,不写死
+                            url: login_obj.url + '/user/api/v1/login/autoLogin',
+                            contentType: "application/json;charset=utf-8",
+                            data: JSON.stringify({ code: code, accessKey: login_obj.code, corpId: corpId }),
+                            dataType: "json",
+                            success: function (response) {
+                                // $('#user_info').html('22222'+ JSON.stringify(response.data));
+                                if (response.success == false) {
+                                    alert(JSON.stringify(response.msg) + JSON.stringify(response.code));
+                                } else {
+                                    //TODO...开始
+                                    $.ajax({
+                                        type: 'POST',
+                                        url: login_obj.api + '/user/main/login',
+                                        // contentType: "application/json;charset=utf-8",
+                                        data: {
+                                            cubeinfo: JSON.stringify(response.data)
+                                        },
+                                        dataType: "json",
+                                        success: (res) => {
+                                            if (res.code == 1) {
+                                                localStorage.setItem('userInfo', JSON.stringify(res.data));
+                                                location.href = '/app/' + tag + '/' + (follow ? ('#/' + follow) : '');
+                                                // location.href = 'test.html';
+                                            } else {
+                                                alert(res.msg);
+                                            }
+                                        },
+                                        error: function (re) {
+                                            alert("失败" + JSON.stringify(res));
+                                        }
+                                    })
+                                    //TODO...结束
+                                }
+                                // alert("成功" + JSON.stringify(response));
+                                //成功以后将response.data的信息提交给 本地用户获取接口(开发中),初始化登录用户信息
+
+
+                            },
+                            error: function (response) {
+                                alert("失败" + JSON.stringify(response));
+                            }
+                        });
+                    },
+                    onFail: function (err) {
+                        // 调用失败时回调
+                        alert("requestAuthCode失败" + JSON.stringify(err));
+                    }
+                });
+            });
+        })
+        function GetRequest() {
+            var url = location.search;
+            var theRequest = new Object();
+            if (url.indexOf("?") != -1) {
+                var str = url.substr(1);
+                strs = str.split("&");
+                for (var i = 0; i < strs.length; i++) {
+                    theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
+                }
+            }
+            return theRequest;
+        }
+    </script>
+</body>
+
+</html>

+ 20 - 24
public/config.js

@@ -1,41 +1,37 @@
 // 本地开发环境
 const local = {
-  // web_pc: 'http://127.0.0.1:7001',
-  // spjj: 'http://127.0.0.1:7001/index.html#',
-  // // web_mobile: 'https://tyyxm.bozedu.top/',
-
-  // api: 'https://aimoocapi.bozedu.top',
-  // oss: 'https://aimoocapi.bozedu.top',
-  // uc: 'https://uc.dev.bozedu.net/',
+  oss: 'http://jnjymf_api.bozedu.top/',
+  api: 'http://jnjymf_api.bozedu.top/',
+  login: 'https://qqyxt.dev.bozedu.net/app/activityRating/home/login.html',
   origin: window.location.origin,
+  wpsserver: 'http://47.99.64.200:3888/loading.html'
 }
 
 // 测试服环境
 const development = {
-  // web_pc: 'https://aimooc.bozedu.top',
-  // spjj: 'https://aimoocspjj.bozedu.top/#',
-  // api: 'https://aimoocapi.bozedu.top',
-  // oss: 'https://aimoocapi.bozedu.top',
-  // uc: 'https://uc.dev.bozedu.net/',
-  origin: window.location.origin,
+  oss: 'http://jnjymf_api.bozedu.top/',
+  api: 'http://jnjymf_api.bozedu.top/',
+  login: 'https://qqyxt.dev.bozedu.net/app/activityRating/home/login.html',
+  origin: window.location.origin + '/app/jdbg/',
+  wpsserver: 'http://47.99.64.200:3888/loading.html'
 }
 
-// // 正式服环境
+// 正式服环境
 const production = {
-  // web_pc: 'https://txwx.txhlwxx.com/',
-  // api: 'https://txwxopenapi.txhlwxx.com/',
-  // oss: 'https://txwxopenapi.txhlwxx.com/',
-  // uc: 'https://uc.bozedu.net/',
-  origin: window.location.origin,
+  oss: 'http://60.188.226.44:8090/',
+  api: 'http://60.188.226.44:8090/',
+  login: 'https://qqyxt.bozedu.net/app/activityRating/home/login.html',
+  origin: window.location.origin + '/app/jdbg/',
+  wpsserver: 'http://60.188.226.44:8001/loading.html'
 }
 
 function isWhich() {
-  if (window.location.href.startsWith(development.web_pc)) {
+  if (window.location.href.includes('localhost')) {
+    return local
+  } else if (window.location.href.includes('bozedu')) {
     return development
-  } else if (window.location.href.startsWith(production.web_pc)) {
-    return production
   } else {
-    return local
+    return production
   }
 }
-window.GLOBAL_CONFIG = isWhich()
+window.globalVariables = window.GLOBAL_CONFIG = isWhich()

+ 17 - 0
public/haveNotService.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="UTF-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>提示</title>
+</head>
+
+<body>
+  <div style="width:100vw;height:100vh;display: flex;justify-content: center;align-items: center;">
+    <h3>该应用暂未提供手机端,请前往PC端处理</h1>
+  </div>
+</body>
+
+</html>

+ 3 - 1
src/main.ts

@@ -3,9 +3,11 @@ import { createPinia } from 'pinia'
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
 import router from './router/index'
 import App from './App.vue'
+import 'amfe-flexible'
 
 import 'virtual:windi.css'
-import './styles/main.css'
+import './styles/main.scss'
+import './styles/table.scss'
 
 const app = createApp(App)
 const pinia = createPinia()

+ 0 - 2
src/pages/index.vue

@@ -6,8 +6,6 @@ defineOptions({
 })
 const menuListData = menuList
 function linkTo(path) {
-  debugger
-  alert(path)
 }
 </script>
 

+ 104 - 0
src/pages/techerFlowManager/exteriorPersonManger/detail/index.vue

@@ -0,0 +1,104 @@
+<script setup>
+const { currentRoute } = useRouter()
+const route = currentRoute.value
+const jsxw_id = route.query.jsxw_id
+const detailData = ref({})
+const loading = ref(true)
+request({
+  url: '/jdbg/jsldgl_xxbwrygl/detail',
+  data: {
+    jsxw_id,
+  },
+}).then((res) => {
+  loading.value = false
+  detailData.value = res.data.one_info
+})
+</script>
+
+<template>
+  <div>
+    <div v-if="loading" class="loadingClass">
+      <van-loading type="spinner" />
+    </div>
+    <div class="tableContainer">
+      <div class="topPart">
+        <table class="Tb" width="100%" cellspacing="0" cellpadding="0">
+          <tr>
+            <td class="titleOpt">
+              学校名称:
+            </td>
+            <td>{{ detailData.jsxw_uo_name }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              姓名:
+            </td>
+            <td>{{ detailData.jsxw_xm }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              性别:
+            </td>
+            <td>{{ detailData.jsxw_xb_option_n }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              出生年月:
+            </td>
+            <td>{{ detailData.jsxw_csny }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              学历:
+            </td>
+            <td>{{ detailData.jsxw_xl_option_n }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              专业:
+            </td>
+            <td>{{ detailData.jsxw_zy }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              工作岗位:
+            </td>
+            <td>{{ detailData.jsxw_gzgw }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              参加工作时间:
+            </td>
+            <td>{{ detailData.jsxw_cygzsj }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              身份证:
+            </td>
+            <td>{{ detailData.jsxw_sfz }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              家庭住址:
+            </td>
+            <td>{{ detailData.jsxw_address }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              手机:
+            </td>
+            <td>{{ detailData.jsxw_phone }}</td>
+          </tr>
+          <tr>
+            <td class="titleOpt">
+              备注:
+            </td>
+            <td>{{ detailData.jsxw_bz }}</td>
+          </tr>
+        </table>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style lang="scss" scoped></style>

+ 41 - 0
src/pages/techerFlowManager/exteriorPersonManger/index.vue

@@ -0,0 +1,41 @@
+<script setup>
+const list = ref([])
+const loading = ref(false)
+const finished = ref(false)
+let page = 1
+function onLoad() {
+  loading.value = true
+  request({
+    url: '/jdbg/jsldgl_xxbwrygl/index',
+    data: {
+      page,
+      limit: 20,
+    },
+  }).then((res) => {
+    const data = res.data
+    list.value = [...list.value, ...data.page_data]
+    finished.value = data.total_page === page
+    page++
+    loading.value = false
+  })
+}
+const router = useRouter()
+function cellClick(jsxw_id) {
+  router.push({ path: '/techerFlowManager/exteriorPersonManger/detail', query: { jsxw_id } })
+}
+</script>
+
+<template>
+  <div class="exteriorPersonManger">
+    <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+      <van-cell
+        v-for="item in list" :key="item" :title="item.jsxw_uo_name" :value="item.jsxw_xm"
+        @click="cellClick(item.jsxw_id)"
+      />
+    </van-list>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+.exteriorPersonManger {}
+</style>

+ 100 - 67
src/request/request.ts

@@ -1,102 +1,135 @@
 import axios from 'axios'
-import type { AxiosRequestConfig } from 'axios'
-import { ElMessage } from 'element-plus'
-import { user } from '~/store/index'
+import { showFailToast } from 'vant'
 
-const token = user.value?.token
-export interface Response {
-  code: string
-  data: any
-  msg: string
-  status: any
-  statusText: any
-  headers: any
-  config: any
-}
+import { userInfo } from '~/store/user'
+
+const { token } = userInfo
 
-const instance = axios.create({
-  baseURL: (window as any).GLOBAL_CONFIG.api,
-  timeout: 60 * 1000,
+const service = axios.create({
+  baseURL: window.globalVariables.api,
+  method: 'post',
+  timeout: 60000,
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
   },
-  method: 'post',
 })
 
-instance.interceptors.request.use(
-  async (config) => {
-    if (config.method?.toLocaleLowerCase() === 'get') {
-      config.params = Object.assign({ token }, config.params)
-    }
-    else {
-      config.data = Object.assign(
+service.interceptors.request.use(
+  (config) => {
+    // do something before request is sent
+
+    config.data = Object.assign(
+      {
+        token,
+        site: 'jnmf',
+        client: 'web',
+        api: 'json',
+        // from: 'backend',
+        issubmit: (config.url.endsWith('add') || config.url.endsWith('edit')) ? 1 : undefined,
+      },
+      config.data || {},
+    )
+    if (config.method === 'get') {
+      config.params = Object.assign(
         {
-          token: user.value?.token,
-          client: 'web',
-          api: 'json',
-          site: 'aimk',
-          issubmit: (config.url?.endsWith('add') || config.url?.endsWith('edit')) ? '1' : undefined,
+          token,
         },
-        config.data)
+        config.params || {},
+      )
     }
+    // 短时间多个请求会冲突
+    // console.groupCollapsed('axios: ' + config.url)
+    // console.log('request', config.data)
     return config
   },
   (error) => {
-    console.error('request error: ', error)
+    // do something with request error
+    console.log(error) // for debug
     return Promise.reject(error)
   },
 )
 
 // response interceptor
-instance.interceptors.response.use(
-  (response: { data: Response }) => {
-    response.data.code = response.data?.code?.toString()
-    response.data.msg = response.data.msg.replaceAll(/<.*?>/g, ' ')
+let isRelogin = false
+service.interceptors.response.use(
+  (response, c) => {
+    const { code, msg, data } = response.data
+    if (code === '10001') {
+      if (!isRelogin) {
+        isRelogin = true
+        showFailToast(msg)
+        request({
+          url: '/user/main/login',
+          data: {
+            token: data.token,
+          },
+        }).then((res) => {
+          if (res.code == 1) {
+            localStorage.setItem('userInfo', JSON.stringify(res.data))
+            isRelogin = false
+            // 视情况打开
+            location.reload()
+          }
+        })
+      }
+    }
+    else if (code !== '1') {
+      showFailToast(msg)
+    }
+    // console.log('response', response.data)
+    // console.groupEnd()
+    return response.data
+  },
+  (error) => {
+    console.error(`err${error}`) // for debug
+    return Promise.reject(error)
+  },
+)
+
+// 上传
+export const request = axios.create({
+  baseURL: window.globalVariables.api,
+  method: 'post',
+  timeout: 5000,
+  headers: {
+    'Content-Type': 'application/x-www-form-urlencoded',
+  },
+})
+request.interceptors.response.use(
+  (response) => {
     const { code, msg } = response.data
     if (code !== '1')
-      ElMessage.error(msg)
+      showFailToast(msg)
 
     return response.data
   },
   (error) => {
-    console.error(`response error: ${error}`)
+    console.log(`err${error}`) // for debug
     return Promise.reject(error)
   },
 )
 
-export default (config: AxiosRequestConfig): Promise<Response> => instance.request(config)
-
-function obj2form(data: { [key: string]: any }) {
-  const formData = new FormData()
-  Object.keys(data).forEach(key => formData.append(key, data[key]))
-  return formData
-}
-
-export const REQUEST = {
-  empty: axios,
-  default: instance,
-  import: (c: Partial<AxiosRequestConfig>) => instance({
-    timeout: 10 * 60 * 1000,
-    transformRequest: [obj2form],
-    ...c,
-  }),
-  upload: (c: Partial<AxiosRequestConfig>) => instance({
-    timeout: 3 * 60 * 1000,
-    transformRequest: [obj2form],
-    ...c,
-  }),
-  download: (c: Partial<AxiosRequestConfig>) => instance({
-    timeout: 1 * 60 * 1000,
-    method: 'get',
-    params: { token, limit: 10000, page: 1, api: 'xls', ...c },
-  }),
-}
-
-export function download(url: string, data?: object | null) {
+export function download(url, data, name) {
   const params = Object.assign({ token, limit: 10000, page: 1, api: 'xls' }, data)
   const paramsStr = Object.entries(params).map(([k, v]) => `${k}=${v}`).join('&')
   const el = document.createElement('a')
-  const href = `${(window as any).GLOBAL_CONFIG.api}${url}?${paramsStr}`
+  const href = `${window.globalVariables.api}${url}?${paramsStr}`
+  el.setAttribute('href', href)
+  name && el.setAttribute('download', name)
+  el.click()
+}
+
+export function download2(url, data, name) {
+  const el = document.createElement('a')
+  const href = `${window.globalVariables.api}/openapi/download.php?path=${url}&name=${name}`
   el.setAttribute('href', href)
+  name && el.setAttribute('download', name)
   el.click()
 }
+
+export default (...args) => {
+  if (!isRelogin)
+    return service(...args)
+  else
+    return Promise.reject({})
+}

+ 10 - 0
src/store/index.js

@@ -0,0 +1,10 @@
+import Vue from 'vue'
+import VueCompositionAPI from '@vue/composition-api'
+
+import { PiniaVuePlugin, createPinia } from 'pinia'
+
+Vue.use(VueCompositionAPI)
+
+Vue.use(PiniaVuePlugin)
+
+export default createPinia()

+ 0 - 13
src/store/index.ts

@@ -1,13 +0,0 @@
-import type { User } from './user/index.d'
-
-export const user = ref<User>(JSON.parse(localStorage.getItem('userInfo') ?? '{}'))
-
-watch(
-  () => user.value,
-  (val) => {
-    if (val === null)
-      localStorage.removeItem('userInfo')
-    else
-      localStorage.setItem('userInfo', JSON.stringify(val))
-  },
-)

+ 64 - 0
src/store/local/admin.js

@@ -0,0 +1,64 @@
+export default {
+    "user_id": "1",
+    "user_name": "admin",
+    "user_realname": "管理员",
+    "user_password": "b923bc037bffebe673963ddd046c7306990ea7aa",
+    "user_group_id": "1",
+    "user_role_id": "3",
+    "user_level_id": "8",
+    "user_detail_id": "0",
+    "user_score": "0",
+    "create_dateline": "1583718659",
+    "modify_dateline": "1651745948",
+    "isdelete": "0",
+    "area_id1": "0",
+    "area_id2": "0",
+    "area_id3": "0",
+    "area_id4": "0",
+    "dept_id": "0",
+    "class_id": null,
+    "user_phone": "",
+    "user_cardno": "320581888888888888",
+    "phone_validation": "0",
+    "parent_user_id": "0",
+    "user_nickname": "",
+    "user_avatar": "http://jnjymf_api.bozedu.top//template/default/static/img/user_avatar.png",
+    "user_email": "huming17@126.com",
+    "email_validation": "0",
+    "email_token": "",
+    "email_token_exptime": "1446220800",
+    "ischeck": "1",
+    "address": "江苏省苏州市",
+    "gender": "1",
+    "about": "",
+    "qq": "",
+    "openid": "",
+    "user_birthday": "0000-00-00",
+    "webchatopenid": "",
+    "user_level": "3",
+    "user_abalance": "0.00",
+    "user_dcash": "0.00",
+    "user_dqsj": "",
+    "user_alipay_account": "huming17@126.com",
+    "cubeUserId": "",
+    "outUserId": null,
+    "cubeOrgId": null,
+    "cubeinfo": null,
+    "user_no": "1",
+    "token": "e67dnasPY_bcbZotq6XG0qDd2RndnHfo3DwsIeLOrN_b6KvqdDClGpinzQKeU3aT7sXsv3IZ8M96XLynatbm5TvBQYDcKwNcsicUoR",
+    "setting": {
+        "sitename": "景宁教育魔方",
+        "sitedomain": "http://jnjymf_api.bozedu.top/",
+        "site_icp": "浙ICP备05048509号-1",
+        "sitelogo": "http://jnjymf_api.bozedu.top/src/assets/image/public/logo3.png",
+        "siteqrcode": "http://jnjymf_api.bozedu.top/dev.qr.png",
+        "sitefavicon": "",
+        "user_failedlogin_max": "5"
+    },
+    "user_org": [],
+    "uo_id": "",
+    "uo_type": "",
+    "uo_name": "",
+    "dept_ids": [],
+    "dept_master": []
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 2 - 0
src/store/local/la.js


Datei-Diff unterdrückt, da er zu groß ist
+ 92 - 0
src/store/local/lhl.js


Datei-Diff unterdrückt, da er zu groß ist
+ 89 - 0
src/store/local/lj.js


Datei-Diff unterdrückt, da er zu groß ist
+ 87 - 0
src/store/local/wqy.js


Datei-Diff unterdrückt, da er zu groß ist
+ 94 - 0
src/store/local/wyj.js


Datei-Diff unterdrückt, da er zu groß ist
+ 77 - 0
src/store/local/zj.js


+ 55 - 0
src/store/user.js

@@ -0,0 +1,55 @@
+import { defineStore } from 'pinia'
+import local from './local/lhl'
+
+localStorage.setItem(
+  'userInfo',
+  JSON.stringify(local),
+)
+
+const RoleMap = {
+  JLD: [1, 2, 3],
+  ZJ: [4, 5, 6],
+  JYZ: [7, 8],
+}
+export const userInfo = JSON.parse(localStorage.getItem('userInfo'))
+const {
+  token,
+  org_info,
+  user_realname,
+  user_avatar,
+  power,
+  dept_ids,
+  dept_id,
+  uo_id,
+  uo_name,
+  user_id,
+  user_org,
+} = userInfo
+
+export const user = {
+  userInfo,
+  token,
+  // role: org_info.dept_role.role_id * 1,
+  real_name: user_realname,
+  avatar: user_avatar,
+  // roleName:
+  //   Object.keys(RoleMap).find((k) =>
+  //     RoleMap[k].includes(org_info.dept_role.role_id * 1)
+  //   ) || 'None',
+  power,
+  dept_ids,
+  dept_id,
+  uo_id,
+  uo_name,
+  user_id,
+  user_org,
+}
+export const useUserStore = defineStore('user', {
+  state: () => user,
+  actions: {
+    logout() {
+      localStorage.removeItem('userInfo')
+      window.open(window.globalVariables.login, '_self')
+    },
+  },
+})

+ 0 - 5
src/store/user/index.d.ts

@@ -1,5 +0,0 @@
-export interface User {
-  user_id: string;
-  user_name: string;
-  token: string;
-}

+ 7 - 0
src/styles/main.css

@@ -10,3 +10,10 @@ body,
 html.dark {
   background: #121212;
 }
+
+.loadingClass {
+  width: 100%;
+  height: 100vh;
+  display: flex;
+  justify-content: center;
+}

+ 25 - 0
src/styles/table.scss

@@ -0,0 +1,25 @@
+.tableContainer {
+  padding: 10px;
+  width: 375px;
+
+  .topPart {
+    font-size: 14px;
+    border-radius: 10px;
+  }
+
+  .Tb tr {
+    line-height: 30px;
+  }
+
+  .Tb td {
+    height: 30px;
+    border: #CCCCCC 1px solid;
+    box-sizing: border-box;
+    padding-left: 1%;
+  }
+
+  .titleOpt {
+    min-width: 50px;
+  }
+
+}

+ 4 - 3
vite.config.ts

@@ -5,10 +5,11 @@ import { defineConfig } from 'vite'
 import Vue from '@vitejs/plugin-vue'
 import Pages from 'vite-plugin-pages'
 import Components from 'unplugin-vue-components/vite'
-import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+
 import AutoImport from 'unplugin-auto-import/vite'
 import WindiCSS from 'vite-plugin-windicss'
 import VueMacros from 'unplugin-vue-macros/vite'
+import { VantResolver } from 'unplugin-vue-components/resolvers'
 
 export default defineConfig({
   base: '/',
@@ -55,7 +56,7 @@ export default defineConfig({
       ],
       vueTemplate: true,
       resolvers: [
-        ElementPlusResolver(),
+
       ],
     }),
 
@@ -66,7 +67,7 @@ export default defineConfig({
       extensions: ['vue', 'md'],
       // allow auto import and register components used in markdown
       include: [/\.vue$/, /\.vue\?vue/, /\.md$/],
-      resolvers: [ElementPlusResolver({ importStyle: 'sass' })],
+      resolvers: [VantResolver()],
     }),
 
     // https://github.com/antfu/unocss