diff --git a/.eslintignore b/.eslintignore index e3a4037..29190f7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,8 @@ build/*.js config/*.js src/assets +node_modules/ +/static/ +/zTree_v3/ +/*.js/ +/dist/ diff --git a/.gitignore b/.gitignore index a2069ec..259ddc8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,10 @@ dist/ npm-debug.log* yarn-debug.log* yarn-error.log* +**/*.log -test/unit/coverage -test/e2e/reports +tests/**/coverage/ +tests/e2e/reports selenium-debug.log # Editor directories and files @@ -16,5 +17,12 @@ selenium-debug.log *.ntvs* *.njsproj *.sln +*.local package-lock.json +yarn.lock + +/bak/ + +.env.development +config/index.js diff --git a/.postcssrc.js b/.postcssrc.js index eee3e92..bc0ad1e 100644 --- a/.postcssrc.js +++ b/.postcssrc.js @@ -1,10 +1,17 @@ // https://github.com/michael-ciniawsky/postcss-load-config module.exports = { + "autoprefixer": { + "grid": true + }, "plugins": { "postcss-import": {}, "postcss-url": {}, // to edit target browsers: use "browserslist" field in package.json - "autoprefixer": {} + "autoprefixer": {}, + "cssnano":{ + autoprefixer:false, + "postcss-zindex":false, + } } } diff --git a/LICENSE b/LICENSE index 1eb6218..77609e8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016-present taylorchen709 +Copyright (c) 2018-present chenyc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/README.md b/README.md index 65501dd..6c2d42b 100644 --- a/README.md +++ b/README.md @@ -1,185 +1,418 @@ -# To start +
+
+
+
+
+ 多功能、高效率、低代码的前后端一体化、智能化的开发工具 +
+ + ++ 👉 https://maimengcloud.com/#/openCommunity 👈 +
+ + +## 📢 简介 +**mdp-sys-ui-web**旨在为企业开发管理类的业务系统提供一个模板工程,该模板工程具有高效率、低代码、功能丰富等特点。企业可以在该工程之上,加入更多其它业务功能;也可以以该工程作为模板,创建新的工程,用于开发其它业务。使用该工程构建应用,您不用考虑多租户、登录、统一认证中心、权限、菜单管理、系统管理、公共组件、公共api、代码冗余、数据字典、图片库、文件库、智能表单、工作流、微服务互相调用、全局跟踪定位bug、多主键crud,复杂sql查询等各种问题,这些都内置其中了,轻松搞定。 +如果非要给你一个使用mdp的理由:那就是代码大量减少、开发so easy +**mdp-sys-ui-web**作为独立前端项目,企业可以单独使用该工程,另外单独开发后端系统;也可以直接使用**唛盟团队** 配套开源的后端系统[mdp-sys-backend](https://gitee.com/qingqinkj/mdp-sys-backend)作为后端服务。 + +唛盟mdp更多内容,请点击👉[mdp-core](https://gitee.com/qingqinkj/mdp-core) 👈 + +## 💪 内置功能 -这是一个开发工具项目,主要帮助程序员自动生成增删改查代码,由广州擎勤网络科技有限公司研发。 +``` +角色权限 + ├── 角色管理 => 角色crud、分配菜单、分配权限 + ├── 权限定义 => 权限crud + ├── 菜单管理 => 菜单(按钮)crud、分配菜单(按钮)给角色、 + ├── 模块管理 => 模块crud + ├── 已开模块 => 查看企业(个人)已开通的模块 + +组织管理 + ├── 机构管理 => 企业信息维护、管理员维护、账户信息维护、企业产品维护、 + ├── 用户管理 => 用户的crud、分配岗位、分配部门、重置密码、邀请 + ├── 部门管理 => 部门curd、分配岗位到部门、查看部门用户 + ├── 公司管理 => 公司curd(超级管理员使用) + ├── 岗位管理 => 岗位curd、分配角色到岗位、岗位人员查看 + ├── 注销审核 => 审核用户的注销申请 +平台管理 + ├── 平台配置 => 配置平台的信息 + ├── 个人认证审核 => 审核个人的实名认证请求 + ├── 企业认证审核 => 审核企业的实名认证请求 +元数据管理 + ├── 字典管理 => 数据字典的crud + ├── 列表维护 => 下拉列表数据项的crud + ├── 参数定义 => 公共系统参数的crud +审批中心 + ├── 待执行 => 我的待执行任务查询、任务执行 + ├── 日历任务 => 我的待执行任务查询、任务执行 + ├── 发起流程 => 发起流程 +审批监控 + ├── 我发起的流程 => 查询我发起的流程 + ├── 我监控的流程 => 查询我监控的流程、催办 + ├── 我参与的流程 => 查询我参与过的流程 +流程模型 + ├── 流程编辑器 => 在线流程编辑器 + ├── 模型发布 => 流程模型发布 + ├── 模型设置 => 设置流程与智能表单的关联、模型的启动条件、审批人、权限等 +智能表单(低代码) + ├── 表单中心 => 智能表单的门户 + ├── 表单设计 => 进行智能表单设计、权限设置等 + ├── 数据录入、查询 => 查询表单已录入的数据 +``` + +## 组件库[mdp-ui](/src/components/mdp-ui) + +mdp封装了几十个ui组件,使用mdp-ui与不使用mdp-ui的区别:写100行代码还是写1行代码的区别,代码量的减少立竿见影 +- [mdp-ui](/src/components/mdp-ui) +mdp的核心组件,该组件库为纯前端页面组件,无须配置任何后端api接口即可正确运行 +- [mdp-ui-ext](/src/components/mdp-ui-ext) +基于mdp-ui扩展的带有对接后台api业务加载能力的业务组件 + +>⚠️注意:[mdp-ui组件效果预览](https://maimengcloud.com/sys/m1/#/mdp/form/index) + +### ⚙快速开始 +>找到[main.js](/src/main.js) 添加下面代码 +```js +//mdp-ui 基础组件 +import MdpComponents from '@/components/mdp-ui/index.js' +Vue.use(MdpComponents) + +//mdp-ui-ext拓展的组件 +import MdpUiExtComponents from '@/components/mdp-ui-ext/index.js' +Vue.use(MdpUiExtComponents) +// 公共api +import mdp from "@/api/mdp_pub"; +Vue.prototype.$mdp = mdp; +``` -` 前端` +### [mdp-dialog](/src/components/mdp-ui/mdp-dialog) +弹框,可以把任意页面装配成弹框,无须定义多余的变量及函数 +- 相对于el-dialog来说,要使用弹窗,事情还真不少。需要定义visible变量,定义showDialog,closeDialog两个函数,最关键一点是如果要父页面传递参数到窗口内组件,还得在父页面定义一个变量,通过props属性传递。相当麻烦。如果某个功能弹窗特别多,会有一堆的控制弹窗的变量及函数,非常恶心。mdp-dialog则完全解决上述问题。 -# 前端开发工具 - node.js、webpacck、npm、eclipse、svn、安卓、ios等 - -# 前端ui-pc端 -vue.js、element-ui、axios +### [mdp-table](/src/components/mdp-ui/mdp-table) +表格,内置了增、删、改、查、高级查询、重置查询、导出、列配置、分页、批量编辑等功能、内置了对按钮权限的控制机制 +功能非常强大,懂的都懂。 -# 前端ui-手机端 -vue.js、vux、weui、weex +- 综合管理 + +- 可编辑表格 + +- 可编辑-树状表格 + -# 前端ui-微信公众号端 -vue.js、vux +### [mdp-select](/src/components/mdp-ui/mdp-select) +下拉列表,支持对数据字典、元数据的引用,支持对任意小表表格数据的引用,支持参数化加载后台数据,对后台加载的数据进行缓存 + -# 前端ui-微信小程序 -微信开发工具 +### [mdp-select-table](/src/components/mdp-ui/mdp-select-table) +超大表格下拉列表,与mdp-select相比,该组件具有分页查询功能 + +### [mdp-select-user](/src/components/mdp-ui-ext/mdp-select-user) +用户选择下拉列表,与mdp-select-table组件类似,仅仅针对用户的头像做了特殊处理 + -# 前端文件结构 -* build - webpack config files -* config - webpack config files -* dist - build -* src -your app - * api - * assets - * common - * components - your vue components - * mock - * styles - * views - your pages - * vuex - * App.vue - * main.js - main file - * routes.js -* static - static assets +### [mdp-input](/src/components/mdp-ui/mdp-input) +输入框 -# 前端web开发工具安装步骤 首次安装执行 1-6,添加工程执行 7-12 -## 1 安装node.js 从网络下载最新稳定版本 -node-v8.9.1-x64 +### [mdp-date](/src/components/mdp-ui/mdp-date) +日期 -## 2 安装 npm -npm install npm@latest -g +### [mdp-date-range](/src/components/mdp-ui/mdp-date-range) +区间日期 -## 3 设置淘宝镜像及安装淘宝镜像命令cnpm (如有必要) -npm config set registry https://registry.npm.taobao.org +### [mdp-number](/src/components/mdp-ui/mdp-number) +数字输入 -npm install -g cnpm --registry=https://registry.npm.taobao.org +### [mdp-hi-query](/src/components/mdp-ui/mdp-hi-query) +高级查询,可以由用户自定义任意复杂的查询条件 + -## 4 通过镜像下载 node-sass(如有必要) -npm install -g node-sass --registry=https://registry.npm.taobao.org +### [mdp-table-configs](/src/components/mdp-ui/mdp-table-configs) +表格配置,用于控制表格的列显示与否 + -## 5 安装vue 命令行工具 (如有必要) -npm install -g vue-cli +### [mdp-transfer](/src/components/mdp-ui/mdp-transfer) +穿梭框 -## 6 设置eclipse 关联 .vue文件 -Window -> Preferences -> General -> Editors -> File Associations -> Add -> *.vue -> Add -> HTML Editor / JS Editor / CSS Editor +### [mdp-cate-tree](/src/components/mdp-ui-ext/mdp-cate-tree) +文档、文章目录树 -## 7 用eclipse 从svn下载工程项目 -svn地址 http://203.195.131.73:8085/svn/ -如工程 mdp-arc-web +### [mdp-expand](/src/components/mdp-ui-ext/mdp-expand) +智能表单相关组件 -## 8 进入工程 目录 (假设工程在 D:\workspace\mdp-arc-web) -cd /D D:\workspace\mdp-arc-web +### [mdp-ext-infos](/src/components/mdp-ui-ext/mdp-ext-infos) +自动扩展字段信息 -## 9 安装工程依赖包 - D:\workspace\mdp-arc-web > npm install - -## 10 开发调试工程 -npm dev -## 11 编译 -npm build +### [mdp-image](/src/components/mdp-ui-ext/mdp-image) +图片库,图片的增删改查、上传、下载 -## 12 拷贝编译后文件到后台工程(用于与后台工程一起打成jar包发布)(如有必要) -npm copyToStatic +### [mdp-select-image](/src/components/mdp-ui-ext/mdp-select-image) +图片选择器,支持图片的上传下载、上传后的统一管理、共享 +### [mdp-select-dept](/src/components/mdp-ui-ext/mdp-select-dept) +部门选择,支持树状机构,异步加载,支持分页查询,任意大数据量 +### [mdp-select-att](/src/components/mdp-ui-ext/mdp-select-att) +附件库,支持附件的上传下载、上传后的统一管理、共享 -`服务端` -# 服务端开发工具 -jdk8、eclipse oxygen、svn、maven、oracle +### [mdp-select-cate](/src/components/mdp-ui-ext/mdp-select-cate) +文档、文章目录树选择器 -# 服务端编程框架 -spring boot 1.5、spring mvc 4、spring cloud 1.5、spring security 4、logback 1、mybatis 3、thymeleaf 3 +### [mdp-select-tag](/src/components/mdp-ui-ext/mdp-select-tag) +标签库,支持标签的统一管理、共享 -# 服务端安装开发工具步骤 首次安装执行 1-3,开发打包部署执行4-5 -## 1 安装开发工具 -### 1.0 安装jdk8, elcipse oxygen, svn 官网下载64位版本 -jdk-8u121-windows-x64 -eclipse-jee-oxygen-3-win32-x86_64 -TortoiseSVN-1.9.7.27907-x64 -### 1.1 配置eclipse运行内存 -在eclipse.ini中添加下面几个参数 --Xms512m --Xmx1024m +### [mdp-meta-item](/src/components/mdp-ui-ext/[mdp-meta-item) +元数据管理库、支持元数据的crud -### 1.2 从eclipse marketplace 下载版本控制插件工具svn -eclipse -> help -> Eclipse marketplace,搜索svn,安装subclipse4.2.3 +### [mdp-meta-option](/src/components/mdp-ui-ext/mdp-meta-option) +元数据管理库-列表数据组件、支持列表数据的crud -#### 1.2.1 设置eclipse svn 忽略的文件规则 */logs/* */target/* */node_modules/* -Window -> Preferences -> Team -> Ignored Resource -> Add pattern -> */logs/* -Window -> Preferences -> Team -> Ignored Resource -> Add pattern -> */target/* -Window -> Preferences -> Team -> Ignored Resource -> Add pattern -> */node_modules/* +### [mdp-rich-text](/src/components/mdp-ui-ext/mdp-rich-text) +富文本编辑器,整合了mdp-select-image作为插件 -### 1.3 设置eclipse工程编码为utf-8 -Window -> Preferences -> General -> Content Types -> java Archive / java class path / Text -> utf-8 -Window -> Preferences -> General -> Workspace -> Text file encoding / UTF-8 +## 🔃 api +- [api](/src/api/) +业务api,哪里用到哪里就单独引入 +### [api/mdp_pub/index.js](/src/api/mdp_pub/index.js) +公共api总入口,注册到vue全局函数中,可以在页面中任意地方直接使用,公共api总入口,如需要添加公共api,请在此文件添加 +### [mdp_api_base.js](/src/api/mdp_pub/mdp_api_base.js) +为mdp框架核心的与后端交互的api,自动注册为全局公共函数,可通过$mdp.xxx调用,可改,但不要新增,删除任何一个api. +### [mdp_api_ext.js](/src/api/mdp_pub/mdp_api_ext.js) +为mdp扩展的组件与后端交互的api,自动注册为全局公共函数,可通过$mdp.xxx调用,可改,但不要新增,删除任何一个api. +### [mdp_api_biz.js](/src/api/mdp_pub/mdp_api_biz.js) +为mdp扩展的组件与后端交互的api,自动注册为全局公共函数,可通过$mdp.xxx调用,可改,可新增必要的api. -### 1.4 设置eclipse jdk -Window -> Preferences -> Java -> Installed JREs -> 选择一条 -> Edit -> C:\Program Files\Java\jdk1.8.0_121(假设jdk安装目录,注意不是jre目录) +```html +
+5. [流程管理](https://maimengcloud.com/workflow/m1/)
+
+## 🔨贡献指南
+
+### 贡献须知
+
+mdp 作为开源项目,离不开社区的支持,欢迎任何人修改和提出建议。贡献无论大小,你的贡献会帮助背后成千上万的使用者以及开发者,你做出的贡献也会永远的保留在项目的贡献者名单中,这也是开源项目的意义所在!
+
+为了保证项目代码的质量与规范,以及帮助你更快的了解项目的结构,请在贡献之前阅读:
+
+- [mdp 贡献说明](https://gitee.com/qingqinkj/mdp-core/blob/master/docs/CONTRIBUTE.md)
+
+### 贡献步骤
+
+1. Fork 本仓库。
+
+2. Fork 后会在你的帐号下多了一个和本仓库一模一样的仓库,把你帐号的仓库 clone 到本地。
+
+ 注意替换掉链接中的`分支名`和`用户名`。
+
+ 如果是贡献代码,分支名填 `dev`;如果是贡献文档,分支名填 `docs`
+
+ ```bash
+ git clone -b 分支名 https://gitee.com/用户名/mdp-sys-ui-web.git
+ ```
+
+3. 修改代码/文档,修改后提交上来。
+
+ ```bash
+ # 把修改的文件添加到暂存区
+ git add .
+ # 提交到本地仓库,说明你具体做了什么修改
+ git commit -m '填写你做了什么修改'
+ # 推送到远程仓库,分支名替换成 dev 或者 docs
+ git push origin 分支名
+ ```
+
+4. 登录你的仓库,然后会看到一条 PR 请求,点击请求合并,等待管理员把你的代码合并进来。
+
+### 项目分支说明
+
+| 分支 | 说明 |
+|--------|-----------------------------------------------|
+| master | 主分支,受保护分支,此分支不接受 PR。在 dev 分支后经过测试没问题后会合并到此分支。 |
+| dev | 开发分支,接受 PR,PR 请提交到 dev 分支。 |
+
+
+## 🐞 交流讨论 、反馈 BUG、提出建议等
+
+1. 快扫描下方左侧微信二维码和我们一起交流讨论吧!(备注 唛盟-mdp 进群)
+
+
+2. 唛盟微信公众号查看一些基础教程
+
+3. 反馈 BUG、提出建议,欢迎新建:[issues](https://gitee.com/qingqinkj/mdp-sys-ui-web/issues),开发人员会不定时查看回复。
+4. 参与贡献,请查看[贡献指南](#🔨贡献指南)。
-# Browser support
+## 💲 打赏
+ **感谢所有赞赏以及参与贡献的小伙伴,你们的支持是我们不断更新前进的动力!微信扫一扫,赏杯咖啡呗!**
+
-Modern browsers and IE 10+.
+## 🔔 精品项目推荐
-# License
-[MIT](http://opensource.org/licenses/MIT)
+| 项目名称 | 项目地址 | 项目介绍 |
+|----------------------|---------------------------------------------------------------------------------------------|--------------------------------------------------|
+| SpringBoot_v2 | [https://gitee.com/bdj/SpringBoot_v2](https://gitee.com/bdj/SpringBoot_v2) - | 基于springboot的一款纯净脚手架 |
\ No newline at end of file
diff --git a/build/utils.js b/build/utils.js
index 2bf91ed..6043e92 100644
--- a/build/utils.js
+++ b/build/utils.js
@@ -1,7 +1,7 @@
'use strict'
const path = require('path')
const config = require('../config')
-const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
@@ -15,6 +15,13 @@ exports.assetsPath = function (_path) {
exports.cssLoaders = function (options) {
options = options || {}
+ const threadLoader = {
+ loader: 'thread-loader',
+ options: {
+ sourceMap: options.sourceMap
+ }
+ }
+
const cssLoader = {
loader: 'css-loader',
options: {
@@ -31,7 +38,7 @@ exports.cssLoaders = function (options) {
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
- const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+ let loaders = options.usePostCSS ? [ cssLoader, postcssLoader] : [ cssLoader]
if (loader) {
loaders.push({
@@ -44,14 +51,26 @@ exports.cssLoaders = function (options) {
// Extract CSS when that option is specified
// (which is the case during production build)
- if (options.extract) {
- return ExtractTextPlugin.extract({
- use: loaders,
- fallback: 'vue-style-loader',
- publicPath:'../'
- })
+ let loaderss=[];
+ if (options.extract) {
+ loaderss=[
+ threadLoader,
+ {
+ loader: MiniCssExtractPlugin.loader,
+ options: {
+ publicPath:'../'
+ },
+ },
+ ]
+ loaderss=loaderss.concat(loaders)
+ return loaderss
} else {
- return ['vue-style-loader'].concat(loaders)
+ loaderss=[
+ threadLoader,
+ 'vue-style-loader'
+ ]
+ loaderss=loaderss.concat(loaders)
+ return loaderss
}
}
@@ -76,7 +95,8 @@ exports.styleLoaders = function (options) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
- use: loader
+ use: loader,
+ exclude:/node_modules/
})
}
@@ -90,8 +110,7 @@ exports.createNotifierCallback = () => {
if (severity !== 'error') return
const error = errors[0]
- const filename = error.file && error.file.split('!').pop()
-
+ const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js
index b59bba0..3852d3f 100644
--- a/build/webpack.base.conf.js
+++ b/build/webpack.base.conf.js
@@ -2,101 +2,218 @@
const path = require('path')
const utils = require('./utils')
const config = require('../config')
+const webpack = require('webpack')
+
+const pkg = require('../package.json');
+
const vueLoaderConfig = require('./vue-loader.conf')
+const VueLoaderPlugin = require('vue-loader/lib/plugin');
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+
+const threadLoader = require('thread-loader');
+
+
+threadLoader.warmup({
+ // pool options, like passed to loader options
+ // must match loader options to boot the correct pool
+ }, [
+ // modules to load
+ // can be any module, i. e.
+ 'vue-loader',
+ 'css-loader',
+ 'babel-loader',
+ 'babel-preset-es2015',
+ 'sass-loader',
+ ]);
+
+var threadLoaderConfig={
+ loader: "thread-loader",
+ // 有同样配置的 loader 会共享一个 worker 池(worker pool)
+ options: {
+ // 产生的 worker 的数量,默认是 cpu 的核心数
+ //workers: 8,
+
+ // 一个 worker 进程中并行执行工作的数量
+ // 默认为 20
+ //workerParallelJobs: 20,
+
+ // 额外的 node.js 参数
+ //workerNodeArgs: ['--max-old-space-size', '1024'],
+
+ // 闲置时定时删除 worker 进程
+ // 默认为 500ms
+ // 可以设置为无穷大, 这样在监视模式(--watch)下可以保持 worker 持续存在
+ //poolTimeout: 2000,
-function resolve (dir) {
- return path.join(__dirname, '..', dir)
+ // 池(pool)分配给 worker 的工作数量
+ // 默认为 200
+ // 降低这个数值会降低总体的效率,但是会提升工作分布更均一
+ //poolParallelJobs: 200,
+
+ // 池(pool)的名称
+ // 可以修改名称来创建其余选项都一样的池(pool)
+ name: "my-pool"
+ }
+}
+const publicCssLoaders=process.env.NODE_ENV === 'production'?[{loader:MiniCssExtractPlugin.loader,options:{publicPath:'../'}},'css-loader','postcss-loader']:[ 'style-loader','css-loader','postcss-loader']
+
+function resolve(dir) {
+ return path.join(__dirname, '..', dir)
}
const createLintingRule = () => ({
- test: /\.(js|vue)$/,
- loader: 'eslint-loader',
- enforce: 'pre',
- include: [resolve('src'), resolve('test')],
- options: {
- formatter: require('eslint-friendly-formatter'),
- emitWarning: !config.dev.showEslintErrorsInOverlay
- }
+ test: /\.(js|vue)$/,
+ loader: 'eslint-loader',
+ enforce: 'pre',
+ include: [resolve('src'), resolve('test')],
+ options: {
+ formatter: require('eslint-friendly-formatter'),
+ emitWarning: !config.dev.showEslintErrorsInOverlay
+ }
})
module.exports = {
- context: path.resolve(__dirname, '../'),
- entry: {
- app: './src/main.js'
- },
- output: {
- path: config.build.assetsRoot,
- filename: '[name].js',
- publicPath: process.env.NODE_ENV === 'production'
- ? config.build.assetsPublicPath
- : config.dev.assetsPublicPath
- },
- resolve: {
- extensions: ['.js', '.vue', '.json'],
- alias: {
- 'vue$': 'vue/dist/vue.esm.js',
- '@': resolve('src'),
- }
- },
- module: {
- rules: [
- ...(config.dev.useEslint ? [createLintingRule()] : []),
- {
- test: /\.vue$/,
- loader: 'vue-loader',
- options: vueLoaderConfig
- },
- {
- test: /\.js$/,
- loader: 'babel-loader?cacheDirectory',
- exclude: /node_modules(?!\/quill-image-drop-module|quill-image-resize-module)/,
- include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
- },
- {
- test: /\.svg$/,
- loader: 'svg-sprite-loader',
- include: [resolve('src/icons')],
- options: {
- symbolId: 'icon-[name]'
+ context: path.resolve(__dirname, '../'),
+ entry: {
+ app: './src/main.js'
+ },
+ output: {
+ clean:true,
+ path: config.build.assetsRoot,
+ filename: 'js/[name].[contenthash].js',
+ pathinfo: false,
+ publicPath: process.env.NODE_ENV === 'production'
+ ? config.build.assetsPublicPath
+ : config.dev.assetsPublicPath
+ },
+ resolve: {
+ extensions: ['.js', '.vue', '.json'],
+ alias: {
+ 'vue$': 'vue/dist/vue.esm.js',
+ '@': resolve('src'),
}
- },
- {
- test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
- loader: 'url-loader',
- exclude: [resolve('src/icons')],
- options: {
- limit: 10000,
- name: utils.assetsPath('img/[name].[hash:7].[ext]')
- }
- },
- {
- test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: utils.assetsPath('media/[name].[hash:7].[ext]')
- }
- },
- {
- test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
- }
- }
- ]
- },
- node: {
- // prevent webpack from injecting useless setImmediate polyfill because Vue
- // source contains it (although only uses it if it's native).
- setImmediate: false,
- // prevent webpack from injecting mocks to Node native modules
- // that does not make sense for the client
- dgram: 'empty',
- fs: 'empty',
- net: 'empty',
- tls: 'empty',
- child_process: 'empty'
- }
+ },
+ // 加载器
+ module: {
+ // https://doc.webpack-china.org/guides/migrating/#module-loaders-module-rules
+ rules: [
+ //...(config.dev.useEslint ? [createLintingRule()] : []),
+ {
+ test: /\.vue$/,
+ use:[
+ threadLoaderConfig,
+ {
+ loader: 'vue-loader',
+ /**
+ options:vueLoaderConfig,
+ */
+ options: {
+ postcss: [require('postcss-cssnext')()],
+ loaders: {
+ js: [
+ { loader: 'cache-loader' },
+ { loader: 'babel-loader', options: { presets: ['env'] } }
+ ]
+ },
+ extractCSS: true,
+ hotReload:true,
+
+ },
+ }
+ ]
+
+
+ },
+ {
+ test: /\.css$/,
+ use: publicCssLoaders,
+ },
+ {
+ test: /\.(sa|sc)ss$/,
+ use: publicCssLoaders.concat([
+ // 将 Sass 编译成 CSS
+ 'sass-loader',
+ ]),
+ },
+ {
+ test: /\.less$/,
+ use: publicCssLoaders.concat([
+ // 将 Sass 编译成 CSS
+ 'less-loader',
+ ]),
+ },
+ {
+ test: /\.(stylus|styl)$/,
+ use: publicCssLoaders.concat([
+ // 将 Sass 编译成 CSS
+ 'stylus-loader',
+ ]),
+ },
+ { // 配置Babel将ES6+ 转换为ES5
+ test: /\.js$/,
+ use:[
+ threadLoaderConfig,
+ {
+ loader: 'babel-loader',
+ options: {
+ presets: ['env'],
+ plugins: ['transform-runtime']
+ },
+ },
+ ],
+ include: resolve('src'),
+ },
+ {
+ test: /\.svg$/,
+ loader: 'svg-sprite-loader',
+ include: [resolve('src/icons')],
+ options: {
+ symbolId: 'icon-[name]'
+ }
+ },
+ {
+ test: /\.(png|jpe?g|gif|tif?f|bmp|webp|svg)(\?.*)?$/,
+ exclude: [resolve('src/icons')],
+ type: 'asset',
+ generator: {
+ filename: 'img/[hash][ext][query]'
+ }
+ },
+ {
+ test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+ type: 'asset/resource',
+ generator: {
+ filename: 'media/[hash][ext][query]'
+ }
+ },
+ {
+ test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+ type: 'asset/resource',
+ generator: {
+ filename: 'fonts/[hash][ext][query]'
+ }
+ }
+ ]
+
+ },
+ plugins: [
+ new VueLoaderPlugin(),
+ ],
+ optimization: {
+ splitChunks: {
+ chunks: 'all',
+ cacheGroups: {
+ defaultVendors: {
+ test: /[\\/]node_modules[\\/]/,
+ priority: -10,
+ reuseExistingChunk: true,
+ },
+ default: {
+ minChunks: 2,
+ priority: -20,
+ reuseExistingChunk: true,
+ },
+ },
+ },
+ },
}
diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js
index aaee625..83cb871 100644
--- a/build/webpack.dev.conf.js
+++ b/build/webpack.dev.conf.js
@@ -5,7 +5,8 @@ const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
-const HtmlWebpackPlugin = require('html-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
@@ -17,49 +18,53 @@ const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
+ mode:'development',
module: {
- rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+ //rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
- clientLogLevel: 'warning',
+ //解决内网穿透
+ historyApiFallback: true,
+ allowedHosts: "all",
+
historyApiFallback: true,
hot: true,
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
- overlay: config.dev.errorOverlay
- ? { warnings: false, errors: true }
- : false,
- publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
- quiet: true, // necessary for FriendlyErrorsPlugin
- watchOptions: {
- poll: config.dev.poll,
- }
+ client: {
+ overlay: {
+ errors: config.dev.errorOverlay,
+ warnings: false,
+ },
+ },
},
plugins: [
new webpack.DefinePlugin({
+ 'process.env.ASSET_PATH': resolve ("/assets/"),
'process.env': require('../config/dev.env')
}),
- new webpack.HotModuleReplacementPlugin(),
- new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+ new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
- new HtmlWebpackPlugin({
- filename: 'index.html',
+ new HtmlWebpackPlugin({
template: 'index.html',
inject: true,
favicon: resolve('favicon.ico'),
- title: 'vue-element-admin',
- path: config.dev.assetsPublicPath + config.dev.assetsSubDirectory
+ title: 'mdp-arc',
}),
- new webpack.ProvidePlugin({
- 'window.Quill': 'quill'
+
+ // copy custom static assets
+ new CopyWebpackPlugin( {
+ patterns: [
+ { from: path.resolve(__dirname, '../static'), to: config.build.assetsSubDirectory },
+ ]
})
]
})
diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js
index ee38a93..0237540 100644
--- a/build/webpack.prod.conf.js
+++ b/build/webpack.prod.conf.js
@@ -4,62 +4,30 @@ const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
-const baseWebpackConfig = require('./webpack.base.conf')
+const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
-const HtmlWebpackPlugin = require('html-webpack-plugin')
-const ExtractTextPlugin = require('extract-text-webpack-plugin')
-const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
-const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
+const TerserPlugin = require("terser-webpack-plugin");
+
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
-const env = require('../config/'+process.env.env_config+'.env')
+const env = require('../config/'+process.env.ENV_CONFIG+'.env')
-const webpackConfig = merge(baseWebpackConfig, {
- module: {
- rules: utils.styleLoaders({
- sourceMap: config.build.productionSourceMap,
- extract: true,
- usePostCSS: true
- })
- },
- devtool: config.build.productionSourceMap ? config.build.devtool : false,
- output: {
- path: config.build.assetsRoot,
- filename: utils.assetsPath('js/[name].[chunkhash].js'),
- chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
- },
+const webpackConfig = merge(baseWebpackConfig, {
+ mode:'production',
+ devtool: config.build.productionSourceMap ? config.build.devtool : false,
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
- }),
- new UglifyJsPlugin({
- uglifyOptions: {
- compress: {
- warnings: false
- }
- },
- sourceMap: config.build.productionSourceMap,
- parallel: true
- }),
- // extract css into its own file
- new ExtractTextPlugin({
- filename: utils.assetsPath('css/[name].[contenthash].css'),
- // Setting the following option to `false` will not extract CSS from codesplit chunks.
- // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
- // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
- allChunks: false,
- }),
- // Compress extracted CSS. We are using this plugin so that possible
- // duplicated CSS from different components can be deduped.
- new OptimizeCSSPlugin({
- cssProcessorOptions: config.build.productionSourceMap
- ? { safe: true, map: { inline: false } }
- : { safe: true }
- }),
+ }),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
@@ -77,89 +45,53 @@ const webpackConfig = merge(baseWebpackConfig, {
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
- // necessary to consistently work with multiple chunks via CommonsChunkPlugin
- chunksSortMode: 'dependency'
- }),
- // keep module.id stable when vender modules does not change
- new webpack.HashedModuleIdsPlugin(),
-
-
- new webpack.ProvidePlugin({
- 'window.Quill': 'quill'
- }),
+ chunksSortMode: 'auto'
+ }),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
- // split vendor js into its own file
- new webpack.optimize.CommonsChunkPlugin({
- name: 'vendor',
- minChunks (module) {
- // any required modules inside node_modules are extracted to vendor
- return (
- module.resource &&
- /\.js$/.test(module.resource) &&
- module.resource.indexOf(
- path.join(__dirname, '../node_modules')
- ) === 0
- )
- }
- }),
- // extract webpack runtime and module manifest to its own file in order to
- // prevent vendor hash from being updated whenever app bundle is updated
- new webpack.optimize.CommonsChunkPlugin({
- name: 'manifest',
- minChunks: Infinity
- }),
- // This instance extracts shared chunks from code splitted chunks and bundles them
- // in a separate chunk, similar to the vendor chunk
- // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
- new webpack.optimize.CommonsChunkPlugin({
- name: 'app',
- async: 'vendor-async',
- children: true,
- minChunks: 3
- }),
- // split echarts into its own file
- new webpack.optimize.CommonsChunkPlugin({
- async: 'echarts',
- minChunks(module) {
- var context = module.context;
- return context && (context.indexOf('echarts') >= 0 || context.indexOf('zrender') >= 0);
- }
+
+ new MiniCssExtractPlugin({
+ filename: "css/[name].[contenthash].css",
+ chunkFilename: "css/[id].[contenthash].css",
}),
- // split xlsx into its own file
- new webpack.optimize.CommonsChunkPlugin({
- async: 'xlsx',
- minChunks(module) {
- var context = module.context;
- return context && (context.indexOf('xlsx') >= 0);
- }
+
+ // copy custom static assets
+ new CopyWebpackPlugin({
+ patterns: [
+ {
+ from: path.resolve(__dirname, '../static'), to: config.build.assetsSubDirectory
+ }
+ ],
}),
- // split codemirror into its own file
- new webpack.optimize.CommonsChunkPlugin({
- async: 'codemirror',
- minChunks(module) {
- var context = module.context;
- return context && (context.indexOf('codemirror') >= 0);
- }
+ new FriendlyErrorsPlugin({
+ onErrors: utils.createNotifierCallback()
}),
-
- // copy custom static assets
- new CopyWebpackPlugin([
- {
- from: path.resolve(__dirname, '../static'),
- to: config.build.assetsSubDirectory,
- ignore: ['.*']
- }
- ])
- ]
+ ],
+ optimization: {
+ minimize: true,
+ minimizer:[
+ new CssMinimizerPlugin({
+ parallel:true
+ }),
+ new TerserPlugin({
+ extractComments: false,
+ minify: TerserPlugin.uglifyJsMinify,
+ // `terserOptions` options will be passed to `uglify-js`
+ // Link to options - https://github.com/mishoo/UglifyJS#minify-options
+ terserOptions: {},
+ })
+ ],
+ splitChunks: {
+ chunks: 'all'
+ },
+ },
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
- new CompressionWebpackPlugin({
- asset: '[path].gz[query]',
+ new CompressionWebpackPlugin({
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
diff --git a/config/dev.env.js b/config/dev.env.js
index 03cf79b..e217d0d 100644
--- a/config/dev.env.js
+++ b/config/dev.env.js
@@ -3,6 +3,5 @@ module.exports = {
ENV_CONFIG: '"dev"',//环境版本号 如npm run build:${ENV_CONFIG},建议与spring.profiles.active=${ENV_CONFIG}一一对应
VERSION: '"m1"',//产品版本号,nginx中通过此版本号导航到不同的静态资源目录,请求路径中用法如下:静态页面url=${DOMAIN}/${CONTEXT}/${VERSION}/#/{router.path}?${queryString}
CONTEXT:'"form"',//对应spring中的server.context-path
- BASE_API: '"api"',//api访问的统一入口,最后形成的apiUrl=${BASE_API}/${VERSION}/${spring.application.name}/${CONTEXT}/${ctrlUrl}
- WEBSOCKET_URL:'"wss://www.qingqinkj.com/websocket/imsg/m1"'//本地环境是 ws://localhost:3333/websocket/im
+ BASE_API: '"api"'//api访问的统一入口,最后形成的apiUrl=${BASE_API}/${VERSION}/${spring.application.name}/${CONTEXT}/${ctrlUrl}
}
diff --git a/config/index.js b/config/index.js
index 2a5fe54..fc1ff45 100644
--- a/config/index.js
+++ b/config/index.js
@@ -6,30 +6,64 @@ const path = require('path')
module.exports = {
dev: {
-
// Paths
- assetsSubDirectory: 'static',
+ assetsSubDirectory: '',
assetsPublicPath: '/',
proxyTable: {
- '/workflow': {
- target: 'https://www.qingqinkj.com',
+ /**
+ '/api/m1/form': {
+ target: 'http://localhost:7013',
+ changeOrigin: true,
+ pathRewrite: {
+ '^/api/m1/form': '/form'
+ }
+ },
+
+ '/api/m1/xm': {
+ target: 'http://localhost:7067',
+ changeOrigin: true,
+ pathRewrite: {
+ '^/api/m1/xm': '/xm'
+ }
+ },
+ **/
+ /**
+ '/api/m1/sys': {
+ target: 'http://localhost:7015',
+ changeOrigin: true,
+ pathRewrite: {
+ '^/api/m1/sys': '/sys'
+ }
+ },
+ **/
+ // '/api/m1/pay': {
+ // target: 'http://localhost:7125',
+ // changeOrigin: true,
+ // pathRewrite: {
+ // '^/api/m1/pay': '/pay'
+ // }
+ // },
+ /**
+ '/api/m1/form': {
+ target: 'http://localhost:7080',
changeOrigin: true,
pathRewrite: {
- '^/workflow': '/api/workflow'
+ '^/api/m1/form': '/form'
}
},
- '/api': {
- target: 'https://www.qingqinkj.com',
- changeOrigin: true,
- pathRewrite: {
- '^/api': '/api'
- }
- }
+ **/
+ '/api': {
+ target: 'https://www.qingqinkj.com',
+ changeOrigin: true,
+ pathRewrite: {
+ '^/api': '/api'
+ }
+ }
},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
- port: 8089, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+ port: 8015, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true,
errorOverlay: true,
notifyOnErrors: false,
@@ -48,7 +82,7 @@ module.exports = {
*/
// https://webpack.js.org/configuration/devtool/#development
- devtool: '#cheap-source-map',
+ devtool: 'eval',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
@@ -80,7 +114,7 @@ module.exports = {
productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production
- devtool: '#source-map',
+ devtool: false,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
diff --git a/config/m1prod.env.js b/config/m1prod.env.js
index ab2383d..7913ab4 100644
--- a/config/m1prod.env.js
+++ b/config/m1prod.env.js
@@ -1,8 +1,7 @@
module.exports = {
NODE_ENV: '"production"',
ENV_CONFIG: '"m1prod"',//环境版本号 如npm run build:${ENV_CONFIG},建议与spring.profiles.active=${ENV_CONFIG}一一对应
- VERSION: '"m1"',//产品版本号,nginx中通过此版本号导航到不同的静态资源目录,请求路径中用法如下:静态页面url=${curlDOMAIN}/${CONTEXT}/${VERSION}/#/{router.path}?${queryString}
+ VERSION: '"m1"',//产品版本号,nginx中通过此版本号导航到不同的静态资源目录,请求路径中用法如下:静态页面url=${DOMAIN}/${CONTEXT}/${VERSION}/#/{router.path}?${queryString}
CONTEXT:'"form"',//对应spring中的server.context-path
- BASE_API: '"api"',//api访问的统一入口,最后形成的apiUrl=${BASE_API}/${VERSION}/${spring.application.name}/${CONTEXT}/${ctrlUrl}
- WEBSOCKET_URL:'"${wsProtocol}://${curlHost}/websocket/imsg/m1"'//本地环境是 ws://localhost:3333/websocket/im
+ BASE_API: '"api"'//api访问的统一入口,最后形成的apiUrl=${BASE_API}/${VERSION}/${spring.application.name}/${CONTEXT}/${ctrlUrl}
}
diff --git a/copy/copy.js b/copy/copy.js
deleted file mode 100644
index ae885c0..0000000
--- a/copy/copy.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var fs = require('fs');
-var path = require('path')
-function copy(src, dst) {
- fs.writeFileSync(dst, fs.readFileSync(src));
-}
-function travel(dir, callback) {
- if (fs.statSync(dir).isDirectory()) {
- callback(dir,true);
- }
- fs.readdirSync(dir).forEach(function (file) {
- var pathname = path.join(dir, file);
- if (fs.statSync(pathname).isDirectory()) {
- travel(pathname, callback);
- } else {
- callback(pathname,false);
- }
- });
-}
-
-function copy(src, dest){
- travel(src,function(file,isDir){
- var filename=dest+file.substring(src.length);
- if (isDir===true && !fs.existsSync(filename)) {
- fs.mkdirSync(filename);
- }
- if(isDir===false){
- fs.writeFileSync(filename, fs.readFileSync(file));
- }
- });
-};
-
-
-//copy('../mdp-sys-web/src/api/mdp/','src/api/mdp/');
-//copy('../mdp-sys-web/src/views/mdp/','src/views/mdp/');
diff --git a/copy/copyDistToStatic.js b/copy/copyDistToStatic.js
deleted file mode 100644
index fcb6144..0000000
--- a/copy/copyDistToStatic.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var fs = require('fs');
-var path = require('path')
-function copy(src, dst) {
- fs.writeFileSync(dst, fs.readFileSync(src));
-}
-function travel(dir, callback) {
- if (fs.statSync(dir).isDirectory()) {
- callback(dir,true);
- }
- fs.readdirSync(dir).forEach(function (file) {
- var pathname = path.join(dir, file);
- if (fs.statSync(pathname).isDirectory()) {
- travel(pathname, callback);
- } else {
- callback(pathname,false);
- }
- });
-}
-
-function copy(src, dest){
- travel(src,function(file,isDir){
- var filename=dest+file.substring(src.length);
- if (isDir===true && !fs.existsSync(filename)) {
- fs.mkdirSync(filename);
- }
- if(isDir===false){
- fs.writeFileSync(filename, fs.readFileSync(file));
- }
- });
-};
-
-function delDir(path) {
- if( fs.existsSync(path) ) {
- fs.readdirSync(path).forEach(function(file) {
- var curPath = path + "/" + file;
- if(fs.statSync(curPath).isDirectory()) { // recurse
- delDir(curPath);
- } else { // delete file
- fs.unlinkSync(curPath);
- }
- });
- fs.rmdirSync(path);
- }
-};
-
-function delCopy(src,dest){
- delDir(dest);
- copy(src,dest);
-}
-delCopy('dist','../mdp-workflow-starter/src/main/resources/static');
\ No newline at end of file
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
new file mode 100644
index 0000000..8bdb5d3
--- /dev/null
+++ b/docs/CHANGELOG.md
@@ -0,0 +1,42 @@
+# 🚀 版本日志
+
+## 1.0.0 (2019-03-06)
+
+### 🐣 新增功能
+
+1. 第一个基于vue的版本,包含用户管理、部门管理、角色管理、菜单管理、字典管理
+
+------
+
+## 1.10.10 (2020-03-03)
+
+### 🐞 解决BUG、优化功能
+
+1. 融合商城版本添加 岗位管理、机构管理、系统参数管理
+
+------
+
+## 1.10.25 (2021-01-20)
+
+### 🐣 新增功能
+
+1. 智能表单
+2. 工作流管理
+
+------
+
+## 1.20.29 (2022-7-01)
+
+### 🐞 解决BUG、优化功能
+
+1. 整合数据字典+系统参数,形成元数据管理解决方案,支持分布式环境下的数据共享、分发、清理、同步
+2. 整合权限管理,更简单、更灵活
+
+------
+
+## 2.0.0 (2023-08-28)
+
+### 🐣 新增功能
+
+1. 用新的mdp-ui组件库重新改造所有页面,每个功能提供增、删、改、查、导出、明细、复制、表格编辑、高级查询、重置查询等基本功能,每个功能提供mng、list、add、edit、detail四种打开模式,对应不同的按钮权限、输入框权限
+2. 优化元数据管理,增加每个列表项的颜色控制、列表项过滤条件、联表联动等
\ No newline at end of file
diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md
new file mode 100644
index 0000000..cb93583
--- /dev/null
+++ b/docs/CONTRIBUTE.md
@@ -0,0 +1,183 @@
+# mdp 贡献说明
+
+## 目录说明
+
+### 工程命名规范
+
+**前端工程命名规则:业务名-ui-web|-app|-uniapp**
+**后端工程命名规则:业务名-backend**
+
+- [-ui]代表前端
+- [-web]代表电脑浏览器应用
+- [-app]代表手机应用
+- [-uniapp]代表小程序+app的综合体,或者仅代表小程序
+- [-backend]代表后端
+- [-cloud]代表适用于微服务、分布式、云环境
+- [-bootstrap]代表属于打包类的工程,不能写业务代码
+
+### 前端目录
+
+```
+业务-ui-web
+ ├── build => 编译构建相关
+ ├── config => 编译构建配置项
+ ├── dist => 编译后的产物
+ ├── src => 源代码
+ ├── api => 与后端交互的api接口列表,一个表一个文件,公共api放入$fly中
+ ├── fly.js => 公共api放入fly中,自动注册成全局函数,页面上可以通过 $fly.xxxxApi()进行调用,无须引入任何文件
+ ├── assets => 静态资源
+ ├── common => 一些公共js脚本
+ ├── components => 组件库
+ ├── Mdp => mdp-ui基础组件库
+ ├── MdpExt => mdp-ui扩展的组件库,一般根据业务需要抽取提炼新的组件放入该目录
+ ├── directive => vue指令库
+ ├── icons => 图标库
+ ├── lang => 语言包
+ ├── mock => 接口模拟数据
+ ├── router => 路由库
+ ├── store => 全局公共数据库
+ ├── styles => css样式库
+ ├── views => 业务功能的页面代码
+ ├── vuex => vuex
+ ├── App.vue => 总入口 vue
+ ├── main.js => 总入口 js
+ ├── permission.js => 路由菜单权限过滤
+
+ ├── static => 某些静态资源
+ ├── .editorconfig => 全局代码格式配置
+ ├── .gitattributes => 文件编码格式配置
+ ├── CHANGELOG.md => 重大更新日志
+ ├── CONTRIBUTE.md => 贡献说明
+ ├── PLANS.md => 重大开发计划说明
+ ├── README.md => 项目说明
+ ├── LICENSE => 协议
+ ├── favicon.ico => 项目图标
+ ├── package.json => 组件依赖关系
+ ├── index.html => 总入口、首页
+```
+
+
+### 后端目录
+**后端工程结构**
+
+- 工程结构总图:
+```
+业务名-backend
+ ├── 业务名 =>业务工程,主要用来书写业务代码
+ ├── 业务名-cloud-bootstrap =>maven打包工程,禁止书写业务代码,部署到云环境
+ ├── 业务名-bootstrap =>maven打包工程,禁止书写业务代码,部署到单体应用环境
+ ├── pom.xml =>maven pom文件
+
+```
+- 工程结构明细图:
+```
+业务名-backend
+
+ ├── 业务名 => 业务主体工程,主要用来写业务功能代码
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名 => 一级业务、产品、大模块之类的
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── com.企业名.业务名.模块1 => 模块目录,一个模块=一个表
+ ├── com.企业名.业务名.模块1.ctrl => 控制器
+ ├── com.企业名.业务名.模块1.entity => 实体类,保持与数据库表一摸一样,不建议改动,代码生成器随时覆盖
+ ├── com.企业名.业务名.模块1.mapper => mybatis mapper文件,包含 Mapper.java Mapper.xml两个文件
+ ├── com.企业名.业务名.模块1.service => 服务类,所有服务继承 BaseService
+ ├── com.企业名.业务名.模块1.vo => 如果需要对entity进行扩展,可在此目录定义继承entity的子类
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-cloud-bootstrap => 打包工程(微服务环境)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-bootstrap => 打包工程(单体应用)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+ ├── pom.xml => maven pom文件
+```
+
+## [java]一些规范说明
+
+1. 写完代码后在保证不影响其他的人的代码情况下尽量统一格式化一下代码
+ 1. 采用 4 个空格缩进,禁止使用 tab 字符
+ 2. 如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,
+ 请勿勾选 Use tab character;而在 eclipse 中,必须勾选 insert spaces for tabs
+2. Java 代码需要保证新增方法都有充足、标准的 JavaDoc 注释
+3. 在修改 Bug、新增功能尽量保证最小提交的方式提交代码,减少多个功能一个 commit
+4. 所有接口 url 都需要遵循下划线模式
+5. Java 代码、方法需要遵循小驼峰法
+6. Java 类名需要遵循大驼峰法
+7. 前端项目统一采用 `prettier` 方式来格式化(需要安装插件)
+8. 所有 controller 层的接口都需要添加文档注释(至少包含接口的作用说明、参数说明、返回值说明及添加 apiDoc 文档注释)
+
+> 注:由于旧代码存在很多不规范问题,会逐步调整为新规范。在新写的代码都需要需要遵循上面说明
+>
+>
+### 类的文档注释规范(Javadoc)
+
+```
+/**
+ * xxxxxxxx
+ * @author xxxx
+ * @since ${DATE}
+ */
+```
+
+> 这里采用 `@since` 声明创建日期是因为 `Javadoc` 规范里面并没有 `@date` 标记所以采用 `@since` 代替
+
+### Java 代码规范
+
+> 推荐安装 `Alibaba Java Coding Guidelines`(`p3c`) 插件
+
+
+## changelog 更新规范
+
+> 在新加功能、修复bug、优化功能在完成时候都需要在 [CHANGELOG.md](./CHANGELOG.md) 记录
+
+1. 如果是使用者反馈的bug,在修复后需要备注反馈人的昵称
+2. 如果是 issue 需要备注 issue 地址以及平台(Gitee、GitHub)
+3. 如果是 pr 需要备注 pr 地址以及平台(Gitee、GitHub)
+4. 根据变动情况确定影响范围:如果影响 只:`agent`、`server` 其中一个,就使用【agent】、【server】开头,如果都影响就不用
+5. 可以视情况添加其他说明:如提交记录
+6. emoji 表情参考:[https://emojixd.com/](https://emojixd.com/)
+
+
+## 分支说明
+
+1. 新功能都提交到 dev 分支, 不能提交到 master 分支
+2. PR 提交到 dev 分支
+3. 一般功能开发可以直接提交到 dev 分支,较大功能开发需要新建分支提交
+
+## 需要的小组
+
+1. 后端小组 (主要任务:根据需求开发对应的接口)
+2. 前端小组 (主要任务:优化前端 UI 交互和对接部分接口)
+3. 文档小组 (主要任务:完善、补充 mdp 使用文档)
+4. 视频小组 (主要任务:录制 mdp 相关的使用视频)
+5. 测试小组 (主要任务:参与 mdp 新版内测、日常开发测试相关任务)
\ No newline at end of file
diff --git a/docs/PLANS.md b/docs/PLANS.md
new file mode 100644
index 0000000..15a6e9d
--- /dev/null
+++ b/docs/PLANS.md
@@ -0,0 +1,7 @@
+# 开发计划
+
+## 3.x.x
+
+1. **升级到vue 3.0+**
+2. 全面开源
+
diff --git a/docs/backend/API.md b/docs/backend/API.md
new file mode 100644
index 0000000..baf2fc4
--- /dev/null
+++ b/docs/backend/API.md
@@ -0,0 +1,183 @@
+# mdp-ui 组件库说明
+
+## 目录说明
+
+### 工程命名规范
+
+**前端工程命名规则:业务名-ui-web|-app|-uniapp**
+**后端工程命名规则:业务名-backend**
+
+- [-ui]代表前端
+- [-web]代表电脑浏览器应用
+- [-app]代表手机应用
+- [-uniapp]代表小程序+app的综合体,或者仅代表小程序
+- [-backend]代表后端
+- [-cloud]代表适用于微服务、分布式、云环境
+- [-bootstrap]代表属于打包类的工程,不能写业务代码
+
+### 前端目录
+
+```
+业务-ui-web
+ ├── build => 编译构建相关
+ ├── config => 编译构建配置项
+ ├── dist => 编译后的产物
+ ├── src => 源代码
+ ├── api => 与后端交互的api接口列表,一个表一个文件,公共api放入$fly中
+ ├── fly.js => 公共api放入fly中,自动注册成全局函数,页面上可以通过 $fly.xxxxApi()进行调用,无须引入任何文件
+ ├── assets => 静态资源
+ ├── common => 一些公共js脚本
+ ├── components => 组件库
+ ├── Mdp => mdp-ui基础组件库
+ ├── MdpExt => mdp-ui扩展的组件库,一般根据业务需要抽取提炼新的组件放入该目录
+ ├── directive => vue指令库
+ ├── icons => 图标库
+ ├── lang => 语言包
+ ├── mock => 接口模拟数据
+ ├── router => 路由库
+ ├── store => 全局公共数据库
+ ├── styles => css样式库
+ ├── views => 业务功能的页面代码
+ ├── vuex => vuex
+ ├── App.vue => 总入口 vue
+ ├── main.js => 总入口 js
+ ├── permission.js => 路由菜单权限过滤
+
+ ├── static => 某些静态资源
+ ├── .editorconfig => 全局代码格式配置
+ ├── .gitattributes => 文件编码格式配置
+ ├── CHANGELOG.md => 重大更新日志
+ ├── CONTRIBUTE.md => 贡献说明
+ ├── PLANS.md => 重大开发计划说明
+ ├── README.md => 项目说明
+ ├── LICENSE => 协议
+ ├── favicon.ico => 项目图标
+ ├── package.json => 组件依赖关系
+ ├── index.html => 总入口、首页
+```
+
+
+### 后端目录
+**后端工程结构**
+
+- 工程结构总图:
+```
+业务名-backend
+ ├── 业务名 =>业务工程,主要用来书写业务代码
+ ├── 业务名-cloud-bootstrap =>maven打包工程,禁止书写业务代码,部署到云环境
+ ├── 业务名-bootstrap =>maven打包工程,禁止书写业务代码,部署到单体应用环境
+ ├── pom.xml =>maven pom文件
+
+```
+- 工程结构明细图:
+```
+业务名-backend
+
+ ├── 业务名 => 业务主体工程,主要用来写业务功能代码
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名 => 一级业务、产品、大模块之类的
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── com.企业名.业务名.模块1 => 模块目录,一个模块=一个表
+ ├── com.企业名.业务名.模块1.ctrl => 控制器
+ ├── com.企业名.业务名.模块1.entity => 实体类,保持与数据库表一摸一样,不建议改动,代码生成器随时覆盖
+ ├── com.企业名.业务名.模块1.mapper => mybatis mapper文件,包含 Mapper.java Mapper.xml两个文件
+ ├── com.企业名.业务名.模块1.service => 服务类,所有服务继承 BaseService
+ ├── com.企业名.业务名.模块1.vo => 如果需要对entity进行扩展,可在此目录定义继承entity的子类
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-cloud-bootstrap => 打包工程(微服务环境)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-bootstrap => 打包工程(单体应用)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+ ├── pom.xml => maven pom文件
+```
+
+## [java]一些规范说明
+
+1. 写完代码后在保证不影响其他的人的代码情况下尽量统一格式化一下代码
+ 1. 采用 4 个空格缩进,禁止使用 tab 字符
+ 2. 如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,
+ 请勿勾选 Use tab character;而在 eclipse 中,必须勾选 insert spaces for tabs
+2. Java 代码需要保证新增方法都有充足、标准的 JavaDoc 注释
+3. 在修改 Bug、新增功能尽量保证最小提交的方式提交代码,减少多个功能一个 commit
+4. 所有接口 url 都需要遵循下划线模式
+5. Java 代码、方法需要遵循小驼峰法
+6. Java 类名需要遵循大驼峰法
+7. 前端项目统一采用 `prettier` 方式来格式化(需要安装插件)
+8. 所有 controller 层的接口都需要添加文档注释(至少包含接口的作用说明、参数说明、返回值说明及添加 apiDoc 文档注释)
+
+> 注:由于旧代码存在很多不规范问题,会逐步调整为新规范。在新写的代码都需要需要遵循上面说明
+>
+>
+### 类的文档注释规范(Javadoc)
+
+```
+/**
+ * xxxxxxxx
+ * @author xxxx
+ * @since ${DATE}
+ */
+```
+
+> 这里采用 `@since` 声明创建日期是因为 `Javadoc` 规范里面并没有 `@date` 标记所以采用 `@since` 代替
+
+### Java 代码规范
+
+> 推荐安装 `Alibaba Java Coding Guidelines`(`p3c`) 插件
+
+
+## changelog 更新规范
+
+> 在新加功能、修复bug、优化功能在完成时候都需要在 [CHANGELOG.md](./CHANGELOG.md) 记录
+
+1. 如果是使用者反馈的bug,在修复后需要备注反馈人的昵称
+2. 如果是 issue 需要备注 issue 地址以及平台(Gitee、GitHub)
+3. 如果是 pr 需要备注 pr 地址以及平台(Gitee、GitHub)
+4. 根据变动情况确定影响范围:如果影响 只:`agent`、`server` 其中一个,就使用【agent】、【server】开头,如果都影响就不用
+5. 可以视情况添加其他说明:如提交记录
+6. emoji 表情参考:[https://emojixd.com/](https://emojixd.com/)
+
+
+## 分支说明
+
+1. 新功能都提交到 dev 分支, 不能提交到 master 分支
+2. PR 提交到 dev 分支
+3. 一般功能开发可以直接提交到 dev 分支,较大功能开发需要新建分支提交
+
+## 需要的小组
+
+1. 后端小组 (主要任务:根据需求开发对应的接口)
+2. 前端小组 (主要任务:优化前端 UI 交互和对接部分接口)
+3. 文档小组 (主要任务:完善、补充 mdp 使用文档)
+4. 视频小组 (主要任务:录制 mdp 相关的使用视频)
+5. 测试小组 (主要任务:参与 mdp 新版内测、日常开发测试相关任务)
\ No newline at end of file
diff --git a/docs/front/API.md b/docs/front/API.md
new file mode 100644
index 0000000..baf2fc4
--- /dev/null
+++ b/docs/front/API.md
@@ -0,0 +1,183 @@
+# mdp-ui 组件库说明
+
+## 目录说明
+
+### 工程命名规范
+
+**前端工程命名规则:业务名-ui-web|-app|-uniapp**
+**后端工程命名规则:业务名-backend**
+
+- [-ui]代表前端
+- [-web]代表电脑浏览器应用
+- [-app]代表手机应用
+- [-uniapp]代表小程序+app的综合体,或者仅代表小程序
+- [-backend]代表后端
+- [-cloud]代表适用于微服务、分布式、云环境
+- [-bootstrap]代表属于打包类的工程,不能写业务代码
+
+### 前端目录
+
+```
+业务-ui-web
+ ├── build => 编译构建相关
+ ├── config => 编译构建配置项
+ ├── dist => 编译后的产物
+ ├── src => 源代码
+ ├── api => 与后端交互的api接口列表,一个表一个文件,公共api放入$fly中
+ ├── fly.js => 公共api放入fly中,自动注册成全局函数,页面上可以通过 $fly.xxxxApi()进行调用,无须引入任何文件
+ ├── assets => 静态资源
+ ├── common => 一些公共js脚本
+ ├── components => 组件库
+ ├── Mdp => mdp-ui基础组件库
+ ├── MdpExt => mdp-ui扩展的组件库,一般根据业务需要抽取提炼新的组件放入该目录
+ ├── directive => vue指令库
+ ├── icons => 图标库
+ ├── lang => 语言包
+ ├── mock => 接口模拟数据
+ ├── router => 路由库
+ ├── store => 全局公共数据库
+ ├── styles => css样式库
+ ├── views => 业务功能的页面代码
+ ├── vuex => vuex
+ ├── App.vue => 总入口 vue
+ ├── main.js => 总入口 js
+ ├── permission.js => 路由菜单权限过滤
+
+ ├── static => 某些静态资源
+ ├── .editorconfig => 全局代码格式配置
+ ├── .gitattributes => 文件编码格式配置
+ ├── CHANGELOG.md => 重大更新日志
+ ├── CONTRIBUTE.md => 贡献说明
+ ├── PLANS.md => 重大开发计划说明
+ ├── README.md => 项目说明
+ ├── LICENSE => 协议
+ ├── favicon.ico => 项目图标
+ ├── package.json => 组件依赖关系
+ ├── index.html => 总入口、首页
+```
+
+
+### 后端目录
+**后端工程结构**
+
+- 工程结构总图:
+```
+业务名-backend
+ ├── 业务名 =>业务工程,主要用来书写业务代码
+ ├── 业务名-cloud-bootstrap =>maven打包工程,禁止书写业务代码,部署到云环境
+ ├── 业务名-bootstrap =>maven打包工程,禁止书写业务代码,部署到单体应用环境
+ ├── pom.xml =>maven pom文件
+
+```
+- 工程结构明细图:
+```
+业务名-backend
+
+ ├── 业务名 => 业务主体工程,主要用来写业务功能代码
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名 => 一级业务、产品、大模块之类的
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── com.企业名.业务名.模块1 => 模块目录,一个模块=一个表
+ ├── com.企业名.业务名.模块1.ctrl => 控制器
+ ├── com.企业名.业务名.模块1.entity => 实体类,保持与数据库表一摸一样,不建议改动,代码生成器随时覆盖
+ ├── com.企业名.业务名.模块1.mapper => mybatis mapper文件,包含 Mapper.java Mapper.xml两个文件
+ ├── com.企业名.业务名.模块1.service => 服务类,所有服务继承 BaseService
+ ├── com.企业名.业务名.模块1.vo => 如果需要对entity进行扩展,可在此目录定义继承entity的子类
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-cloud-bootstrap => 打包工程(微服务环境)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-bootstrap => 打包工程(单体应用)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+ ├── pom.xml => maven pom文件
+```
+
+## [java]一些规范说明
+
+1. 写完代码后在保证不影响其他的人的代码情况下尽量统一格式化一下代码
+ 1. 采用 4 个空格缩进,禁止使用 tab 字符
+ 2. 如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,
+ 请勿勾选 Use tab character;而在 eclipse 中,必须勾选 insert spaces for tabs
+2. Java 代码需要保证新增方法都有充足、标准的 JavaDoc 注释
+3. 在修改 Bug、新增功能尽量保证最小提交的方式提交代码,减少多个功能一个 commit
+4. 所有接口 url 都需要遵循下划线模式
+5. Java 代码、方法需要遵循小驼峰法
+6. Java 类名需要遵循大驼峰法
+7. 前端项目统一采用 `prettier` 方式来格式化(需要安装插件)
+8. 所有 controller 层的接口都需要添加文档注释(至少包含接口的作用说明、参数说明、返回值说明及添加 apiDoc 文档注释)
+
+> 注:由于旧代码存在很多不规范问题,会逐步调整为新规范。在新写的代码都需要需要遵循上面说明
+>
+>
+### 类的文档注释规范(Javadoc)
+
+```
+/**
+ * xxxxxxxx
+ * @author xxxx
+ * @since ${DATE}
+ */
+```
+
+> 这里采用 `@since` 声明创建日期是因为 `Javadoc` 规范里面并没有 `@date` 标记所以采用 `@since` 代替
+
+### Java 代码规范
+
+> 推荐安装 `Alibaba Java Coding Guidelines`(`p3c`) 插件
+
+
+## changelog 更新规范
+
+> 在新加功能、修复bug、优化功能在完成时候都需要在 [CHANGELOG.md](./CHANGELOG.md) 记录
+
+1. 如果是使用者反馈的bug,在修复后需要备注反馈人的昵称
+2. 如果是 issue 需要备注 issue 地址以及平台(Gitee、GitHub)
+3. 如果是 pr 需要备注 pr 地址以及平台(Gitee、GitHub)
+4. 根据变动情况确定影响范围:如果影响 只:`agent`、`server` 其中一个,就使用【agent】、【server】开头,如果都影响就不用
+5. 可以视情况添加其他说明:如提交记录
+6. emoji 表情参考:[https://emojixd.com/](https://emojixd.com/)
+
+
+## 分支说明
+
+1. 新功能都提交到 dev 分支, 不能提交到 master 分支
+2. PR 提交到 dev 分支
+3. 一般功能开发可以直接提交到 dev 分支,较大功能开发需要新建分支提交
+
+## 需要的小组
+
+1. 后端小组 (主要任务:根据需求开发对应的接口)
+2. 前端小组 (主要任务:优化前端 UI 交互和对接部分接口)
+3. 文档小组 (主要任务:完善、补充 mdp 使用文档)
+4. 视频小组 (主要任务:录制 mdp 相关的使用视频)
+5. 测试小组 (主要任务:参与 mdp 新版内测、日常开发测试相关任务)
\ No newline at end of file
diff --git a/docs/front/COMPOENTS.md b/docs/front/COMPOENTS.md
new file mode 100644
index 0000000..5720d56
--- /dev/null
+++ b/docs/front/COMPOENTS.md
@@ -0,0 +1,184 @@
+# mdp-ui 组件库
+## 如何开始?
+
+## 目录说明
+
+### 工程命名规范
+
+**前端工程命名规则:业务名-ui-web|-app|-uniapp**
+**后端工程命名规则:业务名-backend**
+
+- [-ui]代表前端
+- [-web]代表电脑浏览器应用
+- [-app]代表手机应用
+- [-uniapp]代表小程序+app的综合体,或者仅代表小程序
+- [-backend]代表后端
+- [-cloud]代表适用于微服务、分布式、云环境
+- [-bootstrap]代表属于打包类的工程,不能写业务代码
+
+### 前端目录
+
+```
+业务-ui-web
+ ├── build => 编译构建相关
+ ├── config => 编译构建配置项
+ ├── dist => 编译后的产物
+ ├── src => 源代码
+ ├── api => 与后端交互的api接口列表,一个表一个文件,公共api放入$fly中
+ ├── fly.js => 公共api放入fly中,自动注册成全局函数,页面上可以通过 $fly.xxxxApi()进行调用,无须引入任何文件
+ ├── assets => 静态资源
+ ├── common => 一些公共js脚本
+ ├── components => 组件库
+ ├── Mdp => mdp-ui基础组件库
+ ├── MdpExt => mdp-ui扩展的组件库,一般根据业务需要抽取提炼新的组件放入该目录
+ ├── directive => vue指令库
+ ├── icons => 图标库
+ ├── lang => 语言包
+ ├── mock => 接口模拟数据
+ ├── router => 路由库
+ ├── store => 全局公共数据库
+ ├── styles => css样式库
+ ├── views => 业务功能的页面代码
+ ├── vuex => vuex
+ ├── App.vue => 总入口 vue
+ ├── main.js => 总入口 js
+ ├── permission.js => 路由菜单权限过滤
+
+ ├── static => 某些静态资源
+ ├── .editorconfig => 全局代码格式配置
+ ├── .gitattributes => 文件编码格式配置
+ ├── CHANGELOG.md => 重大更新日志
+ ├── CONTRIBUTE.md => 贡献说明
+ ├── PLANS.md => 重大开发计划说明
+ ├── README.md => 项目说明
+ ├── LICENSE => 协议
+ ├── favicon.ico => 项目图标
+ ├── package.json => 组件依赖关系
+ ├── index.html => 总入口、首页
+```
+
+
+### 后端目录
+**后端工程结构**
+
+- 工程结构总图:
+```
+业务名-backend
+ ├── 业务名 =>业务工程,主要用来书写业务代码
+ ├── 业务名-cloud-bootstrap =>maven打包工程,禁止书写业务代码,部署到云环境
+ ├── 业务名-bootstrap =>maven打包工程,禁止书写业务代码,部署到单体应用环境
+ ├── pom.xml =>maven pom文件
+
+```
+- 工程结构明细图:
+```
+业务名-backend
+
+ ├── 业务名 => 业务主体工程,主要用来写业务功能代码
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名 => 一级业务、产品、大模块之类的
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── com.企业名.业务名.模块1 => 模块目录,一个模块=一个表
+ ├── com.企业名.业务名.模块1.ctrl => 控制器
+ ├── com.企业名.业务名.模块1.entity => 实体类,保持与数据库表一摸一样,不建议改动,代码生成器随时覆盖
+ ├── com.企业名.业务名.模块1.mapper => mybatis mapper文件,包含 Mapper.java Mapper.xml两个文件
+ ├── com.企业名.业务名.模块1.service => 服务类,所有服务继承 BaseService
+ ├── com.企业名.业务名.模块1.vo => 如果需要对entity进行扩展,可在此目录定义继承entity的子类
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-cloud-bootstrap => 打包工程(微服务环境)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+
+
+ ├── 业务名-bootstrap => 打包工程(单体应用)
+ ├── logs => 工程运行日志输出目录
+ ├── src => src
+ ├── main => 源码包
+ ├── com.企业名.业务名
+ ├── DruidConfig.java => 数据库连接配置
+ ├── SwaggerConfig.java => wagger配置
+ ├── SysApplication.java => 启动类
+ ├── WebSecurityConfig.java => spring security配置
+ ├── resources => 资源文件
+ ├── test => 测试用例
+ ├── pom.xml => maven pom文件
+ ├── pom.xml => maven pom文件
+```
+
+## [java]一些规范说明
+
+1. 写完代码后在保证不影响其他的人的代码情况下尽量统一格式化一下代码
+ 1. 采用 4 个空格缩进,禁止使用 tab 字符
+ 2. 如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,
+ 请勿勾选 Use tab character;而在 eclipse 中,必须勾选 insert spaces for tabs
+2. Java 代码需要保证新增方法都有充足、标准的 JavaDoc 注释
+3. 在修改 Bug、新增功能尽量保证最小提交的方式提交代码,减少多个功能一个 commit
+4. 所有接口 url 都需要遵循下划线模式
+5. Java 代码、方法需要遵循小驼峰法
+6. Java 类名需要遵循大驼峰法
+7. 前端项目统一采用 `prettier` 方式来格式化(需要安装插件)
+8. 所有 controller 层的接口都需要添加文档注释(至少包含接口的作用说明、参数说明、返回值说明及添加 apiDoc 文档注释)
+
+> 注:由于旧代码存在很多不规范问题,会逐步调整为新规范。在新写的代码都需要需要遵循上面说明
+>
+>
+### 类的文档注释规范(Javadoc)
+
+```
+/**
+ * xxxxxxxx
+ * @author xxxx
+ * @since ${DATE}
+ */
+```
+
+> 这里采用 `@since` 声明创建日期是因为 `Javadoc` 规范里面并没有 `@date` 标记所以采用 `@since` 代替
+
+### Java 代码规范
+
+> 推荐安装 `Alibaba Java Coding Guidelines`(`p3c`) 插件
+
+
+## changelog 更新规范
+
+> 在新加功能、修复bug、优化功能在完成时候都需要在 [CHANGELOG.md](./CHANGELOG.md) 记录
+
+1. 如果是使用者反馈的bug,在修复后需要备注反馈人的昵称
+2. 如果是 issue 需要备注 issue 地址以及平台(Gitee、GitHub)
+3. 如果是 pr 需要备注 pr 地址以及平台(Gitee、GitHub)
+4. 根据变动情况确定影响范围:如果影响 只:`agent`、`server` 其中一个,就使用【agent】、【server】开头,如果都影响就不用
+5. 可以视情况添加其他说明:如提交记录
+6. emoji 表情参考:[https://emojixd.com/](https://emojixd.com/)
+
+
+## 分支说明
+
+1. 新功能都提交到 dev 分支, 不能提交到 master 分支
+2. PR 提交到 dev 分支
+3. 一般功能开发可以直接提交到 dev 分支,较大功能开发需要新建分支提交
+
+## 需要的小组
+
+1. 后端小组 (主要任务:根据需求开发对应的接口)
+2. 前端小组 (主要任务:优化前端 UI 交互和对接部分接口)
+3. 文档小组 (主要任务:完善、补充 mdp 使用文档)
+4. 视频小组 (主要任务:录制 mdp 相关的使用视频)
+5. 测试小组 (主要任务:参与 mdp 新版内测、日常开发测试相关任务)
\ No newline at end of file
diff --git a/docs/images/ui-components/big-table-select.jpg b/docs/images/ui-components/big-table-select.jpg
new file mode 100644
index 0000000..e95c435
Binary files /dev/null and b/docs/images/ui-components/big-table-select.jpg differ
diff --git a/docs/images/ui-components/data-range-x-hove-click.jpg b/docs/images/ui-components/data-range-x-hove-click.jpg
new file mode 100644
index 0000000..bc49c19
Binary files /dev/null and b/docs/images/ui-components/data-range-x-hove-click.jpg differ
diff --git a/docs/images/ui-components/data-range-x-hove.jpg b/docs/images/ui-components/data-range-x-hove.jpg
new file mode 100644
index 0000000..4862c98
Binary files /dev/null and b/docs/images/ui-components/data-range-x-hove.jpg differ
diff --git a/docs/images/ui-components/date-range-x-no-hove.jpg b/docs/images/ui-components/date-range-x-no-hove.jpg
new file mode 100644
index 0000000..7c55041
Binary files /dev/null and b/docs/images/ui-components/date-range-x-no-hove.jpg differ
diff --git a/docs/images/ui-components/date-x-hove.jpg b/docs/images/ui-components/date-x-hove.jpg
new file mode 100644
index 0000000..cbc1016
Binary files /dev/null and b/docs/images/ui-components/date-x-hove.jpg differ
diff --git a/docs/images/ui-components/date-x.jpg b/docs/images/ui-components/date-x.jpg
new file mode 100644
index 0000000..076375a
Binary files /dev/null and b/docs/images/ui-components/date-x.jpg differ
diff --git a/docs/images/ui-components/edit-table.jpg b/docs/images/ui-components/edit-table.jpg
new file mode 100644
index 0000000..87db972
Binary files /dev/null and b/docs/images/ui-components/edit-table.jpg differ
diff --git a/docs/images/ui-components/hi-query.jpg b/docs/images/ui-components/hi-query.jpg
new file mode 100644
index 0000000..cda7cbd
Binary files /dev/null and b/docs/images/ui-components/hi-query.jpg differ
diff --git a/docs/images/ui-components/index.jpg b/docs/images/ui-components/index.jpg
new file mode 100644
index 0000000..6a37b29
Binary files /dev/null and b/docs/images/ui-components/index.jpg differ
diff --git a/docs/images/ui-components/left-right-tree-table.jpg b/docs/images/ui-components/left-right-tree-table.jpg
new file mode 100644
index 0000000..8d1fbd5
Binary files /dev/null and b/docs/images/ui-components/left-right-tree-table.jpg differ
diff --git a/docs/images/ui-components/query-param.jpg b/docs/images/ui-components/query-param.jpg
new file mode 100644
index 0000000..fe95178
Binary files /dev/null and b/docs/images/ui-components/query-param.jpg differ
diff --git a/docs/images/ui-components/select-origin.jpg b/docs/images/ui-components/select-origin.jpg
new file mode 100644
index 0000000..aaa5902
Binary files /dev/null and b/docs/images/ui-components/select-origin.jpg differ
diff --git a/docs/images/ui-components/select-tag.jpg b/docs/images/ui-components/select-tag.jpg
new file mode 100644
index 0000000..48bec15
Binary files /dev/null and b/docs/images/ui-components/select-tag.jpg differ
diff --git a/docs/images/ui-components/select-user.jpg b/docs/images/ui-components/select-user.jpg
new file mode 100644
index 0000000..288911d
Binary files /dev/null and b/docs/images/ui-components/select-user.jpg differ
diff --git a/docs/images/ui-components/select-x-hove.jpg b/docs/images/ui-components/select-x-hove.jpg
new file mode 100644
index 0000000..1c0382b
Binary files /dev/null and b/docs/images/ui-components/select-x-hove.jpg differ
diff --git a/docs/images/ui-components/select-x-no-hove.jpg b/docs/images/ui-components/select-x-no-hove.jpg
new file mode 100644
index 0000000..4d24e03
Binary files /dev/null and b/docs/images/ui-components/select-x-no-hove.jpg differ
diff --git a/docs/images/ui-components/table-column-configs.jpg b/docs/images/ui-components/table-column-configs.jpg
new file mode 100644
index 0000000..dde6488
Binary files /dev/null and b/docs/images/ui-components/table-column-configs.jpg differ
diff --git a/docs/images/ui-components/table-mng.jpg b/docs/images/ui-components/table-mng.jpg
new file mode 100644
index 0000000..973cd8a
Binary files /dev/null and b/docs/images/ui-components/table-mng.jpg differ
diff --git a/docs/images/ui-components/tree-table.jpg b/docs/images/ui-components/tree-table.jpg
new file mode 100644
index 0000000..edd5fd4
Binary files /dev/null and b/docs/images/ui-components/tree-table.jpg differ
diff --git a/index.html b/index.html
index ce00196..551006d 100644
--- a/index.html
+++ b/index.html
@@ -1,20 +1,15 @@
-
-
-
-
-
-
-