Przeglądaj źródła

家庭病床项目初始化

陈勇贤 2 miesięcy temu
commit
b6e28df8e4
52 zmienionych plików z 3604 dodań i 0 usunięć
  1. 1 0
      .env
  2. 34 0
      .eslintrc.js
  3. 25 0
      .gitignore
  4. 6 0
      .npmrc
  5. 192 0
      README.md
  6. 5 0
      babel.config.js
  7. 28 0
      components.d.ts
  8. 27 0
      config/index.js
  9. 14 0
      global.d.ts
  10. 68 0
      package.json
  11. 79 0
      pom.xml
  12. 13 0
      postcss.config.js
  13. BIN
      public/favicon.ico
  14. 18 0
      public/index.html
  15. 75 0
      src/branch/hospital2/main.ts
  16. 25 0
      src/branch/hospital2/router/index.ts
  17. 9 0
      src/branch/hospital2/router/routes.ts
  18. 1108 0
      src/branch/hospital2/views/diy.vue
  19. 38 0
      src/master/App.vue
  20. BIN
      src/master/assets/font/DIN_Regular.woff
  21. BIN
      src/master/assets/font/DIN_Regular.woff2
  22. BIN
      src/master/assets/font/Source_Han_Hans.woff
  23. BIN
      src/master/assets/font/Source_Han_Hans.woff2
  24. BIN
      src/master/assets/images/login_background.png
  25. BIN
      src/master/assets/images/login_illustration.png
  26. BIN
      src/master/assets/images/logo.png
  27. 113 0
      src/master/assets/scss/element-plus.scss
  28. 20 0
      src/master/assets/scss/variable.scss
  29. 44 0
      src/master/components/nav-bar/nav-bar-menu.ts
  30. 129 0
      src/master/components/nav-bar/nav-bar.vue
  31. 26 0
      src/master/config/index.ts
  32. 10 0
      src/master/dicts/index.ts
  33. 1 0
      src/master/hooks/index.ts
  34. 75 0
      src/master/main.ts
  35. 60 0
      src/master/router/index.ts
  36. 20 0
      src/master/router/routes.ts
  37. 14 0
      src/master/service/api/demo/index.ts
  38. 14 0
      src/master/service/api/demo/manage.ts
  39. 5 0
      src/master/service/interface-entry.ts
  40. 14 0
      src/master/shims-vue.d.ts
  41. 41 0
      src/master/store/index.ts
  42. 3 0
      src/master/utils/icon.ts
  43. 8 0
      src/master/utils/tool-entry.ts
  44. 130 0
      src/master/views/demo/table.vue
  45. 40 0
      src/master/views/layout/iframe-page.vue
  46. 325 0
      src/master/views/layout/layout.vue
  47. 47 0
      src/master/views/layout/micro-app-page.vue
  48. 52 0
      src/master/views/layout/router-view-comp.vue
  49. 282 0
      src/master/views/login/register.vue
  50. 180 0
      src/master/views/specification/index.vue
  51. 42 0
      tsconfig.json
  52. 144 0
      vue.config.js

+ 1 - 0
.env

@@ -0,0 +1 @@
+VUE_APP_BRANCH_NAME=${BRANCH_NAME}

+ 34 - 0
.eslintrc.js

@@ -0,0 +1,34 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true,
+    "vue/setup-compiler-macros": true,
+  },
+  extends: ["plugin:vue/vue3-essential", "eslint:recommended", "@vue/typescript/recommended"],
+  parserOptions: {
+    ecmaVersion: 2020,
+  },
+  rules: {
+    "prefer-const": "off",
+    "arrow-parens": 0,
+    "generator-star-spacing": 0,
+    "linebreak-style": [0, "warn", "windows"],
+    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
+    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
+    "vue/multi-word-component-names": 0,
+    "@typescript-eslint/no-this-alias": "off",
+    "@typescript-eslint/ban-ts-comment": "off",
+    "@typescript-eslint/no-var-requires": "off",
+    "@typescript-eslint/no-inferrable-types": "off",
+    "@typescript-eslint/no-empty-function": "off",
+    "@typescript-eslint/ban-types": [
+      "warn",
+      {
+        extendDefaults: true,
+        types: {
+          "{}": false,
+        },
+      },
+    ],
+  },
+};

+ 25 - 0
.gitignore

@@ -0,0 +1,25 @@
+.DS_Store
+node_modules
+/dist
+package-lock.json
+pnpm-lock.yaml
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 6 - 0
.npmrc

@@ -0,0 +1,6 @@
+shamefully-hoist=true
+auto-install-peers=true
+loglevel="verbose"
+
+registry=https://registry.npmmirror.com/
+@kasite:registry=http://maven.kasitesoft.com/repository/intelmt-npm-group/

+ 192 - 0
README.md

@@ -0,0 +1,192 @@
+# 家庭病床前端包 
+
+## 环境
+
+此项目使用 `pnpm`、`intelmt-plus`,开发前,请先全局安装 `pnpm`
+
+```
+> npm i pnpm -g
+```
+
+[`intelmt-plus`](http://ui.intelmt.com/zh-CN/) 是公司的统一 UI 组件库,要求 `node` 版本在 `16.13.0` 以上
+
+npm代码在公司的 [私有仓库](http://maven.kasitesoft.com/) 上,`npm` 的地址为 http://maven.kasitesoft.com/repository/intelmt-npm-group/
+
+在项目根目录的`.npmrc`文件里有定义npm组织地址
+```
+@kasite:registry=http://maven.kasitesoft.com/repository/intelmt-npm-group/
+```
+
+
+## vs code 插件(推荐)
+
+| 插件名称                         | 作用                      |
+| -------------------------------- | ------------------------- |
+| Auto Close Tag                   | 自动补充闭合的标签        |
+| Auto Rename Tag                  | 自动重命名标签            |
+| EsLint                           | es-lint 校验              |
+| formate: CSS/LESS/SCSS formatter | 样式格式化                |
+| GitLens — Git supercharged       | 在代码界面可以看 git 记录 |
+| Prettier - Code formatter        | 代码格式化                |
+| Vetur                            | Vetur 校验                |
+
+## 格式化配置
+
+`ctrl + P` 输入 `>` 打开 `首选项:用户打开设置`,加入下面的 json
+
+```json
+{
+  "editor.unicodeHighlight.ambiguousCharacters": false,
+  "editor.defaultFormatter": "esbenp.prettier-vscode",
+  "editor.tabSize": 2,
+  "prettier.printWidth": 160,
+  "[vue]": {
+    "editor.defaultFormatter": "octref.vetur"
+  },
+  "[less]": {
+    "editor.defaultFormatter": "MikeBovenlander.formate"
+  },
+  "vetur.format.defaultFormatter.html": "prettyhtml",
+  "vetur.format.defaultFormatterOptions": {
+    "prettyhtml": {
+      "printWidth": 120,
+      "sortAttributes": true
+    },
+    "prettier": {
+      "printWidth": 160
+    }
+  }
+}
+```
+
+---
+
+## 准备步骤:
+
+1. 将 `views/demo/index.vue` 文件改成你所需要的文件名(包括 demo 文件夹的名字)
+2. 将 `router/index.ts` 里所有带 `demo` 字样的名字改成你的首页文件名字(注意路由的路径要写正确,且路由要配两个,layout 下的和单页面的,参考 demo 路由的配置)
+3. 修改 `config/config.js` 里的配置
+4. 将 `utils/tool/common.ts` 下的 `getBaseUrl` 方法改成你需要请求的地址
+
+> ### config.js 参数列表
+>
+> | 参数名         | 描述                      | 类型    | 值   |
+> | -------------- | ------------------------- | ------- | ---- |
+> | system         | 系统名称,网页 title      | String  | -    |
+> | systemId       | 系统 ID,主要用于获取菜单 | Boolean | true |
+> | title          | 登录后的菜单 name         | String  | -    |
+> | index          | 登录后的首页              | String  | -    |
+> | showBreadcrumb | 展示面包屑                | Boolean | true |
+
+---
+
+## 路由配置
+
+如果开启了面包屑模式,建议子级页面放在父级的 children 里面 (子级页面没有显示在左侧菜单的情况)。例如:
+
+```js
+ {
+    path: "/demo/index",
+    name: "index",
+    component: import("@/views/layout/layout.vue"),
+    children: [
+      {
+        path: "",
+        name: "index",
+        meta: {
+          title: "首页",
+        },
+        component: () => import("@/views/demo/index/index.vue"),
+        children: [
+          {
+            path: "children",
+            name: "index-children",
+            meta: {
+              title: "子页",
+            },
+            component: () => import("@/views/demo/index/children.vue"),
+            children: [
+              {
+                path: "second-children",
+                name: "index-second-children",
+                meta: {
+                  title: "孙子页",
+                },
+                component: () => import("@/views/demo/index/second-children.vue"),
+              },
+            ],
+          },
+        ],
+      },
+    ],
+  }
+```
+
+---
+
+## 图片存放
+
+将需要的图片放入 `assets/images/*`
+
+`*` 为 `views/demo` 的 `demo`
+
+---
+
+## 公共方法的调用
+
+在页面 setup 中调用
+
+```
+proxy.$toolEntry.util.fn(方法名)
+或
+proxy.$toolEntry.common.fn(方法名)
+```
+
+## Api
+
+### Api 文件树
+
+```js
+service
+└─api
+│   ├─base     // 基础的一些请求,登录之类的,基本上不动
+│   ├─(common) // 可以放一些公共的请求
+│   └─demo     // demo 文件夹下的请求
+└─interfaceEntry.js
+```
+
+### Api 调用
+
+```js
+import { QueryDictList } from "@/service/api/demo/index";
+or;
+import * as api from "@/service/api/demo/index";
+
+const queryDictList = async () => {
+  const { res, resp } = await QueryDictList();
+  // res:接口放回的所有数据,包括RespCode之类的数据
+  // resp:只返回res.data.Data下的数据
+};
+```
+
+---
+
+## 页面模板
+
+```html
+<template>
+  <div class="p_content">
+    <div class="content_box">
+      <div>内容</div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+  ...
+</script>
+
+<style lang="scss" scoped>
+  ...
+</style>
+```

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

+ 28 - 0
components.d.ts

@@ -0,0 +1,28 @@
+// generated by unplugin-vue-components
+// We suggest you to commit this file into source control
+// Read more: https://github.com/vuejs/vue-next/pull/3399
+
+declare module 'vue' {
+  export interface GlobalComponents {
+    Loading: typeof import('@kasite/element-plus/es')['ElLoadingDirective']
+    ZyAlert: typeof import('@kasite/element-plus/es')['ElAlert']
+    ZyButton: typeof import('@kasite/element-plus/es')['ElButton']
+    ZyCol: typeof import('@kasite/element-plus/es')['ElCol']
+    ZyConfigProvider: typeof import('@kasite/element-plus/es')['ElConfigProvider']
+    ZyContainer: typeof import('@kasite/element-plus/es')['ElContainer']
+    ZyDescriptions: typeof import('@kasite/element-plus/es')['ElDescriptions']
+    ZyDescriptionsItem: typeof import('@kasite/element-plus/es')['ElDescriptionsItem']
+    ZyForm: typeof import('@kasite/element-plus/es')['ElForm']
+    ZyFormItem: typeof import('@kasite/element-plus/es')['ElFormItem']
+    ZyInput: typeof import('@kasite/element-plus/es')['ElInput']
+    ZyOption: typeof import('@kasite/element-plus/es')['ElOption']
+    ZyPagination: typeof import('@kasite/element-plus/es')['ElPagination']
+    ZyRow: typeof import('@kasite/element-plus/es')['ElRow']
+    ZySelect: typeof import('@kasite/element-plus/es')['ElSelect']
+    ZySpace: typeof import('@kasite/element-plus/es')['ElSpace']
+    ZyTable: typeof import('@kasite/element-plus/es')['ElTable']
+    ZyTableColumn: typeof import('@kasite/element-plus/es')['ElTableColumn']
+  }
+}
+
+export { }

+ 27 - 0
config/index.js

@@ -0,0 +1,27 @@
+const config = {
+  system: "智医科技", // 系统名称,网页title
+  systemId: "", // 系统ID
+  slogan: "专注于医疗场景中每一个细微而温暖的改变",
+  loginBackground: "images/login_background.png",
+  logo: "images/logo.png",
+  illustration: "images/login_illustration.png",
+  baseURL: "https://cs001.kasitesoft.com/",
+  title: "页面规范", // 登录后的菜单name
+  index: "/layout/specification", // 登录后的首页
+  showBreadcrumb: true, // 展示面包屑
+  remRootValue: 18, // rem转换默认单位 18px
+  mode: "micro-app", // 嵌入页面的模式 iframe/micro-app
+};
+
+if (typeof window != "undefined") {
+  if (window.top && window.top.window.config) {
+    const { systemId, title, index, showBreadcrumb } = config;
+    window.config = { ...window.top.window.config, systemId, title, index, showBreadcrumb };
+  } else {
+    window.config = config;
+  }
+}
+
+if (typeof module != "undefined") {
+  module.exports = config;
+}

+ 14 - 0
global.d.ts

@@ -0,0 +1,14 @@
+export {};
+
+declare global {
+  interface Window {
+    config: any;
+    __INTERMT_IFRAME__: boolean;
+    microApp: any;
+    __MICRO_APP_ENVIRONMENT__: any;
+    __MICRO_APP_PUBLIC_PATH__: string;
+    __MICRO_APP_BASE_ROUTE__: string;
+    __MICRO_APP_NAME__: string;
+    $frameEntry: any;
+  }
+}

+ 68 - 0
package.json

@@ -0,0 +1,68 @@
+{
+  "name": "home-medical-bed-pnpm",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build --no-module",
+    "serve:hospital2": "vue-cli-service serve --branch=hospital2",
+    "build:hospital2": "vue-cli-service build --branch=hospital2 --no-module",
+    "lint": "vue-cli-service lint",
+    "clean": "pnpm store prune --force && pnpm run clean:modules",
+    "clean:modules": "rimraf pnpm-lock.yaml && rimraf node_modules"
+  },
+  "dependencies": {
+    "@element-plus/icons-vue": "^2.0.9",
+    "@kasite/intelmt-admin": "^2.7.10",
+    "@kasite/element-plus": "^2.9.9",
+    "@micro-zoe/micro-app": "^0.8.10",
+    "axios": "^0.27.2",
+    "core-js": "^3.8.3",
+    "js-md5": "^0.7.3",
+    "sm-crypto": "^0.3.11",
+    "vue": "^3.2.32",
+    "vue-class-component": "^8.0.0-0",
+    "vue-router": "~4.0.0-0",
+    "vuex": "^4.0.0"
+  },
+  "devDependencies": {
+    "@typescript-eslint/eslint-plugin": "^5.4.0",
+    "@typescript-eslint/parser": "^5.4.0",
+    "@vue/cli-plugin-babel": "~5.0.0",
+    "@vue/cli-plugin-eslint": "~5.0.0",
+    "@vue/cli-plugin-router": "~5.0.0",
+    "@vue/cli-plugin-typescript": "~5.0.0",
+    "@vue/cli-plugin-vuex": "~5.0.0",
+    "@vue/cli-service": "~5.0.0",
+    "@vue/eslint-config-typescript": "^9.1.0",
+    "copy-webpack-plugin": "^11.0.0",
+    "eslint": "^7.32.0",
+    "eslint-plugin-vue": "^8.0.3",
+    "postcss-pxtorem": "^6.0.0",
+    "sass": "^1.32.7",
+    "sass-loader": "^12.0.0",
+    "typescript": "~5.5.2",
+    "unplugin-vue-components": "0.17.21"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/vue3-essential",
+      "eslint:recommended",
+      "@vue/typescript/recommended"
+    ],
+    "parserOptions": {
+      "ecmaVersion": 2020
+    },
+    "rules": {}
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not dead",
+    "not ie 11"
+  ]
+}

+ 79 - 0
pom.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<project
+        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+        xmlns="http://maven.apache.org/POM/4.0.0"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>kasite</groupId>
+    <version>1.0.0-RELEASES</version>
+    <artifactId>com.intelmt.client.business.ui.home.medical.bed</artifactId>
+    <name>com.intelmt.client.business.ui.home.medical.bed</name>
+    <url>http://maven.apache.org</url>
+    <properties>
+
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.6</version>
+                <executions>
+                    <execution>
+                        <id>copy-dist</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <encoding>UTF-8</encoding>
+                            <outputDirectory>source/http/resources/module/backstage/home-medical-bed</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>dist</directory>
+                                    <includes>
+                                        <include>**/*.*</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <configuration>
+                    <attach>true</attach>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>source</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+                <filtering>false</filtering>
+            </resource>
+        </resources>
+    </build>
+    <!-- 打包上传nexus路径 -->
+    <distributionManagement>
+        <repository>
+            <id>nexus</id>
+            <name>Releases</name>
+            <url>http://maven.kasitesoft.com/repository/maven-releases</url>
+        </repository>
+    </distributionManagement>
+</project>

+ 13 - 0
postcss.config.js

@@ -0,0 +1,13 @@
+const _config = require("./config/index.js");
+module.exports = {
+  // px转rem
+
+  // 使用postcss-pxtorem
+  plugins: {
+    autoprefixer: {},
+    "postcss-pxtorem": {
+      rootValue: 20, // 最低适配1440*900
+      propList: ["*"],
+    },
+  },
+};

BIN
public/favicon.ico


+ 18 - 0
public/index.html

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+    <title><%= htmlWebpackPlugin.options.title %></title>
+    <script src="./config/index.js"></script>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 75 - 0
src/branch/hospital2/main.ts

@@ -0,0 +1,75 @@
+import { createApp } from "vue";
+import App from "@/App.vue";
+import router from "./router";
+import store from "@/store";
+import { isMicroApp } from "@/config";
+import microApp from "@micro-zoe/micro-app";
+
+// @kasite/intelmt-plus 弹窗和loading单独引入
+import { ElMessage, ElMessageBox, ElLoading } from "@kasite/element-plus";
+import "@kasite/element-plus/theme-chalk/base.css";
+import "@kasite/element-plus/theme-chalk/display.css";
+import "@kasite/element-plus/theme-chalk/el-overlay.css";
+import "@kasite/element-plus/theme-chalk/el-message.css";
+import "@kasite/element-plus/theme-chalk/el-message-box.css";
+import "@kasite/element-plus/theme-chalk/el-loading.css";
+import ZyAdminComponents from "@kasite/intelmt-admin/components";
+
+import toolEntry from "@/utils/tool-entry";
+import interfaceEntry from "@/service/interface-entry";
+
+// px转rem
+import "@kasite/intelmt-admin/utils/tool/px2rem";
+
+const app = createApp(App);
+app.config.globalProperties.$ELEMENT = { size: "default" };
+app.config.globalProperties.$message = ElMessage;
+app.config.globalProperties.$messageBox = toolEntry.common.messageBox;;
+app.config.globalProperties.$loading = ElLoading;
+app.config.globalProperties.$store = store;
+app.config.globalProperties.$toolEntry = toolEntry;
+app.config.globalProperties.$interfaceEntry = interfaceEntry;
+
+import * as ElementPlusIconsVue from "@element-plus/icons-vue";
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(`el-icon${key.replace(/([A-Z])/g, "-$1").toLowerCase()}`, component as any);
+}
+
+app.use(store).use(router).use(ZyAdminComponents).mount("#app");
+
+// 启用微前端嵌入别的页面
+if (isMicroApp) {
+  microApp.start({
+    tagName: `micro-app-demo`
+  });
+}
+
+// 如果是微前端
+if (window.__MICRO_APP_ENVIRONMENT__) {
+  // eslint-disable-next-line
+  __webpack_public_path__ = window.__MICRO_APP_PUBLIC_PATH__;
+  // 重定向
+  const data = window.microApp.getData();
+  if(data.redirect) {
+    // 如果绑定的重定向数据发生变化,路由进行跳转
+    window.microApp.addDataListener(() => {
+      const {redirect} = window.microApp.getData()
+      redirect && router.push({ path: redirect });
+    })
+  }
+  router.push({ path: data.redirect || window.config.index });
+  // 监听卸载操作
+  window.addEventListener("unmount", function () {
+    app.unmount();
+  });
+}
+// 如果是iframe
+else {
+  window.addEventListener("load", () => {
+    setTimeout(() => {
+      if (window.__INTERMT_IFRAME__) {
+        app.config.globalProperties.$frameEntry = window.$frameEntry;
+      }
+    }, 0);
+  });
+}

+ 25 - 0
src/branch/hospital2/router/index.ts

@@ -0,0 +1,25 @@
+import { createRouter, RouteRecordRaw, createWebHashHistory } from "vue-router";
+import { loginRouter, errorRouter, iframeRouter } from "@kasite/intelmt-admin/router";
+import { DiyPage } from "./routes";
+
+const routes: Array<RouteRecordRaw> = [
+  loginRouter,
+  errorRouter,
+  iframeRouter,
+  {
+    path: "/diy",
+    name: "diy",
+    component: () => import("@/views/layout/layout.vue"),
+    children: [
+      // 个性化/自定义页面
+      DiyPage
+    ],
+  },
+];
+
+const router = createRouter({
+  history: createWebHashHistory(),
+  routes,
+});
+
+export default router;

+ 9 - 0
src/branch/hospital2/router/routes.ts

@@ -0,0 +1,9 @@
+import { RouteRecordRaw } from "vue-router";
+
+/** 页面规范 */
+export const DiyPage: RouteRecordRaw = {
+  path: "diy-page",
+  name: "diy-page",
+  meta: { title: "hospital2的自定义页面" },
+  component: () => import("../views/diy.vue"),
+};

+ 1108 - 0
src/branch/hospital2/views/diy.vue

@@ -0,0 +1,1108 @@
+<template>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+  <div class="home">this is diy page</div>
+</template>
+
+<script setup lang="ts"></script>

+ 38 - 0
src/master/App.vue

@@ -0,0 +1,38 @@
+<template>
+  <!-- element-plus国际化 -->
+  <zy-config-provider :locale="locale" :size="size">
+    <router-view></router-view>
+  </zy-config-provider>
+</template>
+
+<script lang="ts">
+import { defineComponent, getCurrentInstance, onMounted } from "vue";
+import zhCn from "@kasite/element-plus/es/locale/lang/zh-cn";
+import { systemId } from "@/config";
+export default defineComponent({
+  setup(props, context) {
+    const { proxy } = getCurrentInstance() as any;
+    const size = proxy.$ELEMENT.size;
+    onMounted(() => {
+      if (!window.__MICRO_APP_ENVIRONMENT__) {
+        // 刷新保存store数据后重新赋值
+        window.addEventListener("beforeunload", () => {
+          let state = JSON.stringify(proxy.$store.state.menuRouteList);
+          localStorage.setItem(`${systemId}-menuList`, state);
+        });
+      }
+    });
+    // return出去的对象数据才能在模板中使用
+    return {
+      size,
+      locale: zhCn,
+    };
+  },
+});
+</script>
+<style lang="scss">
+@import "@kasite/intelmt-admin/style/dark.scss";
+@import '@kasite/element-plus/theme-chalk/dark/css-vars.css';
+@import "@kasite/intelmt-admin/style/common.scss";
+@import "@/assets/scss/element-plus.scss";
+</style>

BIN
src/master/assets/font/DIN_Regular.woff


BIN
src/master/assets/font/DIN_Regular.woff2


BIN
src/master/assets/font/Source_Han_Hans.woff


BIN
src/master/assets/font/Source_Han_Hans.woff2


BIN
src/master/assets/images/login_background.png


BIN
src/master/assets/images/login_illustration.png


BIN
src/master/assets/images/logo.png


+ 113 - 0
src/master/assets/scss/element-plus.scss

@@ -0,0 +1,113 @@
+@font-face {
+  font-family: "思源黑体";
+  src: url("@/assets/font/Source_Han_Hans.woff2") format("woff2"), url("@/assets/font/Source_Han_Hans.woff") format("woff");
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "DIN";
+  src: url("@/assets/font/DIN_Regular.woff2") format("woff2"), url("@/assets/font/DIN_Regular.woff") format("woff");
+  font-weight: normal;
+  font-style: normal;
+}
+
+:root {
+  // 字体替换
+  --el-font-family: "思源黑体", "Source Han Sans", "Noto Sans CJK SC", "HanHei SC", "Microsoft YaHei", sans-serif;
+  --el-number-font-family: "DIN", sans-serif;
+
+  // 颜色替换
+  --el-color-primary: #2c9ef7;
+  --el-color-warning: #ffa000;
+  --el-color-danger: #ff0000;
+  --el-color-error: #ff0000;
+  --el-color-success: #67c23a;
+  --el-color-info: #5a71f4;
+
+  // 文字颜色替换
+  --el-text-color-primary: #303133;
+  --el-text-color-regular: #606266;
+  --el-text-color-secondary: #909399;
+  --el-text-color-placeholder: #c2c7ce;
+}
+
+#app {
+  font-family: var(--el-font-family);
+}
+
+.DIN {
+  font-family: var(--el-number-font-family) !important;
+}
+
+// 主色、辅助色 字体颜色
+$mainColor: primary warning danger error success info;
+@each $var in $mainColor {
+  .color-#{$var} {
+    color: var(--el-color-#{$var});
+  }
+}
+// 字体颜色
+$textColor: primary regular secondary placeholder;
+@each $var in $textColor {
+  .text-#{$var} {
+    color: var(--el-text-color-#{$var});
+  }
+}
+// info按钮
+.el-button--info {
+  --el-color-info: #5a71f4;
+  --el-color-info-light-0: #5a71f4;
+  --el-color-info-light-1: #6b7ff5;
+  --el-color-info-light-2: #7b8df6;
+  --el-color-info-light-3: #8c9cf7;
+  --el-color-info-light-4: #9caaf8;
+  --el-color-info-light-5: #adb8fa;
+  --el-color-info-light-6: #bdc6fb;
+  --el-color-info-light-7: #ced4fc;
+  --el-color-info-light-8: #dee3fd;
+  --el-color-info-light-9: #eff1fe;
+  --el-color-info-dark-2: #485ac3;
+}
+// alert的info
+.el-alert--info {
+  --el-color-info-light-9: #eff1fe;
+  --el-alert-bg-color: var(--el-color-info-light-9);
+}
+// descriptions
+.el-descriptions__label.el-descriptions__cell.is-bordered-label {
+  color: var(--el-text-color-primary) !important;
+}
+
+// 表格颜色替换
+.el-table {
+  // 表头背景色
+  --el-table-header-bg-color: #f2f3f7 !important;
+  // 表头边框
+  --el-table-header-border: none;
+  // 表格边框颜色
+  --el-table-border-color: #dcdfe6 !important;
+
+  thead {
+    color: var(--el-text-color-primary) !important;
+  }
+}
+.el-table th.el-table__cell {
+  border-bottom: var(--el-table-header-border) !important;
+  font-weight: bold;
+}
+
+// 下拉框
+.el-select {
+  --el-select-width: 180px !important;
+}
+
+// form表单紧凑样式
+.el-form {
+  &.compact-form {
+    .el-form-item {
+      margin-bottom: 8px;
+      margin-right: 8px;
+    }
+  }
+}

+ 20 - 0
src/master/assets/scss/variable.scss

@@ -0,0 +1,20 @@
+// 背景色
+$bgcolor: #f5f6f8;
+// 背景色--蓝
+$bgcolor_p: #278ce8;
+// 背景色--白
+$bgcolor_f: #ffffff;
+// 边框色
+$bdcolor: var(--el-border-color-light);
+// 边框色(蓝)
+$bdcolor_p: var(--el-color-primary);
+// 字体色
+$color: var(--el-color-primary);
+// 字体色(白)
+$color_f: var(--el-color-white);
+// 字体色(橙)
+$color_w: var(--el-color-warning);
+// 字体色(红)
+$color_d: var(--el-color-danger);
+// 字体色(蓝)
+$color_p: var(--el-color-primary);

+ 44 - 0
src/master/components/nav-bar/nav-bar-menu.ts

@@ -0,0 +1,44 @@
+import icon from "@/utils/icon";
+import config from "@/config/index";
+
+interface menuItem {
+  MenuName: string;
+  IsUse: string;
+  IsShow: string;
+  IsIframe?: boolean | string | number;
+  Path: string;
+  Icon?: any;
+  SelectedIcon?: any;
+  Children?: Array<menuItem>;
+}
+
+export default {
+  navBar: [
+    {
+      MenuName: "页面规范",
+      IsUse: "1",
+      IsShow: "1",
+      Path: "/layout/specification",
+    },
+    {
+      MenuName: "表格类型页面",
+      IsUse: "1",
+      IsShow: "1",
+      Path: "/layout/table",
+    },
+    {
+      MenuName: "hospital2自定义页面",
+      IsUse: "1",
+      IsShow: "1",
+      Path: "/layout/diy-page",
+    },
+    // 内嵌iframe
+    // {
+    //   MenuName: "分组中心",
+    //   IsUse: "1",
+    //   IsShow: "1",
+    //   IsIframe: 1,
+    //   Path: "http://localhost:8081/hcrm/#/patient-manage/group-center", // 跨域不能
+    // },
+  ] as Array<menuItem>,
+};

+ 129 - 0
src/master/components/nav-bar/nav-bar.vue

@@ -0,0 +1,129 @@
+<!-- 侧边栏menu -->
+
+<template>
+  <zyadmin-nav-bar :menu="navBar"></zyadmin-nav-bar>
+</template>
+
+<script lang="ts">
+import { defineComponent, getCurrentInstance, inject, onMounted, toRefs, reactive } from "vue";
+import { isDev, systemId, isMicroApp } from "@/config/index";
+import icon from "@/utils/icon";
+import menu from "./nav-bar-menu";
+
+export default defineComponent({
+  setup(props, context) {
+    const { proxy } = getCurrentInstance() as any;
+    let routePath: any = inject("routePath");
+    const variable: any = reactive({
+      navBar: {},
+    });
+    //直接用menu.js的菜单,本地开发时启用
+    onMounted(async () => {
+      if (isDev) {
+        // await getMenu();
+        proxy.navBar = menu;
+        externalPage();
+      } else {
+        await getMenu();
+        externalPage();
+      }
+    });
+    // 获取菜单
+    const getMenu = async () => {
+      // 查询后台的菜单
+      let reqData = {
+        Types: "0,1", //0 目录  1菜单
+        SysAppId: systemId, //查询某一系统的
+      };
+      let { res } = await proxy.$interfaceEntry.base.getMenuList(reqData);
+      if (res.data.RespCode == "10000" && !proxy.$toolEntry.util.isEmpty(res.data.Data)) {
+        // 存在返回的菜单
+        const packages = res.data.Data as any;
+        // 存储需要转换的对象 key(为要转换的名称) :value(为转换后的名称)
+        const replacerObj = { RouterPath: "Path", Name: "MenuName", List: "Children" } as any;
+        const navBar = packages.map((o: any) => transformObj(o, replacerObj));
+        proxy.navBar = { navBar: transformPath(navBar) };
+        let Icon = icon as any;
+        proxy.navBar.navBar.map((item: any) => {
+          let arr: any[] = item.Icon.indexOf(",") != "-1" ? item.Icon.split(",") : [];
+          if (!proxy.$toolEntry.util.isEmpty(arr)) {
+            item.Icon = Icon[arr[0]];
+            item.SelectedIcon = Icon[arr[1]];
+          }
+        });
+      }
+    };
+    // 转换函数方法
+    const transformObj = (obj: any, replacer: any): any => {
+      // 判断是否存在为数组的值,如果是且长度大于零回调自身
+      if (obj instanceof Array && obj.length > 0) {
+        return obj.map((i: any) => transformObj(i, replacer));
+      }
+      if (obj && Object.getPrototypeOf(obj) === Object.prototype) {
+        return Object.fromEntries(Object.entries(obj).map(([k, v]) => [replacer[k] || k, transformObj(v, replacer)]));
+      }
+      //Base case, if not an Object literal return value as is
+      return obj;
+    };
+    // 转换符合iframe的路径
+    const transformPath = (menu: any) => {
+      const traverse = (arr: any[]) => {
+        const navBar = arr.map((item: any) => {
+          item.Path = item.Path || item.Url;
+          item.IsIframe = !!item.Url;
+          item.Children.length && (item.Children = traverse(item.Children));
+          return item;
+        });
+        return navBar;
+      };
+      menu = traverse(menu);
+      return menu;
+    };
+    // 微服务应用页面转换
+    const externalPage = () => {
+      if (isMicroApp) {
+        let { navBar: menu } = proxy.navBar;
+        const traverse = (arr: any[]) => {
+          const navBar = arr.map((item: any) => {
+            if (item.IsIframe) {
+              item.isMicroApp = true;
+              delete item.IsIframe;
+              const { origin, pathname, hash } = new URL(item.Path);
+              item.MicroAppName = pathname.replaceAll("/", "");
+              item.MicroAppPath = `${origin}${pathname}#/`;
+              item.Path = `${pathname}${hash.replace("#/", "")}`;
+              proxy.$router.addRoute({
+                name: item.MenuName,
+                path: item.Path,
+                component: () => import("@/views/layout/layout.vue"),
+              });
+            }
+            item.Children?.length && (item.Children = traverse(item.Children));
+            return item;
+          });
+          return navBar;
+        };
+        menu = traverse(menu);
+        proxy.navBar = { navBar: menu };
+      }
+    };
+    return {
+      ...toRefs(variable),
+      routePath,
+    };
+  },
+});
+</script>
+
+<style lang="scss">
+.el-menu {
+  height: 100%;
+  background-color: #333951;
+}
+
+.title_img {
+  width: 24px;
+  height: 24px;
+  margin-right: 18px;
+}
+</style>

+ 26 - 0
src/master/config/index.ts

@@ -0,0 +1,26 @@
+export const system: string = window.config.system;
+
+export const systemId: string = window.config.systemId;
+
+export const title: string = window.config.title;
+
+export const index: string = window.config.index;
+
+export const showBreadcrumb: string = window.config.showBreadcrumb;
+
+export const mode = window.config.mode;
+
+export const isMicroApp = window.config.mode == "micro-app";
+
+export const isDev = process.env.NODE_ENV == "development";
+
+export default {
+  system,
+  systemId,
+  title,
+  index,
+  showBreadcrumb,
+  isDev,
+  mode,
+  isMicroApp
+};

+ 10 - 0
src/master/dicts/index.ts

@@ -0,0 +1,10 @@
+export * from "@kasite/intelmt-admin/dicts";
+import { getEnumValue } from "@kasite/intelmt-admin/dicts";
+
+//#region 状态
+export const statusEnum = {
+  启用: 1,
+  禁用: 2,
+};
+export const statusValueEnum = getEnumValue(statusEnum);
+//#endregion

+ 1 - 0
src/master/hooks/index.ts

@@ -0,0 +1 @@
+export * from "@kasite/intelmt-admin/hooks";

+ 75 - 0
src/master/main.ts

@@ -0,0 +1,75 @@
+import { createApp } from "vue";
+import App from "@/App.vue";
+import router from "@/router";
+import store from "@/store";
+import { isMicroApp } from "@/config";
+import microApp from "@micro-zoe/micro-app";
+
+// @kasite/intelmt-plus 弹窗和loading单独引入
+import { ElMessage, ElLoading } from "@kasite/element-plus";
+import "@kasite/element-plus/theme-chalk/base.css";
+import "@kasite/element-plus/theme-chalk/display.css";
+import "@kasite/element-plus/theme-chalk/el-overlay.css";
+import "@kasite/element-plus/theme-chalk/el-message.css";
+import "@kasite/element-plus/theme-chalk/el-message-box.css";
+import "@kasite/element-plus/theme-chalk/el-loading.css";
+import ZyAdminComponents from "@kasite/intelmt-admin/components";
+
+import toolEntry from "@/utils/tool-entry";
+import interfaceEntry from "@/service/interface-entry";
+
+// px转rem
+import "@kasite/intelmt-admin/utils/tool/px2rem";
+
+const app = createApp(App);
+app.config.globalProperties.$ELEMENT = { size: "default" };
+app.config.globalProperties.$message = ElMessage;
+app.config.globalProperties.$messageBox = toolEntry.common.messageBox;;
+app.config.globalProperties.$loading = ElLoading;
+app.config.globalProperties.$store = store;
+app.config.globalProperties.$toolEntry = toolEntry;
+app.config.globalProperties.$interfaceEntry = interfaceEntry;
+
+import * as ElementPlusIconsVue from "@element-plus/icons-vue";
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(`el-icon${key.replace(/([A-Z])/g, "-$1").toLowerCase()}`, component as any);
+}
+
+app.use(store).use(router).use(ZyAdminComponents).mount("#app");
+
+// 启用微前端嵌入别的页面
+if (isMicroApp) {
+  microApp.start({
+    tagName: `micro-app-demo`
+  });
+}
+
+// 如果是微前端
+if (window.__MICRO_APP_ENVIRONMENT__) {
+  // eslint-disable-next-line
+  __webpack_public_path__ = window.__MICRO_APP_PUBLIC_PATH__;
+  // 重定向
+  const data = window.microApp.getData();
+  if(data.redirect) {
+    // 如果绑定的重定向数据发生变化,路由进行跳转
+    window.microApp.addDataListener(() => {
+      const {redirect} = window.microApp.getData()
+      redirect && router.push({ path: redirect });
+    })
+  }
+  router.push({ path: data.redirect || window.config.index });
+  // 监听卸载操作
+  window.addEventListener("unmount", function () {
+    app.unmount();
+  });
+}
+// 如果是iframe
+else {
+  window.addEventListener("load", () => {
+    setTimeout(() => {
+      if (window.__INTERMT_IFRAME__) {
+        app.config.globalProperties.$frameEntry = window.$frameEntry;
+      }
+    }, 0);
+  });
+}

+ 60 - 0
src/master/router/index.ts

@@ -0,0 +1,60 @@
+import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";
+import layout from "@/views/layout/router-view-comp.vue";
+import store from "@/store/index";
+import { loginRouter, errorRouter, iframeRouter } from "@kasite/intelmt-admin/router";
+import { Specification, Table } from "./routes";
+import { DiyPage } from "../../branch/hospital2/router/routes"
+
+const cache: Map<string, any> = new Map();
+
+const router = createRouter({
+  history: createWebHashHistory(window.__MICRO_APP_ENVIRONMENT__ ? `#/${window.__MICRO_APP_NAME__}` : ""),
+  routes: [
+    loginRouter,
+    errorRouter,
+    iframeRouter,
+    {
+      path: "/layout",
+      name: "layout",
+      component: () => import("@/views/layout/layout.vue"),
+      children: [
+        // 页面规范
+        Specification,
+        // 表格类型页面
+        Table,
+        DiyPage,
+      ],
+    },
+  ] as Array<RouteRecordRaw>,
+});
+
+router.beforeEach(async (to, from, next) => {
+  if (window.config.showBreadcrumb) {
+    const toOptions = to.matched[to.matched.length - 1];
+    if (to.matched.length > 2) {
+      for (let i = to.matched.length - 2; i > 0; i--) {
+        const parentOptions = to.matched[i];
+        if (parentOptions) {
+          !cache.has(parentOptions.path) && cache.set(parentOptions.path, parentOptions.components);
+          parentOptions.components = { default: layout };
+        }
+      }
+    }
+    // 暂存本级的components
+    if (toOptions) {
+      !cache.has(to.fullPath) && cache.set(to.fullPath, toOptions.components);
+      toOptions.components = cache.get(to.fullPath);
+    }
+  }
+  next();
+});
+
+router.afterEach((to, from) => {
+  // 子页面不进行tab展示
+  if (to.matched.length > 2) {
+    const menuRouteList = store.state.menuRouteList.filter((item: any) => item.Path !== to.fullPath);
+    store.commit("setState", { key: "menuRouteList", value: menuRouteList });
+  }
+});
+
+export default router;

+ 20 - 0
src/master/router/routes.ts

@@ -0,0 +1,20 @@
+import { RouteRecordRaw } from "vue-router";
+
+/** 页面规范 */
+export const Specification: RouteRecordRaw = {
+  path: "specification",
+  name: "specification",
+  meta: {
+    title: "页面规范",
+  },
+  component: () => import("@/views/specification/index.vue"),
+};
+/** 表格类型页面 */
+export const Table: RouteRecordRaw = {
+  path: "table",
+  name: "table",
+  meta: {
+    title: "表格类型页面",
+  },
+  component: () => import("@/views/demo/table.vue"),
+};

+ 14 - 0
src/master/service/api/demo/index.ts

@@ -0,0 +1,14 @@
+import request from "@kasite/intelmt-admin/service/api/request";
+
+const apiUrl = {
+  QueryDictList: "wsgw/basic/dictApi/QueryDictList/callApiJSON.do",
+};
+
+/**
+ * 查询字典配置
+ * @param {*} reqData
+ */
+export const QueryDictList = async (data: Object = {}) => {
+  const res = await request.doPost(apiUrl.QueryDictList, data);
+  return res;
+};

+ 14 - 0
src/master/service/api/demo/manage.ts

@@ -0,0 +1,14 @@
+import request from "@kasite/intelmt-admin/service/api/request";
+
+const apiUrl = {
+  queryDictList: "wsgw/basic/dictApi/QueryDictList/callApiJSON.do",
+};
+
+/**
+ * 查询字典配置
+ * @param {*} reqData
+ */
+export const queryDictList = async (data: Object = {}) => {
+  const res = await request.doPost(apiUrl.queryDictList, data);
+  return res;
+};

+ 5 - 0
src/master/service/interface-entry.ts

@@ -0,0 +1,5 @@
+import base from "@kasite/intelmt-admin/service/api/base/base";
+
+export default {
+	base
+}

+ 14 - 0
src/master/shims-vue.d.ts

@@ -0,0 +1,14 @@
+/* eslint-disable */
+declare module "*.vue" {
+  import type { DefineComponent } from "vue";
+  const component: DefineComponent<{}, {}, any>;
+  export default component;
+}
+
+declare module "@kasite/intelmt-admin";
+
+declare module "js-md5";
+
+declare module "sm-crypto";
+
+declare module "*.js";

+ 41 - 0
src/master/store/index.ts

@@ -0,0 +1,41 @@
+import { createStore } from "vuex";
+
+const options = {
+  state: {
+    hosId: "",
+    token: "",
+    routes: [],
+    //自定义配置
+    diyConfig: {},
+    //登录账号的基础信息
+    sessioInfo: {},
+    //登录后 选择的系统
+    sysAppId: "",
+    // 当前打开的菜单列表
+    menuRouteList: [],
+    // 当前路由首页  登录时保存 用于laout页面使用
+    routeHome: "",
+    // 当前路由  页面刷新时重新赋值使用
+    routePath: "",
+    // 当前页面路由信息
+    routeItem: {} as any,
+    // getBaseDoctor接口返回医生信息
+    baseDocInfo: {},
+    // SM2加密参数
+    SM2: {},
+    // 用户权限
+    privilege: [],
+  },
+  mutations: {
+    setState(state: any, obj: any) {
+      state[obj.key] = obj.value;
+    },
+  },
+  actions: {},
+  modules: {},
+};
+
+const store = createStore({
+  ...options,
+});
+export default store;

+ 3 - 0
src/master/utils/icon.ts

@@ -0,0 +1,3 @@
+export default {
+	hos_logo: require('@/assets/images/logo.png'),
+} as any;

+ 8 - 0
src/master/utils/tool-entry.ts

@@ -0,0 +1,8 @@
+import common from "@kasite/intelmt-admin/utils/tool/common";
+import util from "@kasite/intelmt-admin/utils/tool/util";
+import cookie from "@kasite/intelmt-admin/utils/tool/cookie";
+export default {
+  common,
+  util,
+  cookie,
+};

+ 130 - 0
src/master/views/demo/table.vue

@@ -0,0 +1,130 @@
+<template>
+  <div class="p_pannel fw fh p_flexCol">
+    <zy-form inline class="fw">
+      <zy-form-item label="输入框1">
+        <zy-input placeholder="请输入内容" v-model="queryData.input1" />
+      </zy-form-item>
+
+      <zy-form-item label="输入框2">
+        <zy-input placeholder="请输入内容" v-model="queryData.input2" />
+      </zy-form-item>
+
+      <zy-form-item label="下拉框">
+        <zy-select placeholder="请选择" v-model="queryData.select">
+          <zy-option v-for="(value, label) in statusEnum" :value="value" :label="label"></zy-option>
+        </zy-select>
+      </zy-form-item>
+
+      <zy-form-item label="下拉框2">
+        <zy-select placeholder="请选择" v-model="queryData.select2">
+          <zy-option v-for="(value, label) in sexEnum" :value="value" :label="label"></zy-option>
+        </zy-select>
+      </zy-form-item>
+
+      <zy-form-item>
+        <zy-button type="primary" @click="getTableData()">查询</zy-button>
+        <zy-button @click="resetData()">重置</zy-button>
+      </zy-form-item>
+    </zy-form>
+
+    <div class="fw fh p_scroll" v-loading="table.loading">
+      <zy-table height="100%" :data="table.data">
+        <zy-table-column prop="date" label="Date" />
+        <zy-table-column prop="name" label="Name" />
+        <zy-table-column prop="address" label="Address" />
+      </zy-table>
+    </div>
+
+    <div class="fw mt-12 p_flexEnd">
+      <zy-pagination
+        :page-size="table.page.PSize"
+        :page-sizes="[10, 20, 30, 50, 100]"
+        :pager-count="5"
+        :total="table.page.PCount"
+        @current-change="getTableData"
+        @size-change="getTableData"
+        background
+        layout="total, sizes, prev, pager, next"
+        v-model:currentPage="table.page.PIndex"
+        v-model:page-size="table.page.PSize"
+      ></zy-pagination>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { getCurrentInstance, ref, reactive, onMounted } from "vue";
+import { useStore } from "vuex";
+import { useRoute, useRouter } from "vue-router";
+import { sexEnum, statusEnum } from "@/dicts";
+
+const { proxy } = getCurrentInstance() as any;
+const store = useStore();
+const route = useRoute();
+const router = useRouter();
+
+let queryData = reactive({
+  input1: "",
+  input2: "",
+  select: "",
+  select2: "",
+});
+const table = reactive({
+  loading: false,
+  data: [],
+  page: {
+    PIndex: 1,
+    PSize: 10,
+    PCount: 0,
+  },
+});
+
+/* 获取表格数据 */
+const getTableData = async (e = undefined) => {
+  !e && (table.page.PIndex = 1);
+  table.loading = true;
+  // const {res, resp} = await proxy.$interfaceEntry.xxx.xxxxx()
+  // const { PCount = 0 } = res.data.Page || {};
+  // table.page.PCount = PCount;
+  // table.data = resp;
+  setTimeout(() => {
+    table.loading = false;
+    table.page.PCount = 1;
+    table.data = [
+      {
+        date: "2016-05-03",
+        name: "Tom",
+        address: "No. 189, Grove St, Los Angeles",
+      },
+      {
+        date: "2016-05-02",
+        name: "Tom",
+        address: "No. 189, Grove St, Los Angeles",
+      },
+      {
+        date: "2016-05-04",
+        name: "Tom",
+        address: "No. 189, Grove St, Los Angeles",
+      },
+      {
+        date: "2016-05-01",
+        name: "Tom",
+        address: "No. 189, Grove St, Los Angeles",
+      },
+    ];
+  }, 2000);
+};
+/** 重置搜索条件 */
+const resetData = () => {
+  Object.keys(queryData).map((key) => {
+    queryData[key] = "";
+  });
+  getTableData();
+};
+
+onMounted(() => {
+  getTableData();
+});
+</script>
+
+<style scoped></style>

+ 40 - 0
src/master/views/layout/iframe-page.vue

@@ -0,0 +1,40 @@
+<template>
+  <iframe :isPage="true" :src="iframeConfig.path" @load="onLoad" class="fw fh" ref="iframe" v-if="iframeConfig.is"></iframe>
+</template>
+
+<script setup lang="ts">
+import { computed, getCurrentInstance, ref, watch, nextTick } from "vue";
+
+const { proxy } = getCurrentInstance() as any;
+const iframe = ref(proxy.$refs.iframe) as any;
+const iframeConfig = computed(() => {
+  return {
+    is: !!proxy.$route.query.redirect,
+    path: proxy.$route.query.redirect,
+  };
+});
+
+const emits = defineEmits(["update:loading"]);
+watch(
+  () => iframeConfig.value.path,
+  () => {
+    emits("update:loading", iframeConfig.value.is);
+    nextTick(() => {
+      if (iframe.value) {
+        const ifrmaeWindow = iframe.value.contentWindow.window;
+        if (ifrmaeWindow.onload) {
+          emits("update:loading", false);
+        } else {
+          ifrmaeWindow.onload = () => {
+            emits("update:loading", false);
+          };
+        }
+      }
+    });
+  },
+  {
+    deep: true,
+  }
+);
+</script>
+

+ 325 - 0
src/master/views/layout/layout.vue

@@ -0,0 +1,325 @@
+<template>
+  <div class="p_container p_scroll p_flexCenter">
+    <div class="navBar" v-if="uiConfig.menu">
+      <nav-bar></nav-bar>
+    </div>
+    <div class="con p_flexCenterCol">
+      <div class="nav" v-if="uiConfig.toptool || uiConfig.menu">
+        <div v-if="uiConfig.toptool">
+          <zyadmin-top-tool></zyadmin-top-tool>
+        </div>
+
+        <div class="tabs">
+          <zyadmin-tabs></zyadmin-tabs>
+        </div>
+      </div>
+      <div class="router_view">
+        <zyadmin-breadcrumb v-if="config.showBreadcrumb"></zyadmin-breadcrumb>
+        <zy-container class="view p_content">
+          <router-view-comp></router-view-comp>
+        </zy-container>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, getCurrentInstance, onBeforeMount, onMounted, onActivated, ref, provide, reactive, toRefs, watch } from "vue";
+import { onBeforeRouteUpdate } from "vue-router";
+import icon from "@/utils/icon";
+import routerViewComp from "./router-view-comp.vue";
+import config from "@/config/index";
+import { useUiConfig, useUserInfo, useOpenMenu, useIsOpenMenu } from "@/hooks";
+import navBar from "@/components/nav-bar/nav-bar.vue"
+
+export default defineComponent({
+  name: "layout",
+  components: { routerViewComp, navBar },
+  setup(props, context) {
+    const { proxy } = getCurrentInstance() as any;
+    // 动态变量
+    const variable: any = reactive({
+      baseDocInfo: proxy.$store.state.baseDocInfo,
+      uiConfig: {},
+    });
+    onBeforeMount(() => {
+      proxy.uiConfig = {
+        toptool: !window.frameElement,
+        menu: !window.frameElement,
+      };
+    });
+    // 页面加载完成
+    onMounted(async () => {
+      await useUserInfo();
+      proxy.uiConfig = useUiConfig();
+    });
+
+    //#region 路由处理
+    // 监听当前点击的子路由点击并传值给子路由 默认工作台
+    let route: string = proxy.$store.state.routePath || window.config.index;
+    let routePath: any = ref(route);
+    // 监听路由
+    provide("routePath", routePath);
+
+    // 路由更新回调
+    const routeUpdate = (to: any, from: any) => {
+      let path = to.matched.length > 2 ? to.matched[to.matched.length - 1].path : to.path;
+      if (path == "/iframe") {
+        path = `${path}?redirect=${to.query.redirect}`;
+      }
+      routePath.value = path;
+      proxy.$store.commit("setState", { key: "routePath", value: path });
+    };
+
+    // 页面打开菜单
+    const openMenu = (menu: any = {}) => useOpenMenu.call(proxy, menu);
+    provide("openMenu", openMenu);
+    // 重新加载菜单
+    const reloadMenu = () => {
+      let menuList: any = JSON.parse(localStorage.getItem(`${config.systemId}-menuList`) as string);
+      proxy.$store.replaceState(Object.assign(proxy.$store.state, { menuRouteList: menuList || [], sysAppId: "" }));
+      // 微前端跳转页面
+      if (window.__MICRO_APP_ENVIRONMENT__) {
+        const microAppData = window.microApp?.getData() || {};
+        !microAppData.isPage && openMenu({ path: proxy.$store.state.routePath ? routePath.value : window.config.index });
+      }
+      // 非微前端的,加载之前打开的页面
+      else if (proxy.$route.path) {
+        openMenu({ path: proxy.$route.path });
+        routePath.value = proxy.$route.path;
+      }
+    };
+    reloadMenu();
+    onBeforeRouteUpdate((to, from) => {
+      routeUpdate(to, from);
+    });
+    watch(
+      () => proxy.$route,
+      (to, from) => {
+        routeUpdate(to, from);
+      },
+      {
+        deep: true,
+      }
+    );
+
+    //#endregion
+    // 页面打开菜单跳转
+
+    return {
+      icon,
+      config,
+      ...toRefs(variable),
+    };
+  },
+});
+</script>
+
+<style scoped lang="scss">
+.navBar {
+  min-width: 176px;
+  height: 100%;
+  flex-shrink: 0;
+}
+
+.con {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+
+  .nav {
+    flex-shrink: 0;
+    width: 100%;
+  }
+
+  .router_view {
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    display: flex;
+    flex-wrap: wrap;
+
+    .view {
+      width: 100%;
+      height: calc(100% - 26px);
+    }
+
+    &:first-child {
+      height: 100%;
+    }
+
+    .hidden + .view {
+      height: 100%;
+    }
+  }
+
+  .nav_info {
+    width: 100%;
+    height: var(--el-menu-item-height);
+    padding-right: 30px;
+    background-color: var(--el-color-primary);
+    color: #fff;
+  }
+
+  .nav_item {
+    color: #fff;
+    margin-left: 30px;
+    cursor: pointer;
+  }
+
+  .el_switch {
+    box-shadow: 0 0 0 1px #fff;
+    border-radius: 50px;
+    margin-left: 8px;
+  }
+
+  .doctor_img {
+    width: 28px;
+    height: 28px;
+  }
+
+  .doctor_msg {
+    margin: 0 8px;
+  }
+
+  .home_bottom {
+    width: 11px;
+    height: 8px;
+  }
+
+  .nav_item_img {
+    width: 18px;
+    height: 18px;
+  }
+}
+
+.noti_drawer {
+  .noti_drawer_inner {
+    height: 100vh;
+    position: relative;
+  }
+
+  .noti_head {
+    height: 60px;
+    background-color: $color;
+    padding: 0 20px;
+    position: absolute;
+    width: 100%;
+    left: 0;
+    top: 0;
+    z-index: 1;
+  }
+
+  .layout_hide_noti {
+    width: 21px;
+    height: 16px;
+    cursor: pointer;
+    padding: 10px 10px 0;
+    box-sizing: content-box;
+  }
+
+  .noti_head_btn {
+    color: $color_f;
+    margin-left: 40px;
+    padding: 10px 0;
+    cursor: pointer;
+  }
+
+  .noti_con {
+    padding-top: 60px;
+    height: 100%;
+  }
+
+  .noti_list {
+    padding: 0 20px;
+    height: 100%;
+  }
+
+  .noti_item {
+    height: 90px;
+  }
+
+  .layout_check {
+    width: 20px;
+    height: 20px;
+    flex-shrink: 0;
+    padding: 20px 16px 20px 0;
+    box-sizing: content-box;
+    cursor: pointer;
+  }
+
+  .noti_item_con {
+    width: 100%;
+    height: 100%;
+    border-bottom: 1px solid $bdcolor;
+    position: relative;
+    align-items: flex-start;
+    cursor: pointer;
+  }
+
+  .noti_item_tit {
+    font-size: 16px;
+  }
+
+  .noti_item_subtit {
+    color: #b6c4d1;
+    margin-left: 16px;
+  }
+
+  .noti_item_val {
+    margin-top: 6px;
+    color: #5f717d;
+    line-clamp: 1;
+    -webkit-line-clamp: 1;
+    position: relative;
+  }
+
+  .new_msg::after {
+    content: "";
+    display: block;
+    width: 8px;
+    height: 8px;
+    border-radius: 50%;
+    background-color: $color_d;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 0;
+    margin: auto 0;
+  }
+}
+
+.noti_dialog {
+  .noti_detail {
+    background: #f6f7f9;
+    border-radius: 4px;
+    padding: 24px;
+  }
+
+  .noti_tit {
+    font-size: 16px;
+    margin-bottom: 18px;
+  }
+
+  .noti_info_row {
+    margin-bottom: 10px;
+  }
+
+  .noti_info_row:nth-last-child(1) {
+    margin-bottom: 0;
+  }
+
+  .noti_info_tit {
+    color: #5f707a;
+    font-size: 16px;
+  }
+
+  .noti_info_val {
+    font-size: 16px;
+  }
+
+  .noti_info_val_danger {
+    color: $color_d;
+  }
+}
+</style>

+ 47 - 0
src/master/views/layout/micro-app-page.vue

@@ -0,0 +1,47 @@
+<template>
+  <micro-app-demo
+    :baseroute="`#/${microAppConfig.name}`"
+    :data="microAppConfig.data"
+    :name="microAppConfig.name"
+    :url="microAppConfig.path"
+    @beforemount="appBeforemount"
+    @mounted="appMounted"
+    keep-alive
+  ></micro-app-demo>
+</template>
+
+<script setup lang="ts">
+import { computed, getCurrentInstance, ref, nextTick } from "vue";
+
+const { proxy } = getCurrentInstance() as any;
+// 微服务设置
+const microAppConfig = computed(() => {
+  const { Path, isMicroApp, MicroAppName, MicroAppPath } = proxy.$store.state.routeItem;
+  return {
+    is: isMicroApp,
+    name: MicroAppName,
+    path: MicroAppPath,
+    data: {
+      isPage: true,
+      redirect: Path.replace(`/${MicroAppName}`, ""),
+    },
+  };
+});
+
+const emits = defineEmits(["update:loading"]);
+const appBeforemount = () => {
+  emits("update:loading", true);
+};
+
+const appMounted = () => {
+  emits("update:loading", false);
+};
+</script>
+
+<style lang="scss" scoped>
+micro-app {
+  height: 100%;
+  width: 100%;
+}
+</style>
+

+ 52 - 0
src/master/views/layout/router-view-comp.vue

@@ -0,0 +1,52 @@
+<template>
+  <div class="fw fh" loading-background="rgba(122, 122, 122, 0.8)" loading-text="加载中..." v-loading="loading">
+    <router-view v-if="!externalPage.is" v-slot="{ Component, route }">
+      <keep-alive :include="keepAliveMap">
+        <component :is="Component"></component>
+      </keep-alive>
+    </router-view>
+    <template v-else>
+      <component :is="externalPage.component" v-model:loading="loading"></component>
+    </template>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { computed, getCurrentInstance, ref, watch, nextTick, h } from "vue";
+import { isMicroApp } from "@/config";
+import iframePage from "./iframe-page";
+import microAppPage from "./micro-app-page";
+
+const { proxy } = getCurrentInstance() as any;
+const loading = ref(false);
+// external page 外部页面属性
+const externalPage = computed(() => {
+  const component = {
+    true: microAppPage,
+    false: iframePage,
+  };
+  return {
+    is: !!proxy.$route.query.redirect || proxy.$store.state.routeItem.isMicroApp,
+    path: proxy.$store.state.routeItem.path,
+    component: component[isMicroApp],
+  };
+});
+
+// 关闭的tab,则不进行缓存 keepAlive: 请确保路由的name与组件的name一致
+const keepAliveMap = computed(() => {
+  const routes = proxy.$router.getRoutes();
+  const names = proxy.$store.state.menuRouteList.map((item) => {
+    const [route] = routes.filter((ritem) => {
+      if (typeof ritem.meta.keepAlive == "boolean") {
+        if (ritem.meta.keepAlive) return item;
+      } else if (ritem.path == item.Path) {
+        return item;
+      }
+    });
+    if (route) {
+      return route.name;
+    }
+  });
+  return names.filter((item) => item);
+})
+</script>

+ 282 - 0
src/master/views/login/register.vue

@@ -0,0 +1,282 @@
+<!-- 第二步 -->
+<template>
+	<div class="p_inner p_scroll">
+		<!-- 注册 -->
+		<div class="register_panel">
+			<div class="title">注册</div>
+			<div class="p_flexCenter form_panel">
+				<el-form ref="registerRef" :model="registerForm" label-width="120px" :rules="registerRules">
+		<!-- 		  <el-form-item label="用户名" prop="UserName">
+					<el-input v-model="registerForm.UserName" class="form_input" placeholder="请输入用户" @focus="getInputFocus('UserName')"></el-input>
+					<div class="tip">6~18个字符,可使用字母、数字、下划线,需要以字母开头</div>
+				  </el-form-item> -->
+				  <el-form-item label="登录名" prop="UserName">
+				    <el-input v-model="registerForm.UserName" class="form_input" placeholder="登录名" @focus="getInputFocus('UserName')"></el-input>
+				  </el-form-item>
+				  <el-form-item label="密码" prop="PassWord">
+				    <el-input v-model="registerForm.PassWord" class="form_input" placeholder="密码" @focus="getInputFocus('PassWord')" show-password></el-input>
+					<div class="tip">用户密码必须含有大小写字母及数字,且必须大于8位小于16位</div>
+				  </el-form-item>
+				  <el-form-item label="确认登录密码" prop="PassWordCopy">
+				    <el-input v-model="registerForm.PassWordCopy" class="form_input" placeholder="确认登录密码" @focus="getInputFocus('PassWordCopy')" show-password></el-input>
+				  </el-form-item>
+				  <el-form-item label="手机号" prop="Mobile">
+				    <el-input v-model="registerForm.Mobile" class="form_input" placeholder="手机号" @focus="getInputFocus('Mobile')"></el-input>
+				  </el-form-item>
+				  <el-form-item label="图形验证码" prop="ImgCode">
+				    <el-input v-model="registerForm.ImgCode" class="form_input width170" placeholder="图形验证码" @focus="getInputFocus('ImgCode')"></el-input>
+					<img :src="provingCodeUrl" ref="provingCodeImg" class="provingCodeImg" @click="getProvingCodeImg">
+				  </el-form-item>
+				  <el-form-item label="短信验证码" prop="Code">
+					<el-input v-model="registerForm.Code" class="form_input width170" placeholder="短信验证码" @focus="getInputFocus('Code')"></el-input>
+					<div class="getProvingCodeBtn" :class="provingCodeName != '获取验证码'  && 'forbidden'" @click="getProvingCode">
+						{{provingCodeName}}
+						<span v-if="provingCodeName != '获取验证码'">秒后重新获取</span>
+					</div>
+				  </el-form-item>
+				</el-form>
+			</div>
+			<div class="p_flexBetween foot_panel">
+				<el-button type="primary" @click="register">确认注册</el-button>
+				<div class="go_login" @click="goLogin">已有账号,前往登录</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script lang="ts">
+import { defineComponent, getCurrentInstance, onMounted, provide, inject, ref, toRefs, reactive, watch } from 'vue';
+import icon from '@/utils/icon';
+import md5 from 'js-md5';
+export default defineComponent({
+	setup(props, context) {
+		const { proxy } = getCurrentInstance() as any;
+		// 验证手机号
+		const checkMobile = (rule:any, value:any, callback:any)=>{
+			const reg = /^1[3|4|5|6|7|8][0-9]{9}$/
+			if (!value) {
+				callback(new Error('手机号不能为空'))
+			}else if(!reg.test(value)) {
+				callback(new Error('电话号码格式不正确'))
+			}else{
+				callback()
+			}
+		};
+		// 验证密码
+		const checkPassWord = (rule:any, value:any, callback:any)=>{
+			const reg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$/
+			if(value < 8 || value > 16){
+				callback(new Error('用户密码必须大于8位小于16位'))
+			}else if(!reg.test(value)){
+				callback(new Error('用户密码必须含有大小写字母及数字'))
+			}else{
+				callback()
+			}
+		}
+		// 验证确认密码
+		const checkPassWordCopy = (rule:any, value:any, callback:any)=>{
+			if(proxy.registerForm.PassWord != '' && value != proxy.registerForm.PassWord ){
+			    callback(new Error("两次输入的密码不一致"));
+			}else{
+				callback()
+			}
+		};
+		const variable = reactive({
+			provingCodeUrl:'',//获取图形验证码地址
+			provingCodeName:'获取验证码',//短信验证码按钮文字
+			registerForm:{
+				UserName:'' ,
+				PassWord:'',
+				PassWordCopy:'',
+				Mobile:'',
+				ImgPCId:'',
+				ImgCode:'',
+				PCId:'',
+				Code:'',
+			},//注册界面表单
+			registerRules:{
+				UserName: [{ required: true, message: "用户名不能为空", trigger: "blur" }],
+				PassWord: [{required: true,type:'String',validator: checkPassWord, trigger: 'blur'}],
+				PassWordCopy: [{required: true,type:'String',validator: checkPassWordCopy, trigger: 'blur'}],
+				Mobile: [{required: true,type:'String',validator: checkMobile, trigger: 'blur'}],
+				ImgCode: [{ required: true, message: "图形验证码不能为空", trigger: "blur" }],
+				Code: [{ required: true, message: "短信验证码不能为空", trigger: "blur" }],
+			},//注册界面表单验证
+		});
+		onMounted(async () => {
+			getProvingCodeImg()
+		});
+		// 更换图新验证码
+		const getProvingCodeImg = async () => {
+			let {res} = await proxy.$interfaceEntry.specialtyUnion.getImageVerification({});
+			if (res.data.RespCode == '10000') {
+				proxy.provingCodeUrl = 'data:image/jpg;base64,'+res.data.Result.map.Url
+				proxy.registerForm.ImgPCId = res.data.Result.map.PCId
+			}
+		};
+		// 获取焦点时清除当前表单某一项验证
+		const getInputFocus = async (name: any) => {
+			proxy.$refs.registerRef.clearValidate([name]);
+		};
+		// 确认注册
+		const register = async () => {
+			getProvingCodeImg()
+			proxy.$refs.registerRef.validate(async (valid: any) => {
+				if(valid){
+					let parm = {
+						...proxy.registerForm
+					};
+					parm.PassWord = md5(parm.PassWord).toUpperCase()
+					let {res} = await proxy.$interfaceEntry.specialtyUnion.userRegister(parm);
+					if (res.data.RespCode == '10000') {
+						await proxy.$messageBox.alert('注册成功', { confirmButtonText: '前往登录', type: 'success' }).then(async () => {
+							proxy.$router.push({ name: 'login' });
+						}).catch(() => {});
+					}else{
+						proxy.provingCodeName = 0
+						proxy.registerForm.PCId = ''
+						proxy.registerForm.Code = ''
+						proxy.registerForm.ImgPCId = ''
+						proxy.registerForm.ImgCode = ''
+						getProvingCodeImg()
+					}
+				}
+			})
+		};
+		// 获取验证码
+		const getProvingCode = async () => {
+			// 设置要校验的表单 手机号和图形验证码
+			let valiSome = ['Mobile', 'ImgCode']
+			//设置布尔值
+			let flag = true
+			valiSome.forEach((item:any,key:any) => {
+				proxy.$refs.registerRef.validateField(item, (valid:any) => {
+					if(valid.length){
+						return flag = false
+					 }
+				})
+			})
+			if(flag){
+				let codeData = {
+					ImgCode:proxy.registerForm.ImgCode,
+					ImgPCId:proxy.registerForm.ImgPCId,
+					Mobile:proxy.registerForm.Mobile
+				};
+				let {res} = await proxy.$interfaceEntry.specialtyUnion.getProvingCode(codeData);
+				if (res.data.RespCode == '10000' && !proxy.$toolEntry.util.isEmpty(res.data.Data)) {
+					proxy.provingCodeName = 120
+					countDown()
+					proxy.$message.success('发送成功')
+					proxy.registerForm.PCId = res.data.Data[0].PCId
+				}
+			}
+		};
+		// 倒计时
+		const countDown = () => {
+		  if (proxy.provingCodeName ==  0) {
+			  proxy.provingCodeName = '获取验证码'
+		  }else{
+			proxy.provingCodeName = Number(proxy.provingCodeName) - 1
+			setTimeout(countDown, 1000)
+		  }
+		};
+		const goLogin = ()=>{
+			proxy.$router.push({ name: 'login' });
+		};
+		// return出去的对象数据才能在模板中使用
+		return {
+			icon,
+			goLogin,
+			register,
+			getInputFocus,
+			getProvingCode,
+			getProvingCodeImg,
+			...toRefs(variable)
+		};
+	}
+});
+</script>
+
+<style scoped lang="scss">
+	// 注册
+	.register_panel{
+		background-color: #fff;
+		width: 720px;
+		border-radius: 10px;
+		.title{
+			padding:20px;
+			text-align: center;
+			font-size: 20px;
+		}
+		.form_panel{
+			width: 400px;
+			margin: 0 auto;
+			:deep(.el-form-item){
+				position: relative;
+			}
+			// :deep( .el-form-item label:after) {
+			// 	content: " ";
+			// 	display: inline-block;
+			// 	width: 100%;
+			// }
+			:deep(.el-form-item--medium .el-form-item__label) {
+				text-align: justify;
+				line-height: 45px;
+			}
+			.form_input :deep(.el-input__inner) {
+				width: 300px;
+				height: 45px ;
+				line-height: 45px;
+			}
+			.width170.form_input :deep(.el-input__inner) {
+				width: 170px;
+			}
+			.form_input:focus-within +.tip{
+				display: block;
+			}
+			.provingCodeImg,.getProvingCodeBtn{
+				width: 120px;
+				height: 45px;
+				border-radius: 4px;
+				position: absolute;
+				right: 0;
+				top: 0;
+			}
+			.getProvingCodeBtn{
+				line-height: 45px;
+				text-align: center;
+				background: #ecf5ff;
+				font-family: PingFangSC-Regular,PingFang SC;
+				font-weight: 400;
+				color: #409eff;
+				cursor: pointer;
+			}
+			.getProvingCodeBtn.forbidden{
+			  background: #E4E7ED;
+			  color: #606266;
+			}
+			.tip{
+				position: absolute;
+				bottom: -20px;
+				left: 0;
+				height: 17px;
+				line-height: 17px;
+				font-size: 13px;
+				color: #9e9e9e;
+				white-space: nowrap;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				display: none;
+			}
+		}
+		.foot_panel{
+			width: 300px;
+			margin: 0 auto 20px;
+			.go_login{
+				color: $color;
+				cursor:pointer;
+			}
+		}
+	}
+	
+</style>

+ 180 - 0
src/master/views/specification/index.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="p_pannel fw fh">
+    <zy-descriptions direction="vertical" :column="3" border>
+      <zy-descriptions-item label="页面">
+        <div>页面:1440*900</div>
+        <div>版心:1264*840</div>
+        <div>间距:12px</div>
+        <div>行高:1.4</div>
+      </zy-descriptions-item>
+
+      <zy-descriptions-item label="按钮/输入框">
+        <div>size:default</div>
+        <div>输入框:32px</div>
+        <div>按钮:32px</div>
+        <div>圆角:4px</div>
+      </zy-descriptions-item>
+
+      <zy-descriptions-item label="颜色">
+        <zy-form label-position="left" :label-width="100">
+          <zy-form-item label="主色">
+            <div class="color" :style="{ '--color': 'var(--el-color-primary)' }">
+              <div>.color-primary</div>
+              <div>#2C9EF7</div>
+            </div>
+          </zy-form-item>
+          <zy-form-item label="辅助色">
+            <zy-space wrap>
+              <div class="color" :style="{ '--color': 'var(--el-color-warning)' }">
+                <div>.color-warning</div>
+                <div>#FFA000</div>
+              </div>
+              <div class="color" :style="{ '--color': 'var(--el-color-danger)' }">
+                <div>.color-danger</div>
+                <div>#FF0000</div>
+              </div>
+              <div class="color" :style="{ '--color': 'var(--el-color-success)' }">
+                <div>.color-success</div>
+                <div>#67C23A</div>
+              </div>
+              <div class="color" :style="{ '--color': 'var(--el-color-info)' }">
+                <div>.color-info</div>
+                <div>#5A71F4</div>
+              </div>
+            </zy-space>
+          </zy-form-item>
+          <zy-form-item label="字体颜色">
+            <zy-space>
+              <div class="color" :style="{ '--color': 'var(--el-text-color-primary)' }">
+                <div>.text-primary</div>
+                <div>#303133</div>
+              </div>
+              <div class="color" :style="{ '--color': 'var(--el-text-color-regular)' }">
+                <div>.text-regular</div>
+                <div>#606266</div>
+              </div>
+              <div class="color" :style="{ '--color': 'var(--el-text-color-secondary)' }">
+                <div>.text-secondary</div>
+                <div>#909399</div>
+              </div>
+            </zy-space>
+          </zy-form-item>
+          <zy-form-item label="待输入文字">
+            <div class="color" :style="{ '--color': 'var(--el-text-color-placeholder)' }">
+              <div>.text-placeholder</div>
+              <div>#C2C7CE</div>
+            </div>
+          </zy-form-item>
+        </zy-form>
+      </zy-descriptions-item>
+
+      <zy-descriptions-item label="字体">
+        <div>中文:思源黑体CN(默认)</div>
+        <div>数字:DIN</div>
+      </zy-descriptions-item>
+
+      <zy-descriptions-item label="字号">
+        <zy-row>
+          <zy-col class="pr-20" :span="12">
+            <div class="p_flexBetween fs-20">
+              <div>思源黑体</div>
+              <div>20px</div>
+            </div>
+
+            <div class="p_flexBetween fs-18">
+              <div>思源黑体</div>
+              <div>18px</div>
+            </div>
+
+            <div class="p_flexBetween fs-16">
+              <div>思源黑体</div>
+              <div>16px</div>
+            </div>
+
+            <div class="p_flexBetween fs-14">
+              <div>思源黑体(默认)</div>
+              <div>14px</div>
+            </div>
+
+            <div class="p_flexBetween fs-12">
+              <div>思源黑体</div>
+              <div>12px</div>
+            </div>
+          </zy-col>
+          <zy-col class="pl-20" :span="12">
+            <div class="p_flexBetween DIN fs-20">
+              <div>DIN</div>
+              <div>20px</div>
+            </div>
+
+            <div class="p_flexBetween DIN fs-18">
+              <div>DIN</div>
+              <div>18px</div>
+            </div>
+
+            <div class="p_flexBetween DIN fs-16">
+              <div>DIN</div>
+              <div>16px</div>
+            </div>
+
+            <div class="p_flexBetween DIN fs-14">
+              <div>DIN(默认)</div>
+              <div>14px</div>
+            </div>
+
+            <div class="p_flexBetween DIN fs-12">
+              <div>DIN</div>
+              <div>12px</div>
+            </div>
+          </zy-col>
+        </zy-row>
+
+        <zy-alert class="mt-10" show-icon :closable="false">
+          <div>字号可通过 .fs-字号 样式设置,如 20px 字号样式为 .fs-20</div>
+          <div>数字的字体需要添加样式 DIN</div>
+        </zy-alert>
+      </zy-descriptions-item>
+    </zy-descriptions>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { getCurrentInstance, onMounted, computed, watch } from "vue";
+
+const { proxy } = getCurrentInstance() as any;
+const tableData = [
+  {
+    date: "2016-05-03",
+    name: "Tom",
+    address: "No. 189, Grove St, Los Angeles",
+  },
+  {
+    date: "2016-05-02",
+    name: "Tom",
+    address: "No. 189, Grove St, Los Angeles",
+  },
+  {
+    date: "2016-05-04",
+    name: "Tom",
+    address: "No. 189, Grove St, Los Angeles",
+  },
+  {
+    date: "2016-05-01",
+    name: "Tom",
+    address: "No. 189, Grove St, Los Angeles",
+  },
+];
+</script>
+
+<style scoped lang="scss">
+.color {
+  padding: 8px 16px;
+  background-color: var(--color);
+  border-radius: 4px;
+  color: var(--el-color-white);
+  line-height: 20px;
+}
+::v-deep .el-descriptions__content.el-descriptions__cell.is-bordered-content {
+  vertical-align: top;
+}
+</style>

+ 42 - 0
tsconfig.json

@@ -0,0 +1,42 @@
+{
+  "compilerOptions": {
+    "target": "esnext",
+    "module": "esnext",
+    "strict": false,
+    "jsx": "preserve",
+    "moduleResolution": "node",
+    "experimentalDecorators": true,
+    "skipLibCheck": true,
+    "esModuleInterop": true,
+    "allowSyntheticDefaultImports": true,
+    "forceConsistentCasingInFileNames": true,
+    "useDefineForClassFields": true,
+    "sourceMap": true,
+    "baseUrl": ".",
+    "types": [
+      "webpack-env"
+    ],
+    "paths": {
+      "@/*": [
+        "src/master/*"
+      ]
+    },
+    "lib": [
+      "esnext",
+      "dom",
+      "dom.iterable",
+      "scripthost"
+    ]
+  },
+  "include": [
+    "src/**/*.ts",
+    "src/**/*.tsx",
+    "src/**/*.vue",
+    "tests/**/*.ts",
+    "tests/**/*.tsx",
+    "global.d.ts"
+  ],
+  "exclude": [
+    "node_modules"
+  ]
+}

+ 144 - 0
vue.config.js

@@ -0,0 +1,144 @@
+const { defineConfig } = require("@vue/cli-service");
+const Components = require("unplugin-vue-components/webpack");
+const { ElementPlusResolver } = require("@kasite/element-plus/element-plus-resolver.js");
+const CopyWebpackPlugin = require("copy-webpack-plugin");
+const HtmlWebpackPlugin = require("html-webpack-plugin");
+const _config = require("./config/index.js");
+const { name } = require("./package.json");
+const path = require("path");
+
+/** 获取参数值 */
+const getBranchName = (argName) => {
+  const argIndex = process.argv.findIndex((arg) => arg.indexOf(`--${argName}`) > -1);
+  if (argIndex > -1) {
+    const [name, value] = process.argv[argIndex].split("=");
+    return value;
+  }
+  return;
+};
+const branchName = getBranchName("branch"); // 分支名称
+process.env.VUE_APP_BRANCH_NAME = branchName || "master";
+/** 获取入口 */
+const getEntry = () => {
+  const mainPath = `${branchName ? `${branchName}/` : ""}` + "main.ts";
+  const entry = `src/${branchName ? "branch/" : "master/"}${mainPath}`;
+  const entries = {
+    index: {
+      // page的入口
+      entry,
+      // 模板来源
+      template: "public/index.html",
+      // 在 dist/index.html 的输出
+      filename: "index.html",
+      title: _config.system,
+      chunks: ["chunk-vendors", "chunk-common", "index"],
+    },
+  };
+  return entries;
+};
+
+const pages = getEntry();
+module.exports = defineConfig({
+  //基本路径
+  publicPath: process.env.NODE_ENV === "production" ? "./" : "/demo",
+  pages: pages,
+  //构建时的输出目录
+  outputDir: "dist",
+  //放置静态资源的目录
+  assetsDir: "static",
+  //html 的输出路径
+  indexPath: "index.html",
+  //文件名哈希
+  filenameHashing: true,
+  //是否在保存的时候使用 `eslint-loader` 进行检查。
+  lintOnSave: false,
+  //是否使用带有浏览器内编译器的完整构建版本
+  runtimeCompiler: true,
+  //babel-loader 默认会跳过 node_modules 依赖。
+  transpileDependencies: [
+    /* string or regex */
+  ],
+  //是否为生产环境构建生成 source map?
+  productionSourceMap: false,
+  //设置生成的 HTML 中 <link rel="stylesheet"> 和 <script> 标签的 crossorigin 属性。
+  crossorigin: "",
+  //在生成的 HTML 中的 <link rel="stylesheet"> 和 <script> 标签上启用 Subresource Integrity (SRI)。
+  integrity: false,
+  configureWebpack: {
+    // 自动导入element-plus
+    plugins: [
+      Components({
+        dirs: ["src/components"],
+        deep: true,
+        resolvers: [
+          ElementPlusResolver({
+            prefix: "Zy",
+          }),
+        ],
+      }),
+      new CopyWebpackPlugin({
+        patterns: [
+          {
+            from: "./config/index.js",
+            to: "./config",
+          },
+        ],
+      }),
+    ],
+    output: {
+      // library: `${name}-[name]`,
+      // libraryTarget: "umd",
+      chunkLoadingGlobal: `webpackJsonp_${name}`,
+      globalObject: "window",
+    },
+  },
+  chainWebpack: (config) => {
+    config.resolve.alias.set("@", path.resolve(__dirname, "src/master"));
+    config.module
+      .rule("vue")
+      .use("vue-loader")
+      .tap((options) => {
+        options.compilerOptions = {
+          ...(options.compilerOptions || {}),
+          isCustomElement: (tag) => /^micro-app/.test(tag),
+        };
+        return options;
+      });
+  },
+  // CSS 相关选项
+  css: {
+    // 将组件内的 CSS 提取到一个单独的 CSS 文件 (只用在生产环境中)
+    // 也可以是一个传递给 `extract-text-webpack-plugin` 的选项对象
+    extract: true,
+    // 是否开启 CSS source map?
+    sourceMap: false,
+    // 为预处理器的 loader 传递自定义选项。比如传递给
+    // Css-loader 时,使用 `{ Css: { ... } }`。
+    loaderOptions: {
+      sass: {
+        //新版scss-loader(10.0及以上) prependData (data)
+        additionalData: (content, loaderContext) => {
+          const { resourcePath } = loaderContext;
+          const path = "variable.scss";
+          if (resourcePath && resourcePath.indexOf(path) > 0) return content;
+          return `@use "@/assets/scss/${path}" as *; ${content}`;
+        },
+      },
+    },
+  },
+  devServer: {
+    // headers: {
+    //   "Access-control-Allow-Origin": process.env.NODE_ENV === "production" ? "" : "*",
+    // },
+    proxy: {
+      "/api": {
+        target: _config.baseURL, //api服务器地址
+        changeOrigin: true, //是否允许跨域
+        secure: false,
+        pathRewrite: {
+          "^/api": "",
+        },
+      },
+    },
+  },
+});