mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2025-12-08 17:12:28 +08:00
Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 73f7acfd5a | |||
| 728d62f851 | |||
| cd471735d7 | |||
| 30b35af000 | |||
| 3372c88607 | |||
| ce95008fdd | |||
| bb54b20734 | |||
| bd790ee24b | |||
| 11018ab29f | |||
| 67c4f7b3d9 | |||
| 9bd67f9905 | |||
| 283be0480e | |||
| f0d372d008 | |||
| 65180733e1 | |||
| c1dab6276a | |||
| a6b0dccded | |||
| bb24448ea2 | |||
| 07694cf42b | |||
| 2b544b74f7 | |||
| ac891d81ab | |||
| 0640f0b421 | |||
| ee5fa7ec22 | |||
| 8b41076a27 | |||
| 492ce922e9 | |||
| fce50e5209 | |||
| 107e901853 | |||
| c69884c84f | |||
| 5e2eba86e7 | |||
| 9c6f68fd4a | |||
| fd57f233e5 | |||
| 04c0ea55f2 | |||
| 9e8b97a0d9 | |||
| c4df7a4d12 | |||
| 36d60ec9d8 | |||
| 33c7bfec49 | |||
| b13942f95c | |||
| 71dc2f9862 | |||
| 5bece6562b | |||
| 8088815580 | |||
| 527007f74b | |||
| 6c3c24fe17 | |||
| 1178cd4228 | |||
| 13a88fc1cf | |||
| 446aaa314a | |||
| 5069209093 |
5
.github/ISSUE_TEMPLATE.md
vendored
5
.github/ISSUE_TEMPLATE.md
vendored
@ -5,3 +5,8 @@
|
|||||||
|
|
||||||
|
|
||||||
##### 截图&代码:
|
##### 截图&代码:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
友情提示: 未按格式要求发帖,会直接删掉。
|
||||||
|
|||||||
86
README.md
86
README.md
@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
@ -6,11 +7,12 @@
|
|||||||
Jeecg-Boot 快速开发平台(前后端分离版本)
|
Jeecg-Boot 快速开发平台(前后端分离版本)
|
||||||
===============
|
===============
|
||||||
|
|
||||||
当前最新版本: 2.0.2(发布日期:20190708)
|
当前最新版本: 2.1.2(发布日期:20191122)
|
||||||
|
|
||||||
|
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
||||||
[](http://www.jeecg.com)
|
[](http://www.jeecg.com)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
|
|
||||||
@ -21,7 +23,8 @@ Jeecg-Boot 快速开发平台(前后端分离版本)
|
|||||||
|
|
||||||
<h3 align="center">Java RAD framework for enterprise web applications</h3>
|
<h3 align="center">Java RAD framework for enterprise web applications</h3>
|
||||||
|
|
||||||
Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台!前后端分离架构:SpringBoot,Ant Design Vue,Mybatis,Shiro,JWT。强大的代码生成器让前端和后台代码一键生成,不需要写任何代码,保持jeecg一贯的强大,绝对是全栈开发福音!! JeecgBoot在提高UI能力的同时,降低了前后分离的开发成本,JeecgBoot还独创在线开发模式(No代码概念),一系列在线智能开发:在线配置表单、在线配置报表、在线图表设计、在线设计流程等等。
|
JeecgBoot 是一款基于代码生成器的J2EE快速开发平台!采用前后端分离架构:SpringBoot2.x,Ant Design&Vue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式-> 代码生成器模式-> 手工MERGE智能开发), 帮助解决Java项目70%的重复工作,让开发更多关注业务逻辑。既能快速提高开发效率,帮助公司节省成本,同时又不失灵活性!JeecgBoot还独创在线开发模式(No代码概念):在线表单配置(表单设计器)、移动配置能力、工作流配置(在线设计流程)、报表配置能力、在线图表配置、插件能力(可插拔)等等!
|
||||||
|
|
||||||
|
|
||||||
JEECG宗旨是: 简单功能由Online Coding配置实现(在线配置表单、在线配置报表、在线图表设计、在线设计流程、在线设计表单),复杂功能由代码生成器生成进行手工Merge,既保证了智能又兼顾了灵活;
|
JEECG宗旨是: 简单功能由Online Coding配置实现(在线配置表单、在线配置报表、在线图表设计、在线设计流程、在线设计表单),复杂功能由代码生成器生成进行手工Merge,既保证了智能又兼顾了灵活;
|
||||||
业务流程采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
|
业务流程采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
|
||||||
@ -36,13 +39,13 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
|||||||
技术文档
|
技术文档
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
- 在线演示 : [http://boot.jeecg.com](http://boot.jeecg.com)
|
- 在线演示 : [http://boot.jeecg.com](http://boot.jeecg.com)
|
||||||
|
|
||||||
- 技术官网: [http://www.jeecg.com](http://www.jeecg.com)
|
- 技术官网: [http://www.jeecg.com](http://www.jeecg.com)
|
||||||
|
|
||||||
- 开发文档: [http://jeecg-boot.mydoc.io/?t=345660](http://jeecg-boot.mydoc.io/?t=345660)
|
- 开发文档: [http://doc.jeecg.com/1273753](http://doc.jeecg.com/1273753)
|
||||||
|
|
||||||
- 视频教程 :[JeecgBoot实战入门系列视频](https://space.bilibili.com/454617261/channel/detail?cid=84186)
|
- 视频教程 :[JeecgBoot入门系列视频](https://space.bilibili.com/454617261/channel/detail?cid=84186)
|
||||||
|
|
||||||
- 常见问题: [入门常见问题大全](http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&extra=page%3D1)
|
- 常见问题: [入门常见问题大全](http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&extra=page%3D1)
|
||||||
|
|
||||||
@ -53,13 +56,13 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
|||||||
交流互动
|
交流互动
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
- QQ交流群 : ①284271917、②769925425
|
- QQ交流群 : ②769925425、①284271917(满)
|
||||||
|
|
||||||
- 反馈问题: [反馈问题,请按格式发Issues](https://github.com/zhangdaiscott/jeecg-boot/issues/new)
|
- 反馈问题: [反馈问题,请按格式发Issues](https://github.com/zhangdaiscott/jeecg-boot/issues/new)
|
||||||
|
|
||||||
- 参与开源: [欢迎加入JEECG开源团队,共同进步!!](http://www.jeecg.com/#/doc/canyu-os)
|
- 参与开源: [欢迎加入JEECG开源团队,共同进步!!](http://www.jeecg.com/#/doc/canyu-os)
|
||||||
|
|
||||||
- Online一分钟: [1分钟快速学习](https://my.oschina.net/jeecg/blog/3061917)
|
- Online一分钟: [1分钟快速学习](https://my.oschina.net/jeecg/blog/3083313)
|
||||||
|
|
||||||
|
|
||||||
为什么选择JEECG-BOOT?
|
为什么选择JEECG-BOOT?
|
||||||
@ -79,27 +82,44 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
|||||||
* 13.集成工作流activiti,并实现了只需在页面配置流程转向,可极大的简化bpm工作流的开发;用bpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码;
|
* 13.集成工作流activiti,并实现了只需在页面配置流程转向,可极大的简化bpm工作流的开发;用bpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码;
|
||||||
* 14.在线流程设计,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转
|
* 14.在线流程设计,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转
|
||||||
* 15.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据;
|
* 15.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据;
|
||||||
* 16.国际化:支持多语言,开发国际化项目非常方便;
|
* 16.提供单点登录CAS集成方案,项目中已经提供完善的对接代码
|
||||||
* 17.表单设计器,支持用户自定义表单布局,支持单表,一对多表单、支持select、radio、checkbox、textarea、date、popup、列表、宏等控件
|
* 17.表单设计器,支持用户自定义表单布局,支持单表,一对多表单、支持select、radio、checkbox、textarea、date、popup、列表、宏等控件
|
||||||
* 18.专业接口对接机制,统一采用restful接口方式,集成swagger-ui在线接口文档,Jwt token安全验证,方便客户端对接
|
* 18.专业接口对接机制,统一采用restful接口方式,集成swagger-ui在线接口文档,Jwt token安全验证,方便客户端对接
|
||||||
* 19.接口安全机制,可细化控制接口授权,非常简便实现不同客户端只看自己数据等控制
|
* 19.接口安全机制,可细化控制接口授权,非常简便实现不同客户端只看自己数据等控制
|
||||||
* 20.高级组合查询功能,在线配置支持主子表关联查询,可保存查询历史
|
* 20.高级组合查询功能,在线配置支持主子表关联查询,可保存查询历史
|
||||||
* 21.提供各种系统监控,实时跟踪系统运行情况(监控 Redis、Tomcat、jvm、服务器信息、请求追踪、SQL监控)
|
* 21.提供各种系统监控,实时跟踪系统运行情况(监控 Redis、Tomcat、jvm、服务器信息、请求追踪、SQL监控)
|
||||||
* 22.消息中心(支持短信、邮件、微信推送等等)
|
* 22.消息中心(支持短信、邮件、微信推送等等)
|
||||||
* 22.数据变更记录日志,可记录数据每次变更内容,通过版本对比功能查看历史变化
|
* 21.集成Websocket消息通知机制
|
||||||
* 23.平台UI强大,实现了移动自适应
|
* 22.提供APP发布方案国际化:
|
||||||
* 24.平台首页风格,提供多种组合模式,支持自定义风格
|
* 23.支持多语言,提供国际化方案;
|
||||||
* 25.提供简单易用的打印插件,支持谷歌、IE浏览器等各种浏览器
|
* 24.数据变更记录日志,可记录数据每次变更内容,通过版本对比功能查看历史变化
|
||||||
* 26.示例代码丰富,提供很多学习案例参考
|
* 25.平台UI强大,实现了移动自适应
|
||||||
* 27.采用maven分模块开发方式
|
* 26.平台首页风格,提供多种组合模式,支持自定义风格
|
||||||
* 27.支持菜单动态路由
|
* 27.提供简单易用的打印插件,支持谷歌、IE浏览器等各种浏览器
|
||||||
* 28.权限控制采用 RBAC(Role-Based Access Control,基于角色的访问控制)
|
* 28.示例代码丰富,提供很多学习案例参考
|
||||||
|
* 29.采用maven分模块开发方式
|
||||||
|
* 30.支持菜单动态路由
|
||||||
|
* 31.权限控制采用 RBAC(Role-Based Access Control,基于角色的访问控制)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
技术架构:
|
技术架构:
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
#### 开发环境
|
||||||
|
|
||||||
|
- 语言:Java 8
|
||||||
|
|
||||||
|
- IDE(JAVA): IDEA / Eclipse安装lombok插件
|
||||||
|
|
||||||
|
- IDE(前端): WebStorm 或者 IDEA
|
||||||
|
|
||||||
|
- 依赖管理:Maven
|
||||||
|
|
||||||
|
- 数据库:MySQL5.7+ & Oracle 11g & Sqlserver2017
|
||||||
|
|
||||||
|
- 缓存:Redis
|
||||||
|
|
||||||
|
|
||||||
#### 后端
|
#### 后端
|
||||||
- 基础框架:Spring Boot 2.1.3.RELEASE
|
- 基础框架:Spring Boot 2.1.3.RELEASE
|
||||||
@ -128,22 +148,6 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
|||||||
- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现
|
- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现
|
||||||
- eslint,[@vue/cli 3.2.1](https://cli.vuejs.org/zh/guide)
|
- eslint,[@vue/cli 3.2.1](https://cli.vuejs.org/zh/guide)
|
||||||
- vue-print-nb - 打印
|
- vue-print-nb - 打印
|
||||||
- [jeecg-boot-angular 版本](https://gitee.com/dangzhenghui/jeecg-boot)
|
|
||||||
|
|
||||||
#### 开发环境
|
|
||||||
|
|
||||||
- 语言:Java 8
|
|
||||||
|
|
||||||
- IDE(JAVA): Eclipse安装lombok插件 或者 IDEA
|
|
||||||
|
|
||||||
- IDE(前端): WebStorm 或者 IDEA
|
|
||||||
|
|
||||||
- 依赖管理:Maven
|
|
||||||
|
|
||||||
- 数据库:MySQL5.0 & Oracle 11g & Sqlserver2005
|
|
||||||
|
|
||||||
- 缓存:Redis
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -238,8 +242,13 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
|||||||
│ └─结果页面
|
│ └─结果页面
|
||||||
│ └─异常页面
|
│ └─异常页面
|
||||||
│ └─个人页面
|
│ └─个人页面
|
||||||
|
├─高级功能
|
||||||
|
│ ├─提供单点登录CAS集成方案
|
||||||
|
│ ├─提供APP发布方案
|
||||||
|
│ ├─集成Websocket消息通知机制
|
||||||
├─Online在线开发(暂未开源)
|
├─Online在线开发(暂未开源)
|
||||||
│ ├─Online在线表单
|
│ ├─Online在线表单 - 功能已开放
|
||||||
|
│ ├─在线代码生成器 - 功能已开放
|
||||||
│ ├─Online在线图表
|
│ ├─Online在线图表
|
||||||
│ ├─Online图表模板配置
|
│ ├─Online图表模板配置
|
||||||
│ ├─Online在线报表
|
│ ├─Online在线报表
|
||||||
@ -286,7 +295,7 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
|||||||
- [vue-cropper](https://github.com/xyxiao001/vue-cropper) - 头像裁剪组件
|
- [vue-cropper](https://github.com/xyxiao001/vue-cropper) - 头像裁剪组件
|
||||||
- [@antv/g2](https://antv.alipay.com/zh-cn/index.html) - Alipay AntV 数据可视化图表
|
- [@antv/g2](https://antv.alipay.com/zh-cn/index.html) - Alipay AntV 数据可视化图表
|
||||||
- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现
|
- [Viser-vue](https://viserjs.github.io/docs.html#/viser/guide/installation) - antv/g2 封装实现
|
||||||
|
- [jeecg-boot-angular 版本](https://gitee.com/dangzhenghui/jeecg-boot)
|
||||||
|
|
||||||
项目下载和运行
|
项目下载和运行
|
||||||
----
|
----
|
||||||
@ -328,9 +337,14 @@ yarn run lint
|
|||||||

|

|
||||||

|

|
||||||

|

|
||||||

|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
##### 在线接口文档
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
##### 报表
|
##### 报表
|
||||||

|

|
||||||

|

|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
Ant Design Jeecg Vue
|
Ant Design Jeecg Vue
|
||||||
====
|
====
|
||||||
|
|
||||||
当前最新版本: 2.0.2(发布日期:20190708)
|
当前最新版本: 2.1.2(发布日期:20191122)
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
----
|
----
|
||||||
|
|||||||
17939
ant-design-vue-jeecg/package-lock.json
generated
17939
ant-design-vue-jeecg/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,18 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "ant-design-vue-jeecg",
|
"name": "vue-antd-jeecg",
|
||||||
"version": "2.0.2",
|
"version": "2.1.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve --open",
|
"pre": "cnpm install || yarn --registry https://registry.npm.taobao.org || npm install --registry https://registry.npm.taobao.org ",
|
||||||
|
"serve": "vue-cli-service serve",
|
||||||
"build": "vue-cli-service build",
|
"build": "vue-cli-service build",
|
||||||
"lint": "vue-cli-service lint",
|
"lint": "vue-cli-service lint"
|
||||||
"test:unit": "vue-cli-service test:unit",
|
|
||||||
"test:e2e": "vue-cli-service test:e2e"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@antv/data-set": "^0.10.2",
|
"@antv/data-set": "^0.10.2",
|
||||||
|
"@jeecg/antd-online": "2.1.2",
|
||||||
"@tinymce/tinymce-vue": "^2.0.0",
|
"@tinymce/tinymce-vue": "^2.0.0",
|
||||||
"ant-design-vue": "^1.3.9",
|
"ant-design-vue": "^1.4.0",
|
||||||
"apexcharts": "^3.6.5",
|
"apexcharts": "^3.6.5",
|
||||||
"axios": "^0.18.0",
|
"axios": "^0.18.0",
|
||||||
"clipboard": "^2.0.4",
|
"clipboard": "^2.0.4",
|
||||||
@ -34,7 +34,7 @@
|
|||||||
"vue-loader": "^15.7.0",
|
"vue-loader": "^15.7.0",
|
||||||
"vue-ls": "^3.2.0",
|
"vue-ls": "^3.2.0",
|
||||||
"vue-photo-preview": "^1.1.3",
|
"vue-photo-preview": "^1.1.3",
|
||||||
"vue-print-nb-jeecg": "^1.0.8",
|
"vue-print-nb-jeecg": "^1.0.9",
|
||||||
"vue-property-decorator": "^7.3.0",
|
"vue-property-decorator": "^7.3.0",
|
||||||
"vue-router": "^3.0.1",
|
"vue-router": "^3.0.1",
|
||||||
"vue-splitpane": "^1.0.4",
|
"vue-splitpane": "^1.0.4",
|
||||||
@ -51,6 +51,7 @@
|
|||||||
"babel-eslint": "^10.0.1",
|
"babel-eslint": "^10.0.1",
|
||||||
"eslint": "^5.16.0",
|
"eslint": "^5.16.0",
|
||||||
"eslint-plugin-vue": "^5.1.0",
|
"eslint-plugin-vue": "^5.1.0",
|
||||||
|
"html-webpack-plugin": "^4.0.0-beta.11",
|
||||||
"less": "^3.9.0",
|
"less": "^3.9.0",
|
||||||
"less-loader": "^4.1.0",
|
"less-loader": "^4.1.0",
|
||||||
"node-sass": "^4.11.0",
|
"node-sass": "^4.11.0",
|
||||||
|
|||||||
19
ant-design-vue-jeecg/public/index.html
vendored
19
ant-design-vue-jeecg/public/index.html
vendored
@ -7,7 +7,7 @@
|
|||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
<title>Jeecg-Boot 快速开发平台</title>
|
<title>Jeecg-Boot 快速开发平台</title>
|
||||||
<link rel="icon" href="<%= BASE_URL %>logo.png">
|
<link rel="icon" href="<%= BASE_URL %>logo.png">
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.2.5/polyfill.js"></script>
|
<script src="https://cdn.bootcss.com/babel-polyfill/7.6.0/polyfill.js"></script>
|
||||||
<style>
|
<style>
|
||||||
html,
|
html,
|
||||||
body,
|
body,
|
||||||
@ -242,9 +242,11 @@
|
|||||||
<!-- 全局配置 -->
|
<!-- 全局配置 -->
|
||||||
<script>
|
<script>
|
||||||
window._CONFIG = {};
|
window._CONFIG = {};
|
||||||
window._CONFIG['domianURL'] = 'http://localhost:8080/jeecg-boot';
|
window._CONFIG['domianURL'] = 'http://127.0.0.1:8080/jeecg-boot';
|
||||||
window._CONFIG['imgDomainURL'] = 'http://localhost:8080/jeecg-boot/sys/common/view';
|
window._CONFIG['casPrefixUrl'] = 'http://cas.example.org:8443/cas';
|
||||||
window._CONFIG['pdfDomainURL'] = 'http://localhost:8080/jeecg-boot/sys/common/pdf/pdfPreviewIframe';
|
window._CONFIG['imgDomainURL'] = window._CONFIG['domianURL'] + '/sys/common/view';
|
||||||
|
window._CONFIG['downloadUrl'] = window._CONFIG['domianURL'] + '/sys/common/download';
|
||||||
|
window._CONFIG['pdfDomainURL'] = window._CONFIG['domianURL'] + '/sys/common/pdf/pdfPreviewIframe';
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@ -261,15 +263,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- update_begin author:sunjianlei date:20190524 for: 去指定页面的加载动画 -->
|
|
||||||
<script>
|
|
||||||
// 去指定页面的加载动画
|
|
||||||
if (location.href.indexOf('online/desform/pureview') !== -1) {
|
|
||||||
document.getElementById('loader-wrapper').style.display = 'none'
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<!-- update_end author:sunjianlei date:20190524 for: 去指定页面的加载动画 -->
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@ -31,6 +31,11 @@ const changPassword = (params)=>putAction("/sys/user/changPassword",params);
|
|||||||
const addPermission= (params)=>postAction("/sys/permission/add",params);
|
const addPermission= (params)=>postAction("/sys/permission/add",params);
|
||||||
const editPermission= (params)=>putAction("/sys/permission/edit",params);
|
const editPermission= (params)=>putAction("/sys/permission/edit",params);
|
||||||
const getPermissionList = (params)=>getAction("/sys/permission/list",params);
|
const getPermissionList = (params)=>getAction("/sys/permission/list",params);
|
||||||
|
/*update_begin author:wuxianquan date:20190908 for:添加查询一级菜单和子菜单查询api */
|
||||||
|
const getSystemMenuList = (params)=>getAction("/sys/permission/getSystemMenuList",params);
|
||||||
|
const getSystemSubmenu = (params)=>getAction("/sys/permission/getSystemSubmenu",params);
|
||||||
|
/*update_end author:wuxianquan date:20190908 for:添加查询一级菜单和子菜单查询api */
|
||||||
|
|
||||||
// const deletePermission = (params)=>deleteAction("/sys/permission/delete",params);
|
// const deletePermission = (params)=>deleteAction("/sys/permission/delete",params);
|
||||||
// const deletePermissionList = (params)=>deleteAction("/sys/permission/deleteBatch",params);
|
// const deletePermissionList = (params)=>deleteAction("/sys/permission/deleteBatch",params);
|
||||||
const queryTreeList = (params)=>getAction("/sys/permission/queryTreeList",params);
|
const queryTreeList = (params)=>getAction("/sys/permission/queryTreeList",params);
|
||||||
@ -45,11 +50,11 @@ const getPermissionRuleList = (params)=>getAction("/sys/permission/getPermRuleLi
|
|||||||
const queryPermissionRule = (params)=>getAction("/sys/permission/queryPermissionRule",params);
|
const queryPermissionRule = (params)=>getAction("/sys/permission/queryPermissionRule",params);
|
||||||
|
|
||||||
// 部门管理
|
// 部门管理
|
||||||
const queryDepartTreeList = (params)=>getAction("/sysdepart/sysDepart/queryTreeList",params);
|
const queryDepartTreeList = (params)=>getAction("/sys/sysDepart/queryTreeList",params);
|
||||||
const queryIdTree = (params)=>getAction("/sysdepart/sysDepart/queryIdTree",params);
|
const queryIdTree = (params)=>getAction("/sys/sysDepart/queryIdTree",params);
|
||||||
const queryParentName = (params)=>getAction("/sysdepart/sysDepart/queryParentName",params);
|
const queryParentName = (params)=>getAction("/sys/sysDepart/queryParentName",params);
|
||||||
const searchByKeywords = (params)=>getAction("/sysdepart/sysDepart/searchBy",params);
|
const searchByKeywords = (params)=>getAction("/sys/sysDepart/searchBy",params);
|
||||||
const deleteByDepartId = (params)=>deleteAction("/sysdepart/sysDepart/delete",params);
|
const deleteByDepartId = (params)=>deleteAction("/sys/sysDepart/delete",params);
|
||||||
|
|
||||||
//日志管理
|
//日志管理
|
||||||
//const getLogList = (params)=>getAction("/sys/log/list",params);
|
//const getLogList = (params)=>getAction("/sys/log/list",params);
|
||||||
@ -87,6 +92,8 @@ const queryUserByDepId = (params)=>getAction("/sys/user/queryUserByDepId",params
|
|||||||
const queryUserRoleMap = (params)=>getAction("/sys/user/queryUserRoleMap",params);
|
const queryUserRoleMap = (params)=>getAction("/sys/user/queryUserRoleMap",params);
|
||||||
// 重复校验
|
// 重复校验
|
||||||
const duplicateCheck = (params)=>getAction("/sys/duplicate/check",params);
|
const duplicateCheck = (params)=>getAction("/sys/duplicate/check",params);
|
||||||
|
// 加载分类字典
|
||||||
|
const loadCategoryData = (params)=>getAction("/sys/category/loadAllData",params);
|
||||||
|
|
||||||
export {
|
export {
|
||||||
// imgView,
|
// imgView,
|
||||||
@ -133,6 +140,9 @@ export {
|
|||||||
queryUserRoleMap,
|
queryUserRoleMap,
|
||||||
duplicateCheck,
|
duplicateCheck,
|
||||||
queryTreeListForRole,
|
queryTreeListForRole,
|
||||||
|
getSystemMenuList,
|
||||||
|
getSystemSubmenu,
|
||||||
|
loadCategoryData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
ant-design-vue-jeecg/src/assets/logo-white.png
Normal file
BIN
ant-design-vue-jeecg/src/assets/logo-white.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
73
ant-design-vue-jeecg/src/cas/sso.js
Normal file
73
ant-design-vue-jeecg/src/cas/sso.js
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
import { ACCESS_TOKEN } from "@/store/mutation-types"
|
||||||
|
import store from '@/store'
|
||||||
|
/**
|
||||||
|
* 单点登录
|
||||||
|
*/
|
||||||
|
const init = (callback) => {
|
||||||
|
console.log("-------单点登录开始-------");
|
||||||
|
let token = Vue.ls.get(ACCESS_TOKEN);
|
||||||
|
let st = getUrlParam("ticket");
|
||||||
|
var sevice = "http://"+window.location.host+"/";
|
||||||
|
if(token){
|
||||||
|
loginSuccess(callback);
|
||||||
|
}else{
|
||||||
|
if(st){
|
||||||
|
validateSt(st,sevice,callback);
|
||||||
|
}else{
|
||||||
|
var serviceUrl = encodeURIComponent(sevice);
|
||||||
|
window.location.href = window._CONFIG['casPrefixUrl']+"/login?service="+serviceUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("-------单点登录结束-------");
|
||||||
|
};
|
||||||
|
const SSO = {
|
||||||
|
init: init
|
||||||
|
};
|
||||||
|
|
||||||
|
function getUrlParam(paraName) {
|
||||||
|
var url = document.location.toString();
|
||||||
|
var arrObj = url.split("?");
|
||||||
|
|
||||||
|
if (arrObj.length > 1) {
|
||||||
|
var arrPara = arrObj[1].split("&");
|
||||||
|
var arr;
|
||||||
|
|
||||||
|
for (var i = 0; i < arrPara.length; i++) {
|
||||||
|
arr = arrPara[i].split("=");
|
||||||
|
|
||||||
|
if (arr != null && arr[0] == paraName) {
|
||||||
|
return arr[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateSt(ticket,service,callback){
|
||||||
|
let params = {
|
||||||
|
ticket: ticket,
|
||||||
|
service:service
|
||||||
|
};
|
||||||
|
store.dispatch('ValidateLogin',params).then(res => {
|
||||||
|
//this.departConfirm(res)
|
||||||
|
if(res.success){
|
||||||
|
loginSuccess(callback);
|
||||||
|
}else{
|
||||||
|
var sevice = "http://"+window.location.host+"/";
|
||||||
|
var serviceUrl = encodeURIComponent(sevice);
|
||||||
|
window.location.href = window._CONFIG['casPrefixUrl']+"/login?service="+serviceUrl;
|
||||||
|
}
|
||||||
|
}).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
//that.requestFailed(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function loginSuccess (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
export default SSO;
|
||||||
@ -39,3 +39,5 @@ UserMenu.vue:首页右上侧的内容
|
|||||||

|

|
||||||
####16.trend包 趋势显示组件(如下图)
|
####16.trend包 趋势显示组件(如下图)
|
||||||

|

|
||||||
|

|
||||||
|

|
||||||
@ -31,6 +31,11 @@
|
|||||||
type: Array,
|
type: Array,
|
||||||
default: () => ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.']
|
default: () => ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.']
|
||||||
},
|
},
|
||||||
|
// 别名,需要的格式:[{field:'name',alias:'姓名'}, {field:'sex',alias:'性别'}]
|
||||||
|
aliases:{
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
height: {
|
height: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 254
|
default: 254
|
||||||
@ -55,11 +60,22 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
// bar 使用不了 - 和 / 所以替换下
|
// bar 使用不了 - 和 / 所以替换下
|
||||||
return dv.rows.map(row => {
|
let rows = dv.rows.map(row => {
|
||||||
row.x = row.x.replace(/[-/]/g, '_')
|
if (typeof row.x === 'string') {
|
||||||
|
row.x = row.x.replace(/[-/]/g, '_')
|
||||||
|
}
|
||||||
return row
|
return row
|
||||||
})
|
})
|
||||||
|
// 替换别名
|
||||||
|
rows.forEach(row => {
|
||||||
|
for (let item of this.aliases) {
|
||||||
|
if (item.field === row.type) {
|
||||||
|
row.type = item.alias
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return rows
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
type="arc"
|
type="arc"
|
||||||
:zIndex="1"
|
:zIndex="1"
|
||||||
:start="arcGuide2Start"
|
:start="arcGuide2Start"
|
||||||
:end="getArcGuide2End"
|
:end="getArcGuide2End()"
|
||||||
:vStyle="arcGuide2Style"
|
:vStyle="arcGuide2Style"
|
||||||
></v-guide>
|
></v-guide>
|
||||||
<v-guide
|
<v-guide
|
||||||
@ -88,7 +88,7 @@
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const data = [
|
const data = [
|
||||||
{ value: 7.0 },
|
{ value: 0},
|
||||||
];
|
];
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -96,7 +96,7 @@
|
|||||||
props:{
|
props:{
|
||||||
datasource:{
|
datasource:{
|
||||||
type: Number,
|
type: Number,
|
||||||
default:7
|
default:0
|
||||||
},
|
},
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
|
|||||||
@ -42,6 +42,11 @@
|
|||||||
type: Array,
|
type: Array,
|
||||||
default: () => ['jeecg', 'jeebt']
|
default: () => ['jeecg', 'jeebt']
|
||||||
},
|
},
|
||||||
|
// 别名,需要的格式:[{field:'name',alias:'姓名'}, {field:'sex',alias:'性别'}]
|
||||||
|
aliases:{
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
height: {
|
height: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 254
|
default: 254
|
||||||
@ -66,7 +71,17 @@
|
|||||||
key: 'x',
|
key: 'x',
|
||||||
value: 'y'
|
value: 'y'
|
||||||
})
|
})
|
||||||
return dv.rows
|
let rows = dv.rows
|
||||||
|
// 替换别名
|
||||||
|
rows.forEach(row => {
|
||||||
|
for (let item of this.aliases) {
|
||||||
|
if (item.field === row.x) {
|
||||||
|
row.x = item.alias
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return rows
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,15 +32,23 @@
|
|||||||
tagType:""
|
tagType:""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch:{
|
||||||
|
dictCode:{
|
||||||
|
immediate:true,
|
||||||
|
handler() {
|
||||||
|
this.initDictData()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
created() {
|
created() {
|
||||||
console.log(this.dictCode);
|
// console.log(this.dictCode);
|
||||||
if(!this.type || this.type==="list"){
|
if(!this.type || this.type==="list"){
|
||||||
this.tagType = "select"
|
this.tagType = "select"
|
||||||
}else{
|
}else{
|
||||||
this.tagType = this.type
|
this.tagType = this.type
|
||||||
}
|
}
|
||||||
//获取字典数据
|
//获取字典数据
|
||||||
this.initDictData();
|
// this.initDictData();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initDictData() {
|
initDictData() {
|
||||||
|
|||||||
@ -28,13 +28,16 @@ export async function initDictOptions(dictCode) {
|
|||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
export function filterDictText(dictOptions, text) {
|
export function filterDictText(dictOptions, text) {
|
||||||
let re = "";
|
//--update-begin----author:sunjianlei---date:20191025------for:修复字典替换方法在字典没有加载完成之前报错的问题、修复没有找到字典时返回空值的问题---
|
||||||
dictOptions.forEach(function (option) {
|
if (dictOptions instanceof Array) {
|
||||||
if (text === option.value) {
|
for (let dictItem of dictOptions) {
|
||||||
re = option.text;
|
if (text === dictItem.value) {
|
||||||
|
return dictItem.text
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
return re;
|
return text
|
||||||
|
//--update-end----author:sunjianlei---date:20191025------for:修复字典替换方法在字典没有加载完成之前报错的问题、修复没有找到字典时返回空值的问题---
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -44,7 +47,7 @@ export function filterDictText(dictOptions, text) {
|
|||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
export function filterMultiDictText(dictOptions, text) {
|
export function filterMultiDictText(dictOptions, text) {
|
||||||
if(!text){
|
if(!text || !dictOptions || dictOptions.length==0){
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
let re = "";
|
let re = "";
|
||||||
@ -58,7 +61,7 @@ export function filterMultiDictText(dictOptions, text) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
if(re==""){
|
if(re==""){
|
||||||
return "";
|
return text;
|
||||||
}
|
}
|
||||||
return re.substring(0,re.length-1);
|
return re.substring(0,re.length-1);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,8 @@
|
|||||||
@change="onChange"
|
@change="onChange"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
mode="multiple"
|
mode="multiple"
|
||||||
:placeholder="placeholder">
|
:placeholder="placeholder"
|
||||||
|
allowClear>
|
||||||
<a-select-option
|
<a-select-option
|
||||||
v-for="(item,index) in dictOptions"
|
v-for="(item,index) in dictOptions"
|
||||||
:key="index"
|
:key="index"
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
:filterOption="false"
|
:filterOption="false"
|
||||||
@change="handleAsyncChange"
|
@change="handleAsyncChange"
|
||||||
|
allowClear
|
||||||
:notFoundContent="loading ? undefined : null"
|
:notFoundContent="loading ? undefined : null"
|
||||||
>
|
>
|
||||||
<a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
<a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
||||||
@ -25,6 +26,7 @@
|
|||||||
@change="handleChange"
|
@change="handleChange"
|
||||||
:filterOption="filterOption"
|
:filterOption="filterOption"
|
||||||
v-model="selectedValue"
|
v-model="selectedValue"
|
||||||
|
allowClear
|
||||||
:notFoundContent="loading ? undefined : null">
|
:notFoundContent="loading ? undefined : null">
|
||||||
<a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
<a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
||||||
<a-select-option v-for="d in options" :key="d.value" :value="d.value">{{ d.text }}</a-select-option>
|
<a-select-option v-for="d in options" :key="d.value" :value="d.value">{{ d.text }}</a-select-option>
|
||||||
|
|||||||
240
ant-design-vue-jeecg/src/components/jeecg/JCategorySelect.vue
Normal file
240
ant-design-vue-jeecg/src/components/jeecg/JCategorySelect.vue
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
<template>
|
||||||
|
<a-tree-select
|
||||||
|
allowClear
|
||||||
|
labelInValue
|
||||||
|
style="width: 100%"
|
||||||
|
:disabled="disabled"
|
||||||
|
:dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
:loadData="asyncLoadTreeData"
|
||||||
|
:value="treeValue"
|
||||||
|
:treeData="treeData"
|
||||||
|
:multiple="multiple"
|
||||||
|
@change="onChange">
|
||||||
|
</a-tree-select>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import { getAction } from '@/api/manage'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JCategorySelect',
|
||||||
|
props: {
|
||||||
|
value:{
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
placeholder:{
|
||||||
|
type: String,
|
||||||
|
default: '请选择',
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
disabled:{
|
||||||
|
type:Boolean,
|
||||||
|
default:false,
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
condition:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
// 是否支持多选
|
||||||
|
multiple: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
loadTriggleChange:{
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
pid:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
pcode:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
back:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
treeValue:"",
|
||||||
|
treeData:[],
|
||||||
|
url:"/sys/category/loadTreeData",
|
||||||
|
view:'/sys/category/loadDictItem/',
|
||||||
|
tableName:"",
|
||||||
|
text:"",
|
||||||
|
code:"",
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value () {
|
||||||
|
this.loadItemByCode()
|
||||||
|
},
|
||||||
|
pcode(){
|
||||||
|
this.loadRoot();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created(){
|
||||||
|
this.validateProp().then(()=>{
|
||||||
|
this.loadRoot()
|
||||||
|
this.loadItemByCode()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
/**加载一级节点 */
|
||||||
|
loadRoot(){
|
||||||
|
let param = {
|
||||||
|
pid:this.pid,
|
||||||
|
pcode:this.pcode,
|
||||||
|
condition:this.condition
|
||||||
|
}
|
||||||
|
getAction(this.url,param).then(res=>{
|
||||||
|
if(res.success && res.result){
|
||||||
|
for(let i of res.result){
|
||||||
|
i.value = i.key
|
||||||
|
if(i.leaf==false){
|
||||||
|
i.isLeaf=false
|
||||||
|
}else if(i.leaf==true){
|
||||||
|
i.isLeaf=true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.treeData = [...res.result]
|
||||||
|
}else{
|
||||||
|
console.log("树一级节点查询结果-else",res)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 数据回显*/
|
||||||
|
loadItemByCode(){
|
||||||
|
if(!this.value || this.value=="0"){
|
||||||
|
this.treeValue = ""
|
||||||
|
}else{
|
||||||
|
getAction(this.view,{ids:this.value}).then(res=>{
|
||||||
|
console.log(124345)
|
||||||
|
console.log(124345,res)
|
||||||
|
if(res.success){
|
||||||
|
let values = this.value.split(',')
|
||||||
|
this.treeValue = res.result.map((item, index) => ({
|
||||||
|
key: values[index],
|
||||||
|
value: values[index],
|
||||||
|
label: item
|
||||||
|
}))
|
||||||
|
this.onLoadTriggleChange(res.result[0]);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoadTriggleChange(text){
|
||||||
|
//只有单选才会触发
|
||||||
|
if(!this.multiple && this.loadTriggleChange){
|
||||||
|
this.backValue(this.value,text)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
backValue(value,label){
|
||||||
|
let obj = {}
|
||||||
|
if(this.back){
|
||||||
|
obj[this.back] = label
|
||||||
|
}
|
||||||
|
this.$emit('change', value, obj)
|
||||||
|
},
|
||||||
|
asyncLoadTreeData (treeNode) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
if (treeNode.$vnode.children) {
|
||||||
|
resolve()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let pid = treeNode.$vnode.key
|
||||||
|
let param = {
|
||||||
|
pid:pid,
|
||||||
|
condition:this.condition
|
||||||
|
}
|
||||||
|
getAction(this.url,param).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
for(let i of res.result){
|
||||||
|
i.value = i.key
|
||||||
|
if(i.leaf==false){
|
||||||
|
i.isLeaf=false
|
||||||
|
}else if(i.leaf==true){
|
||||||
|
i.isLeaf=true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.addChildren(pid,res.result,this.treeData)
|
||||||
|
this.treeData = [...this.treeData]
|
||||||
|
}
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
addChildren(pid,children,treeArray){
|
||||||
|
if(treeArray && treeArray.length>0){
|
||||||
|
for(let item of treeArray){
|
||||||
|
if(item.key == pid){
|
||||||
|
if(!children || children.length==0){
|
||||||
|
item.isLeaf=true
|
||||||
|
}else{
|
||||||
|
item.children = children
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}else{
|
||||||
|
this.addChildren(pid,children,item.children)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onChange(value){
|
||||||
|
if(!value){
|
||||||
|
this.$emit('change', '');
|
||||||
|
this.treeValue = ''
|
||||||
|
} else if (value instanceof Array) {
|
||||||
|
//this.$emit('change', value.map(item => item.value).join(','))
|
||||||
|
//this.treeValue = value
|
||||||
|
} else {
|
||||||
|
this.backValue(value.value,value.label)
|
||||||
|
this.treeValue = value
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getCurrTreeData(){
|
||||||
|
return this.treeData
|
||||||
|
},
|
||||||
|
validateProp(){
|
||||||
|
let mycondition = this.condition
|
||||||
|
return new Promise((resolve,reject)=>{
|
||||||
|
if(!mycondition){
|
||||||
|
resolve();
|
||||||
|
}else{
|
||||||
|
try {
|
||||||
|
let test=JSON.parse(mycondition);
|
||||||
|
if(typeof test == 'object' && test){
|
||||||
|
resolve()
|
||||||
|
}else{
|
||||||
|
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
|
||||||
|
reject()
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
|
||||||
|
reject()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-checkbox-group :options="options" :value="checkboxArray" @change="onChange" />
|
<a-checkbox-group :options="options" :value="checkboxArray" v-bind="$attrs" @change="onChange" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
@ -228,10 +228,11 @@
|
|||||||
// 初始化编辑器实例,传入需要被实例化的文本域对象和默认配置
|
// 初始化编辑器实例,传入需要被实例化的文本域对象和默认配置
|
||||||
this.coder = CodeMirror.fromTextArea(this.$refs.textarea, this.coderOptions)
|
this.coder = CodeMirror.fromTextArea(this.$refs.textarea, this.coderOptions)
|
||||||
// 编辑器赋值
|
// 编辑器赋值
|
||||||
this.coder.setValue(this.value || this.code)
|
|
||||||
if(this.value||this.code){
|
if(this.value||this.code){
|
||||||
this.hasCode=true
|
this.hasCode=true
|
||||||
|
this.coder.setValue(this.value || this.code)
|
||||||
}else{
|
}else{
|
||||||
|
this.coder.setValue('')
|
||||||
this.hasCode=false
|
this.hasCode=false
|
||||||
}
|
}
|
||||||
// 支持双向绑定
|
// 支持双向绑定
|
||||||
@ -266,7 +267,13 @@
|
|||||||
return this.code
|
return this.code
|
||||||
},
|
},
|
||||||
setCodeContent(val){
|
setCodeContent(val){
|
||||||
this.coder.setValue(val)
|
setTimeout(()=>{
|
||||||
|
if(!val){
|
||||||
|
this.coder.setValue('')
|
||||||
|
}else{
|
||||||
|
this.coder.setValue(val)
|
||||||
|
}
|
||||||
|
},300)
|
||||||
},
|
},
|
||||||
// 获取当前语法类型
|
// 获取当前语法类型
|
||||||
_getLanguage (language) {
|
_getLanguage (language) {
|
||||||
@ -405,5 +412,7 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.CodeMirror-cursor{
|
||||||
|
height:18.4px !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
65
ant-design-vue-jeecg/src/components/jeecg/JCron.vue
Normal file
65
ant-design-vue-jeecg/src/components/jeecg/JCron.vue
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<template>
|
||||||
|
<div class="components-input-demo-presuffix">
|
||||||
|
<a-input @click="openModal" placeholder="corn表达式" v-model="cron" @change="handleOK">
|
||||||
|
<a-icon slot="prefix" type="schedule" title="corn控件"/>
|
||||||
|
<a-icon v-if="cron" slot="suffix" type="close-circle" @click="handleEmpty" title="清空"/>
|
||||||
|
</a-input>
|
||||||
|
<JCronModal ref="innerVueCron" :data="cron" @ok="handleOK"></JCronModal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import JCronModal from "./modal/JCronModal";
|
||||||
|
export default {
|
||||||
|
name: 'JCron',
|
||||||
|
components: {
|
||||||
|
JCronModal
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
required: false,
|
||||||
|
type: String,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data(){
|
||||||
|
return {
|
||||||
|
cron: this.value,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch:{
|
||||||
|
value(val){
|
||||||
|
this.cron = val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
openModal(){
|
||||||
|
this.$refs.innerVueCron.show();
|
||||||
|
},
|
||||||
|
handleOK(val){
|
||||||
|
this.cron = val;
|
||||||
|
this.$emit("change", this.cron);
|
||||||
|
//this.$emit("change", Object.assign({}, this.cron));
|
||||||
|
},
|
||||||
|
handleEmpty(){
|
||||||
|
this.handleOK('')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
.components-input-demo-presuffix .anticon-close-circle {
|
||||||
|
cursor: pointer;
|
||||||
|
color: #ccc;
|
||||||
|
transition: color 0.3s;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.components-input-demo-presuffix .anticon-close-circle:hover {
|
||||||
|
color: #f5222d;
|
||||||
|
}
|
||||||
|
.components-input-demo-presuffix .anticon-close-circle:active {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
File diff suppressed because it is too large
Load Diff
@ -61,6 +61,7 @@
|
|||||||
toolbar: this.toolbar,
|
toolbar: this.toolbar,
|
||||||
branding: false,
|
branding: false,
|
||||||
menubar: false,
|
menubar: false,
|
||||||
|
toolbar_drawer: false,
|
||||||
images_upload_handler: (blobInfo, success) => {
|
images_upload_handler: (blobInfo, success) => {
|
||||||
const img = 'data:image/jpeg;base64,' + blobInfo.base64()
|
const img = 'data:image/jpeg;base64,' + blobInfo.base64()
|
||||||
success(img)
|
success(img)
|
||||||
@ -84,15 +85,12 @@
|
|||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
value(newValue) {
|
value(newValue) {
|
||||||
this.myValue = newValue
|
this.myValue = (newValue == null ? '' : newValue)
|
||||||
},
|
},
|
||||||
myValue(newValue) {
|
myValue(newValue) {
|
||||||
console.log(newValue)
|
|
||||||
if(this.triggerChange){
|
if(this.triggerChange){
|
||||||
console.log(1)
|
|
||||||
this.$emit('change', newValue)
|
this.$emit('change', newValue)
|
||||||
}else{
|
}else{
|
||||||
console.log(2)
|
|
||||||
this.$emit('input', newValue)
|
this.$emit('input', newValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="disabled" class="jeecg-form-container-disabled">
|
<div :class="disabled?'jeecg-form-container-disabled':''">
|
||||||
|
<fieldset disabled>
|
||||||
|
<slot name="detail"></slot>
|
||||||
|
</fieldset>
|
||||||
|
<slot name="edit"></slot>
|
||||||
<fieldset disabled>
|
<fieldset disabled>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
@ -5,6 +5,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { getAction } from '@/api/manage'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'JGraphicCode',
|
name: 'JGraphicCode',
|
||||||
props: {
|
props: {
|
||||||
@ -59,6 +61,11 @@
|
|||||||
contentHeight: {
|
contentHeight: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 38
|
default: 38
|
||||||
|
},
|
||||||
|
remote:{
|
||||||
|
type:Boolean,
|
||||||
|
default:false,
|
||||||
|
required:false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -74,20 +81,21 @@
|
|||||||
return 'rgb(' + r + ',' + g + ',' + b + ')'
|
return 'rgb(' + r + ',' + g + ',' + b + ')'
|
||||||
},
|
},
|
||||||
drawPic () {
|
drawPic () {
|
||||||
this.randomCode()
|
this.randomCode().then(()=>{
|
||||||
let canvas = document.getElementById('gc-canvas')
|
let canvas = document.getElementById('gc-canvas')
|
||||||
let ctx = canvas.getContext('2d')
|
let ctx = canvas.getContext('2d')
|
||||||
ctx.textBaseline = 'bottom'
|
ctx.textBaseline = 'bottom'
|
||||||
// 绘制背景
|
// 绘制背景
|
||||||
ctx.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)
|
ctx.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)
|
||||||
ctx.fillRect(0, 0, this.contentWidth, this.contentHeight)
|
ctx.fillRect(0, 0, this.contentWidth, this.contentHeight)
|
||||||
// 绘制文字
|
// 绘制文字
|
||||||
for (let i = 0; i < this.code.length; i++) {
|
for (let i = 0; i < this.code.length; i++) {
|
||||||
this.drawText(ctx, this.code[i], i)
|
this.drawText(ctx, this.code[i], i)
|
||||||
}
|
}
|
||||||
this.drawLine(ctx)
|
this.drawLine(ctx)
|
||||||
this.drawDot(ctx)
|
this.drawDot(ctx)
|
||||||
this.$emit("success",this.code)
|
this.$emit("success",this.code)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
drawText (ctx, txt, i) {
|
drawText (ctx, txt, i) {
|
||||||
ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax)
|
ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax)
|
||||||
@ -136,6 +144,31 @@
|
|||||||
this.drawPic()
|
this.drawPic()
|
||||||
},
|
},
|
||||||
randomCode(){
|
randomCode(){
|
||||||
|
return new Promise((resolve)=>{
|
||||||
|
if(this.remote==true){
|
||||||
|
getAction("/sys/getCheckCode").then(res=>{
|
||||||
|
console.log("aaaaa",res)
|
||||||
|
if(res.success){
|
||||||
|
this.checkKey = res.result.key
|
||||||
|
this.code = res.result.code
|
||||||
|
resolve();
|
||||||
|
}else{
|
||||||
|
this.$message.error("生成验证码错误,请联系系统管理员")
|
||||||
|
this.code = 'BUG'
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
}).catch(()=>{
|
||||||
|
console.log("生成验证码连接服务器异常")
|
||||||
|
this.code = 'BUG'
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
this.randomLocalCode();
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
randomLocalCode(){
|
||||||
let random = ''
|
let random = ''
|
||||||
//去掉了I l i o O
|
//去掉了I l i o O
|
||||||
let str = "QWERTYUPLKJHGFDSAZXCVBNMqwertyupkjhgfdsazxcvbnm1234567890"
|
let str = "QWERTYUPLKJHGFDSAZXCVBNMqwertyupkjhgfdsazxcvbnm1234567890"
|
||||||
@ -144,6 +177,12 @@
|
|||||||
random += str[index];
|
random += str[index];
|
||||||
}
|
}
|
||||||
this.code = random
|
this.code = random
|
||||||
|
},
|
||||||
|
getLoginParam(){
|
||||||
|
return {
|
||||||
|
checkCode:this.code,
|
||||||
|
checkKey:this.checkKey
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
@ -151,7 +190,8 @@
|
|||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
return {
|
return {
|
||||||
code:""
|
code:"",
|
||||||
|
checkKey:""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
95
ant-design-vue-jeecg/src/components/jeecg/JInput.vue
Normal file
95
ant-design-vue-jeecg/src/components/jeecg/JInput.vue
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<template>
|
||||||
|
<a-input :placeholder="placeholder" :value="inputVal" @input="backValue"></a-input>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const JINPUT_QUERY_LIKE = 'like';
|
||||||
|
const JINPUT_QUERY_NE = 'ne';
|
||||||
|
const JINPUT_QUERY_GE = 'ge'; //大于等于
|
||||||
|
const JINPUT_QUERY_LE = 'le'; //小于等于
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JInput',
|
||||||
|
props:{
|
||||||
|
value:{
|
||||||
|
type:String,
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
type:{
|
||||||
|
type:String,
|
||||||
|
required:false,
|
||||||
|
default:JINPUT_QUERY_LIKE
|
||||||
|
},
|
||||||
|
placeholder:{
|
||||||
|
type:String,
|
||||||
|
required:false,
|
||||||
|
default:''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch:{
|
||||||
|
value:{
|
||||||
|
immediate:true,
|
||||||
|
handler:function(){
|
||||||
|
this.initVal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
|
},
|
||||||
|
data(){
|
||||||
|
return {
|
||||||
|
inputVal:''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
initVal(){
|
||||||
|
if(!this.value){
|
||||||
|
this.inputVal = ''
|
||||||
|
}else{
|
||||||
|
let text = this.value
|
||||||
|
switch (this.type) {
|
||||||
|
case JINPUT_QUERY_LIKE:
|
||||||
|
text = text.substring(1,text.length-1);
|
||||||
|
break;
|
||||||
|
case JINPUT_QUERY_NE:
|
||||||
|
text = text.substring(1);
|
||||||
|
break;
|
||||||
|
case JINPUT_QUERY_GE:
|
||||||
|
text = text.substring(2);
|
||||||
|
break;
|
||||||
|
case JINPUT_QUERY_LE:
|
||||||
|
text = text.substring(2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
this.inputVal = text
|
||||||
|
}
|
||||||
|
},
|
||||||
|
backValue(e){
|
||||||
|
let text = e.target.value
|
||||||
|
switch (this.type) {
|
||||||
|
case JINPUT_QUERY_LIKE:
|
||||||
|
text = "*"+text+"*";
|
||||||
|
break;
|
||||||
|
case JINPUT_QUERY_NE:
|
||||||
|
text = "!"+text;
|
||||||
|
break;
|
||||||
|
case JINPUT_QUERY_GE:
|
||||||
|
text = ">="+text;
|
||||||
|
break;
|
||||||
|
case JINPUT_QUERY_LE:
|
||||||
|
text = "<="+text;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
this.$emit("change",text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -59,8 +59,13 @@
|
|||||||
this.mouseMoveStata = false;
|
this.mouseMoveStata = false;
|
||||||
var width = e.clientX - this.beginClientX;
|
var width = e.clientX - this.beginClientX;
|
||||||
if(width<this.maxwidth){
|
if(width<this.maxwidth){
|
||||||
document.getElementsByClassName('handler')[0].style.left = 0 + 'px';
|
// ---- update-begin- author:sunjianlei --- date:20191009 --- for: 修复获取不到 handler 的时候报错 ----
|
||||||
document.getElementsByClassName('drag_bg')[0].style.width = 0 + 'px';
|
let handler = document.getElementsByClassName('handler')[0]
|
||||||
|
if (handler) {
|
||||||
|
handler.style.left = 0 + 'px'
|
||||||
|
document.getElementsByClassName('drag_bg')[0].style.width = 0 + 'px'
|
||||||
|
}
|
||||||
|
// ---- update-end- author:sunjianlei --- date:20191009 --- for: 修复获取不到 handler 的时候报错 ----
|
||||||
}
|
}
|
||||||
} //mouseup事件
|
} //mouseup事件
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,152 +1,404 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
title="高级查询构造器"
|
title="高级查询构造器"
|
||||||
:width="800"
|
:width="1000"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
:confirmLoading="confirmLoading"
|
|
||||||
@cancel="handleCancel"
|
@cancel="handleCancel"
|
||||||
:mask="false"
|
:mask="false"
|
||||||
wrapClassName="ant-modal-cust-warp"
|
wrapClassName="ant-modal-cust-warp"
|
||||||
|
class="j-super-query-modal"
|
||||||
style="top:5%;max-height: 95%;">
|
style="top:5%;max-height: 95%;">
|
||||||
|
|
||||||
<template slot="footer">
|
<template slot="footer">
|
||||||
<a-button @click="handleCancel">关 闭</a-button>
|
<div style="float: left">
|
||||||
<a-button @click="handleReset" style="float: left">重 置</a-button>
|
<a-button :loading="loading" @click="handleReset">重置</a-button>
|
||||||
<a-button type="primary" @click="handleOk">查 询</a-button>
|
<a-button :loading="loading" @click="handleSave">保存查询条件</a-button>
|
||||||
|
</div>
|
||||||
|
<a-button :loading="loading" @click="handleCancel">关闭</a-button>
|
||||||
|
<a-button :loading="loading" type="primary" @click="handleOk">查询</a-button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<a-spin :spinning="confirmLoading">
|
<a-spin :spinning="loading">
|
||||||
<a-form>
|
<a-row>
|
||||||
<div>
|
<a-col :sm="24" :md="24-5">
|
||||||
<a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in queryParamsModel" :key="index">
|
|
||||||
|
|
||||||
<a-col :span="6">
|
<a-empty v-if="queryParamsModel.length === 0">
|
||||||
<a-select placeholder="选择查询字段" v-model="item.field" @select="(val,option)=>handleSelected(option,item)">
|
<div slot="description">
|
||||||
<a-select-option v-for="(f,fIndex) in fieldList" :key=" 'field'+fIndex" :value="f.value" :data-type="f.type">{{ f.text }}</a-select-option>
|
<span>没有任何查询条件</span>
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
<a @click="handleAdd">点击新增</a>
|
||||||
|
</div>
|
||||||
|
</a-empty>
|
||||||
|
|
||||||
|
<a-form v-else layout="inline">
|
||||||
|
|
||||||
|
<a-form-item label="过滤条件匹配" style="margin-bottom: 12px;">
|
||||||
|
<a-select v-model="selectValue">
|
||||||
|
<a-select-option value="and">AND(所有条件都要求匹配)</a-select-option>
|
||||||
|
<a-select-option value="or">OR(条件中的任意一个匹配)</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-col>
|
</a-form-item>
|
||||||
|
|
||||||
<a-col :span="6">
|
<a-row type="flex" style="margin-bottom:10px" :gutter="16" v-for="(item, index) in queryParamsModel" :key="index">
|
||||||
<a-select placeholder="选择匹配规则" v-model="item.rule">
|
|
||||||
<a-select-option value="eq">等于</a-select-option>
|
|
||||||
<a-select-option value="ne">不等于</a-select-option>
|
|
||||||
<a-select-option value="gt">大于</a-select-option>
|
|
||||||
<a-select-option value="ge">大于等于</a-select-option>
|
|
||||||
<a-select-option value="lt">小于</a-select-option>
|
|
||||||
<a-select-option value="le">小于等于</a-select-option>
|
|
||||||
<a-select-option value="right_like">以..开始</a-select-option>
|
|
||||||
<a-select-option value="left_like">以..结尾</a-select-option>
|
|
||||||
<a-select-option value="like">包含</a-select-option>
|
|
||||||
<a-select-option value="in">在...中</a-select-option>
|
|
||||||
</a-select>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
<a-col :span="6">
|
<a-col :span="8">
|
||||||
<j-date v-if=" item.type=='date' " v-model="item.val" placeholder="请选择日期"></j-date>
|
<a-select placeholder="选择查询字段" v-model="item.field" @select="(val,option)=>handleSelected(option,item)">
|
||||||
<j-date v-else-if=" item.type=='datetime' " v-model="item.val" placeholder="请选择时间" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss"></j-date>
|
<a-select-option v-for="(f,fIndex) in fieldList" :key=" 'field'+fIndex" :value="f.value" :data-idx="fIndex">{{ f.text }}</a-select-option>
|
||||||
<a-input-number v-else-if=" item.type=='int'||item.type=='number' " style="width: 100%" placeholder="请输入数值" v-model="item.val"/>
|
</a-select>
|
||||||
<a-input v-else v-model="item.val" placeholder="请输入值" />
|
</a-col>
|
||||||
</a-col>
|
|
||||||
|
<a-col :span="4">
|
||||||
|
<a-select placeholder="匹配规则" v-model="item.rule">
|
||||||
|
<a-select-option value="eq">等于</a-select-option>
|
||||||
|
<a-select-option value="ne">不等于</a-select-option>
|
||||||
|
<a-select-option value="gt">大于</a-select-option>
|
||||||
|
<a-select-option value="ge">大于等于</a-select-option>
|
||||||
|
<a-select-option value="lt">小于</a-select-option>
|
||||||
|
<a-select-option value="le">小于等于</a-select-option>
|
||||||
|
<a-select-option value="right_like">以..开始</a-select-option>
|
||||||
|
<a-select-option value="left_like">以..结尾</a-select-option>
|
||||||
|
<a-select-option value="like">包含</a-select-option>
|
||||||
|
<a-select-option value="in">在...中</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
<a-col :span="8">
|
||||||
|
<template v-if="item.dictCode">
|
||||||
|
<template v-if="item.type === 'table-dict'">
|
||||||
|
<j-popup
|
||||||
|
v-model="item.val"
|
||||||
|
:code="item.dictTable"
|
||||||
|
:field="item.dictCode"
|
||||||
|
:orgFields="item.dictCode"
|
||||||
|
:destFields="item.dictCode"
|
||||||
|
></j-popup>
|
||||||
|
</template>
|
||||||
|
<j-dict-select-tag v-else v-model="item.val" :dictCode="item.dictCode" placeholder="请选择"/>
|
||||||
|
</template>
|
||||||
|
<j-select-multi-user
|
||||||
|
v-else-if="item.type === 'select-user'"
|
||||||
|
v-model="item.val"
|
||||||
|
:buttons="false"
|
||||||
|
:multiple="false"
|
||||||
|
placeholder="请选择用户"
|
||||||
|
:returnKeys="['id', item.customReturnField || 'username']"
|
||||||
|
/>
|
||||||
|
<j-select-depart
|
||||||
|
v-else-if="item.type === 'select-depart'"
|
||||||
|
v-model="item.val"
|
||||||
|
:multi="false"
|
||||||
|
placeholder="请选择部门"
|
||||||
|
:customReturnField="item.customReturnField || 'id'"
|
||||||
|
/>
|
||||||
|
<j-date v-else-if=" item.type=='date' " v-model="item.val" placeholder="请选择日期" style="width: 100%"></j-date>
|
||||||
|
<j-date v-else-if=" item.type=='datetime' " v-model="item.val" placeholder="请选择时间" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" style="width: 100%"></j-date>
|
||||||
|
<a-input-number v-else-if=" item.type=='int'||item.type=='number' " style="width: 100%" placeholder="请输入数值" v-model="item.val"/>
|
||||||
|
<a-input v-else v-model="item.val" placeholder="请输入值"/>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
<a-col :span="4">
|
||||||
|
<a-button @click="handleAdd" icon="plus"></a-button>
|
||||||
|
<a-button @click="handleDel( index )" icon="minus"></a-button>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
</a-row>
|
||||||
|
|
||||||
|
</a-form>
|
||||||
|
</a-col>
|
||||||
|
<a-col :sm="24" :md="5">
|
||||||
|
<!-- 查询记录 -->
|
||||||
|
|
||||||
|
<a-card class="j-super-query-history-card" :bordered="true">
|
||||||
|
<div slot="title">
|
||||||
|
保存的查询
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-empty v-if="treeData.length === 0" class="j-super-query-history-empty" description="没有保存任何查询"/>
|
||||||
|
<a-tree
|
||||||
|
v-else
|
||||||
|
class="j-super-query-history-tree"
|
||||||
|
showIcon
|
||||||
|
:treeData="treeData"
|
||||||
|
@select="handleTreeSelect"
|
||||||
|
@rightClick="handleTreeRightClick"
|
||||||
|
>
|
||||||
|
</a-tree>
|
||||||
|
</a-card>
|
||||||
|
|
||||||
|
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
|
||||||
<a-col :span="6">
|
|
||||||
<a-button @click="handleAdd" icon="plus"></a-button>
|
|
||||||
<a-button @click="handleDel( index )" icon="minus"></a-button>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
</a-row>
|
|
||||||
</div>
|
|
||||||
</a-form>
|
|
||||||
</a-spin>
|
</a-spin>
|
||||||
|
|
||||||
|
<a-modal title="请输入保存的名称" :visible="prompt.visible" @cancel="prompt.visible=false" @ok="handlePromptOk">
|
||||||
|
<a-input v-model="prompt.value"></a-input>
|
||||||
|
</a-modal>
|
||||||
|
|
||||||
</a-modal>
|
</a-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ACol from 'ant-design-vue/es/grid/Col'
|
import * as utils from '@/utils/util'
|
||||||
import JDate from '@/components/jeecg/JDate.vue';
|
import JDate from '@/components/jeecg/JDate.vue'
|
||||||
|
import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
|
||||||
|
import JSelectMultiUser from '@/components/jeecgbiz/JSelectMultiUser'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'JSuperQuery',
|
name: 'JSuperQuery',
|
||||||
components: {
|
components: { JDate, JSelectDepart, JSelectMultiUser },
|
||||||
ACol,
|
props: {
|
||||||
JDate
|
/*
|
||||||
},
|
fieldList: [{
|
||||||
data(){
|
value:'',
|
||||||
return {
|
text:'',
|
||||||
visible:false,
|
type:'',
|
||||||
confirmLoading:false,
|
dictCode:'' // 只要 dictCode 有值,无论 type 是什么,都显示为字典下拉框
|
||||||
queryParamsModel:[{}]
|
}]
|
||||||
}
|
type:date datetime int number string
|
||||||
},
|
|
||||||
props:{
|
|
||||||
/* fieldList:[{value:'',text:'',type:''}]
|
|
||||||
* type:date datetime int number string
|
|
||||||
* */
|
* */
|
||||||
fieldList:{
|
fieldList: {
|
||||||
type:Array,
|
type: Array,
|
||||||
required:true
|
required: true
|
||||||
},
|
},
|
||||||
/*
|
/*
|
||||||
* 这个回调函数接收一个数组参数 即查询条件
|
* 这个回调函数接收一个数组参数 即查询条件
|
||||||
* */
|
* */
|
||||||
callback:{
|
callback: {
|
||||||
type:String,
|
type: String,
|
||||||
required:false,
|
required: false,
|
||||||
default:'handleSuperQuery'
|
default: 'handleSuperQuery'
|
||||||
|
},
|
||||||
|
|
||||||
|
// 当前是否在加载中
|
||||||
|
loading: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
|
||||||
|
// 保存查询条件的唯一 code,通过该 code 区分
|
||||||
|
saveCode: {
|
||||||
|
type: String,
|
||||||
|
default: 'testSaveCode'
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
|
||||||
|
prompt: {
|
||||||
|
visible: false,
|
||||||
|
value: ''
|
||||||
|
},
|
||||||
|
|
||||||
|
visible: false,
|
||||||
|
queryParamsModel: [{}],
|
||||||
|
treeIcon: <a-icon type="file-text"/>,
|
||||||
|
treeData: [],
|
||||||
|
// 保存查询条件的前缀名
|
||||||
|
saveCodeBefore: 'JSuperQuerySaved_',
|
||||||
|
selectValue: 'and',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods:{
|
watch: {
|
||||||
show(){
|
// 当 saveCode 变化时,重新查询已保存的条件
|
||||||
if(!this.queryParamsModel ||this.queryParamsModel.length==0){
|
saveCode: {
|
||||||
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
let list = this.$ls.get(this.saveCodeBefore + val)
|
||||||
|
if (list instanceof Array) {
|
||||||
|
this.treeData = list.map(item => {
|
||||||
|
item.icon = this.treeIcon
|
||||||
|
return item
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
show() {
|
||||||
|
if (!this.queryParamsModel || this.queryParamsModel.length == 0) {
|
||||||
this.queryParamsModel = [{}]
|
this.queryParamsModel = [{}]
|
||||||
}
|
}
|
||||||
this.visible = true;
|
this.visible = true
|
||||||
},
|
},
|
||||||
handleOk(){
|
handleOk() {
|
||||||
console.log("---高级查询参数--->",this.queryParamsModel)
|
console.log('---高级查询参数--->', this.queryParamsModel)
|
||||||
if(!this.isNullArray()){
|
if (!this.isNullArray(this.queryParamsModel)) {
|
||||||
this.$emit(this.callback, this.queryParamsModel)
|
let event = {
|
||||||
}else{
|
matchType: this.selectValue,
|
||||||
|
params: this.removeEmptyObject(utils.cloneObject(this.queryParamsModel))
|
||||||
|
}
|
||||||
|
this.$emit(this.callback, event.params, event.matchType)
|
||||||
|
} else {
|
||||||
this.$emit(this.callback)
|
this.$emit(this.callback)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleCancel(){
|
handleCancel() {
|
||||||
this.close()
|
this.close()
|
||||||
},
|
},
|
||||||
close () {
|
close() {
|
||||||
this.$emit('close');
|
this.$emit('close')
|
||||||
this.visible = false;
|
this.visible = false
|
||||||
},
|
},
|
||||||
handleAdd () {
|
handleAdd() {
|
||||||
this.queryParamsModel.push({});
|
this.queryParamsModel.push({})
|
||||||
},
|
},
|
||||||
handleDel (index) {
|
handleDel(index) {
|
||||||
|
this.queryParamsModel.splice(index, 1)
|
||||||
|
},
|
||||||
|
handleSelected(option, item) {
|
||||||
|
let index = option.data.attrs['data-idx']
|
||||||
|
|
||||||
this.queryParamsModel.splice(index,1);
|
let { type, dictCode, dictTable, customReturnField } = this.fieldList[index]
|
||||||
this.$message.warning("请关闭后重新打开")
|
item['type'] = type
|
||||||
|
item['dictCode'] = dictCode
|
||||||
|
item['dictTable'] = dictTable
|
||||||
|
item['customReturnField'] = customReturnField
|
||||||
|
this.$set(item, 'val', '')
|
||||||
},
|
},
|
||||||
handleSelected(option,item){
|
handleReset() {
|
||||||
item['type'] = option.data.attrs['data-type']
|
this.queryParamsModel = [{}]
|
||||||
},
|
|
||||||
handleReset(){
|
|
||||||
this.queryParamsModel=[{}]
|
|
||||||
this.$emit(this.callback)
|
this.$emit(this.callback)
|
||||||
},
|
},
|
||||||
isNullArray(){
|
handleSave() {
|
||||||
|
let queryParams = this.removeEmptyObject(utils.cloneObject(this.queryParamsModel))
|
||||||
|
if (this.isNullArray(queryParams)) {
|
||||||
|
this.$message.warning('空条件不能保存')
|
||||||
|
} else {
|
||||||
|
this.prompt.value = ''
|
||||||
|
this.prompt.visible = true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handlePromptOk() {
|
||||||
|
|
||||||
|
let { value } = this.prompt
|
||||||
|
// 判断有没有重名
|
||||||
|
|
||||||
|
let filterList = this.treeData.filter(i => i.title === value)
|
||||||
|
if (filterList.length > 0) {
|
||||||
|
this.$confirm({
|
||||||
|
content: `${value} 已存在,是否覆盖?`,
|
||||||
|
onOk: () => {
|
||||||
|
this.prompt.visible = false
|
||||||
|
filterList[0].records = this.removeEmptyObject(utils.cloneObject(this.queryParamsModel))
|
||||||
|
this.saveToLocalStore()
|
||||||
|
this.$message.success('保存成功')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.prompt.visible = false
|
||||||
|
this.treeData.push({
|
||||||
|
title: value,
|
||||||
|
icon: this.treeIcon,
|
||||||
|
records: this.removeEmptyObject(utils.cloneObject(this.queryParamsModel))
|
||||||
|
})
|
||||||
|
this.saveToLocalStore()
|
||||||
|
this.$message.success('保存成功')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
handleTreeSelect(idx, event) {
|
||||||
|
if (event.selectedNodes[0]) {
|
||||||
|
this.queryParamsModel = utils.cloneObject(event.selectedNodes[0].data.props.records)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleTreeRightClick(args) {
|
||||||
|
this.$confirm({
|
||||||
|
content: '是否删除当前查询?',
|
||||||
|
onOk: () => {
|
||||||
|
let { node: { eventKey } } = args
|
||||||
|
this.treeData.splice(Number.parseInt(eventKey.substring(2)), 1)
|
||||||
|
this.saveToLocalStore()
|
||||||
|
this.$message.success('删除成功')
|
||||||
|
},
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 将查询保存到 LocalStore 里
|
||||||
|
saveToLocalStore() {
|
||||||
|
this.$ls.set(this.saveCodeBefore + this.saveCode, this.treeData.map(item => {
|
||||||
|
return { title: item.title, records: item.records }
|
||||||
|
}))
|
||||||
|
},
|
||||||
|
|
||||||
|
isNullArray(array) {
|
||||||
//判断是不是空数组对象
|
//判断是不是空数组对象
|
||||||
if(!this.queryParamsModel || this.queryParamsModel.length==0){
|
if (!array || array.length === 0) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if(this.queryParamsModel.length==1){
|
if (array.length === 1) {
|
||||||
let obj = this.queryParamsModel[0]
|
let obj = array[0]
|
||||||
if(!obj.field || !obj.val || !obj.rule){
|
if (!obj.field || !obj.val || !obj.rule) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false
|
||||||
|
},
|
||||||
|
// 去掉数组中的空对象
|
||||||
|
removeEmptyObject(array) {
|
||||||
|
for (let i = 0; i < array.length; i++) {
|
||||||
|
let item = array[i]
|
||||||
|
if (item == null || Object.keys(item).length <= 0) {
|
||||||
|
array.splice(i--, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style >
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
.j-super-query-modal {
|
||||||
|
|
||||||
|
/deep/ {
|
||||||
|
}
|
||||||
|
|
||||||
|
.j-super-query-history-card /deep/ {
|
||||||
|
.ant-card-body,
|
||||||
|
.ant-card-head-title {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-card-head {
|
||||||
|
padding: 4px 8px;
|
||||||
|
min-height: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.j-super-query-history-empty /deep/ {
|
||||||
|
.ant-empty-image {
|
||||||
|
height: 80px;
|
||||||
|
line-height: 80px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 80px;
|
||||||
|
height: 65px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-empty-description {
|
||||||
|
color: #afafaf;
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.j-super-query-history-tree /deep/ {
|
||||||
|
.ant-tree-switcher {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tree-node-content-wrapper {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
@ -9,6 +9,7 @@
|
|||||||
:loadData="asyncLoadTreeData"
|
:loadData="asyncLoadTreeData"
|
||||||
:value="treeValue"
|
:value="treeValue"
|
||||||
:treeData="treeData"
|
:treeData="treeData"
|
||||||
|
:multiple="multiple"
|
||||||
@change="onChange"
|
@change="onChange"
|
||||||
@search="onSearch">
|
@search="onSearch">
|
||||||
</a-tree-select>
|
</a-tree-select>
|
||||||
@ -45,7 +46,7 @@
|
|||||||
},
|
},
|
||||||
pidValue:{
|
pidValue:{
|
||||||
type: String,
|
type: String,
|
||||||
default: '0',
|
default: '',
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
disabled:{
|
disabled:{
|
||||||
@ -57,6 +58,21 @@
|
|||||||
type: String,
|
type: String,
|
||||||
default: '',
|
default: '',
|
||||||
required: false
|
required: false
|
||||||
|
},
|
||||||
|
condition:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
// 是否支持多选
|
||||||
|
multiple: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
loadTriggleChange:{
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
required:false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
@ -81,9 +97,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created(){
|
created(){
|
||||||
this.initDictInfo()
|
this.validateProp().then(()=>{
|
||||||
this.loadRoot()
|
this.initDictInfo()
|
||||||
this.loadItemByCode()
|
this.loadRoot()
|
||||||
|
this.loadItemByCode()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
loadItemByCode(){
|
loadItemByCode(){
|
||||||
@ -92,15 +110,23 @@
|
|||||||
}else{
|
}else{
|
||||||
getAction(`${this.view}${this.dict}`,{key:this.value}).then(res=>{
|
getAction(`${this.view}${this.dict}`,{key:this.value}).then(res=>{
|
||||||
if(res.success){
|
if(res.success){
|
||||||
this.treeValue = {
|
let values = this.value.split(',')
|
||||||
key:this.value,
|
this.treeValue = res.result.map((item, index) => ({
|
||||||
value:this.value,
|
key: values[index],
|
||||||
label:res.result
|
value: values[index],
|
||||||
}
|
label: item
|
||||||
|
}))
|
||||||
|
this.onLoadTriggleChange(res.result[0]);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
onLoadTriggleChange(text){
|
||||||
|
//只有单选才会触发
|
||||||
|
if(!this.multiple && this.loadTriggleChange){
|
||||||
|
this.$emit('change', this.value,text)
|
||||||
|
}
|
||||||
|
},
|
||||||
initDictInfo(){
|
initDictInfo(){
|
||||||
let arr = this.dict.split(",")
|
let arr = this.dict.split(",")
|
||||||
this.tableName = arr[0]
|
this.tableName = arr[0]
|
||||||
@ -120,7 +146,8 @@
|
|||||||
text:this.text,
|
text:this.text,
|
||||||
code:this.code,
|
code:this.code,
|
||||||
pidField:this.pidField,
|
pidField:this.pidField,
|
||||||
hasChildField:this.hasChildField
|
hasChildField:this.hasChildField,
|
||||||
|
condition:this.condition
|
||||||
}
|
}
|
||||||
getAction(this.url,param).then(res=>{
|
getAction(this.url,param).then(res=>{
|
||||||
if(res.success){
|
if(res.success){
|
||||||
@ -162,7 +189,8 @@
|
|||||||
text:this.text,
|
text:this.text,
|
||||||
code:this.code,
|
code:this.code,
|
||||||
pidField:this.pidField,
|
pidField:this.pidField,
|
||||||
hasChildField:this.hasChildField
|
hasChildField:this.hasChildField,
|
||||||
|
condition:this.condition
|
||||||
}
|
}
|
||||||
getAction(this.url,param).then(res=>{
|
getAction(this.url,param).then(res=>{
|
||||||
if(res.success && res.result){
|
if(res.success && res.result){
|
||||||
@ -184,8 +212,11 @@
|
|||||||
if(!value){
|
if(!value){
|
||||||
this.$emit('change', '');
|
this.$emit('change', '');
|
||||||
this.treeValue = ''
|
this.treeValue = ''
|
||||||
}else{
|
} else if (value instanceof Array) {
|
||||||
this.$emit('change', value.value);
|
this.$emit('change', value.map(item => item.value).join(','))
|
||||||
|
this.treeValue = value
|
||||||
|
} else {
|
||||||
|
this.$emit('change', value.value,value.label)
|
||||||
this.treeValue = value
|
this.treeValue = value
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,6 +226,28 @@
|
|||||||
},
|
},
|
||||||
getCurrTreeData(){
|
getCurrTreeData(){
|
||||||
return this.treeData
|
return this.treeData
|
||||||
|
},
|
||||||
|
validateProp(){
|
||||||
|
let mycondition = this.condition
|
||||||
|
return new Promise((resolve,reject)=>{
|
||||||
|
if(!mycondition){
|
||||||
|
resolve();
|
||||||
|
}else{
|
||||||
|
try {
|
||||||
|
let test=JSON.parse(mycondition);
|
||||||
|
console.log("aaaaasdsdd",typeof test)
|
||||||
|
if(typeof test == 'object' && test){
|
||||||
|
resolve()
|
||||||
|
}else{
|
||||||
|
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
|
||||||
|
reject()
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
|
||||||
|
reject()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
|
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
|
||||||
|
|||||||
@ -3,8 +3,11 @@
|
|||||||
:rowKey="rowKey"
|
:rowKey="rowKey"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
:dataSource="dataSource"
|
:dataSource="dataSource"
|
||||||
v-bind="tableProps"
|
:expandedRowKeys="expandedRowKeys"
|
||||||
@expand="handleExpand">
|
v-bind="tableAttrs"
|
||||||
|
v-on="$listeners"
|
||||||
|
@expand="handleExpand"
|
||||||
|
@expandedRowsChange="expandedRowKeys=$event">
|
||||||
|
|
||||||
<template v-for="(slotItem) of slots" :slot="slotItem" slot-scope="text, record, index">
|
<template v-for="(slotItem) of slots" :slot="slotItem" slot-scope="text, record, index">
|
||||||
<slot :name="slotItem" v-bind="{text,record,index}"></slot>
|
<slot :name="slotItem" v-bind="{text,record,index}"></slot>
|
||||||
@ -30,8 +33,7 @@
|
|||||||
},
|
},
|
||||||
queryParams: {
|
queryParams: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => {
|
default: () => ({})
|
||||||
}
|
|
||||||
},
|
},
|
||||||
// 查询顶级时的值,如果顶级为0,则传0
|
// 查询顶级时的值,如果顶级为0,则传0
|
||||||
topValue: {
|
topValue: {
|
||||||
@ -52,13 +54,23 @@
|
|||||||
},
|
},
|
||||||
tableProps: {
|
tableProps: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => {
|
default: () => ({})
|
||||||
}
|
},
|
||||||
|
/** 是否在创建组件的时候就查询数据 */
|
||||||
|
immediateRequest: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
condition:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
dataSource: []
|
dataSource: [],
|
||||||
|
expandedRowKeys: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -77,6 +89,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return slots
|
return slots
|
||||||
|
},
|
||||||
|
tableAttrs() {
|
||||||
|
return Object.assign(this.$attrs, this.tableProps)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -88,20 +103,44 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.loadData()
|
if (this.immediateRequest) this.loadData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
/** 加载数据*/
|
/** 加载数据*/
|
||||||
loadData(id = this.topValue, first = true, url = this.url) {
|
loadData(id = this.topValue, first = true, url = this.url) {
|
||||||
|
this.$emit('requestBefore', { first })
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
this.expandedRowKeys = []
|
||||||
|
}
|
||||||
|
|
||||||
let params = Object.assign({}, this.queryParams || {})
|
let params = Object.assign({}, this.queryParams || {})
|
||||||
params[this.queryKey] = id
|
params[this.queryKey] = id
|
||||||
|
if(this.condition && this.condition.length>0){
|
||||||
|
params['condition'] = this.condition
|
||||||
|
}
|
||||||
|
|
||||||
return getAction(url, params).then(res => {
|
return getAction(url, params).then(res => {
|
||||||
let dataSource = res.result.map(item => {
|
let list = []
|
||||||
|
if (res.result instanceof Array) {
|
||||||
|
list = res.result
|
||||||
|
} else if (res.result.records instanceof Array) {
|
||||||
|
list = res.result.records
|
||||||
|
} else {
|
||||||
|
throw '返回数据类型不识别'
|
||||||
|
}
|
||||||
|
let dataSource = list.map(item => {
|
||||||
// 判断是否标记了带有子级
|
// 判断是否标记了带有子级
|
||||||
if (item.hasChildren === true) {
|
if (item.hasChildren === true) {
|
||||||
|
// 查找第一个带有dataIndex的值的列
|
||||||
|
let firstColumn
|
||||||
|
for (let column of this.columns) {
|
||||||
|
firstColumn = column.dataIndex
|
||||||
|
if (firstColumn) break
|
||||||
|
}
|
||||||
// 定义默认展开时显示的loading子级,实际子级数据只在展开时加载
|
// 定义默认展开时显示的loading子级,实际子级数据只在展开时加载
|
||||||
let loadChild = { id: `${item.id}_loadChild`, name: 'loading...', isLoading: true }
|
let loadChild = { id: `${item.id}_loadChild`, [firstColumn]: 'loading...', isLoading: true }
|
||||||
item.children = [loadChild]
|
item.children = [loadChild]
|
||||||
}
|
}
|
||||||
return item
|
return item
|
||||||
@ -109,8 +148,9 @@
|
|||||||
if (first) {
|
if (first) {
|
||||||
this.dataSource = dataSource
|
this.dataSource = dataSource
|
||||||
}
|
}
|
||||||
|
this.$emit('requestSuccess', { first, dataSource, res })
|
||||||
return Promise.resolve(dataSource)
|
return Promise.resolve(dataSource)
|
||||||
})
|
}).finally(() => this.$emit('requestFinally', { first }))
|
||||||
},
|
},
|
||||||
|
|
||||||
/** 点击展开图标时触发 */
|
/** 点击展开图标时触发 */
|
||||||
|
|||||||
@ -7,7 +7,8 @@
|
|||||||
:data="{'isup':1,'bizPath':bizPath}"
|
:data="{'isup':1,'bizPath':bizPath}"
|
||||||
:fileList="fileList"
|
:fileList="fileList"
|
||||||
:beforeUpload="beforeUpload"
|
:beforeUpload="beforeUpload"
|
||||||
@change="handleChange">
|
@change="handleChange"
|
||||||
|
:disabled="disabled">
|
||||||
<a-button>
|
<a-button>
|
||||||
<a-icon type="upload" />{{ text }}
|
<a-icon type="upload" />{{ text }}
|
||||||
</a-button>
|
</a-button>
|
||||||
@ -63,6 +64,13 @@
|
|||||||
type:String,
|
type:String,
|
||||||
required:false
|
required:false
|
||||||
},
|
},
|
||||||
|
// update-begin- --- author:wangshuai ------ date:20190929 ---- for:Jupload组件增加是否能够点击
|
||||||
|
disabled:{
|
||||||
|
type:Boolean,
|
||||||
|
required:false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
// update-end- --- author:wangshuai ------ date:20190929 ---- for:Jupload组件增加是否能够点击
|
||||||
//此属性被废弃了
|
//此属性被废弃了
|
||||||
triggerChange:{
|
triggerChange:{
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
|||||||
@ -477,6 +477,7 @@ online用 实际开发请使用components/dict/JMultiSelectTag
|
|||||||
| dict |string | ✔| 表名,显示字段名,存储字段名拼接的字符串 |
|
| dict |string | ✔| 表名,显示字段名,存储字段名拼接的字符串 |
|
||||||
| pidField |string | ✔| 父ID的字段名 |
|
| pidField |string | ✔| 父ID的字段名 |
|
||||||
| pidValue |string | | 根节点父ID的值 默认'0' 不可以设置为空,如果想使用此组件,而数据库根节点父ID为空,请修改之 |
|
| pidValue |string | | 根节点父ID的值 默认'0' 不可以设置为空,如果想使用此组件,而数据库根节点父ID为空,请修改之 |
|
||||||
|
| multiple |boolean | |是否支持多选 |
|
||||||
|
|
||||||
使用示例
|
使用示例
|
||||||
----
|
----
|
||||||
|
|||||||
@ -2,30 +2,33 @@
|
|||||||
|
|
||||||
## 参数配置
|
## 参数配置
|
||||||
|
|
||||||
| 参数 | 类型 | 必填 | 说明 |
|
| 参数 | 类型 | 必填 | 说明 |
|
||||||
|--------------|---------|------|----------------------------------------------------------------|
|
|--------------|---------|------|---------------------------------------------------------------------------------|
|
||||||
| columns | array | ✔️ | 表格列的配置描述,具体项见下表 |
|
| columns | array | ✔️ | 表格列的配置描述,具体项见下表 |
|
||||||
| dataSource | array | ✔️ | 表格数据 |
|
| dataSource | array | ✔️ | 表格数据 |
|
||||||
| loading | boolean | | 是否正在加载,加载中不会显示任何行,默认false |
|
| loading | boolean | | 是否正在加载,加载中不会显示任何行,默认false |
|
||||||
| actionButton | boolean | | 是否显示操作按钮,包括"新增"、"删除",默认false |
|
| actionButton | boolean | | 是否显示操作按钮,包括"新增"、"删除",默认false |
|
||||||
| rowNumber | boolean | | 是否显示行号,默认false |
|
| rowNumber | boolean | | 是否显示行号,默认false |
|
||||||
| rowSelection | boolean | | 是否可选择行,默认false |
|
| rowSelection | boolean | | 是否可选择行,默认false |
|
||||||
| maxHeight | number | | 设定最大高度(px),默认400 |
|
| dragSort | boolean | | 是否可拖动排序,默认false |
|
||||||
| disabledRows | object | | 设定禁用的行,被禁用的行无法被选择和编辑,配置方法可以查看示例 |
|
| dragSortKey | string | | 拖动排序存储的Key,无需定义在columns内也能在getValues()时获取到值,默认orderNum |
|
||||||
| disabled | boolean | | 是否禁用所有行,默认false |
|
| maxHeight | number | | 设定最大高度(px),默认400 |
|
||||||
|
| disabledRows | object | | 设定禁用的行,被禁用的行无法被选择和编辑,配置方法可以查看示例 |
|
||||||
|
| disabled | boolean | | 是否禁用所有行,默认false |
|
||||||
|
|
||||||
### columns 参数详解
|
### columns 参数详解
|
||||||
|
|
||||||
| 参数 | 类型 | 必填 | 说明 |
|
| 参数 | 类型 | 必填 | 说明 |
|
||||||
|---------------|--------|------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|---------------|---------|------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| title | string | ✔️ | 表格列头显示的问题 |
|
| title | string | ✔️ | 表格列头显示的问题 |
|
||||||
| key | string | ✔️ | 列数据在数据项中对应的 key,必须是唯一的 |
|
| key | string | ✔️ | 列数据在数据项中对应的 key,必须是唯一的 |
|
||||||
| type | string | ✔️ | 表单的类型,可以通过`JEditableTableUtil.FormTypes`赋值 |
|
| type | string | ✔️ | 表单的类型,可以通过`JEditableTableUtil.FormTypes`赋值 |
|
||||||
| width | string | | 列的宽度,可以是百分比,也可以是`px`或其他单位,建议设置为百分比,且每一列的宽度加起来不应超过100%,否则可能会不能达到预期的效果。留空会自动计算百分比 |
|
| width | string | | 列的宽度,可以是百分比,也可以是`px`或其他单位,建议设置为百分比,且每一列的宽度加起来不应超过100%,否则可能会不能达到预期的效果。留空会自动计算百分比 |
|
||||||
| placeholder | string | | 表单预期值的提示信息,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`) |
|
| placeholder | string | | 表单预期值的提示信息,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`) |
|
||||||
| defaultValue | string | | 默认值,在新增一行时生效 |
|
| defaultValue | string | | 默认值,在新增一行时生效 |
|
||||||
| validateRules | array | | 表单验证规则,配置方式见[validateRules 配置规则](#validaterules-配置规则) |
|
| validateRules | array | | 表单验证规则,配置方式见[validateRules 配置规则](#validaterules-配置规则) |
|
||||||
| props | object | | 设置添加给表单元素的自定义属性,例如:`props:{title: 'show title'}` |
|
| props | object | | 设置添加给表单元素的自定义属性,例如:`props:{title: 'show title'}` |
|
||||||
|
| disabled | boolean | | 是否禁用当前列,默认false |
|
||||||
|
|
||||||
#### 当 type=checkbox 时所需的参数
|
#### 当 type=checkbox 时所需的参数
|
||||||
|
|
||||||
@ -40,7 +43,7 @@
|
|||||||
|------------|---------|------|----------------------------------------------------|
|
|------------|---------|------|----------------------------------------------------|
|
||||||
| options | array | ✔️ | 下拉选项列表,详见下表 |
|
| options | array | ✔️ | 下拉选项列表,详见下表 |
|
||||||
| allowInput | boolean | | 是否允许用户输入内容,并创建新的内容 |
|
| allowInput | boolean | | 是否允许用户输入内容,并创建新的内容 |
|
||||||
| dictCode | String | | 数据字典Code,若options也有值,则拼接再options后面 |
|
| dictCode | String | | 数据字典Code,若options也有值,则拼接在options后面 |
|
||||||
|
|
||||||
##### options 所需参数
|
##### options 所需参数
|
||||||
|
|
||||||
@ -70,16 +73,18 @@
|
|||||||
|
|
||||||
- `required` 是否必填,可选值为`true`or`false`
|
- `required` 是否必填,可选值为`true`or`false`
|
||||||
- `pattern` 正则表达式验证,只有成功匹配该正则的值才能成功通过验证
|
- `pattern` 正则表达式验证,只有成功匹配该正则的值才能成功通过验证
|
||||||
|
- `handler` 自定义函数校验,使用方法请见[示例五](#示例五)
|
||||||
- `message` 当验证未通过时显示的提示文本,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`)
|
- `message` 当验证未通过时显示的提示文本,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`)
|
||||||
- 配置示例请看[示例二](#示例二)
|
- 配置示例请看[示例二](#示例二)
|
||||||
|
|
||||||
## 事件
|
## 事件
|
||||||
|
|
||||||
| 事件名 | 触发时机 | 参数 |
|
| 事件名 | 触发时机 | 参数 |
|
||||||
|-----------------|----------------------------------------------------|-------------------------------|
|
|-----------------|----------------------------------------------------|--------------------------------------------------|
|
||||||
| added | 当添加行操作完成后触发 | |
|
| added | 当添加行操作完成后触发 | |
|
||||||
| deleted | 当删除行操作完成后触发(批量删除操作只会触发一次) | `deleteIds` 被逻辑删除的id |
|
| deleted | 当删除行操作完成后触发(批量删除操作只会触发一次) | `deleteIds` 被逻辑删除的id |
|
||||||
| selectRowChange | 当行被选中或取消选中时触发 | `selectedRowIds` 被选中行的id |
|
| selectRowChange | 当行被选中或取消选中时触发 | `selectedRowIds` 被选中行的id |
|
||||||
|
| valueChange | 当数据发生改变的时候触发的事件 | `{ type, row, column, value, target }` Event对象 |
|
||||||
|
|
||||||
## 方法
|
## 方法
|
||||||
|
|
||||||
@ -248,6 +253,19 @@ setValues([
|
|||||||
}
|
}
|
||||||
])
|
])
|
||||||
```
|
```
|
||||||
|
### clearSelection
|
||||||
|
|
||||||
|
主动清空选择的行
|
||||||
|
|
||||||
|
- `参数:` 无
|
||||||
|
- `返回值:` 无
|
||||||
|
|
||||||
|
## 内置插槽
|
||||||
|
|
||||||
|
| 插槽名 | 说明 |
|
||||||
|
|--------------|------------------------------------------------------|
|
||||||
|
| buttonBefore | 在操作按钮的**前面**插入插槽,不受`actionButton`属性的影响 |
|
||||||
|
| buttonAfter | 在操作按钮的**后面**插入插槽,不受`actionButton`属性的影响 |
|
||||||
|
|
||||||
## ${...} 变量使用方式
|
## ${...} 变量使用方式
|
||||||
|
|
||||||
@ -490,6 +508,7 @@ this.$refs.editableTable.getValues((error, values) => {
|
|||||||
/* a 标签的点击事件,删除当前选中的行 */
|
/* a 标签的点击事件,删除当前选中的行 */
|
||||||
handleDelete(props) {
|
handleDelete(props) {
|
||||||
// 参数解释
|
// 参数解释
|
||||||
|
// props.index :当前行的下标
|
||||||
// props.text :当前值,可能是defaultValue定义的值,也可能是从dataSource中取出的值
|
// props.text :当前值,可能是defaultValue定义的值,也可能是从dataSource中取出的值
|
||||||
// props.rowId :当前选中行的id,如果是新增行则是临时id
|
// props.rowId :当前选中行的id,如果是新增行则是临时id
|
||||||
// props.column :当前操作的列
|
// props.column :当前操作的列
|
||||||
@ -505,4 +524,54 @@ this.$refs.editableTable.getValues((error, values) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 示例五
|
||||||
|
|
||||||
|
```js
|
||||||
|
// 该示例是自定义函数校验
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '字段名称',
|
||||||
|
key: 'dbFieldName',
|
||||||
|
type: FormTypes.input,
|
||||||
|
defaultValue: '',
|
||||||
|
validateRules: [
|
||||||
|
{
|
||||||
|
// 自定义函数校验 handler
|
||||||
|
handler(type, value, row, column, callback, target) {
|
||||||
|
// type 触发校验的类型(input、change、blur)
|
||||||
|
// value 当前校验的值
|
||||||
|
// callback(flag, message) 方法必须执行且只能执行一次
|
||||||
|
// flag = 是否通过了校验,不填写或者填写 null 代表不进行任何操作
|
||||||
|
// message = 提示的类型,默认使用配置的 message
|
||||||
|
// target 行编辑的实例对象
|
||||||
|
|
||||||
|
if (type === 'blur') {
|
||||||
|
|
||||||
|
if (value === 'abc') {
|
||||||
|
callback(false, '${title}不能是abc') // false = 未通过,可以跟自定义提示
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let { values } = target.getValuesSync({ validate: false })
|
||||||
|
let count = 0
|
||||||
|
for (let val of values) {
|
||||||
|
if (val['dbFieldName'] === value) {
|
||||||
|
if (++count >= 2) {
|
||||||
|
callback(false, '${title}不能重复')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
callback(true) // true = 通过验证
|
||||||
|
} else {
|
||||||
|
callback() // 不填写或者填写 null 代表不进行任何操作
|
||||||
|
}
|
||||||
|
},
|
||||||
|
message: '${title}默认提示'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]
|
||||||
```
|
```
|
||||||
928
ant-design-vue-jeecg/src/components/jeecg/modal/JCronModal.vue
Normal file
928
ant-design-vue-jeecg/src/components/jeecg/modal/JCronModal.vue
Normal file
@ -0,0 +1,928 @@
|
|||||||
|
<template>
|
||||||
|
<a-modal
|
||||||
|
title="corn表达式"
|
||||||
|
:width="modalWidth"
|
||||||
|
:visible="visible"
|
||||||
|
:confirmLoading="confirmLoading"
|
||||||
|
@ok="handleSubmit"
|
||||||
|
@cancel="close"
|
||||||
|
cancelText="关闭">
|
||||||
|
<div class="card-container">
|
||||||
|
<a-tabs type="card">
|
||||||
|
<a-tab-pane key="1" type="card">
|
||||||
|
<span slot="tab"><a-icon type="schedule" /> 秒</span>
|
||||||
|
<a-radio-group v-model="result.second.cronEvery">
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="1">每一秒钟</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="2">每隔
|
||||||
|
<a-input-number size="small" v-model="result.second.incrementIncrement" :min="1" :max="59"></a-input-number>
|
||||||
|
秒执行 从
|
||||||
|
<a-input-number size="small" v-model="result.second.incrementStart" :min="0" :max="59"></a-input-number>
|
||||||
|
秒开始
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="3">具体秒数(可多选)</a-radio>
|
||||||
|
<a-select style="width:354px;" size="small" mode="multiple" v-model="result.second.specificSpecific">
|
||||||
|
<a-select-option v-for="(val,index) in 60" :key="index" :value="index">{{ index }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="4">周期从
|
||||||
|
<a-input-number size="small" v-model="result.second.rangeStart" :min="1" :max="59"></a-input-number>
|
||||||
|
到
|
||||||
|
<a-input-number size="small" v-model="result.second.rangeEnd" :min="0" :max="59"></a-input-number>
|
||||||
|
秒
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
</a-radio-group>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="2">
|
||||||
|
<span slot="tab"><a-icon type="schedule" />分</span>
|
||||||
|
<div class="tabBody">
|
||||||
|
<a-radio-group v-model="result.minute.cronEvery">
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="1">每一分钟</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="2">每隔
|
||||||
|
<a-input-number size="small" v-model="result.minute.incrementIncrement" :min="1" :max="60"></a-input-number>
|
||||||
|
分执行 从
|
||||||
|
<a-input-number size="small" v-model="result.minute.incrementStart" :min="0" :max="59"></a-input-number>
|
||||||
|
分开始
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="3">具体分钟数(可多选)</a-radio>
|
||||||
|
<a-select style="width:340px;" size="small" mode="multiple" v-model="result.minute.specificSpecific">
|
||||||
|
<a-select-option v-for="(val,index) in Array(60)" :key="index" :value="index"> {{ index }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="4">周期从
|
||||||
|
<a-input-number size="small" v-model="result.minute.rangeStart" :min="1" :max="60"></a-input-number>
|
||||||
|
到
|
||||||
|
<a-input-number size="small" v-model="result.minute.rangeEnd" :min="0" :max="59"></a-input-number>
|
||||||
|
分
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
</a-radio-group>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="3">
|
||||||
|
<span slot="tab"><a-icon type="schedule" /> 时</span>
|
||||||
|
<div class="tabBody">
|
||||||
|
<a-radio-group v-model="result.hour.cronEvery">
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="1">每一小时</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="2">每隔
|
||||||
|
<a-input-number size="small" v-model="result.hour.incrementIncrement" :min="0" :max="23"></a-input-number>
|
||||||
|
小时执行 从
|
||||||
|
<a-input-number size="small" v-model="result.hour.incrementStart" :min="0" :max="23"></a-input-number>
|
||||||
|
小时开始
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio class="long" value="3">具体小时数(可多选)</a-radio>
|
||||||
|
<a-select style="width:340px;" size="small" mode="multiple" v-model="result.hour.specificSpecific">
|
||||||
|
<a-select-option v-for="(val,index) in Array(24)" :key="index" >{{ index }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="4">周期从
|
||||||
|
<a-input-number size="small" v-model="result.hour.rangeStart" :min="0" :max="23"></a-input-number>
|
||||||
|
到
|
||||||
|
<a-input-number size="small" v-model="result.hour.rangeEnd" :min="0" :max="23"></a-input-number>
|
||||||
|
小时
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
</a-radio-group>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="4">
|
||||||
|
<span slot="tab"><a-icon type="schedule" /> 天</span>
|
||||||
|
<div class="tabBody">
|
||||||
|
<a-radio-group v-model="result.day.cronEvery">
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="1">每一天</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="2">每隔
|
||||||
|
<a-input-number size="small" v-model="result.week.incrementIncrement" :min="1" :max="7"></a-input-number>
|
||||||
|
周执行 从
|
||||||
|
<a-select size="small" v-model="result.week.incrementStart">
|
||||||
|
<a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{ weekDays[index] }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
开始
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="3">每隔
|
||||||
|
<a-input-number size="small" v-model="result.day.incrementIncrement" :min="1" :max="31"></a-input-number>
|
||||||
|
天执行 从
|
||||||
|
<a-input-number size="small" v-model="result.day.incrementStart" :min="1" :max="31"></a-input-number>
|
||||||
|
天开始
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio class="long" value="4">具体星期几(可多选)</a-radio>
|
||||||
|
<a-select style="width:340px;" size="small" mode="multiple" v-model="result.week.specificSpecific">
|
||||||
|
<a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{ weekDays[index] }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio class="long" value="5">具体天数(可多选)</a-radio>
|
||||||
|
<a-select style="width:354px;" size="small" mode="multiple" v-model="result.day.specificSpecific">
|
||||||
|
<a-select-option v-for="(val,index) in Array(31)" :key="index" :value="index+1">{{ index+1 }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="6">在这个月的最后一天</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="7">在这个月的最后一个工作日</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="8">在这个月的最后一个
|
||||||
|
<a-select size="small" v-model="result.day.cronLastSpecificDomDay">
|
||||||
|
<a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{ weekDays[index] }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="9">
|
||||||
|
在本月底前
|
||||||
|
<a-input-number size="small" v-model="result.day.cronDaysBeforeEomMinus" :min="1" :max="31"></a-input-number>
|
||||||
|
天
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="10">最近的工作日(周一至周五)至本月
|
||||||
|
<a-input-number size="small" v-model="result.day.cronDaysNearestWeekday" :min="1" :max="31"></a-input-number>
|
||||||
|
日
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="11">在这个月的第
|
||||||
|
<a-input-number size="small" v-model="result.week.cronNthDayNth" :min="1" :max="5"></a-input-number>
|
||||||
|
个
|
||||||
|
<a-select size="small" v-model="result.week.cronNthDayDay">
|
||||||
|
<a-select-option v-for="(val,index) in Array(7)" :key="index" :value="index+1">{{ weekDays[index] }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
</a-radio-group>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="5">
|
||||||
|
<span slot="tab"><a-icon type="schedule" /> 月</span>
|
||||||
|
<div class="tabBody">
|
||||||
|
<a-radio-group v-model="result.month.cronEvery">
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="1">每一月</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="2">每隔
|
||||||
|
<a-input-number size="small" v-model="result.month.incrementIncrement" :min="0" :max="12"></a-input-number>
|
||||||
|
月执行 从
|
||||||
|
<a-input-number size="small" v-model="result.month.incrementStart" :min="0" :max="12"></a-input-number>
|
||||||
|
月开始
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio class="long" value="3">具体月数(可多选)</a-radio>
|
||||||
|
<a-select style="width:354px;" size="small" filterable mode="multiple" v-model="result.month.specificSpecific">
|
||||||
|
<a-select-option v-for="(val,index) in Array(12)" :key="index" :value="index+1">{{ index+1 }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="4">从
|
||||||
|
<a-input-number size="small" v-model="result.month.rangeStart" :min="1" :max="12"></a-input-number>
|
||||||
|
到
|
||||||
|
<a-input-number size="small" v-model="result.month.rangeEnd" :min="1" :max="12"></a-input-number>
|
||||||
|
月之间的每个月
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
</a-radio-group>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="6">
|
||||||
|
<span slot="tab"><a-icon type="schedule" /> 年</span>
|
||||||
|
<div class="tabBody">
|
||||||
|
<a-radio-group v-model="result.year.cronEvery">
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="1">每一年</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="2">每隔
|
||||||
|
<a-input-number size="small" v-model="result.year.incrementIncrement" :min="1" :max="99"></a-input-number>
|
||||||
|
年执行 从
|
||||||
|
<a-input-number size="small" v-model="result.year.incrementStart" :min="2019" :max="2119"></a-input-number>
|
||||||
|
年开始
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio class="long" value="3">具体年份(可多选)</a-radio>
|
||||||
|
<a-select style="width:354px;" size="small" filterable mode="multiple" v-model="result.year.specificSpecific">
|
||||||
|
<a-select-option v-for="(val,index) in Array(100)" :key="index" :value="2019+index">{{ 2019+index }}</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
|
<a-radio value="4">从
|
||||||
|
<a-input-number size="small" v-model="result.year.rangeStart" :min="2019" :max="2119"></a-input-number>
|
||||||
|
到
|
||||||
|
<a-input-number size="small" v-model="result.year.rangeEnd" :min="2019" :max="2119"></a-input-number>
|
||||||
|
年之间的每一年
|
||||||
|
</a-radio>
|
||||||
|
</a-row>
|
||||||
|
</a-radio-group>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
</a-tabs>
|
||||||
|
<div class="bottom">
|
||||||
|
<span class="value">{{this.cron }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name:'VueCron',
|
||||||
|
props:['data'],
|
||||||
|
data(){
|
||||||
|
return {
|
||||||
|
visible: false,
|
||||||
|
confirmLoading:false,
|
||||||
|
size:'large',
|
||||||
|
weekDays:['天','一','二','三','四','五','六'].map(val=>'星期'+val),
|
||||||
|
result: {
|
||||||
|
second:{},
|
||||||
|
minute:{},
|
||||||
|
hour:{},
|
||||||
|
day:{},
|
||||||
|
week:{},
|
||||||
|
month:{},
|
||||||
|
year:{}
|
||||||
|
},
|
||||||
|
defaultValue: {
|
||||||
|
second:{
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:0,
|
||||||
|
specificSpecific:[],
|
||||||
|
},
|
||||||
|
minute:{
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:'0',
|
||||||
|
specificSpecific:[],
|
||||||
|
},
|
||||||
|
hour:{
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:'0',
|
||||||
|
rangeEnd:'0',
|
||||||
|
specificSpecific:[],
|
||||||
|
},
|
||||||
|
day:{
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:1,
|
||||||
|
incrementIncrement:'1',
|
||||||
|
rangeStart:'',
|
||||||
|
rangeEnd:'',
|
||||||
|
specificSpecific:[],
|
||||||
|
cronLastSpecificDomDay:1,
|
||||||
|
cronDaysBeforeEomMinus:1,
|
||||||
|
cronDaysNearestWeekday:1,
|
||||||
|
},
|
||||||
|
week:{
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:1,
|
||||||
|
incrementIncrement:1,
|
||||||
|
specificSpecific:[],
|
||||||
|
cronNthDayDay:1,
|
||||||
|
cronNthDayNth:1,
|
||||||
|
},
|
||||||
|
month:{
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:1,
|
||||||
|
specificSpecific:[],
|
||||||
|
},
|
||||||
|
year:{
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:2017,
|
||||||
|
incrementIncrement:1,
|
||||||
|
rangeStart:2019,
|
||||||
|
rangeEnd: 2019,
|
||||||
|
specificSpecific:[],
|
||||||
|
},
|
||||||
|
label:''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
modalWidth(){
|
||||||
|
return 608;
|
||||||
|
},
|
||||||
|
secondsText() {
|
||||||
|
let seconds = '';
|
||||||
|
let cronEvery=this.result.second.cronEvery||'';
|
||||||
|
switch (cronEvery.toString()){
|
||||||
|
case '1':
|
||||||
|
seconds = '*';
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
seconds = this.result.second.incrementStart+'/'+this.result.second.incrementIncrement;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
this.result.second.specificSpecific.map(val=> {seconds += val+','});
|
||||||
|
seconds = seconds.slice(0, -1);
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
seconds = this.result.second.rangeStart+'-'+this.result.second.rangeEnd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return seconds;
|
||||||
|
},
|
||||||
|
minutesText() {
|
||||||
|
let minutes = '';
|
||||||
|
let cronEvery=this.result.minute.cronEvery||'';
|
||||||
|
switch (cronEvery.toString()){
|
||||||
|
case '1':
|
||||||
|
minutes = '*';
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
minutes = this.result.minute.incrementStart+'/'+this.result.minute.incrementIncrement;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
this.result.minute.specificSpecific.map(val=> {
|
||||||
|
minutes += val+','
|
||||||
|
});
|
||||||
|
minutes = minutes.slice(0, -1);
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
minutes = this.result.minute.rangeStart+'-'+this.result.minute.rangeEnd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return minutes;
|
||||||
|
},
|
||||||
|
hoursText() {
|
||||||
|
let hours = '';
|
||||||
|
let cronEvery=this.result.hour.cronEvery||'';
|
||||||
|
switch (cronEvery.toString()){
|
||||||
|
case '1':
|
||||||
|
hours = '*';
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
hours = this.result.hour.incrementStart+'/'+this.result.hour.incrementIncrement;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
this.result.hour.specificSpecific.map(val=> {
|
||||||
|
hours += val+','
|
||||||
|
});
|
||||||
|
hours = hours.slice(0, -1);
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
hours = this.result.hour.rangeStart+'-'+this.result.hour.rangeEnd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return hours;
|
||||||
|
},
|
||||||
|
daysText() {
|
||||||
|
let days='';
|
||||||
|
let cronEvery=this.result.day.cronEvery||'';
|
||||||
|
switch (cronEvery.toString()){
|
||||||
|
case '1':
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
case '4':
|
||||||
|
case '11':
|
||||||
|
days = '?';
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
days = this.result.day.incrementStart+'/'+this.result.day.incrementIncrement;
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
this.result.day.specificSpecific.map(val=> {
|
||||||
|
days += val+','
|
||||||
|
});
|
||||||
|
days = days.slice(0, -1);
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
days = "L";
|
||||||
|
break;
|
||||||
|
case '7':
|
||||||
|
days = "LW";
|
||||||
|
break;
|
||||||
|
case '8':
|
||||||
|
days = this.result.day.cronLastSpecificDomDay + 'L';
|
||||||
|
break;
|
||||||
|
case '9':
|
||||||
|
days = 'L-' + this.result.day.cronDaysBeforeEomMinus;
|
||||||
|
break;
|
||||||
|
case '10':
|
||||||
|
days = this.result.day.cronDaysNearestWeekday+"W";
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return days;
|
||||||
|
},
|
||||||
|
weeksText() {
|
||||||
|
let weeks = '';
|
||||||
|
let cronEvery=this.result.day.cronEvery||'';
|
||||||
|
switch (cronEvery.toString()){
|
||||||
|
case '1':
|
||||||
|
case '3':
|
||||||
|
case '5':
|
||||||
|
weeks = '?';
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
weeks = this.result.week.incrementStart+'/'+this.result.week.incrementIncrement;
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
this.result.week.specificSpecific.map(val=> {
|
||||||
|
weeks += val+','
|
||||||
|
});
|
||||||
|
weeks = weeks.slice(0, -1);
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
case '10':
|
||||||
|
weeks = "?";
|
||||||
|
break;
|
||||||
|
case '11':
|
||||||
|
weeks = this.result.week.cronNthDayDay+"#"+this.result.week.cronNthDayNth;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return weeks;
|
||||||
|
},
|
||||||
|
monthsText() {
|
||||||
|
let months = '';
|
||||||
|
let cronEvery=this.result.month.cronEvery||'';
|
||||||
|
switch (cronEvery.toString()){
|
||||||
|
case '1':
|
||||||
|
months = '*';
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
months = this.result.month.incrementStart+'/'+this.result.month.incrementIncrement;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
this.result.month.specificSpecific.map(val=> {
|
||||||
|
months += val+','
|
||||||
|
});
|
||||||
|
months = months.slice(0, -1);
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
months = this.result.month.rangeStart+'-'+this.result.month.rangeEnd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return months;
|
||||||
|
},
|
||||||
|
yearsText() {
|
||||||
|
let years = '';
|
||||||
|
let cronEvery=this.result.year.cronEvery||'';
|
||||||
|
switch (cronEvery.toString()){
|
||||||
|
case '1':
|
||||||
|
years = '*';
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
years = this.result.year.incrementStart+'/'+this.result.year.incrementIncrement;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
this.result.year.specificSpecific.map(val=> {
|
||||||
|
years += val+','
|
||||||
|
});
|
||||||
|
years = years.slice(0, -1);
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
years = this.result.year.rangeStart+'-'+this.result.year.rangeEnd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return years;
|
||||||
|
},
|
||||||
|
cron(){
|
||||||
|
return `${this.secondsText||'*'} ${this.minutesText||'*'} ${this.hoursText||'*'} ${this.daysText||'*'} ${this.monthsText||'*'} ${this.weeksText||'?'} ${this.yearsText||'*'}`
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch:{
|
||||||
|
visible:{
|
||||||
|
handler() {
|
||||||
|
// if(this.data){
|
||||||
|
// //this. result = Object.keys(this.data.value).length>0?this.deepCopy(this.data.value):this.deepCopy(this.defaultValue);
|
||||||
|
// //this.result = Object.keys(this.data.value).length>0?clone(this.data.value):clone(this.defaultValue);
|
||||||
|
// //this.result = Object.keys(this.data.value).length>0?clone(JSON.parse(this.data.value)):clone(this.defaultValue);
|
||||||
|
// this.result = Object.keys(this.data.value).length>0?JSON.parse(this.data.value):JSON.parse(JSON.stringify(this.defaultValue));
|
||||||
|
// }else{
|
||||||
|
// //this.result = this.deepCopy(this.defaultValue);
|
||||||
|
// //this.result = clone(this.defaultValue);
|
||||||
|
// this.result = JSON.parse(JSON.stringify(this.defaultValue));
|
||||||
|
// }
|
||||||
|
let label = this.data;
|
||||||
|
if(label){
|
||||||
|
this.secondsReverseExp(label)
|
||||||
|
this.minutesReverseExp(label);
|
||||||
|
this.hoursReverseExp(label);
|
||||||
|
this.daysReverseExp(label);
|
||||||
|
this.daysReverseExp(label);
|
||||||
|
this.monthsReverseExp(label);
|
||||||
|
this.yearReverseExp(label);
|
||||||
|
JSON.parse(JSON.stringify(label));
|
||||||
|
}else {
|
||||||
|
this.result = JSON.parse(JSON.stringify(this.defaultValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
show(){
|
||||||
|
this.visible = true;
|
||||||
|
// console.log('secondsReverseExp',this.secondsReverseExp(this.data));
|
||||||
|
// console.log('minutesReverseExp',this.minutesReverseExp(this.data));
|
||||||
|
// console.log('hoursReverseExp',this.hoursReverseExp(this.data));
|
||||||
|
// console.log('daysReverseExp',this.daysReverseExp(this.data));
|
||||||
|
// console.log('monthsReverseExp',this.monthsReverseExp(this.data));
|
||||||
|
// console.log('yearReverseExp',this.yearReverseExp(this.data));
|
||||||
|
|
||||||
|
},
|
||||||
|
handleSubmit(){
|
||||||
|
this.$emit('ok',this.cron);
|
||||||
|
this.close();
|
||||||
|
this.visible = false;
|
||||||
|
},
|
||||||
|
close(){
|
||||||
|
this.visible = false;
|
||||||
|
},
|
||||||
|
secondsReverseExp(seconds) {
|
||||||
|
let val = seconds.split(" ")[0];
|
||||||
|
//alert(val);
|
||||||
|
let second = {
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:0,
|
||||||
|
specificSpecific:[]
|
||||||
|
};
|
||||||
|
switch (true) {
|
||||||
|
case val.includes('*'):
|
||||||
|
second.cronEvery = '1';
|
||||||
|
break;
|
||||||
|
case val.includes('/'):
|
||||||
|
second.cronEvery = '2';
|
||||||
|
second.incrementStart = val.split('/')[0];
|
||||||
|
second.incrementIncrement = val.split('/')[1];
|
||||||
|
break;
|
||||||
|
case val.includes(','):
|
||||||
|
second.cronEvery = '3';
|
||||||
|
second.specificSpecific = val.split(',').map(Number).sort();
|
||||||
|
break;
|
||||||
|
case val.includes('-'):
|
||||||
|
second.cronEvery = '4';
|
||||||
|
second.rangeStart = val.split('-')[0];
|
||||||
|
second.rangeEnd = val.split('-')[1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
second.cronEvery = '1';
|
||||||
|
}
|
||||||
|
this.result.second = second;
|
||||||
|
},
|
||||||
|
minutesReverseExp(minutes) {
|
||||||
|
let val = minutes.split(" ")[1];
|
||||||
|
let minute = {
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:0,
|
||||||
|
specificSpecific:[],
|
||||||
|
}
|
||||||
|
switch (true) {
|
||||||
|
case val.includes('*'):
|
||||||
|
minute.cronEvery = '1';
|
||||||
|
break;
|
||||||
|
case val.includes('/'):
|
||||||
|
minute.cronEvery = '2';
|
||||||
|
minute.incrementStart = val.split('/')[0];
|
||||||
|
minute.incrementIncrement = val.split('/')[1];
|
||||||
|
break;
|
||||||
|
case val.includes(','):
|
||||||
|
minute.cronEvery = '3';
|
||||||
|
minute.specificSpecific = val.split(',').map(Number).sort();
|
||||||
|
break;
|
||||||
|
case val.includes('-'):
|
||||||
|
minute.cronEvery = '4';
|
||||||
|
minute.rangeStart = val.split('-')[0];
|
||||||
|
minute.rangeEnd = val.split('-')[1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
minute.cronEvery = '1';
|
||||||
|
}
|
||||||
|
this.result.minute = minute;
|
||||||
|
},
|
||||||
|
hoursReverseExp(hours) {
|
||||||
|
let val = hours.split(" ")[2];
|
||||||
|
let hour ={
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:'0',
|
||||||
|
specificSpecific:[],
|
||||||
|
};
|
||||||
|
switch (true) {
|
||||||
|
case val.includes('*'):
|
||||||
|
hour.cronEvery = '1';
|
||||||
|
break;
|
||||||
|
case val.includes('/'):
|
||||||
|
hour.cronEvery = '2';
|
||||||
|
hour.incrementStart = val.split('/')[0];
|
||||||
|
hour.incrementIncrement = val.split('/')[1];
|
||||||
|
break;
|
||||||
|
case val.includes(','):
|
||||||
|
hour.cronEvery = '3';
|
||||||
|
hour.specificSpecific = val.split(',').map(Number).sort();
|
||||||
|
break;
|
||||||
|
case val.includes('-'):
|
||||||
|
hour.cronEvery = '4';
|
||||||
|
hour.rangeStart = val.split('-')[0];
|
||||||
|
hour.rangeEnd = val.split('-')[1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hour.cronEvery = '1';
|
||||||
|
}
|
||||||
|
this.result.hour = hour;
|
||||||
|
},
|
||||||
|
daysReverseExp(cron) {
|
||||||
|
let days = cron.split(" ")[3];
|
||||||
|
let weeks = cron.split(" ")[5];
|
||||||
|
let day ={
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:1,
|
||||||
|
incrementIncrement:1,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:1,
|
||||||
|
specificSpecific:[],
|
||||||
|
cronLastSpecificDomDay:1,
|
||||||
|
cronDaysBeforeEomMinus:1,
|
||||||
|
cronDaysNearestWeekday:1,
|
||||||
|
};
|
||||||
|
let week = {
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:1,
|
||||||
|
incrementIncrement:1,
|
||||||
|
specificSpecific:[],
|
||||||
|
cronNthDayDay:1,
|
||||||
|
cronNthDayNth:'1',
|
||||||
|
};
|
||||||
|
if (!days.includes('?')) {
|
||||||
|
switch (true) {
|
||||||
|
case days.includes('*'):
|
||||||
|
day.cronEvery = '1';
|
||||||
|
break;
|
||||||
|
case days.includes('?'):
|
||||||
|
// 2、4、11
|
||||||
|
break;
|
||||||
|
case days.includes('/'):
|
||||||
|
day.cronEvery = '3';
|
||||||
|
day.incrementStart = days.split('/')[0];
|
||||||
|
day.incrementIncrement = days.split('/')[1];
|
||||||
|
break;
|
||||||
|
case days.includes(','):
|
||||||
|
day.cronEvery = '5';
|
||||||
|
day.specificSpecific = days.split(',').map(Number).sort();
|
||||||
|
// day.specificSpecific.forEach(function (value, index) {
|
||||||
|
// day.specificSpecific[index] = value -1;
|
||||||
|
// });
|
||||||
|
break;
|
||||||
|
case days.includes('LW'):
|
||||||
|
day.cronEvery = '7';
|
||||||
|
break;
|
||||||
|
case days.includes('L-'):
|
||||||
|
day.cronEvery = '9';
|
||||||
|
day.cronDaysBeforeEomMinus = days.split('L-')[1];
|
||||||
|
break;
|
||||||
|
case days.includes('L'):
|
||||||
|
|
||||||
|
//alert(days);
|
||||||
|
if(days.len == 1){
|
||||||
|
day.cronEvery = '6';
|
||||||
|
day.cronLastSpecificDomDay = '1';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
day.cronEvery = '8';
|
||||||
|
day.cronLastSpecificDomDay = Number(days.split('L')[0]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case days.includes('W'):
|
||||||
|
day.cronEvery = '10';
|
||||||
|
day.cronDaysNearestWeekday = days.split('W')[0];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
day.cronEvery = '1';
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
switch (true){
|
||||||
|
case weeks.includes('/'):
|
||||||
|
day.cronEvery = '2';
|
||||||
|
week.incrementStart = weeks.split("/")[0];
|
||||||
|
week.incrementIncrement = weeks.split("/")[1];
|
||||||
|
break;
|
||||||
|
case weeks.includes(','):
|
||||||
|
day.cronEvery = '4';
|
||||||
|
week.specificSpecific = weeks.split(',').map(Number).sort();
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
day.cronEvery = '11';
|
||||||
|
week.cronNthDayDay = weeks.split("#")[0];
|
||||||
|
week.cronNthDayNth = weeks.split("#")[1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
day.cronEvery = '1';
|
||||||
|
week.cronEvery = '1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.result.day = day;
|
||||||
|
this.result.week = week;
|
||||||
|
},
|
||||||
|
monthsReverseExp(cron) {
|
||||||
|
let months = cron.split(" ")[4];
|
||||||
|
let month = {
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:1,
|
||||||
|
rangeEnd:1,
|
||||||
|
specificSpecific:[],
|
||||||
|
};
|
||||||
|
switch (true){
|
||||||
|
case months.includes('*'):
|
||||||
|
month.cronEvery = '1';
|
||||||
|
break;
|
||||||
|
case months.includes('/'):
|
||||||
|
month.cronEvery = '2';
|
||||||
|
month.incrementStart = months.split('/')[0];
|
||||||
|
month.incrementIncrement = months.split('/')[1];
|
||||||
|
break;
|
||||||
|
case months.includes(','):
|
||||||
|
month.cronEvery = '3';
|
||||||
|
month.specificSpecific = months.split(',').map(Number).sort();
|
||||||
|
break;
|
||||||
|
case months.includes('-'):
|
||||||
|
month.cronEvery = '4';
|
||||||
|
month.rangeStart = months.split('-')[0];
|
||||||
|
month.rangeEnd = months.split('-')[1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
month.cronEvery = '1';
|
||||||
|
}
|
||||||
|
this.result.month = month;
|
||||||
|
},
|
||||||
|
yearReverseExp(cron) {
|
||||||
|
let years = cron.split(" ")[6];
|
||||||
|
let year = {
|
||||||
|
cronEvery:'',
|
||||||
|
incrementStart:3,
|
||||||
|
incrementIncrement:5,
|
||||||
|
rangeStart:2019,
|
||||||
|
rangeEnd:2019,
|
||||||
|
specificSpecific:[],
|
||||||
|
};
|
||||||
|
switch (true){
|
||||||
|
case years.includes('*'):
|
||||||
|
year.cronEvery = '1';
|
||||||
|
break;
|
||||||
|
case years.includes('/'):
|
||||||
|
year.cronEvery = '2';
|
||||||
|
year.incrementStart = years.split('/')[0];
|
||||||
|
year.incrementIncrement = years.split('/')[1];
|
||||||
|
break;
|
||||||
|
case years.includes(','):
|
||||||
|
year.cronEvery = '3';
|
||||||
|
year.specificSpecific = years.split(',').map(Number).sort();
|
||||||
|
break;
|
||||||
|
case years.includes('-'):
|
||||||
|
year.cronEvery = '4';
|
||||||
|
year.rangeStart = years.split('-')[0];
|
||||||
|
year.rangeEnd = years.split('-')[1];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
year.cronEvery = '1';
|
||||||
|
}
|
||||||
|
this.result.year = year;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.card-container {
|
||||||
|
background: #fff;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 12px;
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
.ant-tabs{
|
||||||
|
border:1px solid #e6ebf5;
|
||||||
|
padding: 0;
|
||||||
|
.ant-tabs-bar {
|
||||||
|
margin: 0;
|
||||||
|
outline: none;
|
||||||
|
border-bottom: none;
|
||||||
|
.ant-tabs-nav-container{
|
||||||
|
margin: 0;
|
||||||
|
.ant-tabs-tab {
|
||||||
|
padding: 0 24px!important;
|
||||||
|
background-color: #f5f7fa!important;
|
||||||
|
margin-right: 0px!important;
|
||||||
|
border-radius: 0;
|
||||||
|
line-height: 38px;
|
||||||
|
border: 1px solid transparent!important;
|
||||||
|
border-bottom: 1px solid #e6ebf5!important;
|
||||||
|
}
|
||||||
|
.ant-tabs-tab-active.ant-tabs-tab{
|
||||||
|
color: #409eff;
|
||||||
|
background-color: #fff!important;
|
||||||
|
border-right:1px solid #e6ebf5!important;
|
||||||
|
border-left:1px solid #e6ebf5!important;
|
||||||
|
border-bottom:1px solid #fff!important;
|
||||||
|
font-weight: normal;
|
||||||
|
transition:none!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-tabs-tabpane{
|
||||||
|
padding: 15px;
|
||||||
|
.ant-row{
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
.ant-select,.ant-input-number{
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.container-widthEn{
|
||||||
|
width: 755px;
|
||||||
|
}
|
||||||
|
.container-widthCn{
|
||||||
|
width: 608px;
|
||||||
|
}
|
||||||
|
.language{
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
right: 13px;
|
||||||
|
top: 13px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 38px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #409eff;
|
||||||
|
z-index: 1;
|
||||||
|
background: #f5f7fa;
|
||||||
|
outline: none;
|
||||||
|
width: 47px;
|
||||||
|
border-bottom: 1px solid #e6ebf5;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
.card-container{
|
||||||
|
.bottom{
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 10px 0 0 0;
|
||||||
|
.cronButton{
|
||||||
|
margin: 0 10px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.tabBody{
|
||||||
|
.a-row{
|
||||||
|
margin: 10px 0;
|
||||||
|
.long{
|
||||||
|
.a-select{
|
||||||
|
width:354px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.a-input-number{
|
||||||
|
width: 110px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,206 @@
|
|||||||
|
<template>
|
||||||
|
<a-modal
|
||||||
|
centered
|
||||||
|
:title="name + '选择'"
|
||||||
|
:width="900"
|
||||||
|
:visible="visible"
|
||||||
|
@ok="handleOk"
|
||||||
|
@cancel="close"
|
||||||
|
cancelText="关闭">
|
||||||
|
|
||||||
|
<a-row :gutter="18">
|
||||||
|
<a-col :span="16">
|
||||||
|
<!-- 查询区域 -->
|
||||||
|
<div class="table-page-search-wrapper">
|
||||||
|
<a-form layout="inline">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
|
||||||
|
<a-col :span="14">
|
||||||
|
<a-form-item :label="(queryParamText||name)">
|
||||||
|
<a-input :placeholder="'请输入' + (queryParamText||name)" v-model="queryParam[valueKey]"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="8">
|
||||||
|
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
|
||||||
|
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
|
||||||
|
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
|
||||||
|
</span>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-table
|
||||||
|
size="small"
|
||||||
|
bordered
|
||||||
|
rowKey="id"
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:pagination="ipagination"
|
||||||
|
:loading="loading"
|
||||||
|
:scroll="{ y: 240 }"
|
||||||
|
:rowSelection="{selectedRowKeys, onChange: onSelectChange, type: multiple ? 'checkbox':'radio'}"
|
||||||
|
:customRow="customRowFn"
|
||||||
|
@change="handleTableChange">
|
||||||
|
</a-table>
|
||||||
|
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="8">
|
||||||
|
<a-card :title="'已选' + name" :bordered="false" :head-style="{padding:0}" :body-style="{padding:0}">
|
||||||
|
|
||||||
|
<a-table rowKey="id" size="small" bordered v-bind="selectedTable">
|
||||||
|
<span slot="action" slot-scope="text, record, index">
|
||||||
|
<a @click="handleDeleteSelected(record, index)">删除</a>
|
||||||
|
</span>
|
||||||
|
</a-table>
|
||||||
|
|
||||||
|
</a-card>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JSelectBizComponentModal',
|
||||||
|
mixins: [JeecgListMixin],
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
visible: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
valueKey: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
multiple: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
listUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
displayKey: {
|
||||||
|
type: String,
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
propColumns: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
// 查询条件文字
|
||||||
|
queryParamText: {
|
||||||
|
type: String,
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 表头
|
||||||
|
columns: this.propColumns,
|
||||||
|
// 已选择列表
|
||||||
|
selectedTable: {
|
||||||
|
pagination: false,
|
||||||
|
scroll: { y: 240 },
|
||||||
|
columns: [
|
||||||
|
this.propColumns[0],
|
||||||
|
{ title: '操作', dataIndex: 'action', align: 'center', width: 60, scopedSlots: { customRender: 'action' }, }
|
||||||
|
],
|
||||||
|
dataSource: [],
|
||||||
|
},
|
||||||
|
url: { list: this.listUrl }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value: {
|
||||||
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
this.valueWatchHandler(val)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataSource: {
|
||||||
|
deep: true,
|
||||||
|
handler(val) {
|
||||||
|
let options = val.map(data => ({ label: data[this.displayKey || this.valueKey], value: data[this.valueKey] }))
|
||||||
|
this.$emit('ok', options)
|
||||||
|
this.valueWatchHandler(this.value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectionRows: {
|
||||||
|
immediate: true,
|
||||||
|
deep: true,
|
||||||
|
handler(val) {
|
||||||
|
this.selectedTable.dataSource = val
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
/** 关闭弹窗 */
|
||||||
|
close() {
|
||||||
|
this.$emit('update:visible', false)
|
||||||
|
},
|
||||||
|
|
||||||
|
valueWatchHandler(val) {
|
||||||
|
let dataSource = []
|
||||||
|
let selectedRowKeys = []
|
||||||
|
val.forEach(item => {
|
||||||
|
this.dataSource.forEach(data => {
|
||||||
|
if (data[this.valueKey] === item) {
|
||||||
|
dataSource.push(data)
|
||||||
|
selectedRowKeys.push(data.id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
this.selectedTable.dataSource = dataSource
|
||||||
|
this.selectedRowKeys = selectedRowKeys
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 完成选择 */
|
||||||
|
handleOk() {
|
||||||
|
let value = this.selectedTable.dataSource.map(data => data[this.valueKey])
|
||||||
|
this.$emit('input', value)
|
||||||
|
this.close()
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 删除已选择的 */
|
||||||
|
handleDeleteSelected(record, index) {
|
||||||
|
this.selectedRowKeys.splice(this.selectedRowKeys.indexOf(record.id), 1)
|
||||||
|
this.selectedTable.dataSource.splice(index, 1)
|
||||||
|
},
|
||||||
|
|
||||||
|
customRowFn(record) {
|
||||||
|
if (!this.multiple) {
|
||||||
|
return {
|
||||||
|
on: {
|
||||||
|
click: () => {
|
||||||
|
this.selectedRowKeys = [record.id]
|
||||||
|
this.selectedTable.dataSource = [record]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
</style>
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
# JSelectBizComponent
|
||||||
|
|
||||||
|
Jeecg 选择组件的公共可复用组件
|
||||||
|
|
||||||
|
## 引用方式
|
||||||
|
|
||||||
|
```js
|
||||||
|
import JSelectBizComponent from '@/src/components/jeecgbiz/JSelectBizComponent'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: { JSelectBizComponent }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 参数
|
||||||
|
|
||||||
|
### 配置参数
|
||||||
|
|
||||||
|
- `name`:`String` 显示名字,例如选择部门就填写'部门'
|
||||||
|
- `listUrl`:`String` 数据请求地址,必须是封装了分页的地址
|
||||||
|
- `displayKey`:`String` 显示在标签上的字段 key
|
||||||
|
- `returnKeys`:`Array` v-model 绑定的 keys,是个数组,默认使用第二项,当配置了 `returnId=true` 就返回第一项
|
||||||
|
- `returnId`:`Boolean` 返回ID,设为true后将返回配置的 `returnKeys` 中的第一项
|
||||||
|
- `selectButtonText`:`String` 选择按钮的文字
|
||||||
|
- `queryParamText`:`String` 查询条件显示文字
|
||||||
|
- `columns`:`Array` 列配置项,与a-table的列配置项相同,会将第一项配置成已选择的列表
|
||||||
@ -0,0 +1,167 @@
|
|||||||
|
<template>
|
||||||
|
<a-row class="j-select-biz-component-box" type="flex" :gutter="8">
|
||||||
|
<a-col class="left" :class="{'full': !buttons}">
|
||||||
|
<a-select
|
||||||
|
mode="multiple"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
v-model="selectValue"
|
||||||
|
:options="selectOptions"
|
||||||
|
allowClear
|
||||||
|
:disabled="disabled"
|
||||||
|
:open="false"
|
||||||
|
style="width: 100%;"
|
||||||
|
@click.native="visible=(buttons?visible:true)"
|
||||||
|
/>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
<a-col v-if="buttons" class="right">
|
||||||
|
<a-button type="primary" icon="search" :disabled="disabled" @click="visible=true">{{selectButtonText}}</a-button>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
<j-select-biz-component-modal
|
||||||
|
v-model="selectValue"
|
||||||
|
:name="name" :listUrl="listUrl" :returnKeys="returnKeys" :displayKey="displayKey"
|
||||||
|
:propColumns="columns" :queryParamText="queryParamText" :multiple="multiple"
|
||||||
|
:visible.sync="visible"
|
||||||
|
:valueKey="valueKey"
|
||||||
|
@ok="selectOptions=$event"
|
||||||
|
/>
|
||||||
|
</a-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import JSelectBizComponentModal from './JSelectBizComponentModal'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JSelectBizComponent',
|
||||||
|
components: { JSelectBizComponentModal },
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
/** 是否返回 id,默认 false,返回 code */
|
||||||
|
returnId: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '请选择'
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
// 是否支持多选,默认 true
|
||||||
|
multiple: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
// 是否显示按钮,默认 true
|
||||||
|
buttons: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
|
||||||
|
/* 可复用属性 */
|
||||||
|
|
||||||
|
// 被选择的名字,例如选择部门就填写'部门'
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
// list 接口地址
|
||||||
|
listUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
// 显示的 Key
|
||||||
|
displayKey: {
|
||||||
|
type: String,
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
// 返回的 key
|
||||||
|
returnKeys: {
|
||||||
|
type: Array,
|
||||||
|
default: () => ['id', 'id']
|
||||||
|
},
|
||||||
|
// 选择按钮文字
|
||||||
|
selectButtonText: {
|
||||||
|
type: String,
|
||||||
|
default: '选择'
|
||||||
|
},
|
||||||
|
// 查询条件文字
|
||||||
|
queryParamText: {
|
||||||
|
type: String,
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
// columns
|
||||||
|
columns: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectValue: [],
|
||||||
|
selectOptions: [],
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
valueKey() {
|
||||||
|
return this.returnId ? this.returnKeys[0] : this.returnKeys[1]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value: {
|
||||||
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
if (val) {
|
||||||
|
this.selectValue = val.split(',')
|
||||||
|
} else {
|
||||||
|
this.selectValue = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectValue: {
|
||||||
|
deep: true,
|
||||||
|
handler(val) {
|
||||||
|
const data = val.join(',')
|
||||||
|
this.$emit('input', data)
|
||||||
|
this.$emit('change', data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.j-select-biz-component-box {
|
||||||
|
.ant-select-search__field {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.j-select-biz-component-box {
|
||||||
|
|
||||||
|
$width: 82px;
|
||||||
|
|
||||||
|
.left {
|
||||||
|
width: calc(100% - #{$width} - 8px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
width: #{$width};
|
||||||
|
}
|
||||||
|
|
||||||
|
.full {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -11,7 +11,7 @@
|
|||||||
:modal-width="modalWidth"
|
:modal-width="modalWidth"
|
||||||
:multi="multi"
|
:multi="multi"
|
||||||
:rootOpened="rootOpened"
|
:rootOpened="rootOpened"
|
||||||
:depart-id="value"
|
:depart-id="departIds"
|
||||||
@ok="handleOK"
|
@ok="handleOK"
|
||||||
@initComp="initComp"/>
|
@initComp="initComp"/>
|
||||||
</div>
|
</div>
|
||||||
@ -48,6 +48,11 @@
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
// 自定义返回字段,默认返回 id
|
||||||
|
customReturnField: {
|
||||||
|
type: String,
|
||||||
|
default: 'id'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
@ -63,7 +68,9 @@
|
|||||||
},
|
},
|
||||||
watch:{
|
watch:{
|
||||||
value(val){
|
value(val){
|
||||||
this.departIds = val
|
if (this.customReturnField === 'id') {
|
||||||
|
this.departIds = val
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
@ -73,21 +80,17 @@
|
|||||||
openModal(){
|
openModal(){
|
||||||
this.$refs.innerDepartSelectModal.show()
|
this.$refs.innerDepartSelectModal.show()
|
||||||
},
|
},
|
||||||
handleOK(rows,idstr){
|
handleOK(rows, idstr) {
|
||||||
console.log("当前选中部门",rows)
|
let value = ''
|
||||||
console.log("当前选中部门ID",idstr)
|
if (!rows && rows.length <= 0) {
|
||||||
if(!rows){
|
|
||||||
this.departNames = ''
|
this.departNames = ''
|
||||||
this.departIds=''
|
this.departIds = ''
|
||||||
}else{
|
} else {
|
||||||
let temp = ''
|
value = rows.map(row => row[this.customReturnField]).join(',')
|
||||||
for(let item of rows){
|
this.departNames = rows.map(row => row['departName']).join(',')
|
||||||
temp+=','+item.departName
|
this.departIds = idstr
|
||||||
}
|
|
||||||
this.departNames = temp.substring(1)
|
|
||||||
this.departIds=idstr
|
|
||||||
}
|
}
|
||||||
this.$emit("change",this.departIds)
|
this.$emit("change", value)
|
||||||
},
|
},
|
||||||
getDepartNames(){
|
getDepartNames(){
|
||||||
return this.departNames
|
return this.departNames
|
||||||
|
|||||||
@ -1,65 +1,49 @@
|
|||||||
<template>
|
<template>
|
||||||
<div style="width: 100%;">
|
<j-select-biz-component
|
||||||
<a-select
|
:value="value"
|
||||||
mode="multiple"
|
|
||||||
placeholder="Please select"
|
|
||||||
:value="nameList"
|
|
||||||
style="width: calc(100% - 178px);">
|
|
||||||
</a-select>
|
|
||||||
<span style="display: inline-block;width:170px;float: right;overflow: hidden;">
|
|
||||||
<a-button type="primary" @click="handleSelect" icon="search" style="width: 81px">选择</a-button>
|
|
||||||
<a-button type="primary" @click="selectReset" icon="reload" style="margin-left: 8px;width: 81px">清空</a-button>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<!-- 选择多个用户支持排序 -->
|
name="用户"
|
||||||
<j-select-multi-user-modal ref="selectModal" @selectFinished="selectOK"/>
|
displayKey="realname"
|
||||||
</div>
|
|
||||||
|
:listUrl="url.list"
|
||||||
|
:columns="columns"
|
||||||
|
queryParamText="账号"
|
||||||
|
|
||||||
|
v-on="$listeners"
|
||||||
|
v-bind="$attrs"
|
||||||
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import JSelectMultiUserModal from './modal/JSelectMultiUserModal'
|
import JSelectBizComponent from './JSelectBizComponent'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'JSelectMultiUser',
|
name: 'JSelectMultiUser',
|
||||||
components:{ JSelectMultiUserModal },
|
components: { JSelectBizComponent },
|
||||||
props:{
|
props: ['value'],
|
||||||
value:{
|
data() {
|
||||||
type:String,
|
|
||||||
required:false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data(){
|
|
||||||
return {
|
return {
|
||||||
selectList: [],
|
url: { list: '/sys/user/list' },
|
||||||
|
columns: [
|
||||||
|
{ title: '姓名', align: 'center', width: 100, dataIndex: 'realname' },
|
||||||
|
{ title: '账号', align: 'center', width: 100, dataIndex: 'username' },
|
||||||
|
{ title: '电话', align: 'center', width: 100, dataIndex: 'phone' },
|
||||||
|
{ title: '出生日期', align: 'center', width: 100, dataIndex: 'birthday' }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
watch: {
|
||||||
nameList: function () {
|
$attrs: {
|
||||||
var names = [];
|
deep: true,
|
||||||
for (var a = 0; a < this.selectList.length; a++) {
|
immediate: true,
|
||||||
names.push(this.selectList[a].name);
|
handler(val) {
|
||||||
|
if (!val.returnKeys) {
|
||||||
|
val.returnKeys = ['id', 'username']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let nameStr = ''
|
|
||||||
if(names.length>0){
|
|
||||||
nameStr = names.join(",")
|
|
||||||
}
|
|
||||||
this.$emit("change",nameStr)
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
model: {
|
|
||||||
prop: 'value',
|
|
||||||
event: 'change'
|
|
||||||
},
|
|
||||||
methods:{
|
|
||||||
handleSelect: function () {
|
|
||||||
this.$refs.selectModal.add();
|
|
||||||
},
|
|
||||||
selectReset() {
|
|
||||||
this.selectList = [];
|
|
||||||
},
|
|
||||||
selectOK: function (data) {
|
|
||||||
this.selectList = data;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<j-select-biz-component v-bind="configs" v-on="$listeners"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import JSelectBizComponent from './JSelectBizComponent'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JSelectPosition',
|
||||||
|
components: { JSelectBizComponent },
|
||||||
|
props: ['value'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
settings: {
|
||||||
|
name: '职务',
|
||||||
|
displayKey: 'name',
|
||||||
|
returnKeys: ['id', 'code'],
|
||||||
|
listUrl: '/sys/position/list',
|
||||||
|
queryParamText: '职务编码',
|
||||||
|
columns: [
|
||||||
|
{ title: '职务名称', dataIndex: 'name', align: 'center', width: 100 },
|
||||||
|
{ title: '职务编码', dataIndex: 'code', align: 'center', width: 100 },
|
||||||
|
{ title: '职级', dataIndex: 'rank_dictText', align: 'center', width: 100 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
configs() {
|
||||||
|
return Object.assign({ value: this.value }, this.settings, this.$attrs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
38
ant-design-vue-jeecg/src/components/jeecgbiz/JSelectRole.vue
Normal file
38
ant-design-vue-jeecg/src/components/jeecgbiz/JSelectRole.vue
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<template>
|
||||||
|
<j-select-biz-component
|
||||||
|
:value="value"
|
||||||
|
|
||||||
|
name="角色"
|
||||||
|
displayKey="roleName"
|
||||||
|
|
||||||
|
:returnKeys="returnKeys"
|
||||||
|
:listUrl="url.list"
|
||||||
|
:columns="columns"
|
||||||
|
queryParamText="角色编码"
|
||||||
|
|
||||||
|
v-on="$listeners"
|
||||||
|
v-bind="$attrs"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import JSelectBizComponent from './JSelectBizComponent'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JSelectMultiUser',
|
||||||
|
components: { JSelectBizComponent },
|
||||||
|
props: ['value'],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
returnKeys: ['id', 'roleCode'],
|
||||||
|
url: { list: '/sys/role/list' },
|
||||||
|
columns: [
|
||||||
|
{ title: '角色名称', dataIndex: 'roleName', align: 'center', width: 120 },
|
||||||
|
{ title: '角色编码', dataIndex: 'roleCode', align: 'center', width: 120 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
@ -1,51 +1,55 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<a-input-search
|
<a-input-search
|
||||||
v-model="selectedDepUsers"
|
v-model="userNames"
|
||||||
placeholder="请先选择用户"
|
placeholder="请先选择用户"
|
||||||
disabled
|
disabled
|
||||||
@search="onSearchDepUser">
|
@search="onSearchDepUser">
|
||||||
<a-button slot="enterButton" :disabled="disabled">选择用户</a-button>
|
<a-button slot="enterButton" :disabled="disabled">选择用户</a-button>
|
||||||
</a-input-search>
|
</a-input-search>
|
||||||
<j-select-user-by-dep-modal
|
<j-select-user-by-dep-modal ref="selectModal" :modal-width="modalWidth" :multi="multi" @ok="selectOK" :user-ids="value" @initComp="initComp"/>
|
||||||
ref="selectModal"
|
|
||||||
:modal-width="modalWidth"
|
|
||||||
@ok="onSearchDepUserCallBack" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import JSelectUserByDepModal from './modal/JSelectUserByDepModal'
|
import JSelectUserByDepModal from './modal/JSelectUserByDepModal'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'JSelectUserByDep',
|
name: 'JSelectUserByDep',
|
||||||
components: { JSelectUserByDepModal },
|
components: {JSelectUserByDepModal},
|
||||||
props:{
|
props: {
|
||||||
modalWidth:{
|
modalWidth: {
|
||||||
type:Number,
|
type: Number,
|
||||||
default:1250,
|
default: 1250,
|
||||||
required:false
|
required: false
|
||||||
},
|
},
|
||||||
value:{
|
value: {
|
||||||
type:String,
|
type: String,
|
||||||
required:false
|
required: false
|
||||||
},
|
},
|
||||||
disabled:{
|
disabled: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
}
|
},
|
||||||
|
multi: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
selectedDepUsers:"",
|
userIds: "",
|
||||||
|
userNames: ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted(){
|
mounted() {
|
||||||
this.selectedDepUsers = this.value
|
this.userIds = this.value
|
||||||
},
|
},
|
||||||
watch:{
|
watch: {
|
||||||
value(val){
|
value(val) {
|
||||||
this.selectedDepUsers = val
|
this.userIds = val
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
model: {
|
model: {
|
||||||
@ -53,14 +57,27 @@
|
|||||||
event: 'change'
|
event: 'change'
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
//通过组织机构筛选选择用户
|
initComp(userNames) {
|
||||||
|
this.userNames = userNames
|
||||||
|
},
|
||||||
onSearchDepUser() {
|
onSearchDepUser() {
|
||||||
this.$refs.selectModal.showModal()
|
this.$refs.selectModal.showModal()
|
||||||
this.onSearchDepUserCallBack('')
|
|
||||||
},
|
},
|
||||||
onSearchDepUserCallBack(selectedDepUsers) {
|
selectOK(rows, idstr) {
|
||||||
this.selectedDepUsers = selectedDepUsers
|
console.log("当前选中用户", rows)
|
||||||
this.$emit("change",selectedDepUsers)
|
console.log("当前选中用户ID", idstr)
|
||||||
|
if (!rows) {
|
||||||
|
this.userNames = ''
|
||||||
|
this.userIds = ''
|
||||||
|
} else {
|
||||||
|
let temp = ''
|
||||||
|
for (let item of rows) {
|
||||||
|
temp += ',' + item.realname
|
||||||
|
}
|
||||||
|
this.userNames = temp.substring(1)
|
||||||
|
this.userIds = idstr
|
||||||
|
}
|
||||||
|
this.$emit("change", this.userIds)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,6 +58,16 @@
|
|||||||
watch:{
|
watch:{
|
||||||
departId(){
|
departId(){
|
||||||
this.initDepartComponent()
|
this.initDepartComponent()
|
||||||
|
},
|
||||||
|
visible: {
|
||||||
|
handler() {
|
||||||
|
if (this.departId) {
|
||||||
|
this.checkedKeys = this.departId.split(",");
|
||||||
|
// console.log('this.departId', this.departId)
|
||||||
|
} else {
|
||||||
|
this.checkedKeys = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
@ -65,7 +75,6 @@
|
|||||||
this.visible=true
|
this.visible=true
|
||||||
this.checkedRows=[]
|
this.checkedRows=[]
|
||||||
this.checkedKeys=[]
|
this.checkedKeys=[]
|
||||||
console.log("this.multi",this.multi)
|
|
||||||
},
|
},
|
||||||
loadDepart(){
|
loadDepart(){
|
||||||
queryDepartTreeList().then(res=>{
|
queryDepartTreeList().then(res=>{
|
||||||
@ -123,39 +132,29 @@
|
|||||||
},
|
},
|
||||||
onCheck (checkedKeys,info) {
|
onCheck (checkedKeys,info) {
|
||||||
if(!this.multi){
|
if(!this.multi){
|
||||||
let arr = checkedKeys.checked.filter(item=>{
|
let arr = checkedKeys.checked.filter(item => this.checkedKeys.indexOf(item) < 0)
|
||||||
return this.checkedKeys.indexOf(item)<0
|
|
||||||
})
|
|
||||||
this.checkedKeys = [...arr]
|
this.checkedKeys = [...arr]
|
||||||
this.checkedRows=[info.node.dataRef]
|
this.checkedRows = (this.checkedKeys.length === 0) ? [] : [info.node.dataRef]
|
||||||
}else{
|
}else{
|
||||||
this.checkedKeys = checkedKeys.checked
|
this.checkedKeys = checkedKeys.checked
|
||||||
this.checkedRows.push(info.node.dataRef)
|
this.checkedRows = this.getCheckedRows(this.checkedKeys)
|
||||||
}
|
}
|
||||||
//this.$emit("input",this.checkedKeys.join(","))
|
|
||||||
//console.log(this.checkedKeys.join(","))
|
|
||||||
},
|
},
|
||||||
onSelect (selectedKeys,info) {
|
onSelect(selectedKeys,info) {
|
||||||
console.log(selectedKeys)
|
|
||||||
let keys = []
|
let keys = []
|
||||||
keys.push(selectedKeys[0])
|
keys.push(selectedKeys[0])
|
||||||
if(!this.checkedKeys || this.checkedKeys.length==0 || !this.multi){
|
if(!this.checkedKeys || this.checkedKeys.length===0 || !this.multi){
|
||||||
this.checkedKeys = [...keys]
|
this.checkedKeys = [...keys]
|
||||||
this.checkedRows=[info.node.dataRef]
|
this.checkedRows=[info.node.dataRef]
|
||||||
}else{
|
}else{
|
||||||
let currKey = info.node.dataRef.key
|
let currKey = info.node.dataRef.key
|
||||||
if(this.checkedKeys.indexOf(currKey)>=0){
|
if(this.checkedKeys.indexOf(currKey)>=0){
|
||||||
this.checkedKeys = this.checkedKeys.filter(item=>{
|
this.checkedKeys = this.checkedKeys.filter(item=> item !==currKey)
|
||||||
return item !=currKey
|
|
||||||
})
|
|
||||||
this.checkedRows=this.checkedRows.filter(item=>{
|
|
||||||
return item.key !=currKey
|
|
||||||
})
|
|
||||||
}else{
|
}else{
|
||||||
this.checkedRows.push(info.node.dataRef)
|
|
||||||
this.checkedKeys.push(...keys)
|
this.checkedKeys.push(...keys)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.checkedRows = this.getCheckedRows(this.checkedKeys)
|
||||||
},
|
},
|
||||||
onExpand (expandedKeys) {
|
onExpand (expandedKeys) {
|
||||||
this.expandedKeys = expandedKeys
|
this.expandedKeys = expandedKeys
|
||||||
@ -205,6 +204,32 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
// 根据 checkedKeys 获取 rows
|
||||||
|
getCheckedRows(checkedKeys) {
|
||||||
|
const forChildren = (list, key) => {
|
||||||
|
for (let item of list) {
|
||||||
|
if (item.id === key) {
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
if (item.children instanceof Array) {
|
||||||
|
let value = forChildren(item.children, key)
|
||||||
|
if (value != null) {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
let rows = []
|
||||||
|
for (let key of checkedKeys) {
|
||||||
|
let row = forChildren(this.treeData, key)
|
||||||
|
if (row != null) {
|
||||||
|
rows.push(row)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rows
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,274 +0,0 @@
|
|||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
centered
|
|
||||||
:title="title"
|
|
||||||
:width="1000"
|
|
||||||
:visible="visible"
|
|
||||||
@ok="handleOk"
|
|
||||||
@cancel="handleCancel"
|
|
||||||
cancelText="关闭">
|
|
||||||
<a-row :gutter="18">
|
|
||||||
<a-col :span="16">
|
|
||||||
<a-card title="选择人员" :bordered="true">
|
|
||||||
<!-- 查询区域 -->
|
|
||||||
<div class="table-page-search-wrapper">
|
|
||||||
<a-form layout="inline">
|
|
||||||
<a-row :gutter="24">
|
|
||||||
|
|
||||||
<a-col :span="10">
|
|
||||||
<a-form-item label="姓名">
|
|
||||||
<a-input placeholder="请输入姓名" v-model="queryParam.name"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="8" >
|
|
||||||
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
|
|
||||||
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
|
|
||||||
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
|
|
||||||
</span>
|
|
||||||
</a-col>
|
|
||||||
|
|
||||||
</a-row>
|
|
||||||
</a-form>
|
|
||||||
</div>
|
|
||||||
<!-- table区域-begin -->
|
|
||||||
<div>
|
|
||||||
<a-table
|
|
||||||
size="small"
|
|
||||||
bordered
|
|
||||||
rowKey="id"
|
|
||||||
:columns="columns1"
|
|
||||||
:dataSource="dataSource1"
|
|
||||||
:pagination="ipagination"
|
|
||||||
:loading="loading"
|
|
||||||
:scroll="{ y: 240 }"
|
|
||||||
:rowSelection="{selectedRowKeys: selectedRowKeys,onSelectAll:onSelectAll,onSelect:onSelect,onChange: onSelectChange}"
|
|
||||||
@change="handleTableChange">
|
|
||||||
|
|
||||||
</a-table>
|
|
||||||
</div>
|
|
||||||
<!-- table区域-end -->
|
|
||||||
</a-card>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="8">
|
|
||||||
<a-card title="用户选择" :bordered="true">
|
|
||||||
<!-- table区域-begin -->
|
|
||||||
<div>
|
|
||||||
<a-table
|
|
||||||
size="small"
|
|
||||||
bordered
|
|
||||||
rowKey="id"
|
|
||||||
:columns="columns2"
|
|
||||||
:dataSource="dataSource2"
|
|
||||||
:loading="loading"
|
|
||||||
:scroll="{ y: 240 }"
|
|
||||||
>
|
|
||||||
<span slot="action" slot-scope="text, record">
|
|
||||||
<a-button type="primary" size="small" @click="handleDelete(record)" icon="delete">删除</a-button>
|
|
||||||
</span>
|
|
||||||
</a-table>
|
|
||||||
</div>
|
|
||||||
<!-- table区域-end -->
|
|
||||||
</a-card>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { filterObj } from '@/utils/util'
|
|
||||||
import { getAction } from '@/api/manage'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'JSelectMultiUserModal',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
title: "用户列表",
|
|
||||||
names: [],
|
|
||||||
visible: false,
|
|
||||||
placement: 'right',
|
|
||||||
description: '人员管理页面',
|
|
||||||
// 查询条件
|
|
||||||
queryParam: {},
|
|
||||||
// 表头
|
|
||||||
columns1: [
|
|
||||||
{
|
|
||||||
title: '#',
|
|
||||||
dataIndex: '',
|
|
||||||
key:'rowIndex',
|
|
||||||
width:50,
|
|
||||||
align:"center",
|
|
||||||
customRender:function (t,r,index) {
|
|
||||||
return parseInt(index)+1;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '姓名',
|
|
||||||
align:"center",
|
|
||||||
width:113,
|
|
||||||
dataIndex: 'name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '年龄',
|
|
||||||
align:"center",
|
|
||||||
width:100,
|
|
||||||
dataIndex: 'age'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '出生日期',
|
|
||||||
align:"center",
|
|
||||||
width:100,
|
|
||||||
dataIndex: 'birthday'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
columns2: [
|
|
||||||
|
|
||||||
{
|
|
||||||
title: '用户账号',
|
|
||||||
align:"center",
|
|
||||||
width:100,
|
|
||||||
dataIndex: 'name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '操作',
|
|
||||||
dataIndex: 'action',
|
|
||||||
align:"center",
|
|
||||||
width:100,
|
|
||||||
scopedSlots: { customRender: 'action' },
|
|
||||||
}
|
|
||||||
],
|
|
||||||
//数据集
|
|
||||||
dataSource1:[],
|
|
||||||
dataSource2:[],
|
|
||||||
// 分页参数
|
|
||||||
ipagination:{
|
|
||||||
current: 1,
|
|
||||||
pageSize: 10,
|
|
||||||
pageSizeOptions: ['10', '20', '30'],
|
|
||||||
showTotal: (total, range) => {
|
|
||||||
return range[0] + "-" + range[1] + " 共" + total + "条"
|
|
||||||
},
|
|
||||||
showQuickJumper: true,
|
|
||||||
showSizeChanger: true,
|
|
||||||
total: 0
|
|
||||||
},
|
|
||||||
isorter:{
|
|
||||||
column: 'createTime',
|
|
||||||
order: 'desc',
|
|
||||||
},
|
|
||||||
loading:false,
|
|
||||||
selectedRowKeys: [],
|
|
||||||
selectedRows: [],
|
|
||||||
url: {
|
|
||||||
list: "/test/jeecgDemo/list",
|
|
||||||
},
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.loadData();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
searchQuery(){
|
|
||||||
this.loadData(1);
|
|
||||||
},
|
|
||||||
searchReset(){
|
|
||||||
this.queryParam={};
|
|
||||||
this.loadData(1);
|
|
||||||
},
|
|
||||||
handleCancel() {
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
handleOk() {
|
|
||||||
this.$emit("selectFinished",this.dataSource2);
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
add() {
|
|
||||||
this.visible = true;
|
|
||||||
},
|
|
||||||
loadData (arg){
|
|
||||||
//加载数据 若传入参数1则加载第一页的内容
|
|
||||||
if(arg===1){
|
|
||||||
this.ipagination.current = 1;
|
|
||||||
}
|
|
||||||
var params = this.getQueryParams();//查询条件
|
|
||||||
getAction(this.url.list,params).then((res)=>{
|
|
||||||
if(res.success){
|
|
||||||
this.dataSource1 = res.result.records;
|
|
||||||
this.ipagination.total = res.result.total;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getQueryParams(){
|
|
||||||
var param = Object.assign({}, this.queryParam,this.isorter);
|
|
||||||
param.field = this.getQueryField();
|
|
||||||
param.pageNo = this.ipagination.current;
|
|
||||||
param.pageSize = this.ipagination.pageSize;
|
|
||||||
return filterObj(param);
|
|
||||||
},
|
|
||||||
getQueryField(){
|
|
||||||
//TODO 字段权限控制
|
|
||||||
},
|
|
||||||
onSelectAll (selected, selectedRows, changeRows) {
|
|
||||||
if(selected===true){
|
|
||||||
for(var a = 0;a<changeRows.length;a++){
|
|
||||||
this.dataSource2.push(changeRows[a]);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
for(var b = 0;b<changeRows.length;b++){
|
|
||||||
this.dataSource2.splice(this.dataSource2.indexOf(changeRows[b]),1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// console.log(selected, selectedRows, changeRows);
|
|
||||||
},
|
|
||||||
onSelect (record,selected) {
|
|
||||||
if(selected===true){
|
|
||||||
this.dataSource2.push(record);
|
|
||||||
}else{
|
|
||||||
var index = this.dataSource2.indexOf(record);
|
|
||||||
//console.log();
|
|
||||||
if(index >=0 ){
|
|
||||||
this.dataSource2.splice(this.dataSource2.indexOf(record),1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSelectChange (selectedRowKeys,selectedRows) {
|
|
||||||
this.selectedRowKeys = selectedRowKeys;
|
|
||||||
this.selectionRows = selectedRows;
|
|
||||||
},
|
|
||||||
onClearSelected(){
|
|
||||||
this.selectedRowKeys = [];
|
|
||||||
this.selectionRows = [];
|
|
||||||
},
|
|
||||||
handleDelete: function(record){
|
|
||||||
this.dataSource2.splice(this.dataSource2.indexOf(record),1);
|
|
||||||
},
|
|
||||||
handleTableChange(pagination, filters, sorter){
|
|
||||||
//分页、排序、筛选变化时触发
|
|
||||||
console.log(sorter);
|
|
||||||
//TODO 筛选
|
|
||||||
if (Object.keys(sorter).length>0){
|
|
||||||
this.isorter.column = sorter.field;
|
|
||||||
this.isorter.order = "ascend"==sorter.order?"asc":"desc"
|
|
||||||
}
|
|
||||||
this.ipagination = pagination;
|
|
||||||
this.loadData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.ant-card-body .table-operator{
|
|
||||||
margin-bottom: 18px;
|
|
||||||
}
|
|
||||||
.ant-table-tbody .ant-table-row td{
|
|
||||||
padding-top:15px;
|
|
||||||
padding-bottom:15px;
|
|
||||||
}
|
|
||||||
.anty-row-operator button{margin: 0 5px}
|
|
||||||
.ant-btn-danger{background-color: #ffffff}
|
|
||||||
|
|
||||||
.ant-modal-cust-warp{height: 100%}
|
|
||||||
.ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
|
|
||||||
.ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
|
|
||||||
</style>
|
|
||||||
@ -15,9 +15,9 @@
|
|||||||
<!--组织机构-->
|
<!--组织机构-->
|
||||||
<a-directory-tree
|
<a-directory-tree
|
||||||
selectable
|
selectable
|
||||||
:selectedKeys="selectedKeys"
|
:selectedKeys="selectedDepIds"
|
||||||
:checkStrictly="true"
|
:checkStrictly="true"
|
||||||
@select="this.onSelect"
|
@select="onDepSelect"
|
||||||
:dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
|
:dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
|
||||||
:treeData="departTree"
|
:treeData="departTree"
|
||||||
/>
|
/>
|
||||||
@ -42,7 +42,7 @@
|
|||||||
:columns="columns"
|
:columns="columns"
|
||||||
:dataSource="dataSource"
|
:dataSource="dataSource"
|
||||||
:pagination="ipagination"
|
:pagination="ipagination"
|
||||||
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type: getType}"
|
||||||
@change="handleTableChange">
|
@change="handleTableChange">
|
||||||
</a-table>
|
</a-table>
|
||||||
</a-card>
|
</a-card>
|
||||||
@ -52,16 +52,17 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { filterObj } from '@/utils/util'
|
import {filterObj} from '@/utils/util'
|
||||||
import { queryDepartTreeList, getUserList, queryUserByDepId, queryUserRoleMap } from '@/api/api'
|
import {queryDepartTreeList, getUserList, queryUserByDepId} from '@/api/api'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'JSelectUserByDepModal',
|
name: 'JSelectUserByDepModal',
|
||||||
components: {},
|
components: {},
|
||||||
props:['modalWidth'],
|
props: ['modalWidth', 'multi', 'userIds'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
queryParam: {
|
queryParam: {
|
||||||
username:"",
|
username: "",
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
@ -83,7 +84,7 @@
|
|||||||
title: '性别',
|
title: '性别',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
dataIndex: 'sex',
|
dataIndex: 'sex',
|
||||||
customRender: function(text) {
|
customRender: function (text) {
|
||||||
if (text === 1) {
|
if (text === 1) {
|
||||||
return '男'
|
return '男'
|
||||||
} else if (text === 2) {
|
} else if (text === 2) {
|
||||||
@ -106,10 +107,9 @@
|
|||||||
],
|
],
|
||||||
scrollTrigger: {},
|
scrollTrigger: {},
|
||||||
dataSource: [],
|
dataSource: [],
|
||||||
selectedKeys: [],
|
selectedRowKeys: [],
|
||||||
userNameArr: [],
|
selectUserRows: [],
|
||||||
departName: '',
|
selectUserIds: [],
|
||||||
userRolesMap: {},
|
|
||||||
title: '根据部门选择用户',
|
title: '根据部门选择用户',
|
||||||
ipagination: {
|
ipagination: {
|
||||||
current: 1,
|
current: 1,
|
||||||
@ -126,53 +126,74 @@
|
|||||||
column: 'createTime',
|
column: 'createTime',
|
||||||
order: 'desc'
|
order: 'desc'
|
||||||
},
|
},
|
||||||
selectedRowKeys: [],
|
selectedDepIds: [],
|
||||||
selectedRows: [],
|
|
||||||
departTree: [],
|
departTree: [],
|
||||||
visible: false,
|
visible: false,
|
||||||
form: this.$form.createForm(this)
|
form: this.$form.createForm(this)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
// 计算属性的 getter
|
||||||
|
getType: function () {
|
||||||
|
console.log("multi: ", this.multi);
|
||||||
|
return this.multi == true ? 'checkbox' : 'radio';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
userIds() {
|
||||||
|
this.initUserNames()
|
||||||
|
}
|
||||||
|
},
|
||||||
created() {
|
created() {
|
||||||
// 该方法触发屏幕自适应
|
// 该方法触发屏幕自适应
|
||||||
this.resetScreenSize();
|
this.resetScreenSize();
|
||||||
this.queryUserRoleMap();
|
this.loadData().then((res) => {
|
||||||
|
this.initUserNames();
|
||||||
|
})
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
loadData(arg) {
|
initUserNames() {
|
||||||
|
let names = ''
|
||||||
|
console.log("props userIds: ", this.userIds)
|
||||||
|
if (this.userIds) {
|
||||||
|
let currUserIds = this.userIds
|
||||||
|
let userIdsArr = currUserIds.split(',');
|
||||||
|
for (let item of this.dataSource) {
|
||||||
|
if (userIdsArr.includes(item.username)) {
|
||||||
|
names += "," + item.realname
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (names) {
|
||||||
|
names = names.substring(1)
|
||||||
|
}
|
||||||
|
this.$emit("initComp", names)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async loadData(arg) {
|
||||||
if (arg === 1) {
|
if (arg === 1) {
|
||||||
this.ipagination.current = 1;
|
this.ipagination.current = 1;
|
||||||
}
|
}
|
||||||
let params = this.getQueryParams();//查询条件
|
let params = this.getQueryParams();//查询条件
|
||||||
getUserList(params).then((res) => {
|
await getUserList(params).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.dataSource = res.result.records;
|
this.dataSource = res.result.records;
|
||||||
this.assignRoleName(this.dataSource);
|
|
||||||
this.ipagination.total = res.result.total;
|
this.ipagination.total = res.result.total;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
queryUserRoleMap(){
|
|
||||||
queryUserRoleMap().then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
this.userRolesMap = res.result;
|
|
||||||
this.loadData();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
// 触发屏幕自适应
|
// 触发屏幕自适应
|
||||||
resetScreenSize() {
|
resetScreenSize() {
|
||||||
let screenWidth = document.body.clientWidth;
|
let screenWidth = document.body.clientWidth;
|
||||||
if (screenWidth < 500) {
|
if (screenWidth < 500) {
|
||||||
this.scrollTrigger = { x: 800 };
|
this.scrollTrigger = {x: 800};
|
||||||
} else {
|
} else {
|
||||||
this.scrollTrigger = {};
|
this.scrollTrigger = {};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showModal() {
|
showModal() {
|
||||||
this.visible = true;
|
this.visible = true;
|
||||||
this.assignRoleName(this.dataSource);
|
|
||||||
this.queryDepartTree();
|
this.queryDepartTree();
|
||||||
|
this.loadData();
|
||||||
this.form.resetFields();
|
this.form.resetFields();
|
||||||
},
|
},
|
||||||
getQueryParams() {
|
getQueryParams() {
|
||||||
@ -191,13 +212,13 @@
|
|||||||
},
|
},
|
||||||
searchReset(num) {
|
searchReset(num) {
|
||||||
let that = this;
|
let that = this;
|
||||||
if(num !== 0){
|
if (num !== 0) {
|
||||||
that.queryParam = {};
|
that.queryParam = {};
|
||||||
that.loadData(1);
|
that.loadData(1);
|
||||||
}
|
}
|
||||||
that.selectedRowKeys = [];
|
that.selectedRowKeys = [];
|
||||||
that.userNameArr = [];
|
that.selectUserIds = [];
|
||||||
that.selectedKeys = [];
|
that.selectedDepIds = [];
|
||||||
},
|
},
|
||||||
close() {
|
close() {
|
||||||
this.searchReset(0);
|
this.searchReset(0);
|
||||||
@ -214,27 +235,31 @@
|
|||||||
},
|
},
|
||||||
handleSubmit() {
|
handleSubmit() {
|
||||||
let that = this;
|
let that = this;
|
||||||
for (let i = 0, len = this.selectedRowKeys.length; i < len; i++) {
|
this.getSelectUserRows();
|
||||||
this.getUserNames(this.selectedRowKeys[i]);
|
console.log(that.selectUserRows)
|
||||||
}
|
that.$emit('ok', that.selectUserRows, that.selectUserIds);
|
||||||
that.$emit('ok', that.userNameArr.join(','));
|
that.searchReset(0)
|
||||||
that.close();
|
that.close();
|
||||||
},
|
},
|
||||||
// 遍历匹配,获取用户真实姓名
|
//获取选择用户信息
|
||||||
getUserNames(rowId) {
|
getSelectUserRows(rowId) {
|
||||||
let dataSource = this.dataSource;
|
let dataSource = this.dataSource;
|
||||||
|
let userIds = "";
|
||||||
|
this.selectUserRows = [];
|
||||||
for (let i = 0, len = dataSource.length; i < len; i++) {
|
for (let i = 0, len = dataSource.length; i < len; i++) {
|
||||||
if (rowId === dataSource[i].id) {
|
if (this.selectedRowKeys.includes(dataSource[i].id)) {
|
||||||
this.userNameArr.push(dataSource[i].realname);
|
this.selectUserRows.push(dataSource[i]);
|
||||||
|
userIds = userIds + "," + dataSource[i].username
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.selectUserIds = userIds.substring(1);
|
||||||
},
|
},
|
||||||
// 点击树节点,筛选出对应的用户
|
// 点击树节点,筛选出对应的用户
|
||||||
onSelect(selectedKeys) {
|
onDepSelect(selectedDepIds) {
|
||||||
if (selectedKeys[0] != null) {
|
if (selectedDepIds[0] != null) {
|
||||||
this.queryUserByDepId(selectedKeys); // 调用方法根据选选择的id查询用户信息
|
this.initQueryUserByDepId(selectedDepIds); // 调用方法根据选选择的id查询用户信息
|
||||||
if (this.selectedKeys[0] !== selectedKeys[0]) {
|
if (this.selectedDepIds[0] !== selectedDepIds[0]) {
|
||||||
this.selectedKeys = [selectedKeys[0]];
|
this.selectedDepIds = [selectedDepIds[0]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -246,26 +271,14 @@
|
|||||||
this.loadData(1);
|
this.loadData(1);
|
||||||
},
|
},
|
||||||
// 根据选择的id来查询用户信息
|
// 根据选择的id来查询用户信息
|
||||||
queryUserByDepId(selectedKeys) {
|
initQueryUserByDepId(selectedDepIds) {
|
||||||
queryUserByDepId({ id: selectedKeys.toString() }).then((res) => {
|
queryUserByDepId({id: selectedDepIds.toString()}).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.dataSource = res.result;
|
this.dataSource = res.result;
|
||||||
this.ipagination.total = res.result.length;
|
this.ipagination.total = res.result.length;
|
||||||
this.assignRoleName(this.dataSource);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// 传入用户id,找到匹配的角色名称
|
|
||||||
queryUserRole(userId) {
|
|
||||||
let map = this.userRolesMap;
|
|
||||||
let roleName = [];
|
|
||||||
for (var key in map) {
|
|
||||||
if (userId === key) {
|
|
||||||
roleName.push(map[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return roleName.join(',');
|
|
||||||
},
|
|
||||||
queryDepartTree() {
|
queryDepartTree() {
|
||||||
queryDepartTreeList().then((res) => {
|
queryDepartTreeList().then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
@ -273,16 +286,6 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// 为角色名称赋值
|
|
||||||
assignRoleName(data) {
|
|
||||||
let userId = '';
|
|
||||||
let role = '';
|
|
||||||
for (let i = 0, length = data.length; i < length; i++) {
|
|
||||||
userId = this.dataSource[i].id;
|
|
||||||
role = this.queryUserRole(userId);
|
|
||||||
this.dataSource[i].roleName = role;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
modalFormOk() {
|
modalFormOk() {
|
||||||
this.loadData();
|
this.loadData();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "IframePageContent",
|
name: "IframePageContent",
|
||||||
|
inject:['closeCurrent'],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
url: "",
|
url: "",
|
||||||
@ -36,7 +37,13 @@
|
|||||||
console.log("------url------"+url)
|
console.log("------url------"+url)
|
||||||
if (url !== null && url !== undefined) {
|
if (url !== null && url !== undefined) {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
//window.open(this.url);
|
/*update_begin author:wuxianquan date:20190908 for:判断打开方式,新窗口打开时this.$route.meta.internalOrExternal==true */
|
||||||
|
if(this.$route.meta.internalOrExternal != undefined && this.$route.meta.internalOrExternal==true){
|
||||||
|
this.closeCurrent();
|
||||||
|
window.open(this.url);
|
||||||
|
}
|
||||||
|
/*update_end author:wuxianquan date:20190908 for:判断打开方式,新窗口打开时this.$route.meta.internalOrExternal==true */
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<global-layout @dynamicRouterShow="dynamicRouterShow">
|
<global-layout @dynamicRouterShow="dynamicRouterShow">
|
||||||
<contextmenu :itemList="menuItemList" :visible.sync="menuVisible" @select="onMenuSelect"/>
|
<!-- update-begin- author:sunjianlei --- date:20191009 --- for: 提升右键菜单的层级 -->
|
||||||
|
<contextmenu :itemList="menuItemList" :visible.sync="menuVisible" style="z-index: 9999;" @select="onMenuSelect"/>
|
||||||
|
<!-- update-end- author:sunjianlei --- date:20191009 --- for: 提升右键菜单的层级 -->
|
||||||
<a-tabs
|
<a-tabs
|
||||||
@contextmenu.native="e => onContextmenu(e)"
|
@contextmenu.native="e => onContextmenu(e)"
|
||||||
v-if="multipage"
|
v-if="multipage"
|
||||||
@ -10,6 +12,7 @@
|
|||||||
:hide-add="true"
|
:hide-add="true"
|
||||||
type="editable-card"
|
type="editable-card"
|
||||||
@change="changePage"
|
@change="changePage"
|
||||||
|
@tabClick="tabCallBack"
|
||||||
@edit="editPage">
|
@edit="editPage">
|
||||||
<a-tab-pane :id="page.fullPath" :key="page.fullPath" v-for="page in pageList">
|
<a-tab-pane :id="page.fullPath" :key="page.fullPath" v-for="page in pageList">
|
||||||
<span slot="tab" :pagekey="page.fullPath">{{ page.meta.title }}</span>
|
<span slot="tab" :pagekey="page.fullPath">{{ page.meta.title }}</span>
|
||||||
@ -18,9 +21,11 @@
|
|||||||
<div style="margin: 12px 12px 0;">
|
<div style="margin: 12px 12px 0;">
|
||||||
<transition name="page-toggle">
|
<transition name="page-toggle">
|
||||||
<keep-alive v-if="multipage">
|
<keep-alive v-if="multipage">
|
||||||
<router-view/>
|
<router-view v-if="reloadFlag"/>
|
||||||
</keep-alive>
|
</keep-alive>
|
||||||
<router-view v-else/>
|
<template v-else>
|
||||||
|
<router-view v-if="reloadFlag"/>
|
||||||
|
</template>
|
||||||
</transition>
|
</transition>
|
||||||
</div>
|
</div>
|
||||||
</global-layout>
|
</global-layout>
|
||||||
@ -30,6 +35,7 @@
|
|||||||
import GlobalLayout from '@/components/page/GlobalLayout'
|
import GlobalLayout from '@/components/page/GlobalLayout'
|
||||||
import Contextmenu from '@/components/menu/Contextmenu'
|
import Contextmenu from '@/components/menu/Contextmenu'
|
||||||
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
||||||
|
import { triggerWindowResizeEvent } from '@/utils/util'
|
||||||
|
|
||||||
const indexKey = '/dashboard/analysis'
|
const indexKey = '/dashboard/analysis'
|
||||||
|
|
||||||
@ -47,12 +53,21 @@
|
|||||||
activePage: '',
|
activePage: '',
|
||||||
menuVisible: false,
|
menuVisible: false,
|
||||||
menuItemList: [
|
menuItemList: [
|
||||||
|
{ key: '4', icon: 'reload', text: '刷 新' },
|
||||||
{ key: '1', icon: 'arrow-left', text: '关闭左侧' },
|
{ key: '1', icon: 'arrow-left', text: '关闭左侧' },
|
||||||
{ key: '2', icon: 'arrow-right', text: '关闭右侧' },
|
{ key: '2', icon: 'arrow-right', text: '关闭右侧' },
|
||||||
{ key: '3', icon: 'close', text: '关闭其它' }
|
{ key: '3', icon: 'close', text: '关闭其它' }
|
||||||
]
|
],
|
||||||
|
reloadFlag:true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
/* update_begin author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用 ->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */
|
||||||
|
provide(){
|
||||||
|
return{
|
||||||
|
closeCurrent:this.closeCurrent
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/* update_end author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */
|
||||||
computed: {
|
computed: {
|
||||||
multipage() {
|
multipage() {
|
||||||
//判断如果是手机模式,自动切换为单页面模式
|
//判断如果是手机模式,自动切换为单页面模式
|
||||||
@ -101,9 +116,11 @@
|
|||||||
this.$router.push(Object.assign({},waitRouter));
|
this.$router.push(Object.assign({},waitRouter));
|
||||||
},
|
},
|
||||||
'multipage': function(newVal) {
|
'multipage': function(newVal) {
|
||||||
if (!newVal) {
|
if(this.reloadFlag){
|
||||||
this.linkList = [this.$route.fullPath]
|
if (!newVal) {
|
||||||
this.pageList = [this.$route]
|
this.linkList = [this.$route.fullPath]
|
||||||
|
this.pageList = [this.$route]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -111,6 +128,11 @@
|
|||||||
changePage(key) {
|
changePage(key) {
|
||||||
this.activePage = key
|
this.activePage = key
|
||||||
},
|
},
|
||||||
|
tabCallBack() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
triggerWindowResizeEvent()
|
||||||
|
})
|
||||||
|
},
|
||||||
editPage(key, action) {
|
editPage(key, action) {
|
||||||
this[action](key)
|
this[action](key)
|
||||||
},
|
},
|
||||||
@ -157,13 +179,21 @@
|
|||||||
case '3':
|
case '3':
|
||||||
this.closeOthers(pageKey)
|
this.closeOthers(pageKey)
|
||||||
break
|
break
|
||||||
|
case '4':
|
||||||
|
this.routeReload()
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
/* update_begin author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */
|
||||||
|
closeCurrent(){
|
||||||
|
this.remove(this.activePage);
|
||||||
|
},
|
||||||
|
/* update_end author:wuxianquan date:20190828 for: 关闭当前tab页,供子页面调用->望菜单能配置外链,直接弹出新页面而不是嵌入iframe #428 */
|
||||||
closeOthers(pageKey) {
|
closeOthers(pageKey) {
|
||||||
let index = this.linkList.indexOf(pageKey)
|
let index = this.linkList.indexOf(pageKey)
|
||||||
if (pageKey == indexKey) {
|
if (pageKey == indexKey || pageKey.indexOf('?ticke=')>=0) {
|
||||||
this.linkList = this.linkList.slice(index, index + 1)
|
this.linkList = this.linkList.slice(index, index + 1)
|
||||||
this.pageList = this.pageList.slice(index, index + 1)
|
this.pageList = this.pageList.slice(index, index + 1)
|
||||||
this.activePage = this.linkList[0]
|
this.activePage = this.linkList[0]
|
||||||
@ -171,7 +201,7 @@
|
|||||||
let indexContent = this.pageList.slice(0, 1)[0]
|
let indexContent = this.pageList.slice(0, 1)[0]
|
||||||
this.linkList = this.linkList.slice(index, index + 1)
|
this.linkList = this.linkList.slice(index, index + 1)
|
||||||
this.pageList = this.pageList.slice(index, index + 1)
|
this.pageList = this.pageList.slice(index, index + 1)
|
||||||
this.linkList.unshift(indexKey)
|
this.linkList.unshift(indexContent.fullPath)
|
||||||
this.pageList.unshift(indexContent)
|
this.pageList.unshift(indexContent)
|
||||||
this.activePage = this.linkList[1]
|
this.activePage = this.linkList[1]
|
||||||
}
|
}
|
||||||
@ -185,7 +215,7 @@
|
|||||||
let index = this.linkList.indexOf(pageKey)
|
let index = this.linkList.indexOf(pageKey)
|
||||||
this.linkList = this.linkList.slice(index)
|
this.linkList = this.linkList.slice(index)
|
||||||
this.pageList = this.pageList.slice(index)
|
this.pageList = this.pageList.slice(index)
|
||||||
this.linkList.unshift(indexKey)
|
this.linkList.unshift(indexContent.fullPath)
|
||||||
this.pageList.unshift(indexContent)
|
this.pageList.unshift(indexContent)
|
||||||
if (this.linkList.indexOf(this.activePage) < 0) {
|
if (this.linkList.indexOf(this.activePage) < 0) {
|
||||||
this.activePage = this.linkList[0]
|
this.activePage = this.linkList[0]
|
||||||
@ -207,8 +237,20 @@
|
|||||||
let meta = Object.assign({},currRouter.meta,{title:title})
|
let meta = Object.assign({},currRouter.meta,{title:title})
|
||||||
this.pageList.splice(keyIndex, 1, Object.assign({},currRouter,{meta:meta}))
|
this.pageList.splice(keyIndex, 1, Object.assign({},currRouter,{meta:meta}))
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
//update-end-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title
|
//update-end-author:taoyan date:20190430 for:动态路由title显示配置的菜单title而不是其对应路由的title
|
||||||
|
|
||||||
|
//update-begin-author:taoyan date:20191008 for:路由刷新
|
||||||
|
routeReload(){
|
||||||
|
this.reloadFlag = false
|
||||||
|
let ToggleMultipage = "ToggleMultipage"
|
||||||
|
this.$store.dispatch(ToggleMultipage,false)
|
||||||
|
this.$nextTick(()=>{
|
||||||
|
this.$store.dispatch(ToggleMultipage,true)
|
||||||
|
this.reloadFlag = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//update-end-author:taoyan date:20191008 for:路由刷新
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -148,11 +148,28 @@
|
|||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.ant-menu.ant-menu-root {
|
.ant-menu.ant-menu-root {
|
||||||
& > .ant-menu-item:first-child {
|
& > .ant-menu-item:first-child {
|
||||||
background-color: white;
|
background-color: transparent;
|
||||||
|
|
||||||
& > a, & > a:hover {
|
& > a, & > a:hover {
|
||||||
color: rgba(0, 0, 0, 0.65);
|
color: rgba(0, 0, 0, 0.65);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.ant-menu-item-selected {
|
||||||
|
& > a, & > a:hover {
|
||||||
|
color: #1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.ant-menu-dark > .ant-menu-item:first-child {
|
||||||
|
& > a, & > a:hover {
|
||||||
|
color: rgba(255, 255, 255, 0.65);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.ant-menu-item-selected {
|
||||||
|
& > a, & > a:hover {
|
||||||
|
color: rgba(255, 255, 255, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,7 +74,9 @@
|
|||||||
</a-layout-footer>
|
</a-layout-footer>
|
||||||
</a-layout>
|
</a-layout>
|
||||||
|
|
||||||
<setting-drawer></setting-drawer>
|
<!-- update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ---- -->
|
||||||
|
<!--<setting-drawer></setting-drawer>-->
|
||||||
|
<!-- update-end---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ---- -->
|
||||||
</a-layout>
|
</a-layout>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -82,7 +84,11 @@
|
|||||||
import SideMenu from '@/components/menu/SideMenu'
|
import SideMenu from '@/components/menu/SideMenu'
|
||||||
import GlobalHeader from '@/components/page/GlobalHeader'
|
import GlobalHeader from '@/components/page/GlobalHeader'
|
||||||
import GlobalFooter from '@/components/page/GlobalFooter'
|
import GlobalFooter from '@/components/page/GlobalFooter'
|
||||||
import SettingDrawer from '@/components/setting/SettingDrawer'
|
// update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
||||||
|
// import SettingDrawer from '@/components/setting/SettingDrawer'
|
||||||
|
// 注释这个因为在个人设置模块已经加载了SettingDrawer页面
|
||||||
|
// update-end ---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
||||||
|
|
||||||
import { triggerWindowResizeEvent } from '@/utils/util'
|
import { triggerWindowResizeEvent } from '@/utils/util'
|
||||||
import { mapState, mapActions } from 'vuex'
|
import { mapState, mapActions } from 'vuex'
|
||||||
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
||||||
@ -93,7 +99,11 @@
|
|||||||
SideMenu,
|
SideMenu,
|
||||||
GlobalHeader,
|
GlobalHeader,
|
||||||
GlobalFooter,
|
GlobalFooter,
|
||||||
SettingDrawer
|
// update-start---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
||||||
|
// // SettingDrawer
|
||||||
|
// 注释这个因为在个人设置模块已经加载了SettingDrawer页面
|
||||||
|
// update-end ---- author:os_chengtgen -- date:20190830 -- for:issues/463 -编译主题颜色已生效,但还一直转圈,显示主题 正在编译 ------
|
||||||
|
|
||||||
},
|
},
|
||||||
mixins: [mixin, mixinDevice],
|
mixins: [mixin, mixinDevice],
|
||||||
data() {
|
data() {
|
||||||
|
|||||||
@ -153,9 +153,10 @@
|
|||||||
</a-alert>
|
</a-alert>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-drawer-index-handle" @click="toggle">
|
<div class="setting-drawer-index-handle" @click="toggle" v-if="visible">
|
||||||
<a-icon type="setting" v-if="!visible"/>
|
<!-- <a-icon type="setting" v-if="!visible"/>-->
|
||||||
<a-icon type="close" v-else/>
|
<!-- <a-icon type="close" v-else/>-->
|
||||||
|
<a-icon type="close" />
|
||||||
</div>
|
</div>
|
||||||
</a-drawer>
|
</a-drawer>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
:title="title"
|
:title="currTitle"
|
||||||
:width="450"
|
:width="450"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
:closable="false"
|
:closable="false"
|
||||||
@ -41,6 +41,9 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getAction,putAction } from '@/api/manage'
|
import { getAction,putAction } from '@/api/manage'
|
||||||
|
import Vue from 'vue'
|
||||||
|
import store from '@/store/'
|
||||||
|
import { USER_INFO } from "@/store/mutation-types"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DepartSelect',
|
name: 'DepartSelect',
|
||||||
@ -70,6 +73,7 @@
|
|||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
return {
|
return {
|
||||||
|
currTitle:this.title,
|
||||||
visible:false,
|
visible:false,
|
||||||
departList:[],
|
departList:[],
|
||||||
departSelected:"",
|
departSelected:"",
|
||||||
@ -100,7 +104,7 @@
|
|||||||
this.departSelected = orgCode
|
this.departSelected = orgCode
|
||||||
this.departList = departs
|
this.departList = departs
|
||||||
if(this.currDepartName){
|
if(this.currDepartName){
|
||||||
this.title ="部门切换(当前部门 : "+this.currDepartName+")"
|
this.currTitle ="部门切换(当前部门 : "+this.currDepartName+")"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -122,6 +126,10 @@
|
|||||||
}
|
}
|
||||||
putAction("/sys/selectDepart",obj).then(res=>{
|
putAction("/sys/selectDepart",obj).then(res=>{
|
||||||
if(res.success){
|
if(res.success){
|
||||||
|
const userInfo = res.result.userInfo;
|
||||||
|
Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000);
|
||||||
|
store.commit('SET_INFO', userInfo);
|
||||||
|
//console.log("---切换组织机构---userInfo-------",store.getters.userInfo.orgCode);
|
||||||
this.departClear()
|
this.departClear()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -78,6 +78,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import { getAction,putAction } from '@/api/manage'
|
import { getAction,putAction } from '@/api/manage'
|
||||||
import ShowAnnouncement from './ShowAnnouncement'
|
import ShowAnnouncement from './ShowAnnouncement'
|
||||||
|
import store from '@/store/'
|
||||||
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "HeaderNotice",
|
name: "HeaderNotice",
|
||||||
@ -89,15 +91,20 @@
|
|||||||
loadding: false,
|
loadding: false,
|
||||||
url:{
|
url:{
|
||||||
listCementByUser:"/sys/annountCement/listByUser",
|
listCementByUser:"/sys/annountCement/listByUser",
|
||||||
editCementSend:"/system/sysAnnouncementSend/editByAnntIdAndUserId",
|
editCementSend:"/sys/sysAnnouncementSend/editByAnntIdAndUserId",
|
||||||
|
queryById:"/sys/annountCement/queryById",
|
||||||
},
|
},
|
||||||
hovered: false,
|
hovered: false,
|
||||||
announcement1:[],
|
announcement1:[],
|
||||||
announcement2:[],
|
announcement2:[],
|
||||||
msg1Count:"3",
|
msg1Count:"0",
|
||||||
msg2Count:"0",
|
msg2Count:"0",
|
||||||
msg1Title:"通知(3)",
|
msg1Title:"通知(0)",
|
||||||
msg2Title:"",
|
msg2Title:"",
|
||||||
|
stopTimer:false,
|
||||||
|
websock: null,
|
||||||
|
lockReconnect:false,
|
||||||
|
heartCheck:null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed:{
|
computed:{
|
||||||
@ -105,15 +112,26 @@
|
|||||||
return parseInt(this.msg1Count)+parseInt(this.msg2Count);
|
return parseInt(this.msg1Count)+parseInt(this.msg2Count);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
mounted() {
|
||||||
this.loadData();
|
this.loadData();
|
||||||
this.timer();
|
//this.timerFun();
|
||||||
|
this.initWebSocket();
|
||||||
|
this.heartCheckFun();
|
||||||
|
},
|
||||||
|
destroyed: function () { // 离开页面生命周期函数
|
||||||
|
this.websocketclose();
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
timer() {
|
timerFun() {
|
||||||
return setInterval(()=>{
|
this.stopTimer = false;
|
||||||
|
let myTimer = setInterval(()=>{
|
||||||
|
// 停止定时器
|
||||||
|
if (this.stopTimer == true) {
|
||||||
|
clearInterval(myTimer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.loadData()
|
this.loadData()
|
||||||
},60000)
|
},6000)
|
||||||
},
|
},
|
||||||
loadData (){
|
loadData (){
|
||||||
try {
|
try {
|
||||||
@ -127,8 +145,14 @@
|
|||||||
this.msg2Count = res.result.sysMsgTotal;
|
this.msg2Count = res.result.sysMsgTotal;
|
||||||
this.msg2Title = "系统消息(" + res.result.sysMsgTotal + ")";
|
this.msg2Title = "系统消息(" + res.result.sysMsgTotal + ")";
|
||||||
}
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
console.log("系统消息通知异常",error);//这行打印permissionName is undefined
|
||||||
|
this.stopTimer = true;
|
||||||
|
console.log("清理timer");
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
this.stopTimer = true;
|
||||||
|
console.log("通知异常",err);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fetchNotice () {
|
fetchNotice () {
|
||||||
@ -163,6 +187,125 @@
|
|||||||
this.hovered = visible;
|
this.hovered = visible;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
initWebSocket: function () {
|
||||||
|
// WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https
|
||||||
|
var userId = store.getters.userInfo.id;
|
||||||
|
var url = window._CONFIG['domianURL'].replace("https://","wss://").replace("http://","ws://")+"/websocket/"+userId;
|
||||||
|
//console.log(url);
|
||||||
|
this.websock = new WebSocket(url);
|
||||||
|
this.websock.onopen = this.websocketonopen;
|
||||||
|
this.websock.onerror = this.websocketonerror;
|
||||||
|
this.websock.onmessage = this.websocketonmessage;
|
||||||
|
this.websock.onclose = this.websocketclose;
|
||||||
|
},
|
||||||
|
websocketonopen: function () {
|
||||||
|
console.log("WebSocket连接成功");
|
||||||
|
//心跳检测重置
|
||||||
|
this.heartCheck.reset().start();
|
||||||
|
},
|
||||||
|
websocketonerror: function (e) {
|
||||||
|
console.log("WebSocket连接发生错误");
|
||||||
|
this.reconnect();
|
||||||
|
},
|
||||||
|
websocketonmessage: function (e) {
|
||||||
|
//console.log("-----接收消息-------",e.data);
|
||||||
|
var data = eval("(" + e.data + ")"); //解析对象
|
||||||
|
if(data.cmd == "topic"){
|
||||||
|
//系统通知
|
||||||
|
this.loadData();
|
||||||
|
}else if(data.cmd == "user"){
|
||||||
|
//用户消息
|
||||||
|
this.loadData();
|
||||||
|
}
|
||||||
|
|
||||||
|
//心跳检测重置
|
||||||
|
this.heartCheck.reset().start();
|
||||||
|
|
||||||
|
},
|
||||||
|
websocketsend(text) { // 数据发送
|
||||||
|
try {
|
||||||
|
this.websock.send(text);
|
||||||
|
} catch (err) {
|
||||||
|
console.log("send failed (" + err.code + ")");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
websocketclose: function (e) {
|
||||||
|
console.log("connection closed (" + e.code + ")");
|
||||||
|
this.reconnect();
|
||||||
|
},
|
||||||
|
|
||||||
|
openNotification (data) {
|
||||||
|
var text = data.msgTxt;
|
||||||
|
const key = `open${Date.now()}`;
|
||||||
|
this.$notification.open({
|
||||||
|
message: '消息提醒',
|
||||||
|
placement:'bottomRight',
|
||||||
|
description: text,
|
||||||
|
key,
|
||||||
|
btn: (h)=>{
|
||||||
|
return h('a-button', {
|
||||||
|
props: {
|
||||||
|
type: 'primary',
|
||||||
|
size: 'small',
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
click: () => this.showDetail(key,data)
|
||||||
|
}
|
||||||
|
}, '查看详情')
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
reconnect() {
|
||||||
|
var that = this;
|
||||||
|
if(that.lockReconnect) return;
|
||||||
|
that.lockReconnect = true;
|
||||||
|
//没连接上会一直重连,设置延迟避免请求过多
|
||||||
|
setTimeout(function () {
|
||||||
|
console.info("尝试重连...");
|
||||||
|
that.initWebSocket();
|
||||||
|
that.lockReconnect = false;
|
||||||
|
}, 5000);
|
||||||
|
},
|
||||||
|
heartCheckFun(){
|
||||||
|
var that = this;
|
||||||
|
//心跳检测,每20s心跳一次
|
||||||
|
that.heartCheck = {
|
||||||
|
timeout: 20000,
|
||||||
|
timeoutObj: null,
|
||||||
|
serverTimeoutObj: null,
|
||||||
|
reset: function(){
|
||||||
|
clearTimeout(this.timeoutObj);
|
||||||
|
//clearTimeout(this.serverTimeoutObj);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
start: function(){
|
||||||
|
var self = this;
|
||||||
|
this.timeoutObj = setTimeout(function(){
|
||||||
|
//这里发送一个心跳,后端收到后,返回一个心跳消息,
|
||||||
|
//onmessage拿到返回的心跳就说明连接正常
|
||||||
|
that.websocketsend("HeartBeat");
|
||||||
|
console.info("客户端发送心跳");
|
||||||
|
//self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
|
||||||
|
// that.websock.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
|
||||||
|
//}, self.timeout)
|
||||||
|
}, this.timeout)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
showDetail(key,data){
|
||||||
|
this.$notification.close(key);
|
||||||
|
var id = data.msgId;
|
||||||
|
getAction(this.url.queryById,{id:id}).then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
var record = res.result;
|
||||||
|
this.showAnnouncement(record);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -1,15 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="logo">
|
<div class="logo">
|
||||||
<router-link :to="{name:'dashboard'}">
|
<router-link :to="{name:'dashboard'}">
|
||||||
<img src="~@/assets/logo.svg" alt="logo">
|
|
||||||
|
<!-- update-begin- author:sunjianlei --- date:20190814 --- for: logo颜色根据主题颜色变化 -->
|
||||||
|
<img v-if="navTheme === 'dark'" src="~@/assets/logo-white.png" alt="logo">
|
||||||
|
<img v-else src="~@/assets/logo.svg" alt="logo">
|
||||||
|
<!-- update-begin- author:sunjianlei --- date:20190814 --- for: logo颜色根据主题颜色变化 -->
|
||||||
|
|
||||||
<h1 v-if="showTitle">{{ title }}</h1>
|
<h1 v-if="showTitle">{{ title }}</h1>
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { mixin } from '@/utils/mixin.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Logo',
|
name: 'Logo',
|
||||||
|
mixins: [mixin],
|
||||||
props: {
|
props: {
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
|
|||||||
@ -1,20 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-modal
|
<a-modal
|
||||||
width="60%"
|
class="announcementCustomModal"
|
||||||
|
:width="modelStyle.width"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
:bodyStyle ="bodyStyle"
|
:bodyStyle ="bodyStyle"
|
||||||
@cancel="handleCancel"
|
@cancel="handleCancel"
|
||||||
destroyOnClose
|
destroyOnClose
|
||||||
:footer="null">
|
:footer="null">
|
||||||
|
<template slot="title">
|
||||||
<a-card style="width: 100%;height: 100%" class="daily-article" :loading="loading">
|
<a-button icon="fullscreen" class="custom-btn" @click="handleClickToggleFullScreen"/>
|
||||||
|
</template>
|
||||||
|
<a-card class="daily-article" :loading="loading">
|
||||||
<a-card-meta
|
<a-card-meta
|
||||||
:title="record.titile"
|
:title="record.titile"
|
||||||
:description="'发布人:'+record.sender + ' 发布时间: ' + record.sendTime"/>
|
:description="'发布人:'+record.sender + ' 发布时间: ' + record.sendTime">
|
||||||
|
</a-card-meta>
|
||||||
<a-divider />
|
<a-divider />
|
||||||
<span v-html="record.msgContent" class="article-content"></span>
|
<span v-html="record.msgContent" class="article-content"></span>
|
||||||
</a-card>
|
</a-card>
|
||||||
|
|
||||||
</a-modal>
|
</a-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -40,8 +43,14 @@
|
|||||||
bodyStyle:{
|
bodyStyle:{
|
||||||
padding: "0",
|
padding: "0",
|
||||||
height:(window.innerHeight*0.8)+"px",
|
height:(window.innerHeight*0.8)+"px",
|
||||||
"overflow-y":"auto"
|
"overflow-y":"auto",
|
||||||
|
|
||||||
},
|
},
|
||||||
|
modelStyle:{
|
||||||
|
width: '60%',
|
||||||
|
style: { top: '20px' },
|
||||||
|
fullScreen: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
@ -54,33 +63,68 @@
|
|||||||
handleCancel () {
|
handleCancel () {
|
||||||
this.visible = false;
|
this.visible = false;
|
||||||
},
|
},
|
||||||
|
/** 切换全屏显示 */
|
||||||
|
handleClickToggleFullScreen() {
|
||||||
|
let mode = !this.modelStyle.fullScreen
|
||||||
|
if (mode) {
|
||||||
|
this.modelStyle.width = '100%'
|
||||||
|
this.modelStyle.style.top = '20px'
|
||||||
|
} else {
|
||||||
|
this.modelStyle.width = '60%'
|
||||||
|
this.modelStyle.style.top = '50px'
|
||||||
|
}
|
||||||
|
this.modelStyle.fullScreen = mode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
.announcementCustomModal{
|
||||||
|
.ant-modal-header {
|
||||||
|
border: none;
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
right: 56px;
|
||||||
|
padding: 0;
|
||||||
|
.ant-modal-title{
|
||||||
|
.custom-btn{
|
||||||
|
width: 56px;
|
||||||
|
height: 56px;
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.daily-article{
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
.daily-article {
|
.daily-article {
|
||||||
.article-button {
|
.article-button {
|
||||||
font-size: 1.2rem !important;
|
font-size: 1.2rem !important;
|
||||||
|
}
|
||||||
|
.ant-card-body {
|
||||||
|
padding: 18px !important;
|
||||||
|
}
|
||||||
|
.ant-card-head {
|
||||||
|
padding: 0 1rem;
|
||||||
|
}
|
||||||
|
.ant-card-meta {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.article-content {
|
||||||
|
p {
|
||||||
|
word-wrap: break-word;
|
||||||
|
word-break: break-all;
|
||||||
|
text-overflow: initial;
|
||||||
|
white-space: normal;
|
||||||
|
font-size: .9rem !important;
|
||||||
|
margin-bottom: .8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.ant-card-body {
|
</style>
|
||||||
padding: 18px !important;
|
|
||||||
}
|
|
||||||
.ant-card-head {
|
|
||||||
padding: 0 1rem;
|
|
||||||
}
|
|
||||||
.ant-card-meta {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
.article-content {
|
|
||||||
p {
|
|
||||||
word-wrap: break-word;
|
|
||||||
word-break: break-all;
|
|
||||||
text-overflow: initial;
|
|
||||||
white-space: normal;
|
|
||||||
font-size: .9rem !important;
|
|
||||||
margin-bottom: .8rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@ -24,11 +24,15 @@
|
|||||||
<span>账户设置</span>
|
<span>账户设置</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
<a-menu-item key="2" @click="updatePassword">
|
<a-menu-item key="3" @click="systemSetting">
|
||||||
|
<a-icon type="tool"/>
|
||||||
|
<span>系统设置</span>
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item key="4" @click="updatePassword">
|
||||||
<a-icon type="setting"/>
|
<a-icon type="setting"/>
|
||||||
<span>密码修改</span>
|
<span>密码修改</span>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
<a-menu-item key="3" @click="updateCurrentDepart">
|
<a-menu-item key="5" @click="updateCurrentDepart">
|
||||||
<a-icon type="cluster"/>
|
<a-icon type="cluster"/>
|
||||||
<span>切换部门</span>
|
<span>切换部门</span>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
@ -53,12 +57,14 @@
|
|||||||
</span>
|
</span>
|
||||||
<user-password ref="userPassword"></user-password>
|
<user-password ref="userPassword"></user-password>
|
||||||
<depart-select ref="departSelect" :closable="true" title="部门切换"></depart-select>
|
<depart-select ref="departSelect" :closable="true" title="部门切换"></depart-select>
|
||||||
|
<setting-drawer ref="settingDrawer" :closable="true" title="系统设置"></setting-drawer>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import HeaderNotice from './HeaderNotice'
|
import HeaderNotice from './HeaderNotice'
|
||||||
import UserPassword from './UserPassword'
|
import UserPassword from './UserPassword'
|
||||||
|
import SettingDrawer from "@/components/setting/SettingDrawer";
|
||||||
import DepartSelect from './DepartSelect'
|
import DepartSelect from './DepartSelect'
|
||||||
import { mapActions, mapGetters } from 'vuex'
|
import { mapActions, mapGetters } from 'vuex'
|
||||||
import { mixinDevice } from '@/utils/mixin.js'
|
import { mixinDevice } from '@/utils/mixin.js'
|
||||||
@ -69,7 +75,8 @@
|
|||||||
components: {
|
components: {
|
||||||
HeaderNotice,
|
HeaderNotice,
|
||||||
UserPassword,
|
UserPassword,
|
||||||
DepartSelect
|
DepartSelect,
|
||||||
|
SettingDrawer
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
theme: {
|
theme: {
|
||||||
@ -112,6 +119,9 @@
|
|||||||
},
|
},
|
||||||
updateCurrentDepart(){
|
updateCurrentDepart(){
|
||||||
this.$refs.departSelect.show()
|
this.$refs.departSelect.show()
|
||||||
|
},
|
||||||
|
systemSetting(){
|
||||||
|
this.$refs.settingDrawer.showDrawer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,23 +40,23 @@ const updateTheme = primaryColor => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const hideMessage = message.loading('正在编译主题!', 0);
|
const hideMessage = message.loading('正在编译主题!', 0);
|
||||||
|
console.info(`正在编译主题!`)
|
||||||
function buildIt() {
|
function buildIt() {
|
||||||
if (!window.less) {
|
// 正确的判定less是否已经加载less.modifyVars可用
|
||||||
|
if (!window.less || !window.less.modifyVars) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setTimeout(() => {
|
// less.modifyVars可用
|
||||||
window.less
|
window.less.modifyVars({
|
||||||
.modifyVars({
|
'@primary-color': primaryColor,
|
||||||
'@primary-color': primaryColor,
|
})
|
||||||
})
|
.then(() => {
|
||||||
.then(() => {
|
hideMessage();
|
||||||
hideMessage();
|
})
|
||||||
})
|
.catch(() => {
|
||||||
.catch(() => {
|
message.error('Failed to update theme');
|
||||||
message.error('Failed to update theme');
|
hideMessage();
|
||||||
hideMessage();
|
});
|
||||||
});
|
|
||||||
}, 200);
|
|
||||||
}
|
}
|
||||||
if (!lessNodesAppended) {
|
if (!lessNodesAppended) {
|
||||||
// insert less.js and color.less
|
// insert less.js and color.less
|
||||||
|
|||||||
@ -18,6 +18,8 @@ import VueApexCharts from 'vue-apexcharts'
|
|||||||
|
|
||||||
import preview from 'vue-photo-preview'
|
import preview from 'vue-photo-preview'
|
||||||
import 'vue-photo-preview/dist/skin.css'
|
import 'vue-photo-preview/dist/skin.css'
|
||||||
|
import "@jeecg/antd-online"
|
||||||
|
import '@jeecg/antd-online/dist/OnlineForm.css'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ACCESS_TOKEN,
|
ACCESS_TOKEN,
|
||||||
|
|||||||
@ -9,9 +9,6 @@ export const DisabledAuthFilterMixin = {
|
|||||||
return {
|
return {
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
created() {
|
|
||||||
|
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
isDisabledAuth(code){
|
isDisabledAuth(code){
|
||||||
|
|||||||
@ -51,9 +51,12 @@ export const JeecgListMixin = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.loadData();
|
if(!this.disableMixinCreated){
|
||||||
//初始化字典配置 在自己页面定义
|
console.log(' -- mixin created -- ')
|
||||||
this.initDictConfig();
|
this.loadData();
|
||||||
|
//初始化字典配置 在自己页面定义
|
||||||
|
this.initDictConfig();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
loadData(arg) {
|
loadData(arg) {
|
||||||
@ -149,6 +152,7 @@ export const JeecgListMixin = {
|
|||||||
title: "确认删除",
|
title: "确认删除",
|
||||||
content: "是否删除选中数据?",
|
content: "是否删除选中数据?",
|
||||||
onOk: function () {
|
onOk: function () {
|
||||||
|
that.loading = true;
|
||||||
deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
|
deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
that.$message.success(res.message);
|
that.$message.success(res.message);
|
||||||
@ -157,6 +161,8 @@ export const JeecgListMixin = {
|
|||||||
} else {
|
} else {
|
||||||
that.$message.warning(res.message);
|
that.$message.warning(res.message);
|
||||||
}
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
that.loading = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -250,9 +256,24 @@ export const JeecgListMixin = {
|
|||||||
console.log(info.file, info.fileList);
|
console.log(info.file, info.fileList);
|
||||||
}
|
}
|
||||||
if (info.file.status === 'done') {
|
if (info.file.status === 'done') {
|
||||||
if(info.file.response.success){
|
if (info.file.response.success) {
|
||||||
this.$message.success(`${info.file.name} 文件上传成功`);
|
// this.$message.success(`${info.file.name} 文件上传成功`);
|
||||||
this.loadData();
|
if (info.file.response.code === 201) {
|
||||||
|
let { message, result: { msg, fileUrl, fileName } } = info.file.response
|
||||||
|
let href = window._CONFIG['domianURL'] + fileUrl
|
||||||
|
this.$warning({
|
||||||
|
title: message,
|
||||||
|
content: (
|
||||||
|
<div>
|
||||||
|
<span>{msg}</span><br/>
|
||||||
|
<span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`)
|
||||||
|
}
|
||||||
|
this.loadData()
|
||||||
} else {
|
} else {
|
||||||
this.$message.error(`${info.file.name} ${info.file.response.message}.`);
|
this.$message.error(`${info.file.name} ${info.file.response.message}.`);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,16 @@ import Vue from 'vue'
|
|||||||
import Router from 'vue-router'
|
import Router from 'vue-router'
|
||||||
import { constantRouterMap } from '@/config/router.config'
|
import { constantRouterMap } from '@/config/router.config'
|
||||||
|
|
||||||
|
//update-begin-author:taoyan date:20191011 for:TASK #3214 【优化】访问online功能测试 浏览器控制台抛出异常
|
||||||
|
try {
|
||||||
|
const originalPush = Router.prototype.push
|
||||||
|
Router.prototype.push = function push(location) {
|
||||||
|
return originalPush.call(this, location).catch(err => err)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
//update-end-author:taoyan date:20191011 for:TASK #3214 【优化】访问online功能测试 浏览器控制台抛出异常
|
||||||
|
|
||||||
Vue.use(Router)
|
Vue.use(Router)
|
||||||
|
|
||||||
export default new Router({
|
export default new Router({
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import { login, logout, phoneLogin } from "@/api/login"
|
|||||||
import { ACCESS_TOKEN, USER_NAME,USER_INFO,USER_AUTH,SYS_BUTTON_AUTH } from "@/store/mutation-types"
|
import { ACCESS_TOKEN, USER_NAME,USER_INFO,USER_AUTH,SYS_BUTTON_AUTH } from "@/store/mutation-types"
|
||||||
import { welcome } from "@/utils/util"
|
import { welcome } from "@/utils/util"
|
||||||
import { queryPermissionsByUser } from '@/api/api'
|
import { queryPermissionsByUser } from '@/api/api'
|
||||||
|
import { getAction } from '@/api/manage'
|
||||||
|
|
||||||
const user = {
|
const user = {
|
||||||
state: {
|
state: {
|
||||||
@ -36,6 +37,30 @@ const user = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
|
// CAS验证登录
|
||||||
|
ValidateLogin({ commit }, userInfo) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
getAction("/cas/client/validateLogin",userInfo).then(response => {
|
||||||
|
console.log("----cas 登录--------",response);
|
||||||
|
if(response.success){
|
||||||
|
const result = response.result
|
||||||
|
const userInfo = result.userInfo
|
||||||
|
Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
|
||||||
|
Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000)
|
||||||
|
Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
|
||||||
|
commit('SET_TOKEN', result.token)
|
||||||
|
commit('SET_INFO', userInfo)
|
||||||
|
commit('SET_NAME', { username: userInfo.username,realname: userInfo.realname, welcome: welcome() })
|
||||||
|
commit('SET_AVATAR', userInfo.avatar)
|
||||||
|
resolve(response)
|
||||||
|
}else{
|
||||||
|
resolve(response)
|
||||||
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
// 登录
|
// 登录
|
||||||
Login({ commit }, userInfo) {
|
Login({ commit }, userInfo) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@ -115,6 +140,9 @@ const user = {
|
|||||||
Vue.ls.remove(ACCESS_TOKEN)
|
Vue.ls.remove(ACCESS_TOKEN)
|
||||||
//console.log('logoutToken: '+ logoutToken)
|
//console.log('logoutToken: '+ logoutToken)
|
||||||
logout(logoutToken).then(() => {
|
logout(logoutToken).then(() => {
|
||||||
|
//var sevice = "http://"+window.location.host+"/";
|
||||||
|
//var serviceUrl = encodeURIComponent(sevice);
|
||||||
|
//window.location.href = window._CONFIG['casPrefixUrl']+"/logout?service="+serviceUrl;
|
||||||
resolve()
|
resolve()
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
resolve()
|
resolve()
|
||||||
|
|||||||
@ -7,6 +7,14 @@ const FormTypes = {
|
|||||||
date: 'date',
|
date: 'date',
|
||||||
datetime: 'datetime',
|
datetime: 'datetime',
|
||||||
upload: 'upload',
|
upload: 'upload',
|
||||||
|
file: 'file',
|
||||||
|
image: 'image',
|
||||||
|
popup:'popup',
|
||||||
|
list_multi:"list_multi",
|
||||||
|
sel_search:"sel_search",
|
||||||
|
radio:'radio',
|
||||||
|
checkbox_meta:"checkbox_meta",
|
||||||
|
|
||||||
slot: 'slot',
|
slot: 'slot',
|
||||||
hidden: 'hidden'
|
hidden: 'hidden'
|
||||||
}
|
}
|
||||||
|
|||||||
107
ant-design-vue-jeecg/src/utils/LunarFullCalendarUtil.js
Normal file
107
ant-design-vue-jeecg/src/utils/LunarFullCalendarUtil.js
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/**
|
||||||
|
* LunarFullCalendar 公共 js
|
||||||
|
*
|
||||||
|
* @version 1.0.0
|
||||||
|
* @author sunjianlei
|
||||||
|
*
|
||||||
|
* */
|
||||||
|
|
||||||
|
import { getRefPromise } from '@/utils/JEditableTableUtil'
|
||||||
|
|
||||||
|
/* 日历的视图类型 */
|
||||||
|
const calendarViewType = {
|
||||||
|
month: 'month', // 月视图
|
||||||
|
basicWeek: 'basicWeek', // 基础周视图
|
||||||
|
basicDay: 'basicDay',// 基础天视图
|
||||||
|
agendaWeek: 'agendaWeek', // 议程周视图
|
||||||
|
agendaDay: 'agendaDay', // 议程天视图
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 定义默认视图 */
|
||||||
|
const defaultView = calendarViewType.month
|
||||||
|
|
||||||
|
/* 定义日历默认配置 */
|
||||||
|
const defaultSettings = {
|
||||||
|
locale: 'zh-cn',
|
||||||
|
// 按钮文字
|
||||||
|
buttonText: {
|
||||||
|
today: '今天',
|
||||||
|
month: '月',
|
||||||
|
week: '周',
|
||||||
|
day: '日'
|
||||||
|
},
|
||||||
|
// 头部排列方式
|
||||||
|
header: {
|
||||||
|
left: 'prev,next, today',
|
||||||
|
center: 'title',
|
||||||
|
right: 'hide, custom, month,agendaWeek,agendaDay'
|
||||||
|
},
|
||||||
|
//点击今天日列表图
|
||||||
|
eventLimitClick: 'day',
|
||||||
|
// 隐藏超出的事件
|
||||||
|
eventLimit: true,
|
||||||
|
// 设置每周开始日期为周日
|
||||||
|
firstDay: 0,
|
||||||
|
// 默认显示视图
|
||||||
|
defaultView,
|
||||||
|
timeFormat: 'H:mm',
|
||||||
|
axisFormat: 'H:mm',
|
||||||
|
// agenda视图下是否显示all-day
|
||||||
|
allDaySlot: true,
|
||||||
|
// agenda视图下all-day的显示文本
|
||||||
|
allDayText: '全天',
|
||||||
|
// 时区默认本地的
|
||||||
|
timezone: 'local',
|
||||||
|
// 周视图和日视同的左侧时间显示
|
||||||
|
slotLabelFormat: 'HH:mm',
|
||||||
|
// 设置第二天阈值
|
||||||
|
nextDayThreshold: '00:00:00',
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 提供了一些增强方法 */
|
||||||
|
const CalendarMixins = {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
calenderCurrentViewType: defaultView
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
getCalendarConfigEventHandler() {
|
||||||
|
return {
|
||||||
|
// 处理 view changed 事件
|
||||||
|
viewRender: (view, element) => {
|
||||||
|
let { type } = view
|
||||||
|
|
||||||
|
let lastViewType = this.calenderCurrentViewType
|
||||||
|
this.calenderCurrentViewType = type
|
||||||
|
|
||||||
|
if (typeof this.handleViewRender === 'function') {
|
||||||
|
this.handleViewRender(type, view, element)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastViewType !== this.calenderCurrentViewType && typeof this.handleViewChanged === 'function') {
|
||||||
|
this.handleViewChanged(type, view, element)
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 获取 LunarFullCalendar 实例,ref = baseCalendar */
|
||||||
|
getCalendar(fn) {
|
||||||
|
return getRefPromise(this, 'baseCalendar').then(fn)
|
||||||
|
},
|
||||||
|
|
||||||
|
calendarEmit(name, data) {
|
||||||
|
this.getCalendar(ref => ref.$emit(name, data))
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 强制重新加载所有的事件(日程)*/
|
||||||
|
calendarReloadEvents() {
|
||||||
|
this.calendarEmit('reload-events')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { defaultSettings, calendarViewType, CalendarMixins }
|
||||||
@ -78,9 +78,11 @@ service.interceptors.request.use(config => {
|
|||||||
config.headers[ 'X-Access-Token' ] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
|
config.headers[ 'X-Access-Token' ] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
|
||||||
}
|
}
|
||||||
if(config.method=='get'){
|
if(config.method=='get'){
|
||||||
config.params = {
|
if(config.url.indexOf("sys/dict/getDictItems")<0){
|
||||||
_t: Date.parse(new Date())/1000,
|
config.params = {
|
||||||
...config.params
|
_t: Date.parse(new Date())/1000,
|
||||||
|
...config.params
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return config
|
return config
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import * as api from '@/api/api'
|
||||||
import { isURL } from '@/utils/validate'
|
import { isURL } from '@/utils/validate'
|
||||||
|
|
||||||
export function timeFix() {
|
export function timeFix() {
|
||||||
@ -125,7 +126,10 @@ function generateChildRouters (data) {
|
|||||||
icon: item.meta.icon,
|
icon: item.meta.icon,
|
||||||
url:item.meta.url ,
|
url:item.meta.url ,
|
||||||
permissionList:item.meta.permissionList,
|
permissionList:item.meta.permissionList,
|
||||||
keepAlive:item.meta.keepAlive
|
keepAlive:item.meta.keepAlive,
|
||||||
|
/*update_begin author:wuxianquan date:20190908 for:赋值 */
|
||||||
|
internalOrExternal:item.meta.internalOrExternal
|
||||||
|
/*update_end author:wuxianquan date:20190908 for:赋值 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(item.alwaysShow){
|
if(item.alwaysShow){
|
||||||
@ -232,4 +236,44 @@ export function showDealBtn(bpmStatus){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增强CSS,可以在页面上输出全局css
|
||||||
|
* @param css 要增强的css
|
||||||
|
* @param id style标签的id,可以用来清除旧样式
|
||||||
|
*/
|
||||||
|
export function cssExpand(css, id) {
|
||||||
|
let style = document.createElement('style')
|
||||||
|
style.type = "text/css"
|
||||||
|
style.innerHTML = `@charset "UTF-8"; ${css}`
|
||||||
|
// 清除旧样式
|
||||||
|
if (id) {
|
||||||
|
let $style = document.getElementById(id)
|
||||||
|
if ($style != null) $style.outerHTML = ''
|
||||||
|
style.id = id
|
||||||
|
}
|
||||||
|
// 应用新样式
|
||||||
|
document.head.appendChild(style)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重复值验证工具方法
|
||||||
|
*
|
||||||
|
* 使用示例:
|
||||||
|
* { validator: (rule, value, callback) => validateDuplicateValue('sys_fill_rule', 'rule_code', value, this.model.id, callback) }
|
||||||
|
*
|
||||||
|
* @param tableName 被验证的表名
|
||||||
|
* @param fieldName 被验证的字段名
|
||||||
|
* @param fieldVal 被验证的值
|
||||||
|
* @param dataId 数据ID,可空
|
||||||
|
* @param callback
|
||||||
|
*/
|
||||||
|
export function validateDuplicateValue(tableName, fieldName, fieldVal, dataId, callback) {
|
||||||
|
let params = { tableName, fieldName, fieldVal, dataId }
|
||||||
|
api.duplicateCheck(params).then(res => {
|
||||||
|
res['success'] ? callback() : callback(res['message'])
|
||||||
|
}).catch(err => {
|
||||||
|
callback(err.message || err)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
@ -209,10 +209,10 @@
|
|||||||
})
|
})
|
||||||
getVisitInfo().then(res=>{
|
getVisitInfo().then(res=>{
|
||||||
if(res.success){
|
if(res.success){
|
||||||
console.log("aaaaaa",res.result)
|
console.log("aaaaaa",res.result)
|
||||||
this.visitInfo = res.result;
|
this.visitInfo = res.result;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,29 +3,39 @@
|
|||||||
|
|
||||||
<!-- 查询区域 -->
|
<!-- 查询区域 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
<a-form-item label="名称">
|
<a-form-item label="用户名">
|
||||||
<a-input placeholder="请输入名称查询" v-model="queryParam.name"></a-input>
|
<j-input placeholder="请输入名称模糊查询" v-model="queryParam.name"></j-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
<a-form-item label="年龄">
|
<a-form-item label="年龄">
|
||||||
<a-input placeholder="请输入名称查询" v-model="queryParam.age"></a-input>
|
<!-- <a-input placeholder="请输入名称查询" v-model="queryParam.age"></a-input>-->
|
||||||
|
<a-input placeholder="最小年龄" type="ge" v-model="queryParam.age_begin" style="width:calc(50% - 15px);"></a-input>
|
||||||
|
<span class="group-query-strig">~</span>
|
||||||
|
<a-input placeholder="最大年龄" type="le" v-model="queryParam.age_end" style="width:calc(50% - 15px);"></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<template v-if="toggleSearchStatus">
|
<template v-if="toggleSearchStatus">
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
<a-form-item label="字典下拉">
|
<a-form-item label="生日">
|
||||||
<j-dict-select-tag v-model="queryParam.sex" placeholder="请选择用户名称" dictCode="sex"/>
|
<a-range-picker v-model="queryParam.birthdayRange"
|
||||||
|
format="YYYY-MM-DD"
|
||||||
|
:placeholder="['开始时间', '结束时间']"
|
||||||
|
@change="onBirthdayChange" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
<a-form-item label="字典表下拉">
|
<a-form-item label="性别">
|
||||||
<j-dict-select-tag v-model="queryParam.realname" placeholder="请选择用户" dictCode="sys_user,realname,id"/>
|
<j-dict-select-tag v-model="queryParam.sex" placeholder="请选择性别" dictCode="sex"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :md="6" :sm="8">
|
||||||
|
<a-form-item label="选择用户">
|
||||||
|
<j-dict-select-tag v-model="queryParam.id" placeholder="请选择用户" dictCode="demo,name,id"/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
</template>
|
</template>
|
||||||
@ -165,10 +175,12 @@
|
|||||||
<script>
|
<script>
|
||||||
import JeecgDemoModal from './modules/JeecgDemoModal'
|
import JeecgDemoModal from './modules/JeecgDemoModal'
|
||||||
import JSuperQuery from '@/components/jeecg/JSuperQuery.vue';
|
import JSuperQuery from '@/components/jeecg/JSuperQuery.vue';
|
||||||
|
import JInput from '@/components/jeecg/JInput.vue';
|
||||||
import JeecgDemoTabsModal from './modules/JeecgDemoTabsModal'
|
import JeecgDemoTabsModal from './modules/JeecgDemoTabsModal'
|
||||||
import {initDictOptions, filterDictText} from '@/components/dict/JDictSelectUtil'
|
import {initDictOptions, filterDictText} from '@/components/dict/JDictSelectUtil'
|
||||||
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
|
import { filterObj } from '@/utils/util';
|
||||||
|
|
||||||
//高级查询modal需要参数
|
//高级查询modal需要参数
|
||||||
const superQueryFieldList=[{
|
const superQueryFieldList=[{
|
||||||
@ -191,6 +203,7 @@
|
|||||||
JeecgDemoModal,
|
JeecgDemoModal,
|
||||||
JSuperQuery,
|
JSuperQuery,
|
||||||
JeecgDemoTabsModal,
|
JeecgDemoTabsModal,
|
||||||
|
JInput
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -278,6 +291,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
getQueryParams(){
|
||||||
|
console.log(this.queryParam.birthdayRange)
|
||||||
|
var param = Object.assign({}, this.queryParam,this.isorter);
|
||||||
|
param.field = this.getQueryField();
|
||||||
|
param.pageNo = this.ipagination.current;
|
||||||
|
param.pageSize = this.ipagination.pageSize;
|
||||||
|
delete param.birthdayRange; //范围参数不传递后台
|
||||||
|
return filterObj(param);
|
||||||
|
},
|
||||||
initDictConfig() {
|
initDictConfig() {
|
||||||
console.log("--我才是真的方法!--")
|
console.log("--我才是真的方法!--")
|
||||||
//初始化字典 - 性别
|
//初始化字典 - 性别
|
||||||
@ -295,6 +317,11 @@
|
|||||||
jump() {
|
jump() {
|
||||||
this.$router.push({path: '/jeecg/helloworld'})
|
this.$router.push({path: '/jeecg/helloworld'})
|
||||||
},
|
},
|
||||||
|
onBirthdayChange: function (value, dateString) {
|
||||||
|
console.log(dateString[0],dateString[1]);
|
||||||
|
this.queryParam.birthday_begin=dateString[0];
|
||||||
|
this.queryParam.birthday_end=dateString[1];
|
||||||
|
},
|
||||||
//列设置更改事件
|
//列设置更改事件
|
||||||
onColSettingsChange (checkedValues) {
|
onColSettingsChange (checkedValues) {
|
||||||
var key = this.$route.name+":colsettings";
|
var key = this.$route.name+":colsettings";
|
||||||
|
|||||||
@ -1,307 +1,37 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<a-card :bordered="false">
|
||||||
<a-card :borderd="false">
|
|
||||||
|
|
||||||
|
<a-tabs>
|
||||||
|
|
||||||
<a-button @click="handleTableCheck" type="primary">表单验证</a-button>
|
<a-tab-pane tab="普通列表" key="1">
|
||||||
<span style="padding-left:8px;"></span>
|
<default-table/>
|
||||||
<a-tooltip placement="top" title="获取值,忽略表单验证" :autoAdjustOverflow="true">
|
</a-tab-pane>
|
||||||
<a-button @click="handleTableGet" type="primary">获取值</a-button>
|
|
||||||
</a-tooltip>
|
|
||||||
<span style="padding-left:8px;"></span>
|
|
||||||
<a-tooltip placement="top" title="模拟加载1000条数据" :autoAdjustOverflow="true">
|
|
||||||
<a-button @click="handleTableSet" type="primary">设置值</a-button>
|
|
||||||
</a-tooltip>
|
|
||||||
|
|
||||||
|
<a-tab-pane tab="只读列表" key="2">
|
||||||
|
<read-only-table/>
|
||||||
|
</a-tab-pane>
|
||||||
|
|
||||||
<j-editable-table
|
<a-tab-pane tab="三级联动" key="3">
|
||||||
ref="editableTable"
|
<three-linkage/>
|
||||||
:loading="loading"
|
</a-tab-pane>
|
||||||
:columns="columns"
|
|
||||||
:dataSource="dataSource"
|
|
||||||
:rowNumber="true"
|
|
||||||
:rowSelection="true"
|
|
||||||
:actionButton="true"
|
|
||||||
style="margin-top: 8px;"
|
|
||||||
@selectRowChange="handleSelectRowChange">
|
|
||||||
|
|
||||||
<template v-slot:action="props">
|
</a-tabs>
|
||||||
<a @click="handleDelete(props)">{{ props.text }}</a>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
</j-editable-table>
|
</a-card>
|
||||||
|
|
||||||
|
|
||||||
</a-card>
|
|
||||||
<br>
|
|
||||||
<a-card title="只读列表">
|
|
||||||
<j-editable-table
|
|
||||||
:columns="columns1"
|
|
||||||
:dataSource="dataSource1"
|
|
||||||
:rowNumber="true"
|
|
||||||
:rowSelection="true"
|
|
||||||
:maxHeight="200"
|
|
||||||
:disabled="true"
|
|
||||||
/>
|
|
||||||
</a-card>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import moment from 'moment'
|
import DefaultTable from './modules/JEditableTable/DefaultTable'
|
||||||
import JEditableTable from '@/components/jeecg/JEditableTable'
|
import ReadOnlyTable from './modules/JEditableTable/ReadOnlyTable'
|
||||||
import { FormTypes } from '@/utils/JEditableTableUtil'
|
import ThreeLinkage from './modules/JEditableTable/ThreeLinkage'
|
||||||
import { randomUUID, randomNumber } from '@/utils/util'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'JeecgEditableTableExample',
|
name: 'JeecgEditableTableExample',
|
||||||
components: {
|
components: { DefaultTable, ReadOnlyTable, ThreeLinkage },
|
||||||
JEditableTable
|
|
||||||
},
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {}
|
||||||
loading: false,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '字段名称',
|
|
||||||
key: 'dbFieldName',
|
|
||||||
// width: '19%',
|
|
||||||
width: '300px',
|
|
||||||
type: FormTypes.input,
|
|
||||||
defaultValue: '',
|
|
||||||
placeholder: '请输入${title}',
|
|
||||||
validateRules: [
|
|
||||||
{
|
|
||||||
required: true, // 必填
|
|
||||||
message: '请输入${title}' // 显示的文本
|
|
||||||
},
|
|
||||||
{
|
|
||||||
pattern: /^[a-z|A-Z][a-z|A-Z\d_-]{0,}$/, // 正则
|
|
||||||
message: '${title}必须以字母开头,可包含数字、下划线、横杠'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '文件域',
|
|
||||||
key: 'upload',
|
|
||||||
type: FormTypes.upload,
|
|
||||||
// width: '19%',
|
|
||||||
width: '300px',
|
|
||||||
placeholder: '点击上传',
|
|
||||||
token: true,
|
|
||||||
responseName: 'message',
|
|
||||||
action: window._CONFIG['domianURL'] + '/sys/common/upload'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '字段类型',
|
|
||||||
key: 'dbFieldType',
|
|
||||||
// width: '18%',
|
|
||||||
width: '300px',
|
|
||||||
type: FormTypes.select,
|
|
||||||
options: [ // 下拉选项
|
|
||||||
{ title: 'String', value: 'string' },
|
|
||||||
{ title: 'Integer', value: 'int' },
|
|
||||||
{ title: 'Double', value: 'double' },
|
|
||||||
{ title: 'Boolean', value: 'boolean' }
|
|
||||||
],
|
|
||||||
allowInput: true,
|
|
||||||
defaultValue: '',
|
|
||||||
placeholder: '请选择${title}',
|
|
||||||
validateRules: [{ required: true, message: '请选择${title}' }]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '性别(字典)',
|
|
||||||
key: 'sex_dict',
|
|
||||||
width: '300px',
|
|
||||||
type: FormTypes.select,
|
|
||||||
options: [],
|
|
||||||
dictCode: 'sex',
|
|
||||||
placeholder: '请选择${title}',
|
|
||||||
validateRules: [{ required: true, message: '请选择${title}' }]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '多选测试',
|
|
||||||
key: 'multipleSelect',
|
|
||||||
// width: '18%',
|
|
||||||
width: '300px',
|
|
||||||
type: FormTypes.select,
|
|
||||||
props: { 'mode': 'multiple' }, // 支持多选
|
|
||||||
options: [
|
|
||||||
{ title: 'String', value: 'string' },
|
|
||||||
{ title: 'Integer', value: 'int' },
|
|
||||||
{ title: 'Double', value: 'double' },
|
|
||||||
{ title: 'Boolean', value: 'boolean' }
|
|
||||||
],
|
|
||||||
defaultValue: ['int', 'boolean'], // 多个默认项
|
|
||||||
// defaultValue: 'string,double,int', // 也可使用这种方式
|
|
||||||
placeholder: '这里可以多选',
|
|
||||||
validateRules: [{ required: true, message: '请选择${title}' }]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '字段长度',
|
|
||||||
key: 'dbLength',
|
|
||||||
// width: '8%',
|
|
||||||
width: '100px',
|
|
||||||
type: FormTypes.inputNumber,
|
|
||||||
defaultValue: 32,
|
|
||||||
placeholder: '${title}',
|
|
||||||
validateRules: [{ required: true, message: '请输入${title}' }]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '日期',
|
|
||||||
key: 'datetime',
|
|
||||||
// width: '22%',
|
|
||||||
width: '320px',
|
|
||||||
type: FormTypes.datetime,
|
|
||||||
defaultValue: '2019-4-30 14:52:22',
|
|
||||||
placeholder: '请选择${title}',
|
|
||||||
validateRules: [{ required: true, message: '请选择${title}' }]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '可以为空',
|
|
||||||
key: 'isNull',
|
|
||||||
// width: '8%',
|
|
||||||
width: '100px',
|
|
||||||
type: FormTypes.checkbox,
|
|
||||||
customValue: ['Y', 'N'], // true ,false
|
|
||||||
defaultChecked: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '操作',
|
|
||||||
key: 'action',
|
|
||||||
// width: '8%',
|
|
||||||
width: '100px',
|
|
||||||
type: FormTypes.slot,
|
|
||||||
slotName: 'action',
|
|
||||||
defaultValue: '删除'
|
|
||||||
}
|
|
||||||
|
|
||||||
],
|
|
||||||
dataSource: [],
|
|
||||||
selectedRowIds: [],
|
|
||||||
// table2
|
|
||||||
columns1: [
|
|
||||||
{
|
|
||||||
title: '输入框',
|
|
||||||
key: 'input',
|
|
||||||
type: FormTypes.input,
|
|
||||||
placeholder: '清输入'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '下拉框',
|
|
||||||
key: 'select',
|
|
||||||
type: FormTypes.select,
|
|
||||||
options: [
|
|
||||||
{ title: 'String', value: 'string' },
|
|
||||||
{ title: 'Integer', value: 'int' },
|
|
||||||
{ title: 'Double', value: 'double' },
|
|
||||||
{ title: 'Boolean', value: 'boolean' }
|
|
||||||
],
|
|
||||||
placeholder: '请选择'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '多选框',
|
|
||||||
key: 'checkbox',
|
|
||||||
type: FormTypes.checkbox,
|
|
||||||
customValue: [true, false]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '日期',
|
|
||||||
key: 'datetime',
|
|
||||||
type: FormTypes.datetime
|
|
||||||
}
|
|
||||||
],
|
|
||||||
dataSource1: []
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
created() {
|
methods: {}
|
||||||
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.randomData(23, false)
|
|
||||||
this.dataSource1 = [
|
|
||||||
{ input: 'hello', select: 'int', checkbox: true, datetime: '2019-6-17 14:50:48' },
|
|
||||||
{ input: 'world', select: 'string', checkbox: false, datetime: '2019-6-16 14:50:48' },
|
|
||||||
{ input: 'one', select: 'double', checkbox: true, datetime: '2019-6-17 15:50:48' },
|
|
||||||
{ input: 'two', select: 'boolean', checkbox: false, datetime: '2019-6-14 14:50:48' },
|
|
||||||
{ input: 'three', select: '', checkbox: false, datetime: '2019-6-13 14:50:48' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
|
|
||||||
/** 表单验证 */
|
|
||||||
handleTableCheck() {
|
|
||||||
this.$refs.editableTable.getValues((error) => {
|
|
||||||
if (error === 0) {
|
|
||||||
this.$message.success('验证通过')
|
|
||||||
} else {
|
|
||||||
this.$message.error('验证未通过')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
/** 获取值,忽略表单验证 */
|
|
||||||
handleTableGet() {
|
|
||||||
this.$refs.editableTable.getValues((error, values) => {
|
|
||||||
console.log('values:', values)
|
|
||||||
}, false)
|
|
||||||
console.log('deleteIds:', this.$refs.editableTable.getDeleteIds())
|
|
||||||
|
|
||||||
this.$message.info('获取值成功,请看控制台输出')
|
|
||||||
|
|
||||||
},
|
|
||||||
/** 模拟加载1000条数据 */
|
|
||||||
handleTableSet() {
|
|
||||||
this.randomData(1000, true)
|
|
||||||
},
|
|
||||||
|
|
||||||
handleSelectRowChange(selectedRowIds) {
|
|
||||||
this.selectedRowIds = selectedRowIds
|
|
||||||
},
|
|
||||||
|
|
||||||
/* 随机生成数据 */
|
|
||||||
randomData(size, loading = false) {
|
|
||||||
if (loading) {
|
|
||||||
this.loading = true
|
|
||||||
}
|
|
||||||
|
|
||||||
let randomDatetime = () => {
|
|
||||||
let time = parseInt(randomNumber(1000, 9999999999999))
|
|
||||||
return moment(new Date(time)).format('YYYY-MM-DD HH:mm:ss')
|
|
||||||
}
|
|
||||||
|
|
||||||
let begin = Date.now()
|
|
||||||
let values = []
|
|
||||||
for (let i = 0; i < size; i++) {
|
|
||||||
values.push({
|
|
||||||
id: randomUUID(),
|
|
||||||
dbFieldName: `name_${i + 1}`,
|
|
||||||
// dbFieldTxt: randomString(10),
|
|
||||||
multipleSelect: ['string', ['int', 'double', 'boolean'][randomNumber(0, 2)]],
|
|
||||||
dbFieldType: ['string', 'int', 'double', 'boolean'][randomNumber(0, 3)],
|
|
||||||
dbLength: randomNumber(0, 233),
|
|
||||||
datetime: randomDatetime(),
|
|
||||||
isNull: ['Y', 'N'][randomNumber(0, 1)]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
this.dataSource = values
|
|
||||||
let end = Date.now()
|
|
||||||
let diff = end - begin
|
|
||||||
|
|
||||||
if (loading && diff < size) {
|
|
||||||
setTimeout(() => {
|
|
||||||
this.loading = false
|
|
||||||
}, size - diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
handleDelete(props) {
|
|
||||||
let { rowId, target } = props
|
|
||||||
target.removeRows(rowId)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@ -39,8 +39,8 @@
|
|||||||
<!-- 部门选择控件 -->
|
<!-- 部门选择控件 -->
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="选择部门">
|
<a-form-item label="选择部门 自定义返回值">
|
||||||
<j-select-depart v-decorator="['departId']" :trigger-change="true"></j-select-depart>
|
<j-select-depart v-decorator="['departId']" :trigger-change="true" customReturnField="departName"></j-select-depart>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="12">选中的部门ID(v-decorator):{{ getDepartIdValue() }}</a-col>
|
<a-col :span="12">选中的部门ID(v-decorator):{{ getDepartIdValue() }}</a-col>
|
||||||
@ -49,32 +49,42 @@
|
|||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="选择部门">
|
<a-form-item label="选择部门">
|
||||||
<j-select-depart v-model="departId"></j-select-depart>
|
<j-select-depart v-model="departId" :multi="true"></j-select-depart>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="12">选中的部门ID(v-model):{{ departId }}</a-col>
|
<a-col :span="12">选中的部门ID(v-model):{{ departId }}</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
<!-- 用户选择控件 -->
|
<!-- 通过部门选择用户控件 -->
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="选择用户">
|
<a-form-item label="选择用户">
|
||||||
<j-select-user-by-dep v-model="userRealName"></j-select-user-by-dep>
|
<j-select-user-by-dep v-model="userIds" :multi="true"></j-select-user-by-dep>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="12">选中的用户(v-model):{{ userRealName }}</a-col>
|
<a-col :span="12">选中的用户(v-model):{{ userIds }}</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
<!-- 用户选择控件 -->
|
<!-- 用户选择控件 -->
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="选择用户">
|
<a-form-item label="选择用户">
|
||||||
<j-select-multi-user v-model="multiUser"></j-select-multi-user>
|
<j-select-multi-user v-model="multiUser" ></j-select-multi-user>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="12">选中的用户(v-model):{{ multiUser }}</a-col>
|
<a-col :span="12">选中的用户(v-model):{{ multiUser }}</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
|
<!-- 角色选择 -->
|
||||||
|
<a-row :gutter="24">
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-item label="选择角色">
|
||||||
|
<j-select-role v-model="formData.selectRole"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">选中值:{{ formData.selectRole}}</a-col>
|
||||||
|
</a-row>
|
||||||
|
|
||||||
<!-- JCheckbox -->
|
<!-- JCheckbox -->
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
@ -213,14 +223,42 @@
|
|||||||
<a-col :span="12"></a-col>
|
<a-col :span="12"></a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
|
<a-row :gutter="24">
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-item label="下拉树选择">
|
||||||
|
<j-tree-select
|
||||||
|
v-model="formData.treeSelect"
|
||||||
|
placeholder="请选择菜单"
|
||||||
|
dict="sys_permission,name,id"
|
||||||
|
pidField="parent_id"
|
||||||
|
pidValue=""
|
||||||
|
/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :spapn="12">选中的值(v-model):{{ formData.treeSelect }}</a-col>
|
||||||
|
</a-row>
|
||||||
|
|
||||||
|
<a-row :gutter="24">
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-item label="下拉树多选">
|
||||||
|
<j-tree-select
|
||||||
|
v-model="formData.treeSelectMultiple"
|
||||||
|
placeholder="请选择菜单"
|
||||||
|
dict="sys_permission,name,id"
|
||||||
|
pidField="parent_id"
|
||||||
|
pidValue=""
|
||||||
|
multiple
|
||||||
|
/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :spapn="12">选中的值(v-model):{{ formData.treeSelectMultiple }}</a-col>
|
||||||
|
</a-row>
|
||||||
|
|
||||||
<!-- VueCron -->
|
<!-- VueCron -->
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="cron表达式">
|
<a-form-item label="cron表达式">
|
||||||
<a-input @click="openModal" placeholder="corn表达式" v-model="cron.label" readOnly >
|
<j-cron ref="innerVueCron" v-decorator="['cronExpression', { initialValue: '* * * * * ? *' }]" @change="setCorn"></j-cron>
|
||||||
<a-icon slot="prefix" type="schedule" title="corn控件"/>
|
|
||||||
</a-input>
|
|
||||||
<VueCron ref="innerVueCron" :data="cron" @change="changeCron" ></VueCron>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
@ -236,6 +274,7 @@
|
|||||||
import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
|
import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
|
||||||
import JSelectUserByDep from '@/components/jeecgbiz/JSelectUserByDep'
|
import JSelectUserByDep from '@/components/jeecgbiz/JSelectUserByDep'
|
||||||
import JSelectMultiUser from '@/components/jeecgbiz/JSelectMultiUser'
|
import JSelectMultiUser from '@/components/jeecgbiz/JSelectMultiUser'
|
||||||
|
import JSelectRole from '@/components/jeecgbiz/JSelectRole'
|
||||||
import JCheckbox from '@/components/jeecg/JCheckbox'
|
import JCheckbox from '@/components/jeecg/JCheckbox'
|
||||||
import JCodeEditor from '@/components/jeecg/JCodeEditor'
|
import JCodeEditor from '@/components/jeecg/JCodeEditor'
|
||||||
import JDate from '@/components/jeecg/JDate'
|
import JDate from '@/components/jeecg/JDate'
|
||||||
@ -245,7 +284,9 @@
|
|||||||
import JSlider from '@/components/jeecg/JSlider'
|
import JSlider from '@/components/jeecg/JSlider'
|
||||||
import JSelectMultiple from '@/components/jeecg/JSelectMultiple'
|
import JSelectMultiple from '@/components/jeecg/JSelectMultiple'
|
||||||
import JTreeDict from "../../components/jeecg/JTreeDict.vue";
|
import JTreeDict from "../../components/jeecg/JTreeDict.vue";
|
||||||
import VueCron from "./modules/VueCronModal.vue";
|
import JCron from "@/components/jeecg/JCron.vue";
|
||||||
|
import JTreeSelect from '@/components/jeecg/JTreeSelect'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'SelectDemo',
|
name: 'SelectDemo',
|
||||||
components: {
|
components: {
|
||||||
@ -254,20 +295,21 @@
|
|||||||
JSelectDepart,
|
JSelectDepart,
|
||||||
JSelectUserByDep,
|
JSelectUserByDep,
|
||||||
JSelectMultiUser,
|
JSelectMultiUser,
|
||||||
|
JSelectRole,
|
||||||
JCheckbox,
|
JCheckbox,
|
||||||
JCodeEditor,
|
JCodeEditor,
|
||||||
JDate, JEditor, JEllipsis, JGraphicCode, JSlider, JSelectMultiple,
|
JDate, JEditor, JEllipsis, JGraphicCode, JSlider, JSelectMultiple,
|
||||||
VueCron
|
JCron, JTreeSelect
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
selectList: [],
|
selectList: [],
|
||||||
selectedDepUsers: '',
|
selectedDepUsers: '',
|
||||||
formData:{},
|
formData: {},
|
||||||
form: this.$form.createForm(this),
|
form: this.$form.createForm(this),
|
||||||
departId: '4f1765520d6346f9bd9c79e2479e5b12,57197590443c44f083d42ae24ef26a2c',
|
departId: '4f1765520d6346f9bd9c79e2479e5b12,57197590443c44f083d42ae24ef26a2c',
|
||||||
userRealName: '',
|
userIds: 'admin',
|
||||||
multiUser: '',
|
multiUser: 'admin,jeecg',
|
||||||
jcheckbox: {
|
jcheckbox: {
|
||||||
values: 'spring,jeecgboot',
|
values: 'spring,jeecgboot',
|
||||||
options: [
|
options: [
|
||||||
@ -314,10 +356,7 @@ sayHi('hello, world!')`
|
|||||||
style: { top: '20px' },
|
style: { top: '20px' },
|
||||||
fullScreen: true
|
fullScreen: true
|
||||||
},
|
},
|
||||||
cron: {
|
cron: '',
|
||||||
label: '',
|
|
||||||
value: {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -372,14 +411,11 @@ sayHi('hello, world!')`
|
|||||||
}
|
}
|
||||||
this.modal.fullScreen = mode
|
this.modal.fullScreen = mode
|
||||||
},
|
},
|
||||||
openModal(){
|
setCorn(data){
|
||||||
this.$refs.innerVueCron.show()
|
this.$nextTick(() => {
|
||||||
},
|
this.form.cronExpression = data;
|
||||||
changeCron(val){
|
})
|
||||||
this.cron=val;
|
|
||||||
console.log(val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -224,7 +224,7 @@
|
|||||||
getAction(this.url.customerListByMainId, {mainId: record.id}).then((res) => {
|
getAction(this.url.customerListByMainId, {mainId: record.id}).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
this.innerData = res.result;
|
this.innerData = res.result.records;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
91
ant-design-vue-jeecg/src/views/jeecg/TableTotal.vue
Normal file
91
ant-design-vue-jeecg/src/views/jeecg/TableTotal.vue
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
<template>
|
||||||
|
<a-card :bordered="false">
|
||||||
|
<a-table
|
||||||
|
rowKey="id"
|
||||||
|
bordered
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:pagination="false"
|
||||||
|
>
|
||||||
|
</a-table>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'TableTotal',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '#',
|
||||||
|
width: '180px',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'rowIndex',
|
||||||
|
customRender: function (text, r, index) {
|
||||||
|
return (text !== '合计') ? (parseInt(index) + 1) : text
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '姓名',
|
||||||
|
dataIndex: 'name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '贡献点',
|
||||||
|
dataIndex: 'point',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '等级',
|
||||||
|
dataIndex: 'level',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '更新时间',
|
||||||
|
dataIndex: 'updateTime',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
dataSource: [
|
||||||
|
{ name: '张三', point: 23, level: 3, updateTime: '2019-8-14' },
|
||||||
|
{ name: '小王', point: 6, level: 1, updateTime: '2019-8-13' },
|
||||||
|
{ name: '李四', point: 53, level: 8, updateTime: '2019-8-12' },
|
||||||
|
{ name: '小红', point: 44, level: 5, updateTime: '2019-8-11' },
|
||||||
|
{ name: '王五', point: 97, level: 10, updateTime: '2019-8-10' },
|
||||||
|
{ name: '小明', point: 33, level: 2, updateTime: '2019-8-10' },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.tableAddTotalRow(this.columns, this.dataSource)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
/** 表格增加合计行 */
|
||||||
|
tableAddTotalRow(columns, dataSource) {
|
||||||
|
let numKey = 'rowIndex'
|
||||||
|
let totalRow = { [numKey]: '合计' }
|
||||||
|
columns.forEach(column => {
|
||||||
|
let { key, dataIndex } = column
|
||||||
|
if (![key, dataIndex].includes(numKey)) {
|
||||||
|
|
||||||
|
let total = 0
|
||||||
|
dataSource.forEach(data => {
|
||||||
|
total += /^\d+\.?\d?$/.test(data[dataIndex]) ? Number.parseInt(data[dataIndex]) : Number.NaN
|
||||||
|
console.log(data[dataIndex], ':', (/^\d+\.?\d?$/.test(data[dataIndex]) ? Number.parseInt(data[dataIndex]) : Number.NaN))
|
||||||
|
})
|
||||||
|
|
||||||
|
if (Number.isNaN(total)) {
|
||||||
|
total = '-'
|
||||||
|
}
|
||||||
|
totalRow[dataIndex] = total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
dataSource.push(totalRow)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -0,0 +1,283 @@
|
|||||||
|
<template>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a-button @click="handleTableCheck" type="primary">表单验证</a-button>
|
||||||
|
<span style="padding-left:8px;"></span>
|
||||||
|
<a-tooltip placement="top" title="获取值,忽略表单验证" :autoAdjustOverflow="true">
|
||||||
|
<a-button @click="handleTableGet" type="primary">获取值</a-button>
|
||||||
|
</a-tooltip>
|
||||||
|
<span style="padding-left:8px;"></span>
|
||||||
|
<a-tooltip placement="top" title="模拟加载1000条数据" :autoAdjustOverflow="true">
|
||||||
|
<a-button @click="handleTableSet" type="primary">设置值</a-button>
|
||||||
|
</a-tooltip>
|
||||||
|
|
||||||
|
|
||||||
|
<j-editable-table
|
||||||
|
ref="editableTable"
|
||||||
|
:loading="loading"
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:rowNumber="true"
|
||||||
|
:rowSelection="true"
|
||||||
|
:actionButton="true"
|
||||||
|
:dragSort="true"
|
||||||
|
style="margin-top: 8px;"
|
||||||
|
@selectRowChange="handleSelectRowChange">
|
||||||
|
|
||||||
|
<template v-slot:action="props">
|
||||||
|
<a @click="handleDelete(props)">{{ props.text }}</a>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</j-editable-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import moment from 'moment'
|
||||||
|
import { FormTypes } from '@/utils/JEditableTableUtil'
|
||||||
|
import { randomUUID, randomNumber } from '@/utils/util'
|
||||||
|
import JEditableTable from '@/components/jeecg/JEditableTable'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'DefaultTable',
|
||||||
|
components: { JEditableTable },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '字段名称',
|
||||||
|
key: 'dbFieldName',
|
||||||
|
// width: '19%',
|
||||||
|
width: '300px',
|
||||||
|
type: FormTypes.input,
|
||||||
|
defaultValue: '',
|
||||||
|
placeholder: '请输入${title}',
|
||||||
|
validateRules: [
|
||||||
|
{
|
||||||
|
required: true, // 必填
|
||||||
|
message: '请输入${title}' // 显示的文本
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: /^[a-z|A-Z][a-z|A-Z\d_-]{0,}$/, // 正则
|
||||||
|
message: '${title}必须以字母开头,可包含数字、下划线、横杠'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
handler(type, value, row, column, callback, target) {
|
||||||
|
// type 触发校验的类型(input、change、blur)
|
||||||
|
// value 当前校验的值
|
||||||
|
// callback(flag, message) 方法必须执行且只能执行一次
|
||||||
|
// flag = 是否通过了校验,不填写或者填写 null 代表不进行任何操作
|
||||||
|
// message = 提示的类型,默认使用配置的 message
|
||||||
|
// target 行编辑的实例对象
|
||||||
|
|
||||||
|
if (type === 'blur') {
|
||||||
|
let { values } = target.getValuesSync({ validate: false })
|
||||||
|
|
||||||
|
if (value === 'abc') {
|
||||||
|
callback(false, '${title}不能是abc') // false = 未验证
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let count = 0
|
||||||
|
for (let val of values) {
|
||||||
|
if (val['dbFieldName'] === value) {
|
||||||
|
if (++count >= 2) {
|
||||||
|
callback(false, '${title}不能重复==')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
callback(true) // true = 通过验证
|
||||||
|
} else {
|
||||||
|
callback() // 不填写或者填写 null 代表不进行任何操作
|
||||||
|
}
|
||||||
|
},
|
||||||
|
message: '${title}默认提示'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '文件域',
|
||||||
|
key: 'upload',
|
||||||
|
type: FormTypes.upload,
|
||||||
|
// width: '19%',
|
||||||
|
width: '300px',
|
||||||
|
placeholder: '点击上传',
|
||||||
|
token: true,
|
||||||
|
responseName: 'message',
|
||||||
|
action: window._CONFIG['domianURL'] + '/sys/common/upload'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '字段类型',
|
||||||
|
key: 'dbFieldType',
|
||||||
|
// width: '18%',
|
||||||
|
width: '300px',
|
||||||
|
type: FormTypes.select,
|
||||||
|
options: [ // 下拉选项
|
||||||
|
{ title: 'String', value: 'string' },
|
||||||
|
{ title: 'Integer', value: 'int' },
|
||||||
|
{ title: 'Double', value: 'double' },
|
||||||
|
{ title: 'Boolean', value: 'boolean' }
|
||||||
|
],
|
||||||
|
allowInput: true,
|
||||||
|
defaultValue: '',
|
||||||
|
placeholder: '请选择${title}',
|
||||||
|
validateRules: [{ required: true, message: '请选择${title}' }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '性别(字典)',
|
||||||
|
key: 'sex_dict',
|
||||||
|
width: '300px',
|
||||||
|
type: FormTypes.select,
|
||||||
|
options: [],
|
||||||
|
dictCode: 'sex',
|
||||||
|
placeholder: '请选择${title}',
|
||||||
|
validateRules: [{ required: true, message: '请选择${title}' }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '多选测试',
|
||||||
|
key: 'multipleSelect',
|
||||||
|
// width: '18%',
|
||||||
|
width: '300px',
|
||||||
|
type: FormTypes.select,
|
||||||
|
props: { 'mode': 'multiple' }, // 支持多选
|
||||||
|
options: [
|
||||||
|
{ title: 'String', value: 'string' },
|
||||||
|
{ title: 'Integer', value: 'int' },
|
||||||
|
{ title: 'Double', value: 'double' },
|
||||||
|
{ title: 'Boolean', value: 'boolean' }
|
||||||
|
],
|
||||||
|
defaultValue: ['int', 'boolean'], // 多个默认项
|
||||||
|
// defaultValue: 'string,double,int', // 也可使用这种方式
|
||||||
|
placeholder: '这里可以多选',
|
||||||
|
validateRules: [{ required: true, message: '请选择${title}' }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '字段长度',
|
||||||
|
key: 'dbLength',
|
||||||
|
// width: '8%',
|
||||||
|
width: '100px',
|
||||||
|
type: FormTypes.inputNumber,
|
||||||
|
defaultValue: 32,
|
||||||
|
placeholder: '${title}',
|
||||||
|
validateRules: [{ required: true, message: '请输入${title}' }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '日期',
|
||||||
|
key: 'datetime',
|
||||||
|
// width: '22%',
|
||||||
|
width: '320px',
|
||||||
|
type: FormTypes.datetime,
|
||||||
|
defaultValue: '2019-4-30 14:52:22',
|
||||||
|
placeholder: '请选择${title}',
|
||||||
|
validateRules: [{ required: true, message: '请选择${title}' }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '可以为空',
|
||||||
|
key: 'isNull',
|
||||||
|
// width: '8%',
|
||||||
|
width: '100px',
|
||||||
|
type: FormTypes.checkbox,
|
||||||
|
customValue: ['Y', 'N'], // true ,false
|
||||||
|
defaultChecked: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
key: 'action',
|
||||||
|
// width: '8%',
|
||||||
|
width: '100px',
|
||||||
|
type: FormTypes.slot,
|
||||||
|
slotName: 'action',
|
||||||
|
defaultValue: '删除'
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
dataSource: [],
|
||||||
|
selectedRowIds: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.randomData(23, false)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
/** 表单验证 */
|
||||||
|
handleTableCheck() {
|
||||||
|
this.$refs.editableTable.getValues((error) => {
|
||||||
|
if (error === 0) {
|
||||||
|
this.$message.success('验证通过')
|
||||||
|
} else {
|
||||||
|
this.$message.error('验证未通过')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/** 获取值,忽略表单验证 */
|
||||||
|
handleTableGet() {
|
||||||
|
this.$refs.editableTable.getValues((error, values) => {
|
||||||
|
console.log('values:', values)
|
||||||
|
}, false)
|
||||||
|
console.log('deleteIds:', this.$refs.editableTable.getDeleteIds())
|
||||||
|
|
||||||
|
this.$message.info('获取值成功,请看控制台输出')
|
||||||
|
|
||||||
|
},
|
||||||
|
/** 模拟加载1000条数据 */
|
||||||
|
handleTableSet() {
|
||||||
|
this.randomData(1000, true)
|
||||||
|
},
|
||||||
|
|
||||||
|
handleSelectRowChange(selectedRowIds) {
|
||||||
|
this.selectedRowIds = selectedRowIds
|
||||||
|
},
|
||||||
|
|
||||||
|
/* 随机生成数据 */
|
||||||
|
randomData(size, loading = false) {
|
||||||
|
if (loading) {
|
||||||
|
this.loading = true
|
||||||
|
}
|
||||||
|
|
||||||
|
let randomDatetime = () => {
|
||||||
|
let time = parseInt(randomNumber(1000, 9999999999999))
|
||||||
|
return moment(new Date(time)).format('YYYY-MM-DD HH:mm:ss')
|
||||||
|
}
|
||||||
|
|
||||||
|
let begin = Date.now()
|
||||||
|
let values = []
|
||||||
|
for (let i = 0; i < size; i++) {
|
||||||
|
values.push({
|
||||||
|
id: randomUUID(),
|
||||||
|
dbFieldName: `name_${i + 1}`,
|
||||||
|
// dbFieldTxt: randomString(10),
|
||||||
|
multipleSelect: ['string', ['int', 'double', 'boolean'][randomNumber(0, 2)]],
|
||||||
|
dbFieldType: ['string', 'int', 'double', 'boolean'][randomNumber(0, 3)],
|
||||||
|
dbLength: randomNumber(0, 233),
|
||||||
|
datetime: randomDatetime(),
|
||||||
|
isNull: ['Y', 'N'][randomNumber(0, 1)]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataSource = values
|
||||||
|
let end = Date.now()
|
||||||
|
let diff = end - begin
|
||||||
|
|
||||||
|
if (loading && diff < size) {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.loading = false
|
||||||
|
}, size - diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
handleDelete(props) {
|
||||||
|
let { rowId, target } = props
|
||||||
|
target.removeRows(rowId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
<template>
|
||||||
|
<j-editable-table
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:rowNumber="true"
|
||||||
|
:rowSelection="true"
|
||||||
|
:maxHeight="400"
|
||||||
|
:disabled="true"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { FormTypes } from '@/utils/JEditableTableUtil'
|
||||||
|
import JEditableTable from '@/components/jeecg/JEditableTable'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ReadOnlyTable',
|
||||||
|
components: { JEditableTable },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '输入框',
|
||||||
|
key: 'input',
|
||||||
|
type: FormTypes.input,
|
||||||
|
placeholder: '清输入'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '下拉框',
|
||||||
|
key: 'select',
|
||||||
|
type: FormTypes.select,
|
||||||
|
options: [
|
||||||
|
{ title: 'String', value: 'string' },
|
||||||
|
{ title: 'Integer', value: 'int' },
|
||||||
|
{ title: 'Double', value: 'double' },
|
||||||
|
{ title: 'Boolean', value: 'boolean' }
|
||||||
|
],
|
||||||
|
placeholder: '请选择'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '多选框',
|
||||||
|
key: 'checkbox',
|
||||||
|
type: FormTypes.checkbox,
|
||||||
|
customValue: [true, false]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '日期',
|
||||||
|
key: 'datetime',
|
||||||
|
type: FormTypes.datetime
|
||||||
|
}
|
||||||
|
],
|
||||||
|
dataSource: [
|
||||||
|
{ input: 'hello', select: 'int', checkbox: true, datetime: '2019-6-17 14:50:48' },
|
||||||
|
{ input: 'world', select: 'string', checkbox: false, datetime: '2019-6-16 14:50:48' },
|
||||||
|
{ input: 'one', select: 'double', checkbox: true, datetime: '2019-6-17 15:50:48' },
|
||||||
|
{ input: 'two', select: 'boolean', checkbox: false, datetime: '2019-6-14 14:50:48' },
|
||||||
|
{ input: 'three', select: '', checkbox: false, datetime: '2019-6-13 14:50:48' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -0,0 +1,129 @@
|
|||||||
|
<template>
|
||||||
|
<j-editable-table
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:rowNumber="true"
|
||||||
|
:actionButton="true"
|
||||||
|
:rowSelection="true"
|
||||||
|
:maxHeight="400"
|
||||||
|
@valueChange="handleValueChange"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { FormTypes } from '@/utils/JEditableTableUtil'
|
||||||
|
import JEditableTable from '@/components/jeecg/JEditableTable'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ThreeLinkage',
|
||||||
|
components: { JEditableTable },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '省/直辖市/自治区',
|
||||||
|
key: 's1',
|
||||||
|
type: FormTypes.select,
|
||||||
|
width: '240px',
|
||||||
|
options: [],
|
||||||
|
placeholder: '请选择${title}'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '市',
|
||||||
|
key: 's2',
|
||||||
|
type: FormTypes.select,
|
||||||
|
width: '240px',
|
||||||
|
options: [],
|
||||||
|
placeholder: '请选择${title}'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '县/区',
|
||||||
|
key: 's3',
|
||||||
|
type: FormTypes.select,
|
||||||
|
width: '240px',
|
||||||
|
options: [],
|
||||||
|
placeholder: '请选择${title}'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
dataSource: [],
|
||||||
|
|
||||||
|
mockData: [
|
||||||
|
{ label: '北京市', value: '110000', parent: null },
|
||||||
|
{ label: '天津市', value: '120000', parent: null },
|
||||||
|
{ label: '河北省', value: '130000', parent: null },
|
||||||
|
{ label: '上海市', value: '310000', parent: null },
|
||||||
|
|
||||||
|
{ label: '北京市', value: '110100', parent: '110000' },
|
||||||
|
{ label: '天津市市', value: '120100', parent: '120000' },
|
||||||
|
{ label: '石家庄市', value: '130100', parent: '130000' },
|
||||||
|
{ label: '唐山市', value: '130200', parent: '130000' },
|
||||||
|
{ label: '秦皇岛市', value: '130300', parent: '130000' },
|
||||||
|
{ label: '上海市', value: '310100', parent: '310000' },
|
||||||
|
|
||||||
|
{ label: '东城区', value: '110101', parent: '110100' },
|
||||||
|
{ label: '西城区', value: '110102', parent: '110100' },
|
||||||
|
{ label: '朝阳区', value: '110105', parent: '110100' },
|
||||||
|
{ label: '和平区', value: '120101', parent: '120000' },
|
||||||
|
{ label: '河东区', value: '120102', parent: '120000' },
|
||||||
|
{ label: '河西区', value: '120103', parent: '120000' },
|
||||||
|
{ label: '黄浦区', value: '310101', parent: '310100' },
|
||||||
|
{ label: '徐汇区', value: '310104', parent: '310100' },
|
||||||
|
{ label: '长宁区', value: '310105', parent: '310100' },
|
||||||
|
{ label: '长安区', value: '130102', parent: '130100' },
|
||||||
|
{ label: '桥西区', value: '130104', parent: '130100' },
|
||||||
|
{ label: '新华区', value: '130105', parent: '130100' },
|
||||||
|
{ label: '路南区', value: '130202', parent: '130200' },
|
||||||
|
{ label: '路北区', value: '130203', parent: '130200' },
|
||||||
|
{ label: '古冶区', value: '130204', parent: '130200' },
|
||||||
|
{ label: '海港区', value: '130302', parent: '130300' },
|
||||||
|
{ label: '山海关区', value: '130303', parent: '130300' },
|
||||||
|
{ label: '北戴河区', value: '130304', parent: '130300' },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// 初始化数据
|
||||||
|
this.columns[0].options = this.request(null)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
request(parentId) {
|
||||||
|
return this.mockData.filter(i => i.parent === parentId)
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 当选项被改变时,联动其他组件 */
|
||||||
|
handleValueChange(event) {
|
||||||
|
const { type, row, column, value, target } = event
|
||||||
|
|
||||||
|
if (type === FormTypes.select) {
|
||||||
|
|
||||||
|
// 第一列
|
||||||
|
if (column.key === 's1') {
|
||||||
|
// 设置第二列的 options
|
||||||
|
this.columns[1].options = this.request(value)
|
||||||
|
// 清空后两列的数据
|
||||||
|
target.setValues([{
|
||||||
|
rowKey: row.id,
|
||||||
|
values: { s2: '', s3: '' }
|
||||||
|
}])
|
||||||
|
this.columns[2].options = []
|
||||||
|
} else
|
||||||
|
// 第二列
|
||||||
|
if (column.key === 's2') {
|
||||||
|
this.columns[2].options = this.request(value)
|
||||||
|
target.setValues([{
|
||||||
|
rowKey: row.id,
|
||||||
|
values: { s3: '' }
|
||||||
|
}])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -486,7 +486,7 @@
|
|||||||
days = this.result.day.cronLastSpecificDomDay + 'L';
|
days = this.result.day.cronLastSpecificDomDay + 'L';
|
||||||
break;
|
break;
|
||||||
case '9':
|
case '9':
|
||||||
days = 'L-' + this.day.cronDaysBeforeEomMinus;
|
days = 'L-' + this.result.day.cronDaysBeforeEomMinus;
|
||||||
break;
|
break;
|
||||||
case '10':
|
case '10':
|
||||||
days = this.result.day.cronDaysNearestWeekday+"W";
|
days = this.result.day.cronDaysNearestWeekday+"W";
|
||||||
|
|||||||
@ -133,14 +133,19 @@
|
|||||||
if (arg === 1) {
|
if (arg === 1) {
|
||||||
this.ipagination.current = 1;
|
this.ipagination.current = 1;
|
||||||
}
|
}
|
||||||
|
//update-begin--Author:kangxiaolin Date:20190905 for:[442]主子表分开维护,生成的代码子表的分页改为真实的分页--------------------
|
||||||
var params = this.getQueryParams();
|
var params = this.getQueryParams();
|
||||||
getAction(this.url.list, {mainId: params.mainId}).then((res) => {
|
getAction(this.url.list, {orderId: params.mainId, pageNo : this.ipagination.current,
|
||||||
|
pageSize :this.ipagination.pageSize}).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.dataSource = res.result;
|
this.dataSource = res.result.records;
|
||||||
|
this.ipagination.total = res.result.total;
|
||||||
} else {
|
} else {
|
||||||
this.dataSource = null;
|
this.dataSource = null;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
//update-end--Author:kangxiaolin Date:20190905 for:[442]主子表分开维护,生成的代码子表的分页改为真实的分页--------------------
|
||||||
|
|
||||||
},
|
},
|
||||||
getOrderMain(orderId) {
|
getOrderMain(orderId) {
|
||||||
this.queryParam.mainId = orderId;
|
this.queryParam.mainId = orderId;
|
||||||
|
|||||||
@ -123,13 +123,17 @@
|
|||||||
this.ipagination.current = 1;
|
this.ipagination.current = 1;
|
||||||
}
|
}
|
||||||
var params = this.getQueryParams();
|
var params = this.getQueryParams();
|
||||||
getAction(this.url.list, {mainId: params.mainId}).then((res) => {
|
//update-begin--Author:kangxiaolin Date:20190905 for:[442]主子表分开维护,生成的代码子表的分页改为真实的分页--------------------
|
||||||
|
getAction(this.url.list, {orderId: params.mainId ,pageNo : this.ipagination.current,
|
||||||
|
pageSize :this.ipagination.pageSize}).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.dataSource = res.result;
|
this.dataSource = res.result.records;
|
||||||
|
this.ipagination.total = res.result.total;
|
||||||
} else {
|
} else {
|
||||||
this.dataSource = null;
|
this.dataSource = null;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
//update-end--Author:kangxiaolin Date:20190905 for:[442]主子表分开维护,生成的代码子表的分页改为真实的分页--------------------
|
||||||
},
|
},
|
||||||
getOrderMain(orderId) {
|
getOrderMain(orderId) {
|
||||||
this.queryParam.mainId = orderId;
|
this.queryParam.mainId = orderId;
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
:wrapperCol="wrapperCol"
|
:wrapperCol="wrapperCol"
|
||||||
label="航班时间"
|
label="航班时间"
|
||||||
hasFeedback>
|
hasFeedback>
|
||||||
<j-date v-decorator="['tickectDate',{trigger:'input',rules:[{ required: true,message: '请输入航班号!'}]}]"></j-date>
|
<j-date :trigger-change="true" v-decorator="['tickectDate',{rules:[{ required: true,message: '请输入航班号!'}]}]"></j-date>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item
|
<a-form-item
|
||||||
:labelCol="labelCol"
|
:labelCol="labelCol"
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<!-- 查询区域 -->
|
<!-- 查询区域 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
<a-form-item label="消息标题">
|
<a-form-item label="消息标题">
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<!-- 查询区域 -->
|
<!-- 查询区域 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
|
|||||||
@ -0,0 +1,388 @@
|
|||||||
|
<template>
|
||||||
|
<a-card :bordered="false">
|
||||||
|
|
||||||
|
<!-- 查询区域 -->
|
||||||
|
<div class="table-page-search-wrapper">
|
||||||
|
<a-form layout="inline">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
|
||||||
|
<a-col :md="6" :sm="24">
|
||||||
|
<a-form-item label="表名">
|
||||||
|
<a-input placeholder="请输入表名" v-model="queryParam.tableName"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
<a-col :md="6" :sm="24">
|
||||||
|
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
|
||||||
|
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
|
||||||
|
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
|
||||||
|
</span>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 操作按钮区域 -->
|
||||||
|
<div class="table-operator">
|
||||||
|
<a-button @click="doCgformButton" type="primary" icon="highlight" style="margin-left:8px">自定义按钮</a-button>
|
||||||
|
<a-button @click="doEnhanceJs" type="primary" icon="strikethrough" style="margin-left:8px">JS增强</a-button>
|
||||||
|
<a-button @click="doEnhanceSql" type="primary" icon="filter" style="margin-left:8px">SQL增强</a-button>
|
||||||
|
<a-button @click="doEnhanceJava" type="primary" icon="tool" style="margin-left:8px">Java增强</a-button>
|
||||||
|
|
||||||
|
<a-dropdown v-if="selectedRowKeys.length > 0">
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item key="1" @click="batchDel">
|
||||||
|
<a-icon type="delete"/>
|
||||||
|
删除
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
<a-button style="margin-left: 8px"> 批量操作
|
||||||
|
<a-icon type="down"/>
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- table区域-begin -->
|
||||||
|
<div>
|
||||||
|
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
|
||||||
|
<i class="anticon anticon-info-circle ant-alert-icon"></i>
|
||||||
|
已选择
|
||||||
|
<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>
|
||||||
|
项
|
||||||
|
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-table
|
||||||
|
ref="table"
|
||||||
|
size="middle"
|
||||||
|
bordered
|
||||||
|
rowKey="id"
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:pagination="ipagination"
|
||||||
|
:loading="loading"
|
||||||
|
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
||||||
|
@change="handleTableChange">
|
||||||
|
|
||||||
|
<template slot="action" slot-scope="text, record">
|
||||||
|
<a @click="handleEdit(record)">编辑</a>
|
||||||
|
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
<a-dropdown>
|
||||||
|
<a class="ant-dropdown-link">更多
|
||||||
|
<a-icon type="down"/>
|
||||||
|
</a>
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item>
|
||||||
|
<a @click="goPageOnline(record)">功能测试</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item>
|
||||||
|
<a @click="handleOnlineUrlShow(record)">配置地址</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item>
|
||||||
|
<a @click="handleRemoveRecord(record.id)">移除</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
</a-menu>
|
||||||
|
</a-dropdown>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="dbsync" slot-scope="text">
|
||||||
|
<span v-if="text==='Y'" style="color:limegreen">已同步</span>
|
||||||
|
<span v-if="text==='N'" style="color:red">未同步</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
<!-- table区域-end -->
|
||||||
|
|
||||||
|
<!-- 表单区域 -->
|
||||||
|
<onl-cgform-head-modal ref="modalForm" @ok="modalFormOk" :action-button="false"></onl-cgform-head-modal>
|
||||||
|
|
||||||
|
<!-- 提示online报表链接 -->
|
||||||
|
<a-modal
|
||||||
|
:title="onlineUrlTitle"
|
||||||
|
:visible="onlineUrlVisible"
|
||||||
|
@cancel="handleOnlineUrlClose">
|
||||||
|
<template slot="footer">
|
||||||
|
<a-button @click="handleOnlineUrlClose">关闭</a-button>
|
||||||
|
<a-button type="primary" class="copy-this-text" :data-clipboard-text="onlineUrl" @click="onCopyUrl">复制</a-button>
|
||||||
|
</template>
|
||||||
|
<p>{{ onlineUrl }}</p>
|
||||||
|
</a-modal>
|
||||||
|
|
||||||
|
<enhance-js ref="ehjs"></enhance-js>
|
||||||
|
<enhance-sql ref="ehsql"></enhance-sql>
|
||||||
|
<enhance-java ref="ehjava"></enhance-java>
|
||||||
|
<trans-db2-online ref="transd2o" @ok="transOk"></trans-db2-online>
|
||||||
|
|
||||||
|
<onl-cgform-button-list ref="btnList"></onl-cgform-button-list>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { deleteAction, postAction,getAction } from '@/api/manage'
|
||||||
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
|
import Clipboard from 'clipboard'
|
||||||
|
import { filterObj } from '@/utils/util';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'OnlCgformHeadList',
|
||||||
|
mixins: [JeecgListMixin],
|
||||||
|
components: {
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
description: 'Online表单视图',
|
||||||
|
// 表头
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '#',
|
||||||
|
dataIndex: '',
|
||||||
|
key: 'rowIndex',
|
||||||
|
width: 60,
|
||||||
|
align: 'center',
|
||||||
|
customRender: function(t, r, index) {
|
||||||
|
return parseInt(index) + 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '视图表名',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'tableName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '视图表描述',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'tableTxt'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '原表版本',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'tableVersion'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '视图版本',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'copyVersion'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'action',
|
||||||
|
align: 'center',
|
||||||
|
scopedSlots: { customRender: 'action' }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
url: {
|
||||||
|
list: '/online/cgform/head/list',
|
||||||
|
delete: '/online/cgform/head/delete',
|
||||||
|
deleteBatch: '/online/cgform/head/deleteBatch',
|
||||||
|
removeRecord: '/online/cgform/head/removeRecord',
|
||||||
|
},
|
||||||
|
tableTypeDictOptions: [],
|
||||||
|
sexDictOptions: [],
|
||||||
|
syncModalVisible: false,
|
||||||
|
syncFormId: '',
|
||||||
|
synMethod: 'normal',
|
||||||
|
syncLoading: false,
|
||||||
|
onlineUrlTitle: '',
|
||||||
|
onlineUrlVisible: false,
|
||||||
|
onlineUrl: '',
|
||||||
|
selectedRowKeys: [],
|
||||||
|
selectedRows: [],
|
||||||
|
physicId:""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
'$route'() {
|
||||||
|
this.loadData()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getQueryParams() {
|
||||||
|
//获取查询条件
|
||||||
|
var param = Object.assign({}, this.queryParam, this.isorter ,this.filters);
|
||||||
|
param.field = this.getQueryField();
|
||||||
|
param.pageNo = this.ipagination.current;
|
||||||
|
param.pageSize = this.ipagination.pageSize;
|
||||||
|
param.copyType = 1;
|
||||||
|
param.physicId = this.physicId;
|
||||||
|
return filterObj(param);
|
||||||
|
},
|
||||||
|
|
||||||
|
loadData(arg) {
|
||||||
|
if(!this.$route.params.code){
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
this.physicId = this.$route.params.code
|
||||||
|
if(!this.url.list){
|
||||||
|
this.$message.error("请设置url.list属性!")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//加载数据 若传入参数1则加载第一页的内容
|
||||||
|
if (arg === 1) {
|
||||||
|
this.ipagination.current = 1;
|
||||||
|
}
|
||||||
|
var params = this.getQueryParams();//查询条件
|
||||||
|
this.loading = true;
|
||||||
|
getAction(this.url.list, params).then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
this.dataSource = res.result.records;
|
||||||
|
this.ipagination.total = res.result.total;
|
||||||
|
}
|
||||||
|
if(res.code===510){
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
this.loading = false;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
goPageOnline(rd) {
|
||||||
|
if(rd.isTree=='Y'){
|
||||||
|
this.$router.push({ path: '/online/cgformTreeList/' + rd.id })
|
||||||
|
}else{
|
||||||
|
this.$router.push({ path: '/online/cgformList/' + rd.id })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleOnlineUrlClose() {
|
||||||
|
this.onlineUrlTitle = ''
|
||||||
|
this.onlineUrlVisible = false
|
||||||
|
},
|
||||||
|
handleOnlineUrlShow(record) {
|
||||||
|
if(record.isTree=='Y'){
|
||||||
|
this.onlineUrl = `/online/cgformTreeList/${record.id}`
|
||||||
|
}else{
|
||||||
|
this.onlineUrl = `/online/cgformList/${record.id}`
|
||||||
|
}
|
||||||
|
this.onlineUrlVisible = true
|
||||||
|
this.onlineUrlTitle = '菜单链接[' + record.tableTxt + ']'
|
||||||
|
},
|
||||||
|
handleRemoveRecord(id) {
|
||||||
|
let that = this
|
||||||
|
this.$confirm({
|
||||||
|
title: '确认要移除此记录?',
|
||||||
|
onOk() {
|
||||||
|
deleteAction(that.url.removeRecord, { id: id }).then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
that.$message.success('移除成功')
|
||||||
|
that.loadData()
|
||||||
|
} else {
|
||||||
|
that.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onCancel() {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
doEnhanceJs() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.ehjs.show(this.selectedRowKeys[0])
|
||||||
|
},
|
||||||
|
doEnhanceSql() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.ehsql.show(this.selectedRowKeys[0])
|
||||||
|
},
|
||||||
|
doEnhanceJava() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.ehjava.show(this.selectedRowKeys[0])
|
||||||
|
},
|
||||||
|
doCgformButton() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.btnList.show(this.selectedRowKeys[0])
|
||||||
|
|
||||||
|
//this.$router.push({ path: '/online/cgformButton/' + this.selectedRowKeys[0] })
|
||||||
|
},
|
||||||
|
importOnlineForm() {
|
||||||
|
this.$refs.transd2o.show()
|
||||||
|
},
|
||||||
|
transOk() {
|
||||||
|
this.loadData()
|
||||||
|
},
|
||||||
|
onSelectChange(keys, rows) {
|
||||||
|
this.selectedRowKeys = keys
|
||||||
|
this.selectedRows = rows
|
||||||
|
},
|
||||||
|
onCopyUrl(){
|
||||||
|
var clipboard = new Clipboard('.copy-this-text')
|
||||||
|
clipboard.on('success', () => {
|
||||||
|
clipboard.destroy()
|
||||||
|
this.$message.success('复制成功')
|
||||||
|
this.handleOnlineUrlClose()
|
||||||
|
})
|
||||||
|
clipboard.on('error', () => {
|
||||||
|
this.$message.error('该浏览器不支持自动复制')
|
||||||
|
clipboard.destroy()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
showMyCopyInfo(id){
|
||||||
|
console.log("查看复制表单的信息",id)
|
||||||
|
},
|
||||||
|
copyConfig(id){
|
||||||
|
postAction(`${this.url.copyOnline}?code=${id}`).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.$message.success("复制成功")
|
||||||
|
this.loadData()
|
||||||
|
}else{
|
||||||
|
this.$message.error("复制失败>>"+res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less">
|
||||||
|
.ant-card-body .table-operator {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-table-tbody .ant-table-row td {
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.anty-row-operator button {
|
||||||
|
margin: 0 5px
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-btn-danger {
|
||||||
|
background-color: #ffffff
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-modal-cust-warp {
|
||||||
|
height: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-modal-cust-warp .ant-modal-body {
|
||||||
|
height: calc(100% - 110px) !important;
|
||||||
|
overflow-y: auto
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-modal-cust-warp .ant-modal-content {
|
||||||
|
height: 90% !important;
|
||||||
|
overflow-y: hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
.valid-error-cust{
|
||||||
|
.ant-select-selection{
|
||||||
|
border:2px solid #f5222d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,479 @@
|
|||||||
|
<template>
|
||||||
|
<a-card :bordered="false">
|
||||||
|
|
||||||
|
<!-- 查询区域 -->
|
||||||
|
<div class="table-page-search-wrapper">
|
||||||
|
<a-form layout="inline">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
|
||||||
|
<a-col :md="6" :sm="24">
|
||||||
|
<a-form-item label="表名">
|
||||||
|
<a-input placeholder="请输入表名" v-model="queryParam.tableName"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :md="6" :sm="24">
|
||||||
|
<a-form-item label="表类型">
|
||||||
|
<j-dict-select-tag dictCode="cgform_table_type" v-model="queryParam.tableType"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
<a-col :md="6" :sm="24">
|
||||||
|
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
|
||||||
|
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
|
||||||
|
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
|
||||||
|
</span>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 操作按钮区域 -->
|
||||||
|
<div class="table-operator">
|
||||||
|
<a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
|
||||||
|
<a-button @click="doCgformButton" type="primary" icon="highlight" style="margin-left:8px">自定义按钮</a-button>
|
||||||
|
<a-button @click="doEnhanceJs" type="primary" icon="strikethrough" style="margin-left:8px">JS增强</a-button>
|
||||||
|
<a-button @click="doEnhanceSql" type="primary" icon="filter" v-has="'online:sql'" style="margin-left:8px">SQL增强</a-button>
|
||||||
|
<a-button @click="doEnhanceJava" type="primary" icon="tool" style="margin-left:8px">Java增强</a-button>
|
||||||
|
<a-button @click="importOnlineForm" type="primary" icon="database" style="margin-left:8px">从数据库导入表单</a-button>
|
||||||
|
<a-button @click="goGenerateCode" v-has="'online:goGenerateCode'" type="primary" icon="database" style="margin-left:8px">代码生成</a-button>
|
||||||
|
|
||||||
|
<a-dropdown v-if="selectedRowKeys.length > 0">
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item key="1" @click="batchDel">
|
||||||
|
<a-icon type="delete"/>
|
||||||
|
删除
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
<a-button style="margin-left: 8px"> 批量操作
|
||||||
|
<a-icon type="down"/>
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- table区域-begin -->
|
||||||
|
<div>
|
||||||
|
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
|
||||||
|
<i class="anticon anticon-info-circle ant-alert-icon"></i>
|
||||||
|
已选择
|
||||||
|
<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>
|
||||||
|
项
|
||||||
|
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-table
|
||||||
|
ref="table"
|
||||||
|
size="middle"
|
||||||
|
bordered
|
||||||
|
rowKey="id"
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:pagination="ipagination"
|
||||||
|
:loading="loading"
|
||||||
|
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
||||||
|
@change="handleTableChange">
|
||||||
|
|
||||||
|
<template slot="action" slot-scope="text, record">
|
||||||
|
<a @click="handleEdit(record)">编辑</a>
|
||||||
|
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
<a-dropdown>
|
||||||
|
<a class="ant-dropdown-link">更多
|
||||||
|
<a-icon type="down"/>
|
||||||
|
</a>
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item v-if="record.isDbSynch!='Y'">
|
||||||
|
<a @click="openSyncModal(record.id)">同步数据库</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<template v-if="record.isDbSynch=='Y' && record.tableType !== 3">
|
||||||
|
<a-menu-item>
|
||||||
|
<a @click="goPageOnline(record)">功能测试</a>
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item>
|
||||||
|
<a @click="handleOnlineUrlShow(record)">配置地址</a>
|
||||||
|
</a-menu-item>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<a-menu-item>
|
||||||
|
<a @click="copyConfig(record.id)">复制视图</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item v-if="record.hascopy==1">
|
||||||
|
<a @click="showMyCopyInfo(record.id)">配置视图</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item>
|
||||||
|
<a @click="handleRemoveRecord(record.id)">移除</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item>
|
||||||
|
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
|
||||||
|
<a>删除</a>
|
||||||
|
</a-popconfirm>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
</a-menu>
|
||||||
|
</a-dropdown>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="dbsync" slot-scope="text">
|
||||||
|
<span v-if="text==='Y'" style="color:limegreen">已同步</span>
|
||||||
|
<span v-if="text==='N'" style="color:red">未同步</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
<!-- table区域-end -->
|
||||||
|
|
||||||
|
<!-- 表单区域 -->
|
||||||
|
<onl-cgform-head-modal ref="modalForm" @ok="modalFormOk"></onl-cgform-head-modal>
|
||||||
|
|
||||||
|
<!-- 同步数据库提示框 -->
|
||||||
|
<a-modal
|
||||||
|
:width="500"
|
||||||
|
:height="300"
|
||||||
|
title="同步数据库"
|
||||||
|
:visible="syncModalVisible"
|
||||||
|
@cancel="handleCancleDbSync"
|
||||||
|
style="top:5%;height: 95%;">
|
||||||
|
<template slot="footer">
|
||||||
|
<a-button @click="handleCancleDbSync">关闭</a-button>
|
||||||
|
<a-button type="primary" :loading="syncLoading" @click="handleDbSync">
|
||||||
|
确定
|
||||||
|
</a-button>
|
||||||
|
</template>
|
||||||
|
<a-radio-group v-model="synMethod">
|
||||||
|
<a-radio style="display: block;width: 30px;height: 30px" value="normal">普通同步(保留表数据)</a-radio>
|
||||||
|
<a-radio style="display: block;width: 30px;height: 30px" value="force">强制同步(删除表,重新生成)</a-radio>
|
||||||
|
</a-radio-group>
|
||||||
|
</a-modal>
|
||||||
|
|
||||||
|
<!-- 提示online报表链接 -->
|
||||||
|
<a-modal
|
||||||
|
:title="onlineUrlTitle"
|
||||||
|
:visible="onlineUrlVisible"
|
||||||
|
@cancel="handleOnlineUrlClose">
|
||||||
|
<template slot="footer">
|
||||||
|
<a-button @click="handleOnlineUrlClose">关闭</a-button>
|
||||||
|
<a-button type="primary" class="copy-this-text" :data-clipboard-text="onlineUrl" @click="onCopyUrl">复制</a-button>
|
||||||
|
</template>
|
||||||
|
<p>{{ onlineUrl }}</p>
|
||||||
|
</a-modal>
|
||||||
|
|
||||||
|
<enhance-js ref="ehjs"></enhance-js>
|
||||||
|
<enhance-sql ref="ehsql"></enhance-sql>
|
||||||
|
<enhance-java ref="ehjava"></enhance-java>
|
||||||
|
<trans-db2-online ref="transd2o" @ok="transOk"></trans-db2-online>
|
||||||
|
<code-generator ref="cg"></code-generator>
|
||||||
|
|
||||||
|
<onl-cgform-button-list ref="btnList"></onl-cgform-button-list>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { initDictOptions, filterDictText } from '@/components/dict/JDictSelectUtil'
|
||||||
|
import { deleteAction, postAction } from '@/api/manage'
|
||||||
|
import JDictSelectTag from '../../../../components/dict/JDictSelectTag.vue'
|
||||||
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
|
import Clipboard from 'clipboard'
|
||||||
|
|
||||||
|
import { filterObj } from '@/utils/util';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'OnlCgformHeadList',
|
||||||
|
mixins: [JeecgListMixin],
|
||||||
|
components: {
|
||||||
|
JDictSelectTag,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
description: 'Online表单开发管理页面',
|
||||||
|
// 表头
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '#',
|
||||||
|
dataIndex: '',
|
||||||
|
key: 'rowIndex',
|
||||||
|
width: 60,
|
||||||
|
align: 'center',
|
||||||
|
customRender: function(t, r, index) {
|
||||||
|
return parseInt(index) + 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '表类型',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'tableType',
|
||||||
|
customRender: (text) => {
|
||||||
|
return filterDictText(this.tableTypeDictOptions, `${text}`)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '表名',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'tableName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '表描述',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'tableTxt'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '版本',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'tableVersion'
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: '同步数据库状态',
|
||||||
|
align: 'center',
|
||||||
|
dataIndex: 'isDbSynch',
|
||||||
|
scopedSlots: { customRender: 'dbsync' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'action',
|
||||||
|
align: 'center',
|
||||||
|
scopedSlots: { customRender: 'action' }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
url: {
|
||||||
|
list: '/online/cgform/head/list',
|
||||||
|
delete: '/online/cgform/head/delete',
|
||||||
|
deleteBatch: '/online/cgform/head/deleteBatch',
|
||||||
|
doDbSynch: '/online/cgform/api/doDbSynch/',
|
||||||
|
removeRecord: '/online/cgform/head/removeRecord',
|
||||||
|
copyOnline: '/online/cgform/head/copyOnline'
|
||||||
|
},
|
||||||
|
tableTypeDictOptions: [],
|
||||||
|
sexDictOptions: [],
|
||||||
|
syncModalVisible: false,
|
||||||
|
syncFormId: '',
|
||||||
|
synMethod: 'normal',
|
||||||
|
syncLoading: false,
|
||||||
|
onlineUrlTitle: '',
|
||||||
|
onlineUrlVisible: false,
|
||||||
|
onlineUrl: '',
|
||||||
|
selectedRowKeys: [],
|
||||||
|
selectedRows: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
//初始化字典 - 表类型
|
||||||
|
initDictOptions('cgform_table_type').then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
this.tableTypeDictOptions = res.result
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
doDbSynch(id) {
|
||||||
|
postAction(this.url.doDbSynch + id, { synMethod: '1' }).then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
this.$message.success(res.message)
|
||||||
|
this.loadData()
|
||||||
|
} else {
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getQueryParams() {
|
||||||
|
//获取查询条件
|
||||||
|
var param = Object.assign({}, this.queryParam, this.isorter ,this.filters);
|
||||||
|
param.field = this.getQueryField();
|
||||||
|
param.pageNo = this.ipagination.current;
|
||||||
|
param.pageSize = this.ipagination.pageSize;
|
||||||
|
param.copyType = 0;
|
||||||
|
return filterObj(param);
|
||||||
|
},
|
||||||
|
handleCancleDbSync() {
|
||||||
|
this.syncModalVisible = false
|
||||||
|
},
|
||||||
|
handleDbSync() {
|
||||||
|
this.syncLoading = true
|
||||||
|
postAction(this.url.doDbSynch + this.syncFormId + '/' + this.synMethod).then((res) => {
|
||||||
|
this.syncModalVisible = false
|
||||||
|
this.syncLoading = false
|
||||||
|
if (res.success) {
|
||||||
|
this.$message.success(res.message)
|
||||||
|
this.loadData()
|
||||||
|
} else {
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
setTimeout(()=>{
|
||||||
|
if(this.syncLoading){
|
||||||
|
this.syncModalVisible = false
|
||||||
|
this.syncLoading = false
|
||||||
|
this.$message.success("网络延迟,已自动刷新!")
|
||||||
|
this.loadData()
|
||||||
|
}
|
||||||
|
},10000)
|
||||||
|
},
|
||||||
|
openSyncModal(id) {
|
||||||
|
this.syncModalVisible = true
|
||||||
|
this.syncLoading = false
|
||||||
|
this.syncFormId = id
|
||||||
|
},
|
||||||
|
goPageOnline(rd) {
|
||||||
|
if(rd.isTree=='Y'){
|
||||||
|
this.$router.push({ path: '/online/cgformTreeList/' + rd.id })
|
||||||
|
}else{
|
||||||
|
this.$router.push({ path: '/online/cgformList/' + rd.id })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleOnlineUrlClose() {
|
||||||
|
this.onlineUrlTitle = ''
|
||||||
|
this.onlineUrlVisible = false
|
||||||
|
},
|
||||||
|
handleOnlineUrlShow(record) {
|
||||||
|
if(record.isTree=='Y'){
|
||||||
|
this.onlineUrl = `/online/cgformTreeList/${record.id}`
|
||||||
|
}else{
|
||||||
|
this.onlineUrl = `/online/cgformList/${record.id}`
|
||||||
|
}
|
||||||
|
this.onlineUrlVisible = true
|
||||||
|
this.onlineUrlTitle = '菜单链接[' + record.tableTxt + ']'
|
||||||
|
},
|
||||||
|
handleRemoveRecord(id) {
|
||||||
|
let that = this
|
||||||
|
this.$confirm({
|
||||||
|
title: '确认要移除此记录?',
|
||||||
|
onOk() {
|
||||||
|
deleteAction(that.url.removeRecord, { id: id }).then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
that.$message.success('移除成功')
|
||||||
|
that.loadData()
|
||||||
|
} else {
|
||||||
|
that.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
onCancel() {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
doEnhanceJs() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.ehjs.show(this.selectedRowKeys[0])
|
||||||
|
},
|
||||||
|
doEnhanceSql() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.ehsql.show(this.selectedRowKeys[0])
|
||||||
|
},
|
||||||
|
doEnhanceJava() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.ehjava.show(this.selectedRowKeys[0])
|
||||||
|
},
|
||||||
|
doCgformButton() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.btnList.show(this.selectedRowKeys[0])
|
||||||
|
|
||||||
|
//this.$router.push({ path: '/online/cgformButton/' + this.selectedRowKeys[0] })
|
||||||
|
},
|
||||||
|
importOnlineForm() {
|
||||||
|
this.$refs.transd2o.show()
|
||||||
|
},
|
||||||
|
transOk() {
|
||||||
|
this.loadData()
|
||||||
|
},
|
||||||
|
goGenerateCode() {
|
||||||
|
if (!this.selectedRowKeys || this.selectedRowKeys.length != 1) {
|
||||||
|
this.$message.warning('请先选中一条记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let row = this.selectedRows[0]
|
||||||
|
if (!row.isDbSynch || row.isDbSynch == 'N') {
|
||||||
|
this.$message.warning('请先同步数据库!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (row.tableType == 3) {
|
||||||
|
this.$message.warning('请选中该表对应的主表生成代码')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$refs.cg.show(this.selectedRowKeys[0])
|
||||||
|
},
|
||||||
|
onSelectChange(keys, rows) {
|
||||||
|
this.selectedRowKeys = keys
|
||||||
|
this.selectedRows = rows
|
||||||
|
},
|
||||||
|
onCopyUrl(){
|
||||||
|
var clipboard = new Clipboard('.copy-this-text')
|
||||||
|
clipboard.on('success', () => {
|
||||||
|
clipboard.destroy()
|
||||||
|
this.$message.success('复制成功')
|
||||||
|
this.handleOnlineUrlClose()
|
||||||
|
})
|
||||||
|
clipboard.on('error', () => {
|
||||||
|
this.$message.error('该浏览器不支持自动复制')
|
||||||
|
clipboard.destroy()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
showMyCopyInfo(id){
|
||||||
|
this.$router.push({ path: '/online/copyform/' + id })
|
||||||
|
},
|
||||||
|
copyConfig(id){
|
||||||
|
postAction(`${this.url.copyOnline}?code=${id}`).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.$message.success("复制成功")
|
||||||
|
this.loadData()
|
||||||
|
}else{
|
||||||
|
this.$message.error("复制失败>>"+res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less">
|
||||||
|
.ant-card-body .table-operator {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-table-tbody .ant-table-row td {
|
||||||
|
padding-top: 15px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.anty-row-operator button {
|
||||||
|
margin: 0 5px
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-btn-danger {
|
||||||
|
background-color: #ffffff
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-modal-cust-warp {
|
||||||
|
height: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-modal-cust-warp .ant-modal-body {
|
||||||
|
height: calc(100% - 110px) !important;
|
||||||
|
overflow-y: auto
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-modal-cust-warp .ant-modal-content {
|
||||||
|
height: 90% !important;
|
||||||
|
overflow-y: hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
.valid-error-cust{
|
||||||
|
.ant-select-selection{
|
||||||
|
border:2px solid #f5222d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,724 @@
|
|||||||
|
<template>
|
||||||
|
<a-card :bordered="false" style="height: 100%">
|
||||||
|
<div class="table-page-search-wrapper">
|
||||||
|
<a-form layout="inline">
|
||||||
|
<a-row :gutter="24" v-if="queryInfo && queryInfo.length>0">
|
||||||
|
<template v-for="(item,index) in queryInfo">
|
||||||
|
<template v-if=" item.hidden==='1' ">
|
||||||
|
<a-col v-if="item.view=='datetime'" :md="12" :sm="16" :key=" 'query'+index " v-show="toggleSearchStatus">
|
||||||
|
<online-query-form-item :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></online-query-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col v-else :md="6" :sm="8" :key=" 'query'+index " v-show="toggleSearchStatus">
|
||||||
|
<online-query-form-item :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></online-query-form-item>
|
||||||
|
</a-col>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<a-col v-if="item.view=='datetime'" :md="12" :sm="16" :key=" 'query'+index ">
|
||||||
|
<online-query-form-item :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></online-query-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col v-else :md="6" :sm="8" :key=" 'query'+index ">
|
||||||
|
<online-query-form-item :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></online-query-form-item>
|
||||||
|
</a-col>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<a-col :md="6" :sm="8">
|
||||||
|
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
|
||||||
|
<a-button type="primary" @click="searchByquery" icon="search">查询</a-button>
|
||||||
|
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
|
||||||
|
<a @click="handleToggleSearch" style="margin-left: 8px">
|
||||||
|
{{ toggleSearchStatus ? '收起' : '展开' }}
|
||||||
|
<a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</a-col>
|
||||||
|
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 操作按钮区域 -->
|
||||||
|
<div class="table-operator">
|
||||||
|
<a-button v-if="buttonSwitch.add" @click="handleAdd" type="primary" icon="plus">新增</a-button>
|
||||||
|
<a-button v-if="buttonSwitch.import" @click="handleImportXls" type="primary" icon="upload" style="margin-left:8px">导入</a-button>
|
||||||
|
<a-button v-if="buttonSwitch.export" @click="handleExportXls" type="primary" icon="download" style="margin-left:8px">导出</a-button>
|
||||||
|
<template v-if="cgButtonList && cgButtonList.length>0" v-for="(item,index) in cgButtonList">
|
||||||
|
<a-button
|
||||||
|
v-if=" item.optType=='js' "
|
||||||
|
:key=" 'cgbtn'+index "
|
||||||
|
@click="cgButtonJsHandler(item.buttonCode)"
|
||||||
|
type="primary"
|
||||||
|
:icon="item.buttonIcon"
|
||||||
|
style="margin-left:8px">
|
||||||
|
{{ item.buttonName }}
|
||||||
|
</a-button>
|
||||||
|
<a-button
|
||||||
|
v-else-if=" item.optType=='action' "
|
||||||
|
:key=" 'cgbtn'+index "
|
||||||
|
@click="cgButtonActionHandler(item.buttonCode)"
|
||||||
|
type="primary"
|
||||||
|
:icon="item.buttonIcon"
|
||||||
|
style="margin-left:8px">
|
||||||
|
{{ item.buttonName }}
|
||||||
|
</a-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<a-button
|
||||||
|
v-if="buttonSwitch.batch_delete"
|
||||||
|
@click="handleDelBatch"
|
||||||
|
style="margin-left:8px"
|
||||||
|
v-show="table.selectedRowKeys.length > 0"
|
||||||
|
ghost
|
||||||
|
type="primary"
|
||||||
|
icon="delete">批量删除</a-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
|
||||||
|
<i class="anticon anticon-info-circle ant-alert-icon"></i>
|
||||||
|
已选择 <a style="font-weight: 600">{{ table.selectedRowKeys.length }}</a>项
|
||||||
|
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-table
|
||||||
|
ref="cgformAutoList"
|
||||||
|
bordered
|
||||||
|
size="middle"
|
||||||
|
rowKey="id"
|
||||||
|
:columns="table.columns"
|
||||||
|
:dataSource="table.dataSource"
|
||||||
|
:pagination="table.pagination"
|
||||||
|
:loading="table.loading"
|
||||||
|
:rowSelection="rowSelectionConfig"
|
||||||
|
@change="handleTableChange"
|
||||||
|
:scroll="table.scroll"
|
||||||
|
style="min-height: 300px">
|
||||||
|
|
||||||
|
<template slot="dateSlot" slot-scope="text">
|
||||||
|
<span>{{ getFormatDate(text) }}</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="htmlSlot" slot-scope="text">
|
||||||
|
<div v-html="text"></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="imgSlot" slot-scope="text">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
|
||||||
|
<img v-else :src="getImgView(text)" height="25px" alt="图片不存在" style="max-width:80px;font-size: 12px;font-style: italic;"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="fileSlot" slot-scope="text">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||||
|
<a-button
|
||||||
|
v-else
|
||||||
|
:ghost="true"
|
||||||
|
type="primary"
|
||||||
|
icon="download"
|
||||||
|
size="small"
|
||||||
|
@click="downloadRowFile(text)">
|
||||||
|
下载
|
||||||
|
</a-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<span slot="action" slot-scope="text, record">
|
||||||
|
<template v-if="hasBpmStatus">
|
||||||
|
<template v-if="record.bpm_status == '1'||record.bpm_status == ''|| record.bpm_status == null">
|
||||||
|
<template v-if="buttonSwitch.update">
|
||||||
|
<a @click="handleEdit(record)">编辑</a>
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<template v-if="buttonSwitch.update">
|
||||||
|
<a @click="handleEdit(record)">编辑</a>
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<a-dropdown>
|
||||||
|
<a class="ant-dropdown-link">
|
||||||
|
更多 <a-icon type="down" />
|
||||||
|
</a>
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item >
|
||||||
|
<a href="javascript:;" @click="handleDetail(record)">详情</a>
|
||||||
|
</a-menu-item>
|
||||||
|
<template v-if="hasBpmStatus">
|
||||||
|
<template v-if="record.bpm_status == '1'||record.bpm_status == ''|| record.bpm_status == null">
|
||||||
|
<a-menu-item>
|
||||||
|
<a href="javascript:;" @click="startProcess(record)">提交流程</a>
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item v-if="buttonSwitch.delete">
|
||||||
|
<a-popconfirm title="确定删除吗?" @confirm="() => handleDeleteOne(record)">
|
||||||
|
<a>删除</a>
|
||||||
|
</a-popconfirm>
|
||||||
|
</a-menu-item>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<a-menu-item @click="handlePreviewPic(record)">审批进度</a-menu-item>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<a-menu-item v-if="buttonSwitch.delete">
|
||||||
|
<a-popconfirm title="确定删除吗?" @confirm="() => handleDeleteOne(record)">
|
||||||
|
<a>删除</a>
|
||||||
|
</a-popconfirm>
|
||||||
|
</a-menu-item>
|
||||||
|
</template>
|
||||||
|
<template v-if="cgButtonLinkList && cgButtonLinkList.length>0" v-for="(btnItem,btnIndex) in cgButtonLinkList">
|
||||||
|
<a-menu-item :key=" 'cgbtnLink'+btnIndex ">
|
||||||
|
<a href="javascript:void(0);" @click="cgButtonLinkHandler(record,btnItem.buttonCode,btnItem.optType)">
|
||||||
|
<a-icon v-if="btnItem.buttonIcon" :type="btnItem.buttonIcon" />
|
||||||
|
{{ btnItem.buttonName }}
|
||||||
|
</a>
|
||||||
|
</a-menu-item>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</a-menu>
|
||||||
|
</a-dropdown>
|
||||||
|
</span>
|
||||||
|
</a-table>
|
||||||
|
|
||||||
|
<onl-cgform-auto-modal @success="handleFormSuccess" ref="modal" :code="code"></onl-cgform-auto-modal>
|
||||||
|
|
||||||
|
<j-import-modal ref="importModal" :url="getImportUrl()" @ok="importOk"></j-import-modal>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import { postAction,getAction,deleteAction,downFile } from '@/api/manage'
|
||||||
|
import { filterMultiDictText } from '@/components/dict/JDictSelectUtil'
|
||||||
|
import { filterObj } from '@/utils/util';
|
||||||
|
import JImportModal from '@/components/jeecg/JImportModal'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'OnlCgFormAutoList',
|
||||||
|
components: {
|
||||||
|
JImportModal,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
code: '',
|
||||||
|
description: '在线报表功能测试页面',
|
||||||
|
currentTableName:"",
|
||||||
|
url: {
|
||||||
|
getQueryInfo:'/online/cgform/api/getQueryInfo/',
|
||||||
|
getColumns: '/online/cgform/api/getColumns/',
|
||||||
|
getData: '/online/cgform/api/getData/',
|
||||||
|
optPre:"/online/cgform/api/form/",
|
||||||
|
exportXls:'/online/cgform/api/exportXls/',
|
||||||
|
buttonAction:'/online/cgform/api/doButton',
|
||||||
|
startProcess: "/process/extActProcess/startMutilProcess",
|
||||||
|
},
|
||||||
|
flowCodePre:"onl_",
|
||||||
|
isorter:{
|
||||||
|
column: 'createTime',
|
||||||
|
order: 'desc',
|
||||||
|
},
|
||||||
|
//dictOptions:{fieldName:[]}
|
||||||
|
dictOptions:{
|
||||||
|
|
||||||
|
},
|
||||||
|
cgButtonLinkList:[],
|
||||||
|
cgButtonList:[],
|
||||||
|
queryInfo:[],
|
||||||
|
queryParam:{
|
||||||
|
|
||||||
|
},
|
||||||
|
toggleSearchStatus:false,
|
||||||
|
table: {
|
||||||
|
loading: true,
|
||||||
|
scroll:{x:false},
|
||||||
|
// 表头
|
||||||
|
columns: [],
|
||||||
|
//数据集
|
||||||
|
dataSource: [],
|
||||||
|
// 选择器
|
||||||
|
selectedRowKeys: [],
|
||||||
|
selectionRows: [],
|
||||||
|
// 分页参数
|
||||||
|
pagination: {
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
metaPagination:{
|
||||||
|
current: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
pageSizeOptions: ['10', '20', '30'],
|
||||||
|
showTotal: (total, range) => {
|
||||||
|
return range[0] + '-' + range[1] + ' 共' + total + '条'
|
||||||
|
},
|
||||||
|
showQuickJumper: true,
|
||||||
|
showSizeChanger: true,
|
||||||
|
total: 0
|
||||||
|
},
|
||||||
|
actionColumn:{
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'action',
|
||||||
|
scopedSlots: { customRender: 'action' },
|
||||||
|
fixed:"right",
|
||||||
|
align:"center",
|
||||||
|
width:150
|
||||||
|
},
|
||||||
|
formTemplate:"99",
|
||||||
|
EnhanceJS:'',
|
||||||
|
hideColumns:[],
|
||||||
|
buttonSwitch:{
|
||||||
|
add:true,
|
||||||
|
update:true,
|
||||||
|
delete:true,
|
||||||
|
batch_delete:true,
|
||||||
|
import:true,
|
||||||
|
export:true
|
||||||
|
},
|
||||||
|
hasBpmStatus:false,
|
||||||
|
checkboxFlag:false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.initAutoList();
|
||||||
|
},
|
||||||
|
mounted(){
|
||||||
|
this.cgButtonJsHandler('mounted')
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
'$route'() {
|
||||||
|
// 刷新参数放到这里去触发,就可以刷新相同界面了
|
||||||
|
this.initAutoList()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed:{
|
||||||
|
rowSelectionConfig:function() {
|
||||||
|
if(!this.checkboxFlag){
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
fixed:true,
|
||||||
|
selectedRowKeys:this.table.selectedRowKeys,
|
||||||
|
onChange: this.handleChangeInTableSelect
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
hasBpmStatusFilter(){
|
||||||
|
var columnObjs = this.table.columns;
|
||||||
|
let columns = [];
|
||||||
|
for (var item of columnObjs) {
|
||||||
|
columns.push(item.dataIndex);
|
||||||
|
}
|
||||||
|
if(columns.includes('bpm_status')||columns.includes('BPM_STATUS')){
|
||||||
|
this.hasBpmStatus = true;
|
||||||
|
}else{
|
||||||
|
this.hasBpmStatus = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
startProcess: function(record){
|
||||||
|
var that = this;
|
||||||
|
this.$confirm({
|
||||||
|
title:"提示",
|
||||||
|
content:"确认提交流程吗?",
|
||||||
|
onOk: function(){
|
||||||
|
var param = {
|
||||||
|
flowCode:that.flowCodePre+that.currentTableName,
|
||||||
|
id:record.id,
|
||||||
|
formUrl:"modules/bpm/task/form/OnlineFormDetail",
|
||||||
|
formUrlMobile:"modules/bpm/task/form/OnlineFormDetail"
|
||||||
|
}
|
||||||
|
postAction(that.url.startProcess,param).then((res)=>{
|
||||||
|
if(res.success){
|
||||||
|
that.$message.success(res.message);
|
||||||
|
that.loadData();
|
||||||
|
that.onClearSelected();
|
||||||
|
}else{
|
||||||
|
that.$message.warning(res.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
initQueryInfo(){
|
||||||
|
getAction(`${this.url.getQueryInfo}${this.code}`).then((res)=>{
|
||||||
|
console.log("--onlineList-获取查询条件配置",res);
|
||||||
|
if(res.success){
|
||||||
|
this.queryInfo = res.result
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
initAutoList(){
|
||||||
|
if(!this.$route.params.code){
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
this.table.loading = true
|
||||||
|
this.code = this.$route.params.code
|
||||||
|
getAction(`${this.url.getColumns}${this.code}`).then((res)=>{
|
||||||
|
console.log("--onlineList-加载动态列>>",res);
|
||||||
|
if(res.success){
|
||||||
|
if(res.result.checkboxFlag == 'Y'){
|
||||||
|
this.checkboxFlag = true
|
||||||
|
}else{
|
||||||
|
this.checkboxFlag = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if(res.result.paginationFlag=='Y'){
|
||||||
|
this.table.pagination = {...this.metaPagination}
|
||||||
|
}else{
|
||||||
|
this.table.pagination = false
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dictOptions = res.result.dictOptions
|
||||||
|
this.formTemplate = res.result.formTemplate
|
||||||
|
this.description = res.result.description
|
||||||
|
this.currentTableName = res.result.currentTableName
|
||||||
|
this.initCgButtonList(res.result.cgButtonList)
|
||||||
|
this.initCgEnhanceJs(res.result.enhanceJs)
|
||||||
|
this.initButtonSwitch(res.result.hideColumns)
|
||||||
|
let currColumns = res.result.columns
|
||||||
|
for(let a=0;a<currColumns.length;a++){
|
||||||
|
if(currColumns[a].customRender){
|
||||||
|
let dictCode = currColumns[a].customRender;
|
||||||
|
let replaceFlag = '_replace_text_';
|
||||||
|
if(dictCode.startsWith(replaceFlag)){
|
||||||
|
let textFieldName = dictCode.replace(replaceFlag,'')
|
||||||
|
currColumns[a].customRender=(text,record)=>{
|
||||||
|
return record[textFieldName]
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
currColumns[a].customRender=(text)=>{
|
||||||
|
return filterMultiDictText(this.dictOptions[dictCode], text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(res.result.scrollFlag==1){
|
||||||
|
this.table.scroll = { x :'115%' }
|
||||||
|
}else{
|
||||||
|
this.table.scroll = { x :false }
|
||||||
|
}
|
||||||
|
currColumns.push(this.actionColumn);
|
||||||
|
this.table.columns = [...currColumns]
|
||||||
|
this.hasBpmStatusFilter();
|
||||||
|
this.loadData();
|
||||||
|
this.initQueryInfo();
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
loadData(arg){
|
||||||
|
if(this.table.pagination){
|
||||||
|
if(arg==1){
|
||||||
|
this.table.pagination.current=1
|
||||||
|
}
|
||||||
|
let params = this.getQueryParams();//查询条件
|
||||||
|
console.log("--onlineList-查询条件-->",params)
|
||||||
|
getAction(`${this.url.getData}${this.code}`,params).then((res)=>{
|
||||||
|
console.log("--onlineList-列表数据",res)
|
||||||
|
if(res.success){
|
||||||
|
let result = res.result;
|
||||||
|
if(Number(result.total)>0){
|
||||||
|
this.table.pagination.total = Number(result.total)
|
||||||
|
this.table.dataSource = result.records
|
||||||
|
}else{
|
||||||
|
this.table.pagination.total=0;
|
||||||
|
this.table.dataSource=[]
|
||||||
|
//this.$message.warning("查无数据")
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
this.table.loading = false
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
this.loadDataNoPage()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
loadDataNoPage(){
|
||||||
|
let param = Object.assign({}, this.queryParam,this.isorter);
|
||||||
|
param['pageSize'] = -521;
|
||||||
|
getAction(`${this.url.getData}${this.code}`,filterObj(param)).then((res)=>{
|
||||||
|
console.log("--onlineList-列表数据",res)
|
||||||
|
if(res.success){
|
||||||
|
let result = res.result;
|
||||||
|
if(Number(result.total)>0){
|
||||||
|
this.table.dataSource = result.records
|
||||||
|
}else{
|
||||||
|
this.table.dataSource=[]
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
this.table.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getQueryParams() {
|
||||||
|
let param = Object.assign({}, this.queryParam,this.isorter);
|
||||||
|
param.pageNo = this.table.pagination.current;
|
||||||
|
param.pageSize = this.table.pagination.pageSize;
|
||||||
|
return filterObj(param);
|
||||||
|
},
|
||||||
|
handleChangeInTableSelect(selectedRowKeys, selectionRows) {
|
||||||
|
this.table.selectedRowKeys = selectedRowKeys
|
||||||
|
this.table.selectionRows = selectionRows
|
||||||
|
this.selectedRowKeys = selectedRowKeys
|
||||||
|
},
|
||||||
|
handleTableChange(pagination, filters, sorter){
|
||||||
|
//TODO 筛选
|
||||||
|
if (Object.keys(sorter).length>0){
|
||||||
|
this.isorter.column = sorter.field;
|
||||||
|
this.isorter.order = "ascend"==sorter.order?"asc":"desc"
|
||||||
|
}
|
||||||
|
this.table.pagination = pagination;
|
||||||
|
this.loadData();
|
||||||
|
},
|
||||||
|
handleAdd(){
|
||||||
|
this.cgButtonJsHandler('beforeAdd')
|
||||||
|
this.$refs.modal.add(this.formTemplate);
|
||||||
|
},
|
||||||
|
handleImportXls(){
|
||||||
|
this.$refs.importModal.show()
|
||||||
|
},
|
||||||
|
importOk(){
|
||||||
|
this.loadData(1)
|
||||||
|
},
|
||||||
|
handleExportXls2(){
|
||||||
|
let param = this.queryParam;
|
||||||
|
if(this.table.selectedRowKeys && this.table.selectedRowKeys.length>0){
|
||||||
|
param['selections'] = this.table.selectedRowKeys.join(",")
|
||||||
|
}
|
||||||
|
let paramsStr = encodeURI(JSON.stringify(param));
|
||||||
|
console.log('paramsStr: ' + paramsStr)
|
||||||
|
let url = window._CONFIG['domianURL']+this.url.exportXls+this.code+"?paramsStr="+paramsStr
|
||||||
|
window.location.href = url;
|
||||||
|
},
|
||||||
|
handleExportXls(){
|
||||||
|
let param = this.queryParam;
|
||||||
|
if(this.table.selectedRowKeys && this.table.selectedRowKeys.length>0){
|
||||||
|
param['selections'] = this.table.selectedRowKeys.join(",")
|
||||||
|
}
|
||||||
|
console.log("导出参数",param)
|
||||||
|
let paramsStr = JSON.stringify(filterObj(param));
|
||||||
|
downFile(this.url.exportXls+this.code,{paramsStr:paramsStr}).then((data)=>{
|
||||||
|
if (!data) {
|
||||||
|
this.$message.warning("文件下载失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (typeof window.navigator.msSaveBlob !== 'undefined') {
|
||||||
|
window.navigator.msSaveBlob(new Blob([data]), this.description+'.xls')
|
||||||
|
}else{
|
||||||
|
let url = window.URL.createObjectURL(new Blob([data]))
|
||||||
|
let link = document.createElement('a')
|
||||||
|
link.style.display = 'none'
|
||||||
|
link.href = url
|
||||||
|
link.setAttribute('download', this.description+'.xls')
|
||||||
|
document.body.appendChild(link)
|
||||||
|
link.click()
|
||||||
|
document.body.removeChild(link); //下载完成移除元素
|
||||||
|
window.URL.revokeObjectURL(url); //释放掉blob对象
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleEdit(record){
|
||||||
|
this.cgButtonLinkHandler(record,"beforeEdit","js")
|
||||||
|
this.$refs.modal.edit(this.formTemplate,record.id);
|
||||||
|
},
|
||||||
|
handleDetail(record){
|
||||||
|
this.$refs.modal.detail(this.formTemplate,record.id);
|
||||||
|
},
|
||||||
|
handleDeleteOne(record){
|
||||||
|
this.cgButtonLinkHandler(record,"beforeDelete","js")
|
||||||
|
this.handleDelete(record.id)
|
||||||
|
},
|
||||||
|
handleDelete(id){
|
||||||
|
deleteAction(this.url.optPre+this.code+"/"+id).then((res)=>{
|
||||||
|
if(res.success){
|
||||||
|
this.$message.success(res.message)
|
||||||
|
this.loadData()
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleFormSuccess(){
|
||||||
|
this.loadData()
|
||||||
|
},
|
||||||
|
onClearSelected(){
|
||||||
|
this.table.selectedRowKeys = []
|
||||||
|
this.table.selectionRows = []
|
||||||
|
},
|
||||||
|
getImgView(text){
|
||||||
|
if(text && text.indexOf(",")>0){
|
||||||
|
text = text.substring(0,text.indexOf(","))
|
||||||
|
}
|
||||||
|
return window._CONFIG['imgDomainURL']+"/"+text
|
||||||
|
},
|
||||||
|
downloadRowFile(text){
|
||||||
|
if(!text){
|
||||||
|
this.$message.warning("未知的文件")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(text.indexOf(",")>0){
|
||||||
|
text = text.substring(0,text.indexOf(","))
|
||||||
|
}
|
||||||
|
window.open(window._CONFIG['downloadUrl']+"/"+text);//TODO 下载的方法
|
||||||
|
},
|
||||||
|
handleDelBatch(){
|
||||||
|
if(this.table.selectedRowKeys.length<=0){
|
||||||
|
this.$message.warning('请选择一条记录!');
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
let ids = "";
|
||||||
|
let that = this;
|
||||||
|
that.table.selectedRowKeys.forEach(function(val) {
|
||||||
|
ids+=val+",";
|
||||||
|
});
|
||||||
|
that.$confirm({
|
||||||
|
title:"确认删除",
|
||||||
|
content:"是否删除选中数据?",
|
||||||
|
onOk: function(){
|
||||||
|
that.handleDelete(ids)
|
||||||
|
that.onClearSelected();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
searchByquery(){
|
||||||
|
this.loadData(1);
|
||||||
|
},
|
||||||
|
searchReset(){
|
||||||
|
this.queryParam = {}
|
||||||
|
this.loadData(1);
|
||||||
|
},
|
||||||
|
handleToggleSearch(){
|
||||||
|
this.toggleSearchStatus = !this.toggleSearchStatus;
|
||||||
|
},
|
||||||
|
getFormatDate(text){
|
||||||
|
if(!text){
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
let a = text;
|
||||||
|
if(a.length>10){
|
||||||
|
a = a.substring(0,10);
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
getImportUrl(){
|
||||||
|
return '/online/cgform/api/importXls/'+this.code
|
||||||
|
},
|
||||||
|
initCgEnhanceJs(enhanceJs){
|
||||||
|
//console.log("--onlineList-js增强",enhanceJs)
|
||||||
|
if(enhanceJs){
|
||||||
|
let Obj = eval ("(" + enhanceJs + ")");
|
||||||
|
this.EnhanceJS = new Obj(getAction,postAction,deleteAction);
|
||||||
|
this.cgButtonJsHandler('created')
|
||||||
|
}else{
|
||||||
|
this.EnhanceJS = ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initCgButtonList(btnList){
|
||||||
|
let linkArr = []
|
||||||
|
let buttonArr = []
|
||||||
|
if(btnList && btnList.length>0){
|
||||||
|
for(let i=0;i<btnList.length;i++){
|
||||||
|
let temp = btnList[i]
|
||||||
|
if(temp.buttonStyle=='button'){
|
||||||
|
buttonArr.push(temp)
|
||||||
|
}else if(temp.buttonStyle=='link'){
|
||||||
|
linkArr.push(temp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.cgButtonLinkList = [...linkArr]
|
||||||
|
this.cgButtonList=[...buttonArr]
|
||||||
|
},
|
||||||
|
cgButtonJsHandler(buttonCode){
|
||||||
|
if(this.EnhanceJS[buttonCode]){
|
||||||
|
this.EnhanceJS[buttonCode](this)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cgButtonActionHandler(buttonCode){
|
||||||
|
//处理自定义button的 需要配置该button自定义sql
|
||||||
|
if(!this.table.selectedRowKeys || this.table.selectedRowKeys.length==0){
|
||||||
|
this.$message.warning("请先选中一条记录")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if(this.table.selectedRowKeys.length>1){
|
||||||
|
this.$message.warning("请只选中一条记录")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
let params = {
|
||||||
|
formId:this.code,
|
||||||
|
buttonCode:buttonCode,
|
||||||
|
dataId:this.table.selectedRowKeys[0]
|
||||||
|
}
|
||||||
|
console.log("自定义按钮请求后台参数:",params)
|
||||||
|
postAction(this.url.buttonAction,params).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.loadData()
|
||||||
|
this.$message.success("处理完成!")
|
||||||
|
}else{
|
||||||
|
this.$message.warning("处理失败!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
},
|
||||||
|
cgButtonLinkHandler(record,buttonCode,optType){
|
||||||
|
if(optType=="js"){
|
||||||
|
if(this.EnhanceJS[buttonCode]){
|
||||||
|
this.EnhanceJS[buttonCode](this,record)
|
||||||
|
}
|
||||||
|
}else if(optType=="action"){
|
||||||
|
let params = {
|
||||||
|
formId:this.code,
|
||||||
|
buttonCode:buttonCode,
|
||||||
|
dataId:record.id
|
||||||
|
}
|
||||||
|
console.log("自定义按钮link请求后台参数:",params)
|
||||||
|
postAction(this.url.buttonAction,params).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.loadData()
|
||||||
|
this.$message.success("处理完成!")
|
||||||
|
}else{
|
||||||
|
this.$message.warning("处理失败!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initButtonSwitch(hideColumns){
|
||||||
|
if(hideColumns && hideColumns.length>0){
|
||||||
|
Object.keys(this.buttonSwitch).forEach(key=>{
|
||||||
|
if(hideColumns.indexOf(key)>=0){
|
||||||
|
this.buttonSwitch[key]=false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.ant-card-body .table-operator{
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.ant-table-tbody .ant-table-row td{
|
||||||
|
padding-top:15px;
|
||||||
|
padding-bottom:15px;
|
||||||
|
}
|
||||||
|
.anty-row-operator button{margin: 0 5px}
|
||||||
|
.ant-btn-danger{background-color: #ffffff}
|
||||||
|
|
||||||
|
.anty-img-wrap{height:25px;position: relative;}
|
||||||
|
.anty-img-wrap > img{max-height:100%;}
|
||||||
|
.ant-modal-cust-warp{height: 100%}
|
||||||
|
.ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
|
||||||
|
.ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,721 @@
|
|||||||
|
<template>
|
||||||
|
<a-card :bordered="false" style="height: 100%">
|
||||||
|
<!-- 操作按钮区域 -->
|
||||||
|
<div class="table-operator">
|
||||||
|
<a-button v-if="buttonSwitch.add" @click="handleAdd" type="primary" icon="plus">新增</a-button>
|
||||||
|
<a-button v-if="buttonSwitch.import" @click="handleImportXls" type="primary" icon="upload" style="margin-left:8px">导入</a-button>
|
||||||
|
<a-button v-if="buttonSwitch.export" @click="handleExportXls" type="primary" icon="download" style="margin-left:8px">导出</a-button>
|
||||||
|
<template v-if="cgButtonList && cgButtonList.length>0" v-for="(item,index) in cgButtonList">
|
||||||
|
<a-button
|
||||||
|
v-if=" item.optType=='js' "
|
||||||
|
:key=" 'cgbtn'+index "
|
||||||
|
@click="cgButtonJsHandler(item.buttonCode)"
|
||||||
|
type="primary"
|
||||||
|
:icon="item.buttonIcon"
|
||||||
|
style="margin-left:8px">
|
||||||
|
{{ item.buttonName }}
|
||||||
|
</a-button>
|
||||||
|
<a-button
|
||||||
|
v-else-if=" item.optType=='action' "
|
||||||
|
:key=" 'cgbtn'+index "
|
||||||
|
@click="cgButtonActionHandler(item.buttonCode)"
|
||||||
|
type="primary"
|
||||||
|
:icon="item.buttonIcon"
|
||||||
|
style="margin-left:8px">
|
||||||
|
{{ item.buttonName }}
|
||||||
|
</a-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<a-button
|
||||||
|
v-if="buttonSwitch.batch_delete"
|
||||||
|
@click="handleDelBatch"
|
||||||
|
style="margin-left:8px"
|
||||||
|
v-show="selectedRowKeys.length > 0"
|
||||||
|
ghost
|
||||||
|
type="primary"
|
||||||
|
icon="delete">批量删除</a-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
|
||||||
|
<i class="anticon anticon-info-circle ant-alert-icon"></i>
|
||||||
|
已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
|
||||||
|
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-table
|
||||||
|
ref="cgformTreeList"
|
||||||
|
size="middle"
|
||||||
|
rowKey="id"
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:pagination="pagination"
|
||||||
|
:loading="loading"
|
||||||
|
@change="handleTableChange"
|
||||||
|
v-bind="tableProps"
|
||||||
|
@expand="handleExpand"
|
||||||
|
style="min-height: 300px"
|
||||||
|
:expandedRowKeys="expandedRowKeys">
|
||||||
|
|
||||||
|
<template slot="dateSlot" slot-scope="text">
|
||||||
|
<span>{{ getDateNoTime(text) }}</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="htmlSlot" slot-scope="text">
|
||||||
|
<div v-html="text"></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="imgSlot" slot-scope="text">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
|
||||||
|
<img v-else :src="getImgView(text)" height="25px" alt="图片不存在" style="max-width:80px;font-size: 12px;font-style: italic;"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template slot="fileSlot" slot-scope="text">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||||
|
<a-button
|
||||||
|
v-else
|
||||||
|
:ghost="true"
|
||||||
|
type="primary"
|
||||||
|
icon="download"
|
||||||
|
size="small"
|
||||||
|
@click="downloadRowFile(text)">
|
||||||
|
下载
|
||||||
|
</a-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<span slot="action" slot-scope="text, record">
|
||||||
|
|
||||||
|
<template v-if="showOptButton('update',record)">
|
||||||
|
<a @click="handleEdit(record)">编辑</a>
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<a-dropdown>
|
||||||
|
<a class="ant-dropdown-link">
|
||||||
|
更多 <a-icon type="down" />
|
||||||
|
</a>
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item >
|
||||||
|
<a @click="handleDetail(record)">详情</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item v-if="showSubmitFlowButton(record)">
|
||||||
|
<a @click="startProcess(record)">提交流程</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<template v-if="showViewFlowButton(record)">
|
||||||
|
<a-menu-item @click="handlePreviewPic(record)">审批进度</a-menu-item>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<a-menu-item v-if="showOptButton('delete',record)">
|
||||||
|
<a-popconfirm title="确定删除吗?" @confirm="() => handleDeleteOne(record)">
|
||||||
|
<a>删除</a>
|
||||||
|
</a-popconfirm>
|
||||||
|
</a-menu-item>
|
||||||
|
<!-- 自定义按钮 -->
|
||||||
|
<template v-if="cgButtonLinkList && cgButtonLinkList.length>0" v-for="(btnItem,btnIndex) in cgButtonLinkList">
|
||||||
|
<a-menu-item :key=" 'cgbtnLink'+btnIndex ">
|
||||||
|
<a href="javascript:void(0);" @click="cgButtonLinkHandler(record,btnItem.buttonCode,btnItem.optType)">
|
||||||
|
<a-icon v-if="btnItem.buttonIcon" :type="btnItem.buttonIcon" />
|
||||||
|
{{ btnItem.buttonName }}
|
||||||
|
</a>
|
||||||
|
</a-menu-item>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</a-menu>
|
||||||
|
</a-dropdown>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</a-table>
|
||||||
|
|
||||||
|
<onl-cgform-auto-modal @success="handleFormSuccess" ref="modal" :code="code"></onl-cgform-auto-modal>
|
||||||
|
|
||||||
|
<j-import-modal ref="importModal" :url="getImportUrl()" @ok="importOk"></j-import-modal>
|
||||||
|
|
||||||
|
<process-inst-pic-modal ref="processInstPicModal"></process-inst-pic-modal>
|
||||||
|
</div>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import { getAction,postAction,deleteAction,downFile } from '@/api/manage'
|
||||||
|
import { filterMultiDictText } from '@/components/dict/JDictSelectUtil'
|
||||||
|
import { filterObj } from '@/utils/util';
|
||||||
|
import JImportModal from '@/components/jeecg/JImportModal'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'OnlCgformTreeList',
|
||||||
|
components: {
|
||||||
|
JImportModal,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
code: '87b55a515d3441b6b98e48e5b35474a6',
|
||||||
|
description: '在线报表功能测试页面',
|
||||||
|
currentTableName:"",
|
||||||
|
pidField:"",
|
||||||
|
hasChildrenField:"",
|
||||||
|
textField:'',
|
||||||
|
loading: false,
|
||||||
|
// 表头
|
||||||
|
columns: [],
|
||||||
|
//数据集
|
||||||
|
dataSource: [],
|
||||||
|
// 选择器
|
||||||
|
selectedRowKeys: [],
|
||||||
|
selectionRows: [],
|
||||||
|
// 分页参数
|
||||||
|
pagination: {
|
||||||
|
current: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
pageSizeOptions: ['10', '20', '30'],
|
||||||
|
showTotal: (total, range) => {
|
||||||
|
return range[0] + '-' + range[1] + ' 共' + total + '条'
|
||||||
|
},
|
||||||
|
showQuickJumper: true,
|
||||||
|
showSizeChanger: true,
|
||||||
|
total: 0
|
||||||
|
},
|
||||||
|
|
||||||
|
url: {
|
||||||
|
getColumns: '/online/cgform/api/getColumns/',
|
||||||
|
getTreeData: '/online/cgform/api/getTreeData/',
|
||||||
|
optPre:"/online/cgform/api/form/",
|
||||||
|
exportXls:'/online/cgform/api/exportXls/',
|
||||||
|
buttonAction:'/online/cgform/api/doButton',
|
||||||
|
startProcess: "/process/extActProcess/startMutilProcess"
|
||||||
|
},
|
||||||
|
isorter:{
|
||||||
|
column: 'create_time',
|
||||||
|
order: 'desc',
|
||||||
|
},
|
||||||
|
dictOptions:{
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
queryParam:{
|
||||||
|
|
||||||
|
},
|
||||||
|
actionColumn:{
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'action',
|
||||||
|
scopedSlots: { customRender: 'action' },
|
||||||
|
fixed:"right",
|
||||||
|
align:"center",
|
||||||
|
width:150
|
||||||
|
},
|
||||||
|
formTemplate:"99",
|
||||||
|
|
||||||
|
/*自定义按钮-link*/
|
||||||
|
cgButtonLinkList:[],
|
||||||
|
/*自定义按钮-button*/
|
||||||
|
cgButtonList:[],
|
||||||
|
/*JS增强*/
|
||||||
|
EnhanceJS:'',
|
||||||
|
/*操作按钮权限*/
|
||||||
|
buttonSwitch:{
|
||||||
|
add:true,
|
||||||
|
update:true,
|
||||||
|
delete:true,
|
||||||
|
batch_delete:true,
|
||||||
|
import:true,
|
||||||
|
export:true
|
||||||
|
},
|
||||||
|
expandedRowKeys:[],
|
||||||
|
hasBpmStatus:false,
|
||||||
|
flowCodePre:"onl_",
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.initAutoListConfig().then(()=>{
|
||||||
|
this.loadData(1)
|
||||||
|
}).catch(msg=>{
|
||||||
|
console.log(msg)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
mounted(){
|
||||||
|
//this.cgButtonJsHandler('mounted')
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
'$route'() {
|
||||||
|
// 刷新参数放到这里去触发,就可以刷新相同界面了
|
||||||
|
this.initAutoListConfig().then(()=>{
|
||||||
|
this.loadData(1)
|
||||||
|
}).catch(msg=>{
|
||||||
|
console.log(msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
tableProps() {
|
||||||
|
let _this = this
|
||||||
|
return {
|
||||||
|
// 列表项是否可选择
|
||||||
|
// https://vue.ant.design/components/table-cn/#rowSelection
|
||||||
|
rowSelection: {
|
||||||
|
selectedRowKeys: _this.selectedRowKeys,
|
||||||
|
onChange: (selectedRowKeys) => _this.selectedRowKeys = selectedRowKeys
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
resetData(){
|
||||||
|
this.description=''
|
||||||
|
this.currentTableName=''
|
||||||
|
this.pidField=''
|
||||||
|
this.hasChildrenField=''
|
||||||
|
this.textField=''
|
||||||
|
this.columns = []
|
||||||
|
this.dataSource = []
|
||||||
|
this.selectedRowKeys=[]
|
||||||
|
this.selectionRows=[]
|
||||||
|
},
|
||||||
|
initAutoListConfig() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (!this.$route.params.code) {
|
||||||
|
reject("列表加载需要参数CODE为空!")
|
||||||
|
} else {
|
||||||
|
this.resetData()
|
||||||
|
this.loading = true
|
||||||
|
this.code = this.$route.params.code
|
||||||
|
getAction(`${this.url.getColumns}${this.code}`)
|
||||||
|
.then(res => {
|
||||||
|
console.log("--onlineList-加载动态列>>", res);
|
||||||
|
if(res.success){
|
||||||
|
this.configInfohandler(res)
|
||||||
|
resolve();
|
||||||
|
}else{
|
||||||
|
reject("onlineList-加载表配置信息失败")
|
||||||
|
}
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
configInfohandler(res){
|
||||||
|
this.dictOptions = res.result.dictOptions
|
||||||
|
this.formTemplate = res.result.formTemplate
|
||||||
|
this.description = res.result.description
|
||||||
|
this.currentTableName = res.result.currentTableName
|
||||||
|
this.pidField = res.result.pidField
|
||||||
|
this.hasChildrenField = res.result.hasChildrenField
|
||||||
|
this.textField = res.result.textField
|
||||||
|
//自定义按钮
|
||||||
|
this.initCgButtonList(res.result.cgButtonList)
|
||||||
|
//JS增强
|
||||||
|
this.initCgEnhanceJs(res.result.enhanceJs)
|
||||||
|
//操作按钮权限
|
||||||
|
this.initButtonSwitch(res.result.hideColumns)
|
||||||
|
let currColumns = res.result.columns
|
||||||
|
let textFieldIndex = -1
|
||||||
|
let hasBpmStatus = false
|
||||||
|
for(let a=0;a<currColumns.length;a++){
|
||||||
|
currColumns[a].align = 'left'
|
||||||
|
//找到显示列
|
||||||
|
if(this.textField==currColumns[a].dataIndex){
|
||||||
|
textFieldIndex = a
|
||||||
|
}
|
||||||
|
//数据字典翻译
|
||||||
|
if(currColumns[a].customRender){
|
||||||
|
let dictCode = currColumns[a].customRender;
|
||||||
|
currColumns[a].customRender=(text)=>{
|
||||||
|
return filterMultiDictText(this.dictOptions[dictCode], text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//判断是否有bpm_status
|
||||||
|
if(currColumns[a].dataIndex.toLowerCase()=='bpm_status'){
|
||||||
|
hasBpmStatus = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.hasBpmStatus = hasBpmStatus;
|
||||||
|
|
||||||
|
if(textFieldIndex!=-1){
|
||||||
|
let textFieldColumn = currColumns.splice(textFieldIndex,1)
|
||||||
|
currColumns.unshift(textFieldColumn[0])
|
||||||
|
}
|
||||||
|
currColumns.push(this.actionColumn);
|
||||||
|
this.columns = [...currColumns]
|
||||||
|
},
|
||||||
|
//加载根节点
|
||||||
|
loadData(arg){
|
||||||
|
if(arg==1){
|
||||||
|
this.pagination.current=1
|
||||||
|
}
|
||||||
|
this.loading = true
|
||||||
|
this.expandedRowKeys=[]
|
||||||
|
let params = this.getQueryParams();//查询条件
|
||||||
|
params[this.pidField]='0'
|
||||||
|
console.log("--onlineList-查询条件-->",params)
|
||||||
|
getAction(`${this.url.getTreeData}${this.code}`,params).then((res)=>{
|
||||||
|
console.log("--onlineList-列表数据",res)
|
||||||
|
if(res.success){
|
||||||
|
let result = res.result;
|
||||||
|
if(Number(result.total)>0){
|
||||||
|
this.pagination.total = Number(result.total)
|
||||||
|
let dataSource = res.result.records.map(item => {
|
||||||
|
// 判断是否标记了带有子级
|
||||||
|
if (item[this.hasChildrenField] === true || item[this.hasChildrenField]=='1') {
|
||||||
|
let loadChild = { id: `${item.id}_loadChild`, name: 'loading...', isLoading: true }
|
||||||
|
item.children = [loadChild]
|
||||||
|
}
|
||||||
|
return item
|
||||||
|
})
|
||||||
|
this.dataSource = dataSource
|
||||||
|
}else{
|
||||||
|
this.pagination.total=0;
|
||||||
|
this.dataSource=[]
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
//加载叶子节点
|
||||||
|
handleExpand(expanded, record) {
|
||||||
|
// 判断是否是展开状态
|
||||||
|
if (expanded) {
|
||||||
|
this.expandedRowKeys.push(record.id)
|
||||||
|
if (record.children.length>0 && record.children[0].isLoading === true) {
|
||||||
|
let params = this.getQueryParams();//查询条件
|
||||||
|
params[this.pidField] = record.id
|
||||||
|
getAction(`${this.url.getTreeData}${this.code}`,params).then((res)=>{
|
||||||
|
if(res.success){
|
||||||
|
if(Number(res.result.total)>0){
|
||||||
|
let dataSource = res.result.records.map(item => {
|
||||||
|
// 判断是否标记了带有子级
|
||||||
|
if (item[this.hasChildrenField] === true || item[this.hasChildrenField]=='1') {
|
||||||
|
let loadChild = { id: `${item.id}_loadChild`, name: 'loading...', isLoading: true }
|
||||||
|
item.children = [loadChild]
|
||||||
|
}
|
||||||
|
return item
|
||||||
|
})
|
||||||
|
record.children = dataSource
|
||||||
|
}else{
|
||||||
|
record.children=''
|
||||||
|
record.hasChildrenField='0'
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
let keyIndex = this.expandedRowKeys.indexOf(record.id)
|
||||||
|
if(keyIndex>=0){
|
||||||
|
this.expandedRowKeys.splice(keyIndex, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getQueryParams() {
|
||||||
|
let param = Object.assign({}, this.queryParam,this.isorter);
|
||||||
|
param.pageNo = this.pagination.current;
|
||||||
|
param.pageSize = this.pagination.pageSize;
|
||||||
|
return filterObj(param);
|
||||||
|
},
|
||||||
|
initCgButtonList(btnList){
|
||||||
|
let linkArr = []
|
||||||
|
let buttonArr = []
|
||||||
|
if(btnList && btnList.length>0){
|
||||||
|
for(let i=0;i<btnList.length;i++){
|
||||||
|
let temp = btnList[i]
|
||||||
|
if(temp.buttonStyle=='button'){
|
||||||
|
buttonArr.push(temp)
|
||||||
|
}else if(temp.buttonStyle=='link'){
|
||||||
|
linkArr.push(temp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.cgButtonLinkList = [...linkArr]
|
||||||
|
this.cgButtonList=[...buttonArr]
|
||||||
|
},
|
||||||
|
initCgEnhanceJs(enhanceJs){
|
||||||
|
//console.log("--onlineList-js增强",enhanceJs)
|
||||||
|
if(enhanceJs){
|
||||||
|
let Obj = eval ("(" + enhanceJs + ")");
|
||||||
|
this.EnhanceJS = new Obj(getAction,postAction,deleteAction);
|
||||||
|
this.cgButtonJsHandler('created')
|
||||||
|
}else{
|
||||||
|
this.EnhanceJS = ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initButtonSwitch(hideColumns){
|
||||||
|
if(hideColumns && hideColumns.length>0){
|
||||||
|
Object.keys(this.buttonSwitch).forEach(key=>{
|
||||||
|
if(hideColumns.indexOf(key)>=0){
|
||||||
|
this.buttonSwitch[key]=false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onClearSelected(){
|
||||||
|
this.selectedRowKeys = []
|
||||||
|
this.selectionRows = []
|
||||||
|
},
|
||||||
|
handleTableChange(pagination, filters, sorter){
|
||||||
|
//TODO 筛选
|
||||||
|
if (Object.keys(sorter).length>0){
|
||||||
|
this.isorter.column = sorter.field;
|
||||||
|
this.isorter.order = "ascend"==sorter.order?"asc":"desc"
|
||||||
|
}
|
||||||
|
this.pagination = pagination;
|
||||||
|
this.loadData();
|
||||||
|
},
|
||||||
|
/*-------数据格式化-begin----------*/
|
||||||
|
getDateNoTime(text){
|
||||||
|
if(!text){
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
let a = text;
|
||||||
|
if(a.length>10){
|
||||||
|
a = a.substring(0,10);
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
},
|
||||||
|
getImgView(text){
|
||||||
|
if(text && text.indexOf(",")>0){
|
||||||
|
text = text.substring(0,text.indexOf(","))
|
||||||
|
}
|
||||||
|
return window._CONFIG['imgDomainURL']+"/"+text
|
||||||
|
},
|
||||||
|
downloadRowFile(text){
|
||||||
|
if(!text){
|
||||||
|
this.$message.warning("未知的文件")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(text.indexOf(",")>0){
|
||||||
|
text = text.substring(0,text.indexOf(","))
|
||||||
|
}
|
||||||
|
window.open(window._CONFIG['downloadUrl']+"/"+text);
|
||||||
|
},
|
||||||
|
/*-------数据格式化-end----------*/
|
||||||
|
|
||||||
|
/*-------功能按钮触发事件-begin----------*/
|
||||||
|
handleEdit(record){
|
||||||
|
this.cgButtonLinkHandler(record,"beforeEdit","js")
|
||||||
|
this.$refs.modal.edit(this.formTemplate,record.id);
|
||||||
|
},
|
||||||
|
handleDetail(record){
|
||||||
|
this.$refs.modal.detail(this.formTemplate,record.id);
|
||||||
|
},
|
||||||
|
handleDeleteOne(record){
|
||||||
|
this.cgButtonLinkHandler(record,"beforeDelete","js")
|
||||||
|
this.handleDelete(record.id)
|
||||||
|
},
|
||||||
|
handleDelete(id){
|
||||||
|
deleteAction(this.url.optPre+this.code+"/"+id).then((res)=>{
|
||||||
|
if(res.success){
|
||||||
|
this.$message.success(res.message)
|
||||||
|
this.loadData()
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleAdd(){
|
||||||
|
this.cgButtonJsHandler('beforeAdd')
|
||||||
|
this.$refs.modal.add(this.formTemplate);
|
||||||
|
},
|
||||||
|
handleFormSuccess(){
|
||||||
|
this.loadData()
|
||||||
|
},
|
||||||
|
handleImportXls(){
|
||||||
|
this.$refs.importModal.show()
|
||||||
|
},
|
||||||
|
importOk(){
|
||||||
|
this.loadData(1)
|
||||||
|
},
|
||||||
|
getImportUrl(){
|
||||||
|
return '/online/cgform/api/importXls/'+this.code
|
||||||
|
},
|
||||||
|
handleExportXls(){
|
||||||
|
let param = this.queryParam;
|
||||||
|
if(this.selectedRowKeys && this.selectedRowKeys.length>0){
|
||||||
|
param['selections'] = this.selectedRowKeys.join(",")
|
||||||
|
}
|
||||||
|
console.log("导出参数",param)
|
||||||
|
let paramsStr = JSON.stringify(filterObj(param));
|
||||||
|
downFile(this.url.exportXls+this.code,{paramsStr:paramsStr}).then((data)=>{
|
||||||
|
if (!data) {
|
||||||
|
this.$message.warning("文件下载失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (typeof window.navigator.msSaveBlob !== 'undefined') {
|
||||||
|
window.navigator.msSaveBlob(new Blob([data]), this.description+'.xls')
|
||||||
|
}else{
|
||||||
|
let url = window.URL.createObjectURL(new Blob([data]))
|
||||||
|
let link = document.createElement('a')
|
||||||
|
link.style.display = 'none'
|
||||||
|
link.href = url
|
||||||
|
link.setAttribute('download', this.description+'.xls')
|
||||||
|
document.body.appendChild(link)
|
||||||
|
link.click()
|
||||||
|
document.body.removeChild(link); //下载完成移除元素
|
||||||
|
window.URL.revokeObjectURL(url); //释放掉blob对象
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleDelBatch(){
|
||||||
|
if(this.selectedRowKeys.length<=0){
|
||||||
|
this.$message.warning('请选择一条记录!');
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
let ids = "";
|
||||||
|
let that = this;
|
||||||
|
that.selectedRowKeys.forEach(function(val) {
|
||||||
|
ids+=val+",";
|
||||||
|
});
|
||||||
|
that.$confirm({
|
||||||
|
title:"确认删除",
|
||||||
|
content:"是否删除选中数据?",
|
||||||
|
onOk: function(){
|
||||||
|
that.handleDelete(ids)
|
||||||
|
that.onClearSelected();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*-------功能按钮触发事件-begin----------*/
|
||||||
|
|
||||||
|
/*-------JS增强-begin----------*/
|
||||||
|
cgButtonLinkHandler(record,buttonCode,optType){
|
||||||
|
if(optType=="js"){
|
||||||
|
if(this.EnhanceJS[buttonCode]){
|
||||||
|
this.EnhanceJS[buttonCode](this,record)
|
||||||
|
}
|
||||||
|
}else if(optType=="action"){
|
||||||
|
let params = {
|
||||||
|
formId:this.code,
|
||||||
|
buttonCode:buttonCode,
|
||||||
|
dataId:record.id
|
||||||
|
}
|
||||||
|
console.log("自定义按钮link请求后台参数:",params)
|
||||||
|
postAction(this.url.buttonAction,params).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.loadData()
|
||||||
|
this.$message.success("处理完成!")
|
||||||
|
}else{
|
||||||
|
this.$message.warning("处理失败!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cgButtonJsHandler(buttonCode){
|
||||||
|
if(this.EnhanceJS[buttonCode]){
|
||||||
|
this.EnhanceJS[buttonCode](this)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cgButtonActionHandler(buttonCode){
|
||||||
|
//处理自定义button的 需要配置该button自定义sql
|
||||||
|
if(!this.selectedRowKeys || this.selectedRowKeys.length==0){
|
||||||
|
this.$message.warning("请先选中一条记录")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if(this.selectedRowKeys.length>1){
|
||||||
|
this.$message.warning("请只选中一条记录")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
let params = {
|
||||||
|
formId:this.code,
|
||||||
|
buttonCode:buttonCode,
|
||||||
|
dataId:this.selectedRowKeys[0]
|
||||||
|
}
|
||||||
|
console.log("自定义按钮请求后台参数:",params)
|
||||||
|
postAction(this.url.buttonAction,params).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.loadData()
|
||||||
|
this.$message.success("处理完成!")
|
||||||
|
}else{
|
||||||
|
this.$message.warning("处理失败!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
},
|
||||||
|
/*-------JS增强-end----------*/
|
||||||
|
showOptButton(opt,record){
|
||||||
|
//只有当按钮属性为false,或是按钮属性为true但是流程已提交时才隐藏
|
||||||
|
if(!this.buttonSwitch[opt]){
|
||||||
|
return false
|
||||||
|
}else{
|
||||||
|
if(this.hasBpmStatus){
|
||||||
|
if(record.bpm_status !=null && record.bpm_status !='' && record.bpm_status != '1'){
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
showSubmitFlowButton(record){
|
||||||
|
if(this.hasBpmStatus){
|
||||||
|
if(record.bpm_status ==null || record.bpm_status =='' || record.bpm_status == '1'){
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
showViewFlowButton(record){
|
||||||
|
if(this.hasBpmStatus){
|
||||||
|
if(record.bpm_status !=null && record.bpm_status !='' && record.bpm_status != '1'){
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
startProcess: function(record){
|
||||||
|
var that = this;
|
||||||
|
this.$confirm({
|
||||||
|
title:"提示",
|
||||||
|
content:"确认提交流程吗?",
|
||||||
|
onOk: function(){
|
||||||
|
var param = {
|
||||||
|
flowCode:that.flowCodePre+that.currentTableName,
|
||||||
|
id:record.id,
|
||||||
|
formUrl:"modules/bpm/task/form/OnlineFormDetail",
|
||||||
|
formUrlMobile:"modules/bpm/task/form/OnlineFormDetail"
|
||||||
|
}
|
||||||
|
postAction(that.url.startProcess,param).then((res)=>{
|
||||||
|
if(res.success){
|
||||||
|
that.$message.success(res.message);
|
||||||
|
that.loadData();
|
||||||
|
that.onClearSelected();
|
||||||
|
}else{
|
||||||
|
that.$message.warning(res.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handlePreviewPic: function(record){
|
||||||
|
var flowCode = this.flowCodePre+this.currentTableName;
|
||||||
|
var dataId = record.id;
|
||||||
|
this.$refs.processInstPicModal.preview(flowCode,dataId);
|
||||||
|
this.$refs.processInstPicModal.title="流程图";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.ant-card-body .table-operator{
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.ant-table-tbody .ant-table-row td{
|
||||||
|
padding-top:15px;
|
||||||
|
padding-bottom:15px;
|
||||||
|
}
|
||||||
|
.anty-row-operator button{margin: 0 5px}
|
||||||
|
.ant-btn-danger{background-color: #ffffff}
|
||||||
|
|
||||||
|
.anty-img-wrap{height:25px;position: relative;}
|
||||||
|
.anty-img-wrap > img{max-height:100%;}
|
||||||
|
.ant-modal-cust-warp{height: 100%}
|
||||||
|
.ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
|
||||||
|
.ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,268 @@
|
|||||||
|
/**
|
||||||
|
* 同步列表,可以同步新增、修改、删除
|
||||||
|
* @author sunjianlei
|
||||||
|
* */
|
||||||
|
export function syncAllTable(vm, table1) {
|
||||||
|
vm.$refs.editableTable.resetScrollTop()
|
||||||
|
let deleteIds = table1.$refs.editableTable.getDeleteIds()
|
||||||
|
let table1Value
|
||||||
|
table1.$refs.editableTable.getValuesPromise(false).then((values) => {
|
||||||
|
table1Value = values
|
||||||
|
return vm.$refs.editableTable.getValuesPromise(false)
|
||||||
|
}).then((values) => {
|
||||||
|
|
||||||
|
table1Value.forEach(value => {
|
||||||
|
let flag = false
|
||||||
|
values.forEach((thisValue) => {
|
||||||
|
if (value.id === thisValue.id) {
|
||||||
|
|
||||||
|
// 判断是否修改了值
|
||||||
|
let dbFieldName = thisValue['dbFieldName']
|
||||||
|
let dbFieldTxt = thisValue['dbFieldTxt']
|
||||||
|
|
||||||
|
// return
|
||||||
|
|
||||||
|
if (value.dbFieldName !== dbFieldName
|
||||||
|
|| value.dbFieldTxt !== dbFieldTxt) {
|
||||||
|
|
||||||
|
// 修改了
|
||||||
|
vm.$refs.editableTable.setValues([{
|
||||||
|
rowKey: thisValue.id,
|
||||||
|
values: {
|
||||||
|
dbFieldName: value.dbFieldName,
|
||||||
|
dbFieldTxt: value.dbFieldTxt
|
||||||
|
}
|
||||||
|
}])
|
||||||
|
|
||||||
|
}
|
||||||
|
flag = true
|
||||||
|
} else {
|
||||||
|
// id不匹配则有可能是新增也有可能是删除了的
|
||||||
|
// 遍历传进来的 deleteIds 进行对比
|
||||||
|
deleteIds.forEach(delId => {
|
||||||
|
// 对比成功,则删除该条数据
|
||||||
|
if (delId === thisValue.id) {
|
||||||
|
vm.$refs.editableTable.removeRows(vm.$refs.editableTable.caseId + delId)
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// return
|
||||||
|
// 判断是否操作了该条数据,若没有操作则代表要执行新增操作
|
||||||
|
if (!flag) {
|
||||||
|
let record = Object.assign({}, value)
|
||||||
|
vm.columns.forEach(column => {
|
||||||
|
if (
|
||||||
|
column.dataIndex !== 'dbFieldName' &&
|
||||||
|
column.dataIndex !== 'dbFieldTxt'
|
||||||
|
) {
|
||||||
|
record[column.dataIndex] = column.defaultValue
|
||||||
|
}
|
||||||
|
})
|
||||||
|
vm.$refs.editableTable.push(record)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将数据分类并Set进dataSource
|
||||||
|
* @author sunjianlei
|
||||||
|
**/
|
||||||
|
export function setDataSource(vm, queryData) {
|
||||||
|
let dataSource = []
|
||||||
|
// 遍历查询出来的数据
|
||||||
|
queryData.forEach(value => {
|
||||||
|
|
||||||
|
let data = { id: value['id'] }
|
||||||
|
vm.columns.forEach(column => {
|
||||||
|
let key = column.key
|
||||||
|
if (key) {
|
||||||
|
data[key] = value[key]
|
||||||
|
|
||||||
|
// 由于多选下拉框返回的是一个数组,所以需要改成 [1,2,3] 数组的形式,否则组件不识别
|
||||||
|
// if (key === 'indexField') {
|
||||||
|
// data[key] = value[key].split(',')
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
dataSource.push(data)
|
||||||
|
})
|
||||||
|
vm.dataSource = dataSource
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 获取主表的初始化数据 */
|
||||||
|
export function getMasterTableInitialData() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
dbFieldName: 'id',
|
||||||
|
dbFieldTxt: '主键',
|
||||||
|
dbLength: 36,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'string',
|
||||||
|
dbIsKey: '1',
|
||||||
|
dbIsNull: '0',
|
||||||
|
// table2
|
||||||
|
isShowForm: '0',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'text',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dbFieldName: 'create_by',
|
||||||
|
dbFieldTxt: '创建人',
|
||||||
|
dbLength: 50,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'string',
|
||||||
|
dbIsKey: '0',
|
||||||
|
dbIsNull: '1',
|
||||||
|
// table2
|
||||||
|
isShowForm: '0',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'text',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dbFieldName: 'create_time',
|
||||||
|
dbFieldTxt: '创建日期',
|
||||||
|
dbLength: 20,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'Date',
|
||||||
|
dbIsKey: '0',
|
||||||
|
dbIsNull: '1',
|
||||||
|
// table2
|
||||||
|
isShowForm: '0',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'datetime',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dbFieldName: 'update_by',
|
||||||
|
dbFieldTxt: '更新人',
|
||||||
|
dbLength: 50,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'string',
|
||||||
|
dbIsKey: '0',
|
||||||
|
dbIsNull: '1',
|
||||||
|
// table2
|
||||||
|
isShowForm: '0',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'text',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dbFieldName: 'update_time',
|
||||||
|
dbFieldTxt: '更新日期',
|
||||||
|
dbLength: 20,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'Date',
|
||||||
|
dbIsKey: '0',
|
||||||
|
dbIsNull: '1',
|
||||||
|
// table2
|
||||||
|
isShowForm: '0',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'datetime',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 5
|
||||||
|
},{
|
||||||
|
dbFieldName: 'sys_org_code',
|
||||||
|
dbFieldTxt: '所属部门',
|
||||||
|
dbLength: 64,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'string',
|
||||||
|
dbIsKey: '0',
|
||||||
|
dbIsNull: '1',
|
||||||
|
// table2
|
||||||
|
isShowForm: '0',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'text',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 6
|
||||||
|
}
|
||||||
|
// {
|
||||||
|
// dbFieldName: 'sys_org_code',
|
||||||
|
// dbFieldTxt: '所属部门',
|
||||||
|
// dbLength: 50,
|
||||||
|
// dbPointLength: 0,
|
||||||
|
// dbDefaultVal: '',
|
||||||
|
// dbType: 'string',
|
||||||
|
// dbIsKey: false,
|
||||||
|
// dbIsNull: true
|
||||||
|
// }, {
|
||||||
|
// dbFieldName: 'sys_company_code',
|
||||||
|
// dbFieldTxt: '所属公司',
|
||||||
|
// dbLength: 50,
|
||||||
|
// dbPointLength: 0,
|
||||||
|
// dbDefaultVal: '',
|
||||||
|
// dbType: 'string',
|
||||||
|
// dbIsKey: false,
|
||||||
|
// dbIsNull: true
|
||||||
|
// }, {
|
||||||
|
// dbFieldName: 'bpm_status',
|
||||||
|
// dbFieldTxt: '流程状态',
|
||||||
|
// dbLength: 32,
|
||||||
|
// dbPointLength: 0,
|
||||||
|
// dbDefaultVal: '',
|
||||||
|
// dbType: 'string',
|
||||||
|
// dbIsKey: false,
|
||||||
|
// dbIsNull: true
|
||||||
|
// }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
/** 获取树的初始化数据 */
|
||||||
|
export function getTreeNeedFields() {
|
||||||
|
return [{
|
||||||
|
dbFieldName: 'pid',
|
||||||
|
dbFieldTxt: '父级节点',
|
||||||
|
dbLength: 32,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'string',
|
||||||
|
dbIsKey: '0',
|
||||||
|
dbIsNull: '1',
|
||||||
|
// table2
|
||||||
|
isShowForm: '1',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'text',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 7
|
||||||
|
},{
|
||||||
|
dbFieldName: 'has_child',
|
||||||
|
dbFieldTxt: '是否有子节点',
|
||||||
|
dbLength: 3,
|
||||||
|
dbPointLength: 0,
|
||||||
|
dbDefaultVal: '',
|
||||||
|
dbType: 'string',
|
||||||
|
dbIsKey: '0',
|
||||||
|
dbIsNull: '1',
|
||||||
|
// table2
|
||||||
|
isShowForm: '0',
|
||||||
|
isShowList: '0',
|
||||||
|
fieldShowType: 'list',
|
||||||
|
fieldLength: '120',
|
||||||
|
queryMode: 'single',
|
||||||
|
orderNum: 8,
|
||||||
|
// table3
|
||||||
|
dictField:"yn"
|
||||||
|
}]
|
||||||
|
}
|
||||||
164
ant-design-vue-jeecg/src/views/modules/oss/OSSFileList.vue
Normal file
164
ant-design-vue-jeecg/src/views/modules/oss/OSSFileList.vue
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
<template>
|
||||||
|
<a-card :bordered="false">
|
||||||
|
<!-- 查询区域 -->
|
||||||
|
<div class="table-page-search-wrapper">
|
||||||
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
<a-col :md="6" :sm="8">
|
||||||
|
<a-form-item label="文件名称">
|
||||||
|
<a-input placeholder="请输入文件名称" v-model="queryParam.fileName"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :md="6" :sm="8">
|
||||||
|
<a-form-item label="文件地址">
|
||||||
|
<a-input placeholder="请输入文件地址" v-model="queryParam.url"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 操作按钮区域 -->
|
||||||
|
<div class="table-operator">
|
||||||
|
<!-- <a-button type="primary" icon="download" @click="handleExportXls('文件列表')">导出</a-button>-->
|
||||||
|
<a-upload
|
||||||
|
name="file"
|
||||||
|
:multiple="false"
|
||||||
|
:action="uploadAction"
|
||||||
|
:headers="tokenHeader"
|
||||||
|
:showUploadList="false"
|
||||||
|
:beforeUpload="beforeUpload"
|
||||||
|
@change="handleChange">
|
||||||
|
<a-button>
|
||||||
|
<a-icon type="upload"/>
|
||||||
|
文件上传
|
||||||
|
</a-button>
|
||||||
|
</a-upload>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- table区域-begin -->
|
||||||
|
<div>
|
||||||
|
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
|
||||||
|
<i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a
|
||||||
|
style="font-weight: 600">{{
|
||||||
|
selectedRowKeys.length }}</a>项
|
||||||
|
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-table
|
||||||
|
ref="table"
|
||||||
|
size="middle"
|
||||||
|
bordered
|
||||||
|
rowKey="id"
|
||||||
|
:columns="columns"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:pagination="ipagination"
|
||||||
|
:loading="loading"
|
||||||
|
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
||||||
|
@change="handleTableChange">
|
||||||
|
|
||||||
|
<span slot="action" slot-scope="text, record">
|
||||||
|
<a @click="ossDelete(record.id)">删除</a>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
<!-- table区域-end -->
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {JeecgListMixin} from '@/mixins/JeecgListMixin'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "OSSFileList",
|
||||||
|
mixins: [JeecgListMixin],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
description: '文件列表',
|
||||||
|
// 表头
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: '#',
|
||||||
|
dataIndex: '',
|
||||||
|
key: 'rowIndex',
|
||||||
|
width: 60,
|
||||||
|
align: "center",
|
||||||
|
customRender: function (t, r, index) {
|
||||||
|
return parseInt(index) + 1;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '文件名称',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'fileName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '文件地址',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'url'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'action',
|
||||||
|
align: "center",
|
||||||
|
scopedSlots: {customRender: 'action'},
|
||||||
|
}
|
||||||
|
],
|
||||||
|
url: {
|
||||||
|
upload: "/oss/file/upload",
|
||||||
|
list: "/oss/file/list",
|
||||||
|
delete: "/oss/file/delete"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
uploadAction() {
|
||||||
|
return window._CONFIG['domianURL'] + this.url.upload;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
beforeUpload(file) {
|
||||||
|
var fileType = file.type;
|
||||||
|
if (fileType === 'image') {
|
||||||
|
if (fileType.indexOf('image') < 0) {
|
||||||
|
this.$message.warning('请上传图片');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (fileType === 'file') {
|
||||||
|
if (fileType.indexOf('image') >= 0) {
|
||||||
|
this.$message.warning('请上传文件');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
handleChange(info) {
|
||||||
|
if (info.file.status === 'done') {
|
||||||
|
if (info.file.response.success) {
|
||||||
|
this.loadData()
|
||||||
|
this.$message.success(`${info.file.name} 上传成功!`);
|
||||||
|
} else {
|
||||||
|
this.$message.error(`${info.file.name} 上传失败.`);
|
||||||
|
}
|
||||||
|
} else if (info.file.status === 'error') {
|
||||||
|
this.$message.error(`${info.file.name} 上传失败.`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ossDelete(id) {
|
||||||
|
var that = this;
|
||||||
|
that.$confirm({
|
||||||
|
title: "确认删除",
|
||||||
|
content: "是否删除选中文件?",
|
||||||
|
onOk: function () {
|
||||||
|
that.handleDelete(id)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
@import '~@assets/less/common.less'
|
||||||
|
</style>
|
||||||
31
ant-design-vue-jeecg/src/views/system/AddressList.vue
Normal file
31
ant-design-vue-jeecg/src/views/system/AddressList.vue
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<template>
|
||||||
|
<a-row type="flex" :gutter="16">
|
||||||
|
<a-col :md="5" :sm="24">
|
||||||
|
<address-list-left v-model="currentOrgCode"/>
|
||||||
|
</a-col>
|
||||||
|
<a-col :md="24-5" :sm="24">
|
||||||
|
<address-list-right v-model="currentOrgCode"/>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AddressListLeft from './modules/AddressListLeft'
|
||||||
|
import AddressListRight from './modules/AddressListRight'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AddressList',
|
||||||
|
components: { AddressListLeft, AddressListRight },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
description: '通讯录页面',
|
||||||
|
currentOrgCode: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
@import '~@assets/less/common.less';
|
||||||
|
</style>
|
||||||
@ -2,7 +2,7 @@
|
|||||||
<a-card :bordered="false">
|
<a-card :bordered="false">
|
||||||
<!-- 查询区域 -->
|
<!-- 查询区域 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
<a-form-item label="表名">
|
<a-form-item label="表名">
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
:selectedKeys="selectedKeys"
|
:selectedKeys="selectedKeys"
|
||||||
:checkedKeys="checkedKeys"
|
:checkedKeys="checkedKeys"
|
||||||
:treeData="departTree"
|
:treeData="departTree"
|
||||||
:checkStrictly="true"
|
:checkStrictly="checkStrictly"
|
||||||
:expandedKeys="iExpandedKeys"
|
:expandedKeys="iExpandedKeys"
|
||||||
:autoExpandParent="autoExpandParent"
|
:autoExpandParent="autoExpandParent"
|
||||||
@expand="onExpand"/>
|
@expand="onExpand"/>
|
||||||
@ -53,6 +53,23 @@
|
|||||||
</a-col>
|
</a-col>
|
||||||
</div>
|
</div>
|
||||||
</a-card>
|
</a-card>
|
||||||
|
<!---- author:os_chengtgen -- date:20190827 -- for:切换父子勾选模式 =======------>
|
||||||
|
<div class="drawer-bootom-button">
|
||||||
|
<a-dropdown :trigger="['click']" placement="topCenter">
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
|
||||||
|
<a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
|
||||||
|
<a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
|
||||||
|
<a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
|
||||||
|
<a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
|
||||||
|
<a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
<a-button>
|
||||||
|
树操作 <a-icon type="up" />
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</div>
|
||||||
|
<!---- author:os_chengtgen -- date:20190827 -- for:切换父子勾选模式 =======------>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :md="12" :sm="24">
|
<a-col :md="12" :sm="24">
|
||||||
<a-card :bordered="false">
|
<a-card :bordered="false">
|
||||||
@ -79,6 +96,28 @@
|
|||||||
label="机构编码">
|
label="机构编码">
|
||||||
<a-input disabled placeholder="请输入机构编码" v-decorator="['orgCode', validatorRules.orgCode ]"/>
|
<a-input disabled placeholder="请输入机构编码" v-decorator="['orgCode', validatorRules.orgCode ]"/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
<a-form-item
|
||||||
|
:labelCol="labelCol"
|
||||||
|
:wrapperCol="wrapperCol"
|
||||||
|
label="机构类型">
|
||||||
|
<template v-if="orgCategoryDisabled">
|
||||||
|
<a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
|
||||||
|
<a-radio value="1">
|
||||||
|
公司
|
||||||
|
</a-radio>
|
||||||
|
</a-radio-group>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
|
||||||
|
<a-radio value="2">
|
||||||
|
部门
|
||||||
|
</a-radio>
|
||||||
|
<a-radio value="3">
|
||||||
|
岗位
|
||||||
|
</a-radio>
|
||||||
|
</a-radio-group>
|
||||||
|
</template>
|
||||||
|
</a-form-item>
|
||||||
<a-form-item
|
<a-form-item
|
||||||
:labelCol="labelCol"
|
:labelCol="labelCol"
|
||||||
:wrapperCol="wrapperCol"
|
:wrapperCol="wrapperCol"
|
||||||
@ -186,6 +225,10 @@
|
|||||||
selectedKeys: [],
|
selectedKeys: [],
|
||||||
autoIncr: 1,
|
autoIncr: 1,
|
||||||
currSelected: {},
|
currSelected: {},
|
||||||
|
|
||||||
|
allTreeKeys:[],
|
||||||
|
checkStrictly: true,
|
||||||
|
|
||||||
form: this.$form.createForm(this),
|
form: this.$form.createForm(this),
|
||||||
labelCol: {
|
labelCol: {
|
||||||
xs: {span: 24},
|
xs: {span: 24},
|
||||||
@ -202,15 +245,17 @@
|
|||||||
validatorRules: {
|
validatorRules: {
|
||||||
departName: {rules: [{required: true, message: '请输入机构/部门名称!'}]},
|
departName: {rules: [{required: true, message: '请输入机构/部门名称!'}]},
|
||||||
orgCode: {rules: [{required: true, message: '请输入机构编码!'}]},
|
orgCode: {rules: [{required: true, message: '请输入机构编码!'}]},
|
||||||
|
orgCategory: {rules: [{required: true, message: '请输入机构类型!'}]},
|
||||||
mobile: {rules: [{validator: this.validateMobile}]}
|
mobile: {rules: [{validator: this.validateMobile}]}
|
||||||
},
|
},
|
||||||
url: {
|
url: {
|
||||||
delete: '/sysdepart/sysDepart/delete',
|
delete: '/sys/sysDepart/delete',
|
||||||
edit: '/sysdepart/sysDepart/edit',
|
edit: '/sys/sysDepart/edit',
|
||||||
deleteBatch: '/sysdepart/sysDepart/deleteBatch',
|
deleteBatch: '/sys/sysDepart/deleteBatch',
|
||||||
exportXlsUrl: "sysdepart/sysDepart/exportXls",
|
exportXlsUrl: "sys/sysDepart/exportXls",
|
||||||
importExcelUrl: "sysdepart/sysDepart/importExcel",
|
importExcelUrl: "sys/sysDepart/importExcel",
|
||||||
},
|
},
|
||||||
|
orgCategoryDisabled:false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -233,7 +278,8 @@
|
|||||||
that.treeData.push(temp)
|
that.treeData.push(temp)
|
||||||
that.departTree.push(temp)
|
that.departTree.push(temp)
|
||||||
that.setThisExpandedKeys(temp)
|
that.setThisExpandedKeys(temp)
|
||||||
console.log(temp.id)
|
that.getAllKeys(temp);
|
||||||
|
// console.log(temp.id)
|
||||||
}
|
}
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
@ -292,7 +338,7 @@
|
|||||||
var that = this
|
var that = this
|
||||||
this.$confirm({
|
this.$confirm({
|
||||||
title: '确认删除',
|
title: '确认删除',
|
||||||
content: '确定要删除所选中的 ' + this.checkedKeys.length + ' 条数据?',
|
content: '确定要删除所选中的 ' + this.checkedKeys.length + ' 条数据,以及子节点数据吗?',
|
||||||
onOk: function () {
|
onOk: function () {
|
||||||
deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
|
deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
@ -338,7 +384,14 @@
|
|||||||
onCheck(checkedKeys, info) {
|
onCheck(checkedKeys, info) {
|
||||||
console.log('onCheck', checkedKeys, info)
|
console.log('onCheck', checkedKeys, info)
|
||||||
this.hiding = false
|
this.hiding = false
|
||||||
this.checkedKeys = checkedKeys.checked
|
//this.checkedKeys = checkedKeys.checked
|
||||||
|
// <!---- author:os_chengtgen -- date:20190827 -- for:切换父子勾选模式 =======------>
|
||||||
|
if(this.checkStrictly){
|
||||||
|
this.checkedKeys = checkedKeys.checked;
|
||||||
|
}else{
|
||||||
|
this.checkedKeys = checkedKeys
|
||||||
|
}
|
||||||
|
// <!---- author:os_chengtgen -- date:20190827 -- for:切换父子勾选模式 =======------>
|
||||||
},
|
},
|
||||||
onSelect(selectedKeys, e) {
|
onSelect(selectedKeys, e) {
|
||||||
console.log('selected', selectedKeys, e)
|
console.log('selected', selectedKeys, e)
|
||||||
@ -355,8 +408,13 @@
|
|||||||
},
|
},
|
||||||
// 触发onSelect事件时,为部门树右侧的form表单赋值
|
// 触发onSelect事件时,为部门树右侧的form表单赋值
|
||||||
setValuesToForm(record) {
|
setValuesToForm(record) {
|
||||||
|
if(record.orgCategory == '1'){
|
||||||
|
this.orgCategoryDisabled = true;
|
||||||
|
}else{
|
||||||
|
this.orgCategoryDisabled = false;
|
||||||
|
}
|
||||||
this.form.getFieldDecorator('fax', {initialValue: ''})
|
this.form.getFieldDecorator('fax', {initialValue: ''})
|
||||||
this.form.setFieldsValue(pick(record, 'departName', 'orgCode', 'departOrder', 'mobile', 'fax', 'address', 'memo'))
|
this.form.setFieldsValue(pick(record, 'departName','orgCategory', 'orgCode', 'departOrder', 'mobile', 'fax', 'address', 'memo'))
|
||||||
},
|
},
|
||||||
getCurrSelectedTitle() {
|
getCurrSelectedTitle() {
|
||||||
return !this.currSelected.title ? '' : this.currSelected.title
|
return !this.currSelected.title ? '' : this.currSelected.title
|
||||||
@ -459,6 +517,39 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// <!---- author:os_chengtgen -- date:20190827 -- for:切换父子勾选模式 =======------>
|
||||||
|
expandAll () {
|
||||||
|
this.iExpandedKeys = this.allTreeKeys
|
||||||
|
},
|
||||||
|
closeAll () {
|
||||||
|
this.iExpandedKeys = []
|
||||||
|
},
|
||||||
|
checkALL () {
|
||||||
|
this.checkStriccheckStrictlytly = false
|
||||||
|
this.checkedKeys = this.allTreeKeys
|
||||||
|
},
|
||||||
|
cancelCheckALL () {
|
||||||
|
//this.checkedKeys = this.defaultCheckedKeys
|
||||||
|
this.checkedKeys = []
|
||||||
|
},
|
||||||
|
switchCheckStrictly (v) {
|
||||||
|
if(v==1){
|
||||||
|
this.checkStrictly = false
|
||||||
|
}else if(v==2){
|
||||||
|
this.checkStrictly = true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getAllKeys(node) {
|
||||||
|
// console.log('node',node);
|
||||||
|
this.allTreeKeys.push(node.key)
|
||||||
|
if (node.children && node.children.length > 0) {
|
||||||
|
for (let a = 0; a < node.children.length; a++) {
|
||||||
|
this.getAllKeys(node.children[a])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// <!---- author:os_chengtgen -- date:20190827 -- for:切换父子勾选模式 =======------>
|
||||||
|
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.currFlowId = this.$route.params.id
|
this.currFlowId = this.$route.params.id
|
||||||
@ -516,4 +607,16 @@
|
|||||||
.ant-btn {
|
.ant-btn {
|
||||||
margin-left: 3px
|
margin-left: 3px
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.drawer-bootom-button {
|
||||||
|
/*position: absolute;*/
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
border-top: 1px solid #e8e8e8;
|
||||||
|
padding: 10px 16px;
|
||||||
|
text-align: left;
|
||||||
|
left: 0;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 0 0 2px 2px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@ -148,9 +148,9 @@
|
|||||||
selectedRowKeys: [],
|
selectedRowKeys: [],
|
||||||
selectedRows: [],
|
selectedRows: [],
|
||||||
url: {
|
url: {
|
||||||
list: "/sysdepart/sysDepart/list",
|
list: "/sys/sysDepart/list",
|
||||||
delete: "/sysdepart/sysDepart/delete",
|
delete: "/sys/sysDepart/delete",
|
||||||
deleteBatch: "/sysdepart/sysDepart/deleteBatch",
|
deleteBatch: "/sys/sysDepart/deleteBatch",
|
||||||
},
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,8 +9,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
|
||||||
<!--组织机构-->
|
<!--组织机构-->
|
||||||
<a-directory-tree
|
<a-tree
|
||||||
selectable
|
showLine
|
||||||
:selectedKeys="selectedKeys"
|
:selectedKeys="selectedKeys"
|
||||||
:checkStrictly="true"
|
:checkStrictly="true"
|
||||||
@select="onSelect"
|
@select="onSelect"
|
||||||
|
|||||||
125
ant-design-vue-jeecg/src/views/system/DictDeleteList.vue
Normal file
125
ant-design-vue-jeecg/src/views/system/DictDeleteList.vue
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
<template>
|
||||||
|
<a-modal
|
||||||
|
:width="modalWidth"
|
||||||
|
:style="modalStyle"
|
||||||
|
:visible="visible"
|
||||||
|
:maskClosable="false"
|
||||||
|
@cancel="handleCancel">
|
||||||
|
<template slot="footer">
|
||||||
|
<a-button @click="handleCancel">关闭</a-button>
|
||||||
|
</template>
|
||||||
|
<a-table
|
||||||
|
ref="table"
|
||||||
|
rowKey="id"
|
||||||
|
size="middle"
|
||||||
|
:columns="columns"
|
||||||
|
:loading="loading"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:pagination="false">
|
||||||
|
<span slot="action" slot-scope="text, record">
|
||||||
|
<a @click="handleBack(record.id)"><a-icon type="redo"/>字典取回</a>
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
<a @click="handleDelete(record.id)"><a-icon type="scissor"/>彻底删除</a>
|
||||||
|
</span>
|
||||||
|
</a-table>
|
||||||
|
|
||||||
|
</a-modal>
|
||||||
|
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getAction,deleteAction,putAction } from '@/api/manage'
|
||||||
|
export default {
|
||||||
|
name: "DictDeleteList",
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
modalWidth: '90%',
|
||||||
|
modalStyle: { 'top': '20px'},
|
||||||
|
title: '操作',
|
||||||
|
visible: false,
|
||||||
|
loading: false,
|
||||||
|
dataSource:[],
|
||||||
|
columns:[
|
||||||
|
{
|
||||||
|
title: '#',
|
||||||
|
dataIndex: '',
|
||||||
|
key: 'rowIndex',
|
||||||
|
width: 120,
|
||||||
|
align: "center",
|
||||||
|
customRender: function (t, r, index) {
|
||||||
|
return parseInt(index) + 1;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '字典名称',
|
||||||
|
align: "left",
|
||||||
|
dataIndex: 'dictName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '字典编号',
|
||||||
|
align: "left",
|
||||||
|
dataIndex: 'dictCode'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '描述',
|
||||||
|
align: "left",
|
||||||
|
dataIndex: 'description'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'action',
|
||||||
|
align: "center",
|
||||||
|
scopedSlots: {customRender: 'action'}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
handleCancel(){
|
||||||
|
this.visible = false
|
||||||
|
},
|
||||||
|
show(){
|
||||||
|
this.visible = true
|
||||||
|
this.loadData();
|
||||||
|
},
|
||||||
|
loadData(){
|
||||||
|
this.loading = true
|
||||||
|
getAction("/sys/dict/deleteList").then(res=>{
|
||||||
|
this.loading = false
|
||||||
|
if(res.success){
|
||||||
|
this.dataSource = res.result
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleBack(id){
|
||||||
|
putAction("/sys/dict/back/"+id).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.$message.success(res.message)
|
||||||
|
this.loadData();
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleDelete(id){
|
||||||
|
deleteAction("/sys/dict/deletePhysic/"+id).then(res=>{
|
||||||
|
if(res.success){
|
||||||
|
this.$message.success(res.message)
|
||||||
|
this.loadData();
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -16,7 +16,7 @@
|
|||||||
}">
|
}">
|
||||||
|
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline" :form="form">
|
<a-form layout="inline" :form="form" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="10">
|
<a-row :gutter="10">
|
||||||
<a-col :md="8" :sm="12">
|
<a-col :md="8" :sm="12">
|
||||||
<a-form-item label="名称">
|
<a-form-item label="名称">
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<!-- 左侧面板 -->
|
<!-- 左侧面板 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="12">
|
<a-row :gutter="12">
|
||||||
<a-col :md="7" :sm="8">
|
<a-col :md="7" :sm="8">
|
||||||
<a-form-item label="字典名称" :labelCol="{span: 6}" :wrapperCol="{span: 14, offset: 1}">
|
<a-form-item label="字典名称" :labelCol="{span: 6}" :wrapperCol="{span: 14, offset: 1}">
|
||||||
@ -30,6 +30,8 @@
|
|||||||
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
|
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
|
||||||
<a-button type="primary" icon="import">导入</a-button>
|
<a-button type="primary" icon="import">导入</a-button>
|
||||||
</a-upload>
|
</a-upload>
|
||||||
|
|
||||||
|
<a-button type="primary" icon="hdd" @click="openDeleteList">回收站</a-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a-table
|
<a-table
|
||||||
@ -58,6 +60,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<dict-modal ref="modalForm" @ok="modalFormOk"></dict-modal> <!-- 字典类型 -->
|
<dict-modal ref="modalForm" @ok="modalFormOk"></dict-modal> <!-- 字典类型 -->
|
||||||
<dict-item-list ref="dictItemList"></dict-item-list>
|
<dict-item-list ref="dictItemList"></dict-item-list>
|
||||||
|
<dict-delete-list ref="dictDeleteList"></dict-delete-list>
|
||||||
</a-card>
|
</a-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -66,11 +69,12 @@
|
|||||||
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
import DictModal from './modules/DictModal'
|
import DictModal from './modules/DictModal'
|
||||||
import DictItemList from './DictItemList'
|
import DictItemList from './DictItemList'
|
||||||
|
import DictDeleteList from './DictDeleteList'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DictList",
|
name: "DictList",
|
||||||
mixins:[JeecgListMixin],
|
mixins:[JeecgListMixin],
|
||||||
components: {DictModal, DictItemList},
|
components: {DictModal, DictItemList,DictDeleteList},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
description: '这是数据字典页面',
|
description: '这是数据字典页面',
|
||||||
@ -161,6 +165,10 @@
|
|||||||
that.queryParam.dictCode = "";
|
that.queryParam.dictCode = "";
|
||||||
that.loadData(this.ipagination.current);
|
that.loadData(this.ipagination.current);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
openDeleteList(){
|
||||||
|
this.$refs.dictDeleteList.show()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
openKeys(val) {
|
openKeys(val) {
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<!-- 查询区域 -->
|
<!-- 查询区域 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
|
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
@ -19,7 +19,7 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
|
||||||
<a-col :md="8" :sm="10">
|
<a-col :md="6" :sm="10">
|
||||||
<a-form-item label="创建时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
<a-form-item label="创建时间" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
||||||
<a-range-picker
|
<a-range-picker
|
||||||
style="width: 210px"
|
style="width: 210px"
|
||||||
@ -31,14 +31,19 @@
|
|||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
<a-col :md="5" :sm="8" v-if="tabKey === '2'">
|
||||||
<a-col :md="8" :sm="10" >
|
<a-form-item label="操作类型" style="left: 10px">
|
||||||
<span style="float: right;" class="table-page-search-submitButtons">
|
<j-dict-select-tag v-model="queryParam.operateType" placeholder="请选择操作类型" dictCode="operate_type"/>
|
||||||
<a-button type="primary" style="left: -35px" @click="searchQuery" icon="search">查询</a-button>
|
</a-form-item>
|
||||||
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px;left: -35px">重置</a-button>
|
|
||||||
</span>
|
|
||||||
</a-col>
|
</a-col>
|
||||||
|
|
||||||
|
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
|
||||||
|
<a-col :md="6" :sm="24" >
|
||||||
|
<a-button type="primary" style="left: 10px" @click="searchQuery" icon="search">查询</a-button>
|
||||||
|
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px;left: 10px">重置</a-button>
|
||||||
|
</a-col>
|
||||||
|
</span>
|
||||||
|
|
||||||
</a-row>
|
</a-row>
|
||||||
</a-form>
|
</a-form>
|
||||||
</div>
|
</div>
|
||||||
@ -58,7 +63,10 @@
|
|||||||
<div style="margin-bottom: 5px"><a-badge status="success" style="vertical-align: middle;"/><span style="vertical-align: middle;">请求方法:{{ record.method }}</span></div>
|
<div style="margin-bottom: 5px"><a-badge status="success" style="vertical-align: middle;"/><span style="vertical-align: middle;">请求方法:{{ record.method }}</span></div>
|
||||||
<div><a-badge status="processing" style="vertical-align: middle;"/><span style="vertical-align: middle;">请求参数:{{ record.requestParam }}</span></div>
|
<div><a-badge status="processing" style="vertical-align: middle;"/><span style="vertical-align: middle;">请求参数:{{ record.requestParam }}</span></div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 字符串超长截取省略号显示-->
|
||||||
|
<span slot="logContent" slot-scope="text, record">
|
||||||
|
<j-ellipsis :value="text" :length="40"/>
|
||||||
|
</span>
|
||||||
</a-table>
|
</a-table>
|
||||||
<!-- table区域-end -->
|
<!-- table区域-end -->
|
||||||
</a-card>
|
</a-card>
|
||||||
@ -67,10 +75,14 @@
|
|||||||
<script>
|
<script>
|
||||||
import { filterObj } from '@/utils/util';
|
import { filterObj } from '@/utils/util';
|
||||||
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
|
import JEllipsis from '@/components/jeecg/JEllipsis'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "LogList",
|
name: "LogList",
|
||||||
mixins:[JeecgListMixin],
|
mixins:[JeecgListMixin],
|
||||||
|
components: {
|
||||||
|
JEllipsis
|
||||||
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
description: '这是日志管理页面',
|
description: '这是日志管理页面',
|
||||||
@ -81,6 +93,7 @@
|
|||||||
logType:'1',
|
logType:'1',
|
||||||
keyWord:'',
|
keyWord:'',
|
||||||
},
|
},
|
||||||
|
tabKey: "1",
|
||||||
// 表头
|
// 表头
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
@ -96,6 +109,7 @@
|
|||||||
title: '日志内容',
|
title: '日志内容',
|
||||||
align:"left",
|
align:"left",
|
||||||
dataIndex: 'logContent',
|
dataIndex: 'logContent',
|
||||||
|
scopedSlots: { customRender: 'logContent' },
|
||||||
sorter: true
|
sorter: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -143,6 +157,12 @@
|
|||||||
sorter: true
|
sorter: true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
operateColumn:
|
||||||
|
{
|
||||||
|
title: '操作类型',
|
||||||
|
dataIndex: 'operateType_dictText',
|
||||||
|
align:"center",
|
||||||
|
},
|
||||||
labelCol: {
|
labelCol: {
|
||||||
xs: { span: 1 },
|
xs: { span: 1 },
|
||||||
sm: { span: 2 },
|
sm: { span: 2 },
|
||||||
@ -177,6 +197,17 @@
|
|||||||
},
|
},
|
||||||
// 日志类型
|
// 日志类型
|
||||||
callback(key){
|
callback(key){
|
||||||
|
|
||||||
|
// 动态添加操作类型列
|
||||||
|
if (key == 2) {
|
||||||
|
this.tabKey = '2';
|
||||||
|
this.columns.splice(7, 0, this.operateColumn);
|
||||||
|
}else if(this.columns.length == 9)
|
||||||
|
{
|
||||||
|
this.tabKey = '1';
|
||||||
|
this.columns.splice(7,1);
|
||||||
|
}
|
||||||
|
|
||||||
let that=this;
|
let that=this;
|
||||||
that.queryParam.logType=key;
|
that.queryParam.logType=key;
|
||||||
that.loadData();
|
that.loadData();
|
||||||
|
|||||||
198
ant-design-vue-jeecg/src/views/system/NewPermissionList.vue
Normal file
198
ant-design-vue-jeecg/src/views/system/NewPermissionList.vue
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
<template>
|
||||||
|
<a-card :bordered="false">
|
||||||
|
|
||||||
|
<!-- 操作按钮区域 -->
|
||||||
|
<div class="table-operator">
|
||||||
|
<a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
|
||||||
|
<a-button
|
||||||
|
@click="batchDel"
|
||||||
|
v-if="selectedRowKeys.length > 0"
|
||||||
|
ghost
|
||||||
|
type="primary"
|
||||||
|
icon="delete">批量删除
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- table区域-begin -->
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
|
||||||
|
<i class="anticon anticon-info-circle ant-alert-icon"></i>已选择 <a style="font-weight: 600">{{
|
||||||
|
selectedRowKeys.length }}</a>项
|
||||||
|
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-table
|
||||||
|
:columns="columns"
|
||||||
|
size="middle"
|
||||||
|
:pagination="false"
|
||||||
|
:dataSource="dataSource"
|
||||||
|
:loading="loading"
|
||||||
|
@expand="expandSubmenu"
|
||||||
|
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}">
|
||||||
|
|
||||||
|
<span slot="action" slot-scope="text, record">
|
||||||
|
<a @click="handleEdit(record)">编辑</a>
|
||||||
|
|
||||||
|
<a-divider type="vertical"/>
|
||||||
|
<a-dropdown>
|
||||||
|
<a class="ant-dropdown-link">
|
||||||
|
更多 <a-icon type="down"/>
|
||||||
|
</a>
|
||||||
|
<a-menu slot="overlay">
|
||||||
|
<a-menu-item>
|
||||||
|
<a href="javascript:;" @click="handleDetail(record)">详情</a>
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item>
|
||||||
|
<a href="javascript:;" @click="handleAddSub(record)">添加子菜单</a>
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item>
|
||||||
|
<a href="javascript:;" @click="handleDataRule(record)">数据规则</a>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item>
|
||||||
|
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
|
||||||
|
<a>删除</a>
|
||||||
|
</a-popconfirm>
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
</a-dropdown>
|
||||||
|
</span>
|
||||||
|
<!-- 字符串超长截取省略号显示 -->
|
||||||
|
<span slot="url" slot-scope="text">
|
||||||
|
<j-ellipsis :value="text" :length="25"/>
|
||||||
|
</span>
|
||||||
|
<!-- 字符串超长截取省略号显示-->
|
||||||
|
<span slot="component" slot-scope="text">
|
||||||
|
<j-ellipsis :value="text"/>
|
||||||
|
</span>
|
||||||
|
</a-table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- table区域-end -->
|
||||||
|
|
||||||
|
<permission-modal ref="modalForm" @ok="modalFormOk"></permission-modal>
|
||||||
|
<permission-data-rule-list ref="PermissionDataRuleList" @ok="modalFormOk"></permission-data-rule-list>
|
||||||
|
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import PermissionModal from './modules/PermissionModal'
|
||||||
|
import { getSystemMenuList,getSystemSubmenu } from '@/api/api'
|
||||||
|
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
||||||
|
import PermissionDataRuleList from './PermissionDataRuleList'
|
||||||
|
import JEllipsis from '@/components/jeecg/JEllipsis'
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
title: '菜单名称',
|
||||||
|
dataIndex: 'name',
|
||||||
|
key: 'name'
|
||||||
|
}, {
|
||||||
|
title: '菜单类型',
|
||||||
|
dataIndex: 'menuType',
|
||||||
|
key: 'menuType',
|
||||||
|
customRender: function(text) {
|
||||||
|
if (text == 0) {
|
||||||
|
return '菜单'
|
||||||
|
} else if (text == 1) {
|
||||||
|
return '菜单'
|
||||||
|
} else if (text == 2) {
|
||||||
|
return '按钮/权限'
|
||||||
|
} else {
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},/*{
|
||||||
|
title: '权限编码',
|
||||||
|
dataIndex: 'perms',
|
||||||
|
key: 'permissionCode',
|
||||||
|
},*/{
|
||||||
|
title: 'icon',
|
||||||
|
dataIndex: 'icon',
|
||||||
|
key: 'icon'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '组件',
|
||||||
|
dataIndex: 'component',
|
||||||
|
key: 'component',
|
||||||
|
scopedSlots: { customRender: 'component' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '路径',
|
||||||
|
dataIndex: 'url',
|
||||||
|
key: 'url',
|
||||||
|
scopedSlots: { customRender: 'url' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '排序',
|
||||||
|
dataIndex: 'sortNo',
|
||||||
|
key: 'sortNo'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
dataIndex: 'action',
|
||||||
|
scopedSlots: { customRender: 'action' },
|
||||||
|
align: 'center',
|
||||||
|
width: 150
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'PermissionList',
|
||||||
|
mixins: [JeecgListMixin],
|
||||||
|
components: {
|
||||||
|
PermissionDataRuleList,
|
||||||
|
PermissionModal,
|
||||||
|
JEllipsis
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
description: '这是菜单管理页面',
|
||||||
|
// 表头
|
||||||
|
columns: columns,
|
||||||
|
loading: false,
|
||||||
|
url: {
|
||||||
|
list: '/sys/permission/list',
|
||||||
|
delete: '/sys/permission/delete',
|
||||||
|
deleteBatch: '/sys/permission/deleteBatch'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
loadData() {
|
||||||
|
this.dataSource = []
|
||||||
|
getSystemMenuList().then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
console.log(res.result)
|
||||||
|
this.dataSource = res.result
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
expandSubmenu(expanded, record){
|
||||||
|
if(expanded){
|
||||||
|
getSystemSubmenu({parentId:record.id}).then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
record.children = res.result
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
// 打开数据规则编辑
|
||||||
|
handleDataRule(record) {
|
||||||
|
this.$refs.PermissionDataRuleList.edit(record)
|
||||||
|
},
|
||||||
|
handleAddSub(record) {
|
||||||
|
this.$refs.modalForm.title = "添加子菜单";
|
||||||
|
this.$refs.modalForm.localMenuType = 1;
|
||||||
|
this.$refs.modalForm.disableSubmit = false;
|
||||||
|
this.$refs.modalForm.edit({status:'1',permsType:'1',route:true,'parentId':record.id});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
@import '~@assets/less/common.less'
|
||||||
|
</style>
|
||||||
@ -14,7 +14,7 @@
|
|||||||
background: '#fff',
|
background: '#fff',
|
||||||
}">
|
}">
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form>
|
<a-form @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="12">
|
<a-row :gutter="12">
|
||||||
<a-col :md="8" :sm="8">
|
<a-col :md="8" :sm="8">
|
||||||
<a-form-item label="规则名称" :labelCol="{span: 8}" :wrapperCol="{span: 14, offset: 1}">
|
<a-form-item label="规则名称" :labelCol="{span: 8}" :wrapperCol="{span: 14, offset: 1}">
|
||||||
@ -118,6 +118,10 @@
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
loadData() {
|
loadData() {
|
||||||
|
//20190908 scott for: 首次进入菜单列表的时候,不加载权限列表
|
||||||
|
if(!this.permId){
|
||||||
|
return
|
||||||
|
}
|
||||||
let that = this
|
let that = this
|
||||||
this.dataSource = []
|
this.dataSource = []
|
||||||
var params = this.getQueryParams()//查询条件
|
var params = this.getQueryParams()//查询条件
|
||||||
|
|||||||
@ -98,7 +98,7 @@
|
|||||||
} else if (text == 1) {
|
} else if (text == 1) {
|
||||||
return '菜单'
|
return '菜单'
|
||||||
} else if (text == 2) {
|
} else if (text == 2) {
|
||||||
return '按钮'
|
return '按钮/权限'
|
||||||
} else {
|
} else {
|
||||||
return text
|
return text
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<!-- 查询区域 -->
|
<!-- 查询区域 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
|
|
||||||
<a-col :md="6" :sm="10">
|
<a-col :md="6" :sm="10">
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<!-- 查询区域 -->
|
<!-- 查询区域 -->
|
||||||
<div class="table-page-search-wrapper">
|
<div class="table-page-search-wrapper">
|
||||||
<!-- 搜索区域 -->
|
<!-- 搜索区域 -->
|
||||||
<a-form layout="inline">
|
<a-form layout="inline" @keyup.enter.native="searchQuery">
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :md="6" :sm="8">
|
<a-col :md="6" :sm="8">
|
||||||
<a-form-item label="名称" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
|
<a-form-item label="名称" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user