瀏覽代碼

1.0.2-1,1.0.2代表使用时基础的版本, -1 代表一东版本

liuyanpeng 11 月之前
當前提交
73934ca686

+ 10 - 0
.babelrc

@@ -0,0 +1,10 @@
+{
+  "presets": [
+    "@babel/env",
+    "@vue/babel-preset-jsx"
+    // ["env", { "modules": false }],
+    // "stage-3", 
+    // "es2015"
+  ],
+  "plugins": ["@vue/babel-plugin-jsx"]
+}

+ 4 - 0
.eslintignore

@@ -0,0 +1,4 @@
+/Dictionary/*
+/node_modules/*
+/client-base-v5/.eslintrc.js
+/client-base-v5/.eslintignore

+ 98 - 0
.eslintrc.js

@@ -0,0 +1,98 @@
+module.exports = {
+  // 如果想要在不同的目录中使用不同的 .eslintrc, 就需要在该目录中添加如下的配置项:
+  // 告诉eslint找.eslintrc配置文件不能往父级查找
+  // root: true,
+  // 此项是用来提供插件的,插件名称省略了eslint-plugin-,下面这个配置是用来规范vue的
+  // plugins: ['vue'],
+  extends: [
+    // add more generic rulesets here, such as:
+    'eslint:recommended', // eslint推荐规则预设
+    'plugin:vue/vue3-recommended', // eslint-plugin-vue推荐的适用于vue3的规则预设
+  ],
+  parser: 'vue-eslint-parser',
+  // 自定义 parser
+  parserOptions: {
+    parser: '@babel/eslint-parser',
+    sourceType: 'module',
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+    jquery: true,
+  },
+  rules: {
+    // override/add rules settings here, such as:
+    'vue/no-unused-vars': 'error',
+    // 此规则禁用不必要的分号。
+    'no-extra-semi': 'off',
+    // 该规则强制使用一致的分号
+    semi: ['error', 'always'],
+    // 该规则强制使用一致的反勾号、双引号或单引号。
+    quotes: ['error', 'single'],
+    // 该规则旨在强制使用一致的缩进风格。默认是 4个空格。
+    indent: ['error', 2],
+    // 该规则旨在通过限制代码行的长度来提高代码的可读性和可维护性。
+    // 一行的长度为行中的 Unicode 字符的数量。
+    'max-len': ['error', { code: 185 }],
+    // 这个规则强制在对象和数组字面量中使用一致的拖尾逗号。
+    // "always-multiline" 当最后一个元素或属性与闭括号 ] 或 } 在 不同的行时,要求使用拖尾逗号;当在 同一行时,禁止使用拖尾逗号。
+    'comma-dangle': ['error', 'always-multiline'],
+    // 该规则强制箭头函数单个参数是否要使用圆括号括起来
+    // "as-needed":在可以省略括号的地方强制不使用括号
+    'arrow-parens': ['error', 'as-needed'],
+    // 此规则在单行元素的内容之前和之后强制换行。
+    'vue/singleline-html-element-content-newline': 'off',
+    // 限制每行最多能写多少个属性
+    'vue/max-attributes-per-line': 'off',
+
+    'vue/multi-word-component-names': 'off',
+    // 标签自闭合相关设置
+    'vue/html-self-closing': [
+      'warn',
+      {
+        html: {
+          void: 'always',
+          normal: 'always',
+          component: 'always',
+        },
+      },
+    ],
+
+    'no-unused-vars': [0, {
+      // function 参数未使用不检查
+      'args': 'none',
+    }],
+
+    'vue/v-on-event-hyphenation': ['warn', 'always', {
+      'autofix': true,
+      'ignore': [],
+    }],
+
+    'vue/no-unused-components': 'off',
+    'no-unused-vars': 'off',
+
+    'vue/no-parsing-error': [
+      2, 
+      { 
+        'x-invalid-end-tag': false, 
+      },
+    ],
+
+    'camelcase': [0,{
+      'properties': 'always',
+    }],
+
+  },
+  'globals': {
+    'document': true,
+    'localStorage': true,
+    'window': true,
+    'BootstrapDialog': true,
+    'gantt': true,
+    '__webpack_public_path__': true,
+    'Notify': true,
+    'Vue': true,
+    'Handsontable': true,
+  },
+};

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+/node_modules
+/dist
+/package-lock.json

+ 0 - 0
.gitmodules


+ 11 - 0
PcClient.code-workspace

@@ -0,0 +1,11 @@
+{
+	"folders": [
+		{
+			"path": "."
+		},
+		{
+			"path": "../Plugins"
+		}
+	],
+	"settings": {}
+}

+ 46 - 0
README.md

@@ -0,0 +1,46 @@
+# PcClient 
+
+## 项目安装
+```
+npm install
+```
+
+### 项目启动
+```
+npm run serve
+```
+
+### 项目打包
+```
+npm run build
+```
+
+### 项目发布
+```
+npm publish
+```
+
+#### 项目自身更新后的部署流程
+* 1、进入 package.json 文件中将项目版本 "version" 提升;
+* 2、进入 bat 目录,在其目录下打开 cmd;
+* 3、首先在 cmd 内执行 build.bat 命令进行打包,即 npm run build;
+* 4、其次在 cmd 内执行 publish.bat 命令进行发布,即 npm publish;
+* 5、最后在 cmd 内执行 debug.bat 命令进行测试(是否成功),即 npm run dev;
+
+#### 项目子组件库更新后的部署流程
+* 1、进入 package.json 文件中将其子组件库的项目版本提升;
+* 2、进入 bat 目录,在其目录下打开 cmd;
+* 3、首先在 cmd 内执行 install.bat 命令进行安装,即 npm install;
+* 4、其次在 cmd 内执行 debug.bat 命令进行测试(是否报错),即 npm run dev;
+* 5、再次进入 package.json 文件中将其自身版本提升;
+* 6、然后在 cmd 内执行 build.bat 命令进行打包,即 npm run build;
+* 7、接着在 cmd 内执行 publish.bat 命令进行发布,即 npm publish;
+* 8、最后再次在 cmd 内执行 debug.bat 命令进行测试(是否成功),即 npm run dev;
+
+#### 注意事项
+* 1、一定要确保子组件库部署成功后再部署其自身;
+* 2、一定要在 bat 目录下执行安装、打包、发布命令;
+* 3、一定不要忘记在项目部署时更改 package.json 里的版本(两次);
+
+### 项目版本详情
+见 [Configuration Reference](http://wuzhixin.vip:4873).

+ 6 - 0
bat/build.bat

@@ -0,0 +1,6 @@
+set current_path="%~dp0"
+cd %current_path%
+cd ..
+rmdir /s/q dist
+npm run build
+pause

+ 5 - 0
bat/debug.bat

@@ -0,0 +1,5 @@
+set current_path="%~dp0"
+cd %current_path%
+cd ..
+npm run dev
+pause

+ 5 - 0
bat/install.bat

@@ -0,0 +1,5 @@
+set current_path="%~dp0"
+cd %current_path%
+cd ..
+npm install -registry=http://wuzhixin.vip:4873 --force
+pause

+ 5 - 0
bat/publish.bat

@@ -0,0 +1,5 @@
+set current_path="%~dp0"
+cd %current_path%
+cd ..
+npm publish --registry http://wuzhixin.vip:4873/
+pause

+ 63 - 0
bug-fixed/node_modules/@ant-design/icons-vue/es/insert-css.js

@@ -0,0 +1,63 @@
+// https://github.com/substack/insert-css
+var containers = []; // will store container HTMLElement references
+
+var styleElements = []; // will store {prepend: HTMLElement, append: HTMLElement}
+
+var usage = 'insert-css: You need to provide a CSS string. Usage: insertCss(cssString[, options]).';
+
+function createStyleElement() {
+  var styleElement = document.createElement('style');
+  styleElement.setAttribute('type', 'text/css');
+  return styleElement;
+} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+
+
+function insertCss(css, options) {
+  options = options || {};
+
+  if (css === undefined) {
+    throw new Error(usage);
+  }
+
+  var position = options.prepend === true ? 'prepend' : 'append';
+  var container = options.container !== undefined ? options.container : document.querySelector('head');
+  var containerId = containers.indexOf(container); // first time we see this container, create the necessary entries
+
+  if (containerId === -1) {
+    containerId = containers.push(container) - 1;
+    styleElements[containerId] = {};
+  } // try to get the correponding container + position styleElement, create it otherwise
+
+
+  var styleElement;
+
+  if (styleElements[containerId] !== undefined && styleElements[containerId][position] !== undefined) {
+    styleElement = styleElements[containerId][position];
+  } else {
+    styleElement = styleElements[containerId][position] = createStyleElement();
+
+    if (position === 'prepend') {
+      // toggled by jack, violate csp
+      //container.insertBefore(styleElement, container.childNodes[0]);
+    } else {
+      container.appendChild(styleElement);
+    }
+  } // strip potential UTF-8 BOM if css was read from a file
+
+
+  if (css.charCodeAt(0) === 0xfeff) {
+    css = css.substr(1, css.length);
+  } // actually add the stylesheet
+
+
+  if (styleElement.styleSheet) {
+    // toggled by jack, violate csp
+    //styleElement.styleSheet.cssText += css;
+  } else {
+    styleElement.textContent += css;
+  }
+
+  return styleElement;
+}
+
+export default insertCss;

+ 70 - 0
bug-fixed/node_modules/@ant-design/icons-vue/lib/insert-css.js

@@ -0,0 +1,70 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports["default"] = void 0;
+// https://github.com/substack/insert-css
+var containers = []; // will store container HTMLElement references
+
+var styleElements = []; // will store {prepend: HTMLElement, append: HTMLElement}
+
+var usage = 'insert-css: You need to provide a CSS string. Usage: insertCss(cssString[, options]).';
+
+function createStyleElement() {
+  var styleElement = document.createElement('style');
+  styleElement.setAttribute('type', 'text/css');
+  return styleElement;
+} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+
+
+function insertCss(css, options) {
+  options = options || {};
+
+  if (css === undefined) {
+    throw new Error(usage);
+  }
+
+  var position = options.prepend === true ? 'prepend' : 'append';
+  var container = options.container !== undefined ? options.container : document.querySelector('head');
+  var containerId = containers.indexOf(container); // first time we see this container, create the necessary entries
+
+  if (containerId === -1) {
+    containerId = containers.push(container) - 1;
+    styleElements[containerId] = {};
+  } // try to get the correponding container + position styleElement, create it otherwise
+
+
+  var styleElement;
+
+  if (styleElements[containerId] !== undefined && styleElements[containerId][position] !== undefined) {
+    styleElement = styleElements[containerId][position];
+  } else {
+    styleElement = styleElements[containerId][position] = createStyleElement();
+
+    if (position === 'prepend') {
+      // toggled by jack, violate csp
+      //container.insertBefore(styleElement, container.childNodes[0]);
+    } else {
+      container.appendChild(styleElement);
+    }
+  } // strip potential UTF-8 BOM if css was read from a file
+
+
+  if (css.charCodeAt(0) === 0xfeff) {
+    css = css.substr(1, css.length);
+  } // actually add the stylesheet
+
+
+  if (styleElement.styleSheet) {
+    // toggled by jack, violate csp
+    //styleElement.styleSheet.cssText += css;
+  } else {
+    styleElement.textContent += css;
+  }
+
+  return styleElement;
+}
+
+var _default = insertCss;
+exports["default"] = _default;

+ 74 - 0
package.json

@@ -0,0 +1,74 @@
+{
+  "name": "pc-client-yidong",
+  "description": "Leanwo Prodog Client",
+  "version": "1.0.2-1",
+  "author": "yangzhijie1488 <yangzhijie1488@163.com>",
+  "scripts": {
+    "ins": "npm install --registry=http://wuzhixin.vip:4873 -force",
+    "dev": "cross-env webpack serve --config ./webpack.dev.js",
+    "build": "cross-env NODE_ENV=production webpack --mode=production --config ./webpack.prod.js --progress",
+    "pub": "npm publish --registry http://wuzhixin.vip:4873/"
+  },
+  "files": [
+    "package.json",
+    "dist"
+  ],
+  "dependencies": {
+    "ant-design-vue": "^4.2.1",
+    "axios": "^0.19.2",
+    "click-outside-vue3": "^4.0.1",
+    "client-base-v5": "1.0.4",
+    "client-dic-v3": "^3.0.52",
+    "client-eam-v5": "1.0.0",
+    "client-role-v3": "^3.0.26",
+    "client-sensor-v3": "^1.0.4",
+    "client-wms-v5": "1.0.0-yd.1",
+    "client-finance-v3": "^0.0.4",
+    "dayjs": "^1.11.6",
+    "dingtalk-jsapi": "^2.8.33",
+    "js-cookie": "^2.2.1",
+    "lodash": "^4.17.21",
+    "pc-component-v3": "2.0.1",
+    "qrcode": "^1.5.3",
+    "select2": "^4.0.13",
+    "select2-bootstrap-theme": "^0.1.0-beta.10",
+    "uuid": "^8.3.2",
+    "v-tooltip": "^4.0.0-beta.17",
+    "vue-request": "^1.2.4",
+    "vue-select": "^4.0.0-beta.3",
+    "vuedraggable": "^4.1.0",
+    "xlsx": "^0.18.5"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.17.5",
+    "@babel/eslint-parser": "^7.17.0",
+    "@babel/preset-env": "^7.16.11",
+    "@intlify/vue-i18n-loader": "^4.2.0",
+    "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
+    "@vue/babel-plugin-jsx": "^1.1.1",
+    "@vue/babel-preset-jsx": "^1.4.0",
+    "babel-loader": "^8.2.3",
+    "clean-webpack-plugin": "^4.0.0",
+    "copy-webpack-plugin": "^11.0.0",
+    "cross-env": "^7.0.3",
+    "css-loader": "^6.7.0",
+    "eslint": "^8.10.0",
+    "eslint-plugin-vue": "^8.5.0",
+    "eslint-webpack-plugin": "^3.1.1",
+    "file-loader": "^6.2.0",
+    "html-webpack-plugin": "^5.5.0",
+    "mini-css-extract-plugin": "^2.6.0",
+    "style-loader": "^3.3.1",
+    "terser-webpack-plugin": "^5.3.6",
+    "vue-loader": "^17.0.0",
+    "webpack": "^5.70.0",
+    "webpack-cli": "^4.9.2",
+    "webpack-dev-server": "^4.7.4",
+    "webpack-merge": "^5.8.0",
+    "is-what": "^3.14.1"
+  },
+  "publishConfig": {
+    "access": "public",
+    "registry": "http://wuzhixin.vip:4873/"
+  }
+}

+ 232 - 0
public/casLogin.html

@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta
+      name="viewport"
+      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
+    />
+    <script
+      type="text/javascript"
+      src="/static/jquery/dist/jquery.min.js"
+    ></script>
+    <script
+      type="text/javascript"
+      src="/static/vue/dist/vue.global.prod.js"
+    ></script>
+    <style scoped>
+      .jumbotron {
+        margin-top: 30px;
+      }
+    </style>
+  </head>
+
+  <body>
+    <div id="app1" class="container">
+      <div class="jumbotron">
+        <h1>登录中</h1>
+        <p>{{message}}</p>
+        <p>
+          <button @click="logout()">注销</button>
+        </p>
+      </div>
+    </div>
+    <script>
+      Vue.createApp({
+        data: function () {
+          return {
+            urlRoot: "",
+            ticket: undefined,
+            message: "正在检查您的权限,请稍等...",
+            casUrl: undefined, // cas验证url
+            authSettingNo: undefined, // 标识
+            serviceUrl: undefined, // 传入后台验证地址
+            casLogoutUrl: undefined, // cas退出登录url
+            casTicketUrl: undefined, // cas Ticket检验Url
+            redirectUrl: undefined, // 登录成功后自动跳转的地址
+          };
+        },
+        mounted: function () {
+          this.urlRoot = this.getRootPath() + "/";
+          this.authSettingNo = this.getQueryString("authSettingNo");
+          this.existsCAS();
+        },
+        methods: {
+          getQueryString: function (name) {
+            const url = window.location.href;
+            const params = new URLSearchParams(url.split("?")[1]);
+            return params.get(name);
+          },
+
+          // 根据认证跳转系统对应页面
+          getTicket: function () {
+            const _self = this;
+            // 如果是从和系统不同的域名跳转进入系统,系统以prevUrl当作标识播放消息推送声音
+            let prevUrl = localStorage.getItem("#prevUrl");
+            if (!prevUrl) {
+              if (document.referrer) {
+                prevUrl = new URL(document.referrer).hostname;
+                localStorage.setItem("#prevUrl", prevUrl);
+              }
+            }
+            const redirect_uri = window.location.href;
+            _self.ticket = _self.getQueryString("ticket");
+            if (_self.ticket) {
+              // 1.判断是否包含重定向地址
+              // 2.判断后台验证登录是否成功
+              const newUrl = localStorage.getItem("#redirect_uri");
+              if (newUrl.indexOf("redirectUrl") != -1) {
+                // 存在redirectUrl地址,调用登录接口,跳转redirectUrl地址
+                _self.azureCasLogin(newUrl);
+              } else {
+                // 没有redirectUrl地址,跳转到x端(PC、Propass、App)选择界面,调用登录,authSettingNo、ticket、newUrl必须传递过去
+                const loginUrl = `${_self.urlRoot}#/casLogin?authSettingNo=${_self.authSettingNo}&ticket=${_self.ticket}&serviceUrl=${newUrl}`;
+                window.location.href = loginUrl;
+              }
+            } else {
+              localStorage.setItem("#redirect_uri", redirect_uri);
+              const casBoard = `${_self.casUrl}?service=${redirect_uri}`;
+              window.location.href = casBoard;
+            }
+          },
+
+          // 注销
+          logout: function () {
+            let _self = this;
+
+            window.location.href = _self.urlRoot;
+          },
+
+          // 单点登录
+          azureCasLogin: function (newUrl) {
+            let _self = this;
+            const params = {
+              ticket: _self.ticket,
+              redirect_uri: newUrl,
+              authSettingNo: _self.authSettingNo,
+              languageId: "zh-CN",
+            };
+            $.ajax({
+              url: _self.urlRoot + "api/CasLogin/login",
+              type: "post",
+              async: true,
+              data: params,
+              success: function (loginInfoData) {
+                if (loginInfoData.errorCode == 0) {
+                  _self.setLoginInfo(loginInfoData.data, newUrl);
+                } else {
+                  _self.message =
+                    "不好意思你的账号不在系统中,请点击【注销】按钮,登录其他账号";
+                  console.error(loginInfoData.errorMessage);
+                }
+              },
+              error: function (XMLHttpRequest, textStatus, errorThrown) {
+                console.log("服务器出错啦。");
+              },
+            });
+          },
+
+          //   获取cas参数值
+          existsCAS: function () {
+            const _self = this;
+            $.ajax({
+              url:
+                _self.urlRoot +
+                "api/CasLogin/casServiceProviderCheck?authSettingNo=" +
+                _self.authSettingNo,
+              type: "get",
+              contentType: "application/json",
+              dataType: "json",
+              success: function (response) {
+                if (response.errorCode === 0) {
+                  _self.casUrl = response.data.casUrl;
+                  _self.authSettingNo = response.data.no;
+                  _self.casLogoutUrl = response.data.casLogoutUrl;
+                  _self.getTicket();
+                } else {
+                  _self.message = response.errorMessage;
+                  console.log("错误", response.errorMessage);
+                }
+              },
+              error: function (XMLHttpRequest, textStatus, errorThrown) {
+                _self.message = "服务器出错啦。";
+                console.log(XMLHttpRequest, textStatus, errorThrown);
+              },
+            });
+          },
+          /**
+           * 获取主机地址
+           */
+          getRootPath: function () {
+            var protocol = window.location.protocol;
+            var host = window.location.host;
+            var localhostPath = protocol + "//" + host;
+            return localhostPath;
+          },
+
+          setLoginInfo: function (loginInfo, newUrl) {
+            const _self = this;
+            const prevUrl = localStorage.getItem("#prevUrl");
+            _self.clearLocalStorage();
+
+            _self.setLocalStorage(loginInfo,prevUrl);
+
+            const str = "redirectUrl=";
+            const endStart = newUrl.indexOf("redirectUrl");
+            const startIndex = endStart + str.length;
+            const endIndex = newUrl.length - 1;
+            const redirectUrl = newUrl.substring(startIndex, endIndex);
+
+            window.location.href = redirectUrl;
+          },
+
+          //  设置localStorage
+          setLocalStorage: function (loginInfo,prevUrl) {
+            localStorage.setItem("allowSound", false);
+            localStorage.setItem("#prevUrl", prevUrl);
+            localStorage.setItem("#LoginInfo", JSON.stringify(loginInfo));
+            localStorage.setItem("#token", loginInfo.token);
+            localStorage.setItem("#accountId", loginInfo.accountId);
+          },
+
+          clearLocalStorage: function () {
+            // 清理localStorage时需要保留的参数列表
+            var reserveParams = [
+              "hostPageBaseURL",
+              "workShopId",
+              "resourceInstanceId",
+              "resourceInstanceName",
+              "apsBaseUrl",
+              "cameraBaseURL",
+              "#rememberPassword",
+              "#userName",
+              "#password",
+              "#languageSelected",
+            ];
+            //存放的信息
+            var reserveParamValues = [];
+
+            //获取参数信息
+            var len = reserveParams.length;
+            for (let i = 0; i < len; i++) {
+              var reserveParam = reserveParams[i];
+              var reserveParamValue = "";
+              if (localStorage.getItem(reserveParam) != undefined) {
+                reserveParamValue = localStorage.getItem(reserveParam);
+              }
+              reserveParamValues.push(reserveParamValue);
+            }
+
+            //清理localStorage
+            window.localStorage.clear();
+
+            //还原参数信息
+            for (let i = 0; i < len; i++) {
+              localStorage.setItem(reserveParams[i], reserveParamValues[i]);
+            }
+          },
+        },
+      }).mount("#app1");
+    </script>
+  </body>
+</html>

二進制
public/favicon.ico


+ 105 - 0
public/index-debug.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+	
+    <!-- hard fixed by jack 20200613 -->
+	<!-- 在部署 http 网站的时候,要把下面的一行配置注释掉 -->
+	
+	<!-- 加这个的原因是 asset.html 要访问 websocket,其中 websocket 是本地的ws不是wss,如果网页是通过https访问的,那么也要求websocket是 ws的 -->
+	<!-- 把http请求转化为https请求。这样就不会再出现Mixed Content的错误了。 
+	<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">-->
+	<title>prodog</title>
+
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/font-awesome/css/font-awesome.min.css">
+	<!-- <link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/bootstrap/dist/css/bootstrap.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/bootstrap/dist/css//bootstrap-theme.min.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/bootstrap3-dialog/dist/css/bootstrap-dialog.css"> -->
+	
+	<!-- <link rel="stylesheet" type="text/css" href="/static/dhtmlxgantt/dhtmlxgantt.css"> -->
+	<!-- <link rel="stylesheet" type="text/css" href="/static/bootstrap-treeview/bootstrap-treeview.css"> -->
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/trumbowyg/css/trumbowyg.min.css">
+
+
+
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/cropper/dist/cropper.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/colResizable/colResizable-1.6.css">
+
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/jQuery-ResizableColumns/jQuery.resizableColumns.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="./api/file/getThemeCss">
+
+
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/jquery/dist/jquery.js"></script>
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/jquery.cookie/jquery.cookie.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/table-fixer.jquery/table-fixer.jquery.js"></script>
+
+	
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/cropper/dist/cropper.js"></script>
+	<!-- <script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/bootstrap/dist/js/bootstrap.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/bootstrap3-dialog/dist/js/bootstrap-dialog.js"></script> -->
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/colResizable/colResizable-1.6.js"></script>
+
+	<script nonce="*NONCE_TOKEN*" defer="defer" src="/static/bootstrap-treeview/bootstrap-treeview.js"></script>
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/jQuery-ResizableColumns/jQuery.resizableColumns.js"></script>
+	<!-- <script src="../static/js/api.js"></script> -->
+
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/reconnecting-websocket/reconnecting-websocket.js"></script>
+	
+	<!-- <script nonce="*NONCE_TOKEN*" type="text/javascript" src="../static/plugin/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script> -->
+
+	<!-- 富文本编辑器 -->
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/trumbowyg/js/trumbowyg.min.js"></script> 
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/trumbowyg/js/trumbowyg.upload.min.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/trumbowyg/js/trumbowyg.zh_cn.min.js"></script>
+
+	<!--VueJS has 2 different versions: the full version and the runtime version. 'unsafe-eval' is only needed for the full version of VueJS; the runtime version doesn't need it. 
+	The runtime-only build is fully CSP-compliant. When using the runtime-only build with Webpack + vue-loader or Browserify + vueify, your templates will be precompiled into render functions which work perfectly in CSP environments. -->
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vue/dist/vue.global.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vue-i18n/dist/vue-i18n.global.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vuex/dist/vuex.global.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vue-router/dist/vue-router.global.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dayjs/dayjs.min.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/axios/dist/axios.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/sortablejs/Sortable.js"></script>
+	
+	<!-- <link rel="stylesheet" type="text/css" href="/static/summernote/dist/summernote.min.css"> -->
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="https://unpkg.com/@wangeditor/editor@latest/dist/css/style.css">
+
+	
+
+	
+	<script nonce="*NONCE_TOKEN*"  type="text/javascript">
+		
+		var nonce_token = "*NONCE_TOKEN*";
+	</script>
+</head>
+
+<body>
+	<div id="app">
+	</div>
+	<div id="refreshCount"></div>
+	<script defer="defer" src="/static/echarts/dist/echarts.min.js"></script>
+	
+
+	<!-- <script defer="defer" type="text/javascript" src="/static/summernote/dist/summernote.min.js"></script>
+	<script defer="defer" type="text/javascript" src="/static/summernote/dist/lang/summernote-zh-CN.min.js"></script> -->
+
+	<!-- <script defer="defer" type="text/javascript" src="/static/dhtmlxgantt/dhtmlxgantt.js"></script>
+	<script defer="defer" type="text/javascript" src="/static/dhtmlxgantt/locale/locale_cn.js"></script>
+	<script defer="defer" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_auto_scheduling.js"></script>
+	<script defer="defer" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_smart_rendering.js"></script>
+	<script defer="defer" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_undo.js"></script>
+	<script defer="defer" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_fullscreen.js"></script>
+	<script defer="defer" type="text/javascript" src="/static/dhtmlxgantt/ext/api.js"></script> -->
+	<!-- <script src="../static/js/fullscreen-api.js"></script> -->
+	<!-- <script src="../static/js/problem-feedback-api.js"></script> -->
+
+</body>
+
+</html>

+ 99 - 0
public/index-release.html

@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+	
+    <!-- hard fixed by jack 20200613 -->
+	<!-- 在部署 http 网站的时候,要把下面的一行配置注释掉 -->
+	
+	<!-- 加这个的原因是 asset.html 要访问 websocket,其中 websocket 是本地的ws不是wss,如果网页是通过https访问的,那么也要求websocket是 ws的 -->
+	<!-- 把http请求转化为https请求。这样就不会再出现Mixed Content的错误了。 
+	<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">-->
+	<title>prodog</title>
+
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/font-awesome/css/font-awesome.min.css">
+	<!-- <link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/bootstrap/dist/css/bootstrap.min.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/bootstrap/dist/css//bootstrap-theme.min.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css"> -->
+	
+	<!-- <link rel="stylesheet" type="text/css" href="/static/dhtmlxgantt/dhtmlxgantt.css"> -->
+	<!-- <link rel="stylesheet" type="text/css" href="/static/bootstrap-treeview/bootstrap-treeview.css"> -->
+
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/trumbowyg/css/trumbowyg.min.css">
+
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/cropper/dist/cropper.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/colResizable/colResizable-1.6.css">
+
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="/static/jQuery-ResizableColumns/jQuery.resizableColumns.css">
+	<link nonce="*NONCE_TOKEN_CSS*" rel="stylesheet" type="text/css" href="./api/file/getThemeCss">
+
+
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/jquery/dist/jquery.min.js"></script>
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/table-fixer.jquery/table-fixer.jquery.js"></script>
+
+	
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/cropper/dist/cropper.min.js"></script>
+	<!-- <script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/bootstrap/dist/js/bootstrap.min.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/bootstrap3-dialog/dist/js/bootstrap-dialog.min.js"></script> -->
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/colResizable/colResizable-1.6.js"></script>
+
+	<script defer="defer" src="/static/bootstrap-treeview/bootstrap-treeview.js"></script>
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/jQuery-ResizableColumns/jQuery.resizableColumns.js"></script>
+	<!-- <script src="../static/js/api.js"></script> -->
+
+
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/reconnecting-websocket/reconnecting-websocket.js"></script>
+	
+	<!-- <script nonce="*NONCE_TOKEN*" type="text/javascript" src="../static/plugin/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script> -->
+
+	<!-- 富文本编辑器 -->
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/trumbowyg/js/trumbowyg.min.js"></script> 
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/trumbowyg/js/trumbowyg.upload.min.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/trumbowyg/js/trumbowyg.zh_cn.min.js"></script>
+
+
+	<!--VueJS has 2 different versions: the full version and the runtime version. 'unsafe-eval' is only needed for the full version of VueJS; the runtime version doesn't need it. 
+	The runtime-only build is fully CSP-compliant. When using the runtime-only build with Webpack + vue-loader or Browserify + vueify, your templates will be precompiled into render functions which work perfectly in CSP environments. -->
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vue/dist/vue.global.prod.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vue-i18n/dist/vue-i18n.global.prod.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vuex/dist/vuex.global.prod.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/vue-router/dist/vue-router.global.prod.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dayjs/dayjs.min.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/axios/dist/axios.min.js"></script>
+	<script nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/sortablejs/Sortable.min.js"></script>
+	
+	<!-- <link rel="stylesheet" type="text/css" href="/static/summernote/dist/summernote.min.css"> -->
+	
+	<script nonce="*NONCE_TOKEN*"  type="text/javascript">
+		var nonce_token = "*NONCE_TOKEN*";
+	</script>
+</head>
+
+<body>
+	<div id="app">
+	</div>
+	<div id="refreshCount"></div>
+	<script defer="defer" nonce="*NONCE_TOKEN*"  src="/static/echarts/dist/echarts.min.js"></script>
+
+	<!-- <script src="../static/js/fullscreen-api.js"></script> -->
+	<!-- <script src="../static/js/problem-feedback-api.js"></script> -->
+	
+	<!-- <script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/summernote/dist/summernote.min.js"></script>
+	<script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/summernote/dist/lang/summernote-zh-CN.min.js"></script> -->
+
+	<!-- <script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dhtmlxgantt/dhtmlxgantt.js"></script>
+	<script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dhtmlxgantt/locale/locale_cn.js"></script>
+	<script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_auto_scheduling.js"></script>
+	<script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_smart_rendering.js"></script>
+	<script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_undo.js"></script>
+	<script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dhtmlxgantt/ext/dhtmlxgantt_fullscreen.js"></script>
+	<script defer="defer" nonce="*NONCE_TOKEN*" type="text/javascript" src="/static/dhtmlxgantt/ext/api.js"></script> -->
+
+</body>
+
+</html>

+ 162 - 0
public/oalogin.html

@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta
+      name="viewport"
+      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
+    />
+  </head>
+
+  <body>
+    <div id="app1" class="container">
+      <div style="margin-top: 30px">
+        <h1>登录中</h1>
+        <p>{{ message }}</p>
+      </div>
+    </div>
+    <script
+      type="text/javascript"
+      src="/static/jquery/dist/jquery.min.js"
+    ></script>
+    <script
+      type="text/javascript"
+      src="/static/vue/dist/vue.global.prod.js"
+    ></script>
+    <script>
+      Vue.createApp({
+        data: function () {
+          return {
+            userId: undefined, //用户ID
+            clientId: undefined, //公司ID
+            userName: undefined, //用户姓名
+            checkCode: undefined, // 校验码
+            loginDateMs: undefined, //当前登录时间
+            message: "正在检查您的权限,请稍等...",
+            urlRoot: "",
+          };
+        },
+        mounted: function () {
+          this.urlRoot = this.getRootPath() + "/";
+          this.getParams();
+        },
+        methods: {
+          // 获取参数后登录
+          getParams: function () {
+            var _self = this;
+            const url = window.location.href
+            const params = _self.getQueryString(url)
+            _self.userId = params.userId;
+            _self.userName = params.userName;
+            _self.clientId = params.clientId;
+            _self.checkCode = params.checkCode;
+            _self.loginDateMs = params.loginDateMs;
+            this.azureSamlLogin();
+          },
+
+          // 单点登录
+          azureSamlLogin: function () {
+            let _self = this;
+            var loginData = {
+              userId: _self.userId,
+              userName: _self.userName,
+              clientId: _self.clientId,
+              checkCode: _self.checkCode,
+              loginDateMs: _self.loginDateMs,
+            };
+            $.ajax({
+              url: "authApi/LoginResource/loginPoint",
+              type: "post",
+              data: loginData,
+              success: function (loginInfo) {
+                if (loginInfo.errorCode == 0) {
+                  _self.setTokenClient();
+                  _self.setLoginInfo(loginInfo.data);
+                } else {
+                  _self.message = loginInfo.errorMessage;
+                }
+              },
+              error: function (XMLHttpRequest, textStatus, errorThrown) {},
+            });
+          },
+          // 设置LoginInfo
+          setLoginInfo: function (loginInfo) {
+            var _self = this;
+            _self.clearLocalStorage();
+            localStorage.setItem("#token", loginInfo.token);
+            localStorage.setItem("#accountId", loginInfo.accountId);
+            localStorage.setItem("#LoginInfo", JSON.stringify(loginInfo));
+            window.location.href = _self.urlRoot + "#/desktop/dashboard";
+          },
+
+          // 获取参数函数
+          getQueryString: function (url) {
+            let urlStr = url.split("?")[1];
+            const urlSearchParams = new URLSearchParams(urlStr);
+            const result = Object.fromEntries(urlSearchParams.entries());
+            return result;
+          },
+
+          // 获取主机地址
+          getRootPath: function () {
+            var protocol = window.location.protocol;
+            var host = window.location.host;
+            var localhostPath = protocol + "//" + host;
+            return localhostPath;
+          },
+
+          // 设置TokenClient
+          setTokenClient: function () {
+            var _self = this;
+            $.ajax({
+              url: "TokenClientResource/saveTokenClient",
+              type: "post",
+              contentType: "application/json",
+              beforeSend: function (request) {
+                var token = localStorage.getItem("#token");
+                var account = localStorage.getItem("#accountId");
+                request.setRequestHeader("account", account);
+                request.setRequestHeader("token", token);
+              },
+              success: function (data) {},
+              error: function (XMLHttpRequest, textStatus, errorThrown) {},
+            });
+          },
+          // 清理localStorage
+          clearLocalStorage: function () {
+            // 需要保留的参数列表
+            var reserveParams = [
+              "hostPageBaseURL",
+              "workShopId",
+              "resourceInstanceId",
+              "resourceInstanceName",
+              "apsBaseUrl",
+              "cameraBaseURL",
+            ];
+            //存放的信息
+            var reserveParamValues = [];
+
+            //获取参数信息
+            var len = reserveParams.length;
+            for (let i = 0; i < len; i++) {
+              var reserveParam = reserveParams[i];
+              var reserveParamValue = "";
+              if (localStorage.getItem(reserveParam) != undefined) {
+                reserveParamValue = localStorage.getItem(reserveParam);
+              }
+              reserveParamValues.push(reserveParamValue);
+            }
+
+            //清理localStorage
+            window.localStorage.clear();
+
+            //还原参数信息
+            for (let i = 0; i < len; i++) {
+              localStorage.setItem(reserveParams[i], reserveParamValues[i]);
+            }
+          },
+        },
+      }).mount("#app1");
+    </script>
+  </body>
+</html>

+ 153 - 0
public/ssoLogin.html

@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8" />
+    <meta
+      name="viewport"
+      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
+    />
+  </head>
+
+  <body>
+    <div id="app1" class="container">
+      <div style="margin-top: 30px">
+        <h1>登录中</h1>
+        <p>{{ message }}</p>
+      </div>
+    </div>
+    <script
+      type="text/javascript"
+      src="/static/jquery/dist/jquery.min.js"
+    ></script>
+    <script
+      type="text/javascript"
+      src="/static/vue/dist/vue.global.prod.js"
+    ></script>
+    <script>
+      Vue.createApp({
+        data: function () {
+          return {
+            token: "",
+            urlRoot: "",
+            languageId: "zh-CN",
+            message: "正在检查您的权限,请稍等...",
+          };
+        },
+        mounted: function () {
+          this.urlRoot = this.getRootPath() + "/";
+          this.getParams();
+        },
+        methods: {
+          // 获取参数后登录
+          getParams: function () {
+            var _self = this;
+            const url = window.location.href;
+            const params = _self.getQueryString();
+            _self.token = params.token;
+            this.azureSamlLogin();
+          },
+
+          // 单点登录
+          azureSamlLogin: function () {
+            const _self = this;
+            const params = {
+              token:_self.token,
+              languageId:_self.languageId,
+            }
+            $.ajax({
+              url: _self.urlRoot + `api/SsoResource/login`,
+              type: "post",
+              data:params,
+              success: function (loginInfo) {
+                if (loginInfo.errorCode == 0) {
+                  _self.setLoginInfo(loginInfo.data);
+                } else {
+                  _self.message = loginInfo.errorMessage;
+                }
+              },
+              error: function (XMLHttpRequest, textStatus, errorThrown) {},
+            });
+          },
+          // 设置LoginInfo
+          setLoginInfo: function (loginInfo) {
+            var _self = this;
+            _self.clearLocalStorage();
+            localStorage.setItem("#token", loginInfo.token);
+            localStorage.setItem("#accountId", loginInfo.accountId);
+            localStorage.setItem("#languageSelected", _self.languageId);
+            localStorage.setItem("#LoginInfo", JSON.stringify(loginInfo));
+			if (_self.isMobile() === false) {
+              localStorage.setItem('allowSound', false);
+              window.location.href = _self.urlRoot + "#/desktop/dashboard";
+            } else  {
+              window.location.href = _self.urlRoot + "app.html#/desktop/appMenu";
+            }
+            //window.location.href = _self.urlRoot + "#/desktop/dashboard";
+          },
+		  
+		   /**
+			* 判断当前的环境是手机端还是电脑端
+			*/
+		isMobile: function () {
+			if (window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) {
+				return true; // 移动端
+			} else {
+				return false; // PC端
+			}
+		},
+
+          // 获取参数函数
+          getQueryString: function () {
+            const url = window.location.href;
+            const urlStr = url.split("?")[1];
+            const urlSearchParams = new URLSearchParams(urlStr);
+            const result = Object.fromEntries(urlSearchParams.entries());
+            return result;
+          },
+
+          // 获取主机地址
+          getRootPath: function () {
+            var protocol = window.location.protocol;
+            var host = window.location.host;
+            var localhostPath = protocol + "//" + host;
+            return localhostPath;
+          },
+
+          // 清理localStorage
+          clearLocalStorage: function () {
+            // 需要保留的参数列表
+            var reserveParams = [
+              "hostPageBaseURL",
+              "workShopId",
+              "resourceInstanceId",
+              "resourceInstanceName",
+              "apsBaseUrl",
+              "cameraBaseURL",
+            ];
+            //存放的信息
+            var reserveParamValues = [];
+
+            //获取参数信息
+            var len = reserveParams.length;
+            for (let i = 0; i < len; i++) {
+              var reserveParam = reserveParams[i];
+              var reserveParamValue = "";
+              if (localStorage.getItem(reserveParam) != undefined) {
+                reserveParamValue = localStorage.getItem(reserveParam);
+              }
+              reserveParamValues.push(reserveParamValue);
+            }
+
+            //清理localStorage
+            window.localStorage.clear();
+
+            //还原参数信息
+            for (let i = 0; i < len; i++) {
+              localStorage.setItem(reserveParams[i], reserveParamValues[i]);
+            }
+          },
+        },
+      }).mount("#app1");
+    </script>
+  </body>
+</html>

+ 38 - 0
src/lang.js

@@ -0,0 +1,38 @@
+
+import { createI18n } from 'vue-i18n';
+import merge from './merge.js';
+
+import {
+    langZhCn as langZhCn0,
+    langEnUs as langEnUs0,
+} from 'client-base-v5/dist/client-base-v5.js';
+
+console.log(langZhCn0);
+
+import {
+    langZhCn as langZhCn1,
+    langEnUs as langEnUs1
+} from 'client-eam-v5/dist/client-eam-v5.js';
+
+console.log(langZhCn1);
+
+import {
+    langZhCn as langZhCn2,
+    langEnUs as langEnUs2
+} from 'client-role-v3';
+
+
+let langZhCn = merge.deepAssign(langZhCn0, langZhCn1, langZhCn2);
+let langEnUs = merge.deepAssign(langEnUs0, langEnUs1, langEnUs2);
+
+console.log(langZhCn);
+
+const i18n = createI18n({
+  locale: 'zh-CN',
+  messages: {
+    'zh-CN': langZhCn,
+    'en-US': langEnUs,
+  },
+});
+
+export { i18n };

+ 173 - 0
src/main.js

@@ -0,0 +1,173 @@
+
+// eslint-disable-next-line no-undef
+//__webpack_nonce__ = '*NONCE_TOKEN*';
+// eslint-disable-next-line no-undef
+__webpack_nonce__ = window.nonce_token;
+
+import { createApp, defineAsyncComponent } from 'vue';
+//import { createApp, defineAsyncComponent } from 'vue/dist/vue.runtime.esm-browser.prod.js';
+
+
+
+
+// 修复异步组件中AntV控件不能打开的BUG。
+// import Antd from 'ant-design-vue';
+import * as Antd from 'ant-design-vue';
+import 'ant-design-vue/dist/reset.css';
+window.Antd = Antd;
+//console.log(Antd);
+
+// 修复异步组件中AntV控件不能打开的BUG。
+import * as AntdComponents from 'ant-design-vue';
+window.Antd = AntdComponents;
+
+
+
+
+import { createRouter, createWebHashHistory } from 'vue-router';
+import { createStore } from 'vuex';
+
+import * as PcComponentV3 from 'pc-component-v3';
+import 'pc-component-v3/dist/pc-component-v3.css';
+window.PcComponentV3 = PcComponentV3;
+
+import VTooltip from 'v-tooltip';
+import 'v-tooltip/dist/v-tooltip.css';
+
+import * as dd from 'dingtalk-jsapi';
+window.dd = dd;
+
+import 'jquery';
+
+
+import 'client-base-v5/dist/client-base-v5.css';
+
+
+import 'client-role-v3/dist/client-role-v3.css';
+// import 'client-dictionary-v3/dist/client-dictionary-v3.css';
+import 'client-dic-v3/dist/client-dic-v3.css';
+
+import 'client-eam-v5/dist/client-eam-v5.css';
+import 'client-wms-v5/dist/client-wms-v5.css';
+import 'client-sensor-v3/dist/client-sensor-v3.css';
+import 'client-finance-v3/dist/client-finance-v3.css';
+
+import { store } from './store.js';
+import { i18n } from './lang.js';
+import { router } from './routes/index.js';
+
+import { App, Common, PushMessage, CurdWindowModal, AuthImage, WorkflowUserDefine, ApproveComment, HistoryApproveComment } from 'client-base-v5/dist/client-base-v5.js';
+import { Notify, Uuid } from 'pc-component-v3/dist/pc-component-v3.js';
+window.Common = Common;
+window.Notify = Notify;
+window.Uuid = Uuid;
+
+
+import * as AntDesignIconsVue from '@ant-design/icons-vue';
+window.AntDesignIconsVue = AntDesignIconsVue;
+
+
+
+const app = createApp(App);
+app.use(Antd);
+app.use(i18n);
+app.use(router);
+app.use(VTooltip);
+app.use(store);
+app.use(PcComponentV3);
+app.use(router);
+app.mount('#app');
+
+// 全局注册组件, CURD窗口模态框编辑器
+app.component('CurdWindowModal', CurdWindowModal);
+// 图片显示
+app.component('AuthImage', AuthImage);
+// 发起审批
+app.component('WorkflowUserDefine', WorkflowUserDefine);
+// 审批状态
+app.component('ApproveComment', ApproveComment);
+// 历史审批记录
+app.component('HistoryApproveComment', HistoryApproveComment);
+
+
+window.app = app;
+
+
+// 当页面刷新后重新打开声音提示
+if (window.performance.navigation.type == 1) {
+  localStorage.setItem('allowSound', false);
+}
+
+
+/**
+ * 路由钩子
+ * @param  {[type]} (to, from,         next [description]
+ * @return {[type]}      [description]
+ */
+router.beforeEach((to, from, next) => {
+  let allowSound = localStorage.getItem('allowSound');
+  // 不是登录页才进行消息推送
+  if (to.fullPath !== '/login' && !to.path.includes('login') && !to.path.includes('Login')) {
+    PushMessage.openWebSocket();
+    if (allowSound && allowSound == 'false') {
+      PushMessage.messageModal();
+    }
+  } else {
+    PushMessage.closeWebsocket();
+  }
+
+  let funtionAccessDtos = [];
+  if (to.matched.some(function (item) {
+
+    // 判断是否需要登录才可以访问
+    if (item.meta.loginRequired) {
+      if (item.meta.functionAccessArray != undefined || item.meta.functionAccessArray != null) {
+        funtionAccessDtos = item.meta.functionAccessArray;
+      }
+      if (funtionAccessDtos != null) {
+        funtionAccessDtos.forEach(funtionAccessDto => {
+          if (typeof (funtionAccessDto.itemNo) === 'string') {
+            funtionAccessDto.itemNo = [funtionAccessDto.itemNo];
+          }
+        });
+      }
+    }
+    return item.meta.loginRequired;
+  })) {
+    // 判断是否已登录		
+    var token = localStorage.getItem('#token');
+    if (token == undefined || token.length == 0) {
+      // 如果没有登录则直接返回
+      next('/login');
+    } else {
+      // 判断该路由需要具备”xxx”功能-“x1”功能项,”xxx”功能-“x2“功能项,”yyy”功能-“y1”功能项访问权限的用户才可以访问
+      $.ajax({
+        url: Common.getApiURL(
+          'RoleResourceV3/canVisitFunctionAccess',
+        ),
+        type: 'post',
+        dataType: 'json',
+        contentType: 'application/json',
+        data: JSON.stringify(funtionAccessDtos),
+        beforeSend: function (request) {
+          Common.addTokenToRequest(request);
+        },
+        success: function (data) {
+          if (data.errorCode === 0 && data.data === true) {
+            next();
+            return;
+          } else {
+            next('/desktop/no-role');
+            return;
+          }
+        },
+        error: function (XMLHttpRequest, textStatus, errorThrown) {
+          Common.processException(XMLHttpRequest, textStatus, errorThrown);
+        },
+      });
+    }
+  } else {
+    next();
+    return;
+  }
+});

+ 65 - 0
src/merge.js

@@ -0,0 +1,65 @@
+/**
+ * 深度合并对象
+ * @param  {...any} param 
+ * @returns 
+ */
+function deepAssign(...param) {
+  let result = Object.assign({}, ...param);
+  for (let item of param) {
+    for (let [idx, val] of Object.entries(item)) {
+      if (typeof val === 'object') {
+        result[idx] = deepAssign(result[idx], val);
+      }
+    }
+  }
+  return result;
+}
+
+
+/**
+ * 合并数组
+ * @param {*} arr1 数组1 
+ * @param {*} arr2 数组2
+ * @returns 
+ */
+function mergeArray(arr1, arr2) {
+  var arr = [];
+  for (var k = 0, len = arr1.length; k < len; k++) {
+    arr.push(arr1[k]);
+  }
+  for (var i = 0, len2 = arr2.length; i < len2; i++) {
+    //是否添加该元素
+    var flag = true;
+    for (var j = 0, len1 = arr.length; j < len1; j++) {
+      //如果path相同,则合并children;如果children不存在,则不合并;
+      if (arr[j].path == arr2[i].path) {
+        flag = false;
+        if (arr[j].children instanceof Array && arr2[i].children instanceof Array) {
+          arr[j].children = this.mergeArray(arr[j].children, arr2[i].children);
+        }
+      }
+    }
+    if (flag) {
+      arr.push(arr2[i]);
+    }
+  }
+  //将path为"*"的项移到最后
+  var temp;
+  var index;
+  for (var n = 0, len3 = arr.length; n < len3; n++) {
+    if (arr[n].path == '*' || arr[n].path == '/*') {
+      index = n;
+    }
+  }
+  if (index != undefined) {
+    temp = arr[index];
+    arr[index] = arr[len3 - 1];
+    arr[len3 - 1] = temp;
+  }
+  return arr;
+}
+
+export default {
+  deepAssign,
+  mergeArray,
+};

+ 31 - 0
src/routes/index.js

@@ -0,0 +1,31 @@
+import { createRouter, createWebHashHistory } from 'vue-router';
+
+import routes0 from './route-base-v5.js';
+import routes1 from './route-role-v3.js';
+// import routes2 from './route-dictionary-v3.js';
+import routes3 from './route-dic-v3.js';
+import routes5 from './route-eam-v5.js';
+import routes6 from './route-wms-v5.js';
+// import routes7 from './route-trace-v3.js';
+import routes8 from './route-sensor-v3.js';
+import routes9 from './route-finance-v3.js';
+
+import merge from '../merge.js';
+
+let routes = merge.mergeArray(routes0, routes1);
+// routes = merge.mergeArray(routes, routes2);
+routes = merge.mergeArray(routes, routes3);
+routes = merge.mergeArray(routes, routes5);
+routes = merge.mergeArray(routes, routes6);
+// routes = merge.mergeArray(routes, routes7);
+routes = merge.mergeArray(routes, routes8);
+routes = merge.mergeArray(routes, routes9);
+
+const router = createRouter({
+  history: createWebHashHistory(),
+  base: '/',
+  mode: 'hash',
+  routes: routes,
+});
+
+export { router };

+ 374 - 0
src/routes/route-base-v5.js

@@ -0,0 +1,374 @@
+
+import { ProcessReport } from 'pc-component-v3';
+
+import {
+    Login,
+    Desktop,
+    Dashboard,
+    SheetWindow,
+    TabFormEdit1,
+    TabFormView1,
+    AttributeEditPanel,
+    TabAudit,
+    Approve,
+    RoleCurdField,
+    RoleCurdFieldTab,
+    TabDataSort,
+    WorkflowEdit,
+    DataImportPanel,
+    Notification,
+    SingleNotification,
+    GenerateDocumentTool,
+    UserParameters,
+    OrganizationEditPanel,
+    BarCodeEdit,
+    Archive,
+    UserSearch,
+    Monitor,
+    BatchUpdateField,
+    ActivitiAdmin,
+    DocManagement,
+    PrintPage,
+    NotFound,
+    Camera,
+    Cropper,
+    WebSocketCapture,
+    WebRtcCapture,
+    InfoWindowPage,
+    TaskProcessManagement,
+    ExecutionList,
+    NoRole,
+    PrivacyStatement,
+    StudyVideo,
+    ResetPassword,
+    PdfPrint,
+    RetrievePassword,
+    KnowledgeTrain1,
+    KnowledgeTrainAnswer,
+    ReportApprove,
+    ExcelReport,
+    DateExcelReport,
+    DelegationReport,
+    DataArchive,
+    ArchivalRecord,
+    ExcelImport,
+    IdentityManager,
+    CreateIdentity,
+    SamlLogin,
+    CasLogin,
+    PrinterConfiguration,
+    CurdWindow1,
+    ShortcutMenu,
+    FlowChart,
+    DeviceManagement,
+    DeviceTimingSwitcher,
+    OperationLog,
+    ViewEdit,
+    LoginGraphic,
+    LoginNode,
+} from 'client-base-v5/dist/client-base-v5.js';
+
+
+const router = [
+    { path: '/', redirect: '/login' },
+    {
+        path: '/login',
+        component: Login,
+        meta: {
+            loginRequired: false,
+        },
+    },
+    {
+        path: '/samlLogin',
+        component: SamlLogin,
+        meta: {
+            loginRequired: false,
+        },
+    },
+    {
+        path: '/casLogin',
+        component: CasLogin,
+        meta: {
+            loginRequired: false,
+        },
+    },
+    {
+        path: '/desktop', component: Desktop,
+        children: [
+            //仪表盘
+            {
+                path: 'dashboard',
+                component: Dashboard,
+                meta: {
+                    loginRequired: false,
+                    functionAccessArray: [
+                        {
+                            functionNo: '资产仪表盘',
+                            itemNo: ['公司资产统计', '部门资产统计'],
+                        },
+                        {
+                            functionNo: '仓库仪表盘',
+                            itemNo: '出入库统计',
+                        },
+                    ],
+                },
+            },
+            // Web电子表格 窗口
+            { path: 'sheetWindow/:windowNo', component: SheetWindow },
+
+            // 快捷菜单
+            { path: 'shortcutMenu',name:'ShortcutMenu', component: ShortcutMenu },
+
+
+            { path: 'window1/:windowNo', component: CurdWindow1 },
+
+            // eslint-disable-next-line
+            { path: 'window1/window-edit/:type/:uuid', component: TabFormEdit1 },
+            // eslint-disable-next-line
+            { path: 'window1/window-edit/:type/:windowNo/:tabIndex', component: TabFormEdit1 },
+            // eslint-disable-next-line
+            { path: 'window1/window-edit/:type/:windowNo/:tabIndex/:recordId', component: TabFormEdit1 },
+
+            // CRUD不可编辑窗口
+            // eslint-disable-next-line
+            { path: 'window1/window-read/:type/:uuid', component: TabFormView1 },
+            // eslint-disable-next-line
+            { path: 'window1/window-read/:type/:windowNo/:tabIndex/:recordId', component: TabFormView1 },
+
+            // 属性编辑窗口
+            {
+                path: 'attribute-edit/:uuid', component: AttributeEditPanel,
+                'meta': {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220321_212846',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+            },
+            // 审计数据窗口
+            { path: 'window/window-audit/:uuid', component: TabAudit },
+            // 查询窗口
+            { path: 'info/:infoWindowNo', component: InfoWindowPage },
+
+            // 流程和报口
+            { path: 'process-report/:no', component: ProcessReport },
+            // 审批
+            { path: 'approve', component: Approve },
+            // 无权限访问界面
+            { path: 'no-role', component: NoRole },
+            //角色CURD访问权限(父页签)
+            {
+                path: 'roleCurdField',
+                component: RoleCurdField,
+                meta: {
+                    loginRequired: true,
+                    functionAccessArray: [
+                        {
+                            functionNo: 'xxx',
+                            itemNo: ['x1', 'x2'],
+                        },
+                        {
+                            functionNo: 'yyy',
+                            itemNo: 'y1',
+                        },
+                    ],
+                },
+            },
+
+            //角色CURD访问权限(子页签)
+            {
+                path: 'roleCurdFieldTab', component: RoleCurdFieldTab,
+                'meta': {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220321_212846',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+            },
+
+            // 页签字段排序
+            { path: 'tab-data-sort/:uuid', component: TabDataSort },
+            // 工作流编辑
+            {
+                path: 'workflow-edit', component: WorkflowEdit,
+                meta: {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220424_144806',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+            },
+            // 数据导入
+            {
+                path: 'data-import-panel', component: DataImportPanel,
+                meta: {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220328_093317',
+                            'itemNo': '2',
+                        },
+                        {
+                            'functionNo': '20220712_133418',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+
+            },
+            // 数据导入
+            { path: 'data-import-panel/:uuid', component: DataImportPanel },
+            // 通知
+            { path: 'notification', component: Notification },
+            // 单条通知
+            // eslint-disable-next-line
+            { path: 'single-notification/:messageId', component: SingleNotification },
+            // 生单
+            // eslint-disable-next-line
+            { path: 'generate-document/:type/:infoWindowNo/:uuid', component: GenerateDocumentTool },
+            // 用户参数
+            { path: 'userParameters', component: UserParameters },
+            // 部门编辑
+            {
+                path: 'OrganizationEditPanel', component: OrganizationEditPanel,
+                meta: {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220314_103037',
+                            'itemNo': '2',
+                        },
+                    ],
+                },
+            },
+            // 条码编辑(老编辑器)
+            {
+                path: 'barCode-edit-o', component: BarCodeEdit,
+                meta: {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220328_092713',
+                            'itemNo': '3',
+                        },
+                    ],
+                },
+            },
+            // 归档
+            { path: 'archive', component: Archive },
+            // 归档
+            { path: '/desktop/dataArchive', component: DataArchive },
+            // 归档记录
+            { path: '/desktop/ArchivalRecord', component: ArchivalRecord },
+            //用户搜索
+            { path: 'userSearch', component: UserSearch },
+            //抓拍
+            { path: 'monitor', component: Monitor },
+            //批量修改字段
+            {
+                path: 'batchUpdateField/:uuid', component: BatchUpdateField,
+                'meta': {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220322_095822',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+            },
+            // 工作流管理员2019
+            { path: 'activitiAdmin', component: ActivitiAdmin },
+            // 工作流管理员2019
+            {
+                path: 'DocManagement', component: DocManagement,
+                'meta': {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220424_144806',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+            },
+
+
+
+
+            // 任务流程管理
+            {
+                path: 'taskProcessManagement', component: TaskProcessManagement,
+                meta: {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220424_144806',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+            },
+
+            // 执行列表
+            {
+                path: 'executionList', component: ExecutionList,
+                meta: {
+                    'loginRequired': true,
+                    'functionAccessArray': [
+                        {
+                            'functionNo': '20220424_144806',
+                            'itemNo': '1',
+                        },
+                    ],
+                },
+            },
+
+            { path: 'pdf-print', component: PdfPrint },
+
+            { path: 'report-approve', component: ReportApprove },
+        ],
+    },
+
+    // 打印页面
+    { path: '/single/PrintPage', component: PrintPage },
+
+    { path: '/webrt', component: WebRtcCapture },
+    { path: '/WebSocketCapture', component: WebSocketCapture },
+    { path: '/cropper', component: Cropper },
+    { path: '/camera', component: Camera },
+
+    { path: '/notFound', component: NotFound },
+    { path: '/privacy-statement', component: PrivacyStatement },
+    { path: '/studyVideo', component: StudyVideo },
+    { path: '/resetPassword', component: ResetPassword },
+
+    { path: '/retrievePassword', component: RetrievePassword },
+    { path: '/knowledgeTrain', component: KnowledgeTrain1 },
+    { path: '/knowledgeTrainAnswer', component: KnowledgeTrainAnswer },
+    { path: '/excelReport/:processReportNo', component: ExcelReport },
+    { path: '/dateExcelReport/:processReportNo', component: DateExcelReport },
+    { path: '/desktop/delegationReport', component: DelegationReport },
+    { path: '/desktop/excelImport', component: ExcelImport },
+    { path: '/desktop/identityManager', component: IdentityManager },
+    { path: '/desktop/CreateIdentity', component: CreateIdentity },
+    { path: '/desktop/printerConfiguration', component: PrinterConfiguration },
+    { path: '/desktop/flowChart', component: FlowChart },
+    { path: '/desktop/deviceManagement', component: DeviceManagement },
+    { path: '/desktop/deviceTimingSwitcher', component: DeviceTimingSwitcher },
+    { path: '/desktop/operationLog', component: OperationLog },
+    { path: '/desktop/viewEdit', component: ViewEdit },
+    { path: '/loginGraphic', component: LoginGraphic },
+    { path: '/loginNode', component: LoginNode },
+];
+
+export default router;

+ 52 - 0
src/routes/route-dic-v3.js

@@ -0,0 +1,52 @@
+
+import {
+    InfoWindow,
+    DicMenu,
+    DataDimensionType,
+    CurdWindow,
+    SqlApi,
+    HtmlWindow,
+    CustomerWindow,
+    DashboardWindow,
+    DataTemplate,
+    ProcessReportWindow,
+    MenuWindow,
+    AppMenuWindow,
+    FunctionEdit,
+    RoleTemplate,
+    InfoWindowDrawer,
+    CurdFilterComponent,
+    LowcodeWindow,
+    DeployVueFile,
+    PostTypeEdit,
+    TaskTemplateEdit,
+    ProcessEdit,
+} from 'client-dic-v3';
+
+
+const routes = [
+    { path: '/', redirect: '/dic-management' },
+    { path: '/dic-management/', component: DicMenu },
+    { path: '/dic-management/info-window', component: InfoWindow },
+    { path: '/dic-management/data-dimension-type', component: DataDimensionType },
+    { path: '/dic-management/curd-window', component: CurdWindow },
+    { path: '/dic-management/sql-api', component: SqlApi },
+    { path: '/dic-management/html-window', component: HtmlWindow },
+    { path: '/dic-management/customer-window', component: CustomerWindow },
+    { path: '/dic-management/dashboard-window', component: DashboardWindow },
+    { path: '/dic-management/data-template', component: DataTemplate },
+    { path: '/dic-management/process-report-window', component: ProcessReportWindow },
+    { path: '/dic-management/menu-window', component: MenuWindow },
+    { path: '/dic-management/app-menu-window', component: AppMenuWindow },
+    { path: '/dic-management/function-edit', component: FunctionEdit },
+    { path: '/dic-management/post-type-edit', component: PostTypeEdit },
+    { path: '/dic-management/task-template-edit', component: TaskTemplateEdit },
+    { path: '/dic-management/process-edit', component: ProcessEdit },
+    { path: '/dic-management/role-template', component: RoleTemplate },
+    { path: '/dic-management/info-window-drawer', component: InfoWindowDrawer },
+    { path: '/dic-management/curd-filter-component', component: CurdFilterComponent },
+    { path: '/dic-management/lowcode-window', component: LowcodeWindow },
+    { path: '/dic-management/deploy-vue-file', component: DeployVueFile },
+];
+
+export default routes;

+ 291 - 0
src/routes/route-eam-v5.js

@@ -0,0 +1,291 @@
+import {
+    HelloWorld,
+    AssetBasicSet,
+    DepreciationDetailList,
+    DepreciationDistribution,
+    AssetWorkLoadInput,
+    SettleAccountAtTheEndOfMonth,
+    InventoryCheckLoss,
+    ConsolidatedAssetInventory,
+    AutoGenerateAsset,
+    AssetCheck,
+    CustomPrintAssetInstance,
+    CopyProperty,
+    DataSync,
+    DataSyncEdit,
+    AssetDetailList,
+    AssetByRfid,
+    AssetInventorySearch,
+    AssetInventoryLostConfirm,
+    PrintAsset,
+    AssetBatchOperationQuery,
+    AssetBatchOperationOrganization,
+    AssetBatchOperationScrap,
+    AssetInstancePrint,
+    AssetInstanceSearchDetail,
+    GenerateDocumentTool,
+    ExportPictureLibrary,
+    AssetBatchOperationModifyUseStatus,
+    AssetBatchOperationModifyContact,
+    PrintPreview,
+    AssetInventory,
+    AssetInventoryStep1,
+    ManuallyConfirmCountingData,
+    PerformInventoryTasks,
+    InventoryDataProcessing,
+    AssetLabelPrint,
+    AssetLabelPrinting,
+    InventoryAssetInstanceSearch,
+    RunDataArchive,
+    AssetRfidRecord,
+    BatchUploadImages,
+    AssetInstanceFullCalendar,
+    InventoryGlobalView,
+    AssetsDisposal,
+    ExecuteAssetDisposal,
+    DepreciationIndex,
+    AssetManagerDepreciation,
+    AccountingSubject
+} from 'client-eam-v5/dist/client-eam-v5.js';
+
+
+
+const routes = [
+    { path: '/eam/hello-world', component: HelloWorld },
+    {
+        path: '/eam/assetBasicSet', component: AssetBasicSet,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220322_095049',
+                    'itemNo': '1',
+                },
+            ],
+        },
+    },
+    {
+        path: '/eam/depreciationDetailList', component: DepreciationDetailList,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220322_095822',
+                    'itemNo': '1',
+                },
+            ],
+        },
+    },
+    {
+        path: '/eam/depreciationDistribution', component: DepreciationDistribution,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220322_095822',
+                    'itemNo': '1',
+                },
+            ],
+        },
+    },
+    {
+        path: '/eam/assetWorkLoadInput', component: AssetWorkLoadInput,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220322_095822',
+                    'itemNo': '1',
+                },
+            ],
+        },
+    },
+    {
+        path: '/eam/settleAccountAtTheEndOfMonth', component: SettleAccountAtTheEndOfMonth,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220322_095822',
+                    'itemNo': '1',
+                },
+            ],
+        },
+    },
+    {
+        path: '/eam/asset-inventory-check-lose/:uuid', component: InventoryCheckLoss,
+
+    },
+    {
+        path: '/eam/consolidated-AssetInventory/:uuid', component: ConsolidatedAssetInventory,
+
+    },
+    // // 自动生成资产
+    {
+        path: '/eam/auto-generate-asset', component: AutoGenerateAsset,
+
+    },
+    {
+        path: '/eam/auto-assetCheck-asset', component: AssetCheck,
+    },
+    {
+        path: '/eam/custom-print-assetInstance', component: CustomPrintAssetInstance,
+
+    },
+    // //复制资产
+    {
+        path: '/eam/copy-property/:uuid', component: CopyProperty,
+    },
+    {
+        path: '/eam/data-sync', component: DataSync,
+    },
+    {
+        path: '/eam/data-sync-edit', component: DataSyncEdit,
+    },
+    {
+        path: '/eam/assetDetailList', component: AssetDetailList,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220412_094415',
+                    'itemNo': [
+                        '1',
+                        '2',
+                    ],
+                },
+            ],
+        },
+    },
+    //资产进出记录
+    {
+        path: '/eam/AssetByRfid', component: AssetByRfid,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220322_095845',
+                    'itemNo': '1',
+                },
+            ],
+        },
+    },
+    // 资产卡片查询生成盘点单详情
+    {
+        path: '/eam/assetInventorySearch/:uuid', component: AssetInventorySearch,
+    },
+    // 人工确认盘亏数据
+    {
+        path: '/eam/AssetInventoryLostConfirm/:uuid', component: AssetInventoryLostConfirm,
+    },
+    //资产打印
+    { path: '/eam/printAsset/:uuid', component: PrintAsset },
+    //批量转移
+    { path: '/eam/assetBatchOperationQuery/:changeType', component: AssetBatchOperationQuery },
+    //批量待转移
+    {
+        path: '/eam/assetBatchOperation/organizationChange', component: AssetBatchOperationOrganization,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220412_105926',
+                    'itemNo': '1',
+                },
+            ],
+        },
+    },
+    //批量待报废
+    {
+        path: '/eam/assetBatchOperation/assetInstanceScrap', component: AssetBatchOperationScrap,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220412_105926',
+                    'itemNo': '2',
+                },
+            ],
+        },
+    },
+    //打开资产卡片打印队列
+    {
+        path: '/eam/assetInstancePrint', component: AssetInstancePrint,
+    },
+    {
+        path: '/eam/assetInstanceSearchDetail', component: AssetInstanceSearchDetail,
+    },
+    // 生单组件
+    {
+        path: '/eam/generate-document/:type/:infoWindowNo/:uuid', component: GenerateDocumentTool,
+    },
+    //导出图片库
+    {
+        path: '/eam/exportPictureLibrary', component: ExportPictureLibrary,
+    },
+    //批量待修改使用状态
+    {
+        path: '/eam/assetBatchOperation/assetInstanceModifyUseStatus', component: AssetBatchOperationModifyUseStatus,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220412_105926',
+                    'itemNo': '3',
+                },
+            ],
+        },
+    },
+    //批量待修改联系人
+    {
+        path: '/eam/assetBatchOperation/assetInstanceModifyContact', component: AssetBatchOperationModifyContact,
+        meta: {
+            'loginRequired': true,
+            'functionAccessArray': [
+                {
+                    'functionNo': '20220412_105926',
+                    'itemNo': '4',
+                },
+            ],
+        },
+    },
+    {
+        path: '/eam/printPreview', component: PrintPreview,
+    },
+    {
+        path: '/eam/assetInventory', component: AssetInventory,
+    },
+    {
+        path: '/eam/assetInventoryStep1', component: AssetInventoryStep1,
+    },
+    // 人工确认盘亏数据
+    {
+        path: '/eam/manuallyConfirmCountingData', component: ManuallyConfirmCountingData,
+    },
+    {
+        path: '/eam/performInventoryTasks/:id', component: PerformInventoryTasks,
+    },
+    {
+        path: '/eam/inventoryDataProcessing', component: InventoryDataProcessing,
+    },
+    {
+        path: '/eam/assetLabelPrint', component: AssetLabelPrint,
+    },
+    {
+        path: '/eam/assetLabelPrinting', component: AssetLabelPrinting,
+    },
+    { path: '/eam/inventoryAssetInstanceSearch', component: InventoryAssetInstanceSearch },
+    { path: '/eam/runDataArchive', component: RunDataArchive },
+    { path: '/eam/assetRfidRecord', component: AssetRfidRecord },
+    { path: '/eam/batchUploadImages', component: BatchUploadImages },
+    { path: '/eam/assetInstanceFullCalendar', component: AssetInstanceFullCalendar },
+    { path: '/eam/inventoryGlobalView', component: InventoryGlobalView, },
+    { path: '/eam/disposalApplication', component: AssetsDisposal }, // 处置申请单
+    { path: '/eam/executeAssetDisposal', component: ExecuteAssetDisposal }, // 执行处置
+    { path: '/eam/assetPeriodDepreciate', component: DepreciationIndex }, // 资产折旧
+    { path: '/eam/assetManagerDepreciation', component: AssetManagerDepreciation }, // 资产折旧-单位资产管理员
+    { path: '/eam/accountingSubject', component: AccountingSubject }, // 会计科目
+];
+
+
+export default routes;

+ 35 - 0
src/routes/route-finance-v3.js

@@ -0,0 +1,35 @@
+import {
+  AccountVoucher,
+  AutoGenerateAccountVoucher,
+  InsertAccountVoucher,
+  UpdateAccountVoucher,
+  AccountSubject,
+  FinanceBasicSetting,
+  Period,
+  SettleAccountAtTheEndOfMonth,
+} from 'client-finance-v3/dist/client-finance-v3.js';
+
+
+
+const routes = [
+
+  { path: '/desktop/AccountVoucher', component: AccountVoucher },
+
+  { path: '/desktop/AutoGenerateAccountVoucher', component: AutoGenerateAccountVoucher },
+
+  { path: '/desktop/InsertAccountVoucher', component: InsertAccountVoucher },
+
+  { path: '/desktop/UpdateAccountVoucher', component: UpdateAccountVoucher },
+
+  { path: '/desktop/AccountSubject', component: AccountSubject },
+
+  { path: '/desktop/FinanceBasicSetting', component: FinanceBasicSetting },
+
+  { path: '/desktop/Period', component: Period },
+
+  { path: '/desktop/SettleAccountAtTheEndOfMonth', component: SettleAccountAtTheEndOfMonth },
+
+];
+
+
+export default routes;

+ 11 - 0
src/routes/route-role-v3.js

@@ -0,0 +1,11 @@
+
+import {
+    RoleWindow,
+} from 'client-role-v3';
+
+/** 角色窗口 */
+const routes = [
+    { path: '/role-managment/role-window', component: RoleWindow },
+];
+
+export default routes;

+ 19 - 0
src/routes/route-sensor-v3.js

@@ -0,0 +1,19 @@
+import{
+    HumitureChart,
+    HumitureWarningChart,
+    MasterControlRoom
+} from 'client-sensor-v3/dist/client-sensor-v3.js'
+
+const routes = [
+
+    //项目管理员列表
+    { path: '/sensor/HumitureChart', component: HumitureChart},
+    // 已完成项目追踪
+    { path: '/sensor/HumitureWarningChart', component: HumitureWarningChart},
+
+    // 已完成项目追踪
+    { path: '/sensor/masterControlRoom', component: MasterControlRoom},
+      
+  ];
+
+export default routes;

+ 74 - 0
src/routes/route-trace-v3.js

@@ -0,0 +1,74 @@
+// import{
+//     HelloWorld,
+//     TraceList,
+//     TraceDynamic,
+//     ProjectUserList,
+//     ProjectList,
+//     TraceCreate,
+//     TraceUpdate,
+//     Trace,
+//     TraceCommentCreate,
+//     TraceCommentEdit,
+//     TraceTimeLineCreate,
+//     TraceTimeLineEdit,
+//     UserNotFinishedTrace,
+//     UseFinishedTrace,
+//     NotFinishedProjectTraces,
+//     FinishedProjectTraces,
+//     TeamList,
+//     TraceConfig,
+//     ProjectArchive,
+//     ProjectManagement,
+//     ProjectAdminUserList,
+//     CompleteProjectList,
+// } from 'client-trace-v3/dist/client-trace-v3.js'
+
+
+// const routes = [
+
+//     { path: '/trace/hello-world', component: HelloWorld},
+  
+//     // 追踪单主界面
+//     // { path: '/trace/traceMenu/:uuid', component: TraceMenu},
+//     { path: '/trace/traceList/:traceState', component: TraceList},
+//     { path: '/trace/traceDynamic', component: TraceDynamic},
+//     //项目人员列表
+//     { path: '/trace/projectUserList/:projectId', component: ProjectUserList},
+//     // 项目追踪
+//     { path: '/trace/projectList', component: ProjectList},
+//     // 追踪单主界面-新建追踪单
+//     { path: '/trace/traceCreate/:projectId', component: TraceCreate},
+//     { path: '/trace/traceUpdate/:traceId', component: TraceUpdate},
+//     // 追踪单主界面(追踪列表)-追踪单		
+//     { path: '/trace/trace/:traceId', component: Trace},
+//     // 创建追踪单评论信息
+//     { path: '/trace/traceCommentCreate/:traceId', component: TraceCommentCreate},
+//     // 创建追踪单评论信息
+//     { path: '/trace/traceCommentEdit/:traceCommentId', component: TraceCommentEdit},
+//     // 创建追踪单时间节点
+//     { path: '/trace/traceTimeLineCreate/:traceId', component: TraceTimeLineCreate},
+//     // 创建追踪单时间节点
+//     { path: '/trace/traceTimeLineEdit/:traceTimeLineId', component: TraceTimeLineEdit},
+//     // 个人未完成的任务
+//     { path: '/trace/userNotFinishedTrace/:userId', component: UserNotFinishedTrace},
+//     // 个人已完成的任务
+//     { path: '/trace/useFinishedTrace/:userId', component: UseFinishedTrace},
+//     // 未完成的项目任务
+//     { path: '/trace/notFinishedProjectTraces/:projectId', component: NotFinishedProjectTraces},
+//     // 已完成的项目任务
+//     { path: '/trace/finishedProjectTraces/:projectId', component: FinishedProjectTraces },
+//     { path: '/trace/teamList', component: TeamList},
+//     //任务配置
+//     { path: '/trace/traceConfig', component: TraceConfig },
+//     // 项目归档界面
+//     { path: '/trace/projectArchive/:projectId', component: ProjectArchive},
+//     // 项目管理图
+//     { path: '/trace/projectManagement/:projectId', component: ProjectManagement},
+//     //项目管理员列表
+//     { path: '/trace/projectAdminUserList/:projectId', component: ProjectAdminUserList},
+//     // 已完成项目追踪
+//     { path: '/trace/completeProjectList', component: CompleteProjectList},
+      
+//   ];
+
+// export default routes;

+ 468 - 0
src/routes/route-wms-v5.js

@@ -0,0 +1,468 @@
+import {
+  HelloWorld,
+  WmsSetting,
+  GradeDefinition,
+  GeneratePosition,
+  InventoryPrint,
+  InventoryPrintScan,
+  StockOutPrepareLine,
+  PickingCar,
+  StockOutPrepareApproved,
+  StockOutPrepateTemplate,
+  StockOutPrepateTemplateRecording,
+  StockOutPrepareTemplateApproved,
+  StockOutPrepareLineAddProject,
+  StockOutPrepareLineProjectReceivingAddress,
+  StockOutPrepareLineProjectShippingAddress,
+  PurchaseOrderLinePrint,
+  PositionPrint,
+  PurchaseOrderPrint,
+  QueryPurchaseOrderLine,
+  PackInventoryInstance,
+  NeedPrint,
+  Printed,
+  PrintInventoryInstance,
+  CheckProfit,
+  CheckLoss,
+  StockInLineInstance,
+  StockOutLineInstance,
+  PurchaseOrderLineTraceEdit,
+  CurrentStock,
+  StockLedger,
+  GenerateToolRequest,
+  AutoGenerateInventorySafeStock,
+  AutoGenerateInventoryClassSafeStock,
+  ProjectItemAdjust,
+  InvoiceGenerate,
+  BalanceInventory,
+  VouchCheck,
+  ExpressInquiry,
+  RepertoryCheck,
+  InventorySearchDetail,
+  GenerateDocumentTool,
+  InventoryCheckLoss,
+  AdjustPositions,
+  CurrentStockProjectItemManger,
+  UploadTrainingVideo,
+  SynchronousMaintenanceForm,
+  QueryMaintenancePlan,
+  LightSetting,
+  LightStockInOrOut,
+  ShelfBoard,
+  TransferTask
+} from 'client-wms-v5/dist/client-wms-v5.js';
+
+
+
+const routes = [
+
+  { path: '/wms/hello-world', component: HelloWorld },
+
+  // 仓库设置
+  {
+    path: '/wms/wmsSetting', component: WmsSetting,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095118',
+          'itemNo': '1',
+        },
+      ],
+    },
+  },
+
+  // 编码定义
+  {
+    path: '/wms/gradeDefinition', component: GradeDefinition,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095118',
+          'itemNo': '1',
+        },
+      ],
+    },
+  },
+
+  // 生成货位
+  { path: '/wms/generatePosition/:uuid', component: GeneratePosition },
+
+  // 采购入库打印
+  {
+    path: '/wms/inventoryPrint', component: InventoryPrint,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095118',
+          'itemNo': '1',
+        },
+      ],
+    },
+  },
+
+  // 扫描入库打印
+  {
+    path: '/wms/inventoryPrintScan', component: InventoryPrintScan,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095118',
+          'itemNo': '1',
+        },
+      ],
+    },
+  },
+
+  // 领用界面
+  {
+    path: '/wms/stockOutPrepareLine', component: StockOutPrepareLine,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 领料车界面
+  {
+    path: '/wms/pickingCar', component: PickingCar,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 领用记录,审批意见完成
+  {
+    path: '/wms/stockOutPrepareApproved', component: StockOutPrepareApproved,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 需求模板领料
+  {
+    path: '/wms/stockOutPrepateTemplate', component: StockOutPrepateTemplate,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 需求模板领料待提交记录
+  {
+    path: '/wms/stockOutPrepateTemplateRecording', component: StockOutPrepateTemplateRecording,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 需求模板领料已提交记录
+  {
+    path: '/wms/stockOutPrepareTemplateApproved', component: StockOutPrepareTemplateApproved,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 领料跳转添加项目
+  {
+    path: '/wms/stockOutPrepareLineAddProject', component: StockOutPrepareLineAddProject,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 项目事件收货信息
+  // eslint-disable-next-line
+    {
+    path: '/wms/stockOutPrepareLineProjectReceivingAddress', component: StockOutPrepareLineProjectReceivingAddress,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 项目事件发货信息
+  // eslint-disable-next-line
+    {
+    path: '/wms/stockOutPrepareLineProjectShippingAddress', component: StockOutPrepareLineProjectShippingAddress,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '5',
+        },
+      ],
+    },
+  },
+
+  // 采购订单明细打印
+  { path: '/wms/purchaseOrderLinePrint', component: PurchaseOrderLinePrint },
+
+  // 货位打印
+  { path: '/wms/positionPrint/:uuid', component: PositionPrint },
+
+  // 采购订单打印改
+  { path: '/wms/purchaseOrderPrint', component: PurchaseOrderPrint },
+
+  //采购订单打印
+  { path: '/wms/queryPurchaseOrderLine', component: QueryPurchaseOrderLine },
+
+  { path: '/wms/packInventoryInstance', component: PackInventoryInstance },
+
+  { path: '/wms/needPrint', component: NeedPrint },
+
+  { path: '/wms/printed', component: Printed },
+  {
+    path: '/wms/printInventoryInstance', component: PrintInventoryInstance,
+    children: [
+      {
+        path: '/',
+        redirect: 'needPrint',
+      },
+      {
+        path: 'needPrint',
+        component: NeedPrint,
+      },
+      {
+        path: 'printed',
+        component: Printed,
+      }],
+  },
+
+  // 盘点单盘盈数据处理
+  {
+    path: '/wms/checkProfit/:uuid', component: CheckProfit,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '4',
+        },
+      ],
+    },
+  },
+
+  // 盘点单盘亏数据处理
+  {
+    path: '/wms/checkLoss/:uuid', component: CheckLoss,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '4',
+        },
+      ],
+    },
+  },
+
+  // 入库单指定存货实例
+  { path: '/wms/stockInLineInstance/:uuid', component: StockInLineInstance },
+
+  // 出库单指定存货实例
+  { path: '/wms/stockOutLineInstance/:uuid', component: StockOutLineInstance },
+
+  { path: '/wms/purchaseOrderLine-trace-edit', component: PurchaseOrderLineTraceEdit },
+
+  // 西门字库存查询
+  {
+    path: '/wms/currentStock', component: CurrentStock,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '7',
+        },
+      ],
+    },
+  },
+
+  // 仓库库存台账
+  {
+    path: '/wms/stockLedger', component: StockLedger,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '7',
+        },
+      ],
+    },
+  },
+
+  // 根据工具安全库存生成通用工具月度需求
+  // eslint-disable-next-line
+    { path: '/wms/generateToolRequest/:uuid', component: GenerateToolRequest },
+
+  // 自动生成存货安全库存
+  // eslint-disable-next-line
+    { path: '/wms/autoGenerateInventorySafeStock/:uuid', component: AutoGenerateInventorySafeStock },
+
+  // 自动生成存货分类安全库存
+  // eslint-disable-next-line
+    { path: '/wms/autoGenerateInventoryClassSafeStock/:uuid', component: AutoGenerateInventoryClassSafeStock },
+
+  // 调拨单
+  { path: '/wms/projectItemAdjust', component: ProjectItemAdjust },
+
+  // 发货单
+  {
+    path: '/wms/invoiceGenerate', component: InvoiceGenerate,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '6',
+        },
+      ],
+    },
+  },
+
+  // 结存
+  {
+    path: '/wms/balanceInventory', component: BalanceInventory,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '7',
+        },
+      ],
+    },
+  },
+
+  // 生成明细
+  {
+    path: '/wms/vouchCheck/:uuid', component: VouchCheck,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '4',
+        },
+      ],
+    },
+  },
+
+  // 快递物流信息查询
+  { path: '/wms/expressInquiry/:uuid', component: ExpressInquiry },
+
+  // 生成明细
+  {
+    path: '/wms/repertoryCheck/:uuid', component: RepertoryCheck,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '4',
+        },
+      ],
+    },
+  },
+
+  // 物料查询存货详情
+  // eslint-disable-next-line
+    { path: '/wms/inventorySearchDetail', component: InventorySearchDetail },
+
+  // 生单组件
+  // eslint-disable-next-line
+    { path: '/wms/generate-document/:type/:infoWindowNo/:uuid', component: GenerateDocumentTool },
+
+  { path: '/wms/asset-inventory-check-lose/:uuid', component: InventoryCheckLoss },
+
+  {
+    path: '/wms/adjustPositions', component: AdjustPositions,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220328_095537',
+          'itemNo': '7',
+        },
+      ],
+    },
+  },
+
+
+  // 我管理项目的库存查询
+  {
+    path: '/wms/currentStockProjectItemManger', component: CurrentStockProjectItemManger,
+    meta: {
+      'loginRequired': true,
+      'functionAccessArray': [
+        {
+          'functionNo': '20220518_142645',
+          'itemNo': '3',
+        },
+      ],
+    },
+  },
+
+  { path: '/wms/uploadTrainingVideo', component: UploadTrainingVideo },
+  { path: '/wms/synchronousMaintenanceForm', component: SynchronousMaintenanceForm },
+  { path: '/wms/queryMaintenancePlan', component: QueryMaintenancePlan },
+  { path: '/wms/lightSetting', component: LightSetting },
+  { path: '/wms/lightStockInOrOut', component: LightStockInOrOut },
+  { path: '/wms/shelfBoard', component: ShelfBoard },
+  { path: '/wms/transferTask', component: TransferTask },
+];
+
+
+export default routes;

+ 12 - 0
src/store.js

@@ -0,0 +1,12 @@
+
+import { createStore } from 'vuex';
+import { downloadStore } from 'client-base-v5/dist/client-base-v5.js';
+
+const store = createStore({
+    modules: {
+        downloadStore,
+    },
+});
+
+
+export { store };

+ 106 - 0
webpack.base.js

@@ -0,0 +1,106 @@
+var path = require('path');
+const { VueLoaderPlugin } = require('vue-loader');
+const ESLintPlugin = require('eslint-webpack-plugin');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+
+module.exports = {
+  module: {
+    rules: [
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        // include: [        
+        //   path.resolve(__dirname, './node_modules/pc-component-v3/dist/pc-component-v3.js'),      
+        // ],
+        exclude: /node_modules/,
+        // exclude: file => (
+        //   /node_modules/.test(file) &&
+        //   !/\.vue\.js/.test(file)
+        // ),
+      },
+      {
+        test: /\.css$/,
+        use: (process.env.NODE_ENV === 'production') ? [
+          {
+            loader: MiniCssExtractPlugin.loader,
+            options: {
+              publicPath: '../',
+            },
+          },
+          'css-loader'] : ['style-loader', 'css-loader'],
+      },
+      {
+        test: /\.(json5?|ya?ml)$/, // target json, json5, yaml and yml files
+        type: 'javascript/auto',
+        loader: '@intlify/vue-i18n-loader',
+        include: [ // Use `Rule.include` to specify the files of locale messages to be pre-compiled
+          //path.resolve(__dirname, 'src/locales'),
+          path.resolve(__dirname, 'client-base-v5/src/locales'),
+          path.resolve(__dirname, 'client-eam-v5/src/locales'),
+          path.resolve(__dirname, 'client-role-v3/src/locales'),
+        ],
+      },
+      {
+        // webpack5 通过资源模块来处理图片
+        test: /\.(png|jpg|gif|svg)$/,
+        type: 'asset/resource',
+        parser: {
+          dataUrlCondition: {
+            maxSize: 10240,
+          },
+        },
+        generator: {
+          filename: './client-v5-image/[name][ext][query]',
+        },
+      },
+      {
+        test: /\.(eot|woff|woff2|ttf)$/,
+        type: 'asset/resource',
+        generator: {
+          filename: './client-v5-font/[name].[ext]?[hash]',
+        },
+      },
+    ],
+  },
+  resolve: {
+
+    alias: {
+      //   'vue$': 'vue/dist/vue.esm.js',
+      '@static': path.resolve('static'),
+    },
+    extensions: ['*', '.js', '.vue', '.json'],
+  },
+  performance: {
+    hints: false,
+  },
+  
+  externals: {
+    jquery: 'window.jquery',
+    bootstrap: 'bootstrap',
+    BootstrapDialog: 'BootstrapDialog',
+    d3: 'd3',
+    echarts: 'echarts',
+    dayjs: 'dayjs',
+    'vue': 'Vue',
+    'vue-i18n': 'VueI18n',
+    'vue-router': 'VueRouter',
+    'vuex': 'Vuex',
+    'Vuex': 'Vuex',
+    'axios': 'axios',
+    'sortablejs': 'Sortable'
+  },
+  
+  plugins: [
+    new VueLoaderPlugin(),
+    // new ESLintPlugin({
+    //   extensions: ['js', 'vue'],
+    //   // 自动修复。
+    //   // 自从eslint推出--fix命令后,如果觉得eslint格式化规则已经够用的话,其实也可以不用prettier了。
+    //   fix: true,
+    // }),
+  ],
+};

+ 146 - 0
webpack.dev.js

@@ -0,0 +1,146 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const WebpackMerge = require('webpack-merge');
+const baseConfig = require('./webpack.base.js');
+
+module.exports = WebpackMerge.merge(baseConfig, {
+  mode: 'development',
+  //开发环境下默认启用cache,在内存中对已经构建的部分进行缓存
+  //避免其他模块修改,但是该模块未修改时候,重新构建,能够更快的进行增量构建
+  //属于空间换时间的做法
+  cache: true,
+  
+  // 代码入口
+  entry: {
+    // 注册界面
+    main: './src/main.js',
+  },
+
+  output: {
+    path: path.resolve(__dirname, '../dist'),
+    publicPath: '/',
+    filename: 'app-client-[name].js',
+    chunkFilename: 'app-client-chunk-[name].js',
+  },
+
+  watchOptions: {
+    ignored: ['**/node_modules', '/bat/', '/dist/', '/public/', '/static/', '/test/'],
+    poll: 2000,
+  },
+
+  devServer: {
+
+    port: 8080,
+    compress: false,
+
+
+    static: [
+      {
+        directory: path.join(__dirname, 'client-base-v5/static'),
+        publicPath: '/static',
+      },
+      {
+        directory: path.join(__dirname, 'client-base-v5/public'),
+        publicPath: '/',
+      },
+    ],
+
+    // historyApiFallback: true,
+    // historyApiFallback: {
+    //   rewrites: [
+    //     { from: /.*/, to: path.posix.join('/', 'index.html') },
+    //   ],
+    // },
+
+    headers: {
+      'Access-Control-Allow-Origin': '*',
+      // eslint-disable-next-line max-len
+      //'Content-Security-Policy': 'upgrade-insecure-requests; default-src \'none\'; base-uri \'self\'; frame-ancestors \'none\'; script-src \'self\' \'nonce-11111\'; connect-src \'self\'; form-action \'self\'; frame-src \'self\'; img-src \'self\'; font-src \'self\'; style-src \'self\' \'nonce-11111\'; manifest-src \'none\'; worker-src \'self\'; media-src \'self\'; object-src \'self\';',
+    },
+    
+    proxy: {
+      '/api': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/static': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/content': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/dashboard': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/assets': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/mock': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/authApi': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/Dictionary': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/Files': {
+        target: 'http://192.168.1.122:10026/',
+        ws: false,
+        changeOrigin: true,
+        secure:true,
+      },
+      '/WebSocket': {
+        target: 'http://192.168.1.122:10026/',
+        ws: true,
+        changeOrigin: true,
+      },
+      '/TrainVideo': {
+        target: 'http://192.168.1.122:10026/',
+        ws: true,
+        changeOrigin: true,
+      },
+      '/gateway-api': {
+        target: 'http://192.168.1.122:10026/',
+        ws: true,
+        changeOrigin: true,
+        secure:true,
+      },
+    },
+  },
+
+  devtool: 'source-map',
+
+
+  plugins: (module.exports.plugins || []).concat([
+    new HtmlWebpackPlugin({
+      title: 'Prodog',
+      template: './public/index-debug.html',   // 源模板文件
+      filename: './index.html',                   // 输出文件【注意:这里的根路径是module.exports.output.path】
+      chunks: ['main'],
+    }),
+  ]),
+});

+ 85 - 0
webpack.prod.js

@@ -0,0 +1,85 @@
+const path = require('path');
+const webpack = require('webpack');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const WebpackMerge = require('webpack-merge');
+const baseConfig = require('./webpack.base.js');
+const TerserPlugin = require('terser-webpack-plugin');
+const { CleanWebpackPlugin } = require('clean-webpack-plugin');
+const CopyPlugin = require('copy-webpack-plugin');
+module.exports =  WebpackMerge.merge(baseConfig, {
+  mode: 'production',
+  //开发环境下默认启用cache,在内存中对已经构建的部分进行缓存
+  //避免其他模块修改,但是该模块未修改时候,重新构建,能够更快的进行增量构建
+  //属于空间换时间的做法
+  cache: true,
+  // 代码入口
+  entry: {
+    // 注册界面
+    main: './src/main.js',
+  },
+
+  output: {
+    path: path.resolve(__dirname, './dist'),
+    publicPath: './',
+    filename: './client-v5-js-bundle/[name].[contenthash:8].js',
+    chunkFilename: './client-v5-js-chunk/[name].[contenthash:8].js',
+  },
+
+  optimization: {
+    minimize: true,    // 压缩 bundle
+    minimizer: [new TerserPlugin({
+      parallel: true, //使用多进程并发运行以提高构建速度 Boolean|Number 默认值: true  
+      terserOptions: {
+        format: {
+          comments: false,//删除注释
+        },
+      },
+      extractComments: false, //不将注释提取到单独的文件中
+    })],
+    splitChunks: {
+      // include all types of chunks
+      chunks: 'all',
+      name: false,
+      minSize: 30000,
+      maxSize: 500000,
+      cacheGroups: {
+        common: {
+          test: /[\\/]node_modules[\\/]/,
+          name: 'common',
+          chunks: 'initial',
+          priority: 2,
+          minChunks: 2,
+        },
+      },
+    },
+  },
+
+  
+  //devtool: 'source-map',  // 打包不需要 source-map,注释掉本行,打包的时候,不生成 source-map
+
+  plugins: (module.exports.plugins || []).concat([
+    // 清除dist文件夹
+    new CleanWebpackPlugin(),
+    
+    new HtmlWebpackPlugin({
+      title: 'Prodog',
+      template: './public/index-release.html',  // 源模板文件
+      filename: './index.html', // 输出文件【注意:这里的根路径是module.exports.output.path】
+      chunks: ['main'],
+    }),
+
+    // CSS 提取
+    new MiniCssExtractPlugin({
+      filename: './client-v5-style/[name].[contenthash:8].css',
+    }),
+    new CopyPlugin({
+      patterns: [
+        { from: './public/oalogin.html', to: '' },
+        { from: './public/casLogin.html', to: '' },
+        { from: './public/ssoLogin.html', to: '' },
+        { from: './public/favicon.ico', to: '' },
+      ],
+    }),
+  ]),
+});