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 +

+ + logo + +

+

+ 多功能、高效率、低代码的前后端一体化、智能化的开发工具 +

+ +

+ + gitee star + + + github star + +

+

+ 👉 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 +- 综合管理 +![综合管理表格](/docs/images/ui-components/table-mng.jpg) +- 可编辑表格 +![可编辑表格](/docs/images/ui-components/edit-table.jpg) +- 可编辑-树状表格 +![可编辑-树状表格](/docs/images/ui-components/left-right-tree-table.jpg) -# 前端ui-微信公众号端 -vue.js、vux +### [mdp-select](/src/components/mdp-ui/mdp-select) +下拉列表,支持对数据字典、元数据的引用,支持对任意小表表格数据的引用,支持参数化加载后台数据,对后台加载的数据进行缓存 +![mdp-select](/docs/images/ui-components/select-origin.jpg) -# 前端ui-微信小程序 -微信开发工具 +### [mdp-select-table](/src/components/mdp-ui/mdp-select-table) +超大表格下拉列表,与mdp-select相比,该组件具有分页查询功能 +![分页选择表格数据](/docs/images/ui-components/big-table-select.jpg) +### [mdp-select-user](/src/components/mdp-ui-ext/mdp-select-user) +用户选择下拉列表,与mdp-select-table组件类似,仅仅针对用户的头像做了特殊处理 +![用户选择](/docs/images/ui-components/select-user.jpg) -# 前端文件结构 -* 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) +高级查询,可以由用户自定义任意复杂的查询条件 +![高级查询](/docs/images/ui-components/hi-query.jpg) -## 4 通过镜像下载 node-sass(如有必要) -npm install -g node-sass --registry=https://registry.npm.taobao.org +### [mdp-table-configs](/src/components/mdp-ui/mdp-table-configs) +表格配置,用于控制表格的列显示与否 +![表格配置列显示隐藏](/docs/images/ui-components/table-column-configs.jpg) -## 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 + +``` +```js + this.$mdp.xxxApi() +``` +- [login](/src/api/login.js) +登录相关api + +## ↕️ 指令 +- [v-adaptive](./directive/el-table/index.js) +让表格自动适应,表格底部始终保持距离视窗底部一定距离(默认 30px) +``` + +``` -### 1.5 设置eclipse 检查项,提升编译速度 -Window -> Preferences -> Validation -> 找到build列 -> 只保留 Classpath Dependance Validator 选中状态 -## 2 下载代码生成器mdp-dev -### 2.0 从svn下载mdp-dev工程,mdp自研发的开发工具 -svn 地址为 http://203.195.131.73:8085/svn/mdp/trunk/mdp-dev - -### 2.1 使用mdp-dev生成crud代码(开发业务功能时使用,先设计表结构,再生成代码) -使用/mdp-dev/src/test/java/com/qqkj/mdp/dev/TestCodegenService.java 进行代码生成 -## 3 maven 设置 -### 3.0 设置maven私服 用户密码 -将/mdp-dev/settings.xml拷贝到 C:\Users\Administrator\.m2目录下 +## ⌨ 技术栈 -### 3.1 安装本地jar包到私服(如果有本地jar包,目前有orcale的驱动包已经安装) -私服登录地址 http://203.195.131.73:8081/nexus 用户名、密码 admin/admin123 +vue全家桶 + element-ui + axios -## 4 应用项目开发 -### 4.0 从svn下载应用工程项目 -svn 地址为 http://203.195.131.73:8085/svn/应用产品对应目录 +## 💻 样例项目 -### 4.1 从mven私服下载依赖jar包 -在 Eclipse 工程目录鼠标右键 -> Maven -> Update Project +- [系统管理] (https://maimengcloud.com/sys/m1/) +- [协同办公] (https://maimengcloud.com/oa/m1/) +- [项目管理] (https://maimengcloud.com/xm/m1/) +- [流程管理] (https://maimengcloud.com/workflow/m1/) -### 4.2 运行工程项目 -在src/main/java 中找到 ***Application。java -> 鼠标右键 -> Run as -> Java Application -或者 -在src/test/java 中找到 ***Application。java -> 鼠标右键 -> Run as -> Java Application +## ⚙ 快速开始 -## 5 打包部署 -### 5.0 工程打jar包 -在 Eclipse 工程目录鼠标右键 -> Run as -> Maven Install +>⚠️注意:该项目使用 element-ui@2.3.0+ 版本,所以最低兼容 vue@2.5.0+ -### 5.1 将打包好的jar包上传maven私服 -在 Eclipse 工程目录鼠标右键 -> Run as -> Maven Buil -> deploy +### 前序准备 +- 你的本地环境需要安装 [node](http://nodejs.org/) 和 [git](https://git-scm.com/)。我们的技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) and [element-ui](https://github.com/ElemeFE/element),提前了解和学习这些知识会对使用本项目有很大的帮助。 +- 该项目属于网页版前端项目,所有api由 [mdp-sys-backend](https://gitee.com/qingqinkj/mdp-sys-backend)提供,请下载该项目 +- 代码生成器下载 [mdp-code-generator](https://gitee.com/qingqinkj/mdp-code-generator) -``` bash -# install dependencies -cnpm install +### 开发 +```bash +# 克隆项目 +git clone https://gitee.com/qingqinkj/mdp-sys-ui-web.git -# serve with hot reload at localhost:8081 -cnpm run dev +# 安装依赖 +npm install +    +# 建议不要用cnpm安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题 +npm install --registry=https://registry.npm.taobao.org -# build for production with minification -cnpm run build +# 启动服务 +npm run dev +``` +浏览器访问 http://localhost:8015 + +#### 登录相关 +登录api,对接后台接口有两种方式,分别为对接统一认证中心、对接mdp-sys-backend +默认对接mdp-sys-backend中的登录模块,如果想切换,更改[mdp_config.js中的getOauth2LoginContext函数即可](src/api/mdp_pub/mdp_config.js) +- 对接统一认证中心进行登录 +```js + getOauth2LoginContext:function(){ + return "oauth2client" + } +``` +- 对接mdp-sys-backend进行登录 +```js + getOauth2LoginContext:function(){ + return "sys" + } +``` +### 发布 +```bash +# 构建测试环境 +npm run build:sit +# 构建生成环境 +npm run build:prod ``` - - -` 其它一些常用命令 ` -# 清除缓存 -npm cache clean --force -# npm国内代理镜像服务器 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): -npm config set registry https://registry.npm.taobao.org -npm info underscore (如果上面配置正确这个命令会有字符串response) +### 🔔️ 特别提醒 + +mdp 3.0 版本已经开始规划更新了,尽请期待新版本的诞生吧 + +### 🗒️ 版本更新日志 + +升级前必看:[CHANGELOG.md](/docs/CHANGELOG.md) + + +## 🚀 基于mdp框架拓展的开源项目 +>⚠️ 注意:以下拓展的框架或者子系统,由mdp开源团队基于项目经验进行总结抽取,可用可不用,可以以jar包方式合并到现有工程进行发布,也可单独发布成单体应用、微服务应用 + +- 第三方支付框架,整合了微信支付、支付宝支付、paypal支付 + 1. [mdp-tpa-pay-backend](https://gitee.com/qingqinkj/mdp-tpa-pay-backend) 后端 + +- 即时通讯框架 + 1. [mdp-im-uniapp](https://gitee.com/qingqinkj/mdp-im-uniapp) 前端app + 2. [mdp-im-web](https://gitee.com/qingqinkj/mdp-im-web) 前端浏览器 + 3. [mdp-im-backend](https://gitee.com/qingqinkj/mdp-im-backend) 后端 + +- 统一认证中心框架 + 1. [mdp-sys-ui-web](https://gitee.com/qingqinkj/mdp-sys-ui-web) 前端 + 2. [mdp-oauth2-backend](https://gitee.com/qingqinkj/mdp-oauth2-backend) 后端 + 3. [mdp-sys-backend](https://gitee.com/qingqinkj/mdp-sys-backend) 后端 + +- 微服务框架 + 1. [mdp-cloud-backend](https://gitee.com/qingqinkj/mdp-cloud-backend) 后端 + +- 工作流管理子系统 + 1. [mdp-workflow-ui-web](https://gitee.com/qingqinkj/mdp-workflow-ui-web) 前端 + 2. [mdp-workflow-backend](https://gitee.com/qingqinkj/mdp-workflow-backend) 后端 + +- 智能表单子系统 + 1. [mdp-form-ui-web](https://gitee.com/qingqinkj/mdp-form-ui-web) 前端 + 2. [mdp-form-backend](https://gitee.com/qingqinkj/mdp-form-backend) 后端 + +- 内容管理子系统 + 1. [mdp-arc-ui-web](https://gitee.com/qingqinkj/mdp-arc-ui-web) 前端 + 2. [mdp-arc-backend](https://gitee.com/qingqinkj/mdp-arc-backend) 后端 + +- 短信子系统 + 1. [mdp-sms-ui-web](https://gitee.com/qingqinkj/mdp-sms-ui-web) 前端 + 2. [mdp-sms-backend](https://gitee.com/qingqinkj/mdp-sms-backend) 后端 + +- 项目管理子系统 + 1. [xm-crowd-ui-web](https://gitee.com/qingqinkj/xm-crowd-ui-web) 前端众包 + 2. [xm-ui-web](https://gitee.com/qingqinkj/xm-ui-web) 前端管理端 + 3. [xm-backend](https://gitee.com/qingqinkj/xm-backend) 后端 + +- 财务管理子系统 + 1. [ac-core-ui-web](https://gitee.com/qingqinkj/ac-core-ui-web) 前端管理端 + 2. [ac-backend](https://gitee.com/qingqinkj/ac-backend) 后端 + + +## 📝 常见问题、操作说明 + +- [前端基础组件](https://gitee.com/qingqinkj/mdp-modules/blob/master/docs/COMPONENTS.md) +- [前端扩展组件](https://gitee.com/qingqinkj/mdp-modules/blob/master/docs/COMPONENTS.md) +- [前端公共api](https://gitee.com/qingqinkj/mdp-modules/blob/master/docs/COMPONENTS.md) +- [后端公共api](https://gitee.com/qingqinkj/mdp-modules/blob/master/docs/COMPONENTS.md) +- [文档主页](https://maimengcloud.com/#/openCommunity/mdp) +- [FQA](https://maimengcloud.com/#/openCommunity/fqa) + +## 💯 实践案例 + +1. [系统管理](https://maimengcloud.com/sys/m1/) +2. [协同办公](https://maimengcloud.com/oa/m1/) +3. [唛盟众包-网页](https://maimengcloud.com) +3. [项目管理-网页](https://maimengcloud.com/xm/m1/) +4. 项目管理-小程序 + drawing +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 进群) +drawing + +2. 唛盟微信公众号查看一些基础教程 +drawing +3. 反馈 BUG、提出建议,欢迎新建:[issues](https://gitee.com/qingqinkj/mdp-sys-ui-web/issues),开发人员会不定时查看回复。 +4. 参与贡献,请查看[贡献指南](#🔨贡献指南)。 -# Browser support +## 💲 打赏 + **感谢所有赞赏以及参与贡献的小伙伴,你们的支持是我们不断更新前进的动力!微信扫一扫,赏杯咖啡呗!** + drawing -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 @@ - - - - - - - MDP-多功能快速开发平台 - - - - -
- -
- - - - \ No newline at end of file + + + + + + 唛盟平台-智能表单 + + + +
+ + + diff --git a/package.json b/package.json index 378e3ab..ba4fd34 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,33 @@ { - "name": "form-ui-web", + "name": "mdp-form-ui-web", "version": "1.0.0", - "description": "form-ui-web", + "description": "mdp-form-web", "author": "chenyc ", "license": "MIT", "private": true, "scripts": { - "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "dev": "webpack-dev-server --progress --config build/webpack.dev.conf.js", "build:prod": "cross-env NODE_ENV=production env_config=prod node build/build.js", "build:sit": "cross-env NODE_ENV=production env_config=sit node build/build.js", "build:m1prod": "cross-env NODE_ENV=production env_config=m1prod node build/build.js", "lint": "eslint --ext .js,.vue src", - "test": "npm run lint", - "copy": "node copy/copy.js", - "copyDistToStatic": "node copy/copyDistToStatic.js" + "test": "npm run lint" }, "dependencies": { + "@jiaminghi/data-view": "^2.10.0", "axios": "0.17.1", "clipboard": "1.7.1", "codemirror": "5.32.0", + "dayjs": "^1.8.29", + "decimal.js": "^10.2.0", + "driver.js": "^0.9.8", "dropzone": "5.2.0", - "echarts": "3.8.5", - "element-ui": "^2.13.0", + "echarts": "^5.3.2", + "element-ui": "^2.15.8", "file-saver": "2.0.1", "font-awesome": "4.7.0", - "highlight.js": "^9.12.0", + "gantt-elastic": "^1.0.11", + "gantt-elastic-header": "^0.1.11", "html2canvas": "^1.0.0-alpha.9", "js-cookie": "2.2.0", "js-md5": "^0.7.3", @@ -32,81 +35,104 @@ "jszip": "3.2.1", "mockjs": "1.0.1-beta3", "moment": "^2.24.0", - "node-sass": "^4.13.1", "normalize.css": "7.0.0", "nprogress": "0.2.0", "object-assign": "^4.1.1", - "quill-image-drop-module": "^1.0.3", - "quill-image-resize-module": "^3.0.0", "screenfull": "3.3.2", "showdown": "1.8.5", "simplemde": "1.11.2", "sortablejs": "1.7.0", - "vue": "2.6.10", + "vue": "2.6.14", "vue-clipboard2": "^0.3.1", + "vue-contextmenujs": "^1.3.10", "vue-count-to": "1.0.13", "vue-cropper": "^0.2.9", + "vue-gantt-schedule-timeline-calendar": "^1.0.33", + "vue-grid-layout": "^2.3.12", "vue-i18n": "7.3.2", - "vue-image-crop-upload": "^1.3.14", - "vue-multiselect": "2.0.8", - "vue-quill-editor": "^3.0.6", + "vue-okr-tree": "^1.0.10", + "vue-print-nb": "^1.7.5", + "vue-qr": "^4.0.6", + "vue-qriously": "^1.1.1", "vue-router": "3.0.1", - "vue-splitpane": "1.0.2", "vuedraggable": "2.15.0", "vuex": "3.0.1", - "xlsx": "^0.14.1" + "wl-gantt": "^1.0.6", + "xlsx": "^0.14.5" }, "devDependencies": { - "autoprefixer": "7.2.3", - "babel-core": "6.26.0", - "babel-eslint": "8.0.3", - "babel-helper-vue-jsx-merge-props": "2.0.3", - "babel-loader": "7.1.2", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-runtime": "6.23.0", - "babel-plugin-transform-vue-jsx": "3.5.0", - "babel-preset-env": "1.6.1", - "babel-preset-stage-2": "6.24.1", + "@babel/core": "^7.15.8", + "@babel/preset-env": "^7.15.8", + "@babel/preset-react": "^7.14.5", + "acorn": "^8.5.0", + "acorn-import-assertions": "^1.8.0", + "autoprefixer": "^10.3.7", + "babel-core": "^6.26.3", + "babel-loader": "^7.1.5", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-plugin-transform-vue-jsx": "^3.7.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "babel-preset-es2015": "^6.24.1", + "babel-preset-stage-2": "^6.24.1", + "babel-runtime": "^6.26.0", "chalk": "2.3.0", - "copy-webpack-plugin": "4.3.0", + "compression-webpack-plugin": "^9.0.0", + "copy-webpack-plugin": "^9.0.1", "cross-env": "5.1.1", - "css-loader": "0.28.7", + "css-loader": "^6.4.0", + "css-minimizer-webpack-plugin": "^3.1.1", + "cssnano": "^5.0.8", "eslint": "4.13.1", "eslint-friendly-formatter": "3.0.0", "eslint-loader": "1.9.0", "eslint-plugin-html": "4.0.1", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.5", - "friendly-errors-webpack-plugin": "1.6.1", - "html-webpack-plugin": "2.30.1", + "extract-text-webpack-plugin": "^3.0.2", + "file-loader": "^6.2.0", + "friendly-errors-plugin": "^1.1.2", + "friendly-errors-webpack-plugin": "^1.7.0", + "html-webpack-plugin": "^5.4.0", + "less": "^4.1.2", + "less-loader": "^10.2.0", + "mini-css-extract-plugin": "^2.4.3", + "node-loader": "^2.0.0", "node-notifier": "5.1.2", - "node-sass": "^4.5.0", - "optimize-css-assets-webpack-plugin": "3.2.0", + "node-sass": "^4.14.1", "ora": "1.3.0", "portfinder": "1.0.13", + "postcss": "^8.3.11", + "postcss-cssnext": "^3.1.1", "postcss-import": "11.0.0", - "postcss-loader": "2.0.9", + "postcss-loader": "^6.2.0", + "postcss-merge-rules": "^5.0.2", "postcss-url": "7.3.0", "pushstate-server": "3.0.1", - "quill-image-extend-module": "^1.1.2", "rimraf": "2.6.2", - "sass-loader": "6.0.6", + "sass-loader": "^12.2.0", "script-loader": "0.7.2", "semver": "5.4.1", "shelljs": "0.7.8", - "svg-sprite-loader": "3.5.2", - "uglifyjs-webpack-plugin": "1.1.3", - "url-loader": "0.6.2", - "vue-loader": "13.5.0", - "vue-style-loader": "3.0.3", - "vue-template-compiler": "2.6.10", - "webpack": "3.10.0", + "stream": "0.0.2", + "style-loader": "^3.3.1", + "svg-sprite-loader": "^6.0.10", + "terser-webpack-plugin": "^5.2.4", + "thread-loader": "^3.0.4", + "uglifyjs-webpack-plugin": "^2.2.0", + "url-loader": "^4.1.1", + "vue-loader": "^15.9.8", + "vue-style-loader": "^4.1.3", + "vue-template-compiler": "^2.6.14", + "vue-wxlogin": "^1.0.4", + "webpack": "^5.59.1", "webpack-bundle-analyzer": "2.9.1", - "webpack-dev-server": "2.9.7", + "webpack-cli": "^4.9.1", + "webpack-dev-middleware": "^5.2.1", + "webpack-dev-server": "^4.3.1", "webpack-merge": "4.1.1" }, "engines": { - "node": ">= 4.0.0", + "node": ">= 10.13.0", "npm": ">= 3.0.0" }, "browserslist": [ diff --git a/src/App.vue b/src/App.vue index a28656a..623b032 100644 --- a/src/App.vue +++ b/src/App.vue @@ -10,3 +10,4 @@ } + diff --git a/src/api/article.js b/src/api/article.js deleted file mode 100644 index 9eacd90..0000000 --- a/src/api/article.js +++ /dev/null @@ -1,40 +0,0 @@ -import request from '@/utils/request' - -export function fetchList(query) { - return request({ - url: '/article/list', - method: 'get', - params: query - }) -} - -export function fetchArticle() { - return request({ - url: '/article/detail', - method: 'get' - }) -} - -export function fetchPv(pv) { - return request({ - url: '/article/pv', - method: 'get', - params: { pv } - }) -} - -export function createArticle(data) { - return request({ - url: '/article/create', - method: 'post', - data - }) -} - -export function updateArticle(data) { - return request({ - url: '/article/update', - method: 'post', - data - }) -} diff --git a/src/api/branch.js b/src/api/branch.js deleted file mode 100644 index f9da89c..0000000 --- a/src/api/branch.js +++ /dev/null @@ -1,33 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 管理端机构表(机构下面若干部门) - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'机构编号 主键',branchName:'机构名称',enabled:'是否可用',industryCategory:'行业分类',cuserid:'创建人编号',cdate:'创建日期',cusername:'创建人姓名',phoneNo:'联系电话',emaill:'邮件'} - **/ - -//普通查询 条件之间and关系 -export const listBranchNoAuth = params => { return axios.get(`${base}/mdp/sys/branch/listBranchNoAuth`, { params: params }); }; - -//模糊查询管理端机构表(机构下面若干部门) 条件之间or关系 -//export const listBranchKey = params => { return axios.get(`${base}/mdp/sys/branch/listKey`, { params: params }); }; - -//删除一条管理端机构表(机构下面若干部门) params={id:'机构编号 主键'} -export const delBranch = params => { return axios.post(`${base}/mdp/sys/branch/del`,params); }; - -//批量删除管理端机构表(机构下面若干部门) params=[{id:'机构编号 主键'}] -export const batchDelBranch = params => { return axios.post(`${base}/mdp/sys/branch/batchDel`, params); }; - -//修改一条管理端机构表(机构下面若干部门)记录 -export const editBranch = params => { return axios.post(`${base}/mdp/sys/branch/edit`, params); }; - -//新增一条管理端机构表(机构下面若干部门) -export const addBranchNoAuth = params => { return axios.post(`${base}/mdp/sys/branch/addBranchNoAuth`, params); }; - - -//新增一条企业入驻审核流程 -export const addUserJoinBranchRequire = params => { return axios.post(`${base}/mdp/sys/userJoinBranchRequire/add`, params); }; \ No newline at end of file diff --git a/src/api/common/code.js b/src/api/common/code.js deleted file mode 100644 index fc8ef61..0000000 --- a/src/api/common/code.js +++ /dev/null @@ -1,283 +0,0 @@ -import axios from 'axios'; - -import config from '../../common/config.js'; - -let base = "/"+config.getContextName(); - -/*** - * { - * - * } - */ -var cacheOptions={}; - -var cacheSeconds={}; - -var cacheOptionsBySecondCodeRows={}; - -var cacheCompanyDepts=null; - -var cacheCompanyEmployees=null; - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listCode = params => { return axios.get(`${base}/sys/code/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -export const listCodeKey = params => { - - return axios.get(`${base}/sys/code/listKey`, { params: params }); - -}; - - -/** - * 查询下拉选项目 参数为数组型参数 如 selectOptions( { fieldNames:['sex','age','student'],code:'all' } ),code为数据分类 - * 返回结果为: - * res.data.data:{ - * sex:[{codeName:男,codeValue:1,ifdefault:'1'},{codeName:女,codeValue:2,ifdefault:'0'}], - * age:[{codeName:1岁,codeValue:1,ifdefault:'1'},{codeName:2岁,codeValue:2,ifdefault:'0'},{codeName:3岁,codeValue:3,ifdefault:'0'}] - * } - */ -export const selectCacheOptions = params => { - - let code=params.code; - let fieldNames=params.fieldNames; - if(!cacheOptions[code]){ - return new Promise((resolve, reject) => { - axios.get(`${base}/sys/code/selectOptions`, { params:params }).then(res=>{ - let options=res.data.data; - cacheOptions[code]=options; - resolve({ - data: {data:options} - }); - }); - - }); - - }else{ - let codeOptions=cacheOptions[code]; - var lostFieldNames=[]; - var cacheHasOptions={}; - fieldNames.forEach(item=>{ - if(codeOptions[item]){ - cacheHasOptions[item]=codeOptions[item]; - }else{ - lostFieldNames.push(item); - } - }); - if(lostFieldNames.length>0){ - return new Promise((resolve, reject) => { - axios.get(`${base}/sys/code/selectOptions`, { params:{code:code,fieldNames:lostFieldNames} }).then(res=>{ - let options2=res.data.data; - lostFieldNames.forEach(item=>{ - codeOptions[item]=options2[item]; - cacheHasOptions[item]=options2[item]; - cacheOptions[code]=codeOptions; - - }); - resolve( { - data: {data:cacheHasOptions} - }); - }); - - }); - - }else{ - return new Promise((resolve, reject) => { - resolve( { - data: {data:cacheHasOptions} - }); - }); - } - - } - - -}; -/** - * 查询下拉选项目 参数为数组型参数 如 selectOptionsBySecondCodeRows( {secondCodeRows:['secondCodeRow1','secondCodeRow2']} ) - * 返回结果为: - * res.data.data:{ - * secondCodeRow1:[{codeName:男,codeValue:1,ifdefault:'1'},{codeName:女,codeValue:2,ifdefault:'0'}], - * secondCodeRow1:[{codeName:1岁,codeValue:1,ifdefault:'1'},{codeName:2岁,codeValue:2,ifdefault:'0'},{codeName:3岁,codeValue:3,ifdefault:'0'}] - * } - */ -export const selectOptionsBySecondCodeRows = params => { - let secondCodeRows=params.secondCodeRows; - var lostSecondCodeRows=[]; - var cacheHasOptions={}; - secondCodeRows.forEach(item=>{ - if(cacheOptionsBySecondCodeRows[item]){ - cacheHasOptions[item]=cacheOptionsBySecondCodeRows[item]; - }else{ - lostSecondCodeRows.push(item); - } - }); - if(lostSecondCodeRows.length>0){ - return new Promise((resolve, reject) => { - axios.get(`${base}/sys/code/selectOptionsBySecondCodeRows`, { params:{secondCodeRows:lostSecondCodeRows }}).then(res=>{ - let options2=res.data.data; - lostSecondCodeRows.forEach(item=>{ - cacheOptionsBySecondCodeRows[item]=options2[item]; - cacheHasOptions[item]=options2[item]; - }); - resolve( { - data: {data:cacheHasOptions} - }); - }); - - }); - - }else{ - return new Promise((resolve, reject) => { - resolve( { - data: {data:cacheHasOptions} - }); - }); - } -}; -/** - * 查询下拉选项目 参数为数组型参数 如 selectOptions( { fieldNames:['sex','age','student'],code:'all' } ),code为数据分类 - * 返回结果为: - * res.data.data:{ - * sex:[{codeName:男,codeValue:1,ifdefault:'1'},{codeName:女,codeValue:2,ifdefault:'0'}], - * age:[{codeName:1岁,codeValue:1,ifdefault:'1'},{codeName:2岁,codeValue:2,ifdefault:'0'},{codeName:3岁,codeValue:3,ifdefault:'0'}] - * } - */ -export const selectOptions = params => { - return axios.get(`${base}/sys/code/selectOptions`, { params:params }) -}; -//获取代码对应的名称 用于数据反显 如 getCodeName(options.sex,'1'); -export const getCodeName = (options,codeValue)=>{ - if(!options)return codeValue; - let code=options.filter(i=>i.codeValue==codeValue); - if(code.length>0){ - return code[0].codeName - }else{ - return codeValue - } -}; - -/** - * 获取某个字段的默认值 - * getDefaultValue(options.sex,'1'); - */ -export const getDefaultValue = (fieldOptions,defaultValue) =>{ - if(fieldOptions==null || fieldOptions.length==0){ - return defaultValue; - } - let defaultV=defaultValue; - fieldOptions.forEach(i=>{ - if(i.ifdefault=='1'){ - defaultV=i.codeValue; - } - }); - return defaultV; -}; - -/** -* 根据一级分类列表查询所有的二级分类 -* @param codes 分类编码 列表 如['JCBM_TPL','SystemParas'] -* @return 返回如下格式的map。secondCodeRow为主键,dtcodeId为编码,dtcodeName中文描述 -* { -* JCBM_TPL:[{secondCodeRow:'xxxx',dtcodeId:1,dtcodeName:男},{secondCodeRow:'xxxx',dtcodeid:1,dtcodeName:男}], -* SystemParas:[{secondCodeRow:'xxxx',dtcodeId:3,dtcodeName:其它},{secondCodeRow:'xxxx',dtcodeid:2,dtcodeName:其它2}] -* } -*/ -export const selectSeconds = params => { return axios.get(`${base}/sys/code/selectSeconds`, { params:params }); }; - -/** -* 根据一级分类列表查询所有的二级分类 -* @param codes 分类编码 列表 如['JCBM_TPL','SystemParas'] -* @return 返回如下格式的map。secondCodeRow为主键,dtcodeId为编码,dtcodeName中文描述 -* { -* JCBM_TPL:[{secondCodeRow:'xxxx',dtcodeId:1,dtcodeName:男},{secondCodeRow:'xxxx',dtcodeid:1,dtcodeName:男}], -* SystemParas:[{secondCodeRow:'xxxx',dtcodeId:3,dtcodeName:其它},{secondCodeRow:'xxxx',dtcodeid:2,dtcodeName:其它2}] -* } -*/ -export const selectCacheSeconds = params => { - let codes=params.codes; - let lostCodes=[]; - codes.forEach(item=>{ - if(!cacheSeconds[item]){ - lostCodes.push(item); - } - }); - if(lostCodes.length>0){ - return new Promise((resolve, reject) => { - selectSeconds({codes:lostCodes}).then(res=>{ - let seconds=res.data.data; - lostCodes.forEach(item=>{ - cacheSeconds[item]=seconds[item]; - }); - let result={}; - codes.forEach(item=>{ - result[item]=cacheSeconds[item]; - }); - resolve( { - data: {data:result} - }); - }); - }); - }else{ - let result={}; - codes.forEach(item=>{ - result[item]=cacheSeconds[item]; - }); - return new Promise((resolve, reject) => { - resolve( { - data: {data:result} - }); - }); - } - - -}; -// [{dpetid:'',displayDeptid:'',deptName:'',shortName:'',pdeptid:''},{dpetid:'',displayDeptid:'',deptName:'',shortName:'',pdeptid:''}] -export const getCompanyDepts = () => { - if(cacheCompanyDepts!=null && cacheCompanyDepts.length>=0){ - return new Promise((resolve, reject) => { - resolve( { - data: {data:cacheCompanyDepts} - }); - }); - } - - return axios.get(`${base}/sys/code/companyDepts`).then(res=>{ - if(res.data.data==null){ - cacheCompanyDepts=[]; - }else{ - cacheCompanyDepts=res.data.data; - } - return new Promise((resolve, reject) => { - resolve( { - data: {data:cacheCompanyDepts} - }); - }); - }); -}; -//[{userid:'',displayUserid:'',username:'',deptid:'',shortName:'',deptName:''},{userid:'',displayUserid:'',username:'',deptid:'',shortName:'',deptName:''}] -export const getCompanyEmployees = () => { - if(cacheCompanyEmployees!=null && cacheCompanyEmployees.length>=0){ - return new Promise((resolve, reject) => { - resolve( { - data: {data:cacheCompanyEmployees} - }); - }); - } - - return axios.get(`${base}/sys/code/companyEmployees`).then(res=>{ - if(res.data.data==null){ - cacheCompanyEmployees=[]; - }else{ - cacheCompanyEmployees=res.data.data; - } - return new Promise((resolve, reject) => { - resolve( { - data: {data:cacheCompanyEmployees} - }); - }); - }); -}; \ No newline at end of file diff --git a/src/api/itemOption.js b/src/api/itemOption.js deleted file mode 100644 index df96184..0000000 --- a/src/api/itemOption.js +++ /dev/null @@ -1,125 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 数据项取值列表 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',itemId:'数据项编号',optionValue:'选项值',optionName:'选项名称',keys:'快捷键',isShow:'是否显示',seqOrder:'顺序',fp:'第一扩展字段',tp:'第三扩展字段',sp:'第二扩展字段',isDefault:'是否默认',cdate:'创建日期',branchId:'机构编号',deptid:'部门编号'} - **/ - -//普通查询 条件之间and关系 -export const listItemOption = params => { return axios.get(`${base}/mdp/meta/itemOption/list`, { params: params }); }; - - -//普通查询 条件之间and关系 params=[{categoryId:'0001',itemCode:'sex'}] 返回结果 {'sex':[{optionValue:'1',optionName:'男',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'女',seqOrder:'2',fp:'',isDefault:'0'}]} -export const listOption = params => { - var date=new Date(); - var dateStr=date.getFullYear()+"-"+date.getMonth()+"-"+date.getDay() - var result={ - data:{ - tips:{ - isOk:true, - }, - data:{ - - } - } - } - var noExistsParams=params.filter(i=>{ - var key=i.categoryId+"-"+i.itemCode+"-"+dateStr; - var options = localStorage.getItem(key); - if(options){ - result.data.data[i.itemCode]=JSON.parse(options) - return false - }return true; - }); - return new Promise((resolve,reject) => { - if(noExistsParams.length>0){ - axios.post(`${base}/mdp/meta/itemOption/list/byItemCode`, noExistsParams ).then(res=>{ - var tips = res.data.tips; - if(tips.isOk){ - var data=res.data.data; - noExistsParams.forEach(k=>{ - var key=k.categoryId+"-"+k.itemCode+"-"+dateStr; - localStorage.setItem(key, JSON.stringify(data[k.itemCode])); - result.data.data[k.itemCode]= data[k.itemCode] - }) - }else{ - result.data.tips=tips; - } - resolve(result); - }).catch(e=>reject(e)); - }else{ - resolve(result); - } - - }); - -}; -export const listOptionByItemIds = params => { - var date=new Date(); - var dateStr=date.getFullYear()+"-"+date.getMonth()+"-"+date.getDay() - var result={ - data:{ - tips:{ - isOk:true, - }, - data:{ - - } - } - } - var noExistsParams=params.filter(i=>{ - var key=i+"-"+dateStr; - var options = localStorage.getItem(key); - - if(options){ - var optionsJson=JSON.parse(options); - result.data.data[i]=optionsJson - return false - }return true; - }); - return new Promise((resolve,reject) => { - if(noExistsParams.length>0){ - axios.post(`${base}/mdp/meta/itemOption/listItemOptionByItemIds`, noExistsParams ).then(res=>{ - var tips = res.data.tips; - if(tips.isOk){ - var data=res.data.data; - noExistsParams.forEach(k=>{ - var key= k+"-"+dateStr; - localStorage.setItem(key, JSON.stringify(data[k])); - result.data.data[k]= data[k] - }) - }else{ - result.data.tips=tips; - } - resolve(result); - }).catch(e=>reject(e)); - }else{ - resolve(result); - } - - }); - -}; - - -//params={id:''} 返回 {optionValue:'1',optionName:'男',seqOrder:'1',fp:'',isDefault:'0'} -export const getSysParam = params => { return axios.post(`${base}/mdp/meta/itemOption/sysParam`, params ); }; -//模糊查询数据项取值列表 条件之间or关系 -//export const listItemOptionKey = params => { return axios.get(`${base}/mdp/meta/itemOption/listKey`, { params: params }); }; - -//删除一条数据项取值列表 params={id:'主键 主键'} -export const delItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/del`,params); }; - -//批量删除数据项取值列表 params=[{id:'主键 主键'}] -export const batchDelItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/batchDel`, params); }; - -//修改一条数据项取值列表记录 -export const editItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/edit`, params); }; - -//新增一条数据项取值列表 -export const addItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/add`, params); }; \ No newline at end of file diff --git a/src/api/login.js b/src/api/login.js index 695083c..cd9d32f 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,19 +1,34 @@ -import axios from '@/utils/request' +import axios from '@/utils/request' +import axiosNoAuth from '@/utils/requestNoAuth' import { getToken, setToken, removeToken,getCacheUserInfo,setCacheUserInfo,removeCacheUserInfo} from '@/utils/auth' -import config from '@/common/config' +import config from '@/api/mdp_pub/mdp_config' -let base=config.getOauth2LoginBasePath(); +let base=config.getOauth2LoginContext(); //let base=''; -export function doLoginByUserloginid(userloginid, password,grantType,authType,deptid) { - removeToken(); +export function doLoginByUserloginid(userloginid, password,grantType,authType,deptid,userid) { + const data = { + userloginid: userloginid, + password: password, + authType:authType, + deptid:deptid, + userid:userid, + } + return axiosNoAuth({ + url: base+'/login/token?grantType='+grantType, + method: 'post', + data + }) +} +export function switchUser(userloginid, password,grantType,authType,deptid,userid) { const data = { userloginid: userloginid, password: password, authType:authType, - deptid:deptid + deptid:deptid, + userid:userid, } return axios({ url: base+'/login/token?grantType='+grantType, @@ -21,40 +36,64 @@ export function doLoginByUserloginid(userloginid, password,grantType,authType,de data }) } -export function checkUserid(userid ) { - removeToken(); +export function setDefLogin(userid,defLogin) { const data = { - userid: userid + userid: userid, + defLogin:defLogin } return axios({ + url: base+'/user/setDefLogin', + method: 'post', + data + }) +} +export function checkUserid(userid ) { + const data = { + userid: userid + } + return axiosNoAuth({ url: base+'/user/check/userid', method: 'post', data }) } -export function checkDisplayUserid(displayUserid ) { - removeToken(); +export function checkDisplayUserid(displayUserid ) { const data = { displayUserid: displayUserid } - return axios({ + return axiosNoAuth({ url: base+'/user/check/displayUserid', method: 'post', data }) } -export function checkPhoneno(phoneno ) { - removeToken(); +export function updatePhoneno(params ) { + const data = params + return axios({ + url: base+'/user/update/phoneno', + method: 'post', + data + }) +} +export function checkPhoneno(phoneno ) { const data = { phoneno: phoneno } - return axios({ + return axiosNoAuth({ url: base+'/user/check/phoneno', method: 'post', data }) } +export function queryByUserloginid( params ) { + return axiosNoAuth({ + url: base+'/user/queryByUserloginid', + method: 'get', + params:params + }) +} + export function doRegister( userInfo ) { removeToken(); const data = { @@ -64,7 +103,8 @@ export function doRegister( userInfo ) { password:userInfo.password, phoneno:userInfo.phoneno, smsCode:userInfo.smsCode, - deptid:userInfo.deptid + deptid:userInfo.deptid, + branchId:userInfo.branchId } return axios({ url: base+'/user/register', @@ -74,11 +114,11 @@ export function doRegister( userInfo ) { } export function resetPasswordByPhoneno( userInfo ) { - removeToken(); - const data = { + const data = { newPassword:userInfo.newPassword, phoneno:userInfo.phoneno, smsCode:userInfo.smsCode, + userid:userInfo.userid } return axios({ url: base+'/user/password/reset?type=sms', @@ -109,3 +149,53 @@ export function getUserInfo(params) { data }) } + +/** + * 发送邮件 + */ + +export function sendEmail(params) { + const data=params; + return axiosNoAuth({ + url: base+'/user/sendEmail', + method: 'post', + data + }) +} +/** + * 验证邮箱 + */ + +export function validEmailCode(params) { + return axios({ + url: base+'/user/validEmailCode', + method: 'get', + params:params + }) +} + + +/** + * 获取第三方登录需要state参数,防止crfs攻击 + * @param + * @returns + */ +export function getTpaState( ) { + return axiosNoAuth({ + url: '/tpa/login/wechat/wxpub/state', + method: 'post', + data:{} + }) +} + +/** + * 获取查询当前登录账户的所有关联账户 + * @returns + */ + export function queryMyUsers( ) { + return axios({ + url: base+'/user/queryMyUsers', + method: 'get' + }) +} + diff --git a/src/api/login/user.js b/src/api/login/user.js deleted file mode 100644 index 7cce958..0000000 --- a/src/api/login/user.js +++ /dev/null @@ -1,11 +0,0 @@ -import axios from 'axios'; - -import config from '../../common/config.js'; - -let base = "/"+config.getContextName(); - -//没用到的api请注释掉 - -export const userLogin = params => { return axios.post(`${base}/common/login`, params) }; - -export const userReg = params => { return axios.post(`${base}/common/user/reg/web`, params) }; diff --git a/src/api/mdp/arc/archive.js b/src/api/mdp/arc/archive.js deleted file mode 100644 index adcc383..0000000 --- a/src/api/mdp/arc/archive.js +++ /dev/null @@ -1,46 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getArcBasePath(); - -/** - * 档案信息表 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',tagNames:'标签名多个,分割',deptid:'创建部门',userid:'创建人',isShare:'是否共享',url:'访问路径',archiveAbstract:'摘要',archiveContext:'内容',archiveTitle:'标题',archivingUserid:'归档人',isFromArchiving:'是否来自归档',archivingDate:'归档日期',createDate:'创建日期',authorUserid:'作者编号',authorName:'作者名称',canDel:'是否可删除',canEdit:'是否可修改',canRead:'是否可读',bizKey:'业务编号',encryptType:'加密方式0不加密1私钥2公钥',canComment:'开放评论',status:'0草稿1发布2取消发布',isStorageDir:'是否存到硬盘',branchId:'机构编号'} - **/ - -//普通查询 条件之间and关系 -export const listArchive = params => { return axios.get(`${base}/mdp/arc/archive/list`, { params: params }); }; - -export const getOneArchive = params => { return axios.get(`${base}/mdp/arc/archive/one`, { params: params }); }; - -//模糊查询档案信息表 条件之间or关系 -//export const listArchiveKey = params => { return axios.get(`${base}/mdp/arc/archive/listKey`, { params: params }); }; - -//删除一条档案信息表 params={id:'主键 主键'} -export const delArchive = params => { return axios.post(`${base}/mdp/arc/archive/del`,params); }; - -//批量删除档案信息表 params=[{id:'主键 主键'}] -export const batchDelArchive = params => { return axios.post(`${base}/mdp/arc/archive/batchDel`, params); }; - -//修改一条档案信息表记录 -export const editArchive = params => { return axios.post(`${base}/mdp/arc/archive/edit`, params); }; - -//新增一条档案信息表 -export const addArchive = params => { return axios.post(`${base}/mdp/arc/archive/add`, params); }; - -//打开评论 -export const openComment = params => { return axios.post(`${base}/mdp/arc/archive/comment/open`, params); }; - -//关闭评论 -export const closeComment = params => { return axios.post(`${base}/mdp/arc/archive/comment/close`, params); }; - -//发布 -export const publish = params => { return axios.post(`${base}/mdp/arc/archive/publish`, params); }; - -//取消发布 -export const unPublish = params => { return axios.post(`${base}/mdp/arc/archive/unpublish`, params); }; - -//新增一个 -export const addWorkflowArchive = params => { return axios.post(`${base}/mdp/arc/archive/add/workflow`, params); }; \ No newline at end of file diff --git a/src/api/mdp/arc/archiveAttachment.js b/src/api/mdp/arc/archiveAttachment.js deleted file mode 100644 index 89b17db..0000000 --- a/src/api/mdp/arc/archiveAttachment.js +++ /dev/null @@ -1,26 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getArcBasePath(); - -//普通查询 -export const listArchiveAttachment = params => { return axios.get(`${base}/mdp/arc/file/list`, { params: params }); }; - -//将base64的图片数据保存为png图片附件 -export const uploadBase64ArchiveAttachment = params => { return axios.post(`${base}/mdp/arc/file/upload/base64`, params); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listArchiveAttachmentKey = params => { return axios.get(`${base}/mdp/arc/file/listKey`, { params: params }); }; - -//删除一个 -export const delArchiveAttachment = params => { return axios.post(`${base}/mdp/arc/file/del`,params); }; - -//批量删除 -export const batchDelArchiveAttachment = params => { return axios.post(`${base}/mdp/arc/file/batchDel`, params); }; - -//修改一个 -export const editArchiveAttachment = params => { return axios.post(`${base}/mdp/arc/file/edit`, params); }; - -//新增一个 -export const addArchiveAttachment = params => { return axios.post(`${base}/mdp/arc/file/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/arc/category.js b/src/api/mdp/arc/category.js deleted file mode 100644 index ebf0f84..0000000 --- a/src/api/mdp/arc/category.js +++ /dev/null @@ -1,28 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getArcBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listCategory = params => { return axios.get(`${base}/mdp/arc/category/list`, { params: params }); }; - -//普通查询 -export const listTreeCategory = params => { return axios.get(`${base}/mdp/arc/category/list/tree`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listCategoryKey = params => { return axios.get(`${base}/mdp/arc/category/listKey`, { params: params }); }; - -//删除一个 -export const delCategory = params => { return axios.post(`${base}/mdp/arc/category/del`,params); }; - -//批量删除 -export const batchDelCategory = params => { return axios.post(`${base}/mdp/arc/category/batchDel`, params); }; - -//修改一个 -export const editCategory = params => { return axios.post(`${base}/mdp/arc/category/edit`, params); }; - -//新增一个 -export const addCategory = params => { return axios.post(`${base}/mdp/arc/category/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/arc/image.js b/src/api/mdp/arc/image.js deleted file mode 100644 index 480a082..0000000 --- a/src/api/mdp/arc/image.js +++ /dev/null @@ -1,34 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getArcBasePath(); - -/** - * 图片素材库 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',name:'附件名称',url:'访问路径',relativePath:'硬盘存放路径',fileSuffix:'后缀名',rootPath:'根目录',createDate:'存入时间',fileSize:'文件大小',deptid:'归属部门',tag:'标签',remark:'备注信息',categoryId:'图片分类',storageName:'硬盘存储名字(不带后缀)',urlPrefix:'链接前缀',isOutUrl:'是否外部链接',outUrl:'外部链接',branchId:'机构编号'} - **/ - -//普通查询 条件之间and关系 -export const listImage = params => { return axios.get(`${base}/mdp/arc/image/list`, { params: params }); }; - -//模糊查询图片素材库 条件之间or关系 -//export const listImageKey = params => { return axios.get(`${base}/mdp/arc/image/listKey`, { params: params }); }; - -//删除一条图片素材库 params={id:'主键 主键'} -export const delImage = params => { return axios.post(`${base}/mdp/arc/image/del`,params); }; - -//批量删除图片素材库 params=[{id:'主键 主键'}] -export const batchDelImage = params => { return axios.post(`${base}/mdp/arc/image/batchDel`, params); }; - -//修改一条图片素材库记录 -export const editImage = params => { return axios.post(`${base}/mdp/arc/image/edit`, params); }; - -//新增一条图片素材库 -export const addImage = params => { return axios.post(`${base}/mdp/arc/image/add`, params); }; - -//获取图片分类名 -export const listTags = params => { return axios.get(`${base}/mdp/arc/image/listTags`, params); }; - -export const uploadBase64 = params => { return axios.post(`${base}/mdp/arc/image/upload/base64`, params); }; \ No newline at end of file diff --git a/src/api/mdp/arc/imageCategory.js b/src/api/mdp/arc/imageCategory.js deleted file mode 100644 index 0ba7274..0000000 --- a/src/api/mdp/arc/imageCategory.js +++ /dev/null @@ -1,32 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getArcBasePath(); - -/** - * 图片分类 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',categoryName:'分类名称',branchId:'机构编号'} - **/ - -//普通查询 条件之间and关系 -export const listImageCategory = params => { return axios.get(`${base}/mdp/arc/imageCategory/list`, { params: params }); }; - -//模糊查询图片分类 条件之间or关系 -//export const listImageCategoryKey = params => { return axios.get(`${base}/mdp/arc/imageCategory/listKey`, { params: params }); }; - -//删除一条图片分类 params={id:'主键 主键'} -export const delImageCategory = params => { return axios.post(`${base}/mdp/arc/imageCategory/del`,params); }; - -//批量删除图片分类 params=[{id:'主键 主键'}] -export const batchDelImageCategory = params => { return axios.post(`${base}/mdp/arc/imageCategory/batchDel`, params); }; - -//修改一条图片分类记录 -export const editImageCategory = params => { return axios.post(`${base}/mdp/arc/imageCategory/edit`, params); }; - -//新增一条图片分类 -export const addImageCategory = params => { return axios.post(`${base}/mdp/arc/imageCategory/add`, params); }; - -//查分类树 -export const getImageCategoryTrees = params => { return axios.get(`${base}/mdp/arc/imageCategory/list/trees`, { params: params }); }; \ No newline at end of file diff --git a/src/api/mdp/arc/tag.js b/src/api/mdp/arc/tag.js deleted file mode 100644 index ad27833..0000000 --- a/src/api/mdp/arc/tag.js +++ /dev/null @@ -1,36 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getArcBasePath(); - - -/** - * arc_tag - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'标签编号 主键',tagName:'标签名',branchId:'机构号',shopId:'商户编号',categoryId:'标签分组'} - **/ - -//普通查询 条件之间and关系 -export const listTag = params => { return axios.get(`${base}/mdp/arc/tag/list`, { params: params }); }; - -//模糊查询arc_tag 条件之间or关系 -//export const listTagKey = params => { return axios.get(`${base}/mdp/arc/tag/listKey`, { params: params }); }; - -//删除一条arc_tag params={id:'标签编号 主键'} -export const delTag = params => { return axios.post(`${base}/mdp/arc/tag/del`,params); }; - -//批量删除arc_tag params=[{id:'标签编号 主键'}] -export const batchDelTag = params => { return axios.post(`${base}/mdp/arc/tag/batchDel`, params); }; - -//修改一条arc_tag记录 -export const editTag = params => { return axios.post(`${base}/mdp/arc/tag/edit`, params); }; - -//新增一条arc_tag -export const addTag = params => { return axios.post(`${base}/mdp/arc/tag/add`, params); }; - - -export const getAllTag = params => { return axios.get(`${base}/mdp/arc/tag/getAllTag`, { params: params }); }; - -//新增一条arc_tag -export const deleteTagCategory= params => { return axios.post(`${base}/mdp/arc/tag/deleteTagCategory`, params); }; \ No newline at end of file diff --git a/src/api/mdp/arc/tagCategory.js b/src/api/mdp/arc/tagCategory.js deleted file mode 100644 index d7b7127..0000000 --- a/src/api/mdp/arc/tagCategory.js +++ /dev/null @@ -1,30 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getArcBasePath(); - - -/** - * arc_tag_category - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'分组编号 主键',branchId:'机构号',shopId:'商户编号',categoryName:'分组名称'} - **/ - -//普通查询 条件之间and关系 -export const listTagCategory = params => { return axios.get(`${base}/mdp/arc/tagCategory/list`, { params: params }); }; - -//模糊查询arc_tag_category 条件之间or关系 -//export const listTagCategoryKey = params => { return axios.get(`${base}/mdp/arc/tagCategory/listKey`, { params: params }); }; - -//删除一条arc_tag_category params={id:'分组编号 主键'} -export const delTagCategory = params => { return axios.post(`${base}/mdp/arc/tagCategory/del`,params); }; - -//批量删除arc_tag_category params=[{id:'分组编号 主键'}] -export const batchDelTagCategory = params => { return axios.post(`${base}/mdp/arc/tagCategory/batchDel`, params); }; - -//修改一条arc_tag_category记录 -export const editTagCategory = params => { return axios.post(`${base}/mdp/arc/tagCategory/edit`, params); }; - -//新增一条arc_tag_category -export const addTagCategory = params => { return axios.post(`${base}/mdp/arc/tagCategory/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/attendance/attendace.js b/src/api/mdp/attendance/attendace.js deleted file mode 100644 index 47bcf3a..0000000 --- a/src/api/mdp/attendance/attendace.js +++ /dev/null @@ -1,11 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -const base = config.getOaBasePath() - -export const listAttendanceMonth = params => { - return axios.get(`${base}/kq/attendance/monthRecord`, - { params: params }) -} - diff --git a/src/api/mdp/form/formData.js b/src/api/mdp/form/formData.js index 18e8891..0a5dc82 100644 --- a/src/api/mdp/form/formData.js +++ b/src/api/mdp/form/formData.js @@ -1,25 +1,28 @@ import axios from '@/utils/request' -import config from '@/common/config' - -let base = config.getFormBasePath(); + import config from '@/api/mdp_pub/mdp_config' +let base = config.getFormContext(); +/**-------------------------与后端通讯接口------------------请写在下面-------------------------------------------- */ /** * 表单数据表 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',two:'属性二',three:'属性三',four:'属性四',five:'属性五',six:'属性六',seven:'属性七',eight:'属性八',nine:'属性九',ten:'属性十',lastTime:'最后更新日期',one:'属性一',zero:'属性零',remark:'备注',formId:'表单编号',userid:'最后更新人',eleven:'字段十一',twelve:'字段十二',thirteen:'字段十三',fourteen:'字段十四',fifteen:'字段十五',attachmentUrls:'附件url多个',attachmentNames:'附件名称多个',branchId:'机构编号',bizKey:'唯一确定该业务的主键',deptid:'创建部门'} + *1 默认只开放普通查询,所有查询,只要上传 分页参数 {pageNum:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, + *2 查询、新增、修改的参数格式 params={id:'主键 主键',two:'属性二',three:'属性三',four:'属性四',five:'属性五',six:'属性六',seven:'属性七',eight:'属性八',nine:'属性九',ten:'属性十',lastTime:'最后更新日期',one:'属性一',zero:'属性零',remark:'备注',formId:'表单编号',userid:'最后更新人',eleven:'字段十一',twelve:'字段十二',thirteen:'字段十三',fourteen:'字段十四',fifteen:'字段十五',attachmentUrls:'附件url多个',attachmentNames:'附件名称多个',branchId:'机构编号',bizKey:'唯一确定该业务的主键竖线分隔多个,如果是联合组件的话',deptid:'创建部门',flowState:'0初始1审批中2结束审批',createTime:'创建时间',dqxCode:'数据权限码',cuserid:'创建人编号',tagIds:'标签编号列表逗号分割',tagNames:'标签名列表逗号分割',cusername:'创建人姓名',deptName:'创建部门'} **/ //普通查询 条件之间and关系 export const listFormData = params => { return axios.get(`${base}/mdp/form/formData/list`, { params: params }); }; -//模糊查询表单数据表 条件之间or关系 -//export const listFormDataKey = params => { return axios.get(`${base}/mdp/form/formData/listKey`, { params: params }); }; +//普通查询 条件之间and关系 +export const queryFormDataById = params => { return axios.get(`${base}/mdp/form/formData/queryById`, { params: params }); }; //删除一条表单数据表 params={id:'主键 主键'} export const delFormData = params => { return axios.post(`${base}/mdp/form/formData/del`,params); }; +//批量删除表单数据表 params=[{id:'主键 主键'}] +export const batchAddFormData = params => { return axios.post(`${base}/mdp/form/formData/batchAdd`, params); }; + //批量删除表单数据表 params=[{id:'主键 主键'}] export const batchDelFormData = params => { return axios.post(`${base}/mdp/form/formData/batchDel`, params); }; @@ -27,4 +30,7 @@ export const batchDelFormData = params => { return axios.post(`${base}/mdp/form/ export const editFormData = params => { return axios.post(`${base}/mdp/form/formData/edit`, params); }; //新增一条表单数据表 -export const addFormData = params => { return axios.post(`${base}/mdp/form/formData/add`, params); }; \ No newline at end of file +export const addFormData = params => { return axios.post(`${base}/mdp/form/formData/add`, params); }; + +//批量修改某些字段 +export const editSomeFieldsFormData = params => { return axios.post(`${base}/mdp/form/formData/editSomeFields`, params); }; \ No newline at end of file diff --git a/src/api/mdp/form/formDataTag.js b/src/api/mdp/form/formDataTag.js index b7ed22f..676b4b2 100644 --- a/src/api/mdp/form/formDataTag.js +++ b/src/api/mdp/form/formDataTag.js @@ -1,8 +1,8 @@ import axios from '@/utils/request' -import config from '@/common/config' +import config from '@/api/mdp_pub/mdp_config' -let base = config.getFormBasePath(); +let base = config.getFormContext(); /** diff --git a/src/api/mdp/form/formDef.js b/src/api/mdp/form/formDef.js index ba1f655..fa1098f 100644 --- a/src/api/mdp/form/formDef.js +++ b/src/api/mdp/form/formDef.js @@ -1,36 +1,42 @@ import axios from '@/utils/request' -import config from '@/common/config' - -let base = config.getFormBasePath(); + import config from '@/api/mdp_pub/mdp_config' +let base = config.getFormContext(); +/**-------------------------与后端通讯接口------------------请写在下面-------------------------------------------- */ /** * 表单定义 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',tableName:'表名',tableOwner:'表名拥有者',isCreateTable:'是否已经创建库表',formName:'表单名称',userid:'创建人',deptid:'创建部门',formType:'表单类型',isTemplate:'是否为模板',bizType:'业务分类',ctime:'创建日期',branchId:'机构编号'} + *1 默认只开放普通查询,所有查询,只要上传 分页参数 {pageNum:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, + *2 查询、新增、修改的参数格式 params={id:'主键 主键',tableName:'表名',tableOwner:'表名拥有者',isCreateTable:'是否已经创建库表',formName:'表单名称',userid:'创建人',deptid:'创建部门',formType:'表单类型',isTemplate:'是否为模板',bizType:'业务分类',ctime:'创建日期',branchId:'机构编号',categoryId:'分类编号',tagIds:'标签编号列表',tagNames:'标签名字列表',username:'创建人姓名',deptName:'创建部门',groupsJson:'表单元素分组',pks:'主键列表,逗号分割'} **/ //普通查询 条件之间and关系 export const listFormDef = params => { return axios.get(`${base}/mdp/form/formDef/list`, { params: params }); }; -//模糊查询表单定义 条件之间or关系 -//export const listFormDefKey = params => { return axios.get(`${base}/mdp/form/formDef/listKey`, { params: params }); }; +//普通查询 条件之间and关系 +export const queryFormDefById = params => { return axios.get(`${base}/mdp/form/formDef/queryById`, { params: params }); }; //删除一条表单定义 params={id:'主键 主键'} export const delFormDef = params => { return axios.post(`${base}/mdp/form/formDef/del`,params); }; +//批量删除表单定义 params=[{id:'主键 主键'}] +export const batchAddFormDef = params => { return axios.post(`${base}/mdp/form/formDef/batchAdd`, params); }; + //批量删除表单定义 params=[{id:'主键 主键'}] export const batchDelFormDef = params => { return axios.post(`${base}/mdp/form/formDef/batchDel`, params); }; //修改一条表单定义记录 export const editFormDef = params => { return axios.post(`${base}/mdp/form/formDef/edit`, params); }; -//新增一个 +//新增一条表单定义 export const addFormDef = params => { return axios.post(`${base}/mdp/form/formDef/add`, params); }; //新增一个及其属性多个 {formDef:{formName:'',formId:''},formFields:[{fieldId:'',fieldTitle:''},{fieldId:'',fieldTitle:''}]} export const addFormDefAndFields = params => { return axios.post(`${base}/mdp/form/formDef/addFormDefAndFields`, params); }; //新增一个及其属性多个 {formDef:{formName:'',formId:''},formFields:[{fieldId:'',fieldTitle:''},{fieldId:'',fieldTitle:''}]} -export const editFormDefAndFields = params => { return axios.post(`${base}/mdp/form/formDef/editFormDefAndFields`, params); }; \ No newline at end of file +export const editFormDefAndFields = params => { return axios.post(`${base}/mdp/form/formDef/editFormDefAndFields`, params); }; + +//批量修改某些字段 +export const editSomeFieldsFormDef= params => { return axios.post(`${base}/mdp/form/formDef/editSomeFields`, params); }; \ No newline at end of file diff --git a/src/api/mdp/form/formDefTag.js b/src/api/mdp/form/formDefTag.js index 77c105c..258743b 100644 --- a/src/api/mdp/form/formDefTag.js +++ b/src/api/mdp/form/formDefTag.js @@ -1,8 +1,8 @@ import axios from '@/utils/request' -import config from '@/common/config' +import config from '@/api/mdp_pub/mdp_config' -let base = config.getFormBasePath(); +let base = config.getFormContext(); /** diff --git a/src/api/mdp/form/formField.js b/src/api/mdp/form/formField.js index 8796f73..e57ffef 100644 --- a/src/api/mdp/form/formField.js +++ b/src/api/mdp/form/formField.js @@ -1,8 +1,8 @@ import axios from '@/utils/request' -import config from '@/common/config' +import config from '@/api/mdp_pub/mdp_config' -let base = config.getFormBasePath(); +let base = config.getFormContext(); /** diff --git a/src/api/mdp/form/formQx.js b/src/api/mdp/form/formQx.js index 0f3bfb1..68d0d8e 100644 --- a/src/api/mdp/form/formQx.js +++ b/src/api/mdp/form/formQx.js @@ -1,25 +1,28 @@ import axios from '@/utils/request' -import config from '@/common/config' - -let base = config.getFormBasePath(); + import config from '@/api/mdp_pub/mdp_config' +let base = config.getFormContext(); +/**-------------------------与后端通讯接口------------------请写在下面-------------------------------------------- */ /** * 表单权限 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={formId:'表单编号 主键',allowQueryRoleids:'允许那些角色查询,号分割',allowQueryDeptids:'允许那些部门查询,号分割',allowQueryUserids:'允许哪些人查询,号分割',notQueryRoleids:'禁止哪些角色查询',notQueryDeptids:'禁止哪些部门查询',notQueryUserids:'禁止哪些人查询',allowOtherQuery:'是否允许其它人查询',allowOtherEdit:'是否允许其它人修改',allowOtherDel:'是否允许其它人删除',doDeptLvlCheck:'是否进行部门级别传递权限检查',deptLvlQx:'部门级别权限'} + *1 默认只开放普通查询,所有查询,只要上传 分页参数 {pageNum:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, + *2 查询、新增、修改的参数格式 params={formId:'表单编号 主键',qryRoleids:'允许那些角色查询,号分割',qryDeptids:'允许那些部门查询,号分割',qryUserids:'允许哪些人查询,号分割',nqRoleids:'禁止哪些角色查询',nqDeptids:'禁止哪些部门查询',nqUserids:'禁止哪些人查询',othQuery:'是否允许其它人查询',othEdit:'是否允许其它人修改',othDel:'是否允许其它人删除',lvlCheck:'是否进行部门级别传递权限检查',qryMinLvl:'最低级别查询权限',editRoleids:'允许那些角色更新,号分割',editDeptids:'允许那些部门更新,号分割',editUserids:'允许哪些人更新号分割',neRoleids:'禁止哪些角色更新',neDeptids:'禁止哪些部门更新',neUserids:'禁止哪些人更新',delRoleids:'允许那些角色删除,号分割',delDeptids:'允许那些部门删除,号分割',delUserids:'允许哪些人删除,号分割',ndRoleids:'禁止哪些角色删除',ndDeptids:'禁止哪些部门删除',ndUserids:'禁止哪些人查询',editMinLvl:'最低级别更新权限',delMinLvl:'最低级别删除权限'} **/ //普通查询 条件之间and关系 export const listFormQx = params => { return axios.get(`${base}/mdp/form/formQx/list`, { params: params }); }; -//模糊查询表单权限 条件之间or关系 -//export const listFormQxKey = params => { return axios.get(`${base}/mdp/form/formQx/listKey`, { params: params }); }; +//普通查询 条件之间and关系 +export const queryFormQxById = params => { return axios.get(`${base}/mdp/form/formQx/queryById`, { params: params }); }; //删除一条表单权限 params={formId:'表单编号 主键'} export const delFormQx = params => { return axios.post(`${base}/mdp/form/formQx/del`,params); }; +//批量删除表单权限 params=[{formId:'表单编号 主键'}] +export const batchAddFormQx = params => { return axios.post(`${base}/mdp/form/formQx/batchAdd`, params); }; + //批量删除表单权限 params=[{formId:'表单编号 主键'}] export const batchDelFormQx = params => { return axios.post(`${base}/mdp/form/formQx/batchDel`, params); }; @@ -27,4 +30,7 @@ export const batchDelFormQx = params => { return axios.post(`${base}/mdp/form/fo export const editFormQx = params => { return axios.post(`${base}/mdp/form/formQx/edit`, params); }; //新增一条表单权限 -export const addFormQx = params => { return axios.post(`${base}/mdp/form/formQx/add`, params); }; \ No newline at end of file +export const addFormQx = params => { return axios.post(`${base}/mdp/form/formQx/add`, params); }; + +//批量修改某些字段 +export const editSomeFieldsFormQx = params => { return axios.post(`${base}/mdp/form/formQx/editSomeFields`, params); }; \ No newline at end of file diff --git a/src/api/mdp/form/formView.js b/src/api/mdp/form/formView.js index 7f8e966..67014a3 100644 --- a/src/api/mdp/form/formView.js +++ b/src/api/mdp/form/formView.js @@ -1,8 +1,8 @@ import axios from '@/utils/request' -import config from '@/common/config' +import config from '@/api/mdp_pub/mdp_config' -let base=config.getFormBasePath(); +let base=config.getFormContext(); //默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, diff --git a/src/api/mdp/mallm/shop/shop.js b/src/api/mdp/mallm/shop/shop.js deleted file mode 100644 index f67c820..0000000 --- a/src/api/mdp/mallm/shop/shop.js +++ /dev/null @@ -1,9 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -//普通查询 条件之间and关系 -export const createShopApi = params => { return axios.post(`${base}/mdp/mallm/shop/shop/createShop`, params); }; - diff --git a/src/api/mdp/mallm/shop/shopLocation.js b/src/api/mdp/mallm/shop/shopLocation.js deleted file mode 100644 index 4998060..0000000 --- a/src/api/mdp/mallm/shop/shopLocation.js +++ /dev/null @@ -1,9 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -//普通查询 条件之间and关系 -export const selectshopLocationBySysDeptIdApi = params => { return axios.post(`${base}/mdp/mallm/shop/shopLocation/selectshopLocationBySysDeptId`, params); }; - diff --git a/src/api/mdp/meta/category.js b/src/api/mdp/meta/category.js deleted file mode 100644 index 5f0b265..0000000 --- a/src/api/mdp/meta/category.js +++ /dev/null @@ -1,29 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 元数据分类 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'分类编号 主键',categoryName:'分类名称',isShow:'是否显示0否1是',remark:'备注',branchId:'机构编号'} - **/ - -//普通查询 条件之间and关系 -export const listCategory = params => { return axios.get(`${base}/mdp/meta/category/list`, { params: params }); }; - -//模糊查询元数据分类 条件之间or关系 -//export const listCategoryKey = params => { return axios.get(`${base}/mdp/meta/category/listKey`, { params: params }); }; - -//删除一条元数据分类 params={id:'分类编号 主键'} -export const delCategory = params => { return axios.post(`${base}/mdp/meta/category/del`,params); }; - -//批量删除元数据分类 params=[{id:'分类编号 主键'}] -export const batchDelCategory = params => { return axios.post(`${base}/mdp/meta/category/batchDel`, params); }; - -//修改一条元数据分类记录 -export const editCategory = params => { return axios.post(`${base}/mdp/meta/category/edit`, params); }; - -//新增一条元数据分类 -export const addCategory = params => { return axios.post(`${base}/mdp/meta/category/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/meta/item.js b/src/api/mdp/meta/item.js deleted file mode 100644 index c4d6473..0000000 --- a/src/api/mdp/meta/item.js +++ /dev/null @@ -1,29 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 数据项定义 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',itemCode:'代码',itemName:'名称',remark:'备注',categoryId:'分类编号',itemSize:'长度',itemType:'类型',branchId:'机构编号',deptid:'部门编号'} - **/ - -//普通查询 条件之间and关系 -export const listItem = params => { return axios.get(`${base}/mdp/meta/item/list`, { params: params }); }; - -//模糊查询数据项定义 条件之间or关系 -//export const listItemKey = params => { return axios.get(`${base}/mdp/meta/item/listKey`, { params: params }); }; - -//删除一条数据项定义 params={id:'主键 主键'} -export const delItem = params => { return axios.post(`${base}/mdp/meta/item/del`,params); }; - -//批量删除数据项定义 params=[{id:'主键 主键'}] -export const batchDelItem = params => { return axios.post(`${base}/mdp/meta/item/batchDel`, params); }; - -//修改一条数据项定义记录 -export const editItem = params => { return axios.post(`${base}/mdp/meta/item/edit`, params); }; - -//新增一条数据项定义 -export const addItem = params => { return axios.post(`${base}/mdp/meta/item/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/meta/itemOption.js b/src/api/mdp/meta/itemOption.js deleted file mode 100644 index 3bd6a82..0000000 --- a/src/api/mdp/meta/itemOption.js +++ /dev/null @@ -1,38 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 数据项取值列表 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',itemId:'数据项编号',optionValue:'选项值',optionName:'选项名称',keys:'快捷键',isShow:'是否显示',seqOrder:'顺序',fp:'第一扩展字段',tp:'第三扩展字段',sp:'第二扩展字段',isDefault:'是否默认',cdate:'创建日期',branchId:'机构编号',deptid:'部门编号'} - **/ - -//普通查询 条件之间and关系 -export const listItemOption = params => { return axios.get(`${base}/mdp/meta/itemOption/list`, { params: params }); }; - -//普通查询 条件之间and关系 params=[{categoryId:'0001',itemCode:'sex'}] 返回结果 {'sex':[{optionValue:'1',optionName:'男',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'女',seqOrder:'2',fp:'',isDefault:'0'}]} -export const listOption = params => { return axios.post(`${base}/mdp/meta/itemOption/list/byItemCode`, params ); }; - -//params={id:''} 返回 {optionValue:'1',optionName:'男',seqOrder:'1',fp:'',isDefault:'0'} -export const getSysParam = params => { return axios.post(`${base}/mdp/meta/itemOption/sysParam`, params ); }; -//模糊查询数据项取值列表 条件之间or关系 -//export const listItemOptionKey = params => { return axios.get(`${base}/mdp/meta/itemOption/listKey`, { params: params }); }; - -//删除一条数据项取值列表 params={id:'主键 主键'} -export const delItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/del`,params); }; - -//批量删除数据项取值列表 params=[{id:'主键 主键'}] -export const batchDelItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/batchDel`, params); }; - -//修改一条数据项取值列表记录 -export const editItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/edit`, params); }; - -//新增一条数据项取值列表 -export const addItemOption = params => { return axios.post(`${base}/mdp/meta/itemOption/add`, params); }; - - -//刷新缓存 -export const refresh = params => { return axios.post(`${base}/mdp/meta/itemOption/refresh`, params); }; diff --git a/src/api/mdp/sms/smsSign.js b/src/api/mdp/sms/smsSign.js index 9691f8b..e773876 100644 --- a/src/api/mdp/sms/smsSign.js +++ b/src/api/mdp/sms/smsSign.js @@ -1,8 +1,8 @@ import axios from '@/utils/request' -import config from '@/common/config' +import config from '@/api/mdp_pub/mdp_config' -let base = config.getSmsBasePath(); +let base = config.getSmsContext(); /** diff --git a/src/api/mdp/sms/smsTemplate.js b/src/api/mdp/sms/smsTemplate.js index 380a603..ec21494 100644 --- a/src/api/mdp/sms/smsTemplate.js +++ b/src/api/mdp/sms/smsTemplate.js @@ -1,8 +1,8 @@ import axios from '@/utils/request' -import config from '@/common/config' +import config from '@/api/mdp_pub/mdp_config' -let base = config.getSmsBasePath(); +let base = config.getSmsContext(); /** diff --git a/src/api/mdp/sys/branch.js b/src/api/mdp/sys/branch.js deleted file mode 100644 index 73c3744..0000000 --- a/src/api/mdp/sys/branch.js +++ /dev/null @@ -1,29 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 管理端机构表(机构下面若干部门) - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'机构编号 主键',branchName:'机构名称',enabled:'是否可用',industryCategory:'行业分类',cuserid:'创建人编号',cdate:'创建日期',cusername:'创建人姓名',phoneNo:'联系电话',emaill:'邮件'} - **/ - -//普通查询 条件之间and关系 -export const listBranch = params => { return axios.get(`${base}/mdp/sys/branch/list`, { params: params }); }; - -//模糊查询管理端机构表(机构下面若干部门) 条件之间or关系 -//export const listBranchKey = params => { return axios.get(`${base}/mdp/sys/branch/listKey`, { params: params }); }; - -//删除一条管理端机构表(机构下面若干部门) params={id:'机构编号 主键'} -export const delBranch = params => { return axios.post(`${base}/mdp/sys/branch/del`,params); }; - -//批量删除管理端机构表(机构下面若干部门) params=[{id:'机构编号 主键'}] -export const batchDelBranch = params => { return axios.post(`${base}/mdp/sys/branch/batchDel`, params); }; - -//修改一条管理端机构表(机构下面若干部门)记录 -export const editBranch = params => { return axios.post(`${base}/mdp/sys/branch/edit`, params); }; - -//新增一条管理端机构表(机构下面若干部门) -export const addBranch = params => { return axios.post(`${base}/mdp/sys/branch/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/code.js b/src/api/mdp/sys/code.js deleted file mode 100644 index 2f59b4e..0000000 --- a/src/api/mdp/sys/code.js +++ /dev/null @@ -1,39 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listCode = params => { return axios.get(`${base}/sys/code/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -export const listCodeKey = params => { return axios.get(`${base}/sys/code/listKey`, { params: params }); }; - -//删除一个 -export const delCode = params => { return axios.post(`${base}/sys/code/del`,params); }; - -//批量删除 -export const batchDelCode = params => { return axios.post(`${base}/sys/code/batchDel`, params); }; - -//修改一个 -export const editCode = params => { return axios.post(`${base}/sys/code/edit`, params); }; - -//新增一个 -export const addCode = params => { return axios.post(`${base}/sys/code/add`, params); }; - -//查询下拉选项目 参数为数组型参数 如 selectOptions( { fieldNames:['sex','age','student'],code:'all' } ),code为数据分类 -export const selectOptions = params => { return axios.get(`${base}/sys/code/selectOptions`, { params:params }); }; - -/** -* 根据一级分类列表查询所有的二级分类 -* @param codes 分类编码 列表 如['JCBM_TPL','SystemParas'] -* @return 返回如下格式的map。secondCodeRow为主键,dtcodeId为编码,dtcodeName中文描述 -* { -* JCBM_TPL:[{secondCodeRow:'xxxx',dtcodeId:1,dtcodeName:男},{secondCodeRow:'xxxx',dtcodeid:1,dtcodeName:男}], -* SystemParas:[{secondCodeRow:'xxxx',dtcodeId:3,dtcodeName:其它},{secondCodeRow:'xxxx',dtcodeid:2,dtcodeName:其它2}] -* } -*/ -export const selectSeconds = params => { return axios.get(`${base}/sys/code/selectSeconds`, { params:params }); }; \ No newline at end of file diff --git a/src/api/mdp/sys/codeDetail.js b/src/api/mdp/sys/codeDetail.js deleted file mode 100644 index 8af2f7c..0000000 --- a/src/api/mdp/sys/codeDetail.js +++ /dev/null @@ -1,35 +0,0 @@ -import axios from 'axios'; -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listCodeDetail = params => { return axios.get(`${base}/sys/codeDetail/list`, { params: params }); }; - - - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -export const listCodeDetailKey = params => { return axios.get(`${base}/sys/codeDetail/listKey`, { params: params }); }; - -//删除一个 -export const delCodeDetail = params => { return axios.post(`${base}/sys/codeDetail/del`,params); }; - -//批量删除 -export const batchDelCodeDetail = params => { return axios.post(`${base}/sys/codeDetail/batchDel`, params); }; - -//修改一个 -export const editCodeDetail = params => { return axios.post(`${base}/sys/codeDetail/edit`, params); }; - -//新增一个 -export const addCodeDetail = params => { return axios.post(`${base}/sys/codeDetail/add`, params); }; - -export const upDownCodeDetail = params => { return axios.post(`${base}/sys/codeDetail/upDown`, params); }; - - -export const uploadFileToRemote=(request)=>{ - let formData=new FormData(); - formData.append('file',request.file); - return axios.post(request.action,formData); -} \ No newline at end of file diff --git a/src/api/mdp/sys/codeSecond.js b/src/api/mdp/sys/codeSecond.js deleted file mode 100644 index c12bd46..0000000 --- a/src/api/mdp/sys/codeSecond.js +++ /dev/null @@ -1,27 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listCodeSecond = params => { return axios.get(`${base}/sys/codeSecond/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listCodeSecondKey = params => { return axios.get(`${base}/sys/codeSecond/listKey`, { params: params }); }; - -//删除一个 -export const delCodeSecond = params => { return axios.post(`${base}/sys/codeSecond/del`,params); }; - -//批量删除 -export const batchDelCodeSecond = params => { return axios.post(`${base}/sys/codeSecond/batchDel`, params); }; - -//修改一个 -export const editCodeSecond = params => { return axios.post(`${base}/sys/codeSecond/edit`, params); }; - -//新增一个 -export const addCodeSecond = params => { return axios.post(`${base}/sys/codeSecond/add`, params); }; - - diff --git a/src/api/mdp/sys/dept.js b/src/api/mdp/sys/dept.js deleted file mode 100644 index 707bc52..0000000 --- a/src/api/mdp/sys/dept.js +++ /dev/null @@ -1,28 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listDept = params => { return axios.get(`${base}/sys/dept/list`, { params: params }); }; - -//普通查询 -export const listTreeDept = params => { return axios.get(`${base}/sys/dept/list/tree`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -export const listDeptKey = params => { return axios.get(`${base}/sys/dept/listKey`, { params: params }); }; - -//删除一个 -export const delDept = params => { return axios.post(`${base}/sys/dept/del`,params); }; - -//批量删除 -export const batchDelDept = params => { return axios.post(`${base}/sys/dept/batchDel`, params); }; - -//修改一个 -export const editDept = params => { return axios.post(`${base}/sys/dept/edit`, params); }; - -//新增一个 -export const addDept = params => { return axios.post(`${base}/sys/dept/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/deptExtinfo.js b/src/api/mdp/sys/deptExtinfo.js deleted file mode 100644 index 29981b3..0000000 --- a/src/api/mdp/sys/deptExtinfo.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listDeptExtinfo = params => { return axios.get(`${base}/sys/deptExtinfo/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listDeptExtinfoKey = params => { return axios.get(`${base}/sys/deptExtinfo/listKey`, { params: params }); }; - -//删除一个 -//export const delDeptExtinfo = params => { return axios.post(`${base}/sys/deptExtinfo/del`,params); }; - -//批量删除 -//export const batchDelDeptExtinfo = params => { return axios.post(`${base}/sys/deptExtinfo/batchDel`, params); }; - -//修改一个 -//export const editDeptExtinfo = params => { return axios.post(`${base}/sys/deptExtinfo/edit`, params); }; - -//新增一个 -//export const addDeptExtinfo = params => { return axios.post(`${base}/sys/deptExtinfo/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/deptMech.js b/src/api/mdp/sys/deptMech.js deleted file mode 100644 index 0d3c317..0000000 --- a/src/api/mdp/sys/deptMech.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listDeptMch = params => { return axios.get(`${base}/sys/deptMch/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listDeptMchKey = params => { return axios.get(`${base}/sys/deptMch/listKey`, { params: params }); }; - -//删除一个 -//export const delDeptMch = params => { return axios.post(`${base}/sys/deptMch/del`,params); }; - -//批量删除 -//export const batchDelDeptMch = params => { return axios.post(`${base}/sys/deptMch/batchDel`, params); }; - -//修改一个 -//export const editDeptMch = params => { return axios.post(`${base}/sys/deptMch/edit`, params); }; - -//新增一个 -//export const addDeptMch = params => { return axios.post(`${base}/sys/deptMch/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/operDataTrail.js b/src/api/mdp/sys/operDataTrail.js deleted file mode 100644 index d229142..0000000 --- a/src/api/mdp/sys/operDataTrail.js +++ /dev/null @@ -1,28 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listOperDataTrail = params => { return axios.get(`${base}/sys/operDataTrail/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listOperDataTrailKey = params => { return axios.get(`${base}/sys/operDataTrail/listKey`, { params: params }); }; - -//删除一个 -export const delOperDataTrail = params => { return axios.post(`${base}/sys/operDataTrail/del`,params); }; - -//批量删除 -export const batchDelOperDataTrail = params => { return axios.post(`${base}/sys/operDataTrail/batchDel`, params); }; - -//修改一个 -export const editOperDataTrail = params => { return axios.post(`${base}/sys/operDataTrail/edit`, params); }; - -//新增一个 -export const addOperDataTrail = params => { return axios.post(`${base}/sys/operDataTrail/add`, params); }; - -//修改一个 -export const operEnd = params => { return axios.post(`${base}/sys/operDataTrail/edit/end`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/post/post.js b/src/api/mdp/sys/post/post.js deleted file mode 100644 index 973abba..0000000 --- a/src/api/mdp/sys/post/post.js +++ /dev/null @@ -1,33 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getSysBasePath(); - - -/** - * sys_post - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',postName:'岗位名称',remark:'备注',branchId:'归属机构号',cdate:'创建日期'} - **/ - -//普通查询 条件之间and关系 -export const listPost = params => { return axios.get(`${base}/mdp/sys/post/post/list`, { params: params }); }; - -//查询未添加到部门的岗位 -export const listPostNotInDeptid = params => { return axios.get(`${base}/mdp/sys/post/post/list/notInDeptid`, { params: params }); }; - -//模糊查询sys_post 条件之间or关系 -//export const listPostKey = params => { return axios.get(`${base}/mdp/sys/post/post/listKey`, { params: params }); }; - -//删除一条sys_post params={id:'主键 主键'} -export const delPost = params => { return axios.post(`${base}/mdp/sys/post/post/del`,params); }; - -//批量删除sys_post params=[{id:'主键 主键'}] -export const batchDelPost = params => { return axios.post(`${base}/mdp/sys/post/post/batchDel`, params); }; - -//修改一条sys_post记录 -export const editPost = params => { return axios.post(`${base}/mdp/sys/post/post/edit`, params); }; - -//新增一条sys_post -export const addPost = params => { return axios.post(`${base}/mdp/sys/post/post/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/qx.js b/src/api/mdp/sys/qx.js deleted file mode 100644 index fd5b8ee..0000000 --- a/src/api/mdp/sys/qx.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listQx = params => { return axios.get(`${base}/sys/qx/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listQxKey = params => { return axios.get(`${base}/sys/qx/listKey`, { params: params }); }; - -//删除一个 -export const delQx = params => { return axios.post(`${base}/sys/qx/del`,params); }; - -//批量删除 -export const batchDelQx = params => { return axios.post(`${base}/sys/qx/batchDel`, params); }; - -//修改一个 -export const editQx = params => { return axios.post(`${base}/sys/qx/edit`, params); }; - -//新增一个 -export const addQx = params => { return axios.post(`${base}/sys/qx/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/role.js b/src/api/mdp/sys/role.js deleted file mode 100644 index e92f365..0000000 --- a/src/api/mdp/sys/role.js +++ /dev/null @@ -1,29 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 角色管理 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={roleid:'角色编号 主键',rolename:'角色名',remark:'备注',roletype:'角色类型',rolebeg:'开始时间',roleend:'结束时间',crdate:'创建日期',enabled:'是否启用',deptid:'机构编号',sortOrder:'角色排序',branchId:'云用户机构编号'} - **/ - -//普通查询 条件之间and关系 -export const listRole = params => { return axios.get(`${base}/mdp/sys/role/list`, { params: params }); }; - -//模糊查询角色管理 条件之间or关系 -//export const listRoleKey = params => { return axios.get(`${base}/mdp/sys/role/listKey`, { params: params }); }; - -//删除一条角色管理 params={roleid:'角色编号 主键'} -export const delRole = params => { return axios.post(`${base}/mdp/sys/role/del`,params); }; - -//批量删除角色管理 params=[{roleid:'角色编号 主键'}] -export const batchDelRole = params => { return axios.post(`${base}/mdp/sys/role/batchDel`, params); }; - -//修改一条角色管理记录 -export const editRole = params => { return axios.post(`${base}/mdp/sys/role/edit`, params); }; - -//新增一条角色管理 -export const addRole = params => { return axios.post(`${base}/mdp/sys/role/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/roleQx.js b/src/api/mdp/sys/roleQx.js deleted file mode 100644 index 67eee34..0000000 --- a/src/api/mdp/sys/roleQx.js +++ /dev/null @@ -1,28 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listRoleQx = params => { return axios.get(`${base}/sys/roleQx/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listRoleQxKey = params => { return axios.get(`${base}/sys/roleQx/listKey`, { params: params }); }; - -//删除一个 -//export const delRoleQx = params => { return axios.post(`${base}/sys/roleQx/del`,params); }; - -//批量删除 -//export const batchDelRoleQx = params => { return axios.post(`${base}/sys/roleQx/batchDel`, params); }; - -//批量更新角色权限 -export const batchEditRoleQx = params => { return axios.post(`${base}/sys/roleQx/batchEdit`, params); }; - -//修改一个 -//export const editRoleQx = params => { return axios.post(`${base}/sys/roleQx/edit`, params); }; - -//新增一个 -//export const addRoleQx = params => { return axios.post(`${base}/sys/roleQx/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/thirdPartyAccount.js b/src/api/mdp/sys/thirdPartyAccount.js deleted file mode 100644 index 0e0e6ee..0000000 --- a/src/api/mdp/sys/thirdPartyAccount.js +++ /dev/null @@ -1,24 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listThirdPartyAccount = params => { return axios.get(`${base}/sys/thirdPartyAccount/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listThirdPartyAccountKey = params => { return axios.get(`${base}/sys/thirdPartyAccount/listKey`, { params: params }); }; - -//删除一个 -//export const delThirdPartyAccount = params => { return axios.post(`${base}/sys/thirdPartyAccount/del`,params); }; - -//批量删除 -//export const batchDelThirdPartyAccount = params => { return axios.post(`${base}/sys/thirdPartyAccount/batchDel`, params); }; - -//修改一个 -//export const editThirdPartyAccount = params => { return axios.post(`${base}/sys/thirdPartyAccount/edit`, params); }; - -//新增一个 -//export const addThirdPartyAccount = params => { return axios.post(`${base}/sys/thirdPartyAccount/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/user.js b/src/api/mdp/sys/user.js deleted file mode 100644 index f131e6b..0000000 --- a/src/api/mdp/sys/user.js +++ /dev/null @@ -1,33 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getSysBasePath(); - -/** - * 用户表 - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={userid:'内部用户编号 主键',unionid:'全局唯一编号',displayUserid:'登录展示使用用户编号',locked:'是否被锁定0否1是',startdate:'启用日期',nickname:'昵称',username:'用户名称',phoneno:'移动电话号码',password:'密码',salt:'盐值',fgOne:'指纹1',fgTwo:'指纹2',fgThr:'指纹3',idCardNo:'身份证号码',pwdtype:'密码类型1指纹2密码',headimgurl:'头像地址',country:'国家',city:'城市',province:'省份',address:'详细地址',sex:'性别',enddate:'到期日期',districtId:'区县编号',email:'邮箱',userId:'user_id',userAccount:'user_account',userPwd:'user_pwd',userName:'user_name',userDesc:'user_desc'} - **/ - -//普通查询 条件之间and关系 -export const listUser = params => { return axios.get(`${base}/mdp/sys/user/list`, { params: params }); }; -export const listUserNames = params => { return axios.get(`${base}/mdp/sys/user/listUserNames`, { params: params }); }; -export const selectlistKey= params => { return axios.get(`${base}/mdp/sys/user/selectlistKey`, { params: params }); }; - -//模糊查询用户表 条件之间or关系 -//export const listUserKey = params => { return axios.get(`${base}/mdp/sys/user/listKey`, { params: params }); }; - -export const addUser = params => { return axios.post(`${base}/mdp/sys/user/add`,params); }; - -//删除一条用户表 params={userid:'内部用户编号 主键'} -export const delUser = params => { return axios.post(`${base}/mdp/sys/user/del`,params); }; - -//批量删除用户表 params=[{userid:'内部用户编号 主键'}] -export const batchDelUser = params => { return axios.post(`${base}/mdp/sys/user/batchDel`, params); }; - -//修改一条用户表记录 -export const editUser = params => { return axios.post(`${base}/mdp/sys/user/edit`, params); }; - -//重置管理人员帮别人重置密码 -export const resetPasswordByAdmin = params => { return axios.post(`${base}/safe/user/password/reset/byAdmin`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/userExtinfo.js b/src/api/mdp/sys/userExtinfo.js deleted file mode 100644 index cfc05ed..0000000 --- a/src/api/mdp/sys/userExtinfo.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listUserExtinfo = params => { return axios.get(`${base}/sys/userExtinfo/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listUserExtinfoKey = params => { return axios.get(`${base}/sys/userExtinfo/listKey`, { params: params }); }; - -//删除一个 -//export const delUserExtinfo = params => { return axios.post(`${base}/sys/userExtinfo/del`,params); }; - -//批量删除 -//export const batchDelUserExtinfo = params => { return axios.post(`${base}/sys/userExtinfo/batchDel`, params); }; - -//修改一个 -//export const editUserExtinfo = params => { return axios.post(`${base}/sys/userExtinfo/edit`, params); }; - -//新增一个 -//export const addUserExtinfo = params => { return axios.post(`${base}/sys/userExtinfo/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/sys/userRole.js b/src/api/mdp/sys/userRole.js deleted file mode 100644 index 0fbcb1a..0000000 --- a/src/api/mdp/sys/userRole.js +++ /dev/null @@ -1,31 +0,0 @@ -import axios from 'axios'; - -import config from '../../../common/config.js'; - -let base = "/"+config.getSysContextName(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listUserRole = params => { return axios.get(`${base}/sys/userRole/list`, { params: params }); }; - -//普通查询 -export const listUserInfosByRoleid = params => { return axios.get(`${base}/sys/userRole/list/users`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listUserRoleKey = params => { return axios.get(`${base}/sys/userRole/listKey`, { params: params }); }; - -//删除一个 -//export const delUserRole = params => { return axios.post(`${base}/sys/userRole/del`,params); }; - -//批量删除 -//export const batchDelUserRole = params => { return axios.post(`${base}/sys/userRole/batchDel`, params); }; - -//批量删除 -export const batchEditUserRole = params => { return axios.post(`${base}/sys/userRole/batchEdit`, params); }; - -//修改一个 -//export const editUserRole = params => { return axios.post(`${base}/sys/userRole/edit`, params); }; - -//新增一个 -//export const addUserRole = params => { return axios.post(`${base}/sys/userRole/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/biz/bizModel.js b/src/api/mdp/workflow/biz/bizModel.js deleted file mode 100644 index df3a9c3..0000000 --- a/src/api/mdp/workflow/biz/bizModel.js +++ /dev/null @@ -1,30 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getWorkflowBasePath(); - - -/** - * mdp_biz_model - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',bizName:'业务名称',bizKey:'业务编码',modelKey:'模型编码',modelName:'模型名称',branchId:'机构编号'} - **/ - -//普通查询 条件之间and关系 -export const listBizModel = params => { return axios.get(`${base}/mdp/workflow/biz/bizModel/list`, { params: params }); }; - -//模糊查询mdp_biz_model 条件之间or关系 -//export const listBizModelKey = params => { return axios.get(`${base}/mdp/workflow/biz/bizModel/listKey`, { params: params }); }; - -//删除一条mdp_biz_model params={id:'主键 主键'} -export const delBizModel = params => { return axios.post(`${base}/mdp/workflow/biz/bizModel/del`,params); }; - -//批量删除mdp_biz_model params=[{id:'主键 主键'}] -export const batchDelBizModel = params => { return axios.post(`${base}/mdp/workflow/biz/bizModel/batchDel`, params); }; - -//修改一条mdp_biz_model记录 -export const editBizModel = params => { return axios.post(`${base}/mdp/workflow/biz/bizModel/edit`, params); }; - -//新增一条mdp_biz_model -export const addBizModel = params => { return axios.post(`${base}/mdp/workflow/biz/bizModel/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/de/model.js b/src/api/mdp/workflow/de/model.js deleted file mode 100644 index 27b2abe..0000000 --- a/src/api/mdp/workflow/de/model.js +++ /dev/null @@ -1,31 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listModel = params => { return axios.get(`${base}/mdp/workflow/de/model/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listModelKey = params => { return axios.get(`${base}/mdp/workflow/de/model/listKey`, { params: params }); }; - -//删除一个 -export const delModel = params => { return axios.post(`${base}/mdp/workflow/de/model/del`,params); }; - -//批量删除 -export const batchDelModel = params => { return axios.post(`${base}/mdp/workflow/de/model/batchDel`, params); }; - -//修改一个 -export const editModel = params => { return axios.post(`${base}/mdp/workflow/de/model/edit`, params); }; - -//修改一个 -export const deployModel = params => { return axios.post(`${base}/mdp/workflow/de/model/deploy`, params); }; - -//修改一个 -export const unDeployModel = params => { return axios.post(`${base}/mdp/workflow/de/model/unDeploy`, params); }; - -//新增一个 -export const addModel = params => { return axios.post(`${base}/mdp/workflow/de/model/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/hi/comment.js b/src/api/mdp/workflow/hi/comment.js deleted file mode 100644 index 6ebb8f8..0000000 --- a/src/api/mdp/workflow/hi/comment.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listComment = params => { return axios.get(`${base}/mdp/workflow/hi/comment/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listCommentKey = params => { return axios.get(`${base}/mdp/workflow/hi/comment/listKey`, { params: params }); }; - -//删除一个 -export const delComment = params => { return axios.post(`${base}/mdp/workflow/hi/comment/del`,params); }; - -//批量删除 -export const batchDelComment = params => { return axios.post(`${base}/mdp/workflow/hi/comment/batchDel`, params); }; - -//修改一个 -export const editComment = params => { return axios.post(`${base}/mdp/workflow/hi/comment/edit`, params); }; - -//新增一个 -export const addComment = params => { return axios.post(`${base}/mdp/workflow/hi/comment/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/hi/procinst.js b/src/api/mdp/workflow/hi/procinst.js deleted file mode 100644 index 4df8fc6..0000000 --- a/src/api/mdp/workflow/hi/procinst.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listProcinst = params => { return axios.get(`${base}/mdp/workflow/hi/procinst/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listProcinstKey = params => { return axios.get(`${base}/mdp/workflow/hi/procinst/listKey`, { params: params }); }; - -//删除一个 -export const delProcinst = params => { return axios.post(`${base}/mdp/workflow/hi/procinst/del`,params); }; - -//批量删除 -export const batchDelProcinst = params => { return axios.post(`${base}/mdp/workflow/hi/procinst/batchDel`, params); }; - -//修改一个 -export const editProcinst = params => { return axios.post(`${base}/mdp/workflow/hi/procinst/edit`, params); }; - -//新增一个 -export const addProcinst = params => { return axios.post(`${base}/mdp/workflow/hi/procinst/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/re/actAssignee.js b/src/api/mdp/workflow/re/actAssignee.js deleted file mode 100644 index d31e4aa..0000000 --- a/src/api/mdp/workflow/re/actAssignee.js +++ /dev/null @@ -1,29 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listActAssignee = params => { return axios.get(`${base}/mdp/workflow/re/actAssignee/list`, { params: params }); }; - -//普通查询模型中的所有节点的执行人列表,需要procDefId -export const getBpmnActAssignees = params => { return axios.get(`${base}/mdp/workflow/re/actAssignee/getBpmnActAssignees`, { params: params }); }; - - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listActAssigneeKey = params => { return axios.get(`${base}/mdp/workflow/re/actAssignee/listKey`, { params: params }); }; - -//删除一个 -export const delActAssignee = params => { return axios.post(`${base}/mdp/workflow/re/actAssignee/del`,params); }; - -//批量删除 -export const batchDelActAssignee = params => { return axios.post(`${base}/mdp/workflow/re/actAssignee/batchDel`, params); }; - -//修改一个 -export const editActAssignee = params => { return axios.post(`${base}/mdp/workflow/re/actAssignee/edit`, params); }; - -//新增一个 -export const addActAssignee = params => { return axios.post(`${base}/mdp/workflow/re/actAssignee/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/re/deployment.js b/src/api/mdp/workflow/re/deployment.js deleted file mode 100644 index bc0921a..0000000 --- a/src/api/mdp/workflow/re/deployment.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listDeployment = params => { return axios.get(`${base}/mdp/workflow/re/deployment/list`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listDeploymentKey = params => { return axios.get(`${base}/mdp/workflow/re/deployment/listKey`, { params: params }); }; - -//删除一个 -export const delDeployment = params => { return axios.post(`${base}/mdp/workflow/re/deployment/del`,params); }; - -//批量删除 -export const batchDelDeployment = params => { return axios.post(`${base}/mdp/workflow/re/deployment/batchDel`, params); }; - -//修改一个 -export const editDeployment = params => { return axios.post(`${base}/mdp/workflow/re/deployment/edit`, params); }; - -//新增一个 -export const addDeployment = params => { return axios.post(`${base}/mdp/workflow/re/deployment/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/re/procdef.js b/src/api/mdp/workflow/re/procdef.js deleted file mode 100644 index 57f7da0..0000000 --- a/src/api/mdp/workflow/re/procdef.js +++ /dev/null @@ -1,34 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listProcdef = params => { return axios.get(`${base}/mdp/workflow/re/procdef/list`, { params: params }); }; - -//普通查询 -export const listCategorys = params => { return axios.get(`${base}/mdp/workflow/re/procdef/categorys`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listProcdefKey = params => { return axios.get(`${base}/mdp/workflow/re/procdef/listKey`, { params: params }); }; - -//删除一个 -export const delProcdef = params => { return axios.post(`${base}/mdp/workflow/re/procdef/del`,params); }; - -//批量删除 -export const batchDelProcdef = params => { return axios.post(`${base}/mdp/workflow/re/procdef/batchDel`, params); }; - -//修改一个 -export const editProcdef = params => { return axios.post(`${base}/mdp/workflow/re/procdef/edit`, params); }; - -//修改一个 -export const suspendProcdef = params => { return axios.post(`${base}/mdp/workflow/re/procdef/suspend`, params); }; - -//修改一个 -export const activateProcdef = params => { return axios.post(`${base}/mdp/workflow/re/procdef/activate`, params); }; - -//新增一个 -export const addProcdef = params => { return axios.post(`${base}/mdp/workflow/re/procdef/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/re/procdefParames.js b/src/api/mdp/workflow/re/procdefParames.js deleted file mode 100644 index 33d8117..0000000 --- a/src/api/mdp/workflow/re/procdefParames.js +++ /dev/null @@ -1,30 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getWorkflowBasePath(); - - -/** - * mdp_re_procdef_parames - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',isRefForm:'是否关联自定义表单',monitors:'监控人多个',sponsors:'主办人多个默认为发起人',formId:'表单编号',procDefId:'流程定义编号',userid:'创建人',lastDate:'最后更新时间',mainContext:'流程正文',mainTitle:'流程标题',bizUrl:'业务功能跳转',bizName:'业务功能名称',categoryId:'所属分类编号',branchId:'云用户机构编号',formShowType:'智能表单展示方式form/table',fp:'备用字段1',sp:'备用字段2',tp:'备用字段3',pconfig:'5个备用字段',fo:'备用字段4',fi:'备用字段5',tagNames:'标签名称逗号分隔',tagIds:'标签编号逗号分隔'} - **/ - -//普通查询 条件之间and关系 -export const listProcdefParames = params => { return axios.get(`${base}/mdp/workflow/re/procdefParames/list`, { params: params }); }; - -//模糊查询mdp_re_procdef_parames 条件之间or关系 -//export const listProcdefParamesKey = params => { return axios.get(`${base}/mdp/workflow/re/procdefParames/listKey`, { params: params }); }; - -//删除一条mdp_re_procdef_parames params={id:'主键 主键'} -export const delProcdefParames = params => { return axios.post(`${base}/mdp/workflow/re/procdefParames/del`,params); }; - -//批量删除mdp_re_procdef_parames params=[{id:'主键 主键'}] -export const batchDelProcdefParames = params => { return axios.post(`${base}/mdp/workflow/re/procdefParames/batchDel`, params); }; - -//修改一条mdp_re_procdef_parames记录 -export const editProcdefParames = params => { return axios.post(`${base}/mdp/workflow/re/procdefParames/edit`, params); }; - -//新增一条mdp_re_procdef_parames -export const addProcdefParames = params => { return axios.post(`${base}/mdp/workflow/re/procdefParames/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/re/procdefParamesTemplate.js b/src/api/mdp/workflow/re/procdefParamesTemplate.js deleted file mode 100644 index 347cc4d..0000000 --- a/src/api/mdp/workflow/re/procdefParamesTemplate.js +++ /dev/null @@ -1,34 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getWorkflowBasePath(); - - -/** - * mdp_re_procdef_parames_template - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',isRefForm:'是否关联自定义表单',monitors:'监控人多个',sponsors:'主办人多个默认为发起人',formId:'表单编号',procDefId:'流程定义编号',userid:'创建人',lastDate:'最后更新时间',mainContext:'流程正文',mainTitle:'流程标题',bizUrl:'业务功能跳转',bizName:'业务功能名称',categoryId:'所属分类编号',branchId:'云用户机构编号',formShowType:'智能表单展示方式form/table',fp:'备用字段1',sp:'备用字段2',tp:'备用字段3',pconfig:'5个备用字段',fo:'备用字段4',fi:'备用字段5',tagNames:'标签名称逗号分隔',tagIds:'标签编号逗号分隔',mainQx:'1-是否控制节点权限-2是否有正文-3是否发起人外其它人可修改正文-4是否控制附件权限',modelKey:'模型key,来自act_de_model.key_'} - **/ - -//普通查询 条件之间and关系 -export const listProcdefParamesTemplate = params => { return axios.get(`${base}/mdp/workflow/re/procdefParamesTemplate/list`, { params: params }); }; - -//模糊查询mdp_re_procdef_parames_template 条件之间or关系 -//export const listProcdefParamesTemplateKey = params => { return axios.get(`${base}/mdp/workflow/re/procdefParamesTemplate/listKey`, { params: params }); }; - -//删除一条mdp_re_procdef_parames_template params={id:'主键 主键'} -export const delProcdefParamesTemplate = params => { return axios.post(`${base}/mdp/workflow/re/procdefParamesTemplate/del`,params); }; - -//批量删除mdp_re_procdef_parames_template params=[{id:'主键 主键'}] -export const batchDelProcdefParamesTemplate = params => { return axios.post(`${base}/mdp/workflow/re/procdefParamesTemplate/batchDel`, params); }; - -//修改一条mdp_re_procdef_parames_template记录 -export const editProcdefParamesTemplate = params => { return axios.post(`${base}/mdp/workflow/re/procdefParamesTemplate/edit`, params); }; - -//新增一条mdp_re_procdef_parames_template -export const addProcdefParamesTemplate = params => { return axios.post(`${base}/mdp/workflow/re/procdefParamesTemplate/add`, params); }; - - -//新增或者修改模板 -export const addOrUpdateTemplate = params => { return axios.post(`${base}/mdp/workflow/re/procdefParamesTemplate/addOrUpdate`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/re/procdefTag.js b/src/api/mdp/workflow/re/procdefTag.js deleted file mode 100644 index 017e477..0000000 --- a/src/api/mdp/workflow/re/procdefTag.js +++ /dev/null @@ -1,34 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getWorkflowBasePath(); - - -/** - * mdp_re_procdef_tag - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'id 主键',procInstId:'流程实例编号',tagId:'标签(arc.arc_tag表的id)',addUserid:'谁给我打的标签',addTime:'添加时间',state:'0无效1有效',procDefId:'流程定义编号',tagName:'tag_name'} - **/ - -//普通查询 条件之间and关系 -export const listProcdefTag = params => { return axios.get(`${base}/mdp/workflow/re/procdefTag/list`, { params: params }); }; - -//模糊查询mdp_re_procdef_tag 条件之间or关系 -//export const listProcdefTagKey = params => { return axios.get(`${base}/mdp/workflow/re/procdefTag/listKey`, { params: params }); }; - -//删除一条mdp_re_procdef_tag params={id:'id 主键'} -export const delProcdefTag = params => { return axios.post(`${base}/mdp/workflow/re/procdefTag/del`,params); }; - -//批量删除mdp_re_procdef_tag params=[{id:'id 主键'}] -export const batchDelProcdefTag = params => { return axios.post(`${base}/mdp/workflow/re/procdefTag/batchDel`, params); }; - -//修改一条mdp_re_procdef_tag记录 -export const editProcdefTag = params => { return axios.post(`${base}/mdp/workflow/re/procdefTag/edit`, params); }; - -//新增一条mdp_re_procdef_tag -export const addProcdefTag = params => { return axios.post(`${base}/mdp/workflow/re/procdefTag/add`, params); }; - - -// params=[{procDefId:'',branchId:'',userid:'',tags:[{tagId:'',tagName:''}]}] -export const batchInsertOrDeleteTags = params => { return axios.post(`${base}/mdp/workflow/re/procdefTag/batchInsertOrDeleteTags`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/ru/execution.js b/src/api/mdp/workflow/ru/execution.js deleted file mode 100644 index 96af91c..0000000 --- a/src/api/mdp/workflow/ru/execution.js +++ /dev/null @@ -1,20 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listExecution = params => { return axios.get(`${base}/mdp/workflow/ru/execution/list`, { params: params }); }; - -//启动流程 -export const startProc = params => { return axios.post(`${base}/mdp/workflow/ru/execution/start`, params); }; -//激活流程 -export const activiteExecution = params => { return axios.post(`${base}/mdp/workflow/ru/execution/activite`, params); }; -//挂起流程 -export const suspendExecution = params => { return axios.post(`${base}/mdp/workflow/ru/execution/suspend`, params); }; - -//删除流程 -export const delExecution = params => { return axios.post(`${base}/mdp/workflow/ru/execution/del`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/ru/procinstFormData.js b/src/api/mdp/workflow/ru/procinstFormData.js deleted file mode 100644 index 29e16c7..0000000 --- a/src/api/mdp/workflow/ru/procinstFormData.js +++ /dev/null @@ -1,30 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getWorkflowBasePath(); - - -/** - * mdp_ru_procinst_form_data - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',procInstId:'流程实例编号',formDataId:'表单数据编号'} - **/ - -//普通查询 条件之间and关系 -export const listProcinstFormData = params => { return axios.get(`${base}/mdp/workflow/ru/procinstFormData/list`, { params: params }); }; - -//模糊查询mdp_ru_procinst_form_data 条件之间or关系 -//export const listProcinstFormDataKey = params => { return axios.get(`${base}/mdp/workflow/ru/procinstFormData/listKey`, { params: params }); }; - -//删除一条mdp_ru_procinst_form_data params={id:'主键 主键'} -export const delProcinstFormData = params => { return axios.post(`${base}/mdp/workflow/ru/procinstFormData/del`,params); }; - -//批量删除mdp_ru_procinst_form_data params=[{id:'主键 主键'}] -export const batchDelProcinstFormData = params => { return axios.post(`${base}/mdp/workflow/ru/procinstFormData/batchDel`, params); }; - -//修改一条mdp_ru_procinst_form_data记录 -export const editProcinstFormData = params => { return axios.post(`${base}/mdp/workflow/ru/procinstFormData/edit`, params); }; - -//新增一条mdp_ru_procinst_form_data -export const addProcinstFormData = params => { return axios.post(`${base}/mdp/workflow/ru/procinstFormData/add`, params); }; \ No newline at end of file diff --git a/src/api/mdp/workflow/ru/procinstParames.js b/src/api/mdp/workflow/ru/procinstParames.js deleted file mode 100644 index 8d323a3..0000000 --- a/src/api/mdp/workflow/ru/procinstParames.js +++ /dev/null @@ -1,33 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getWorkflowBasePath(); - - -/** - * mdp_ru_procinst_parames - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'主键 主键',isRefForm:'是否关联自定义表单',monitors:'监控人多个',sponsors:'主办人多个默认为发起人',procInstId:'流程实例编号',formId:'表单编号',procDefId:'流程定义编号',userid:'创建人',startDate:'发起时间',isTemplate:'是否存为模板',mainContext:'流程正文',mainTitle:'流程标题',deptid:'发起部门',bizUrl:'业务功能跳转',bizName:'流程分类编号',categoryId:'流程分类编号',branchId:'云用户机构编号',lastUserid:'最后更新用户编号',lastTime:'最后更新时间',flowState:'审批状态0未开始1审批中2审批结束',formShowType:'智能表单数据展现方式form/table',startUsername:'发起人姓名',startDeptName:'发起部门名称',fp:'备用字段1',sp:'备用字段2',tp:'备用字段3',pconfig:'5个备用字段',fo:'备用字段4',fi:'备用字段5',tagNames:'标签名称逗号分隔',tagIds:'标签编号逗号分隔'} - **/ - -//普通查询 条件之间and关系 -export const listProcinstParames = params => { return axios.get(`${base}/mdp/workflow/ru/procinstParames/list`, { params: params }); }; - -//模糊查询mdp_ru_procinst_parames 条件之间or关系 -//export const listProcinstParamesKey = params => { return axios.get(`${base}/mdp/workflow/ru/procinstParames/listKey`, { params: params }); }; - -//删除一条mdp_ru_procinst_parames params={id:'主键 主键'} -export const delProcinstParames = params => { return axios.post(`${base}/mdp/workflow/ru/procinstParames/del`,params); }; - -//批量删除mdp_ru_procinst_parames params=[{id:'主键 主键'}] -export const batchDelProcinstParames = params => { return axios.post(`${base}/mdp/workflow/ru/procinstParames/batchDel`, params); }; - -//修改一条mdp_ru_procinst_parames记录 -export const editProcinstParames = params => { return axios.post(`${base}/mdp/workflow/ru/procinstParames/edit`, params); }; - -//新增一条mdp_ru_procinst_parames -export const addProcinstParames = params => { return axios.post(`${base}/mdp/workflow/ru/procinstParames/add`, params); }; - -//单独更新计划完成时间 -export const editPlanFinishTime = params => { return axios.post(`${base}/mdp/workflow/ru/procinstParames/editPlanFinishTime`, params); }; diff --git a/src/api/mdp/workflow/ru/procinstTag.js b/src/api/mdp/workflow/ru/procinstTag.js deleted file mode 100644 index b24c185..0000000 --- a/src/api/mdp/workflow/ru/procinstTag.js +++ /dev/null @@ -1,34 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base = config.getWorkflowBasePath(); - - -/** - * mdp_ru_procinst_tag - *1 默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - *2 查询、新增、修改的参数格式 params={id:'id 主键',procDefId:'流程编号',tag:'标签(arc.arc_tag表的id)',addUserid:'谁给我打的标签',addTime:'添加时间',state:'0无效1有效',tagName:'tag_name'} - **/ - -//普通查询 条件之间and关系 -export const listProcinstTag = params => { return axios.get(`${base}/mdp/workflow/ru/procinstTag/list`, { params: params }); }; - -//模糊查询mdp_ru_procinst_tag 条件之间or关系 -//export const listProcinstTagKey = params => { return axios.get(`${base}/mdp/workflow/ru/procinstTag/listKey`, { params: params }); }; - -//删除一条mdp_ru_procinst_tag params={id:'id 主键'} -export const delProcinstTag = params => { return axios.post(`${base}/mdp/workflow/ru/procinstTag/del`,params); }; - -//批量删除mdp_ru_procinst_tag params=[{id:'id 主键'}] -export const batchDelProcinstTag = params => { return axios.post(`${base}/mdp/workflow/ru/procinstTag/batchDel`, params); }; - -//修改一条mdp_ru_procinst_tag记录 -export const editProcinstTag = params => { return axios.post(`${base}/mdp/workflow/ru/procinstTag/edit`, params); }; - -//新增一条mdp_ru_procinst_tag -export const addProcinstTag = params => { return axios.post(`${base}/mdp/workflow/ru/procinstTag/add`, params); }; - -// params=[{procInstId:'',procDefId:'',branchId:'',userid:'',tags:[{tagId:'',tagName:''}]}] -export const batchInsertOrDeleteTags = params => { return axios.post(`${base}/mdp/workflow/ru/procinstTag/batchInsertOrDeleteTags`, params); }; - diff --git a/src/api/mdp/workflow/ru/task.js b/src/api/mdp/workflow/ru/task.js deleted file mode 100644 index da438aa..0000000 --- a/src/api/mdp/workflow/ru/task.js +++ /dev/null @@ -1,67 +0,0 @@ -import axios from '@/utils/request' - -import config from '@/common/config' - -let base=config.getWorkflowBasePath(); - -//默认只开放普通查询,所有查询,只要上传 分页参数 {currentPage:1,pageSize:10,total:0},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, - -//普通查询 -export const listAssigneeToAnyTasks = params => { return axios.get(`${base}/mdp/workflow/ru/task/listAssigneeToAnyTasks`, { params: params }); }; -//普通查询 -export const listAssigneeToMeTasks = params => { return axios.get(`${base}/mdp/workflow/ru/task/listAssigneeToMeTasks`, { params: params }); }; -//普通查询 -export const listMyCandidateUserTasks = params => { return axios.get(`${base}/mdp/workflow/ru/task/listMyCandidateUserTasks`, { params: params }); }; -//普通查询 -export const listAnyCandidateUserTasks = params => { return axios.get(`${base}/mdp/workflow/ru/task/listAnyCandidateUserTasks`, { params: params }); }; -//普通查询 -export const listMyCandidateGroupTasks = params => { return axios.get(`${base}/mdp/workflow/ru/task/listMyCandidateGroupTasks`, { params: params }); }; -//普通查询 -export const listAnyCandidateGroupTasks = params => { return axios.get(`${base}/mdp/workflow/ru/task/listAnyCandidateGroupTasks`, { params: params }); }; - -//关键字模糊查询 {字段1:v1,字段2:v1,字段3:v1},字段驼峰命名,条件之间默认为or关系 -//export const listTaskKey = params => { return axios.get(`${base}/mdp/workflow/ru/task/listKey`, { params: params }); }; - -//删除一个 -export const delTask = params => { return axios.post(`${base}/mdp/workflow/ru/task/del`,params); }; - -//批量删除 -export const batchDelTask = params => { return axios.post(`${base}/mdp/workflow/ru/task/batchDel`, params); }; - -//修改一个 -export const editTask = params => { return axios.post(`${base}/mdp/workflow/ru/task/edit`, params); }; - -//新增一个 -export const addTask = params => { return axios.post(`${base}/mdp/workflow/ru/task/add`, params); }; - -//完成一个任务 action=complete/resolve/delegate/calim -export const completeTask = params => { return axios.post(`${base}/mdp/workflow/ru/task/complete`, params); }; - -// 添加办理意见,但是不提交任务 -export const addComment = params => { return axios.post(`${base}/mdp/workflow/ru/task/addComment`, params); }; - - -/** - * 新增候选人/部门/岗位 {branchId:'',taskId:'',procInstId:'',userids:[userid],deptids:[deptid],postids:[postid]} - * */ -export const addCandidate = params => { return axios.post(`${base}/mdp/workflow/ru/task/addCandidate`, params); }; - -/** - * 删除候选人/部门/岗位 {taskId:'',procInstId:'',userids:[userid],deptids:[deptid],postids:[postid]} - * */ -export const delCandidate = params => { return axios.post(`${base}/mdp/workflow/ru/task/delCandidate`, params); }; - -/** - * 查询候选个人 - * */ -export const listCandidateUsers = params => { return axios.get(`${base}/mdp/workflow/ru/task/listCandidateUsers`, { params: params }); }; - -/** - * 查询候选组(实际指部门) - * */ -export const listCandidateDepts = params => { return axios.get(`${base}/mdp/workflow/ru/task/listCandidateDepts`, { params: params }); }; - -/** - * 查询候选岗位 - * */ -export const listCandidatePosts = params => { return axios.get(`${base}/mdp/workflow/ru/task/listCandidatePosts`, { params: params }); }; \ No newline at end of file diff --git a/src/api/mdp_pub/index.js b/src/api/mdp_pub/index.js new file mode 100644 index 0000000..f3f34e2 --- /dev/null +++ b/src/api/mdp_pub/index.js @@ -0,0 +1,14 @@ +import axios from '@/utils/request' +import mdp_base from './mdp_api_base.js';//全局mdp-核心公共api库 mdp所有组件库依赖于此 +import mdp_ext from './mdp_api_ext.js';//全局mdp-扩展的组件使用的公共api库 +import mdp_config from './mdp_config.js';//全局mdp-配置信息,主要配置一些请求路径的前缀,方便合并+拆分工程等,改下前缀即可 +import mdp_api_biz from './mdp_api_biz.js';//业务功能需要的api,可根据实际情况添加更多业务相关的api + + export default { + ...mdp_config, + ...mdp_base, + ...mdp_ext, + ...mdp_api_biz +} + + diff --git a/src/api/mdp_pub/mdp_api_base.js b/src/api/mdp_pub/mdp_api_base.js new file mode 100644 index 0000000..bd34a82 --- /dev/null +++ b/src/api/mdp_pub/mdp_api_base.js @@ -0,0 +1,305 @@ +/** + * mdp框架前端与后端交互核心公共api + * 一般情况下请勿将业务代码加入此文件,业务代码及其它模块及api应该放入各自单独的api文件中,如果实在要添加,请添加到$mdp_api_biz.js文件中,实现全局调用 + * 扩展组件的api请加入到fly_mdp_ext.js中 + */ +import axios from '@/utils/request' +import util from '@/components/mdp-ui/js/util';//全局公共库 +import {sn} from '@/components/mdp-ui/js/sequence';//全局公共库 +import config from './mdp_config' +let sysBase = config.getSysContext(); + +const mdpBaseCache=new Map(); + +var SIGN_REGEXP = /([yMdhsmH])(\1*)/g +var DEFAULT_PATTERN = 'yyyy-MM-dd' + +const colors=['#909399','#409EFF','#67C23A','#E6A23C','#F56C6C','#00ced1','#c71585','#ff8c00','#c7158577','#ffd700']; + +var funcs = { + + ...util, +/** + * 从后端请求数据字典列表 + * @param {*} params {itemCode:xxx,categoryId:xxx,....其它参数} + * @returns + */ + getDicts: function(params){ return axios.get(`/${sysBase}/mdp/meta/item/dicts`, { params: params }); }, + + /** + * 检查某个按钮是否具有访问权限 + * @param {*} btnId 按钮编号 + * @param {*} menuDefId + * @returns true/false + */ + checkBtnQx:function(btnId,menuDefId,params){ + return true; + }, + + + /** + * 生成缓存key + * @param {*} itemCode + * @param {*} params + * @returns + */ + getCodeKey:function (itemCode,params){ + var codeKey='mdp-dict-cache'+'@'+itemCode + if(params){ + for (let [key, value] of Object.entries(params)) { + if(key=="itemCode"){ + continue; + } + codeKey=codeKey+"@"+key+":"+value + } + } + return codeKey; + }, +clearDictCache:function(itemCode,params){ + var codeKey=funcs.getCodeKey(itemCode,params); + var lockKey=codeKey+'@lock' + mdpBaseCache.delete(codeKey) + sessionStorage.removeItem(codeKey) + sessionStorage.removeItem(lockKey) + +}, +/** + * 字典标签专用(通过itemCode获取字典下拉列表数组) + * 注意:该api将首先寻找全局缓存,找不到再祥服务器申请 + **/ +ajaxGetDictOptions:function(itemCode, params) +{ + var codeKey=funcs.getCodeKey(itemCode,params); + return new Promise((resolve,reject)=>{ + var data=funcs.getDictOptionsFromCache(codeKey,itemCode,params) + if(data){ + var res2={ + tips:{ + isOk:true, + tipscode:'ok', + msg:'成功' + }, + data:data + } + resolve(res2) + }else{ + + var lockKey=codeKey+'@lock' + var lock=sessionStorage.getItem(lockKey) + let func = function(){ + var data=funcs.getDictOptionsFromCache(codeKey,itemCode,params) + if(data){ + var res2={ + tips:{ + isOk:true, + tipscode:'ok', + msg:'成功' + }, + data:data + } + resolve(res2) + return; + } + if(!params){ + params={itemCode:itemCode} + }else{ + params.itemCode=itemCode + } + sessionStorage.setItem(lockKey,"1") + funcs.getDicts(params).then(res=>{ + + if(res.data.tips && res.data.tips.isOk && res.data.data && res.data.data.length>0){ + var item=res.data.data[0] + if(item.options && item.options.length>0){ + item.options.forEach(k=>{ + if(k!=null && k.id!=null){ + if(!k.color){ + k.color=funcs.getColorById(k.id) + } + } + }) + } + + sessionStorage.setItem(codeKey,JSON.stringify(res.data.data[0])) + sessionStorage.removeItem(lockKey) + var res2={ + tips:res.data.tips, + data:res.data.data[0] + } + mdpBaseCache.set(codeKey,res2) + resolve(res2) + + }else{ + sessionStorage.removeItem(lockKey) + mdpBaseCache.set(codeKey,null) + reject(res) + } + }).catch(e=>{ + mdpBaseCache.set(codeKey,null) + sessionStorage.removeItem(lockKey) + reject(e) + }) + } + if(lock){ + setTimeout(()=>{ + func(); + },2000) + }else{ + func(); + } + + } + }) + }, + + /** + * 默认颜色列表 + * @returns + */ + getDefaultColors:function(){ + return colors + }, + + /** + * 根据id获取系统默认的对应颜色 + * @param {*} id + * @returns + */ + getColorById(id){ + var cellValue=id + var colors=this.getDefaultColors(); + if(!cellValue){ + return colors[0] + } + var cellValueInt=parseInt(cellValue) + if( isNaN( cellValueInt) ){ + if(typeof cellValue =='string' && cellValue.length>0){ + var idxList=[] + if(cellValue.length==1){ + idxList=[0] + }else if(cellValue.length==2){ + idxList=[0,1] + }else if(cellValue.length==3){ + idxList=[0,1,2] + }else{ + idxList=[0,parseInt((cellValue.length-1)/2),cellValue.length-1] + } + + cellValueInt=0; + for(var i=0;i 0 && colorIndex==0){ + colorIndex=1 + } + return colors[colorIndex] + +}, + +/** + * 从缓存中获取字典列表,该函数不会向后端请求 + * */ +getDictOptionsFromCache: function(codeKey,itemCode,params) { + var item=mdpBaseCache.get(codeKey) + if(item && item.id){ + return item + } + var clistStr=sessionStorage.getItem(codeKey); + if (clistStr&& clistStr!='null' && clistStr!='undefined') { + let item = JSON.parse(clistStr) + return item; + }else{ + return null; + } +}, + +/** + * 反显字典值 + * @param {*} itemCode 字典代码 + * @param {*} value 字典值 + * @param {*} params 参数可空 + * @returns + */ +formatDict:async function(itemCode, value,params) +{ + if(!value){ + return value; + } + this.ajaxGetDictOptions(itemCode,params).then(res=>{ + if(res.tips.isOk && res.data){ + var item=res.data + var find=item.options.find(k=>k.id==value) + if(find){ + return find.name + }else{ + return value; + } + }else{ + return value; + } + }) +}, + +createSeqNo:function(prefix){ + return sn(prefix); +}, +/** + * 字段转成驼峰命名 + * @param {*} name + */ + toCamel:function(name) { + var name1= name.replace(/\_(\w)/g, function(all, letter) { + return letter.toUpperCase(); + }); + return name1.replace(/\-(\w)/g, function(all, letter) { + return letter.toUpperCase(); + }); +}, +/** + * 驼峰转下横线 + * @param {*} name + */ +toLine:function(name) { + return name.replace(/([A-Z])/g, "_$1").toLowerCase(); +}, +/** + * 格式化日期 + * @param {*} date + * @param {*} pattern + * @returns + */ +formatDate: function(date, pattern) { + pattern = pattern || DEFAULT_PATTERN + return pattern.replace(SIGN_REGEXP, function($0) { + switch ($0.charAt(0)) { + case 'y': + return padding(date.getFullYear(), $0.length) + case 'M': + return padding(date.getMonth() + 1, $0.length) + case 'd': + return padding(date.getDate(), $0.length) + case 'w': + return date.getDay() + 1 + case 'h': + return padding(date.getHours(), $0.length) + case 'H': + return padding(date.getHours(), $0.length) + case 'm': + return padding(date.getMinutes(), $0.length) + case 's': + return padding(date.getSeconds(), $0.length) + } + }) +}, + +} + + +export default funcs; + + diff --git a/src/api/mdp_pub/mdp_api_biz.js b/src/api/mdp_pub/mdp_api_biz.js new file mode 100644 index 0000000..983141a --- /dev/null +++ b/src/api/mdp_pub/mdp_api_biz.js @@ -0,0 +1,57 @@ +/** + * 业务模块前端与后端交互公共api + * 一般情况下请勿将业务代码加入此文件,业务代码及其它模块及api应该放入各自单独的api文件中,如果实在要添加,请添加到$mdp_api_biz.js文件中,实现全局调用 + * 扩展组件的api请加入到fly_mdp_ext.js中 + */ + + import axios from '@/utils/request' + import config from './mdp_config' + let sysBase = config.getSysContext(); +export default { +//统计机构权益、用户数据等 +getBranchInterestsDetail: params => { return axios.get(`${sysBase}/mdp/sys/branchInterests/detail`, params); }, +//加入企业申请 +addUserJoinBranchRequire: params => { return axios.post(`${sysBase}/mdp/sys/userJoinBranchRequire/add`, params); }, +//查询登陆日志 +listUserLoginRecord: params => { return axios.get(`${sysBase}/mdp/sys/userLoginRecord/list`, { params: params }); }, + +//取消关注 +delUserFocus: params => { return axios.post(`${sysBase}/mdp/sys/userFocus/del`,params); }, + +//关注一个对象 +addUserFocus: params => { return axios.post(`${sysBase}/mdp/sys/userFocus/add`, params); }, + +//修改关注信息 +editSomeFieldsUserFocus: params => { return axios.post(`${sysBase}/mdp/sys/userFocus/editSomeFields`, params); }, + +//我的关注列表 +myFocusForIndex: params => { return axios.get(`${sysBase}/mdp/sys/userFocus/myFocusForIndex`, { params: params });}, + +//查询我的收藏 +userMenuFavoriteList : params => { return axios.get(`${sysBase}/menu/menuFavorite/list`, { params: params }); }, + +//保存我的收藏 +saveMenuFavoriteList : params => { return axios.post(`${sysBase}/menu/menuFavorite/batchSaveMenuFavorites`, params); }, + +//创建邀请码 +createInviteId : params => { return axios.post(`${sysBase}/mdp/sys/userTpaInvite/createInviteId`,params); }, + + +//检查邀请码是否有效 +checkInviteId : params => { return axios.get(`${sysBase}/mdp/sys/userTpaInvite/checkInviteId`, { params: params }); }, + + +//查询通知 +listNotifyMsg : params => { return axios.get(`${sysBase}/mdp/sys/notifyMsg/list`, { params: params }); }, + + +//更新消息的已读未读状态 +editSomeFieldsNotifyMsg : params => { return axios.post(`${sysBase}/mdp/sys/notifyMsg/editSomeFields`, params); }, + +//查询所有模块 +getAllMenuModule : params => { return axios.get(`${sysBase}/sys/sys/mdp/menu/menuModule/list`, {params: params }); }, + +//查询已购买的模块 +getBuyMenuModule : params => { return axios.get(`${sysBase}/sys/sys/mdp/menu/menuModuleBranch/list`, {params: params }); }, + +} diff --git a/src/api/mdp_pub/mdp_api_ext.js b/src/api/mdp_pub/mdp_api_ext.js new file mode 100644 index 0000000..4903b93 --- /dev/null +++ b/src/api/mdp_pub/mdp_api_ext.js @@ -0,0 +1,397 @@ +/** + * mdp框架前端与后端交互扩展组件使用到的公共api + * 一般情况下请勿将业务代码加入此文件,业务代码及其它模块及api应该放入各自单独的api文件中,如果实在要添加,请添加到$mdp.js文件中,实现全局调用 + */ + +import util from '@/components/mdp-ui/js/util';//全局公共库 +import axios from '@/utils/request' +import config from './mdp_config' +import { getToken } from '@/utils/auth' + +const mdpExtCache=new Map(); + +let sysBase = config.getSysContext(); + +let arcBase = config.getArcContext() + +let formBase = config.getFormContext() + +let workflowBase = config.getWorkflowContext() + +var funcs = { + +/** + * 获取文件、附件上传的请求路径,全路径 + */ +getArcAttUploadPath : () => { return `${config.getArcFileUploadBasePath()}/mdp/arc/att/attachment/upload` }, + +/** + * 获取图片上传的请求路径,全路径 + * @returns + */ +getArcImageUploadPath :() => { return `${config.getArcImagePath()}/mdp/arc/img/image/upload`}, + +/** + * 预览图片是 url= $mdp.getArcImagePreviewBasePath()/图片url + * @returns + */ +getArcImagePreviewBasePath : () => { return `${config.getArcImagePath()}` }, + +/** + * 文件上传下载时带上token + * @returns + */ +getArcUploadHeader: () => { return {Authorization: "Bearor "+ getToken()} }, + + +/** + * sys_user 用户表 + *1 默认只开放普通查询,所有查询,只要上传 分页参数 {pageNum:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, + *2 查询、新增、修改的参数格式 params={userid:'内部用户编号(账户编号),如果是机构管理员账户,则=机构号 主键',unionid:'全局唯一编号,也叫主账户,同一个人(比如同一个微信号,同一个邮箱,同一个手机号视为同一个人)。同一个人在mdp有唯一的主账号。',displayUserid:'登录展示使用用户编号',locked:'是否被锁定0否1是',startdate:'启用日期',nickname:'昵称',username:'用户名称',phoneno:'移动电话号码',password:'密码',salt:'盐值',pwdtype:'密码类型1指纹2密码',headimgurl:'头像地址',country:'国家',city:'城市',province:'省份',address:'详细地址',sex:'性别',enddate:'到期日期',districtId:'区县编号',email:'邮箱',fgOne:'指纹1',fgTwo:'指纹2',fgThr:'指纹3',idCardNo:'身份证号码',officePhoneno:'办公室电话',bizProcInstId:'当前流程实例编号',bizFlowState:'当前流程状态',memType:'从平台角度看会员类型0-个人账户、1-企业管理员账户、2-企业员工账户,个人账户无须绑定机构号,个人子账户可升级为企业员工账户,企业账户必须绑定机构编号branchId个人账户升级后,保留个人主账户,个人子账户绑定企业编号成为企业员工账户',orgId:'机构会员自己的机构会员的机构号,理解为客户的客户',emailBak:'备用邮箱',pwdStrong:'1-高风险,2-中风险,3-低风险',lockType:'锁定类型:0-注册等待邮箱验证,1-注册等待修改初始密码,2-注册等待验证手机号码,3-密码高风险,等待重新修改密码,9-业务需要锁定禁止登录,10-账户被锁定,请联系客服',lockRemark:'锁定原因',ltime:'更新日期',atype:'相对于平台来说的账户类型0-子账户,1-主账户。',branchId:'机构主子账户归属的机构编号,如果是个人,这里填虚拟机构编号,作为虚拟的机构号,方便将来升级成企业号',continent:'洲别',cpaType:'从入驻企业角度看协作类型0-企业内部人员,1-客户,2-供应商,3-上级机构,4-下属机构',cpaOrg:'协作组织0-个人,1机构,如果是机构,机构号填入orgId',roleids:'个人账户拥有的角色,逗号分割',birthday:'生日',shopId:'商户编号',profeId:'职业编号',profeName:'职业名称',gradeId:'等级会员,根据经验值而定',gradeName:'等级会员名称',ilvlId:'权益等级青铜、白银、黄金、紫金、钻石',ilvlName:'权益等级名称',istatus:'会员权益状态0-无效,1-有效,2-过期',istime:'权益开始时间',ietime:'权益结束时间',validLvls:'人工验证结果,当审核状态为2时,同步到sys_user表同一个字段,或者sys_branch同一个字段',features:'个性化签名',profeType:'职业类型1-开发类,2-测试类,3-设计类,4-管理类;',ustatus:'用户账户状态0-初始,1-起效,2-注销申请,3-注销后删除',creditId:'信用等级编号',creditScore:'信用等级分数',guardId:'服务保障等级0-初始,1-金,2-银,3-铜',open:'是否对互联网用户开放查询0-否1是',remark:'简介备注',bizHours:'营业时间说明09:00-12:00',skillIds:'技能编号列表',skillNames:'技能名称列表'} + **/ +listUser: params => { return axios.get(`/${sysBase}/mdp/sys/user/list`, { params: params }); }, + + +//查询一个用户 +queryUserById : params => { return axios.get(`${sysBase}/mdp/sys/user/queryById`, { params: params });}, + +//修改用户信息 +editUser : params => { return axios.post(`${sysBase}/mdp/sys/user/edit`, params);}, + +//批量修改用户的某些字段 +editSomeFieldsUser : params => { return axios.post(`${sysBase}/mdp/sys/user/editSomeFields`, params);}, + +//管理人员帮别人重置密码 +resetPasswordByAdmin : params => { return axios.post(`${sysBase}/sys/user/resetPassword`, params);}, + +//修改自己的密码 +changePassword : params => { return axios.post(`${sysBase}/sys/user/changePassword`, params);}, + + +//更新当前登录着的头像 +editHeadimgurl : params => { return axios.post(`${sysBase}/sys/user/editHeadimgurl`, params); }, + +//查询机构列表 +listBranch : params => { return axios.get(`${sysBase}/mdp/sys/branch/list`, { params: params }); }, + +/** +* sys_dept +*1 默认只开放普通查询,所有查询,只要上传 分页参数 {pageNum:当前页码从1开始,pageSize:每页记录数,total:总记录【数如果是0后台会自动计算总记录数非0不会自动计算】},后台都会自动按分页查询 其它 api用到再打开,没用到的api请注释掉, +*2 查询、新增、修改的参数格式 params={deptid:'部门编号 主键',deptName:'部门全称',pdeptid:'上级部门编号',deptType:'参考数据字典deptType',state:'状态A正常E无效',manager:'负责人编号',leader:'上级领导编号',shortName:'简称',displayDeptid:'部门编码外部使用',orgType:'参考数据字典orgType',managerName:'负责人名称',leaderName:'上级领导名称',branchId:'云用户机构编号',levelType:'层级类型(科云:0国,1省,2市,3区县,4街道,5自然村)',idPath:'部门编号路径',bizProcInstId:'当前流程实例编号',bizFlowState:'当前流程状态',ltime:'最后更新时间',isCbCenter:'是否为成本中心0否1是'} +**/ +listDept: params => { return axios.get(`/${sysBase}/mdp/sys/dept/list`, { params: params }); }, + +/** + * 角色列表 + * @param {*} params + * @returns + */ +listRole: params => { return axios.get(`/${sysBase}/mdp/sys/role/list`, { params: params }); }, + +/** + * 岗位列表 + * @param {*} params + * @returns + */ + listPost: params => { return axios.get(`/${sysBase}/mdp/sys/post/list`, { params: params }); }, + +// --arc tag 相关api + +//普通查询 条件之间and关系 +getAllTag : params => { return axios.get(`/${arcBase}/mdp/arc/tag/getAllTag`, { params: params }); }, + +//删除一条arc_tag params={id:'标签编号 主键'} +delTag : params => { return axios.post(`/${arcBase}/mdp/arc/tag/del`,params); }, + +//新增一条arc_tag +addTag : params => { return axios.post(`/${arcBase}/mdp/arc/tag/add`, params); }, + +//新增一条arc_tag_category 及相关标签 +delTagCategory : params => { return axios.post(`/${arcBase}/mdp/arc/tag/deleteTagCategory`, params); }, + +//新增一条arc_tag_category +addTagCategory : params => { return axios.post(`/${arcBase}/mdp/arc/tagCategory/add`, params); }, + +// -- end arc tag 相关api + + +// -- arc image 图片库相关api + +/** +* 图片素材库 +* 查询、新增、修改的参数格式 params={id:'主键 主键',name:'附件名称',url:'访问路径',relativePath:'硬盘存放路径',fileSuffix:'后缀名',rootPath:'根目录',createDate:'存入时间',fileSize:'文件大小',deptid:'归属部门',tag:'标签',remark:'备注信息',categoryId:'图片分类',storageName:'硬盘存储名字(不带后缀)',urlPrefix:'链接前缀',isOutUrl:'是否外部链接',outUrl:'外部链接',branchId:'机构编号',archiveType:'0|知识库',relyTypes:'参考类型,开放式字段,1-开源社区,2-项目论坛,逗号',relyIds:'参考编号,逗号',relySubTypes:'参考子类型,逗号',relySubIds:'参考子编号,逗号',cuserid:'创建人编号',cusername:'创建人姓名',cdate:'创建时间'} +**/ +listImage : params => { return axios.get(`/${arcBase}/mdp/arc/img/image/list`, { params: params }); }, + + +//批量删除图片素材库 params=[{id:'主键 主键'}] +batchDelImage : params => { return axios.post(`/${arcBase}/mdp/arc/img/image/batchDel`, params); }, + + +//普通查询 条件之间and关系 +listImageCategory : params => { return axios.get(`/${arcBase}/mdp/arc/img/imageCategory/list`, { params: params }); }, + +//删除一条图片分类 params={id:'主键 主键'} +delImageCategory : params => { return axios.post(`/${arcBase}/mdp/arc/img/imageCategory/del`,params); }, + + +//修改一条图片分类记录 +ditImageCategory : params => { return axios.post(`/${arcBase}/mdp/arc/img/imageCategory/edit`, params); }, + +//新增一条图片分类 +addImageCategory : params => { return axios.post(`/${arcBase}/mdp/arc/img/imageCategory/add`, params); }, + + // end -- arc image 图片库相关api + + + // -- arc att 附件相关api + + /** + * 档案类目 + * 查询、新增、修改的参数格式 params={id:'分类主键 主键',categoryType:'0知识库-1新闻类2企业内部通知公告类3平台通知公告4其它5论坛6公文7归档8网站栏目,关联基础数据categoryType',pid:'上级分类',name:'分类名称',sortOrder:'分类排序',isShow:'是否显示',branchId:'机构编号',imageUrls:'图片列表逗号分割',isLeaf:'是否叶子节点0否1是,叶子节点不允许再建立下级,非叶子节点不允许挂文章',limitType:'文章限制,1-单篇文章,2-多篇文章',isAuth:'文章是否需要审核0-否1是',paths:'上级分类路径,逗号分割,包括自身'} + **/ +//普通查询 条件之间and关系 +listCategory : params => { return axios.get(`/${arcBase}/mdp/arc/pub/category/list`, { params: params }); }, + +//普通查询 条件之间and关系 +queryCategoryById : params => { return axios.get(`/${arcBase}/mdp/arc/pub/category/queryById`, { params: params }); }, + +//批量删除档案类目 params=[{id:'分类主键 主键'}] +batchAddCategory : params => { return axios.post(`/${arcBase}/mdp/arc/pub/category/batchAdd`, params); }, + +//批量删除档案类目 params=[{id:'分类主键 主键'}] +batchDelCategory : params => { return axios.post(`/${arcBase}/mdp/arc/pub/category/batchDel`, params); }, + +//修改一条档案类目记录 +editCategory : params => { return axios.post(`/${arcBase}/mdp/arc/pub/category/edit`, params); }, + +//新增一条档案类目 +addCategory : params => { return axios.post(`/${arcBase}/mdp/arc/pub/category/add`, params); }, + +//查询分类权限 +listCategoryQx : params => { return axios.get(`/${arcBase}/mdp/arc/pub/categoryQx/list`, { params: params }); }, + +//查询分类权限 +queryCategoryQxById : params => { return axios.get(`/${arcBase}/mdp/arc/pub/categoryQx/queryById`, { params: params }); }, + + +//修改一条档案类目记录权限 +editCategoryQx : params => { return axios.post(`/${arcBase}/mdp/arc/pub/categoryQx/edit`, params); }, + +//新增一条档案类目权限 +addCategoryQx : params => { return axios.post(`/${arcBase}/mdp/arc/pub/categoryQx/add`, params); }, + +/** +* 档案附件表 +*查询、新增、修改的参数格式 params={id:'主键 主键',name:'附件名称',url:'访问路径',relativePath:'硬盘存放路径',fileSuffix:'后缀名',cdnUrl:'内容加速器访问路径',isImg:'是否图片',archiveId:'档案主编号',isCdn:'是否使用CDN',rootPath:'根目录',createDate:'存入时间',canDown:'是否可下载',canDel:'是否可删除',canRead:'是否可读',bizId:'业务编号、产品编号、商品编号等',remark:'业务名称、产品名称、商品名称等',storeName:'存储名字',fileSize:'文件大小',branchId:'云用户机构编号',deptid:'部门编号',archiveType:'0|知识库',categoryId:'分类编号'} +**/ + +//普通查询 条件之间and关系 + listAttachment : params => { return axios.get(`/${arcBase}/mdp/arc/att/attachment/list`, { params: params }); }, + +//普通查询 条件之间and关系 + queryAttachmentById : params => { return axios.get(`/${arcBase}/mdp/arc/att/attachment/queryById`, { params: params }); }, + +//删除一条档案附件表 params={id:'主键 主键'} + delAttachment : params => { return axios.post(`/${arcBase}/mdp/arc/att/attachment/del`,params); }, + +//批量删除档案附件表 params=[{id:'主键 主键'}] + batchDelAttachment : params => { return axios.post(`/${arcBase}/mdp/arc/att/attachment/batchDel`, params); }, + +//修改一条档案附件表记录 + editAttachment : params => { return axios.post(`/${arcBase}/mdp/arc/att/attachment/edit`, params); }, + +//新增一条档案附件表 + addAttachment : params => { return axios.post(`/${arcBase}/mdp/arc/att/attachment/add`, params); }, + +//批量修改某些字段 + editSomeFieldsAttachment : params => { return axios.post(`/${arcBase}/mdp/arc/att/attachment/editSomeFields`, params); }, + + // end -- arc att 附件相关api + + + // start - mdp meta 元数据管理 相关api + + /** + * 数据项定义 + *查询、新增、修改的参数格式 params={id:'主键 主键',itemCode:'代码,小写,下横线分割,请不要用驼峰命名',itemName:'名称',remark:'备注',categoryId:'分类编号',itemSize:'长度',itemType:'类型',branchId:'机构编号',deptid:'部门编号',cmenu:'是否创建菜单',values:'默认值,如果是列表,则存储列表编号,多个逗号分割',names:'默认名称,如果是列表,则存储列表名称,多个则逗号分割',options:'item_type=4,5时的选项列表[{value:值,name:显示名称}]',inputFormat:'输入提示',required:'是否必须0否1是',seq:'排序顺序',table:'表名',show:'是否显示0否1是',qx:'权限,是否可以0-新增,1-删除,2-编辑,3-查询,多个以逗号分割'} + **/ + +//普通查询 条件之间and关系 +listItem : params => { return axios.get(`/${sysBase}/mdp/meta/item/list`, { params: params }); }, + + +//删除一条数据项定义 params={id:'主键 主键'} +delItem : params => { return axios.post(`/${sysBase}/mdp/meta/item/del`,params); }, + +//批量删除数据项定义 params=[{id:'主键 主键'}] +batchDelItem : params => { return axios.post(`/${sysBase}/mdp/meta/item/batchDel`, params); }, + +//修改一条数据项定义记录 +editItem : params => { return axios.post(`/${sysBase}/mdp/meta/item/edit`, params); }, + +//新增一条数据项定义 +addItem : params => { return axios.post(`/${sysBase}/mdp/meta/item/add`, params); }, + + +/** + * 数据项取值列表 + *查询、新增、修改的参数格式 params={id:'主键 主键',itemId:'数据项编号',optionValue:'选项值',optionName:'选项名称',keys:'快捷键',isShow:'是否显示',seqOrder:'顺序',fp:'第一扩展字段',tp:'第三扩展字段',sp:'第二扩展字段',isDefault:'是否默认',cdate:'创建日期',branchId:'机构编号',deptid:'部门编号'} + **/ + +//普通查询 条件之间and关系 +listItemOption : params => { return axios.get(`/${sysBase}/mdp/meta/itemOption/list`, { params: params }); }, + +//删除一条数据项取值列表 params={id:'主键 主键'} +delItemOption : params => { return axios.post(`/${sysBase}/mdp/meta/itemOption/del`,params); }, + +//批量删除数据项取值列表 params=[{id:'主键 主键'}] +batchDelItemOption : params => { return axios.post(`/${sysBase}/mdp/meta/itemOption/batchDel`, params); }, + +//修改一条数据项取值列表记录 +editItemOption : params => { return axios.post(`/${sysBase}/mdp/meta/itemOption/edit`, params); }, + +//新增一条数据项取值列表 +addItemOption : params => { return axios.post(`/${sysBase}/mdp/meta/itemOption/add`, params); }, + +//普通查询 条件之间and关系 +queryItemOptionById : params => { return axios.get(`/${sysBase}/mdp/meta/itemOption/queryById`, { params: params }); }, + +//批量修改某些字段 +editSomeFieldsItemOption : params => { return axios.post(`/${sysBase}/mdp/meta/itemOption/editSomeFields`, params); }, + +//刷新缓存 +refresh : params => { return axios.post(`/${sysBase}/mdp/meta/itemOption/refresh`, params); }, + + // end - mdp meta 元数据管理 相关api + + // start form 智能表单 相关api + + listFormField : params => { return axios.get(`${formBase}/mdp/form/formField/list`, { params: params }); }, + +listFormFieldCacheFirst : params => { + var baseCode='list-form-fields' + var codeKey=util.getCodeKey(baseCode,params); + return new Promise((resolve,reject)=>{ + var data=funcs.listFormFieldFromCache(codeKey,baseCode,params) + if(data){ + var res2={ + tips:{ + isOk:true, + tipscode:'ok', + msg:'成功' + }, + data:data + } + resolve({data:res2}) + }else{ + + var lockKey=codeKey+'@lock' + var lock=sessionStorage.getItem(lockKey) + let func = function(){ + var data=funcs.listFormFieldFromCache(codeKey,baseCode,params) + if(data){ + var res2={ + tips:{ + isOk:true, + tipscode:'ok', + msg:'成功' + }, + data:data + } + resolve({data:res2}) + return; + } + funcs.listFormField(params).then(res=>{ + sessionStorage.removeItem(lockKey) + if(res.data.tips && res.data.tips.isOk ){ + sessionStorage.setItem(codeKey,JSON.stringify(res.data.data)) + var res2={ + tips:res.data.tips, + data:res.data.data + } + mdpExtCache.set(codeKey,res2) + resolve({data:res2}) + + }else{ + mdpExtCache.set(codeKey,null) + reject(res) + } + }).catch(e=>{ + mdpExtCache.set(codeKey,null) + sessionStorage.removeItem(lockKey) + reject(e) + }) + } + if(lock){ + setTimeout(()=>{ + func(); + },2000) + }else{ + func(); + } + + } + }) +}, + /** + * 从缓存中获取字典列表,该函数不会向后端请求 + * */ + listFormFieldFromCache : (codeKey) => { + var item=mdpExtCache.get(codeKey) + if(item && item.formDef && item.formDef.id){ + return item + } + var clistStr=sessionStorage.getItem(codeKey); + if (clistStr&& clistStr!='null' && clistStr!='undefined') { + let item = JSON.parse(clistStr) + return item; + }else{ + return null; + } +}, + +removeFormFieldsCache:(formId)=>{ + var baseCode='list-form-fields' + var params={formId:formId} + var codeKey=util.getCodeKey(baseCode,params); + mdpExtCache.set(codeKey,null) + sessionStorage.removeItem(codeKey) + +}, + +goToFormDesign: formDefId => { + var url= window.location.protocol + '//' + window.location.host + workflowBase+'/' + process.env.VERSION + '/#/mdp/form/design/'+formDefId + util.openWin(url) +}, + // end form + + /** + * 微信邀请用户加入公司需要state参数,防止crfs攻击 + * @returns + */ + getInviteTpaState: () => { + return axios({ + url: '/tpa/invite/wechat/wxpub/state', + method: 'post', + data:{} + }) + }, + + /** + * 微信绑定用户加入公司需要state参数,防止crfs攻击 + * @param {joinUserid:'需要绑定微信的用户编号',joinUsername:'用户名称',sendUserid:'发起邀请人编号',sendUsername:'发起邀请人姓名'} + * @returns + */ + getBindTpaState: (params) => { + return axios({ + url: '/tpa/bind/wechat/wxpub/state', + method: 'post', + data:params + }) + }, +} + +export default funcs + + diff --git a/src/api/mdp_pub/mdp_config.js b/src/api/mdp_pub/mdp_config.js new file mode 100644 index 0000000..7ff02ba --- /dev/null +++ b/src/api/mdp_pub/mdp_config.js @@ -0,0 +1,121 @@ +/** + * BASE_API:对应api网关的外网访问地址,在config/dev.env.js 和 config/prod.env.js 中配置, + * context:应用的上下文路径,即spring boot中的server.context-path,如果server.context-path为空,则取applicationName + * api的调用一般是 /${BASE_API}/${context}/${具体的后端服务路径} + */ + +var sysName="唛盟项目管理系统";//系统名称,用于展示 + +export default { + //登录相关 + getOauth2LoginContext:function(){ + return "oauth2client" + }, + //短信相关 + getSmsContext: function() { + return 'sms' + }, + // 图片内容服务api路径 + getArcContext: function() { + return 'arc' + }, + + // 图片内容服务api路径 + getFormContext: function() { + return 'form' + }, + // 工作流api路径 + getWorkflowContext: function() { + return 'workflow' + }, + // 协同办公系统api路径 + getOaContext: function() { + return 'oa' + }, + //项目管理 + getXmContext: function(){ + return 'xm' + }, + //即时通讯 + getImContext:function(){ + return 'im' + }, + //付款 + getPayContext:function() { + return 'tpa' + }, + //模块订单 + getMoContext(){ + return 'sys' + }, + // 系统管理api路径 + getSysContext: function() { + return 'sys' + }, + getTpaContext: function(){ + return 'tpa' + }, + // 商城管理后台api路径 + getMallmContext: function() { + return 'mallm' + }, + // 图片内容首页路径 + getArcIndexPath: function() { + return '/arc/arc/index.html' + }, + // 图片展示或下载路径 + getArcFileUploadBasePath: function() { + return window.location.protocol + '//' + window.location.host + '/api/' + process.env.VERSION + '/arc/arc' + // return process.env.BASE_API+'/arc/arc' + }, + //excel上传路径 + getExcelUploadBasePath:function(){ + return window.location.protocol + '//' + window.location.host + '/api/' + process.env.VERSION + '/oa/oa' + }, + // 图片展示或下载路径 + getArcImagePath: function() { + return window.location.protocol + '//' + window.location.host + '/api/' + process.env.VERSION + '/arc/arc' + // return process.env.BASE_API+'/arc/arc' + }, + // 系统管理首页路径 + getSysIndexPath: function() { + return '/sys/sys/index.html' + }, + // 商城管理后台首页路径 + getMallmIndexPath: function() { + return '/mallm/mallm/index.html' + }, + getWorkFlowEditorUrl: function() { + return '/workflow/' + process.env.VERSION + '/editor/editor/indexIframe.html' + }, + + //当前系统域名 + getBaseDomainUrl:function(){ + var curlDomain=window.location.protocol+"//"+window.location.host; // 返回https://mp.csdn.net + return curlDomain + }, + getFixedDomain:function(){ + return "https://www.maimengcloud.com" + }, + //系统名称 + getSysName: function() { + return sysName + }, + getWxpubConfig:function(){ + var config={ + appid:'wx2671d5db8346b6fc', + appname:'唛盟项目管理平台', + appType:'wxopen', + scope:'snsapi_login' + } + return config; + }, + /** + * 本系统支持的动态组件编号列表 + * @returns + */ + getSupportComponents:function(){ + return ['myFocus'] + } + +} diff --git a/src/api/qiniu.js b/src/api/qiniu.js deleted file mode 100644 index a037584..0000000 --- a/src/api/qiniu.js +++ /dev/null @@ -1,8 +0,0 @@ -import request from '@/utils/request' - -export function getToken() { - return request({ - url: '/qiniu/upload/token', // 假地址 自行替换 - method: 'get' - }) -} diff --git a/src/api/remoteSearch.js b/src/api/remoteSearch.js deleted file mode 100644 index f279278..0000000 --- a/src/api/remoteSearch.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -export function userSearch(name) { - return request({ - url: '/search/user', - method: 'get', - params: { name } - }) -} diff --git a/src/api/sms/sms.js b/src/api/sms/sms.js index 026f654..87d2eb5 100644 --- a/src/api/sms/sms.js +++ b/src/api/sms/sms.js @@ -1,15 +1,21 @@ -import axios from '@/utils/request' +import axiosAuth from '@/utils/request' +import axios from '@/utils/requestNoAuth'//免登录访问 -import config from '@/common/config' -let base=config.getSmsBasePath(); +import config from '@/api/mdp_pub/mdp_config' + +let base=config.getSmsContext(); /** * 发送短信验证码、验证短信验证码接口 **/ + +//发送短信验证码 +export const sendNoAuthSmsCode = params => { return axios.post(`${base}/sms/sendSmsCode`, params); }; + //发送短信验证码 -export const sendSmsCode = params => { return axios.post(`${base}/sms/sendSmsCode`, params); }; +export const sendSmsCode = params => { return axiosAuth.post(`${base}/sms/sendSmsCode`, params); }; //验证短信验证码 -export const validateSmsCode = params => { return axios.post(`${base}/sms/validateSmsCode`, params); }; \ No newline at end of file +export const validateSmsCode = params => { return axiosAuth.post(`${base}/sms/validateSmsCode`, params); }; \ No newline at end of file diff --git a/src/api/transaction.js b/src/api/transaction.js deleted file mode 100644 index dfe6439..0000000 --- a/src/api/transaction.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -export function fetchList(query) { - return request({ - url: '/transaction/list', - method: 'get', - params: query - }) -} diff --git a/src/assets/image/datav_bg2.png b/src/assets/image/datav_bg2.png new file mode 100644 index 0000000..d393f2b Binary files /dev/null and b/src/assets/image/datav_bg2.png differ diff --git a/src/assets/image/goodImgNoShow.png b/src/assets/image/goodImgNoShow.png new file mode 100644 index 0000000..bde9b92 Binary files /dev/null and b/src/assets/image/goodImgNoShow.png differ diff --git a/src/assets/image/image_not_found_small.jpg b/src/assets/image/image_not_found_small.jpg new file mode 100644 index 0000000..947364d Binary files /dev/null and b/src/assets/image/image_not_found_small.jpg differ diff --git a/src/assets/image/login_bg.png b/src/assets/image/login_bg.png new file mode 100644 index 0000000..2ac0276 Binary files /dev/null and b/src/assets/image/login_bg.png differ diff --git a/src/assets/image/login_bg2.png b/src/assets/image/login_bg2.png new file mode 100644 index 0000000..6c27af3 Binary files /dev/null and b/src/assets/image/login_bg2.png differ diff --git a/src/assets/image/logo_cicle.png b/src/assets/image/logo_cicle.png new file mode 100644 index 0000000..6bc1767 Binary files /dev/null and b/src/assets/image/logo_cicle.png differ diff --git a/src/assets/image/module/alipay.png b/src/assets/image/module/alipay.png new file mode 100644 index 0000000..c7b5c59 Binary files /dev/null and b/src/assets/image/module/alipay.png differ diff --git a/src/assets/image/module/hot.png b/src/assets/image/module/hot.png new file mode 100644 index 0000000..9f1d29d Binary files /dev/null and b/src/assets/image/module/hot.png differ diff --git a/src/assets/image/module/mall/mall_marketing.png b/src/assets/image/module/mall/mall_marketing.png new file mode 100644 index 0000000..d0ed9b0 Binary files /dev/null and b/src/assets/image/module/mall/mall_marketing.png differ diff --git a/src/assets/image/module/mall/mall_online_retailers.png b/src/assets/image/module/mall/mall_online_retailers.png new file mode 100644 index 0000000..6e0f45f Binary files /dev/null and b/src/assets/image/module/mall/mall_online_retailers.png differ diff --git a/src/assets/image/module/mo_enterprise.png b/src/assets/image/module/mo_enterprise.png new file mode 100644 index 0000000..b210bc2 Binary files /dev/null and b/src/assets/image/module/mo_enterprise.png differ diff --git a/src/assets/image/module/mo_flagship.png b/src/assets/image/module/mo_flagship.png new file mode 100644 index 0000000..fec6a78 Binary files /dev/null and b/src/assets/image/module/mo_flagship.png differ diff --git a/src/assets/image/module/oa/mo_office.png b/src/assets/image/module/oa/mo_office.png new file mode 100644 index 0000000..d39e2d4 Binary files /dev/null and b/src/assets/image/module/oa/mo_office.png differ diff --git a/src/assets/image/module/oa/oa_KPI.png b/src/assets/image/module/oa/oa_KPI.png new file mode 100644 index 0000000..39566a8 Binary files /dev/null and b/src/assets/image/module/oa/oa_KPI.png differ diff --git a/src/assets/image/module/oa/oa_Office_supplies.png b/src/assets/image/module/oa/oa_Office_supplies.png new file mode 100644 index 0000000..1834aa3 Binary files /dev/null and b/src/assets/image/module/oa/oa_Office_supplies.png differ diff --git a/src/assets/image/module/oa/oa_archives.png b/src/assets/image/module/oa/oa_archives.png new file mode 100644 index 0000000..0f2597a Binary files /dev/null and b/src/assets/image/module/oa/oa_archives.png differ diff --git a/src/assets/image/module/oa/oa_assets.png b/src/assets/image/module/oa/oa_assets.png new file mode 100644 index 0000000..21561ae Binary files /dev/null and b/src/assets/image/module/oa/oa_assets.png differ diff --git a/src/assets/image/module/oa/oa_car.png b/src/assets/image/module/oa/oa_car.png new file mode 100644 index 0000000..5b602c0 Binary files /dev/null and b/src/assets/image/module/oa/oa_car.png differ diff --git a/src/assets/image/module/oa/oa_clock_in.png b/src/assets/image/module/oa/oa_clock_in.png new file mode 100644 index 0000000..ca10e91 Binary files /dev/null and b/src/assets/image/module/oa/oa_clock_in.png differ diff --git a/src/assets/image/module/oa/oa_content.png b/src/assets/image/module/oa/oa_content.png new file mode 100644 index 0000000..8d8dce5 Binary files /dev/null and b/src/assets/image/module/oa/oa_content.png differ diff --git a/src/assets/image/module/oa/oa_contract.png b/src/assets/image/module/oa/oa_contract.png new file mode 100644 index 0000000..31d5fce Binary files /dev/null and b/src/assets/image/module/oa/oa_contract.png differ diff --git a/src/assets/image/module/oa/oa_customer.png b/src/assets/image/module/oa/oa_customer.png new file mode 100644 index 0000000..afa8289 Binary files /dev/null and b/src/assets/image/module/oa/oa_customer.png differ diff --git a/src/assets/image/module/oa/oa_finance.png b/src/assets/image/module/oa/oa_finance.png new file mode 100644 index 0000000..bb0cf56 Binary files /dev/null and b/src/assets/image/module/oa/oa_finance.png differ diff --git a/src/assets/image/module/oa/oa_meeting.png b/src/assets/image/module/oa/oa_meeting.png new file mode 100644 index 0000000..b851339 Binary files /dev/null and b/src/assets/image/module/oa/oa_meeting.png differ diff --git a/src/assets/image/module/oa/oa_org.png b/src/assets/image/module/oa/oa_org.png new file mode 100644 index 0000000..e17fa7f Binary files /dev/null and b/src/assets/image/module/oa/oa_org.png differ diff --git a/src/assets/image/module/oa/oa_schedule.png b/src/assets/image/module/oa/oa_schedule.png new file mode 100644 index 0000000..a2110ef Binary files /dev/null and b/src/assets/image/module/oa/oa_schedule.png differ diff --git a/src/assets/image/module/oa/oa_seal_center.png b/src/assets/image/module/oa/oa_seal_center.png new file mode 100644 index 0000000..b7c8fd0 Binary files /dev/null and b/src/assets/image/module/oa/oa_seal_center.png differ diff --git a/src/assets/image/module/oa/oa_supervise.png b/src/assets/image/module/oa/oa_supervise.png new file mode 100644 index 0000000..c9e99c5 Binary files /dev/null and b/src/assets/image/module/oa/oa_supervise.png differ diff --git a/src/assets/image/module/qq.png b/src/assets/image/module/qq.png new file mode 100644 index 0000000..c0e8350 Binary files /dev/null and b/src/assets/image/module/qq.png differ diff --git a/src/assets/image/module/weixin.png b/src/assets/image/module/weixin.png new file mode 100644 index 0000000..df923af Binary files /dev/null and b/src/assets/image/module/weixin.png differ diff --git a/src/assets/image/module/xm/mo_org.png b/src/assets/image/module/xm/mo_org.png new file mode 100644 index 0000000..e17fa7f Binary files /dev/null and b/src/assets/image/module/xm/mo_org.png differ diff --git a/src/assets/image/module/xm/xm_Efficiency_management.png b/src/assets/image/module/xm/xm_Efficiency_management.png new file mode 100644 index 0000000..b0710c4 Binary files /dev/null and b/src/assets/image/module/xm/xm_Efficiency_management.png differ diff --git a/src/assets/image/module/xm/xm_crowd-sourcing.png b/src/assets/image/module/xm/xm_crowd-sourcing.png new file mode 100644 index 0000000..99b0584 Binary files /dev/null and b/src/assets/image/module/xm/xm_crowd-sourcing.png differ diff --git a/src/assets/image/module/xm/xm_development.png b/src/assets/image/module/xm/xm_development.png new file mode 100644 index 0000000..854ad57 Binary files /dev/null and b/src/assets/image/module/xm/xm_development.png differ diff --git a/src/assets/image/module/xm/xm_flow_line.png b/src/assets/image/module/xm/xm_flow_line.png new file mode 100644 index 0000000..a7034dd Binary files /dev/null and b/src/assets/image/module/xm/xm_flow_line.png differ diff --git a/src/assets/image/module/xm/xm_gongshi.png b/src/assets/image/module/xm/xm_gongshi.png new file mode 100644 index 0000000..5611aef Binary files /dev/null and b/src/assets/image/module/xm/xm_gongshi.png differ diff --git a/src/assets/image/module/xm/xm_product_management.png b/src/assets/image/module/xm/xm_product_management.png new file mode 100644 index 0000000..66ae7de Binary files /dev/null and b/src/assets/image/module/xm/xm_product_management.png differ diff --git a/src/assets/image/module/xm/xm_project_management.png b/src/assets/image/module/xm/xm_project_management.png new file mode 100644 index 0000000..558c9ba Binary files /dev/null and b/src/assets/image/module/xm/xm_project_management.png differ diff --git a/src/assets/image/module/xm/xm_test.png b/src/assets/image/module/xm/xm_test.png new file mode 100644 index 0000000..dcaf5b6 Binary files /dev/null and b/src/assets/image/module/xm/xm_test.png differ diff --git a/src/assets/image/platform/email.png b/src/assets/image/platform/email.png new file mode 100644 index 0000000..72601fb Binary files /dev/null and b/src/assets/image/platform/email.png differ diff --git a/src/assets/image/platform/ew_code.png b/src/assets/image/platform/ew_code.png new file mode 100644 index 0000000..94477e7 Binary files /dev/null and b/src/assets/image/platform/ew_code.png differ diff --git a/src/assets/image/platform/module-arc.png b/src/assets/image/platform/module-arc.png new file mode 100644 index 0000000..8f61cca Binary files /dev/null and b/src/assets/image/platform/module-arc.png differ diff --git a/src/assets/image/platform/module-audit.png b/src/assets/image/platform/module-audit.png new file mode 100644 index 0000000..7dad5b0 Binary files /dev/null and b/src/assets/image/platform/module-audit.png differ diff --git a/src/assets/image/platform/module-code.png b/src/assets/image/platform/module-code.png new file mode 100644 index 0000000..4072391 Binary files /dev/null and b/src/assets/image/platform/module-code.png differ diff --git a/src/assets/image/platform/module-crm.png b/src/assets/image/platform/module-crm.png new file mode 100644 index 0000000..ad134c2 Binary files /dev/null and b/src/assets/image/platform/module-crm.png differ diff --git a/src/assets/image/platform/module-fake.png b/src/assets/image/platform/module-fake.png new file mode 100644 index 0000000..d565a76 Binary files /dev/null and b/src/assets/image/platform/module-fake.png differ diff --git a/src/assets/image/platform/module-help.png b/src/assets/image/platform/module-help.png new file mode 100644 index 0000000..4f36db7 Binary files /dev/null and b/src/assets/image/platform/module-help.png differ diff --git a/src/assets/image/platform/module-image.png b/src/assets/image/platform/module-image.png new file mode 100644 index 0000000..438caf8 Binary files /dev/null and b/src/assets/image/platform/module-image.png differ diff --git a/src/assets/image/platform/module-iteration.png b/src/assets/image/platform/module-iteration.png new file mode 100644 index 0000000..9b10b6a Binary files /dev/null and b/src/assets/image/platform/module-iteration.png differ diff --git a/src/assets/image/platform/module-maim.png b/src/assets/image/platform/module-maim.png new file mode 100644 index 0000000..ddd1338 Binary files /dev/null and b/src/assets/image/platform/module-maim.png differ diff --git a/src/assets/image/platform/module-mall.png b/src/assets/image/platform/module-mall.png new file mode 100644 index 0000000..f1576ad Binary files /dev/null and b/src/assets/image/platform/module-mall.png differ diff --git a/src/assets/image/platform/module-mdp.png b/src/assets/image/platform/module-mdp.png new file mode 100644 index 0000000..4072391 Binary files /dev/null and b/src/assets/image/platform/module-mdp.png differ diff --git a/src/assets/image/platform/module-trace.png b/src/assets/image/platform/module-trace.png new file mode 100644 index 0000000..a52ea1c Binary files /dev/null and b/src/assets/image/platform/module-trace.png differ diff --git a/src/assets/image/platform/module-video.png b/src/assets/image/platform/module-video.png new file mode 100644 index 0000000..3a72bff Binary files /dev/null and b/src/assets/image/platform/module-video.png differ diff --git a/src/assets/image/platform/oa.png b/src/assets/image/platform/oa.png new file mode 100644 index 0000000..5c9d622 Binary files /dev/null and b/src/assets/image/platform/oa.png differ diff --git a/src/assets/image/platform/phone.png b/src/assets/image/platform/phone.png new file mode 100644 index 0000000..be20439 Binary files /dev/null and b/src/assets/image/platform/phone.png differ diff --git a/src/assets/image/sys/invite/email-0.png b/src/assets/image/sys/invite/email-0.png new file mode 100644 index 0000000..bcefadf Binary files /dev/null and b/src/assets/image/sys/invite/email-0.png differ diff --git a/src/assets/image/sys/invite/email-1.png b/src/assets/image/sys/invite/email-1.png new file mode 100644 index 0000000..703ed25 Binary files /dev/null and b/src/assets/image/sys/invite/email-1.png differ diff --git a/src/assets/image/sys/invite/ew-code-0.png b/src/assets/image/sys/invite/ew-code-0.png new file mode 100644 index 0000000..850dfe8 Binary files /dev/null and b/src/assets/image/sys/invite/ew-code-0.png differ diff --git a/src/assets/image/sys/invite/ew-code-1.png b/src/assets/image/sys/invite/ew-code-1.png new file mode 100644 index 0000000..9b03712 Binary files /dev/null and b/src/assets/image/sys/invite/ew-code-1.png differ diff --git a/src/assets/image/sys/invite/phone-0.png b/src/assets/image/sys/invite/phone-0.png new file mode 100644 index 0000000..d13c900 Binary files /dev/null and b/src/assets/image/sys/invite/phone-0.png differ diff --git a/src/assets/image/sys/invite/phone-1.png b/src/assets/image/sys/invite/phone-1.png new file mode 100644 index 0000000..9b0ed40 Binary files /dev/null and b/src/assets/image/sys/invite/phone-1.png differ diff --git a/src/assets/image/yxin_login_backgroup_pc.png b/src/assets/image/yxin_login_backgroup_pc.png deleted file mode 100644 index e5353e7..0000000 Binary files a/src/assets/image/yxin_login_backgroup_pc.png and /dev/null differ diff --git a/src/assets/image/zhkj_logo.png b/src/assets/image/zhkj_logo.png deleted file mode 100644 index b8ff1db..0000000 Binary files a/src/assets/image/zhkj_logo.png and /dev/null differ diff --git a/src/assets/image/背景1.png b/src/assets/image/背景1.png new file mode 100644 index 0000000..6b3748b Binary files /dev/null and b/src/assets/image/背景1.png differ diff --git a/src/assets/shopDecoration/NoticeBar.png b/src/assets/shopDecoration/NoticeBar.png new file mode 100644 index 0000000..54bbad9 Binary files /dev/null and b/src/assets/shopDecoration/NoticeBar.png differ diff --git a/src/assets/shopDecoration/bottom.png b/src/assets/shopDecoration/bottom.png new file mode 100644 index 0000000..3acb27b Binary files /dev/null and b/src/assets/shopDecoration/bottom.png differ diff --git a/src/assets/shopDecoration/layoutFive.png b/src/assets/shopDecoration/layoutFive.png new file mode 100644 index 0000000..c5749a7 Binary files /dev/null and b/src/assets/shopDecoration/layoutFive.png differ diff --git a/src/assets/shopDecoration/layoutFour.png b/src/assets/shopDecoration/layoutFour.png new file mode 100644 index 0000000..71aff07 Binary files /dev/null and b/src/assets/shopDecoration/layoutFour.png differ diff --git a/src/assets/shopDecoration/layoutOne.png b/src/assets/shopDecoration/layoutOne.png new file mode 100644 index 0000000..5f285af Binary files /dev/null and b/src/assets/shopDecoration/layoutOne.png differ diff --git a/src/assets/shopDecoration/layoutSix.png b/src/assets/shopDecoration/layoutSix.png new file mode 100644 index 0000000..5cb67d4 Binary files /dev/null and b/src/assets/shopDecoration/layoutSix.png differ diff --git a/src/assets/shopDecoration/layoutThree.png b/src/assets/shopDecoration/layoutThree.png new file mode 100644 index 0000000..26fe520 Binary files /dev/null and b/src/assets/shopDecoration/layoutThree.png differ diff --git a/src/assets/shopDecoration/layoutTwo.png b/src/assets/shopDecoration/layoutTwo.png new file mode 100644 index 0000000..16cb085 Binary files /dev/null and b/src/assets/shopDecoration/layoutTwo.png differ diff --git a/src/assets/shopDecoration/top.png b/src/assets/shopDecoration/top.png new file mode 100644 index 0000000..3acac60 Binary files /dev/null and b/src/assets/shopDecoration/top.png differ diff --git a/src/common/config.js b/src/common/config.js index 046d609..08ca0af 100644 --- a/src/common/config.js +++ b/src/common/config.js @@ -1,69 +1,97 @@ /** * BASE_API:对应api网关的外网访问地址,在config/dev.env.js 和 config/prod.env.js 中配置, * applicationName:微服务编号,即spring boot中的spring.application.name - * contextPath:应用的上下文路径,即spring boot中的server.context-path + * contextPath:应用的上下文路径,即spring boot中的server.context-path * api的调用一般是 /${BASE_API}/${applicationName}/${contextPath}/${具体的后端服务路径} */ - -var contextName="workflow"; -var sysContextName="workflow";//系统管理子模块 -var sysName="流程管理";//当前系统名称 -var arcUrlPrefix="workflow/"; -var workFlowEditorUrl="https://www.qingqinkj.com/workflow/editor/indexIframe.html";//工作流流程编辑器 -export default { - getOauth2LoginBasePath:function(){ - return "/oauth2client" - }, - getSmsBasePath:function(){ - return "/sms" - }, - //图片内容服务api路径 - getArcBasePath: function(){ - return '/arc/arc' - }, - //商城后台 - getMallmBasePath: function(){ - return '/mallm/mallm' - }, - //图片内容首页路径 - getArcIndexPath: function(){ - return '/arc/arc/index.html' - }, - //系统管理api路径 - getSysBasePath: function(){ - return '/sys/sys'; - }, - //系统管理首页路径 - getSysIndexPath: function(){ - return '/sys/sys/index.html'; - }, - getSysContextName: function () { - return sysContextName; - }, - getContextName: function () { - return contextName; - }, - getSysName: function () { - return sysName; - }, - getWorkFlowEditorUrl: function () { - return workFlowEditorUrl; - }, - getArcUrlPrefix(){ - return arcUrlPrefix; - }, - getWorkflowBasePath(){ - return "/workflow/workflow"; - }, - getFormBasePath(){ - return "/form/form"; - }, - getTopDomain(){ - return "http://www.qingqinkj.com" - }, - //图片展示或下载路径 - getArcImagePath: function(){ - return 'https://www.qingqinkj.com/arc' - }, -}; \ No newline at end of file +var sysName="系统管理";//系统名称,用于展示 + +export default { + getOauth2LoginBasePath:function(){ + return "/oauth2client" + }, + + getBaseDomainUrl:function(){ + var curlDomain=window.location.protocol+"//"+window.location.host; // 返回https://mp.csdn.net + return curlDomain + }, + + getSysName: function() { + return sysName + }, + getSmsBasePath: function() { + return '/sms/sms' + }, + // 图片内容服务api路径 + getArcBasePath: function() { + return '/arc' + }, + + // 图片内容服务api路径 + getFormBasePath: function() { + return '/form' + }, + // 工作流api路径 + getWorkflowBasePath: function() { + return '/workflow' + }, + // 协同办公系统api路径 + getOaBasePath: function() { + return '/oa/oa' + }, + // 图片内容首页路径 + getArcIndexPath: function() { + return '/arc/arc/index.html' + }, + // 图片展示或下载路径 + getArcFileUploadBasePath: function() { + return window.location.protocol + '//' + window.location.host + '/api/' + process.env.VERSION + '/arc/arc' + // return process.env.BASE_API+'/arc/arc' + }, + //excel上传路径 + getExcelUploadBasePath:function(){ + return window.location.protocol + '//' + window.location.host + '/api/' + process.env.VERSION + '/oa/oa' + }, + // 图片展示或下载路径 + getArcImagePath: function() { + return window.location.protocol + '//' + window.location.host + '/api/' + process.env.VERSION + '/arc/arc' + // return process.env.BASE_API+'/arc/arc' + }, + // 系统管理api路径 + getSysBasePath: function() { + return '/sys/sys' + }, + // 系统管理首页路径 + getSysIndexPath: function() { + return '/sys/sys/index.html' + }, + // 商城管理后台api路径 + getMallmBasePath: function() { + return '/mallm/mallm' + }, + // 商城管理后台首页路径 + getMallmIndexPath: function() { + return '/mallm/mallm/index.html' + }, + getWorkFlowEditorUrl: function() { + return '/workflow/' + process.env.VERSION + '/editor/editor/indexIframe.html' + }, + getXmBasePath: function(){ + return '/xm/xm' + }, + getCoreBasePath: function(){ + return '/xm/xm' + }, + getImBasePath:function(){ + return '/im/im' + }, + getPayBasePath:function() { + return '/tpa/pay' + }, + getMoBasePath(){ + return '/sys/sys/mo/' + } + + +} diff --git a/src/common/js/dateUtil.js b/src/common/js/dateUtil.js index 453ff28..1f04b0a 100644 --- a/src/common/js/dateUtil.js +++ b/src/common/js/dateUtil.js @@ -1,15 +1,6 @@ /** * 获取本周、本季度、本月、上月的开始日期、结束日期 */ - -var SIGN_REGEXP = /([yMdHhsm])(\1*)/g; -var DEFAULT_PATTERN = 'yyyy-MM-dd HH:mm:ss'; -function padding(s, len) { - var len = len - (s + '').length; - for (var i = 0; i < len; i++) { s = '0' + s; } - return s; -}; - var now = new Date(); //当前日期 var nowDayOfWeek = now.getDay(); //今天本周的第几天 var nowDay = now.getDate(); //当前日 @@ -20,45 +11,20 @@ lastMonthDate.setDate(1); lastMonthDate.setMonth(lastMonthDate.getMonth() - 1); var lastYear = lastMonthDate.getFullYear(); var lastMonth = lastMonthDate.getMonth(); - export default { - formatDate: function (date, pattern) { - pattern = pattern || DEFAULT_PATTERN; - return pattern.replace(SIGN_REGEXP, function ($0) { - switch ($0.charAt(0)) { - case 'y': return padding(date.getFullYear(), $0.length); - case 'M': return padding(date.getMonth() + 1, $0.length); - case 'd': return padding(date.getDate(), $0.length); - case 'w': return date.getDay() + 1; - case 'H': return padding(date.getHours(), $0.length); - case 'h': return padding(date.getHours(), $0.length); - case 'm': return padding(date.getMinutes(), $0.length); - case 's': return padding(date.getSeconds(), $0.length); - } - }); - }, - parse: function (dateString, pattern) { - var matchs1 = pattern.match(SIGN_REGEXP); - var matchs2 = dateString.match(/(\d)+/g); - if (matchs1.length == matchs2.length) { - var _date = new Date(1970, 0, 1); - for (var i = 0; i < matchs1.length; i++) { - var _int = parseInt(matchs2[i]); - var sign = matchs1[i]; - switch (sign.charAt(0)) { - case 'y': _date.setFullYear(_int); break; - case 'M': _date.setMonth(_int - 1); break; - case 'd': _date.setDate(_int); break; - case 'H': _date.setHours(_int); break; - case 'h': _date.setHours(_int); break; - case 'm': _date.setMinutes(_int); break; - case 's': _date.setSeconds(_int); break; - } - } - return _date; - } - return null; - }, + //格式化日期:yyyy-MM-dd + formatDate:function(date) { + var myyear = date.getFullYear(); + var mymonth = date.getMonth() + 1; + var myweekday = date.getDate(); + if (mymonth < 10) { + mymonth = "0" + mymonth; + } + if (myweekday < 10) { + myweekday = "0" + myweekday; + } + return (myyear + "-" + mymonth + "-" + myweekday); + }, //获得某月的天数 getMonthDays:function(myMonth) { var monthStartDate = new Date(nowYear, myMonth, 1); @@ -154,19 +120,58 @@ export default { var yearEndDate = new Date(nowYear-1, 11, getMonthDays(11),23,59,59,999); return yearEndDate; }, - //获取当前日期格式为:YYYY-MM-DD 00:00:00 - getDateAfterToday:function(){ - var date= new Date(nowYear, nowMonth, nowDay,0,0,0,0) - return this.formatDate(date); - }, - //获得 n 天 后的时间 - getStringDateAfterToday:function( n ){ - var date= new Date(nowYear, nowMonth, nowDay+n,0,0,0,0) - return this.formatDate(date); - }, - ////获取当前日期格式为:YYYY-MM-DD hh:mm:ss - getDateTime:function(){ - var date= new Date() - return this.formatDate(date); - } + + + + + // 近一周 + getNearWeekStartDate(){ + let time = []; + let start = new Date(); + let end = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7) + time.push(start); + time.push(end); + return time; + }, + //近一个月 + getNearMonthStartDate(){ + let time = []; + let start = new Date(); + let end = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30) + time.push(start); + time.push(end); + return time; + }, + //近三个月 + getNearThreeMonthStartDate(){ + let time = []; + let start = new Date(); + let end = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90) + time.push(start); + time.push(end); + return time; + }, + //近半年 + getNearHalfYearStartDate(){ + let time = []; + let start = new Date(); + let end = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 180) + time.push(start); + time.push(end); + return time; + }, + //近一年 + getNearYearStartDate(){ + let time = []; + let start = new Date(); + let end = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 365) + time.push(start); + time.push(end); + return time; + }, } \ No newline at end of file diff --git a/src/common/js/jsmind.css b/src/common/js/jsmind.css new file mode 100644 index 0000000..5f24177 --- /dev/null +++ b/src/common/js/jsmind.css @@ -0,0 +1,224 @@ +/* + * Released under BSD License + * Copyright (c) 2014-2015 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +/* important section */ +.jsmind-inner{position:relative;overflow:auto;width:100%;height:100%;}/*box-shadow:0 0 2px #000;*/ +.jsmind-inner{ + moz-user-select:-moz-none; + -moz-user-select:none; + -o-user-select:none; + -khtml-user-select:none; + -webkit-user-select:none; + -ms-user-select:none; + user-select:none; +} + +/* z-index:1 */ +svg.jsmind{position:absolute;z-index:1;} +canvas.jsmind{position:absolute;z-index:1;} + +/* z-index:2 */ +jmnodes{position:absolute;z-index:2;background-color:rgba(0,0,0,0);}/*background color is necessary*/ +jmnode{position:absolute;cursor:default;max-width:400px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} +jmexpander{position:absolute;width:11px;height:11px;display:block;overflow:hidden;line-height:12px;font-size:12px;text-align:center;border-radius:6px;border-width:1px;border-style:solid;cursor:pointer;} + +/* default theme */ +jmnode{padding:10px;background-color:#fff;color:#333;border-radius:5px;box-shadow:1px 1px 1px #666;font:16px/1.125 Verdana,Arial,Helvetica,sans-serif;} +jmnode:hover{box-shadow:2px 2px 8px #000;background-color:#ebebeb;color:#333;} +jmnode.selected{background-color:#11f;color:#fff;box-shadow:2px 2px 8px #000;} +jmnode.root{font-size:24px;} +jmexpander{border-color:gray;} +jmexpander:hover{border-color:#000;} + +@media screen and (max-device-width: 1024px) { + jmnode{padding:5px;border-radius:3px;font-size:14px;} + jmnode.root{font-size:21px;} +} +/* primary theme */ +jmnodes.theme-primary jmnode{background-color:#428bca;color:#fff;border-color:#357ebd;} +jmnodes.theme-primary jmnode:hover{background-color:#3276b1;border-color:#285e8e;} +jmnodes.theme-primary jmnode.selected{background-color:#f1c40f;color:#fff;} +jmnodes.theme-primary jmnode.root{} +jmnodes.theme-primary jmexpander{} +jmnodes.theme-primary jmexpander:hover{} + +/* warning theme */ +jmnodes.theme-warning jmnode{background-color:#f0ad4e;border-color:#eea236;color:#fff;} +jmnodes.theme-warning jmnode:hover{background-color:#ed9c28;border-color:#d58512;} +jmnodes.theme-warning jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-warning jmnode.root{} +jmnodes.theme-warning jmexpander{} +jmnodes.theme-warning jmexpander:hover{} + +/* danger theme */ +jmnodes.theme-danger jmnode{background-color:#d9534f;border-color:#d43f3a;color:#fff;} +jmnodes.theme-danger jmnode:hover{background-color:#d2322d;border-color:#ac2925;} +jmnodes.theme-danger jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-danger jmnode.root{} +jmnodes.theme-danger jmexpander{} +jmnodes.theme-danger jmexpander:hover{} + +/* success theme */ +jmnodes.theme-success jmnode{background-color:#5cb85c;border-color:#4cae4c;color:#fff;} +jmnodes.theme-success jmnode:hover{background-color:#47a447;border-color:#398439;} +jmnodes.theme-success jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-success jmnode.root{} +jmnodes.theme-success jmexpander{} +jmnodes.theme-success jmexpander:hover{} + +/* info theme */ +jmnodes.theme-info jmnode{background-color:#5dc0de;border-color:#46b8da;;color:#fff;} +jmnodes.theme-info jmnode:hover{background-color:#39b3d7;border-color:#269abc;} +jmnodes.theme-info jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-info jmnode.root{} +jmnodes.theme-info jmexpander{} +jmnodes.theme-info jmexpander:hover{} + +/* greensea theme */ +jmnodes.theme-greensea jmnode{background-color:#1abc9c;color:#fff;} +jmnodes.theme-greensea jmnode:hover{background-color:#16a085;} +jmnodes.theme-greensea jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-greensea jmnode.root{} +jmnodes.theme-greensea jmexpander{} +jmnodes.theme-greensea jmexpander:hover{} + +/* nephrite theme */ +jmnodes.theme-nephrite jmnode{background-color:#2ecc71;color:#fff;} +jmnodes.theme-nephrite jmnode:hover{background-color:#27ae60;} +jmnodes.theme-nephrite jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-nephrite jmnode.root{} +jmnodes.theme-nephrite jmexpander{} +jmnodes.theme-nephrite jmexpander:hover{} + +/* belizehole theme */ +jmnodes.theme-belizehole jmnode{background-color:#3498db;color:#fff;} +jmnodes.theme-belizehole jmnode:hover{background-color:#2980b9;} +jmnodes.theme-belizehole jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-belizehole jmnode.root{} +jmnodes.theme-belizehole jmexpander{} +jmnodes.theme-belizehole jmexpander:hover{} + +/* wisteria theme */ +jmnodes.theme-wisteria jmnode{background-color:#9b59b6;color:#fff;} +jmnodes.theme-wisteria jmnode:hover{background-color:#8e44ad;} +jmnodes.theme-wisteria jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-wisteria jmnode.root{} +jmnodes.theme-wisteria jmexpander{} +jmnodes.theme-wisteria jmexpander:hover{} + +/* asphalt theme */ +jmnodes.theme-asphalt jmnode{background-color:#34495e;color:#fff;} +jmnodes.theme-asphalt jmnode:hover{background-color:#2c3e50;} +jmnodes.theme-asphalt jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-asphalt jmnode.root{} +jmnodes.theme-asphalt jmexpander{} +jmnodes.theme-asphalt jmexpander:hover{} + +/* orange theme */ +jmnodes.theme-orange jmnode{background-color:#f1c40f;color:#fff;} +jmnodes.theme-orange jmnode:hover{background-color:#f39c12;} +jmnodes.theme-orange jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-orange jmnode.root{} +jmnodes.theme-orange jmexpander{} +jmnodes.theme-orange jmexpander:hover{} + +/* pumpkin theme */ +jmnodes.theme-pumpkin jmnode{background-color:#e67e22;color:#fff;} +jmnodes.theme-pumpkin jmnode:hover{background-color:#d35400;} +jmnodes.theme-pumpkin jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-pumpkin jmnode.root{} +jmnodes.theme-pumpkin jmexpander{} +jmnodes.theme-pumpkin jmexpander:hover{} + +/* pomegranate theme */ +jmnodes.theme-pomegranate jmnode{background-color:#e74c3c;color:#fff;} +jmnodes.theme-pomegranate jmnode:hover{background-color:#c0392b;} +jmnodes.theme-pomegranate jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-pomegranate jmnode.root{} +jmnodes.theme-pomegranate jmexpander{} +jmnodes.theme-pomegranate jmexpander:hover{} + +/* clouds theme */ +jmnodes.theme-clouds jmnode{background-color:#ecf0f1;color:#333;} +jmnodes.theme-clouds jmnode:hover{background-color:#bdc3c7;} +jmnodes.theme-clouds jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-clouds jmnode.root{} +jmnodes.theme-clouds jmexpander{} +jmnodes.theme-clouds jmexpander:hover{} + +/* asbestos theme */ +jmnodes.theme-asbestos jmnode{background-color:#95a5a6;color:#fff;} +jmnodes.theme-asbestos jmnode:hover{background-color:#7f8c8d;} +jmnodes.theme-asbestos jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-asbestos jmnode.root{} +jmnodes.theme-asbestos jmexpander{} +jmnodes.theme-asbestos jmexpander:hover{} + + +/* contacter theme */ /* contacter 即是主题名 */ +jmnodes.theme-contacter jmnode{ + font-size: 12px; + visibility: visible; + left: 805px; + top: 348px; + border: 1px solid rgb(241, 241, 241); +}/* 节点样式 */ + +jmnodes.theme-contacter jmnode:hover{ + background-color: #39b3d7; +}/* 鼠标悬停的节点样式 */ + +jmnodes.theme-contacter jmnode.selected{ + +} /* 选中的节点样式 */ + +jmnodes.theme-contacter jmnode.root{ + font-size: 20px; + border: 2px solid #fff; + background-color: #16a085; + color: #fff; +}/* 根节点样式 */ + +jmnodes.theme-contacter jmexpander{ + +}/* 展开/关闭节点的控制点样式 */ + +jmnodes.theme-contacter jmexpander:hover{ + +}/* 鼠标悬停展开/关闭节点的控制点样式 */ + +.nodeCard { + background-color: #fff; + color: #000; +} + +.nodeCard table { + min-width: 400px; +} + +.nodeCard table tr td{ + padding: 5px; +} + +.nodeCard .status span{ + font-size: 10px; + float: right; + min-width: 58px; + color: #ffffff; + /* background-color: #00a3ff; */ + padding: 2px; + border-radius: 25%; + height: 20px; + line-height: 20px; + margin-right: 20px; + text-align: center; +} + +.nodeCard .job { + font-weight: 500; +} \ No newline at end of file diff --git a/src/common/js/jsmind.draggable.js b/src/common/js/jsmind.draggable.js new file mode 100644 index 0000000..4a8e345 --- /dev/null +++ b/src/common/js/jsmind.draggable.js @@ -0,0 +1,350 @@ +/* + * Released under BSD License + * Copyright (c) 2014-2015 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +(function ($w) { + 'use strict'; + var $d = $w.document; + var __name__ = 'jsMind'; + var jsMind = $w[__name__]; + if (!jsMind) { return; } + if (typeof jsMind.draggable != 'undefined') { return; } + + var jdom = jsMind.util.dom; + var clear_selection = 'getSelection' in $w ? function () { + $w.getSelection().removeAllRanges(); + } : function () { + $d.selection.empty(); + }; + + var options = { + line_width: 5, + lookup_delay: 500, + lookup_interval: 80 + }; + + jsMind.draggable = function (jm) { + this.jm = jm; + this.e_canvas = null; + this.canvas_ctx = null; + this.shadow = null; + this.shadow_w = 0; + this.shadow_h = 0; + this.active_node = null; + this.target_node = null; + this.target_direct = null; + this.client_w = 0; + this.client_h = 0; + this.offset_x = 0; + this.offset_y = 0; + this.hlookup_delay = 0; + this.hlookup_timer = 0; + this.capture = false; + this.moved = false; + }; + + jsMind.draggable.prototype = { + init: function () { + this._create_canvas(); + this._create_shadow(); + this._event_bind(); + }, + + resize: function () { + this.jm.view.e_nodes.appendChild(this.shadow); + this.e_canvas.width = this.jm.view.size.w; + this.e_canvas.height = this.jm.view.size.h; + }, + + _create_canvas: function () { + var c = $d.createElement('canvas'); + this.jm.view.e_panel.appendChild(c); + var ctx = c.getContext('2d'); + this.e_canvas = c; + this.canvas_ctx = ctx; + }, + + _create_shadow: function () { + var s = $d.createElement('jmnode'); + s.style.visibility = 'hidden'; + s.style.zIndex = '3'; + s.style.cursor = 'move'; + s.style.opacity = '0.7'; + this.shadow = s; + }, + + reset_shadow: function (el) { + var s = this.shadow.style; + this.shadow.innerHTML = el.innerHTML; + s.left = el.style.left; + s.top = el.style.top; + s.width = el.style.width; + s.height = el.style.height; + s.backgroundImage = el.style.backgroundImage; + s.backgroundSize = el.style.backgroundSize; + s.transform = el.style.transform; + this.shadow_w = this.shadow.clientWidth; + this.shadow_h = this.shadow.clientHeight; + + }, + + show_shadow: function () { + if (!this.moved) { + this.shadow.style.visibility = 'visible'; + } + }, + + hide_shadow: function () { + this.shadow.style.visibility = 'hidden'; + }, + + _magnet_shadow: function (node) { + if (!!node) { + this.canvas_ctx.lineWidth = options.line_width; + this.canvas_ctx.strokeStyle = 'rgba(0,0,0,0.3)'; + this.canvas_ctx.lineCap = 'round'; + this._clear_lines(); + this._canvas_lineto(node.sp.x, node.sp.y, node.np.x, node.np.y); + } + }, + + _clear_lines: function () { + this.canvas_ctx.clearRect(0, 0, this.jm.view.size.w, this.jm.view.size.h); + }, + + _canvas_lineto: function (x1, y1, x2, y2) { + this.canvas_ctx.beginPath(); + this.canvas_ctx.moveTo(x1, y1); + this.canvas_ctx.lineTo(x2, y2); + this.canvas_ctx.stroke(); + }, + + _lookup_close_node: function () { + var root = this.jm.get_root(); + var root_location = root.get_location(); + var root_size = root.get_size(); + var root_x = root_location.x + root_size.w / 2; + + var sw = this.shadow_w; + var sh = this.shadow_h; + var sx = this.shadow.offsetLeft; + var sy = this.shadow.offsetTop; + + var ns, nl; + + var direct = (sx + sw / 2) >= root_x ? + jsMind.direction.right : jsMind.direction.left; + var nodes = this.jm.mind.nodes; + var node = null; + var min_distance = Number.MAX_VALUE; + var distance = 0; + var closest_node = null; + var closest_p = null; + var shadow_p = null; + for (var nodeid in nodes) { + var np, sp; + node = nodes[nodeid]; + if (node.isroot || node.direction == direct) { + if (node.id == this.active_node.id) { + continue; + } + ns = node.get_size(); + nl = node.get_location(); + if (direct == jsMind.direction.right) { + if (sx - nl.x - ns.w <= 0) { continue; } + distance = Math.abs(sx - nl.x - ns.w) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); + np = { x: nl.x + ns.w - options.line_width, y: nl.y + ns.h / 2 }; + sp = { x: sx + options.line_width, y: sy + sh / 2 }; + } else { + if (nl.x - sx - sw <= 0) { continue; } + distance = Math.abs(sx + sw - nl.x) + Math.abs(sy + sh / 2 - nl.y - ns.h / 2); + np = { x: nl.x + options.line_width, y: nl.y + ns.h / 2 }; + sp = { x: sx + sw - options.line_width, y: sy + sh / 2 }; + } + if (distance < min_distance) { + closest_node = node; + closest_p = np; + shadow_p = sp; + min_distance = distance; + } + } + } + var result_node = null; + if (!!closest_node) { + result_node = { + node: closest_node, + direction: direct, + sp: shadow_p, + np: closest_p + }; + } + return result_node; + }, + + lookup_close_node: function () { + var node_data = this._lookup_close_node(); + if (!!node_data) { + this._magnet_shadow(node_data); + this.target_node = node_data.node; + this.target_direct = node_data.direction; + } + }, + + _event_bind: function () { + var jd = this; + var container = this.jm.view.container; + jdom.add_event(container, 'mousedown', function (e) { + var evt = e || event; + jd.dragstart.call(jd, evt); + }); + jdom.add_event(container, 'mousemove', function (e) { + var evt = e || event; + jd.drag.call(jd, evt); + }); + jdom.add_event(container, 'mouseup', function (e) { + var evt = e || event; + jd.dragend.call(jd, evt); + }); + jdom.add_event(container, 'touchstart', function (e) { + var evt = e || event; + jd.dragstart.call(jd, evt); + }); + jdom.add_event(container, 'touchmove', function (e) { + var evt = e || event; + jd.drag.call(jd, evt); + }); + jdom.add_event(container, 'touchend', function (e) { + var evt = e || event; + jd.dragend.call(jd, evt); + }); + }, + + dragstart: function (e) { + if (!this.jm.get_editable()) { return; } + if (this.capture) { return; } + this.active_node = null; + + var jview = this.jm.view; + var el = e.target || event.srcElement; + if (el.tagName.toLowerCase() != 'jmnode') { return; } + var nodeid = jview.get_binded_nodeid(el); + if (!!nodeid) { + var node = this.jm.get_node(nodeid); + if (!node.isroot) { + this.reset_shadow(el); + this.active_node = node; + this.offset_x = (e.clientX || e.touches[0].clientX) - el.offsetLeft; + this.offset_y = (e.clientY || e.touches[0].clientY) - el.offsetTop; + this.client_hw = Math.floor(el.clientWidth / 2); + this.client_hh = Math.floor(el.clientHeight / 2); + if (this.hlookup_delay != 0) { + $w.clearTimeout(this.hlookup_delay); + } + if (this.hlookup_timer != 0) { + $w.clearInterval(this.hlookup_timer); + } + var jd = this; + this.hlookup_delay = $w.setTimeout(function () { + jd.hlookup_delay = 0; + jd.hlookup_timer = $w.setInterval(function () { + jd.lookup_close_node.call(jd); + }, options.lookup_interval); + }, options.lookup_delay); + this.capture = true; + } + } + }, + + drag: function (e) { + if (!this.jm.get_editable()) { return; } + if (this.capture) { + e.preventDefault(); + this.show_shadow(); + this.moved = true; + clear_selection(); + var px = (e.clientX || e.touches[0].clientX) - this.offset_x; + var py = (e.clientY || e.touches[0].clientY) - this.offset_y; + var cx = px + this.client_hw; + var cy = py + this.client_hh; + this.shadow.style.left = px + 'px'; + this.shadow.style.top = py + 'px'; + clear_selection(); + } + }, + + dragend: function (e) { + if (!this.jm.get_editable()) { return; } + if (this.capture) { + if (this.hlookup_delay != 0) { + $w.clearTimeout(this.hlookup_delay); + this.hlookup_delay = 0; + this._clear_lines(); + } + if (this.hlookup_timer != 0) { + $w.clearInterval(this.hlookup_timer); + this.hlookup_timer = 0; + this._clear_lines(); + } + if (this.moved) { + var src_node = this.active_node; + var target_node = this.target_node; + var target_direct = this.target_direct; + this.move_node(src_node, target_node, target_direct); + } + this.hide_shadow(); + } + this.moved = false; + this.capture = false; + }, + + move_node: function (src_node, target_node, target_direct) { + var shadow_h = this.shadow.offsetTop; + if (!!target_node && !!src_node && !jsMind.node.inherited(src_node, target_node)) { + // lookup before_node + var sibling_nodes = target_node.children; + var sc = sibling_nodes.length; + var node = null; + var delta_y = Number.MAX_VALUE; + var node_before = null; + var beforeid = '_last_'; + while (sc--) { + node = sibling_nodes[sc]; + if (node.direction == target_direct && node.id != src_node.id) { + var dy = node.get_location().y - shadow_h; + if (dy > 0 && dy < delta_y) { + delta_y = dy; + node_before = node; + beforeid = '_first_'; + } + } + } + if (!!node_before) { beforeid = node_before.id; } + this.jm.move_node(src_node.id, beforeid, target_node.id, target_direct); + } + this.active_node = null; + this.target_node = null; + this.target_direct = null; + }, + + jm_event_handle: function (type, data) { + if (type === jsMind.event_type.resize) { + this.resize(); + } + } + }; + + var draggable_plugin = new jsMind.plugin('draggable', function (jm) { + var jd = new jsMind.draggable(jm); + jd.init(); + jm.add_event_listener(function (type, data) { + jd.jm_event_handle.call(jd, type, data); + }); + }); + + jsMind.register_plugin(draggable_plugin); + +})(window); diff --git a/src/common/js/jsmind.js b/src/common/js/jsmind.js new file mode 100644 index 0000000..5e103c0 --- /dev/null +++ b/src/common/js/jsmind.js @@ -0,0 +1,3026 @@ +/* + * Released under BSD License + * Copyright (c) 2014-2016 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +; (function ($w) { + 'use strict'; + // set 'jsMind' as the library name. + // __name__ should be a const value, Never try to change it easily. + var __name__ = 'jsMind'; + // library version + var __version__ = '0.4.6'; + // author + var __author__ = 'hizzgdev@163.com'; + + // an noop function define + var _noop = function () { }; + var logger = (typeof console === 'undefined') ? { + log: _noop, debug: _noop, error: _noop, warn: _noop, info: _noop + } : console; + + // check global variables + if (typeof module === 'undefined' || !module.exports) { + if (typeof $w[__name__] != 'undefined') { + logger.log(__name__ + ' has been already exist.'); + return; + } + } + + // shortcut of methods in dom + var $d = $w.document; + var $g = function (id) { return $d.getElementById(id); }; + var $c = function (tag) { return $d.createElement(tag); }; + var $t = function (n, t) { if (n.hasChildNodes()) { n.firstChild.nodeValue = t; } else { n.appendChild($d.createTextNode(t)); } }; + + var $h = function (n, t) { + if (t instanceof HTMLElement) { + n.innerHTML = ''; + n.appendChild(t); + } else { + n.innerHTML = t; + } + }; + // detect isElement + var $i = function (el) { return !!el && (typeof el === 'object') && (el.nodeType === 1) && (typeof el.style === 'object') && (typeof el.ownerDocument === 'object'); }; + if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (p) { return this.slice(0, p.length) === p; }; } + + var DEFAULT_OPTIONS = { + container: '', // id of the container + editable: false, // you can change it in your options + theme: null, + mode: 'full', // full or side + support_html: true, + + view: { + engine: 'canvas', + hmargin: 100, + vmargin: 50, + line_width: 2, + line_color: '#555' + }, + layout: { + hspace: 30, + vspace: 20, + pspace: 13 + }, + default_event_handle: { + enable_mousedown_handle: true, + enable_click_handle: true, + enable_dblclick_handle: true + }, + shortcut: { + enable: true, + handles: { + }, + mapping: { + addchild: 45, // Insert + addbrother: 13, // Enter + editnode: 113,// F2 + delnode: 46, // Delete + toggle: 32, // Space + left: 37, // Left + up: 38, // Up + right: 39, // Right + down: 40, // Down + } + }, + }; + + // core object + var jm = function (options) { + jm.current = this; + + this.version = __version__; + var opts = {}; + jm.util.json.merge(opts, DEFAULT_OPTIONS); + jm.util.json.merge(opts, options); + + if (!opts.container) { + logger.error('the options.container should not be null or empty.'); + return; + } + this.options = opts; + this.inited = false; + this.mind = null; + this.event_handles = []; + this.init(); + }; + + // ============= static object ============================================= + jm.direction = { left: -1, center: 0, right: 1 }; + jm.event_type = { show: 1, resize: 2, edit: 3, select: 4 }; + jm.key = { meta: 1 << 13, ctrl: 1 << 12, alt: 1 << 11, shift: 1 << 10 }; + + jm.node = function (sId, iIndex, sTopic, oData, bIsRoot, oParent, eDirection, bExpanded) { + if (!sId) { logger.error('invalid nodeid'); return; } + if (typeof iIndex != 'number') { logger.error('invalid node index'); return; } + if (typeof bExpanded === 'undefined') { bExpanded = true; } + this.id = sId; + this.index = iIndex; + this.topic = sTopic; + this.data = oData || {}; + this.isroot = bIsRoot; + this.parent = oParent; + this.direction = eDirection; + this.expanded = !!bExpanded; + this.children = []; + this._data = {}; + }; + + jm.node.compare = function (node1, node2) { + // '-1' is alwary the last + var r = 0; + var i1 = node1.index; + var i2 = node2.index; + if (i1 >= 0 && i2 >= 0) { + r = i1 - i2; + } else if (i1 == -1 && i2 == -1) { + r = 0; + } else if (i1 == -1) { + r = 1; + } else if (i2 == -1) { + r = -1; + } else { + r = 0; + } + //logger.debug(i1+' <> '+i2+' = '+r); + return r; + }; + + jm.node.inherited = function (pnode, node) { + if (!!pnode && !!node) { + if (pnode.id === node.id) { + return true; + } + if (pnode.isroot) { + return true; + } + var pid = pnode.id; + var p = node; + while (!p.isroot) { + p = p.parent; + if (p.id === pid) { + return true; + } + } + } + return false; + }; + + jm.node.prototype = { + get_location: function () { + var vd = this._data.view; + return { + x: vd.abs_x, + y: vd.abs_y + }; + }, + get_size: function () { + var vd = this._data.view; + return { + w: vd.width, + h: vd.height + } + } + }; + + + jm.mind = function () { + this.name = null; + this.author = null; + this.version = null; + this.root = null; + this.selected = null; + this.nodes = {}; + }; + + jm.mind.prototype = { + get_node: function (nodeid) { + if (nodeid in this.nodes) { + return this.nodes[nodeid]; + } else { + logger.warn('the node[id=' + nodeid + '] can not be found'); + return null; + } + }, + + set_root: function (nodeid, topic, data) { + if (this.root == null) { + this.root = new jm.node(nodeid, 0, topic, data, true); + this._put_node(this.root); + } else { + logger.error('root node is already exist'); + } + }, + + add_node: function (parent_node, nodeid, topic, data, idx, direction, expanded) { + if (!jm.util.is_node(parent_node)) { + var the_parent_node = this.get_node(parent_node); + if (!the_parent_node) { + logger.error('the parent_node[id=' + parent_node + '] can not be found.'); + return null; + } else { + return this.add_node(the_parent_node, nodeid, topic, data, idx, direction, expanded); + } + } + var nodeindex = idx || -1; + var node = null; + if (parent_node.isroot) { + var d = jm.direction.right; + if (isNaN(direction)) { + var children = parent_node.children; + var children_len = children.length; + var r = 0; + for (var i = 0; i < children_len; i++) { if (children[i].direction === jm.direction.left) { r--; } else { r++; } } + d = (children_len > 1 && r > 0) ? jm.direction.left : jm.direction.right; + } else { + d = (direction != jm.direction.left) ? jm.direction.right : jm.direction.left; + } + node = new jm.node(nodeid, nodeindex, topic, data, false, parent_node, d, expanded); + } else { + node = new jm.node(nodeid, nodeindex, topic, data, false, parent_node, parent_node.direction, expanded); + } + if (this._put_node(node)) { + parent_node.children.push(node); + this._reindex(parent_node); + } else { + logger.error('fail, the nodeid \'' + node.id + '\' has been already exist.'); + node = null; + } + return node; + }, + + insert_node_before: function (node_before, nodeid, topic, data) { + if (!jm.util.is_node(node_before)) { + var the_node_before = this.get_node(node_before); + if (!the_node_before) { + logger.error('the node_before[id=' + node_before + '] can not be found.'); + return null; + } else { + return this.insert_node_before(the_node_before, nodeid, topic, data); + } + } + var node_index = node_before.index - 0.5; + return this.add_node(node_before.parent, nodeid, topic, data, node_index); + }, + + get_node_before: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return null; + } else { + return this.get_node_before(the_node); + } + } + if (node.isroot) { return null; } + var idx = node.index - 2; + if (idx >= 0) { + return node.parent.children[idx]; + } else { + return null; + } + }, + + insert_node_after: function (node_after, nodeid, topic, data) { + if (!jm.util.is_node(node_after)) { + var the_node_after = this.get_node(node_before); + if (!the_node_after) { + logger.error('the node_after[id=' + node_after + '] can not be found.'); + return null; + } else { + return this.insert_node_after(the_node_after, nodeid, topic, data); + } + } + var node_index = node_after.index + 0.5; + return this.add_node(node_after.parent, nodeid, topic, data, node_index); + }, + + get_node_after: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return null; + } else { + return this.get_node_after(the_node); + } + } + if (node.isroot) { return null; } + var idx = node.index; + var brothers = node.parent.children; + if (brothers.length >= idx) { + return node.parent.children[idx]; + } else { + return null; + } + }, + + move_node: function (node, beforeid, parentid, direction) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return null; + } else { + return this.move_node(the_node, beforeid, parentid, direction); + } + } + if (!parentid) { + parentid = node.parent.id; + } + return this._move_node(node, beforeid, parentid, direction); + }, + + _flow_node_direction: function (node, direction) { + if (typeof direction === 'undefined') { + direction = node.direction; + } else { + node.direction = direction; + } + var len = node.children.length; + while (len--) { + this._flow_node_direction(node.children[len], direction); + } + }, + + _move_node_internal: function (node, beforeid) { + if (!!node && !!beforeid) { + if (beforeid == '_last_') { + node.index = -1; + this._reindex(node.parent); + } else if (beforeid == '_first_') { + node.index = 0; + this._reindex(node.parent); + } else { + var node_before = (!!beforeid) ? this.get_node(beforeid) : null; + if (node_before != null && node_before.parent != null && node_before.parent.id == node.parent.id) { + node.index = node_before.index - 0.5; + this._reindex(node.parent); + } + } + } + return node; + }, + + _move_node: function (node, beforeid, parentid, direction) { + if (!!node && !!parentid) { + if (node.parent.id != parentid) { + // remove from parent's children + var sibling = node.parent.children; + var si = sibling.length; + while (si--) { + if (sibling[si].id == node.id) { + sibling.splice(si, 1); + break; + } + } + node.parent = this.get_node(parentid); + node.parent.children.push(node); + } + + if (node.parent.isroot) { + if (direction == jm.direction.left) { + node.direction = direction; + } else { + node.direction = jm.direction.right; + } + } else { + node.direction = node.parent.direction; + } + this._move_node_internal(node, beforeid); + this._flow_node_direction(node); + } + return node; + }, + + remove_node: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return false; + } else { + return this.remove_node(the_node); + } + } + if (!node) { + logger.error('fail, the node can not be found'); + return false; + } + if (node.isroot) { + logger.error('fail, can not remove root node'); + return false; + } + if (this.selected != null && this.selected.id == node.id) { + this.selected = null; + } + // clean all subordinate nodes + var children = node.children; + var ci = children.length; + while (ci--) { + this.remove_node(children[ci]); + } + // clean all children + children.length = 0; + // remove from parent's children + var sibling = node.parent.children; + var si = sibling.length; + while (si--) { + if (sibling[si].id == node.id) { + sibling.splice(si, 1); + break; + } + } + // remove from global nodes + delete this.nodes[node.id]; + // clean all properties + for (var k in node) { + delete node[k]; + } + // remove it's self + node = null; + //delete node; + return true; + }, + + _put_node: function (node) { + if (node.id in this.nodes) { + logger.warn('the nodeid \'' + node.id + '\' has been already exist.'); + return false; + } else { + this.nodes[node.id] = node; + return true; + } + }, + + _reindex: function (node) { + if (node instanceof jm.node) { + node.children.sort(jm.node.compare); + for (var i = 0; i < node.children.length; i++) { + node.children[i].index = i + 1; + } + } + }, + }; + + jm.format = { + node_tree: { + example: { + "meta": { + "name": __name__, + "author": __author__, + "version": __version__ + }, + "format": "node_tree", + "data": { "id": "root", "topic": "jsMind Example" } + }, + get_mind: function (source) { + var df = jm.format.node_tree; + var mind = new jm.mind(); + mind.name = source.meta.name; + mind.author = source.meta.author; + mind.version = source.meta.version; + df._parse(mind, source.data); + return mind; + }, + get_data: function (mind) { + var df = jm.format.node_tree; + var json = {}; + json.meta = { + name: mind.name, + author: mind.author, + version: mind.version + }; + json.format = 'node_tree'; + json.data = df._buildnode(mind.root); + return json; + }, + + _parse: function (mind, node_root) { + var df = jm.format.node_tree; + var data = df._extract_data(node_root); + mind.set_root(node_root.id, node_root.topic, data); + if ('children' in node_root) { + var children = node_root.children; + for (var i = 0; i < children.length; i++) { + df._extract_subnode(mind, mind.root, children[i]); + } + } + }, + + _extract_data: function (node_json) { + var data = {}; + for (var k in node_json) { + if (k == 'id' || k == 'topic' || k == 'children' || k == 'direction' || k == 'expanded') { + continue; + } + data[k] = node_json[k]; + } + return data; + }, + + _extract_subnode: function (mind, node_parent, node_json) { + var df = jm.format.node_tree; + var data = df._extract_data(node_json); + var d = null; + if (node_parent.isroot) { + d = node_json.direction == 'left' ? jm.direction.left : jm.direction.right; + } + var node = mind.add_node(node_parent, node_json.id, node_json.topic, data, null, d, node_json.expanded); + if ('children' in node_json) { + var children = node_json.children; + for (var i = 0; i < children.length; i++) { + df._extract_subnode(mind, node, children[i]); + } + } + }, + + _buildnode: function (node) { + var df = jm.format.node_tree; + if (!(node instanceof jm.node)) { return; } + var o = { + id: node.id, + topic: node.topic, + expanded: node.expanded + }; + if (!!node.parent && node.parent.isroot) { + o.direction = node.direction == jm.direction.left ? 'left' : 'right'; + } + if (node.data != null) { + var node_data = node.data; + for (var k in node_data) { + o[k] = node_data[k]; + } + } + var children = node.children; + if (children.length > 0) { + o.children = []; + for (var i = 0; i < children.length; i++) { + o.children.push(df._buildnode(children[i])); + } + } + return o; + } + }, + + node_array: { + example: { + "meta": { + "name": __name__, + "author": __author__, + "version": __version__ + }, + "format": "node_array", + "data": [ + { "id": "root", "topic": "jsMind Example", "isroot": true } + ] + }, + + get_mind: function (source) { + var df = jm.format.node_array; + var mind = new jm.mind(); + mind.name = source.meta.name; + mind.author = source.meta.author; + mind.version = source.meta.version; + df._parse(mind, source.data); + return mind; + }, + + get_data: function (mind) { + var df = jm.format.node_array; + var json = {}; + json.meta = { + name: mind.name, + author: mind.author, + version: mind.version + }; + json.format = 'node_array'; + json.data = []; + df._array(mind, json.data); + return json; + }, + + _parse: function (mind, node_array) { + var df = jm.format.node_array; + var narray = node_array.slice(0); + // reverse array for improving looping performance + narray.reverse(); + var root_id = df._extract_root(mind, narray); + if (!!root_id) { + df._extract_subnode(mind, root_id, narray); + } else { + logger.error('root node can not be found'); + } + }, + + _extract_root: function (mind, node_array) { + var df = jm.format.node_array; + var i = node_array.length; + while (i--) { + if ('isroot' in node_array[i] && node_array[i].isroot) { + var root_json = node_array[i]; + var data = df._extract_data(root_json); + mind.set_root(root_json.id, root_json.topic, data); + node_array.splice(i, 1); + return root_json.id; + } + } + return null; + }, + + _extract_subnode: function (mind, parentid, node_array) { + var df = jm.format.node_array; + var i = node_array.length; + var node_json = null; + var data = null; + var extract_count = 0; + while (i--) { + node_json = node_array[i]; + if (node_json.parentid == parentid) { + data = df._extract_data(node_json); + var d = null; + var node_direction = node_json.direction; + if (!!node_direction) { + d = node_direction == 'left' ? jm.direction.left : jm.direction.right; + } + mind.add_node(parentid, node_json.id, node_json.topic, data, null, d, node_json.expanded); + node_array.splice(i, 1); + extract_count++; + var sub_extract_count = df._extract_subnode(mind, node_json.id, node_array); + if (sub_extract_count > 0) { + // reset loop index after extract subordinate node + i = node_array.length; + extract_count += sub_extract_count; + } + } + } + return extract_count; + }, + + _extract_data: function (node_json) { + var data = {}; + for (var k in node_json) { + if (k == 'id' || k == 'topic' || k == 'parentid' || k == 'isroot' || k == 'direction' || k == 'expanded') { + continue; + } + data[k] = node_json[k]; + } + return data; + }, + + _array: function (mind, node_array) { + var df = jm.format.node_array; + df._array_node(mind.root, node_array); + }, + + _array_node: function (node, node_array) { + var df = jm.format.node_array; + if (!(node instanceof jm.node)) { return; } + var o = { + id: node.id, + topic: node.topic, + expanded: node.expanded + }; + if (!!node.parent) { + o.parentid = node.parent.id; + } + if (node.isroot) { + o.isroot = true; + } + if (!!node.parent && node.parent.isroot) { + o.direction = node.direction == jm.direction.left ? 'left' : 'right'; + } + if (node.data != null) { + var node_data = node.data; + for (var k in node_data) { + o[k] = node_data[k]; + } + } + node_array.push(o); + var ci = node.children.length; + for (var i = 0; i < ci; i++) { + df._array_node(node.children[i], node_array); + } + }, + }, + + freemind: { + example: { + "meta": { + "name": __name__, + "author": __author__, + "version": __version__ + }, + "format": "freemind", + "data": "" + }, + get_mind: function (source) { + var df = jm.format.freemind; + var mind = new jm.mind(); + mind.name = source.meta.name; + mind.author = source.meta.author; + mind.version = source.meta.version; + var xml = source.data; + var xml_doc = df._parse_xml(xml); + var xml_root = df._find_root(xml_doc); + df._load_node(mind, null, xml_root); + return mind; + }, + + get_data: function (mind) { + var df = jm.format.freemind; + var json = {}; + json.meta = { + name: mind.name, + author: mind.author, + version: mind.version + }; + json.format = 'freemind'; + var xmllines = []; + xmllines.push(''); + df._buildmap(mind.root, xmllines); + xmllines.push(''); + json.data = xmllines.join(' '); + return json; + }, + + _parse_xml: function (xml) { + var xml_doc = null; + if (window.DOMParser) { + var parser = new DOMParser(); + xml_doc = parser.parseFromString(xml, 'text/xml'); + } else { // Internet Explorer + xml_doc = new ActiveXObject('Microsoft.XMLDOM'); + xml_doc.async = false; + xml_doc.loadXML(xml); + } + return xml_doc; + }, + + _find_root: function (xml_doc) { + var nodes = xml_doc.childNodes; + var node = null; + var root = null; + var n = null; + for (var i = 0; i < nodes.length; i++) { + n = nodes[i]; + if (n.nodeType == 1 && n.tagName == 'map') { + node = n; + break; + } + } + if (!!node) { + var ns = node.childNodes; + node = null; + for (var i = 0; i < ns.length; i++) { + n = ns[i]; + if (n.nodeType == 1 && n.tagName == 'node') { + node = n; + break; + } + } + } + return node; + }, + + _load_node: function (mind, parent_id, xml_node) { + var df = jm.format.freemind; + var node_id = xml_node.getAttribute('ID'); + var node_topic = xml_node.getAttribute('TEXT'); + // look for richcontent + if (node_topic == null) { + var topic_children = xml_node.childNodes; + var topic_child = null; + for (var i = 0; i < topic_children.length; i++) { + topic_child = topic_children[i]; + //logger.debug(topic_child.tagName); + if (topic_child.nodeType == 1 && topic_child.tagName === 'richcontent') { + node_topic = topic_child.textContent; + break; + } + } + } + var node_data = df._load_attributes(xml_node); + var node_expanded = ('expanded' in node_data) ? (node_data.expanded == 'true') : true; + delete node_data.expanded; + + var node_position = xml_node.getAttribute('POSITION'); + var node_direction = null; + if (!!node_position) { + node_direction = node_position == 'left' ? jm.direction.left : jm.direction.right; + } + //logger.debug(node_position +':'+ node_direction); + if (!!parent_id) { + mind.add_node(parent_id, node_id, node_topic, node_data, null, node_direction, node_expanded); + } else { + mind.set_root(node_id, node_topic, node_data); + } + var children = xml_node.childNodes; + var child = null; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.nodeType == 1 && child.tagName == 'node') { + df._load_node(mind, node_id, child); + } + } + }, + + _load_attributes: function (xml_node) { + var children = xml_node.childNodes; + var attr = null; + var attr_data = {}; + for (var i = 0; i < children.length; i++) { + attr = children[i]; + if (attr.nodeType == 1 && attr.tagName === 'attribute') { + attr_data[attr.getAttribute('NAME')] = attr.getAttribute('VALUE'); + } + } + return attr_data; + }, + + _buildmap: function (node, xmllines) { + var df = jm.format.freemind; + var pos = null; + if (!!node.parent && node.parent.isroot) { + pos = node.direction === jm.direction.left ? 'left' : 'right'; + } + xmllines.push(''); + + // store expanded status as an attribute + xmllines.push(''); + + // for attributes + var node_data = node.data; + if (node_data != null) { + for (var k in node_data) { + xmllines.push(''); + } + } + + // for children + var children = node.children; + for (var i = 0; i < children.length; i++) { + df._buildmap(children[i], xmllines); + } + + xmllines.push(''); + }, + }, + }; + + // ============= utility object ============================================= + + jm.util = { + is_node: function (node) { + return !!node && node instanceof jm.node; + }, + ajax: { + _xhr: function () { + var xhr = null; + if (window.XMLHttpRequest) { + xhr = new XMLHttpRequest(); + } else { + try { + xhr = new ActiveXObject('Microsoft.XMLHTTP'); + } catch (e) { } + } + return xhr; + }, + _eurl: function (url) { + return encodeURIComponent(url); + }, + request: function (url, param, method, callback, fail_callback) { + var a = jm.util.ajax; + var p = null; + var tmp_param = []; + for (var k in param) { + tmp_param.push(a._eurl(k) + '=' + a._eurl(param[k])); + } + if (tmp_param.length > 0) { + p = tmp_param.join('&'); + } + var xhr = a._xhr(); + if (!xhr) { return; } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + if (xhr.status == 200 || xhr.status == 0) { + if (typeof callback === 'function') { + var data = jm.util.json.string2json(xhr.responseText); + if (data != null) { + callback(data); + } else { + callback(xhr.responseText); + } + } + } else { + if (typeof fail_callback === 'function') { + fail_callback(xhr); + } else { + logger.error('xhr request failed.', xhr); + } + } + } + } + method = method || 'GET'; + xhr.open(method, url, true); + xhr.setRequestHeader('If-Modified-Since', '0'); + if (method == 'POST') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8'); + xhr.send(p); + } else { + xhr.send(); + } + }, + get: function (url, callback) { + return jm.util.ajax.request(url, {}, 'GET', callback); + }, + post: function (url, param, callback) { + return jm.util.ajax.request(url, param, 'POST', callback); + } + }, + + dom: { + //target,eventType,handler + add_event: function (t, e, h) { + if (!!t.addEventListener) { + t.addEventListener(e, h, false); + } else { + t.attachEvent('on' + e, h); + } + } + }, + + file: { + read: function (file_data, fn_callback) { + var reader = new FileReader(); + reader.onload = function () { + if (typeof fn_callback === 'function') { + fn_callback(this.result, file_data.name); + } + }; + reader.readAsText(file_data); + }, + + save: function (file_data, type, name) { + var blob; + if (typeof $w.Blob === 'function') { + blob = new Blob([file_data], { type: type }); + } else { + var BlobBuilder = $w.BlobBuilder || $w.MozBlobBuilder || $w.WebKitBlobBuilder || $w.MSBlobBuilder; + var bb = new BlobBuilder(); + bb.append(file_data); + blob = bb.getBlob(type); + } + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, name); + } else { + var URL = $w.URL || $w.webkitURL; + var bloburl = URL.createObjectURL(blob); + var anchor = $c('a'); + if ('download' in anchor) { + anchor.style.visibility = 'hidden'; + anchor.href = bloburl; + anchor.download = name; + $d.body.appendChild(anchor); + var evt = $d.createEvent('MouseEvents'); + evt.initEvent('click', true, true); + anchor.dispatchEvent(evt); + $d.body.removeChild(anchor); + } else { + location.href = bloburl; + } + } + } + }, + + json: { + json2string: function (json) { + if (!!JSON) { + try { + var json_str = JSON.stringify(json); + return json_str; + } catch (e) { + logger.warn(e); + logger.warn('can not convert to string'); + return null; + } + } + }, + string2json: function (json_str) { + if (!!JSON) { + try { + var json = JSON.parse(json_str); + return json; + } catch (e) { + logger.warn(e); + logger.warn('can not parse to json'); + return null; + } + } + }, + merge: function (b, a) { + for (var o in a) { + if (o in b) { + if (typeof b[o] === 'object' && + Object.prototype.toString.call(b[o]).toLowerCase() == '[object object]' && + !b[o].length) { + jm.util.json.merge(b[o], a[o]); + } else { + b[o] = a[o]; + } + } else { + b[o] = a[o]; + } + } + return b; + } + }, + + uuid: { + newid: function () { + return (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16); + } + }, + + text: { + is_empty: function (s) { + if (!s) { return true; } + return s.replace(/\s*/, '').length == 0; + } + } + }; + + jm.prototype = { + init: function () { + if (this.inited) { return; } + this.inited = true; + + var opts = this.options; + + var opts_layout = { + mode: opts.mode, + hspace: opts.layout.hspace, + vspace: opts.layout.vspace, + pspace: opts.layout.pspace + } + var opts_view = { + container: opts.container, + support_html: opts.support_html, + engine: opts.view.engine, + hmargin: opts.view.hmargin, + vmargin: opts.view.vmargin, + line_width: opts.view.line_width, + line_color: opts.view.line_color + }; + // create instance of function provider + this.data = new jm.data_provider(this); + this.layout = new jm.layout_provider(this, opts_layout); + this.view = new jm.view_provider(this, opts_view); + this.shortcut = new jm.shortcut_provider(this, opts.shortcut); + + this.data.init(); + this.layout.init(); + this.view.init(); + this.shortcut.init(); + + this._event_bind(); + + jm.init_plugins(this); + }, + + enable_edit: function () { + this.options.editable = true; + }, + + disable_edit: function () { + this.options.editable = false; + }, + + // call enable_event_handle('dblclick') + // options are 'mousedown', 'click', 'dblclick' + enable_event_handle: function (event_handle) { + this.options.default_event_handle['enable_' + event_handle + '_handle'] = true; + }, + + // call disable_event_handle('dblclick') + // options are 'mousedown', 'click', 'dblclick' + disable_event_handle: function (event_handle) { + this.options.default_event_handle['enable_' + event_handle + '_handle'] = false; + }, + + get_editable: function () { + return this.options.editable; + }, + + set_theme: function (theme) { + var theme_old = this.options.theme; + this.options.theme = (!!theme) ? theme : null; + if (theme_old != this.options.theme) { + this.view.reset_theme(); + this.view.reset_custom_style(); + } + }, + _event_bind: function () { + this.view.add_event(this, 'mousedown', this.mousedown_handle); + this.view.add_event(this, 'click', this.click_handle); + this.view.add_event(this, 'dblclick', this.dblclick_handle); + }, + + mousedown_handle: function (e) { + if (!this.options.default_event_handle['enable_mousedown_handle']) { + return; + } + var element = e.target || event.srcElement; + var nodeid = this.view.get_binded_nodeid(element); + if (!!nodeid) { + if (element.tagName.toLowerCase() == 'jmnode') { + this.select_node(nodeid); + } + } else { + this.select_clear(); + } + }, + + click_handle: function (e) { + if (!this.options.default_event_handle['enable_click_handle']) { + return; + } + var element = e.target || event.srcElement; + var isexpander = this.view.is_expander(element); + if (isexpander) { + var nodeid = this.view.get_binded_nodeid(element); + if (!!nodeid) { + this.toggle_node(nodeid); + } + } + }, + + dblclick_handle: function (e) { + if (!this.options.default_event_handle['enable_dblclick_handle']) { + return; + } + if (this.get_editable()) { + var element = e.target || event.srcElement; + var nodeid = this.view.get_binded_nodeid(element); + if (!!nodeid) { + this.begin_edit(nodeid); + } + } + }, + + begin_edit: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return false; + } else { + return this.begin_edit(the_node); + } + } + if (this.get_editable()) { + this.view.edit_node_begin(node); + } else { + logger.error('fail, this mind map is not editable.'); + return; + } + }, + + end_edit: function () { + this.view.edit_node_end(); + }, + + toggle_node: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.toggle_node(the_node); + } + } + if (node.isroot) { return; } + this.view.save_location(node); + this.layout.toggle_node(node); + this.view.relayout(); + this.view.restore_location(node); + }, + + expand_node: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.expand_node(the_node); + } + } + if (node.isroot) { return; } + this.view.save_location(node); + this.layout.expand_node(node); + this.view.relayout(); + this.view.restore_location(node); + }, + + collapse_node: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.collapse_node(the_node); + } + } + if (node.isroot) { return; } + this.view.save_location(node); + this.layout.collapse_node(node); + this.view.relayout(); + this.view.restore_location(node); + }, + + expand_all: function () { + this.layout.expand_all(); + this.view.relayout(); + }, + + collapse_all: function () { + this.layout.collapse_all(); + this.view.relayout(); + }, + + expand_to_depth: function (depth) { + this.layout.expand_to_depth(depth); + this.view.relayout(); + }, + + _reset: function () { + this.view.reset(); + this.layout.reset(); + this.data.reset(); + }, + + _show: function (mind) { + var m = mind || jm.format.node_array.example; + + this.mind = this.data.load(m); + if (!this.mind) { + logger.error('data.load error'); + return; + } else { + logger.debug('data.load ok'); + } + + this.view.load(); + logger.debug('view.load ok'); + + this.layout.layout(); + logger.debug('layout.layout ok'); + + this.view.show(true); + logger.debug('view.show ok'); + + this.invoke_event_handle(jm.event_type.show, { data: [mind] }); + }, + + show: function (mind) { + this._reset(); + this._show(mind); + }, + + get_meta: function () { + return { + name: this.mind.name, + author: this.mind.author, + version: this.mind.version + }; + }, + + get_data: function (data_format) { + var df = data_format || 'node_tree'; + return this.data.get_data(df); + }, + + get_root: function () { + return this.mind.root; + }, + + get_node: function (nodeid) { + return this.mind.get_node(nodeid); + }, + + add_node: function (parent_node, nodeid, topic, data) { + if (this.get_editable()) { + var node = this.mind.add_node(parent_node, nodeid, topic, data); + if (!!node) { + this.view.add_node(node); + this.layout.layout(); + this.view.show(false); + this.view.reset_node_custom_style(node); + this.expand_node(parent_node); + this.invoke_event_handle(jm.event_type.edit, { evt: 'add_node', data: [parent_node.id, nodeid, topic, data], node: nodeid }); + } + return node; + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + }, + + insert_node_before: function (node_before, nodeid, topic, data) { + if (this.get_editable()) { + var beforeid = jm.util.is_node(node_before) ? node_before.id : node_before; + var node = this.mind.insert_node_before(node_before, nodeid, topic, data); + if (!!node) { + this.view.add_node(node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(jm.event_type.edit, { evt: 'insert_node_before', data: [beforeid, nodeid, topic, data], node: nodeid }); + } + return node; + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + }, + + insert_node_after: function (node_after, nodeid, topic, data) { + if (this.get_editable()) { + var afterid = jm.util.is_node(node_after) ? node_after.id : node_after; + var node = this.mind.insert_node_after(node_after, nodeid, topic, data); + if (!!node) { + this.view.add_node(node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(jm.event_type.edit, { evt: 'insert_node_after', data: [afterid, nodeid, topic, data], node: nodeid }); + } + return node; + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + }, + + remove_node: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return false; + } else { + return this.remove_node(the_node); + } + } + if (this.get_editable()) { + if (node.isroot) { + logger.error('fail, can not remove root node'); + return false; + } + var nodeid = node.id; + var parentid = node.parent.id; + var parent_node = this.get_node(parentid); + this.view.save_location(parent_node); + this.view.remove_node(node); + this.mind.remove_node(node); + this.layout.layout(); + this.view.show(false); + this.view.restore_location(parent_node); + this.invoke_event_handle(jm.event_type.edit, { evt: 'remove_node', data: [nodeid], node: parentid }); + return true; + } else { + logger.error('fail, this mind map is not editable'); + return false; + } + }, + + update_node: function (nodeid, topic) { + if (this.get_editable()) { + if (jm.util.text.is_empty(topic)) { + logger.warn('fail, topic can not be empty'); + return; + } + var node = this.get_node(nodeid); + if (!!node) { + if (node.topic === topic) { + logger.info('nothing changed'); + this.view.update_node(node); + return; + } + node.topic = topic; + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(jm.event_type.edit, { evt: 'update_node', data: [nodeid, topic], node: nodeid }); + } + } else { + logger.error('fail, this mind map is not editable'); + return; + } + }, + + move_node: function (nodeid, beforeid, parentid, direction) { + if (this.get_editable()) { + var node = this.mind.move_node(nodeid, beforeid, parentid, direction); + if (!!node) { + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + this.invoke_event_handle(jm.event_type.edit, { evt: 'move_node', data: [nodeid, beforeid, parentid, direction], node: nodeid }); + } + } else { + logger.error('fail, this mind map is not editable'); + return; + } + }, + + select_node: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.select_node(the_node); + } + } + if (!this.layout.is_visible(node)) { + return; + } + this.mind.selected = node; + this.view.select_node(node); + this.invoke_event_handle(jm.event_type.select, { evt: 'select_node', data: [], node: node.id }); + }, + + get_selected_node: function () { + if (!!this.mind) { + return this.mind.selected; + } else { + return null; + } + }, + + select_clear: function () { + if (!!this.mind) { + this.mind.selected = null; + this.view.select_clear(); + } + }, + + is_node_visible: function (node) { + return this.layout.is_visible(node); + }, + + find_node_before: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.find_node_before(the_node); + } + } + if (node.isroot) { return null; } + var n = null; + if (node.parent.isroot) { + var c = node.parent.children; + var prev = null; + var ni = null; + for (var i = 0; i < c.length; i++) { + ni = c[i]; + if (node.direction === ni.direction) { + if (node.id === ni.id) { + n = prev; + } + prev = ni; + } + } + } else { + n = this.mind.get_node_before(node); + } + return n; + }, + + find_node_after: function (node) { + if (!jm.util.is_node(node)) { + var the_node = this.get_node(node); + if (!the_node) { + logger.error('the node[id=' + node + '] can not be found.'); + return; + } else { + return this.find_node_after(the_node); + } + } + if (node.isroot) { return null; } + var n = null; + if (node.parent.isroot) { + var c = node.parent.children; + var getthis = false; + var ni = null; + for (var i = 0; i < c.length; i++) { + ni = c[i]; + if (node.direction === ni.direction) { + if (getthis) { + n = ni; + break; + } + if (node.id === ni.id) { + getthis = true; + } + } + } + } else { + n = this.mind.get_node_after(node); + } + return n; + }, + + set_node_color: function (nodeid, bgcolor, fgcolor) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!!bgcolor) { + node.data['background-color'] = bgcolor; + } + if (!!fgcolor) { + node.data['foreground-color'] = fgcolor; + } + this.view.reset_node_custom_style(node); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + }, + + set_node_font_style: function (nodeid, size, weight, style) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!!size) { + node.data['font-size'] = size; + } + if (!!weight) { + node.data['font-weight'] = weight; + } + if (!!style) { + node.data['font-style'] = style; + } + this.view.reset_node_custom_style(node); + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + }, + + set_node_background_image: function (nodeid, image, width, height, rotation) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!!image) { + node.data['background-image'] = image; + } + if (!!width) { + node.data['width'] = width; + } + if (!!height) { + node.data['height'] = height; + } + if (!!rotation) { + node.data['background-rotation'] = rotation; + } + this.view.reset_node_custom_style(node); + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + }, + + set_node_background_rotation: function (nodeid, rotation) { + if (this.get_editable()) { + var node = this.mind.get_node(nodeid); + if (!!node) { + if (!node.data['background-image']) { + logger.error('fail, only can change rotation angle of node with background image'); + return null; + } + node.data['background-rotation'] = rotation; + this.view.reset_node_custom_style(node); + this.view.update_node(node); + this.layout.layout(); + this.view.show(false); + } + } else { + logger.error('fail, this mind map is not editable'); + return null; + } + }, + + resize: function () { + this.view.resize(); + }, + + // callback(type ,data) + add_event_listener: function (callback) { + if (typeof callback === 'function') { + this.event_handles.push(callback); + } + }, + + clear_event_listener: function () { + this.event_handles = []; + }, + + invoke_event_handle: function (type, data) { + var j = this; + $w.setTimeout(function () { + j._invoke_event_handle(type, data); + }, 0); + }, + + _invoke_event_handle: function (type, data) { + var l = this.event_handles.length; + for (var i = 0; i < l; i++) { + this.event_handles[i](type, data); + } + } + + }; + + // ============= data provider ============================================= + + jm.data_provider = function (jm) { + this.jm = jm; + }; + + jm.data_provider.prototype = { + init: function () { + logger.debug('data.init'); + }, + + reset: function () { + logger.debug('data.reset'); + }, + + load: function (mind_data) { + var df = null; + var mind = null; + if (typeof mind_data === 'object') { + if (!!mind_data.format) { + df = mind_data.format; + } else { + df = 'node_tree'; + } + } else { + df = 'freemind'; + } + + if (df == 'node_array') { + mind = jm.format.node_array.get_mind(mind_data); + } else if (df == 'node_tree') { + mind = jm.format.node_tree.get_mind(mind_data); + } else if (df == 'freemind') { + mind = jm.format.freemind.get_mind(mind_data); + } else { + logger.warn('unsupported format'); + } + return mind; + }, + + get_data: function (data_format) { + var data = null; + if (data_format == 'node_array') { + data = jm.format.node_array.get_data(this.jm.mind); + } else if (data_format == 'node_tree') { + data = jm.format.node_tree.get_data(this.jm.mind); + } else if (data_format == 'freemind') { + data = jm.format.freemind.get_data(this.jm.mind); + } else { + logger.error('unsupported ' + data_format + ' format'); + } + return data; + }, + }; + + // ============= layout provider =========================================== + + jm.layout_provider = function (jm, options) { + this.opts = options; + this.jm = jm; + this.isside = (this.opts.mode == 'side'); + this.bounds = null; + + this.cache_valid = false; + }; + + jm.layout_provider.prototype = { + init: function () { + logger.debug('layout.init'); + }, + reset: function () { + logger.debug('layout.reset'); + this.bounds = { n: 0, s: 0, w: 0, e: 0 }; + }, + layout: function () { + logger.debug('layout.layout'); + this.layout_direction(); + this.layout_offset(); + }, + + layout_direction: function () { + this._layout_direction_root(); + }, + + _layout_direction_root: function () { + var node = this.jm.mind.root; + // logger.debug(node); + var layout_data = null; + if ('layout' in node._data) { + layout_data = node._data.layout; + } else { + layout_data = {}; + node._data.layout = layout_data; + } + var children = node.children; + var children_count = children.length; + layout_data.direction = jm.direction.center; + layout_data.side_index = 0; + if (this.isside) { + var i = children_count; + while (i--) { + this._layout_direction_side(children[i], jm.direction.right, i); + } + } else { + var i = children_count; + var subnode = null; + while (i--) { + subnode = children[i]; + if (subnode.direction == jm.direction.left) { + this._layout_direction_side(subnode, jm.direction.left, i); + } else { + this._layout_direction_side(subnode, jm.direction.right, i); + } + } + /* + var boundary = Math.ceil(children_count/2); + var i = children_count; + while(i--){ + if(i>=boundary){ + this._layout_direction_side(children[i],jm.direction.left, children_count-i-1); + }else{ + this._layout_direction_side(children[i],jm.direction.right, i); + } + }*/ + + } + }, + + _layout_direction_side: function (node, direction, side_index) { + var layout_data = null; + if ('layout' in node._data) { + layout_data = node._data.layout; + } else { + layout_data = {}; + node._data.layout = layout_data; + } + var children = node.children; + var children_count = children.length; + + layout_data.direction = direction; + layout_data.side_index = side_index; + var i = children_count; + while (i--) { + this._layout_direction_side(children[i], direction, i); + } + }, + + layout_offset: function () { + var node = this.jm.mind.root; + var layout_data = node._data.layout; + layout_data.offset_x = 0; + layout_data.offset_y = 0; + layout_data.outer_height = 0; + var children = node.children; + var i = children.length; + var left_nodes = []; + var right_nodes = []; + var subnode = null; + while (i--) { + subnode = children[i]; + if (subnode._data.layout.direction == jm.direction.right) { + right_nodes.unshift(subnode); + } else { + left_nodes.unshift(subnode); + } + } + layout_data.left_nodes = left_nodes; + layout_data.right_nodes = right_nodes; + layout_data.outer_height_left = this._layout_offset_subnodes(left_nodes); + layout_data.outer_height_right = this._layout_offset_subnodes(right_nodes); + this.bounds.e = node._data.view.width / 2; + this.bounds.w = 0 - this.bounds.e; + //logger.debug(this.bounds.w); + this.bounds.n = 0; + this.bounds.s = Math.max(layout_data.outer_height_left, layout_data.outer_height_right); + }, + + // layout both the x and y axis + _layout_offset_subnodes: function (nodes) { + var total_height = 0; + var nodes_count = nodes.length; + var i = nodes_count; + var node = null; + var node_outer_height = 0; + var layout_data = null; + var base_y = 0; + var pd = null; // parent._data + while (i--) { + node = nodes[i]; + layout_data = node._data.layout; + if (pd == null) { + pd = node.parent._data; + } + + node_outer_height = this._layout_offset_subnodes(node.children); + if (!node.expanded) { + node_outer_height = 0; + this.set_visible(node.children, false); + } + node_outer_height = Math.max(node._data.view.height, node_outer_height); + + layout_data.outer_height = node_outer_height; + layout_data.offset_y = base_y - node_outer_height / 2; + layout_data.offset_x = this.opts.hspace * layout_data.direction + pd.view.width * (pd.layout.direction + layout_data.direction) / 2; + if (!node.parent.isroot) { + layout_data.offset_x += this.opts.pspace * layout_data.direction; + } + + base_y = base_y - node_outer_height - this.opts.vspace; + total_height += node_outer_height; + } + if (nodes_count > 1) { + total_height += this.opts.vspace * (nodes_count - 1); + } + i = nodes_count; + var middle_height = total_height / 2; + while (i--) { + node = nodes[i]; + node._data.layout.offset_y += middle_height; + } + return total_height; + }, + + // layout the y axis only, for collapse/expand a node + _layout_offset_subnodes_height: function (nodes) { + var total_height = 0; + var nodes_count = nodes.length; + var i = nodes_count; + var node = null; + var node_outer_height = 0; + var layout_data = null; + var base_y = 0; + var pd = null; // parent._data + while (i--) { + node = nodes[i]; + layout_data = node._data.layout; + if (pd == null) { + pd = node.parent._data; + } + + node_outer_height = this._layout_offset_subnodes_height(node.children); + if (!node.expanded) { + node_outer_height = 0; + } + node_outer_height = Math.max(node._data.view.height, node_outer_height); + + layout_data.outer_height = node_outer_height; + layout_data.offset_y = base_y - node_outer_height / 2; + base_y = base_y - node_outer_height - this.opts.vspace; + total_height += node_outer_height; + } + if (nodes_count > 1) { + total_height += this.opts.vspace * (nodes_count - 1); + } + i = nodes_count; + var middle_height = total_height / 2; + while (i--) { + node = nodes[i]; + node._data.layout.offset_y += middle_height; + //logger.debug(node.topic); + //logger.debug(node._data.layout.offset_y); + } + return total_height; + }, + + get_node_offset: function (node) { + var layout_data = node._data.layout; + var offset_cache = null; + if (('_offset_' in layout_data) && this.cache_valid) { + offset_cache = layout_data._offset_; + } else { + offset_cache = { x: -1, y: -1 }; + layout_data._offset_ = offset_cache; + } + if (offset_cache.x == -1 || offset_cache.y == -1) { + var x = layout_data.offset_x; + var y = layout_data.offset_y; + if (!node.isroot) { + var offset_p = this.get_node_offset(node.parent); + x += offset_p.x; + y += offset_p.y; + } + offset_cache.x = x; + offset_cache.y = y; + } + return offset_cache; + }, + + get_node_point: function (node) { + var view_data = node._data.view; + var offset_p = this.get_node_offset(node); + //logger.debug(offset_p); + var p = {}; + p.x = offset_p.x + view_data.width * (node._data.layout.direction - 1) / 2; + p.y = offset_p.y - view_data.height / 2; + //logger.debug(p); + return p; + }, + + get_node_point_in: function (node) { + var p = this.get_node_offset(node); + return p; + }, + + get_node_point_out: function (node) { + var layout_data = node._data.layout; + var pout_cache = null; + if (('_pout_' in layout_data) && this.cache_valid) { + pout_cache = layout_data._pout_; + } else { + pout_cache = { x: -1, y: -1 }; + layout_data._pout_ = pout_cache; + } + if (pout_cache.x == -1 || pout_cache.y == -1) { + if (node.isroot) { + pout_cache.x = 0; + pout_cache.y = 0; + } else { + var view_data = node._data.view; + var offset_p = this.get_node_offset(node); + pout_cache.x = offset_p.x + (view_data.width + this.opts.pspace) * node._data.layout.direction; + pout_cache.y = offset_p.y; + //logger.debug('pout'); + //logger.debug(pout_cache); + } + } + return pout_cache; + }, + + get_expander_point: function (node) { + var p = this.get_node_point_out(node); + var ex_p = {}; + if (node._data.layout.direction == jm.direction.right) { + ex_p.x = p.x - this.opts.pspace; + } else { + ex_p.x = p.x; + } + ex_p.y = p.y - Math.ceil(this.opts.pspace / 2); + return ex_p; + }, + + get_min_size: function () { + var nodes = this.jm.mind.nodes; + var node = null; + var pout = null; + for (var nodeid in nodes) { + node = nodes[nodeid]; + pout = this.get_node_point_out(node); + if (pout.x > this.bounds.e) { this.bounds.e = pout.x; } + if (pout.x < this.bounds.w) { this.bounds.w = pout.x; } + } + return { + w: this.bounds.e - this.bounds.w, + h: this.bounds.s - this.bounds.n + } + }, + + toggle_node: function (node) { + if (node.isroot) { + return; + } + if (node.expanded) { + this.collapse_node(node); + } else { + this.expand_node(node); + } + }, + + expand_node: function (node) { + node.expanded = true; + this.part_layout(node); + this.set_visible(node.children, true); + this.jm.invoke_event_handle(jm.event_type.show, { evt: 'expand_node', data: [], node: node.id }); + }, + + collapse_node: function (node) { + node.expanded = false; + this.part_layout(node); + this.set_visible(node.children, false); + this.jm.invoke_event_handle(jm.event_type.show, { evt: 'collapse_node', data: [], node: node.id }); + }, + + expand_all: function () { + var nodes = this.jm.mind.nodes; + var c = 0; + var node; + for (var nodeid in nodes) { + node = nodes[nodeid]; + if (!node.expanded) { + node.expanded = true; + c++; + } + } + if (c > 0) { + var root = this.jm.mind.root; + this.part_layout(root); + this.set_visible(root.children, true); + } + }, + + collapse_all: function () { + var nodes = this.jm.mind.nodes; + var c = 0; + var node; + for (var nodeid in nodes) { + node = nodes[nodeid]; + if (node.expanded && !node.isroot) { + node.expanded = false; + c++; + } + } + if (c > 0) { + var root = this.jm.mind.root; + this.part_layout(root); + this.set_visible(root.children, true); + } + }, + + expand_to_depth: function (target_depth, curr_nodes, curr_depth) { + if (target_depth < 1) { return; } + var nodes = curr_nodes || this.jm.mind.root.children; + var depth = curr_depth || 1; + var i = nodes.length; + var node = null; + while (i--) { + node = nodes[i]; + if (depth < target_depth) { + if (!node.expanded) { + this.expand_node(node); + } + this.expand_to_depth(target_depth, node.children, depth + 1); + } + if (depth == target_depth) { + if (node.expanded) { + this.collapse_node(node); + } + } + } + }, + + part_layout: function (node) { + var root = this.jm.mind.root; + if (!!root) { + var root_layout_data = root._data.layout; + if (node.isroot) { + root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes); + root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes); + } else { + if (node._data.layout.direction == jm.direction.right) { + root_layout_data.outer_height_right = this._layout_offset_subnodes_height(root_layout_data.right_nodes); + } else { + root_layout_data.outer_height_left = this._layout_offset_subnodes_height(root_layout_data.left_nodes); + } + } + this.bounds.s = Math.max(root_layout_data.outer_height_left, root_layout_data.outer_height_right); + this.cache_valid = false; + } else { + logger.warn('can not found root node'); + } + }, + + set_visible: function (nodes, visible) { + var i = nodes.length; + var node = null; + var layout_data = null; + while (i--) { + node = nodes[i]; + layout_data = node._data.layout; + if (node.expanded) { + this.set_visible(node.children, visible); + } else { + this.set_visible(node.children, false); + } + if (!node.isroot) { + node._data.layout.visible = visible; + } + } + }, + + is_expand: function (node) { + return node.expanded; + }, + + is_visible: function (node) { + var layout_data = node._data.layout; + if (('visible' in layout_data) && !layout_data.visible) { + return false; + } else { + return true; + } + } + }; + + jm.graph_canvas = function (view) { + this.opts = view.opts; + this.e_canvas = $c('canvas'); + this.e_canvas.className = 'jsmind'; + this.canvas_ctx = this.e_canvas.getContext('2d'); + this.size = { w: 0, h: 0 }; + }; + + jm.graph_canvas.prototype = { + element: function () { + return this.e_canvas; + }, + + set_size: function (w, h) { + this.size.w = w; + this.size.h = h; + this.e_canvas.width = w; + this.e_canvas.height = h; + }, + + clear: function () { + this.canvas_ctx.clearRect(0, 0, this.size.w, this.size.h); + }, + + draw_line: function (pout, pin, offset) { + var ctx = this.canvas_ctx; + ctx.strokeStyle = this.opts.line_color; + ctx.lineWidth = this.opts.line_width; + ctx.lineCap = 'round'; + + this._bezier_to(ctx, + pin.x + offset.x, + pin.y + offset.y, + pout.x + offset.x, + pout.y + offset.y); + }, + + copy_to: function (dest_canvas_ctx, callback) { + dest_canvas_ctx.drawImage(this.e_canvas, 0, 0); + !!callback && callback(); + }, + + _bezier_to: function (ctx, x1, y1, x2, y2) { + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.bezierCurveTo(x1 + (x2 - x1) * 2 / 3, y1, x1, y2, x2, y2); + ctx.stroke(); + }, + + _line_to: function (ctx, x1, y1, x2, y2) { + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + } + }; + + jm.graph_svg = function (view) { + this.view = view; + this.opts = view.opts; + this.e_svg = jm.graph_svg.c('svg'); + this.e_svg.className = 'jsmind'; + this.size = { w: 0, h: 0 }; + this.lines = []; + }; + + jm.graph_svg.c = function (tag) { + return $d.createElementNS('http://www.w3.org/2000/svg', tag); + }; + + jm.graph_svg.prototype = { + element: function () { + return this.e_svg; + }, + + set_size: function (w, h) { + this.size.w = w; + this.size.h = h; + this.e_svg.setAttribute('width', w); + this.e_svg.setAttribute('height', h); + }, + + clear: function () { + var len = this.lines.length; + while (len--) { + this.e_svg.removeChild(this.lines[len]); + } + this.lines.length = 0; + }, + + draw_line: function (pout, pin, offset) { + var line = jm.graph_svg.c('path'); + line.setAttribute('stroke', this.opts.line_color); + line.setAttribute('stroke-width', this.opts.line_width); + line.setAttribute('fill', 'transparent'); + this.lines.push(line); + this.e_svg.appendChild(line); + this._bezier_to(line, pin.x + offset.x, pin.y + offset.y, pout.x + offset.x, pout.y + offset.y); + }, + + copy_to: function (dest_canvas_ctx, callback) { + var img = new Image(); + img.onload = function () { + dest_canvas_ctx.drawImage(img, 0, 0); + !!callback && callback(); + } + img.src = 'data:image/svg+xml;base64,' + btoa(new XMLSerializer().serializeToString(this.e_svg)); + }, + + _bezier_to: function (path, x1, y1, x2, y2) { + path.setAttribute('d', 'M' + x1 + ' ' + y1 + ' C ' + (x1 + (x2 - x1) * 2 / 3) + ' ' + y1 + ', ' + x1 + ' ' + y2 + ', ' + x2 + ' ' + y2); + }, + + _line_to: function (path, x1, y1, x2, y2) { + path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' L ' + x2 + ' ' + y2); + } + }; + + // view provider + jm.view_provider = function (jm, options) { + this.opts = options; + this.jm = jm; + this.layout = jm.layout; + + this.container = null; + this.e_panel = null; + this.e_nodes = null; + + this.size = { w: 0, h: 0 }; + + this.selected_node = null; + this.editing_node = null; + + this.graph = null; + }; + + jm.view_provider.prototype = { + init: function () { + logger.debug('view.init'); + + this.container = $i(this.opts.container) ? this.opts.container : $g(this.opts.container); + if (!this.container) { + logger.error('the options.view.container was not be found in dom'); + return; + } + this.e_panel = $c('div'); + this.e_nodes = $c('jmnodes'); + this.e_editor = $c('input'); + + this.graph = this.opts.engine.toLowerCase() === 'svg' ? new jm.graph_svg(this) : new jm.graph_canvas(this); + + this.e_panel.className = 'jsmind-inner'; + this.e_panel.appendChild(this.graph.element()); + this.e_panel.appendChild(this.e_nodes); + + this.e_editor.className = 'jsmind-editor'; + this.e_editor.type = 'text'; + + this.actualZoom = 1; + this.zoomStep = 0.1; + this.minZoom = 0.5; + this.maxZoom = 2; + + var v = this; + jm.util.dom.add_event(this.e_editor, 'keydown', function (e) { + var evt = e || event; + if (evt.keyCode == 13) { v.edit_node_end(); evt.stopPropagation(); } + }); + jm.util.dom.add_event(this.e_editor, 'blur', function (e) { + v.edit_node_end(); + }); + + this.container.appendChild(this.e_panel); + }, + + add_event: function (obj, event_name, event_handle) { + jm.util.dom.add_event(this.e_nodes, event_name, function (e) { + var evt = e || event; + event_handle.call(obj, evt); + }); + }, + + get_binded_nodeid: function (element) { + if (element == null) { + return null; + } + var tagName = element.tagName.toLowerCase(); + if (tagName == 'jmnodes' || tagName == 'body' || tagName == 'html') { + return null; + } + if (tagName == 'jmnode' || tagName == 'jmexpander') { + return element.getAttribute('nodeid'); + } else { + return this.get_binded_nodeid(element.parentElement); + } + }, + + is_expander: function (element) { + return (element.tagName.toLowerCase() == 'jmexpander'); + }, + + reset: function () { + logger.debug('view.reset'); + this.selected_node = null; + this.clear_lines(); + this.clear_nodes(); + this.reset_theme(); + }, + + reset_theme: function () { + var theme_name = this.jm.options.theme; + if (!!theme_name) { + this.e_nodes.className = 'theme-' + theme_name; + } else { + this.e_nodes.className = ''; + } + }, + + reset_custom_style: function () { + var nodes = this.jm.mind.nodes; + for (var nodeid in nodes) { + this.reset_node_custom_style(nodes[nodeid]); + } + }, + + load: function () { + logger.debug('view.load'); + this.init_nodes(); + }, + + expand_size: function () { + var min_size = this.layout.get_min_size(); + var min_width = min_size.w + this.opts.hmargin * 2; + var min_height = min_size.h + this.opts.vmargin * 2; + var client_w = this.e_panel.clientWidth; + var client_h = this.e_panel.clientHeight; + if (client_w < min_width) { client_w = min_width; } + if (client_h < min_height) { client_h = min_height; } + this.size.w = client_w; + this.size.h = client_h; + }, + + init_nodes_size: function (node) { + var view_data = node._data.view; + view_data.width = view_data.element.clientWidth; + view_data.height = view_data.element.clientHeight; + }, + + init_nodes: function () { + var nodes = this.jm.mind.nodes; + var doc_frag = $d.createDocumentFragment(); + for (var nodeid in nodes) { + this.create_node_element(nodes[nodeid], doc_frag); + } + this.e_nodes.appendChild(doc_frag); + for (var nodeid in nodes) { + this.init_nodes_size(nodes[nodeid]); + } + }, + + add_node: function (node) { + this.create_node_element(node, this.e_nodes); + this.init_nodes_size(node); + }, + + create_node_element: function (node, parent_node) { + var view_data = null; + if ('view' in node._data) { + view_data = node._data.view; + } else { + view_data = {}; + node._data.view = view_data; + } + + var d = $c('jmnode'); + if (node.isroot) { + d.className = 'root'; + } else { + var d_e = $c('jmexpander'); + $t(d_e, '-'); + d_e.setAttribute('nodeid', node.id); + d_e.style.visibility = 'hidden'; + parent_node.appendChild(d_e); + view_data.expander = d_e; + } + if (!!node.topic) { + if (this.opts.support_html) { + $h(d, node.topic); + } else { + $t(d, node.topic); + } + } + d.setAttribute('nodeid', node.id); + d.style.visibility = 'hidden'; + this._reset_node_custom_style(d, node.data); + + parent_node.appendChild(d); + view_data.element = d; + }, + + remove_node: function (node) { + if (this.selected_node != null && this.selected_node.id == node.id) { + this.selected_node = null; + } + if (this.editing_node != null && this.editing_node.id == node.id) { + node._data.view.element.removeChild(this.e_editor); + this.editing_node = null; + } + var children = node.children; + var i = children.length; + while (i--) { + this.remove_node(children[i]); + } + if (node._data.view) { + var element = node._data.view.element; + var expander = node._data.view.expander; + this.e_nodes.removeChild(element); + this.e_nodes.removeChild(expander); + node._data.view.element = null; + node._data.view.expander = null; + } + }, + + update_node: function (node) { + var view_data = node._data.view; + var element = view_data.element; + if (!!node.topic) { + if (this.opts.support_html) { + $h(element, node.topic); + } else { + $t(element, node.topic); + } + } + view_data.width = element.clientWidth; + view_data.height = element.clientHeight; + }, + + select_node: function (node) { + if (!!this.selected_node) { + this.selected_node._data.view.element.className = + this.selected_node._data.view.element.className.replace(/\s*selected\b/i, ''); + this.reset_node_custom_style(this.selected_node); + } + if (!!node) { + this.selected_node = node; + node._data.view.element.className += ' selected'; + this.clear_node_custom_style(node); + } + }, + + select_clear: function () { + this.select_node(null); + }, + + get_editing_node: function () { + return this.editing_node; + }, + + is_editing: function () { + return (!!this.editing_node); + }, + + edit_node_begin: function (node) { + if (!node.topic) { + logger.warn("don't edit image nodes"); + return; + } + if (this.editing_node != null) { + this.edit_node_end(); + } + this.editing_node = node; + var view_data = node._data.view; + var element = view_data.element; + var topic = node.topic; + var ncs = getComputedStyle(element); + this.e_editor.value = topic; + this.e_editor.style.width = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + 'px'; + element.innerHTML = ''; + element.appendChild(this.e_editor); + element.style.zIndex = 5; + this.e_editor.focus(); + this.e_editor.select(); + }, + + edit_node_end: function () { + if (this.editing_node != null) { + var node = this.editing_node; + this.editing_node = null; + var view_data = node._data.view; + var element = view_data.element; + var topic = this.e_editor.value; + element.style.zIndex = 'auto'; + element.removeChild(this.e_editor); + if (jm.util.text.is_empty(topic) || node.topic === topic) { + if (this.opts.support_html) { + $h(element, node.topic); + } else { + $t(element, node.topic); + } + } else { + this.jm.update_node(node.id, topic); + } + } + }, + + get_view_offset: function () { + var bounds = this.layout.bounds; + var _x = (this.size.w - bounds.e - bounds.w) / 2; + var _y = this.size.h / 2; + return { x: _x, y: _y }; + }, + + resize: function () { + this.graph.set_size(1, 1); + this.e_nodes.style.width = '1px'; + this.e_nodes.style.height = '1px'; + + this.expand_size(); + this._show(); + }, + + _show: function () { + this.graph.set_size(this.size.w, this.size.h); + this.e_nodes.style.width = this.size.w + 'px'; + this.e_nodes.style.height = this.size.h + 'px'; + this.show_nodes(); + this.show_lines(); + //this.layout.cache_valid = true; + this.jm.invoke_event_handle(jm.event_type.resize, { data: [] }); + }, + + zoomIn: function () { + return this.setZoom(this.actualZoom + this.zoomStep); + }, + + zoomOut: function () { + return this.setZoom(this.actualZoom - this.zoomStep); + }, + + setZoom: function (zoom) { + if ((zoom < this.minZoom) || (zoom > this.maxZoom)) { + return false; + } + this.actualZoom = zoom; + for (var i = 0; i < this.e_panel.children.length; i++) { + this.e_panel.children[i].style.transform = 'scale(' + zoom + ')'; + }; + this.show(true); + return true; + + }, + + _center_root: function () { + // center root node + var outer_w = this.e_panel.clientWidth; + var outer_h = this.e_panel.clientHeight; + if (this.size.w > outer_w) { + var _offset = this.get_view_offset(); + this.e_panel.scrollLeft = _offset.x - outer_w / 2; + } + if (this.size.h > outer_h) { + this.e_panel.scrollTop = (this.size.h - outer_h) / 2; + } + }, + + show: function (keep_center) { + logger.debug('view.show'); + this.expand_size(); + this._show(); + if (!!keep_center) { + this._center_root(); + } + }, + + relayout: function () { + this.expand_size(); + this._show(); + }, + + save_location: function (node) { + var vd = node._data.view; + vd._saved_location = { + x: parseInt(vd.element.style.left) - this.e_panel.scrollLeft, + y: parseInt(vd.element.style.top) - this.e_panel.scrollTop, + }; + }, + + restore_location: function (node) { + var vd = node._data.view; + this.e_panel.scrollLeft = parseInt(vd.element.style.left) - vd._saved_location.x; + this.e_panel.scrollTop = parseInt(vd.element.style.top) - vd._saved_location.y; + }, + + clear_nodes: function () { + var mind = this.jm.mind; + if (mind == null) { + return; + } + var nodes = mind.nodes; + var node = null; + for (var nodeid in nodes) { + node = nodes[nodeid]; + node._data.view.element = null; + node._data.view.expander = null; + } + this.e_nodes.innerHTML = ''; + }, + + show_nodes: function () { + var nodes = this.jm.mind.nodes; + var node = null; + var node_element = null; + var expander = null; + var p = null; + var p_expander = null; + var expander_text = '-'; + var view_data = null; + var _offset = this.get_view_offset(); + for (var nodeid in nodes) { + node = nodes[nodeid]; + view_data = node._data.view; + node_element = view_data.element; + expander = view_data.expander; + if (!this.layout.is_visible(node)) { + node_element.style.display = 'none'; + expander.style.display = 'none'; + continue; + } + this.reset_node_custom_style(node); + p = this.layout.get_node_point(node); + view_data.abs_x = _offset.x + p.x; + view_data.abs_y = _offset.y + p.y; + node_element.style.left = (_offset.x + p.x) + 'px'; + node_element.style.top = (_offset.y + p.y) + 'px'; + node_element.style.display = ''; + node_element.style.visibility = 'visible'; + if (!node.isroot && node.children.length > 0) { + expander_text = node.expanded ? '-' : '+'; + p_expander = this.layout.get_expander_point(node); + expander.style.left = (_offset.x + p_expander.x) + 'px'; + expander.style.top = (_offset.y + p_expander.y) + 'px'; + expander.style.display = ''; + expander.style.visibility = 'visible'; + $t(expander, expander_text); + } + // hide expander while all children have been removed + if (!node.isroot && node.children.length == 0) { + expander.style.display = 'none'; + expander.style.visibility = 'hidden'; + } + } + }, + + reset_node_custom_style: function (node) { + this._reset_node_custom_style(node._data.view.element, node.data); + }, + + _reset_node_custom_style: function (node_element, node_data) { + if ('background-color' in node_data) { + node_element.style.backgroundColor = node_data['background-color']; + } + if ('foreground-color' in node_data) { + node_element.style.color = node_data['foreground-color']; + } + if ('width' in node_data) { + node_element.style.width = node_data['width'] + 'px'; + } + if ('height' in node_data) { + node_element.style.height = node_data['height'] + 'px'; + } + if ('font-size' in node_data) { + node_element.style.fontSize = node_data['font-size'] + 'px'; + } + if ('font-weight' in node_data) { + node_element.style.fontWeight = node_data['font-weight']; + } + if ('font-style' in node_data) { + node_element.style.fontStyle = node_data['font-style']; + } + if ('background-image' in node_data) { + var backgroundImage = node_data['background-image']; + if (backgroundImage.startsWith('data') && node_data['width'] && node_data['height']) { + var img = new Image(); + + img.onload = function () { + var c = $c('canvas'); + c.width = node_element.clientWidth; + c.height = node_element.clientHeight; + var img = this; + if (c.getContext) { + var ctx = c.getContext('2d'); + ctx.drawImage(img, 2, 2, node_element.clientWidth, node_element.clientHeight); + var scaledImageData = c.toDataURL(); + node_element.style.backgroundImage = 'url(' + scaledImageData + ')'; + } + }; + img.src = backgroundImage; + + } else { + node_element.style.backgroundImage = 'url(' + backgroundImage + ')'; + } + node_element.style.backgroundSize = '99%'; + + if ('background-rotation' in node_data) { + node_element.style.transform = 'rotate(' + node_data['background-rotation'] + 'deg)'; + } + } + }, + + clear_node_custom_style: function (node) { + var node_element = node._data.view.element; + node_element.style.backgroundColor = ""; + node_element.style.color = ""; + }, + + clear_lines: function () { + this.graph.clear(); + }, + + show_lines: function () { + this.clear_lines(); + var nodes = this.jm.mind.nodes; + var node = null; + var pin = null; + var pout = null; + var _offset = this.get_view_offset(); + for (var nodeid in nodes) { + node = nodes[nodeid]; + if (!!node.isroot) { continue; } + if (('visible' in node._data.layout) && !node._data.layout.visible) { continue; } + pin = this.layout.get_node_point_in(node); + pout = this.layout.get_node_point_out(node.parent); + this.graph.draw_line(pout, pin, _offset); + } + }, + }; + + // shortcut provider + jm.shortcut_provider = function (jm, options) { + this.jm = jm; + this.opts = options; + this.mapping = options.mapping; + this.handles = options.handles; + this._newid = null; + this._mapping = {}; + }; + + jm.shortcut_provider.prototype = { + init: function () { + jm.util.dom.add_event($d, 'keydown', this.handler.bind(this)); + + this.handles['addchild'] = this.handle_addchild; + this.handles['addbrother'] = this.handle_addbrother; + this.handles['editnode'] = this.handle_editnode; + this.handles['delnode'] = this.handle_delnode; + this.handles['toggle'] = this.handle_toggle; + this.handles['up'] = this.handle_up; + this.handles['down'] = this.handle_down; + this.handles['left'] = this.handle_left; + this.handles['right'] = this.handle_right; + + for (var handle in this.mapping) { + if (!!this.mapping[handle] && (handle in this.handles)) { + this._mapping[this.mapping[handle]] = this.handles[handle]; + } + } + + if (typeof this.opts.id_generator === 'function') { + this._newid = this.opts.id_generator; + } else { + this._newid = jm.util.uuid.newid; + } + }, + + enable_shortcut: function () { + this.opts.enable = true; + }, + + disable_shortcut: function () { + this.opts.enable = false; + }, + + handler: function (e) { + if (e.which == 9) { e.preventDefault(); } //prevent tab to change focus in browser + if (this.jm.view.is_editing()) { return; } + var evt = e || event; + if (!this.opts.enable) { return true; } + var kc = evt.keyCode + (evt.metaKey << 13) + (evt.ctrlKey << 12) + (evt.altKey << 11) + (evt.shiftKey << 10); + if (kc in this._mapping) { + this._mapping[kc].call(this, this.jm, e); + } + }, + + handle_addchild: function (_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + var nodeid = this._newid(); + var node = _jm.add_node(selected_node, nodeid, 'New Node'); + if (!!node) { + _jm.select_node(nodeid); + _jm.begin_edit(nodeid); + } + } + }, + handle_addbrother: function (_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node && !selected_node.isroot) { + var nodeid = this._newid(); + var node = _jm.insert_node_after(selected_node, nodeid, 'New Node'); + if (!!node) { + _jm.select_node(nodeid); + _jm.begin_edit(nodeid); + } + } + }, + handle_editnode: function (_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + _jm.begin_edit(selected_node); + } + }, + handle_delnode: function (_jm, e) { + var selected_node = _jm.get_selected_node(); + if (!!selected_node && !selected_node.isroot) { + _jm.select_node(selected_node.parent); + _jm.remove_node(selected_node); + } + }, + handle_toggle: function (_jm, e) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + _jm.toggle_node(selected_node.id); + evt.stopPropagation(); + evt.preventDefault(); + } + }, + handle_up: function (_jm, e) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + var up_node = _jm.find_node_before(selected_node); + if (!up_node) { + var np = _jm.find_node_before(selected_node.parent); + if (!!np && np.children.length > 0) { + up_node = np.children[np.children.length - 1]; + } + } + if (!!up_node) { + _jm.select_node(up_node); + } + evt.stopPropagation(); + evt.preventDefault(); + } + }, + + handle_down: function (_jm, e) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + if (!!selected_node) { + var down_node = _jm.find_node_after(selected_node); + if (!down_node) { + var np = _jm.find_node_after(selected_node.parent); + if (!!np && np.children.length > 0) { + down_node = np.children[0]; + } + } + if (!!down_node) { + _jm.select_node(down_node); + } + evt.stopPropagation(); + evt.preventDefault(); + } + }, + + handle_left: function (_jm, e) { + this._handle_direction(_jm, e, jm.direction.left); + }, + handle_right: function (_jm, e) { + this._handle_direction(_jm, e, jm.direction.right); + }, + _handle_direction: function (_jm, e, d) { + var evt = e || event; + var selected_node = _jm.get_selected_node(); + var node = null; + if (!!selected_node) { + if (selected_node.isroot) { + var c = selected_node.children; + var children = []; + for (var i = 0; i < c.length; i++) { + if (c[i].direction === d) { + children.push(i); + } + } + node = c[children[Math.floor((children.length - 1) / 2)]]; + } + else if (selected_node.direction === d) { + var children = selected_node.children; + var childrencount = children.length; + if (childrencount > 0) { + node = children[Math.floor((childrencount - 1) / 2)]; + } + } else { + node = selected_node.parent; + } + if (!!node) { + _jm.select_node(node); + } + evt.stopPropagation(); + evt.preventDefault(); + } + }, + }; + + + // plugin + jm.plugin = function (name, init) { + this.name = name; + this.init = init; + }; + + jm.plugins = []; + + jm.register_plugin = function (plugin) { + if (plugin instanceof jm.plugin) { + jm.plugins.push(plugin); + } + }; + + jm.init_plugins = function (sender) { + $w.setTimeout(function () { + jm._init_plugins(sender); + }, 0); + }; + + jm._init_plugins = function (sender) { + var l = jm.plugins.length; + var fn_init = null; + for (var i = 0; i < l; i++) { + fn_init = jm.plugins[i].init; + if (typeof fn_init === 'function') { + fn_init(sender); + } + } + }; + + // quick way + jm.show = function (options, mind) { + var _jm = new jm(options); + _jm.show(mind); + return _jm; + }; + + // export jsmind + if (typeof module !== 'undefined' && typeof exports === 'object') { + module.exports = jm; + } else if (typeof define === 'function' && (define.amd || define.cmd)) { + define(function () { return jm; }); + } else { + $w[__name__] = jm; + } +})(typeof window !== 'undefined' ? window : global); + diff --git a/src/common/js/map.js b/src/common/js/map.js index e136957..2cb778b 100644 --- a/src/common/js/map.js +++ b/src/common/js/map.js @@ -5,7 +5,7 @@ export function MP(ak) { } var script = document.createElement("script"); script.type = "text/javascript"; - script.src = "https://api.map.baidu.com/api?v=2.0&ak="+ak+"&callback=init&s=1"; + script.src = "https://api.map.baidu.com/api?v=2.0&ak="+ak+"&callback=init"; script.onerror = reject; document.head.appendChild(script); diff --git a/src/common/js/map2.js b/src/common/js/map2.js new file mode 100644 index 0000000..93305e5 --- /dev/null +++ b/src/common/js/map2.js @@ -0,0 +1,19 @@ +export function MP(ak) { + return new Promise(function (resolve, reject) { + //判断地图是否定义没 + if(typeof BMap !== "undefined"){ + resolve(BMap) + return true + } + window.init = function () { + resolve(BMap) + } + var script = document.createElement("script"); + script.type = "text/javascript"; + script.src = "https://api.map.baidu.com/api?v=2.0&ak="+ak+"&callback=init"; + script.onerror = reject; + document.head.appendChild(script); + + }) +} + diff --git a/src/common/js/treeTool.js b/src/common/js/treeTool.js new file mode 100644 index 0000000..3f53b26 --- /dev/null +++ b/src/common/js/treeTool.js @@ -0,0 +1,133 @@ + +export default { + + + reloadAllChildren: function(table,maps, rows,parentIdName,loadChildren,idMaps) { + + + if(!rows||rows.length==0){ + return; + } + if(!maps || maps.length==0){ + return; + } + + if(!table){ + return; + } + var lazyTreeNodeMap=table.store.states.lazyTreeNodeMap + var parentIds=rows.map(i=>i[parentIdName]) + if(idMaps==null){ + idMaps=new Map(); + } + if(parentIds.length==0){ + return; + } + parentIds.forEach(k=>{ + if(!idMaps.has(k)){ + idMaps.set(k,k); + if (maps.get(k)) { + const { tree, treeNode, resolve } = maps.get(k) + lazyTreeNodeMap[k]=[] + if (tree) { // 重新执行父节点加载子级操作 + loadChildren(tree, treeNode, resolve) + if(tree[parentIdName]){ + this.reloadAllChildren(table,maps, [tree],parentIdName,loadChildren,idMaps) + } + } + } + } + }); + }, + + + reloadChildren: function(table,maps, parentId,parentIdName,loadChildren) { + var params={}; + params[parentIdName]=parentId; + this.reloadAllChildren(table,maps, [params],parentIdName,loadChildren) + }, + reloadChildrenByOpType: function(table,maps, parentId,parentIdName,loadChildren,opType) { + var lazyTreeNodeMap=table.store.states.lazyTreeNodeMap + if (maps.get(parentId)) { + const { tree, treeNode, resolve } = maps.get(parentId) + if (tree) { // 重新执行父节点加载子级操作 + var oldDatas=lazyTreeNodeMap[parentId] + loadChildren(tree, treeNode, resolve,oldDatas,opType) + } + } + + }, + clearOpType: function(table,maps,parentId,parentIdName,loadChildren) { + var lazyTreeNodeMap=table.store.states.lazyTreeNodeMap + if (maps.get(parentId)) { + const { tree, treeNode, resolve } = maps.get(parentId) + if (tree) { // 重新执行父节点加载子级操作 + var oldDatas=lazyTreeNodeMap[parentId] + loadChildren(tree, treeNode, resolve,oldDatas,"clearOpType") + } + } + + }, + /** + * 将类表数据转换为如下树状结构的数据 + * { + * xxx:'', + * xxx2:'', + * children:[ + * xxx:'', + * xxx2:'', + * ] + * } + * @param {*} data2 将要转换的数据 + * @param {*} pidName 上级字段名称,如 pmenId + * @param {*} idName 本条数据主键字段名称 如 menuId + * @param {*} rowCallBack(data),如果需要对部分字段进行转换,可以传入这个回调函数。比如需要将 name:'陈天财' => label:'陈天财' + * @returns + */ + translateDataToTree: function(data2,pidName,idName,rowCallBack) { + var data=JSON.parse(JSON.stringify(data2)); + let parents = data.filter(value =>{ + //如果我的上级为空,则我是最上级 + if(value[pidName] == 'undefined' || value[pidName] == null || value[pidName] == ''|| value[pidName] == '0'){ + return true; + + //如果我的上级不在列表中,我作为最上级 + }else if(data.some(i=>value[pidName]==i[idName])){ + return false; + }else { + return true + } + + }) + let children = data.filter(value =>{ + if(data.some(i=>value[pidName]==i[idName])){ + return true; + }else{ + return false; + } + }) + let translator = (parents, children) => { + parents.forEach((parent) => { + if(rowCallBack){ + rowCallBack(parent) + } + children.forEach((current, index) => { + if (current[pidName] === parent[idName]) { + let temp = JSON.parse(JSON.stringify(children)) + temp.splice(index, 1) + translator([current], temp) + typeof parent.children !== 'undefined' && parent.children ? parent.children.push(current) : parent.children = [current] + parent.childrenCnt=parent.children.length + } + } + ) + } + ) + } + + translator(parents, children) + + return parents + }, + +} diff --git a/src/common/js/util.js b/src/common/js/util.js index 1504689..b10f196 100644 --- a/src/common/js/util.js +++ b/src/common/js/util.js @@ -1,26 +1,277 @@ var SIGN_REGEXP = /([yMdhsmH])(\1*)/g var DEFAULT_PATTERN = 'yyyy-MM-dd' + function padding(s, len) { var len = len - (s + '').length - for (var i = 0; i < len; i++) { s = '0' + s } + for (var i = 0; i < len; i++) { + s = '0' + s + } return s } + + export default { + + /** + * 通过字典值获取其名称 + * 界面上可以 + * {{formatDicts(dicts,'xxx',scope.row.xxx)}} + * @param {*} dicts + * @param {*} itemCode + * @param {*} cellValue + * @returns + */ + formatDicts: function(dicts,itemCode,cellValue){ + let key=itemCode; + if( dicts[key]==undefined || dicts[key]==null || dicts[key].length==0 ){ + return cellValue; + } + let dict=dicts[key].find(i=>i.id===cellValue) + if(dict){ + return dict.name + }else{ + return cellValue + } + }, + + /** + * 通过字典值获取其名称,返回根值相同的字典,并自动计算其对应显示样式 + * 界面上可以类似使用 + * 显示: + {{item.name}} + + * 下拉框: + + + + + {{item.name}} + + + + + 0|xx|#909399 + 1|xx|#409EFF + 2|xx|#67C23A + 3|xx|#E6A23C + 4|xx|#F56C6C + 5|xx|#00ced1 + 6|xx|#c71585 + 7|xx|#ff8c00 + 8|xx|#c7158577 + 9|xx|#ffd700 + * + * @param {*} dicts + * @param {*} itemCode + * @param {*} cellValue + * @returns [{id:'',name:'',className:'',color:'',icon:''}] + */ + formatDictsWithClass: function(dicts,itemCode,cellValue){ + + var classNames=['info','primary','success','warning','danger']; + var colors=['#909399','#409EFF','#67C23A','#E6A23C','#F56C6C','#00ced1','#c71585','#ff8c00','#c7158577','#ffd700']; + + let key=itemCode; + if(!cellValue){ + return []; + } + var cellValueInt=parseInt(cellValue) + if( isNaN(cellValueInt) ){ + cellValueInt=cellValue.charCodeAt(cellValue.length-1) + } + var colorIndex=cellValueInt % 10 + if(cellValueInt > 0 && colorIndex==0){ + colorIndex=1 + } + var typeIndex=cellValueInt % 5 + if(cellValueInt > 0 && typeIndex==0){ + typeIndex=1 + } + if(dicts[key]==undefined || dicts[key]==null || dicts[key].length==0 ){ + + return [{id:cellValue,name:cellValue,className:classNames[typeIndex],color:colors[colorIndex]}]; + } + let data=dicts[key].find(i=>i.id===cellValue) + if(data){ + data['className']=classNames[typeIndex] + if(!data.color){ + data.color=colors[colorIndex] + } + return [data]; + }else{ + return [{id:cellValue,name:cellValue,className:classNames[typeIndex],color:colors[colorIndex]}] + } + + }, + + getColor(cellValue){ + var colors=['#909399','#409EFF','#67C23A','#E6A23C','#F56C6C','#00ced1','#c71585','#ff8c00','#c7158577','#ffd700']; + if(!cellValue){ + return colors[0] + } + var cellValueInt=parseInt(cellValue) + if( isNaN(cellValueInt) ){ + + if(cellValue instanceof String && cellValue.length>0){ + cellValueInt=cellValue.charCodeAt(cellValue.length-1) + }else if(cellValue instanceof Object){ + if(cellValue['userid']){ + cellValueInt=cellValue['userid'].charCodeAt(cellValue['userid'].length-1) + }else{ + cellValueInt=0; + } + + }else{ + cellValueInt=0; + } + + } + var colorIndex=cellValueInt % 10 + if(cellValueInt > 0 && colorIndex==0){ + colorIndex=1 + } + return colors[colorIndex] + }, + + getType(cellValue){ + var classNames=['info','primary','success','warning','danger']; + + if(!cellValue){ + return classNames[0] + } + var cellValueInt=parseInt(cellValue) + if( isNaN(cellValueInt) ){ + cellValueInt=cellValue.charCodeAt(cellValue.length-1) + } + var typeIndex=cellValueInt % 5 + if(cellValueInt > 0 && typeIndex==0){ + typeIndex=1 + } + return classNames[typeIndex] + }, + calcTableMaxHeight(cssSelector) { + var table=cssSelector; + if(typeof cssSelector == 'string'){ + table=document.querySelector(cssSelector); + } + var innerHeight=window.innerHeight + var defaultInnerHeight=616; + var pageHeight=32/defaultInnerHeight*innerHeight + var top=150/defaultInnerHeight*innerHeight; + var bottomHeight=36/defaultInnerHeight*innerHeight + if(innerHeight>=916){ + bottomHeight=20/defaultInnerHeight*innerHeight + }else if(innerHeight>=800){ + bottomHeight=26/defaultInnerHeight*innerHeight + }else if(innerHeight>=700){ + bottomHeight=32/defaultInnerHeight*innerHeight + } + + if(table!=null){ + var rect=table.getBoundingClientRect() + if(rect && rect.top!=0){ + top=rect.top; + } + } + var maxTableHeight =innerHeight-top-pageHeight-bottomHeight; + return maxTableHeight; + }, + getPositionTop(node) { + + if(!node){ + return 0; + } + var rect=node.getBoundingClientRect() + var top=rect.top; + if(top==0){ + return 0; + } + return top; + }, + /** + * 获取时间的前后几分钟 + * @param {starTime,endTime} string yyyy-MM-dd HH:ss string yyyy-MM-dd HH:ss + * @return {formatdate} string + */ + timeDifference(starTime, endTime) { + //转成时间戳 + if (starTime) { + let starDate = new Date(starTime), + endDate = new Date(endTime) + let starStamps = starDate.getTime(), + endStamps = endDate.getTime(), + betweenStamps = '' + betweenStamps = Math.abs((parseInt(endStamps - starStamps))) + + let minute = parseInt(betweenStamps / 60000) //取分钟 + return minute + } else { + console.log('时间空') + } + + }, + /** + * 获取时间的前后几分钟 + * @param {dateTime,type,minuteNum} string yyyy-MM-dd HH:mm:ss string number + * @return {formatdate} string + */ + getAboutTime(dateTime, minuteNum) { + let string = dateTime.replace(/-/g, "/"), + date = new Date(string), + timeStamps = '', + dateObj = '', + hour = '', + minute = '', + formatdate = '' + timeStamps = date.setTime(date.getTime() - parseInt(minuteNum) * 60000) + dateObj = new Date(timeStamps) + + hour = dateObj.getHours() + if (hour < 10) { + hour = '0' + hour + } + minute = dateObj.getMinutes() + if (minute < 10) { + minute = '0' + minute + } + + formatdate = hour + ":" + minute //设置时间格式 + return formatdate + }, + //时间2020-09-30 + getDate() { + var date = new Date() + var myyear = date.getFullYear(); + var mymonth = date.getMonth() + 1; + var myweekday = date.getDate(); + if (mymonth < 10) { + mymonth = "0" + mymonth; + } + if (myweekday < 10) { + myweekday = "0" + myweekday; + } + + return (myyear + "-" + mymonth + "-" + myweekday); + }, + getQueryStringByName: function(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i') var r = window.location.search.substr(1).match(reg) var context = '' - if (r != null) { context = r[2] } + if (r != null) { + context = r[2] + } reg = null r = null return context == null || context == '' || context == 'undefined' ? '' : context }, - fmoney(s,n) { + fmoney(s, n) { n = n > 0 && n <= 20 ? n : 2; s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + ""; - var l = s.split(".")[0].split("").reverse(), r = s.split(".")[1]; + var l = s.split(".")[0].split("").reverse(), + r = s.split(".")[1]; var t = ""; for (let i = 0; i < l.length; i++) { t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : ""); @@ -29,45 +280,51 @@ export default { }, isNull(obj) { - if(obj === null || obj === '' || obj === undefined) { - return true; + if (obj === null || obj === '' || obj === undefined) { + return true; } return false; }, /** * 字段转成驼峰命名 - * @param {*} name + * @param {*} name */ toCamel(name) { - return name.replace(/\_(\w)/g, function(all, letter){ - return letter.toUpperCase(); + return name.replace(/\_(\w)/g, function(all, letter) { + return letter.toUpperCase(); }); }, /** * 驼峰转下横线 - * @param {*} name + * @param {*} name */ toLine(name) { - return name.replace(/([A-Z])/g,"_$1").toLowerCase(); - }, - formatDate: { - - format: function(date, pattern) { + return name.replace(/([A-Z])/g, "_$1").toLowerCase(); + }, + formatDate: function(date, pattern) { pattern = pattern || DEFAULT_PATTERN return pattern.replace(SIGN_REGEXP, function($0) { switch ($0.charAt(0)) { - case 'y': return padding(date.getFullYear(), $0.length) - case 'M': return padding(date.getMonth() + 1, $0.length) - case 'd': return padding(date.getDate(), $0.length) - case 'w': return date.getDay() + 1 - case 'h': return padding(date.getHours(), $0.length) - case 'H': return padding(date.getHours(), $0.length) - case 'm': return padding(date.getMinutes(), $0.length) - case 's': return padding(date.getSeconds(), $0.length) + case 'y': + return padding(date.getFullYear(), $0.length) + case 'M': + return padding(date.getMonth() + 1, $0.length) + case 'd': + return padding(date.getDate(), $0.length) + case 'w': + return date.getDay() + 1 + case 'h': + return padding(date.getHours(), $0.length) + case 'H': + return padding(date.getHours(), $0.length) + case 'm': + return padding(date.getMinutes(), $0.length) + case 's': + return padding(date.getSeconds(), $0.length) } }) }, - parse: function(dateString, pattern) { + parseDate: function(dateString, pattern) { var matchs1 = pattern.match(SIGN_REGEXP) var matchs2 = dateString.match(/(\d)+/g) if (matchs1.length == matchs2.length) { @@ -76,190 +333,203 @@ export default { var _int = parseInt(matchs2[i]) var sign = matchs1[i] switch (sign.charAt(0)) { - case 'y': _date.setFullYear(_int); break - case 'M': _date.setMonth(_int - 1); break - case 'd': _date.setDate(_int); break - case 'h': _date.setHours(_int); break - case 'm': _date.setMinutes(_int); break - case 's': _date.setSeconds(_int); break + case 'y': + _date.setFullYear(_int); + break + case 'M': + _date.setMonth(_int - 1); + break + case 'd': + _date.setDate(_int); + break + case 'h': + _date.setHours(_int); + break + case 'm': + _date.setMinutes(_int); + break + case 's': + _date.setSeconds(_int); + break } } return _date } return null - }, + }, - }, - //type date/daterange - pickerOptions: function(type){ - if(type!='datarange'){ - var shortcuts= [{ + getPickerOptions: function(type) { + if (type != 'datarange') { + var shortcuts = [{ text: '今天', onClick(picker) { - picker.$emit('pick', new Date()); + picker.$emit('pick', new Date()); } }, { text: '昨天', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24); + picker.$emit('pick', date); } }, { text: '前一周', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); + picker.$emit('pick', date); } }, { text: '前两周', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24 * 7 * 2); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24 * 7 * 2); + picker.$emit('pick', date); } }, { text: '前四周', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24 * 7 * 4); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24 * 7 * 4); + picker.$emit('pick', date); } }, { text: '后一周', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() + 3600 * 1000 * 24 * 7); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() + 3600 * 1000 * 24 * 7); + picker.$emit('pick', date); } }, { text: '后两周', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 *2); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 * 2); + picker.$emit('pick', date); } }, { text: '后一月', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 * 4); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 * 4); + picker.$emit('pick', date); } }, { text: '后两月', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 * 8); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 * 8); + picker.$emit('pick', date); } }, { text: '后四月', onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 * 16); - picker.$emit('pick', date); + const date = new Date(); + date.setTime(date.getTime() + 3600 * 1000 * 24 * 7 * 16); + picker.$emit('pick', date); } }] - return {shortcuts:shortcuts}; - }else{ - var shortcuts= [ - { + return { + shortcuts: shortcuts + }; + } else { + var shortcuts = [{ text: "前一周", onClick(picker) { - const end = new Date(); - const start = new Date(); - start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); + picker.$emit("pick", [start, end]); } }, { text: "前两周", onClick(picker) { - const end = new Date(); - const start = new Date(); - start.setTime(start.getTime() - 3600 * 1000 * 24 * 7 * 2); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7 * 2); + picker.$emit("pick", [start, end]); } }, { text: "前三周", onClick(picker) { - const end = new Date(); - const start = new Date(); - start.setTime(start.getTime() - 3600 * 1000 * 24 * 7 * 3); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7 * 3); + picker.$emit("pick", [start, end]); } - }, + }, { text: "前一个月", onClick(picker) { - const end = new Date(); - const start = new Date(); - start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); + picker.$emit("pick", [start, end]); } }, { text: "前三个月", onClick(picker) { - const end = new Date(); - const start = new Date(); - start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); + picker.$emit("pick", [start, end]); } }, { text: "后一周", onClick(picker) { - const end = new Date(); - const start = new Date(); - end.setTime(start.getTime() + 3600 * 1000 * 24 * 7); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + end.setTime(start.getTime() + 3600 * 1000 * 24 * 7); + picker.$emit("pick", [start, end]); } }, { text: "后两周", onClick(picker) { - const end = new Date(); - const start = new Date(); - end.setTime(start.getTime() + 3600 * 1000 * 24 * 7 * 2); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + end.setTime(start.getTime() + 3600 * 1000 * 24 * 7 * 2); + picker.$emit("pick", [start, end]); } }, { text: "后三周", onClick(picker) { - const end = new Date(); - const start = new Date(); - end.setTime(start.getTime() + 3600 * 1000 * 24 * 7 * 3); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + end.setTime(start.getTime() + 3600 * 1000 * 24 * 7 * 3); + picker.$emit("pick", [start, end]); } - }, + }, { text: "后一个月", onClick(picker) { - const end = new Date(); - const start = new Date(); - end.setTime(start.getTime() + 3600 * 1000 * 24 * 30); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + end.setTime(start.getTime() + 3600 * 1000 * 24 * 30); + picker.$emit("pick", [start, end]); } }, { text: "后三个月", onClick(picker) { - const end = new Date(); - const start = new Date(); - end.setTime(start.getTime() + 3600 * 1000 * 24 * 90); - picker.$emit("pick", [start, end]); + const end = new Date(); + const start = new Date(); + end.setTime(start.getTime() + 3600 * 1000 * 24 * 90); + picker.$emit("pick", [start, end]); } } - ] - return {shortcuts:shortcuts};; - } - + ] + return { + shortcuts: shortcuts + };; + } + }, } diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 5ebe9dd..aafc2ad 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -5,39 +5,7 @@ {{generateTitle(item.meta.title)}} {{generateTitle(item.meta.title)}} - - 全部应用 -
- -
-
-
- - -
- -
-
-
-
- + @@ -53,404 +21,13 @@ export default { levelList: null, drawer: false, direction: 'ttb', - key:"", - //模块分类 - categorys:[ - { - title:"日常应用", - childrens:[ - { - moduleName:"任务中心", - topModuleId:'oa', - link:"/mdp/workflow/ru/task/TaskListAssigneeToMe", - icon: require("../../assets/image/platform/module-task.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"流程中心", - topModuleId:'oa', - link:"/mdp/workflow/ru/execution/ExecutionListMyMonitors", - icon: require("../../assets/image/platform/module-flow.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"历史流程", - topModuleId:'oa', - link:"/mdp/workflow/hi/procinst/ProcinstListMyStart", - icon: require("../../assets/image/platform/module-historical.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"模型中心", - topModuleId:'oa', - link:"/mdp/workflow/de/ModelMng", - icon: require("../../assets/image/platform/module-odelCenter.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"智能表单", - topModuleId:'oa', - link:"/mdp/form/formDef/FormDefAdd", - icon: require("../../assets/image/platform/module-intelligentForms.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"新闻管理", - topModuleId:'arc', - link:"/mdp/arc/news/newsMng", - icon: require("../../assets/image/platform/module-news.png"), - isHighlight:false, - moduleType : '3', // 模块类型,1-系统类模块 2-系统外模块 3-系统外模块的模块 - }, - { - moduleName:"公告管理", - topModuleId:'arc', - link:"/mdp/arc/notice/noticeMng", - icon: require("../../assets/image/platform/module-notice.png"), - isHighlight:false, - moduleType : '3' // 模块类型,1-系统类模块 2-系统外模块 3-系统外模块的模块 - }, - ] - }, - { - title:"通讯沟通", - childrens:[ - { - moduleName:"通讯录", - topModuleId:'sys', - link:"/mdp/sys/user/deptUserMng", - icon: require("../../assets/image/platform/module-addressBook.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"内部邮件", - topModuleId:'oa', - link:"/oa/mail/mailEmail/MailEmailInbox", - icon: require("../../assets/image/platform/module-email1.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"外部邮件", - topModuleId:'oa', - link:"/oa/mail/mailAccount/MailAccountMng", - icon: require("../../assets/image/platform/module-email2.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"短信", - topModuleId:'sms', - link:"", - icon: require("../../assets/image/platform/module-note.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"聊天", - topModuleId:'im', - link:"", - icon: require("../../assets/image/platform/module-project.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - ] - }, - { - title:"工作执行", - childrens:[ - { - moduleName:"日程管理", - topModuleId:'oa', - link:"/oa/rc/rcScheduleMy/RcScheduleMyMng", - icon: require("../../assets/image/platform/module-schedule.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"督办管理", - topModuleId:'oa', - link:"/oa/duban/dubanItem/DubanItem", - icon: require("../../assets/image/platform/module-supervise.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"督办任务", - topModuleId:'oa', - link:"/oa/duban/dubanItemTask/HostDubanItemTask", - icon: require("../../assets/image/platform/module-supervisoryTask.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - ] - }, - { - title:"行政管理", - childrens:[ - { - moduleName:"组织", - topModuleId:'sys', - link:"/mdp/sys/dept/DeptMng", - icon: require("../../assets/image/platform/module-organization.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"资产管理", - topModuleId:'oa', - link:"/oa/erp/pur/require/RequireMng", - icon: require("../../assets/image/platform/module-property.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"会议管理", - topModuleId:'oa', - link:"/oa/meet/meetMeeting/MeetMeetingRequire", - icon: require("../../assets/image/platform/module-meeting.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"印章中心", - topModuleId:'oa', - link:"/oa/sig/sigSignet/SigSignetMng", - icon: require("../../assets/image/platform/module-sealCenter.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"车辆中心", - topModuleId:'oa', - link:"/oa/car/carOfficeCar/CarOfficeCarMng", - icon: require("../../assets/image/platform/module-car.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"办公用品", - topModuleId:'oa', - link:"/oa/om/omCategory/OmCategoryMng", - icon: require("../../assets/image/platform/module-office.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - - ] - }, - { - title:"人事管理", - childrens:[ - { - moduleName:"考勤管理", - topModuleId:'oa', - link:"/oa/kq/attendance/AttendanceMonth", - icon: require("../../assets/image/platform/module-attendance.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"绩效考核", - topModuleId:'oa', - link:"/oa/jx/MyAssessment", - icon: require("../../assets/image/platform/module-performance.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"档案信息", - topModuleId:'oa', - link:"/oa/hr/user/employeeInfo", - icon: require("../../assets/image/platform/module-record.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - ] - }, - { - title:"仓储管理", - childrens:[ - { - moduleName:"合同管理", - topModuleId:'oa', - link:"/oa/ht/contractCard/ContractCardMng", - icon: require("../../assets/image/platform/module-contract.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - } - ] - }, - { - title:"业务管控", - childrens:[ - { - moduleName:"业务中心", - topModuleId:'oa', - link:"/mdp/workflow/re/procdef/ProcdefListForParames", - icon: require("../../assets/image/platform/module-business.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"客户管理", - topModuleId:'oa', - link:"/oa/crm/customer/CustomerIndex", - icon: require("../../assets/image/platform/module-customerCenter.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"项目管理", - topModuleId:'xm', - link:"/xm/core/xmProject/XmProjectMng", - icon: require("../../assets/image/platform/module-project.png"), - isHighlight:false, - moduleType : '1' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"费用管理", - topModuleId:'ac', - link:"", - icon: require("../../assets/image/platform/module-cost.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"防伪", - topModuleId:'audit', - link:"/audit/base/productLifeCycle/productLifeCycleDetail/Safeguard", - icon: require("../../assets/image/platform/anti-fake.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - },{ - moduleName:"溯源", - topModuleId:'audit', - link:"/audit/base/productLifeCycle/productLifeCycleDetail/ProductLifeCycleDetailMng", - icon: require("../../assets/image/platform/traceSource.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - },{ - moduleName:"审计", - topModuleId:'audit', - link:"/audit/base/oper/operLog/OperLogMng", - icon: require("../../assets/image/platform/audit.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - - ] - }, - { - title:"系统模块", - childrens:[ - { - moduleName:"组织", - topModuleId:'sys', - link:"", - icon: require("../../assets/image/platform/module-organization.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"内容", - topModuleId:'arc', - link:"", - icon: require("../../assets/image/platform/module-content.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"流程", - topModuleId:'oa', - link:"", - icon: require("../../assets/image/platform/module-oa.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"商城", - topModuleId:'mallm', - link:"", - icon: require("../../assets/image/platform/module-store.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - } , - { - moduleName:"营销", - topModuleId:'mk', - link:"", - icon: require("../../assets/image/platform/module-marketing.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"财务", - topModuleId:'ac', - link:"", - icon: require("../../assets/image/platform/module-finance.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"短信", - topModuleId:'', - link:"sms", - icon: require("../../assets/image/platform/module-note.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"聊天", - topModuleId:'im', - link:"", - icon: require("../../assets/image/platform/module-project.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - { - moduleName:"防伪", - topModuleId:'audit', - link:"/audit/base/productLifeCycle/productLifeCycleDetail/Safeguard", - icon: require("../../assets/image/platform/anti-fake.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - },{ - moduleName:"溯源", - topModuleId:'audit', - link:"/audit/base/productLifeCycle/productLifeCycleDetail/ProductLifeCycleDetailMng", - icon: require("../../assets/image/platform/traceSource.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - },{ - moduleName:"审计", - topModuleId:'audit', - link:"/audit/base/oper/operLog/OperLogMng", - icon: require("../../assets/image/platform/audit.png"), - isHighlight:false, - moduleType : '2' // 模块类型,1-系统类模块 2-系统外模块 - }, - - ] - }, - - ], + key:"", } }, watch: { $route() { this.getBreadcrumb() - }, - key(val){ - console.log(this.key); - this.searchModule(); - } + }, }, methods: { generateTitle, @@ -461,43 +38,7 @@ export default { matched = [{ path: '/dashboard', meta: { title: 'dashboard' }}].concat(matched) } this.levelList = matched - }, - //路由跳转 - gotolink(module) { - if(module.topModuleId==process.env.CONTEXT){ - this.drawer = false - this.$router.replace(module.link); - } else{ - this.jumpToOtherSystem(module); - } - }, - //系统跳转 - jumpToOtherSystem(module) { - let href = window.location.protocol + "//" + window.location.host + "/" + module.topModuleId + "/"+ process.env.VERSION +"/#" + module.link; - window.open(href, module.moduleName,null,true); - NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it - - }, - //搜索 - searchModule(){ - for(let i =0 ; i -1){ - this.categorys[i].childrens[j].isHighlight = true; - } - } - } - } - } + }, } } @@ -512,76 +53,5 @@ export default { color: #97a8be; cursor: text; } - } - .drawer-box{ - .drawer{ - display: flex; - justify-content: center; - align-items: center; - .drawer-content{ - width: 900px; - height: 100%; - .drawer-content-input{ - display: flex; - justify-content: center; - } - .drawer-content-category{ - .category-name{ - color: #333333; - font-size: 16px; - } - .category-list{ - display: flex; - justify-content: flex-start; - flex-wrap: wrap; - .category-item{ - height: 70px; - width: 70px; - margin-right: 20px; - transition: all 0.3s; - .module-icon{ - width: 70px; - height: 38px; - text-align: center; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - img{ - width: 20px; - } - } - .module-name{ - height: 32px; - line-height: 32px; - color:#666666; - font-size: 12px; - text-align: center; - } - } - .category-item:hover{ - background: rgb(240, 241, 245); - } - } - } - } - } - .highlight{ - transform: scale(1.05); - -webkit-box-shadow: 0 0 30px rgba(0, 0, 0, 0.1); - border-radius: 50%; - box-shadow: 0 0 30px rgba(0, 0, 0, 0.15); - } - - } - - - + } + diff --git a/src/components/ExtInfos/Index.vue b/src/components/ExtInfos/Index.vue new file mode 100644 index 0000000..d6cd984 --- /dev/null +++ b/src/components/ExtInfos/Index.vue @@ -0,0 +1,211 @@ + + + + + \ No newline at end of file diff --git a/src/components/Guider/Index.js b/src/components/Guider/Index.js new file mode 100644 index 0000000..ae39493 --- /dev/null +++ b/src/components/Guider/Index.js @@ -0,0 +1,61 @@ + + + import Driver from 'driver.js'; + import 'driver.js/dist/driver.min.css'; + import guiderData from './guiderData' + + var driver = new Driver({ + className: 'driver-popover', + doneBtnText: '知道了', // 结束按钮的文字 + allowClose: false, // 是否可以通过点击遮罩层关闭指引 + stageBackground: '#ffffff', // 突出显示元素的背景颜色 + nextBtnText: '下一步', // 下一步按钮的文字 + prevBtnText: '上一步', // 上一步按钮的文字 + closeBtnText: '关闭', // 关闭按钮的文字 + keyboardControl: false, // 是否允许键盘操控 + xCloseButton: true, // 将关闭按钮作为X放在弹出 + onReset: (Element) => { + }, + }); + + +export default { + initDriver:function(guiderName){ + var driver = new Driver({ + className: 'driver-popover', + doneBtnText: '知道了', // 结束按钮的文字 + allowClose: false, // 是否可以通过点击遮罩层关闭指引 + stageBackground: '#ffffff', // 突出显示元素的背景颜色 + nextBtnText: '下一步', // 下一步按钮的文字 + prevBtnText: '上一步', // 上一步按钮的文字 + closeBtnText: '永远关闭', // 关闭按钮的文字 + keyboardControl: false, // 是否允许键盘操控 + xCloseButton: true, // 将关闭按钮作为X放在弹出 + onReset: (e) => { + var event= window.event; + if(event){ + var target=event.target; + if(target && target.className=='driver-close-btn'){ + localStorage.setItem("guider-"+guiderName,"1"); + } + } + } + }); + return driver; + }, + startBySteps: function(steps) { + driver.defineSteps(steps); + driver.start(); + }, + + startByName: function(guiderName,forceDisplayWhileClosed) { + var localExists=localStorage.getItem('guider-'+guiderName) + if(localExists=='1' && !forceDisplayWhileClosed){ + return; + } + var driver2=this.initDriver(guiderName); + var steps=guiderData.getSteps(guiderName); + driver2.defineSteps(steps); + driver2.start(); + }, +} diff --git a/src/components/Guider/guiderData.js b/src/components/Guider/guiderData.js new file mode 100644 index 0000000..3a961d6 --- /dev/null +++ b/src/components/Guider/guiderData.js @@ -0,0 +1,190 @@ +var xmHomePage=[ + { + element: '#XmProductAllMng', + popover: { + title: ' ', + description: '这里可以创建新产品,支持手工、复制现有项目、复制模板三种模式快速一键创建项目', + position: 'left' + }, + padding: 5, + }, + { + element: '#XmMenuMng', + popover: { + title: ' ', + description: '这里可以进行需求管理,包括需求设计、需求迭代、需求细化、需求变更等。', + position: 'left' + }, + padding: 5, + }, + { + element: '#XmProjectAllMng', + popover: { + title: ' ', + description: '这里可以进行项目管理、计划管理、任务管理,可以通过复制项目模板、复制现有项目快速创建项目。', + position: 'left', + }, + padding: 5, + }, + { + element: '#XmMyTaskCenter', + popover: { + title: ' ', + description: '这里可以进行任务管理,包括填报任务进度、分配任务执行人、工作量填报等', + position: 'left', + }, + padding: 5, + }, + { + element: '#XmGroupAllMng', + popover: { + title: ' ', + description: '这里可以快速创建项目、产品团队、快速管理团队成员。', + position: 'left', + }, + padding: 5, + } , + { + element: '#XmQuestionMng', + popover: { + title: ' ', + description: '这里可以进行测试管理、测试设计、测试执行等。', + position: 'left', + }, + padding: 5, + } , + { + element: '#TaskListAssigneeToMe', + popover: { + title: ' ', + description: '关于审批的所有事项,都可以从这里一站式管理。', + position: 'left', + }, + padding: 5, + } +]; + +var xmProductMng=[ + { + element: '#guider-one', + popover: { + title: ' ', + description: '这里可以创建新产品,支持手工、复制现有产品、复制模板三种模式快速一键创建产品', + position: 'bottom' + }, + padding: 5, + }, + { + element: '#guider-two', + popover: { + title: ' ', + description: '这里可以选择更多的查询条件,或者更多的操作。', + position: 'bottom' + }, + padding: 5, + }, + { + element: '#guider-three', + popover: { + title: ' ', + description: '这里可以跳转到产品视图,查看更多信息、做产品相关的各种操作。', + position: 'top', + }, + padding: 5, + }, + { + element: '#guider-four', + popover: { + title: ' ', + description: '这里可以统计产品的总体进度、工作量等所有统计数据。', + position: 'left', + }, + padding: 5, + }, + { + element: '#guider-five', + popover: { + title: ' ', + description: '这里可以将产品快速复制为新的共享模板、新的产品,达到快速创建产品的效果。', + position: 'left', + }, + padding: 5, + } + ]; + + +var xmProjectMng=[ + { + element: '#prj-plus-btn', + popover: { + title: ' ', + description: '这里可以创建新项目,支持手工、复制现有项目、复制模板三种模式快速一键创建项目', + position: 'bottom' + }, + padding: 5, + }, + { + element: '#prj-more-btn', + popover: { + title: ' ', + description: '这里可以选择更多的查询条件,或者更多的操作。', + position: 'bottom' + }, + padding: 5, + }, + { + element: '#prj-copy-btn', + popover: { + title: ' ', + description: '这里可以通过复制快速创建项目(同步复制项目计划、项目任务、项目团队及成员)', + position: 'right', + }, + padding: 5, + }, + { + element: '#prj-del-btn', + popover: { + title: ' ', + description: '这里可以把项目放入回收站(支持从回收站恢复)', + position: 'right', + }, + padding: 5, + }, + { + element: '#prj-calc-btn', + popover: { + title: ' ', + description: '这里可以把项目的所有统计数据更新为最新的汇总数据(包括进度、任务数、需求数、工作量等)', + position: 'right', + }, + padding: 5, + }, + { + element: '#prj-view-box', + popover: { + title: ' ', + description: '点击这个区域可以跳转到项目视图(可以管理项目计划、项目任务、项目变更、项目迭代、项目缺陷等)', + position: 'right', + }, + padding: 5, + } +]; + export default { + //请在下面添加数据 + steps:{ + xmHomePage, + xmProductMng, + xmProjectMng, + }, + + getSteps:function(guiderName){ + if(this.steps[guiderName]){ + return this.steps[guiderName] + }else{ + return [] + } + } + + } + + diff --git a/src/components/Image/ImageCategoryTree.vue b/src/components/Image/ImageCategoryTree.vue deleted file mode 100644 index bf0362a..0000000 --- a/src/components/Image/ImageCategoryTree.vue +++ /dev/null @@ -1,206 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/Image/More/Index.vue b/src/components/Image/More/Index.vue deleted file mode 100644 index fdab0b8..0000000 --- a/src/components/Image/More/Index.vue +++ /dev/null @@ -1,239 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/Image/More/IndexOneUpdate.vue b/src/components/Image/More/IndexOneUpdate.vue deleted file mode 100644 index 2f1d084..0000000 --- a/src/components/Image/More/IndexOneUpdate.vue +++ /dev/null @@ -1,242 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/Image/More/sizeimg.vue b/src/components/Image/More/sizeimg.vue deleted file mode 100644 index 154bc5f..0000000 --- a/src/components/Image/More/sizeimg.vue +++ /dev/null @@ -1,249 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/Image/ShearSelectUpload.vue b/src/components/Image/ShearSelectUpload.vue deleted file mode 100644 index f3d45b3..0000000 --- a/src/components/Image/ShearSelectUpload.vue +++ /dev/null @@ -1,579 +0,0 @@ - - - - - diff --git a/src/components/Image/Single/Index.vue b/src/components/Image/Single/Index.vue deleted file mode 100644 index 5242687..0000000 --- a/src/components/Image/Single/Index.vue +++ /dev/null @@ -1,191 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/Image/UploadImage.vue b/src/components/Image/UploadImage.vue deleted file mode 100644 index 50dba1d..0000000 --- a/src/components/Image/UploadImage.vue +++ /dev/null @@ -1,553 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/ImageCropper/index.vue b/src/components/ImageCropper/index.vue deleted file mode 100644 index c1dade3..0000000 --- a/src/components/ImageCropper/index.vue +++ /dev/null @@ -1,1416 +0,0 @@ - - - - - - - diff --git a/src/components/ImageCropper/utils/data2blob.js b/src/components/ImageCropper/utils/data2blob.js deleted file mode 100644 index 9c47f8a..0000000 --- a/src/components/ImageCropper/utils/data2blob.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * database64文件格式转换为2进制 - * - * @param {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了 - * @param {[String]} mime [description] - * @return {[blob]} [description] - */ -export default function(data, mime) { - data = data.split(',')[1] - data = window.atob(data) - var ia = new Uint8Array(data.length) - for (var i = 0; i < data.length; i++) { - ia[i] = data.charCodeAt(i) - } - // canvas.toDataURL 返回的默认格式就是 image/png - return new Blob([ia], { - type: mime - }) -} diff --git a/src/components/ImageCropper/utils/effectRipple.js b/src/components/ImageCropper/utils/effectRipple.js deleted file mode 100644 index 46a0164..0000000 --- a/src/components/ImageCropper/utils/effectRipple.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * 点击波纹效果 - * - * @param {[event]} e [description] - * @param {[Object]} arg_opts [description] - * @return {[bollean]} [description] - */ -export default function(e, arg_opts) { - var opts = Object.assign({ - ele: e.target, // 波纹作用元素 - type: 'hit', // hit点击位置扩散center中心点扩展 - bgc: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 - }, arg_opts) - var target = opts.ele - if (target) { - var rect = target.getBoundingClientRect() - var ripple = target.querySelector('.e-ripple') - if (!ripple) { - ripple = document.createElement('span') - ripple.className = 'e-ripple' - ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px' - target.appendChild(ripple) - } else { - ripple.className = 'e-ripple' - } - switch (opts.type) { - case 'center': - ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px' - ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px' - break - default: - ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop) + 'px' - ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.body.scrollLeft) + 'px' - } - ripple.style.backgroundColor = opts.bgc - ripple.className = 'e-ripple z-active' - return false - } -} diff --git a/src/components/ImageCropper/utils/language.js b/src/components/ImageCropper/utils/language.js deleted file mode 100644 index 727872d..0000000 --- a/src/components/ImageCropper/utils/language.js +++ /dev/null @@ -1,232 +0,0 @@ -export default { - zh: { - hint: '点击,或拖动图片至此处', - loading: '正在上传……', - noSupported: '浏览器不支持该功能,请使用IE10以上或其他现在浏览器!', - success: '上传成功', - fail: '图片上传失败', - preview: '头像预览', - btn: { - off: '取消', - close: '关闭', - back: '上一步', - save: '保存' - }, - error: { - onlyImg: '仅限图片格式', - outOfSize: '单文件大小不能超过 ', - lowestPx: '图片最低像素为(宽*高):' - } - }, - 'zh-tw': { - hint: '點擊,或拖動圖片至此處', - loading: '正在上傳……', - noSupported: '瀏覽器不支持該功能,請使用IE10以上或其他現代瀏覽器!', - success: '上傳成功', - fail: '圖片上傳失敗', - preview: '頭像預覽', - btn: { - off: '取消', - close: '關閉', - back: '上一步', - save: '保存' - }, - error: { - onlyImg: '僅限圖片格式', - outOfSize: '單文件大小不能超過 ', - lowestPx: '圖片最低像素為(寬*高):' - } - }, - en: { - hint: 'Click or drag the file here to upload', - loading: 'Uploading…', - noSupported: 'Browser is not supported, please use IE10+ or other browsers', - success: 'Upload success', - fail: 'Upload failed', - preview: 'Preview', - btn: { - off: 'Cancel', - close: 'Close', - back: 'Back', - save: 'Save' - }, - error: { - onlyImg: 'Image only', - outOfSize: 'Image exceeds size limit: ', - lowestPx: 'Image\'s size is too low. Expected at least: ' - } - }, - ro: { - hint: 'Atinge sau trage fișierul aici', - loading: 'Se încarcă', - noSupported: 'Browser-ul tău nu suportă acest feature. Te rugăm încearcă cu alt browser.', - success: 'S-a încărcat cu succes', - fail: 'A apărut o problemă la încărcare', - preview: 'Previzualizează', - - btn: { - off: 'Anulează', - close: 'Închide', - back: 'Înapoi', - save: 'Salvează' - }, - - error: { - onlyImg: 'Doar imagini', - outOfSize: 'Imaginea depășește limita de: ', - loewstPx: 'Imaginea este prea mică; Minim: ' - } - }, - ru: { - hint: 'Нажмите, или перетащите файл в это окно', - loading: 'Загружаю……', - noSupported: 'Ваш браузер не поддерживается, пожалуйста, используйте IE10 + или другие браузеры', - success: 'Загрузка выполнена успешно', - fail: 'Ошибка загрузки', - preview: 'Предпросмотр', - btn: { - off: 'Отменить', - close: 'Закрыть', - back: 'Назад', - save: 'Сохранить' - }, - error: { - onlyImg: 'Только изображения', - outOfSize: 'Изображение превышает предельный размер: ', - lowestPx: 'Минимальный размер изображения: ' - } - }, - 'pt-br': { - hint: 'Clique ou arraste o arquivo aqui para carregar', - loading: 'Carregando…', - noSupported: 'Browser não suportado, use o IE10+ ou outro browser', - success: 'Sucesso ao carregar imagem', - fail: 'Falha ao carregar imagem', - preview: 'Pré-visualizar', - btn: { - off: 'Cancelar', - close: 'Fechar', - back: 'Voltar', - save: 'Salvar' - }, - error: { - onlyImg: 'Apenas imagens', - outOfSize: 'A imagem excede o limite de tamanho: ', - lowestPx: 'O tamanho da imagem é muito pequeno. Tamanho mínimo: ' - } - }, - fr: { - hint: 'Cliquez ou glissez le fichier ici.', - loading: 'Téléchargement…', - noSupported: 'Votre navigateur n\'est pas supporté. Utilisez IE10 + ou un autre navigateur s\'il vous plaît.', - success: 'Téléchargement réussit', - fail: 'Téléchargement echoué', - preview: 'Aperçu', - btn: { - off: 'Annuler', - close: 'Fermer', - back: 'Retour', - save: 'Enregistrer' - }, - error: { - onlyImg: 'Image uniquement', - outOfSize: 'L\'image sélectionnée dépasse la taille maximum: ', - lowestPx: 'L\'image sélectionnée est trop petite. Dimensions attendues: ' - } - }, - nl: { - hint: 'Klik hier of sleep een afbeelding in dit vlak', - loading: 'Uploaden…', - noSupported: 'Je browser wordt helaas niet ondersteund. Gebruik IE10+ of een andere browser.', - success: 'Upload succesvol', - fail: 'Upload mislukt', - preview: 'Voorbeeld', - btn: { - off: 'Annuleren', - close: 'Sluiten', - back: 'Terug', - save: 'Opslaan' - }, - error: { - onlyImg: 'Alleen afbeeldingen', - outOfSize: 'De afbeelding is groter dan: ', - lowestPx: 'De afbeelding is te klein! Minimale afmetingen: ' - } - }, - tr: { - hint: 'Tıkla veya yüklemek istediğini buraya sürükle', - loading: 'Yükleniyor…', - noSupported: 'Tarayıcı desteklenmiyor, lütfen IE10+ veya farklı tarayıcı kullanın', - success: 'Yükleme başarılı', - fail: 'Yüklemede hata oluştu', - preview: 'Önizle', - btn: { - off: 'İptal', - close: 'Kapat', - back: 'Geri', - save: 'Kaydet' - }, - error: { - onlyImg: 'Sadece resim', - outOfSize: 'Resim yükleme limitini aşıyor: ', - lowestPx: 'Resmin boyutu çok küçük. En az olması gereken: ' - } - }, - 'es-MX': { - hint: 'Selecciona o arrastra una imagen', - loading: 'Subiendo...', - noSupported: 'Tu navegador no es soportado, porfavor usa IE10+ u otros navegadores mas recientes', - success: 'Subido exitosamente', - fail: 'Sucedió un error', - preview: 'Vista previa', - btn: { - off: 'Cancelar', - close: 'Cerrar', - back: 'Atras', - save: 'Guardar' - }, - error: { - onlyImg: 'Unicamente imagenes', - outOfSize: 'La imagen excede el tamaño maximo:', - lowestPx: 'La imagen es demasiado pequeño. Se espera por lo menos:' - } - }, - de: { - hint: 'Klick hier oder zieh eine Datei hier rein zum Hochladen', - loading: 'Hochladen…', - noSupported: 'Browser wird nicht unterstützt, bitte verwende IE10+ oder andere Browser', - success: 'Upload erfolgreich', - fail: 'Upload fehlgeschlagen', - preview: 'Vorschau', - btn: { - off: 'Abbrechen', - close: 'Schließen', - back: 'Zurück', - save: 'Speichern' - }, - error: { - onlyImg: 'Nur Bilder', - outOfSize: 'Das Bild ist zu groß: ', - lowestPx: 'Das Bild ist zu klein. Mindestens: ' - } - }, - ja: { - hint: 'クリック・ドラッグしてファイルをアップロード', - loading: 'アップロード中...', - noSupported: 'このブラウザは対応されていません。IE10+かその他の主要ブラウザをお使いください。', - success: 'アップロード成功', - fail: 'アップロード失敗', - preview: 'プレビュー', - btn: { - off: 'キャンセル', - close: '閉じる', - back: '戻る', - save: '保存' - }, - error: { - onlyImg: '画像のみ', - outOfSize: '画像サイズが上限を超えています。上限: ', - lowestPx: '画像が小さすぎます。最小サイズ: ' - } - } -} diff --git a/src/components/ImageCropper/utils/mimes.js b/src/components/ImageCropper/utils/mimes.js deleted file mode 100644 index e20c085..0000000 --- a/src/components/ImageCropper/utils/mimes.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - 'jpg': 'image/jpeg', - 'png': 'image/png', - 'gif': 'image/gif', - 'svg': 'image/svg+xml', - 'psd': 'image/photoshop' -} diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue index e8afa59..c4cc1b3 100644 --- a/src/components/LangSelect/index.vue +++ b/src/components/LangSelect/index.vue @@ -21,7 +21,7 @@ export default { handleSetLanguage(lang) { this.$i18n.locale = lang this.$store.dispatch('setLanguage', lang) - this.$message({ + this.$message({showClose: true, message: 'switch language success', type: 'success' }) diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue index 56de914..82f64d8 100644 --- a/src/components/Screenfull/index.vue +++ b/src/components/Screenfull/index.vue @@ -41,7 +41,7 @@ export default { methods: { click() { if (!screenfull.enabled) { - this.$message({ + this.$message({showClose: true, message: 'you browser can not work', type: 'warning' }) diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue index b366d96..7af0649 100644 --- a/src/components/ThemePicker/index.vue +++ b/src/components/ThemePicker/index.vue @@ -57,7 +57,7 @@ export default { if (typeof innerText !== 'string') return style.innerText = this.updateStyle(innerText, originalCluster, themeCluster) }) - this.$message({ + this.$message({showClose: true, message: '换肤成功', type: 'success' }) diff --git a/src/components/Tinymce/index.vue b/src/components/Tinymce/index.vue new file mode 100644 index 0000000..d5d3b3c --- /dev/null +++ b/src/components/Tinymce/index.vue @@ -0,0 +1,296 @@ +