JeecgBoot 2.0.2 版本发布
86
README.md
|
@ -6,7 +6,7 @@
|
||||||
Jeecg-Boot 快速开发平台(前后端分离版本)
|
Jeecg-Boot 快速开发平台(前后端分离版本)
|
||||||
===============
|
===============
|
||||||
|
|
||||||
当前最新版本: 2.0.1(发布日期:20190603)
|
当前最新版本: 2.0.2(发布日期:20190708)
|
||||||
|
|
||||||
[![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
[![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
||||||
[![](https://img.shields.io/badge/Author-Scott-orange.svg)](https://blog.csdn.net/zhangdaiscott)
|
[![](https://img.shields.io/badge/Author-Scott-orange.svg)](https://blog.csdn.net/zhangdaiscott)
|
||||||
|
@ -21,7 +21,7 @@ Jeecg-Boot 快速开发平台(前后端分离版本)
|
||||||
|
|
||||||
<h4 align="center">Java RAD framework for enterprise web applications</h4>
|
<h4 align="center">Java RAD framework for enterprise web applications</h4>
|
||||||
|
|
||||||
Jeecg-Boot 是一款基于代码生成器的智能开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design。强大的代码生成器让前端和后台代码一键生成,不需要写任何代码,保持jeecg一贯的强大,绝对是全栈开发福音!! JeecgBoot在提高UI能力的同时,降低了前后分离的开发成本,JeecgBoot还独创在线开发模式(No代码概念),一系列在线智能开发:在线配置表单、在线配置报表、在线图表设计、在线设计流程等等。
|
Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台!前后端分离架构:SpringBoot,Ant Design Vue,Mybatis,Shiro,JWT。强大的代码生成器让前端和后台代码一键生成,不需要写任何代码,保持jeecg一贯的强大,绝对是全栈开发福音!! JeecgBoot在提高UI能力的同时,降低了前后分离的开发成本,JeecgBoot还独创在线开发模式(No代码概念),一系列在线智能开发:在线配置表单、在线配置报表、在线图表设计、在线设计流程等等。
|
||||||
|
|
||||||
JEECG宗旨是: 简单功能由Online Coding配置实现(在线配置表单、在线配置报表、在线图表设计、在线设计流程、在线设计表单),复杂功能由代码生成器生成进行手工Merge,既保证了智能又兼顾了灵活;
|
JEECG宗旨是: 简单功能由Online Coding配置实现(在线配置表单、在线配置报表、在线图表设计、在线设计流程、在线设计表单),复杂功能由代码生成器生成进行手工Merge,既保证了智能又兼顾了灵活;
|
||||||
业务流程采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
|
业务流程采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
|
||||||
|
@ -38,20 +38,19 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
||||||
|
|
||||||
- 在线演示 : [http://boot.jeecg.org](http://boot.jeecg.org)
|
- 在线演示 : [http://boot.jeecg.org](http://boot.jeecg.org)
|
||||||
|
|
||||||
- 在线文档 : [http://jeecg-boot.mydoc.io](http://jeecg-boot.mydoc.io)
|
- 在线教程: [http://jeecg-boot.mydoc.io/?t=345660](http://jeecg-boot.mydoc.io/?t=345660)
|
||||||
|
|
||||||
- 入门教程: [http://jeecg-boot.mydoc.io/?t=345660](http://jeecg-boot.mydoc.io/?t=345660)
|
- 常见问题: [入门常见问题大全](http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&extra=page%3D1)
|
||||||
|
|
||||||
- 入门必看: [JeecgBoot常见问题大全](http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&extra=page%3D1)
|
- QQ交流群 : ①284271917、②769925425
|
||||||
|
|
||||||
- QQ交流群 : ②769925425、①284271917(满)
|
|
||||||
|
|
||||||
- 参与开源: [欢迎技术爱好者,加入JEECG开源团队](http://jeecg.com/#/doc/canyu-os)
|
|
||||||
|
|
||||||
- 技术论坛: [http://www.jeecg.org](http://www.jeecg.org)
|
- 技术论坛: [http://www.jeecg.org](http://www.jeecg.org)
|
||||||
|
|
||||||
- 版本日志: [版本发布日志](http://www.jeecg.com/#/doc/changelog)
|
- 更新日志: [版本日志](http://www.jeecg.com/#/doc/changelog)
|
||||||
|
|
||||||
|
- Online初体验: [1分钟快速学习](https://segmentfault.com/a/1190000019448442)
|
||||||
|
|
||||||
|
- 如何参与: [欢迎技术爱好者,加入JEECG开团队](http://jeecg.com/#/doc/canyu-os)
|
||||||
|
|
||||||
|
|
||||||
为什么选择JEECG-BOOT?
|
为什么选择JEECG-BOOT?
|
||||||
|
@ -72,7 +71,7 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
||||||
* 14.在线流程设计,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转
|
* 14.在线流程设计,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转
|
||||||
* 15.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据;
|
* 15.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据;
|
||||||
* 16.国际化:支持多语言,开发国际化项目非常方便;
|
* 16.国际化:支持多语言,开发国际化项目非常方便;
|
||||||
* 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.高级组合查询功能,在线配置支持主子表关联查询,可保存查询历史
|
||||||
|
@ -96,7 +95,7 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
||||||
#### 后端
|
#### 后端
|
||||||
- 基础框架:Spring Boot 2.1.3.RELEASE
|
- 基础框架:Spring Boot 2.1.3.RELEASE
|
||||||
|
|
||||||
- 持久层框架:Mybatis-plus_3.0.6
|
- 持久层框架:Mybatis-plus_3.1.2
|
||||||
|
|
||||||
- 安全框架:Apache Shiro 1.4.0,Jwt_3.7.0
|
- 安全框架:Apache Shiro 1.4.0,Jwt_3.7.0
|
||||||
|
|
||||||
|
@ -111,7 +110,7 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
||||||
|
|
||||||
#### 前端
|
#### 前端
|
||||||
|
|
||||||
- [Vue 2.5.22](https://cn.vuejs.org/),[Vuex](https://vuex.vuejs.org/zh/),[Vue Router](https://router.vuejs.org/zh/)
|
- [Vue 2.6.10](https://cn.vuejs.org/),[Vuex](https://vuex.vuejs.org/zh/),[Vue Router](https://router.vuejs.org/zh/)
|
||||||
- [Axios](https://github.com/axios/axios)
|
- [Axios](https://github.com/axios/axios)
|
||||||
- [ant-design-vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/)
|
- [ant-design-vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/)
|
||||||
- [webpack](https://www.webpackjs.com/),[yarn](https://yarnpkg.com/zh-Hans/)
|
- [webpack](https://www.webpackjs.com/),[yarn](https://yarnpkg.com/zh-Hans/)
|
||||||
|
@ -150,6 +149,12 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
||||||
│ ├─表单权限(控制字段禁用、隐藏)
|
│ ├─表单权限(控制字段禁用、隐藏)
|
||||||
│ ├─部门管理
|
│ ├─部门管理
|
||||||
│ └─字典管理
|
│ └─字典管理
|
||||||
|
│ └─树分类字典
|
||||||
|
│ └─系统公告
|
||||||
|
│ └─我的组织机构
|
||||||
|
├─消息中心
|
||||||
|
│ ├─消息管理
|
||||||
|
│ ├─模板管理
|
||||||
├─智能化功能
|
├─智能化功能
|
||||||
│ ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音)
|
│ ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音)
|
||||||
│ ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择)
|
│ ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择)
|
||||||
|
@ -204,8 +209,7 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
||||||
│ └─省略显示组件
|
│ └─省略显示组件
|
||||||
│ └─时间控件
|
│ └─时间控件
|
||||||
│ └─高级查询
|
│ └─高级查询
|
||||||
│ └─通用选择用户组件
|
│ └─用户选择组件
|
||||||
│ └─通过组织机构选择用户组件
|
|
||||||
│ └─报表组件封装
|
│ └─报表组件封装
|
||||||
│ └─字典组件
|
│ └─字典组件
|
||||||
│ └─下拉多选组件
|
│ └─下拉多选组件
|
||||||
|
@ -215,6 +219,9 @@ Jeecg-Boot快速开发平台,可以应用在任何J2EE项目的开发中,尤
|
||||||
│ └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单)
|
│ └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单)
|
||||||
│ └─在线code编辑器
|
│ └─在线code编辑器
|
||||||
│ └─上传文件组件
|
│ └─上传文件组件
|
||||||
|
│ └─验证码组件
|
||||||
|
│ └─树列表组件
|
||||||
|
│ └─表单禁用组件
|
||||||
│ └─等等
|
│ └─等等
|
||||||
│─更多页面模板
|
│─更多页面模板
|
||||||
│ ├─各种高级表单
|
│ ├─各种高级表单
|
||||||
|
@ -301,47 +308,44 @@ yarn run build
|
||||||
yarn run lint
|
yarn run lint
|
||||||
```
|
```
|
||||||
|
|
||||||
Online初体验
|
|
||||||
----
|
|
||||||
|
|
||||||
![输入图片说明](https://wx2.sinaimg.cn/large/7087dfcbly1g3xkz0lkgyg211y0lce81.gif "在这里输入图片标题")
|
|
||||||
> 演示如何通过JSON数据,快速的配置一个图形报表,支持曲线、柱状图、饼状图等
|
|
||||||
|
|
||||||
|
|
||||||
![输入图片说明](https://wx2.sinaimg.cn/large/7087dfcbly1g3xkz9aduxg211y0lc4mx.gif "在这里输入图片标题")
|
|
||||||
> 演示如何实现一个复杂的报表模板,从不同的数据源取数据,展示不同的图表内容,组合展示
|
|
||||||
|
|
||||||
![输入图片说明](https://wx2.sinaimg.cn/large/7087dfcbly1g3xkzu79vyg211y0lcnpf.gif "在这里输入图片标题")
|
|
||||||
> 演示如何实现图表的多种排版布局,支持单排、双排、组合、TAB
|
|
||||||
|
|
||||||
|
|
||||||
系统效果
|
系统效果
|
||||||
----
|
----
|
||||||
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201902/25154007_icdX.png "在这里输入图片标题")
|
##### PC端
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14155402_AmlV.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14155402_AmlV.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160623_8fwk.png "在这里输入图片标题")
|
![输入图片说明](https://oscimg.oschina.net/oscnet/ba807921197596ba56f495d4b22ee3280ca.jpg "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160633_u59G.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160643_kCJ7.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160650_fcgw.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160657_cHwb.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160657_cHwb.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160705_NAJn.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160751_bsO9.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160801_2AhS.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160813_KmXS.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160813_KmXS.png "在这里输入图片标题")
|
||||||
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160935_Nibs.png "在这里输入图片标题")
|
||||||
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160957_hN3X.png "在这里输入图片标题")
|
||||||
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14161004_bxQ4.png "在这里输入图片标题")
|
||||||
|
|
||||||
|
##### 报表
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160828_pkFr.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160828_pkFr.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160834_Lo23.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160834_Lo23.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160842_QK7B.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160842_QK7B.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160849_GBm5.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160849_GBm5.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160858_6RAM.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160858_6RAM.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160905_RGJ5.png "在这里输入图片标题")
|
|
||||||
|
##### 流程
|
||||||
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160623_8fwk.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160917_9Ftz.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160917_9Ftz.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160926_PUDV.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160633_u59G.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160935_Nibs.png "在这里输入图片标题")
|
![输入图片说明](https://static.oschina.net/uploads/img/201907/05165142_yyQ7.png "在这里输入图片标题")
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160947_gfoN.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14160957_hN3X.png "在这里输入图片标题")
|
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14161004_bxQ4.png "在这里输入图片标题")
|
##### 手机端
|
||||||
![输入图片说明](https://static.oschina.net/uploads/img/201904/14161013_zW5n.png "在这里输入图片标题")
|
![](https://oscimg.oschina.net/oscnet/da543c5d0d57baab0cecaa4670c8b68c521.jpg)
|
||||||
|
![](https://oscimg.oschina.net/oscnet/fda4bd82cab9d682de1c1fbf2060bf14fa6.jpg)
|
||||||
|
|
||||||
|
##### PAD端
|
||||||
|
![](https://oscimg.oschina.net/oscnet/e90fef970a8c33790ab03ffd6c4c7cec225.jpg)
|
||||||
|
![](https://oscimg.oschina.net/oscnet/d78218803a9e856a0aa82b45efc49849a0c.jpg)
|
||||||
|
![](https://oscimg.oschina.net/oscnet/0404054d9a12647ef6f82cf9cfb80a5ac02.jpg)
|
||||||
|
![](https://oscimg.oschina.net/oscnet/59c23b230f52384e588ee16309b44fa20de.jpg)
|
||||||
|
|
||||||
|
|
||||||
其他说明
|
其他说明
|
||||||
|
|
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.2 KiB |
|
@ -1,43 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch -->
|
|
||||||
<title>Group 28 Copy 5</title>
|
|
||||||
<desc>Created with Sketch.</desc>
|
|
||||||
<defs>
|
|
||||||
<linearGradient x1="62.1023273%" y1="0%" x2="108.19718%" y2="37.8635764%" id="linearGradient-1">
|
|
||||||
<stop stop-color="#4285EB" offset="0%"></stop>
|
|
||||||
<stop stop-color="#2EC7FF" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient x1="69.644116%" y1="0%" x2="54.0428975%" y2="108.456714%" id="linearGradient-2">
|
|
||||||
<stop stop-color="#29CDFF" offset="0%"></stop>
|
|
||||||
<stop stop-color="#148EFF" offset="37.8600687%"></stop>
|
|
||||||
<stop stop-color="#0A60FF" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient x1="69.6908165%" y1="-12.9743587%" x2="16.7228981%" y2="117.391248%" id="linearGradient-3">
|
|
||||||
<stop stop-color="#FA816E" offset="0%"></stop>
|
|
||||||
<stop stop-color="#F74A5C" offset="41.472606%"></stop>
|
|
||||||
<stop stop-color="#F51D2C" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient x1="68.1279872%" y1="-35.6905737%" x2="30.4400914%" y2="114.942679%" id="linearGradient-4">
|
|
||||||
<stop stop-color="#FA8E7D" offset="0%"></stop>
|
|
||||||
<stop stop-color="#F74A5C" offset="51.2635191%"></stop>
|
|
||||||
<stop stop-color="#F51D2C" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="logo" transform="translate(-20.000000, -20.000000)">
|
|
||||||
<g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)">
|
|
||||||
<g id="Group-27-Copy-3">
|
|
||||||
<g id="Group-25" fill-rule="nonzero">
|
|
||||||
<g id="2">
|
|
||||||
<path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-1)"></path>
|
|
||||||
<path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-2)"></path>
|
|
||||||
</g>
|
|
||||||
<path d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z" id="Shape" fill="url(#linearGradient-3)"></path>
|
|
||||||
</g>
|
|
||||||
<ellipse id="Combined-Shape" fill="url(#linearGradient-4)" cx="100.519339" cy="100.436681" rx="23.6001926" ry="23.580786"></ellipse>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.6 KiB |
|
@ -1,35 +0,0 @@
|
||||||
|
|
||||||
<template>
|
|
||||||
<component ref="compModel" :is="comp" :formData="formData" v-if="comp" @ok="callBackOk" @close="callBackClose"></component>
|
|
||||||
</template>
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'DynamicComponent',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
compName: this.path
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
comp: function () {
|
|
||||||
return () => import(`@/views/${this.compName}.vue`)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
props: ['path','formData'],
|
|
||||||
methods: {
|
|
||||||
add () {
|
|
||||||
this.$refs.compModel.add();
|
|
||||||
},
|
|
||||||
callBackClose () {
|
|
||||||
this.$emit('close');
|
|
||||||
},
|
|
||||||
handleOk () {
|
|
||||||
this.$refs.compModel.handleOk();
|
|
||||||
},
|
|
||||||
callBackOk(){
|
|
||||||
this.$emit('ok');
|
|
||||||
this.close();
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
|
@ -1,72 +0,0 @@
|
||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
:title="title"
|
|
||||||
:width="width"
|
|
||||||
:visible="visible"
|
|
||||||
:confirmLoading="confirmLoading"
|
|
||||||
@ok="handleOk"
|
|
||||||
@cancel="handleCancel"
|
|
||||||
destroyOnClose
|
|
||||||
cancelText="关闭">
|
|
||||||
<a-spin :spinning="confirmLoading">
|
|
||||||
<dynamic-component ref="dynamiclink" :path="path" :formData="formData" @ok="callBackOk" @close="callBackClose"></dynamic-component>
|
|
||||||
</a-spin>
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
import DynamicComponent from "./DynamicComponent";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "FormCommonModal",
|
|
||||||
props: ['path'],
|
|
||||||
components: {
|
|
||||||
DynamicComponent
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
title:"操作",
|
|
||||||
width:"80%",
|
|
||||||
visible: false,
|
|
||||||
confirmLoading: false,
|
|
||||||
formData:{},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
add () {
|
|
||||||
this.formData =[];
|
|
||||||
this.title = "新增";
|
|
||||||
this.visible = true;
|
|
||||||
this.$refs.dynamiclink.add();
|
|
||||||
},
|
|
||||||
edit (record) {
|
|
||||||
var data = {
|
|
||||||
dataId:record.id,
|
|
||||||
}
|
|
||||||
this.formData = data;
|
|
||||||
this.visible = true;
|
|
||||||
},
|
|
||||||
callBackClose () {
|
|
||||||
this.$emit('close');
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
handleOk () {
|
|
||||||
this.$refs.dynamiclink.handleOk();
|
|
||||||
},
|
|
||||||
callBackOk(){
|
|
||||||
this.$emit('ok');
|
|
||||||
this.callBackClose();
|
|
||||||
},
|
|
||||||
handleCancel () {
|
|
||||||
this.callBackClose()
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -1,120 +0,0 @@
|
||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
:title="title"
|
|
||||||
:width="280"
|
|
||||||
:visible="visible"
|
|
||||||
:confirmLoading="confirmLoading"
|
|
||||||
:bodyStyle ="bodyStyle"
|
|
||||||
:mask = "false"
|
|
||||||
destroyOnClose
|
|
||||||
:footer="null"
|
|
||||||
@cancel="handleCancel"
|
|
||||||
cancelText="关闭">
|
|
||||||
|
|
||||||
<a-spin :spinning="confirmLoading">
|
|
||||||
<div style="height: 300px;overflow: hidden;overflow-y: auto;overflow-x: auto;">
|
|
||||||
<template v-for="(item, key, index) in nodeInfos">
|
|
||||||
<table class="gridtable">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th width="90">任务名称</th>
|
|
||||||
<td width="150">{{ item.taskName}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th width="90">执行人</th>
|
|
||||||
<td width="150">{{ item.taskAssigneeId}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th width="90">开始时间</th>
|
|
||||||
<td width="150">{{ item.taskBeginTime }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th width="90">结束时间</th>
|
|
||||||
<td width="150">{{ item.taskEndTime }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th width="90">耗时</th>
|
|
||||||
<td width="150">{{ item.durationStr }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th width="90">意见</th>
|
|
||||||
<td width="150">{{ item.remarks }}</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</a-spin>
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { httpAction } from '@/api/manage'
|
|
||||||
import pick from 'lodash.pick'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "ProcNodeInfoModel",
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
title:"任务审批详情",
|
|
||||||
visible: false,
|
|
||||||
bodyStyle:{
|
|
||||||
padding: "0",
|
|
||||||
},
|
|
||||||
confirmLoading: false,
|
|
||||||
validatorRules:{
|
|
||||||
},
|
|
||||||
nodeInfos:[],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
showInfo(record,taskId) {
|
|
||||||
this.nodeInfos = [];
|
|
||||||
for (var item of record) {
|
|
||||||
if(item.taskId == taskId){
|
|
||||||
this.nodeInfos.push(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.visible = true;
|
|
||||||
},
|
|
||||||
close() {
|
|
||||||
this.nodeInfos = [];
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
handleCancel () {
|
|
||||||
this.nodeInfos = [];
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
table.gridtable {
|
|
||||||
margin: 0 auto;
|
|
||||||
margin-top: 10px;
|
|
||||||
font-family: verdana,arial,sans-serif;
|
|
||||||
font-size:12px;
|
|
||||||
color:#333333;
|
|
||||||
border-width: 1px;
|
|
||||||
border-color: #ddd;
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
table.gridtable th {
|
|
||||||
border-width: 1px;
|
|
||||||
padding: 8px;
|
|
||||||
border-style: solid;
|
|
||||||
border-color: #ddd;
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
table.gridtable td {
|
|
||||||
border-width: 1px;
|
|
||||||
padding: 8px;
|
|
||||||
border-style: solid;
|
|
||||||
border-color: #ddd;
|
|
||||||
background-color: #ffffff;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,136 +0,0 @@
|
||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
:title="title"
|
|
||||||
:width="900"
|
|
||||||
:visible="visible"
|
|
||||||
:confirmLoading="confirmLoading"
|
|
||||||
@cancel="handleCancel"
|
|
||||||
:bodyStyle="bodyStyle"
|
|
||||||
style="top: 50px;"
|
|
||||||
destroyOnClose
|
|
||||||
:footer="null"
|
|
||||||
cancelText="关闭">
|
|
||||||
|
|
||||||
<a-spin :spinning="confirmLoading">
|
|
||||||
<img :src="picUrl" alt="流程图" usemap="#planetmap"/>
|
|
||||||
<map name="planetmap">
|
|
||||||
<template v-for="(item, key, index) in nodePositionInfo.positionList">
|
|
||||||
<area shape="rect" :coords="item.coords" title="Venus" @mouseover="showNodeInfo(nodePositionInfo.hisTasks,item.id)">
|
|
||||||
</template>
|
|
||||||
</map>
|
|
||||||
</a-spin>
|
|
||||||
<proc-node-info-model ref="nodeInfoModel"></proc-node-info-model>
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { getAction } from '@/api/manage'
|
|
||||||
import qs from 'qs';
|
|
||||||
import ProcNodeInfoModel from "./ProcNodeInfoModel.vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {ProcNodeInfoModel},
|
|
||||||
name: "ProcessInstPicModal",
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
title:"操作",
|
|
||||||
visible: false,
|
|
||||||
nodePositionInfo:{},
|
|
||||||
model: {},
|
|
||||||
labelCol: {
|
|
||||||
xs: { span: 24 },
|
|
||||||
sm: { span: 5 },
|
|
||||||
},
|
|
||||||
wrapperCol: {
|
|
||||||
xs: { span: 24 },
|
|
||||||
sm: { span: 16 },
|
|
||||||
},
|
|
||||||
bodyStyle:{
|
|
||||||
"overflow-y":"auto",
|
|
||||||
"overflow-x":"auto",
|
|
||||||
height:(window.innerHeight-280)+"px",
|
|
||||||
},
|
|
||||||
confirmLoading: false,
|
|
||||||
picUrl:"",
|
|
||||||
url: {
|
|
||||||
getProcessInfo: "/process/extActFlowData/getProcessInfo",
|
|
||||||
getNodePositionInfo:"/act/task/getNodePositionInfo",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
preview(flowCode,dataId){
|
|
||||||
this.visible = true;
|
|
||||||
var params = {
|
|
||||||
flowCode:flowCode,
|
|
||||||
dataId:dataId
|
|
||||||
};//查询条件
|
|
||||||
this.confirmLoading = true;
|
|
||||||
getAction(this.url.getProcessInfo,params).then((res)=>{
|
|
||||||
if(res.success){
|
|
||||||
var processInstanceId = res.result.processInstanceId;
|
|
||||||
this.picUrl = this.getResourceURL(processInstanceId);
|
|
||||||
this.getNodePositionInfoData(processInstanceId);
|
|
||||||
console.log("---流程图----",this.picUrl)
|
|
||||||
}else{
|
|
||||||
this.$message.warning(res.message);
|
|
||||||
}
|
|
||||||
}).catch(e => {
|
|
||||||
console.error(e)
|
|
||||||
}).then(() => {
|
|
||||||
this.confirmLoading = false;
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
},
|
|
||||||
close () {
|
|
||||||
this.$emit('close');
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
handleCancel () {
|
|
||||||
this.close()
|
|
||||||
},
|
|
||||||
// 获取静态资源访问地址
|
|
||||||
getResourceURL(processInstanceId) {
|
|
||||||
var params = qs.stringify({
|
|
||||||
//'token': Cookies.get('token'),
|
|
||||||
'_t': Date.parse(new Date())/1000,
|
|
||||||
'processInstanceId': processInstanceId
|
|
||||||
})
|
|
||||||
return `${window._CONFIG['domianURL']}/act/process/processPic?${params}`
|
|
||||||
},
|
|
||||||
// 获取静态资源访问地址
|
|
||||||
getResourceURL(processInstanceId) {
|
|
||||||
var params = qs.stringify({
|
|
||||||
//'token': Cookies.get('token'),
|
|
||||||
'_t': Date.parse(new Date())/1000,
|
|
||||||
'processInstanceId': processInstanceId
|
|
||||||
})
|
|
||||||
return `${window._CONFIG['domianURL']}/act/process/processPic?${params}`
|
|
||||||
},
|
|
||||||
|
|
||||||
// 查询坐标信息数据
|
|
||||||
getNodePositionInfoData(processInstanceId) {
|
|
||||||
var params = {processInstanceId:processInstanceId};//查询条件
|
|
||||||
getAction(this.url.getNodePositionInfo,params).then(res => {
|
|
||||||
if (res.success) {
|
|
||||||
this.nodePositionInfo = res.result
|
|
||||||
}
|
|
||||||
}).catch(e => {
|
|
||||||
console.error(e)
|
|
||||||
}).then(() => {
|
|
||||||
})
|
|
||||||
},
|
|
||||||
showNodeInfo(data,taskId){
|
|
||||||
this.$refs.nodeInfoModel.close();
|
|
||||||
this.$refs.nodeInfoModel.showInfo(data,taskId);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -1,56 +0,0 @@
|
||||||
# JDictSelectTag 组件用法
|
|
||||||
----
|
|
||||||
- 从字典表获取数据,dictCode格式说明: 字典code
|
|
||||||
```html
|
|
||||||
<j-dict-select-tag v-model="queryParam.sex" placeholder="请输入用户性别"
|
|
||||||
dictCode="sex"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
v-decorator用法:
|
|
||||||
```html
|
|
||||||
<j-dict-select-tag v-decorator="['sex', {}]" :triggerChange="true" placeholder="请输入用户性别"
|
|
||||||
dictCode="sex"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
- 从数据库表获取字典数据,dictCode格式说明: 表名,文本字段,取值字段
|
|
||||||
```html
|
|
||||||
<j-dict-select-tag v-model="queryParam.username" placeholder="请选择用户名称"
|
|
||||||
dictCode="sys_user,realname,id"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# JDictSelectUtil.js 列表字典函数用法
|
|
||||||
----
|
|
||||||
|
|
||||||
- 第一步: 引入依赖方法
|
|
||||||
```html
|
|
||||||
import {initDictOptions, filterDictText} from '@/components/dict/JDictSelectUtil'
|
|
||||||
```
|
|
||||||
|
|
||||||
- 第二步: 在created()初始化方法执行字典配置方法
|
|
||||||
```html
|
|
||||||
//初始化字典配置
|
|
||||||
this.initDictConfig();
|
|
||||||
```
|
|
||||||
|
|
||||||
- 第三步: 实现initDictConfig方法,加载列表所需要的字典(列表上有多个字典项,就执行多次initDictOptions方法)
|
|
||||||
|
|
||||||
```html
|
|
||||||
initDictConfig() {
|
|
||||||
//初始化字典 - 性别
|
|
||||||
initDictOptions('sex').then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
this.sexDictOptions = res.result;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
```
|
|
||||||
|
|
||||||
- 第四步: 实现字段的customRender方法
|
|
||||||
```html
|
|
||||||
customRender: (text, record, index) => {
|
|
||||||
//字典值替换通用方法
|
|
||||||
return filterDictText(this.sexDictOptions, text);
|
|
||||||
}
|
|
||||||
```
|
|
|
@ -1,309 +0,0 @@
|
||||||
<template>
|
|
||||||
|
|
||||||
<a-modal
|
|
||||||
:width="modalWidth"
|
|
||||||
:visible="visible"
|
|
||||||
:title="title"
|
|
||||||
@ok="handleSubmit"
|
|
||||||
@cancel="close"
|
|
||||||
cancelText="关闭"
|
|
||||||
style="margin-top: -70px"
|
|
||||||
wrapClassName="ant-modal-cust-warp"
|
|
||||||
>
|
|
||||||
<a-row :gutter="10" style="background-color: #ececec; padding: 10px; margin: -10px">
|
|
||||||
<a-col :md="6" :sm="24">
|
|
||||||
<a-card :bordered="false">
|
|
||||||
<!--组织机构-->
|
|
||||||
<a-directory-tree
|
|
||||||
selectable
|
|
||||||
:selectedKeys="selectedKeys"
|
|
||||||
:checkStrictly="true"
|
|
||||||
@select="this.onSelect"
|
|
||||||
:dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
|
|
||||||
:treeData="departTree"
|
|
||||||
/>
|
|
||||||
</a-card>
|
|
||||||
</a-col>
|
|
||||||
<a-col :md="18" :sm="24">
|
|
||||||
<a-card :bordered="false">
|
|
||||||
用户账号:
|
|
||||||
<a-input-search
|
|
||||||
:style="{width:'150px',marginBottom:'15px'}"
|
|
||||||
placeholder="请输入用户账号"
|
|
||||||
v-model="queryParam.username"
|
|
||||||
@search="onSearch"
|
|
||||||
></a-input-search>
|
|
||||||
<a-button @click="searchReset(1)" style="margin-left: 20px" icon="redo">重置</a-button>
|
|
||||||
<!--用户列表-->
|
|
||||||
<a-table
|
|
||||||
ref="table"
|
|
||||||
:scroll="scrollTrigger"
|
|
||||||
size="middle"
|
|
||||||
rowKey="id"
|
|
||||||
:columns="columns"
|
|
||||||
:dataSource="dataSource"
|
|
||||||
:pagination="ipagination"
|
|
||||||
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
|
||||||
@change="handleTableChange">
|
|
||||||
</a-table>
|
|
||||||
</a-card>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</a-modal>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { filterObj } from '@/utils/util'
|
|
||||||
import { queryDepartTreeList, getUserList, queryUserByDepId, queryUserRoleMap } from '@/api/api'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'JSearchUserByDep',
|
|
||||||
components: {},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
queryParam: {
|
|
||||||
username:"",
|
|
||||||
},
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '用户账号',
|
|
||||||
align: 'center',
|
|
||||||
dataIndex: 'username'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '真实姓名',
|
|
||||||
align: 'center',
|
|
||||||
dataIndex: 'realname'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '角色名称',
|
|
||||||
align: 'center',
|
|
||||||
dataIndex: 'roleName'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '性别',
|
|
||||||
align: 'center',
|
|
||||||
dataIndex: 'sex',
|
|
||||||
customRender: function(text) {
|
|
||||||
if (text === 1) {
|
|
||||||
return '男'
|
|
||||||
} else if (text === 2) {
|
|
||||||
return '女'
|
|
||||||
} else {
|
|
||||||
return text
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '手机号码',
|
|
||||||
align: 'center',
|
|
||||||
dataIndex: 'phone'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '邮箱',
|
|
||||||
align: 'center',
|
|
||||||
dataIndex: 'email'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
scrollTrigger: {},
|
|
||||||
dataSource: [],
|
|
||||||
selectedKeys: [],
|
|
||||||
userNameArr: [],
|
|
||||||
departName: '',
|
|
||||||
userRolesMap: {},
|
|
||||||
title: '',
|
|
||||||
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'
|
|
||||||
},
|
|
||||||
selectedRowKeys: [],
|
|
||||||
selectedRows: [],
|
|
||||||
modalWidth: 1250,
|
|
||||||
departTree: [],
|
|
||||||
visible: false,
|
|
||||||
form: this.$form.createForm(this)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
// 该方法触发屏幕自适应
|
|
||||||
this.resetScreenSize();
|
|
||||||
this.queryUserRoleMap();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
loadData(arg) {
|
|
||||||
if (arg === 1) {
|
|
||||||
this.ipagination.current = 1;
|
|
||||||
}
|
|
||||||
let params = this.getQueryParams();//查询条件
|
|
||||||
getUserList(params).then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
this.dataSource = res.result.records;
|
|
||||||
this.assignRoleName(this.dataSource);
|
|
||||||
this.ipagination.total = res.result.total;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
queryUserRoleMap(){
|
|
||||||
queryUserRoleMap().then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
this.userRolesMap = res.result;
|
|
||||||
this.loadData();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
// 触发屏幕自适应
|
|
||||||
resetScreenSize() {
|
|
||||||
let screenWidth = document.body.clientWidth;
|
|
||||||
if (screenWidth < 500) {
|
|
||||||
this.scrollTrigger = { x: 800 };
|
|
||||||
} else {
|
|
||||||
this.scrollTrigger = {};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
showModal() {
|
|
||||||
this.visible = true;
|
|
||||||
this.assignRoleName(this.dataSource);
|
|
||||||
this.queryDepartTree();
|
|
||||||
this.form.resetFields();
|
|
||||||
},
|
|
||||||
getQueryParams() {
|
|
||||||
let 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() {
|
|
||||||
let str = 'id,';
|
|
||||||
for (let a = 0; a < this.columns.length; a++) {
|
|
||||||
str += ',' + this.columns[a].dataIndex;
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
},
|
|
||||||
searchReset(num) {
|
|
||||||
let that = this;
|
|
||||||
if(num !== 0){
|
|
||||||
that.queryParam = {};
|
|
||||||
that.loadData(1);
|
|
||||||
}
|
|
||||||
that.selectedRowKeys = [];
|
|
||||||
that.userNameArr = [];
|
|
||||||
that.selectedKeys = [];
|
|
||||||
},
|
|
||||||
close() {
|
|
||||||
this.searchReset(0);
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
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.ipagination = pagination;
|
|
||||||
this.loadData();
|
|
||||||
},
|
|
||||||
handleSubmit() {
|
|
||||||
let that = this;
|
|
||||||
for (let i = 0, len = this.selectedRowKeys.length; i < len; i++) {
|
|
||||||
this.getUserNames(this.selectedRowKeys[i]);
|
|
||||||
}
|
|
||||||
that.$emit('ok', that.userNameArr.join(','));
|
|
||||||
that.close();
|
|
||||||
},
|
|
||||||
// 遍历匹配,获取用户真实姓名
|
|
||||||
getUserNames(rowId) {
|
|
||||||
let dataSource = this.dataSource;
|
|
||||||
for (let i = 0, len = dataSource.length; i < len; i++) {
|
|
||||||
if (rowId === dataSource[i].id) {
|
|
||||||
this.userNameArr.push(dataSource[i].realname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// 点击树节点,筛选出对应的用户
|
|
||||||
onSelect(selectedKeys) {
|
|
||||||
if (selectedKeys[0] != null) {
|
|
||||||
this.queryUserByDepId(selectedKeys); // 调用方法根据选选择的id查询用户信息
|
|
||||||
if (this.selectedKeys[0] !== selectedKeys[0]) {
|
|
||||||
this.selectedKeys = [selectedKeys[0]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSelectChange(selectedRowKeys, selectionRows) {
|
|
||||||
this.selectedRowKeys = selectedRowKeys;
|
|
||||||
this.selectionRows = selectionRows;
|
|
||||||
},
|
|
||||||
onSearch() {
|
|
||||||
this.loadData(1);
|
|
||||||
},
|
|
||||||
// 根据选择的id来查询用户信息
|
|
||||||
queryUserByDepId(selectedKeys) {
|
|
||||||
queryUserByDepId({ id: selectedKeys.toString() }).then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
this.dataSource = res.result;
|
|
||||||
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() {
|
|
||||||
queryDepartTreeList().then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
this.departTree = res.result;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
// 为角色名称赋值
|
|
||||||
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() {
|
|
||||||
this.loadData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.ant-table-tbody .ant-table-row td {
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#components-layout-demo-custom-trigger .trigger {
|
|
||||||
font-size: 18px;
|
|
||||||
line-height: 64px;
|
|
||||||
padding: 0 24px;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: color .3s;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,276 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { filterObj } from '@/utils/util'
|
|
||||||
import { getAction } from '@/api/manage'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "SelectDemoModal",
|
|
||||||
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>
|
|
|
@ -1,87 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<a-modal
|
|
||||||
:title="title"
|
|
||||||
:width="800"
|
|
||||||
:visible="visible"
|
|
||||||
:confirmLoading="confirmLoading"
|
|
||||||
@ok="handleSubmit"
|
|
||||||
@cancel="handleCancel">
|
|
||||||
<div>
|
|
||||||
<a-form-item label="用户名:" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
|
|
||||||
<a-input-search placeholder="点击右侧按钮选择用户" disabled @search="onSearch" v-model="userNames">
|
|
||||||
<a-button slot="enterButton" icon="search">选择</a-button>
|
|
||||||
</a-input-search>
|
|
||||||
</a-form-item>
|
|
||||||
</div>
|
|
||||||
</a-modal>
|
|
||||||
|
|
||||||
<!-- 用户查询列表 -->
|
|
||||||
<select-user-list-modal ref="selectUserListModal" @ok="getUserCallBack"></select-user-list-modal>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {getUserList} from '@/api/api'
|
|
||||||
import SelectUserListModal from './modal/SelectUserListModal'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "SelectUserModal",
|
|
||||||
components: {
|
|
||||||
SelectUserListModal,
|
|
||||||
},
|
|
||||||
props: ['taskId'],
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
title: "操作",
|
|
||||||
visible: false,
|
|
||||||
selectUserListVisible: false,
|
|
||||||
model: {},
|
|
||||||
confirmLoading: false,
|
|
||||||
userNames: '',
|
|
||||||
userKeys: '',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
open() {
|
|
||||||
this.userNames = ''
|
|
||||||
this.userKeys = ''
|
|
||||||
this.visible = true;
|
|
||||||
},
|
|
||||||
close() {
|
|
||||||
this.$emit('close');
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
handleCancel() {
|
|
||||||
this.close()
|
|
||||||
},
|
|
||||||
onSearch() {
|
|
||||||
this.$refs.selectUserListModal.open();
|
|
||||||
},
|
|
||||||
getUserCallBack(selectionRows) {
|
|
||||||
console.log(selectionRows)
|
|
||||||
let names = ''
|
|
||||||
let keys = ''
|
|
||||||
for (let row of selectionRows) {
|
|
||||||
names = row.realname + "," + names
|
|
||||||
keys = row.username + "," + keys
|
|
||||||
}
|
|
||||||
this.userNames = names
|
|
||||||
this.userKeys = keys
|
|
||||||
|
|
||||||
console.log('--userkeys--' + this.userKeys)
|
|
||||||
},
|
|
||||||
handleSubmit() {
|
|
||||||
console.log("taskId: "+ this.taskId)
|
|
||||||
this.$emit('ok', this.userKeys,this.taskId);
|
|
||||||
this.close()
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -1,97 +0,0 @@
|
||||||
<template>
|
|
||||||
<a-modal
|
|
||||||
:title="title"
|
|
||||||
:width="600"
|
|
||||||
:visible="visible"
|
|
||||||
@cancel="handleCancel"
|
|
||||||
:okButtonProps="okButtonProps"
|
|
||||||
cancelText="关闭">
|
|
||||||
|
|
||||||
<div class="message">
|
|
||||||
<div class="title">{{ record.titile }}</div>
|
|
||||||
<div class="createBy">发布人:{{ record.sender }}</div>
|
|
||||||
<div class="sendTime">发布时间:{{ record.sendTime }}</div>
|
|
||||||
<a-divider />
|
|
||||||
<p v-html="record.msgContent"></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</a-modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "SysAnnouncementModal",
|
|
||||||
components: {
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
title:"通知消息",
|
|
||||||
record: {},
|
|
||||||
labelCol: {
|
|
||||||
xs: { span: 24 },
|
|
||||||
sm: { span: 5 },
|
|
||||||
},
|
|
||||||
wrapperCol: {
|
|
||||||
xs: { span: 24 },
|
|
||||||
sm: { span: 16 },
|
|
||||||
},
|
|
||||||
visible: false,
|
|
||||||
okButtonProps:{
|
|
||||||
style: {
|
|
||||||
display:"none"
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
detail (record) {
|
|
||||||
this.visible = true;
|
|
||||||
this.record = record;
|
|
||||||
},
|
|
||||||
handleCancel () {
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.message{
|
|
||||||
width: 90%;
|
|
||||||
margin-left: 5%;
|
|
||||||
margin-right: 5%;
|
|
||||||
min-height: 200px;
|
|
||||||
}
|
|
||||||
.title{
|
|
||||||
width: 100%;
|
|
||||||
font-size: 16px;
|
|
||||||
text-align: center;
|
|
||||||
font-weight: bolder;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
.createBy {
|
|
||||||
width: 50%;
|
|
||||||
text-align: left;
|
|
||||||
padding-left: 5%;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.sendTime{
|
|
||||||
width: 50%;
|
|
||||||
text-align: right;
|
|
||||||
padding-right: 5%;
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
.message .ant-divider .ant-divider-horizontal .ant-divider-with-text-right{
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: lighter!important;
|
|
||||||
}
|
|
||||||
.message p{
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
.message .ant-divider-horizontal{
|
|
||||||
margin-top: 40px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,147 +0,0 @@
|
||||||
import { UserLayout, TabLayout, RouteView, BlankLayout, PageView } from '@/components/layouts'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 走菜单,走权限控制
|
|
||||||
* @type {[null,null]}
|
|
||||||
*/
|
|
||||||
export const asyncRouterMap = [
|
|
||||||
|
|
||||||
{
|
|
||||||
path: '/',
|
|
||||||
name: 'dashboard',
|
|
||||||
component: TabLayout,
|
|
||||||
meta: { title: '首页' },
|
|
||||||
redirect: '/dashboard/workplace',
|
|
||||||
children: [
|
|
||||||
// // account
|
|
||||||
// {
|
|
||||||
// path: '/account',
|
|
||||||
// component: RouteView,
|
|
||||||
// name: 'account',
|
|
||||||
// meta: { title: '个人页', icon: 'user', keepAlive: true, permission: [ 'user' ] },
|
|
||||||
// children: [
|
|
||||||
// {
|
|
||||||
// path: '/account/center',
|
|
||||||
// name: 'center',
|
|
||||||
// component: () => import('@/views/account/center/Index'),
|
|
||||||
// meta: { title: '个人中心', keepAlive: true, permission: [ 'user' ] }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// path: '/account/settings',
|
|
||||||
// name: 'settings',
|
|
||||||
// component: () => import('@/views/account/settings/Index'),
|
|
||||||
// meta: { title: '个人设置', hideHeader: true, keepAlive: true, permission: [ 'user' ] },
|
|
||||||
// redirect: '/account/settings/base',
|
|
||||||
// alwaysShow: true,
|
|
||||||
// children: [
|
|
||||||
// {
|
|
||||||
// path: '/account/settings/base',
|
|
||||||
// name: 'BaseSettings',
|
|
||||||
// component: () => import('@/views/account/settings/BaseSetting'),
|
|
||||||
// meta: { title: '基本设置', hidden: true, keepAlive: true, permission: [ 'user' ] }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// path: '/account/settings/security',
|
|
||||||
// name: 'SecuritySettings',
|
|
||||||
// component: () => import('@/views/account/settings/Security'),
|
|
||||||
// meta: { title: '安全设置', hidden: true, keepAlive: true, permission: [ 'user' ] }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// path: '/account/settings/custom',
|
|
||||||
// name: 'CustomSettings',
|
|
||||||
// component: () => import('@/views/account/settings/Custom'),
|
|
||||||
// meta: { title: '个性化设置', hidden: true, keepAlive: true, permission: [ 'user' ] }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// path: '/account/settings/binding',
|
|
||||||
// name: 'BindingSettings',
|
|
||||||
// component: () => import('@/views/account/settings/Binding'),
|
|
||||||
// meta: { title: '账户绑定', hidden: true, keepAlive: true, permission: [ 'user' ] }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// path: '/account/settings/notification',
|
|
||||||
// name: 'NotificationSettings',
|
|
||||||
// component: () => import('@/views/account/settings/Notification'),
|
|
||||||
// meta: { title: '新消息通知', hidden: true, keepAlive: true, permission: [ 'user' ] }
|
|
||||||
// },
|
|
||||||
// ]
|
|
||||||
// },
|
|
||||||
// ]
|
|
||||||
// }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '*', redirect: '/404', hidden: true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 基础路由
|
|
||||||
* @type { *[] }
|
|
||||||
*/
|
|
||||||
export const constantRouterMap = [
|
|
||||||
{
|
|
||||||
path: '/user',
|
|
||||||
component: UserLayout,
|
|
||||||
redirect: '/user/login',
|
|
||||||
hidden: true,
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: 'login',
|
|
||||||
name: 'login',
|
|
||||||
component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'register',
|
|
||||||
name: 'register',
|
|
||||||
component: () => import(/* webpackChunkName: "user" */ '@/views/user/Register')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'register-result',
|
|
||||||
name: 'registerResult',
|
|
||||||
component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult')
|
|
||||||
},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
|
|
||||||
// {
|
|
||||||
// path: '/',
|
|
||||||
// name: 'index',
|
|
||||||
// component: TabLayout,
|
|
||||||
// meta: {title: '首页'},
|
|
||||||
// redirect: '/dashboard/workplace',
|
|
||||||
// children: [
|
|
||||||
// {
|
|
||||||
// path: '/online',
|
|
||||||
// name: 'online',
|
|
||||||
// redirect: '/online',
|
|
||||||
// component: RouteView,
|
|
||||||
// meta: {title: '在线开发', icon: 'dashboard', permission: ['dashboard']},
|
|
||||||
// children: [
|
|
||||||
// {
|
|
||||||
// path: '/online/auto/:code',
|
|
||||||
// name: 'report',
|
|
||||||
// component: () => import('@/views/modules/online/cgreport/OnlCgreportAutoList')
|
|
||||||
// },
|
|
||||||
// ]
|
|
||||||
// },
|
|
||||||
// ]
|
|
||||||
// },
|
|
||||||
|
|
||||||
{
|
|
||||||
path: '/test',
|
|
||||||
component: BlankLayout,
|
|
||||||
redirect: '/test/home',
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: 'home',
|
|
||||||
name: 'TestHome',
|
|
||||||
component: () => import('@/views/Home')
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/404',
|
|
||||||
component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
|
|
||||||
},
|
|
||||||
]
|
|
|
@ -1,250 +0,0 @@
|
||||||
<template>
|
|
||||||
<a-card :bordered="false">
|
|
||||||
|
|
||||||
<!-- 查询区域 -->
|
|
||||||
<div class="table-page-search-wrapper">
|
|
||||||
<a-form layout="inline">
|
|
||||||
<a-row :gutter="24">
|
|
||||||
|
|
||||||
<a-col :md="6" :sm="8" class="1">
|
|
||||||
<a-form-item label="请假人">
|
|
||||||
<a-input placeholder="请输入请假人" v-model="queryParam.name"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
<a-col :md="6" :sm="8" class="1">
|
|
||||||
<a-form-item label="请假天数">
|
|
||||||
<a-input placeholder="请输入请假天数" v-model="queryParam.days"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
<template v-if="toggleSearchStatus">
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<a-form-item label="开始时间">
|
|
||||||
<a-input placeholder="请输入开始时间" v-model="queryParam.beginDate"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<a-form-item label="请假结束时间">
|
|
||||||
<a-input placeholder="请输入请假结束时间" v-model="queryParam.endDate"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
<a-col :md="6" :sm="8">
|
|
||||||
<a-form-item label="请假原因">
|
|
||||||
<a-input placeholder="请输入请假原因" v-model="queryParam.reason"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
</a-col>
|
|
||||||
</template>
|
|
||||||
<a-col :md="6" :sm="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>
|
|
||||||
<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 @click="handleAdd" type="primary" icon="plus">新增</a-button>
|
|
||||||
<a-button type="primary" icon="download" @click="handleExportXls">导出</a-button>
|
|
||||||
<a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel">
|
|
||||||
<a-button type="primary" icon="import">导入</a-button>
|
|
||||||
</a-upload>
|
|
||||||
<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">
|
|
||||||
|
|
||||||
<span slot="action" slot-scope="text, record">
|
|
||||||
<template v-if="record.bpmStatus === '1'">
|
|
||||||
<a @click="handleEdit(record)">编辑</a>
|
|
||||||
<a-divider type="vertical"/>
|
|
||||||
<a @click="startProcess(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 v-if="record.bpmStatus === '1'">
|
|
||||||
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
|
|
||||||
<a>删除</a>
|
|
||||||
</a-popconfirm>
|
|
||||||
</a-menu-item>
|
|
||||||
<a-menu-item v-else @click="handlePreviewPic(record)">审批进度</a-menu-item>
|
|
||||||
</a-menu>
|
|
||||||
</a-dropdown>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
</a-table>
|
|
||||||
</div>
|
|
||||||
<!-- table区域-end -->
|
|
||||||
|
|
||||||
<!-- 表单区域 -->
|
|
||||||
<form-common-modal ref="modalForm" :path="path" @ok="modalFormOk"></form-common-modal>
|
|
||||||
<!-- 审批流程 -->
|
|
||||||
<process-inst-pic-modal ref="processInstPicModal"></process-inst-pic-modal>
|
|
||||||
|
|
||||||
</a-card>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { postAction } from '@/api/manage'
|
|
||||||
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
|
|
||||||
import JDate from '@/components/jeecg/JDate.vue'
|
|
||||||
import FormCommonModal from "@/components/bpm/FormCommonModal";
|
|
||||||
import ProcessInstPicModal from "@/components/bpm/ProcessInstPicModal";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "JoaDemoList",
|
|
||||||
mixins:[JeecgListMixin],
|
|
||||||
components: {
|
|
||||||
FormCommonModal,
|
|
||||||
ProcessInstPicModal,
|
|
||||||
JDate
|
|
||||||
},
|
|
||||||
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: 'name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '请假天数',
|
|
||||||
align:"center",
|
|
||||||
dataIndex: 'days'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '开始时间',
|
|
||||||
align:"center",
|
|
||||||
dataIndex: 'beginDate'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '结束时间',
|
|
||||||
align:"center",
|
|
||||||
dataIndex: 'endDate'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '请假原因',
|
|
||||||
align:"center",
|
|
||||||
dataIndex: 'reason'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程状态',
|
|
||||||
align:"center",
|
|
||||||
dataIndex: 'bpmStatus',
|
|
||||||
customRender:function (text) {
|
|
||||||
if(text=='1'){
|
|
||||||
return "待提交";
|
|
||||||
}else if(text=='2'){
|
|
||||||
return "处理中";
|
|
||||||
}else if(text=='3'){
|
|
||||||
return "已完成";
|
|
||||||
}else if(text=='4'){
|
|
||||||
return "已作废";
|
|
||||||
}else{
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '操作',
|
|
||||||
dataIndex: 'action',
|
|
||||||
align:"center",
|
|
||||||
scopedSlots: { customRender: 'action' },
|
|
||||||
}
|
|
||||||
],
|
|
||||||
flowCode:"dev_joa_demo_001",
|
|
||||||
path:"jeecg/modules/JoaDemoForm",
|
|
||||||
url: {
|
|
||||||
list: "/test/joaDemo/list",
|
|
||||||
delete: "/test/joaDemo/delete",
|
|
||||||
deleteBatch: "/test/joaDemo/deleteBatch",
|
|
||||||
exportXlsUrl: "test/joaDemo/exportXls",
|
|
||||||
importExcelUrl: "test/joaDemo/importExcel",
|
|
||||||
startProcess: "/process/extActProcess/startMutilProcess",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
importExcelUrl: function(){
|
|
||||||
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
startProcess: function(record){
|
|
||||||
var that = this;
|
|
||||||
this.$confirm({
|
|
||||||
title:"提示",
|
|
||||||
content:"确认提交流程吗?",
|
|
||||||
onOk: function(){
|
|
||||||
var param = {
|
|
||||||
flowCode:that.flowCode,
|
|
||||||
id:record.id,
|
|
||||||
formUrl:that.path,
|
|
||||||
formUrlMobile:that.path
|
|
||||||
}
|
|
||||||
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.flowCode;
|
|
||||||
var dataId = record.id;
|
|
||||||
this.$refs.processInstPicModal.preview(flowCode,dataId);
|
|
||||||
this.$refs.processInstPicModal.title="流程图";
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style scoped>
|
|
||||||
@import '~@assets/less/common.less'
|
|
||||||
</style>
|
|
|
@ -1,160 +0,0 @@
|
||||||
<template>
|
|
||||||
|
|
||||||
<a-form :form="form">
|
|
||||||
<a-form-item
|
|
||||||
:labelCol="labelCol"
|
|
||||||
:wrapperCol="wrapperCol"
|
|
||||||
label="请假人">
|
|
||||||
<a-input placeholder="请输入请假人" v-decorator="['name', {}]" />
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item
|
|
||||||
:labelCol="labelCol"
|
|
||||||
:wrapperCol="wrapperCol"
|
|
||||||
label="请假天数">
|
|
||||||
<a-input-number v-decorator="[ 'days', {}]" />
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item
|
|
||||||
:labelCol="labelCol"
|
|
||||||
:wrapperCol="wrapperCol"
|
|
||||||
label="开始时间">
|
|
||||||
<a-date-picker showTime format='YYYY-MM-DD' v-decorator="[ 'beginDate', {}]" />
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item
|
|
||||||
:labelCol="labelCol"
|
|
||||||
:wrapperCol="wrapperCol"
|
|
||||||
label="请假结束时间">
|
|
||||||
<a-date-picker showTime format='YYYY-MM-DD' v-decorator="[ 'endDate', {}]" />
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item
|
|
||||||
:labelCol="labelCol"
|
|
||||||
:wrapperCol="wrapperCol"
|
|
||||||
label="请假原因">
|
|
||||||
<a-input placeholder="请输入请假原因" v-decorator="['reason', {}]" />
|
|
||||||
</a-form-item>
|
|
||||||
</a-form>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { httpAction,getAction } from '@/api/manage'
|
|
||||||
import moment from "moment"
|
|
||||||
import pick from 'lodash.pick'
|
|
||||||
import JDate from '@/components/jeecg/JDate.vue'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "JoaDemoModal",
|
|
||||||
components: { JDate },
|
|
||||||
props: ['formData'],
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
title:"操作",
|
|
||||||
visible: false,
|
|
||||||
model: {},
|
|
||||||
labelCol: {
|
|
||||||
xs: { span: 24 },
|
|
||||||
sm: { span: 5 },
|
|
||||||
},
|
|
||||||
wrapperCol: {
|
|
||||||
xs: { span: 24 },
|
|
||||||
sm: { span: 16 },
|
|
||||||
},
|
|
||||||
|
|
||||||
confirmLoading: false,
|
|
||||||
form: this.$form.createForm(this),
|
|
||||||
validatorRules:{
|
|
||||||
name:{},
|
|
||||||
days:{},
|
|
||||||
beginDate:{},
|
|
||||||
endDate:{},
|
|
||||||
reason:{},
|
|
||||||
bpmStatus:{},
|
|
||||||
},
|
|
||||||
url: {
|
|
||||||
queryById: "/test/joaDemo/queryById",
|
|
||||||
add: "/test/joaDemo/add",
|
|
||||||
edit: "/test/joaDemo/edit",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
console.log("form start");
|
|
||||||
console.log("formdata",this.formData);
|
|
||||||
if(this.formData.dataId){
|
|
||||||
var params = {id:this.formData.dataId};//查询条件
|
|
||||||
getAction(this.url.queryById,params).then((res)=>{
|
|
||||||
if(res.success){
|
|
||||||
console.log("获取表单数据",res);
|
|
||||||
this.edit (res.result);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
add () {
|
|
||||||
this.edit({});
|
|
||||||
},
|
|
||||||
edit (record) {
|
|
||||||
this.form.resetFields();
|
|
||||||
this.model = Object.assign({}, record);
|
|
||||||
this.visible = true;
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.form.setFieldsValue(pick(this.model,'name','days','reason','bpmStatus'))
|
|
||||||
//时间格式化
|
|
||||||
this.form.setFieldsValue({beginDate:this.model.beginDate?moment(this.model.beginDate):null})
|
|
||||||
this.form.setFieldsValue({endDate:this.model.endDate?moment(this.model.endDate):null})
|
|
||||||
});
|
|
||||||
|
|
||||||
},
|
|
||||||
close () {
|
|
||||||
this.$emit('close');
|
|
||||||
this.visible = false;
|
|
||||||
},
|
|
||||||
handleOk () {
|
|
||||||
const that = this;
|
|
||||||
// 触发表单验证
|
|
||||||
this.form.validateFields((err, values) => {
|
|
||||||
if (!err) {
|
|
||||||
that.confirmLoading = true;
|
|
||||||
let httpurl = '';
|
|
||||||
let method = '';
|
|
||||||
if(!this.model.id){
|
|
||||||
httpurl+=this.url.add;
|
|
||||||
method = 'post';
|
|
||||||
}else{
|
|
||||||
httpurl+=this.url.edit;
|
|
||||||
method = 'put';
|
|
||||||
}
|
|
||||||
let formData = Object.assign(this.model, values);
|
|
||||||
//时间格式化
|
|
||||||
formData.beginDate = formData.beginDate?formData.beginDate.format('YYYY-MM-DD HH:mm:ss'):null;
|
|
||||||
formData.endDate = formData.endDate?formData.endDate.format('YYYY-MM-DD HH:mm:ss'):null;
|
|
||||||
|
|
||||||
console.log(formData)
|
|
||||||
httpAction(httpurl,formData,method).then((res)=>{
|
|
||||||
if(res.success){
|
|
||||||
that.$message.success(res.message);
|
|
||||||
that.$emit('ok');
|
|
||||||
}else{
|
|
||||||
that.$message.warning(res.message);
|
|
||||||
}
|
|
||||||
}).finally(() => {
|
|
||||||
that.confirmLoading = false;
|
|
||||||
that.close();
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
handleCancel () {
|
|
||||||
this.close()
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -1,7 +1,7 @@
|
||||||
Ant Design Jeecg Vue
|
Ant Design Jeecg Vue
|
||||||
====
|
====
|
||||||
|
|
||||||
当前最新版本: 2.0.1(发布日期:20190603)
|
当前最新版本: 2.0.2(发布日期:20190708)
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
----
|
----
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "vue-antd-jeecg",
|
"name": "ant-design-vue-jeecg",
|
||||||
"version": "2.0.1",
|
"version": "2.0.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve --open",
|
"serve": "vue-cli-service serve --open",
|
||||||
|
@ -10,9 +10,9 @@
|
||||||
"test:e2e": "vue-cli-service test:e2e"
|
"test:e2e": "vue-cli-service test:e2e"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@antv/data-set": "^0.10.1",
|
"@antv/data-set": "^0.10.2",
|
||||||
"@tinymce/tinymce-vue": "^2.0.0",
|
"@tinymce/tinymce-vue": "^2.0.0",
|
||||||
"ant-design-vue": "^1.3.1",
|
"ant-design-vue": "^1.3.9",
|
||||||
"apexcharts": "^3.6.5",
|
"apexcharts": "^3.6.5",
|
||||||
"axios": "^0.18.0",
|
"axios": "^0.18.0",
|
||||||
"clipboard": "^2.0.4",
|
"clipboard": "^2.0.4",
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"tinymce": "^5.0.2",
|
"tinymce": "^5.0.2",
|
||||||
"viser-vue": "^2.4.4",
|
"viser-vue": "^2.4.4",
|
||||||
"vue": "^2.5.22",
|
"vue": "^2.6.10",
|
||||||
"vue-apexcharts": "^1.3.2",
|
"vue-apexcharts": "^1.3.2",
|
||||||
"vue-class-component": "^6.0.0",
|
"vue-class-component": "^6.0.0",
|
||||||
"vue-cropper": "^0.4.8",
|
"vue-cropper": "^0.4.8",
|
||||||
|
@ -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.7",
|
"vue-print-nb-jeecg": "^1.0.8",
|
||||||
"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",
|
||||||
|
@ -49,13 +49,13 @@
|
||||||
"@vue/cli-service": "^3.3.0",
|
"@vue/cli-service": "^3.3.0",
|
||||||
"@vue/eslint-config-standard": "^4.0.0",
|
"@vue/eslint-config-standard": "^4.0.0",
|
||||||
"babel-eslint": "^10.0.1",
|
"babel-eslint": "^10.0.1",
|
||||||
"eslint": "^5.12.0",
|
"eslint": "^5.16.0",
|
||||||
"eslint-plugin-vue": "^5.1.0",
|
"eslint-plugin-vue": "^5.1.0",
|
||||||
"less": "^3.8.1",
|
"less": "^3.9.0",
|
||||||
"less-loader": "^4.1.0",
|
"less-loader": "^4.1.0",
|
||||||
"node-sass": "^4.11.0",
|
"node-sass": "^4.11.0",
|
||||||
"sass-loader": "^7.0.1",
|
"sass-loader": "^7.0.1",
|
||||||
"vue-template-compiler": "^2.5.22"
|
"vue-template-compiler": "^2.6.10"
|
||||||
},
|
},
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"root": true,
|
"root": true,
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
@ -218,6 +218,26 @@
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
/* 滚动条优化 start */
|
||||||
|
::-webkit-scrollbar{
|
||||||
|
width:8px;
|
||||||
|
height:8px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-track{
|
||||||
|
background: #f6f6f6;
|
||||||
|
border-radius:2px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb{
|
||||||
|
background: #cdcdcd;
|
||||||
|
border-radius:2px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb:hover{
|
||||||
|
background: #747474;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-corner {
|
||||||
|
background: #f6f6f6;
|
||||||
|
}
|
||||||
|
/* 滚动条优化 end */
|
||||||
</style>
|
</style>
|
||||||
<!-- 全局配置 -->
|
<!-- 全局配置 -->
|
||||||
<script>
|
<script>
|
||||||
|
@ -240,6 +260,16 @@
|
||||||
</div>
|
</div>
|
||||||
</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>
|
After Width: | Height: | Size: 8.7 KiB |
|
@ -22,8 +22,8 @@ const getUserList = (params)=>getAction("/sys/user/list",params);
|
||||||
// const deleteUser = (params)=>deleteAction("/sys/user/delete",params);
|
// const deleteUser = (params)=>deleteAction("/sys/user/delete",params);
|
||||||
// const deleteUserList = (params)=>deleteAction("/sys/user/deleteBatch",params);
|
// const deleteUserList = (params)=>deleteAction("/sys/user/deleteBatch",params);
|
||||||
const frozenBatch = (params)=>putAction("/sys/user/frozenBatch",params);
|
const frozenBatch = (params)=>putAction("/sys/user/frozenBatch",params);
|
||||||
//验证用户账号是否唯一
|
//验证用户是否存在
|
||||||
const checkUsername = (params)=>getAction("/sys/user/checkOnlyUser",params);
|
const checkOnlyUser = (params)=>getAction("/sys/user/checkOnlyUser",params);
|
||||||
//改变密码
|
//改变密码
|
||||||
const changPassword = (params)=>putAction("/sys/user/changPassword",params);
|
const changPassword = (params)=>putAction("/sys/user/changPassword",params);
|
||||||
|
|
||||||
|
@ -76,6 +76,7 @@ const doReleaseData = (params)=>getAction("/sys/annountCement/doReleaseData",par
|
||||||
const doReovkeData = (params)=>getAction("/sys/annountCement/doReovkeData",params);
|
const doReovkeData = (params)=>getAction("/sys/annountCement/doReovkeData",params);
|
||||||
//获取系统访问量
|
//获取系统访问量
|
||||||
const getLoginfo = (params)=>getAction("/sys/loginfo",params);
|
const getLoginfo = (params)=>getAction("/sys/loginfo",params);
|
||||||
|
const getVisitInfo = (params)=>getAction("/sys/visitInfo",params);
|
||||||
//数据日志访问
|
//数据日志访问
|
||||||
// const getDataLogList = (params)=>getAction("/sys/dataLog/list",params);
|
// const getDataLogList = (params)=>getAction("/sys/dataLog/list",params);
|
||||||
|
|
||||||
|
@ -99,7 +100,7 @@ export {
|
||||||
getUserList,
|
getUserList,
|
||||||
queryall,
|
queryall,
|
||||||
frozenBatch,
|
frozenBatch,
|
||||||
checkUsername,
|
checkOnlyUser,
|
||||||
changPassword,
|
changPassword,
|
||||||
getPermissionList,
|
getPermissionList,
|
||||||
addPermission,
|
addPermission,
|
||||||
|
@ -127,6 +128,7 @@ export {
|
||||||
doReleaseData,
|
doReleaseData,
|
||||||
doReovkeData,
|
doReovkeData,
|
||||||
getLoginfo,
|
getLoginfo,
|
||||||
|
getVisitInfo,
|
||||||
queryUserByDepId,
|
queryUserByDepId,
|
||||||
queryUserRoleMap,
|
queryUserRoleMap,
|
||||||
duplicateCheck,
|
duplicateCheck,
|
|
@ -20,6 +20,14 @@ export function login(parameter) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function phoneLogin(parameter) {
|
||||||
|
return axios({
|
||||||
|
url: '/sys/phoneLogin',
|
||||||
|
method: 'post',
|
||||||
|
data: parameter
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function getSmsCaptcha(parameter) {
|
export function getSmsCaptcha(parameter) {
|
||||||
return axios({
|
return axios({
|
||||||
url: api.SendSms,
|
url: api.SendSms,
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 8.7 KiB |
|
@ -0,0 +1,172 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="293px" height="293px" viewBox="0 0 293 293" enable-background="new 0 0 293 293" xml:space="preserve"> <image id="image0" width="293" height="293" x="0" y="0"
|
||||||
|
href="data:image/png;base64,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
|
||||||
|
OjAwP26CAAAAAABJRU5ErkJggg==" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
@ -29,7 +29,6 @@
|
||||||
props: {
|
props: {
|
||||||
dictCode: String,
|
dictCode: String,
|
||||||
placeholder: String,
|
placeholder: String,
|
||||||
triggerChange: Boolean,
|
|
||||||
disabled: Boolean,
|
disabled: Boolean,
|
||||||
value: String,
|
value: String,
|
||||||
type: String,
|
type: String,
|
||||||
|
@ -52,6 +51,9 @@
|
||||||
this.initDictData();
|
this.initDictData();
|
||||||
},
|
},
|
||||||
watch:{
|
watch:{
|
||||||
|
options: function(val){
|
||||||
|
this.setCurrentDictOptions(val);
|
||||||
|
},
|
||||||
value (val) {
|
value (val) {
|
||||||
if(!val){
|
if(!val){
|
||||||
this.arrayValue = []
|
this.arrayValue = []
|
||||||
|
@ -75,11 +77,7 @@
|
||||||
|
|
||||||
},
|
},
|
||||||
onChange (selectedValue) {
|
onChange (selectedValue) {
|
||||||
if(this.triggerChange){
|
this.$emit('change', selectedValue.join(","));
|
||||||
this.$emit('change', selectedValue.join(","));
|
|
||||||
}else{
|
|
||||||
this.$emit('input', selectedValue.join(","));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
setCurrentDictOptions(dictOptions){
|
setCurrentDictOptions(dictOptions){
|
||||||
this.dictOptions = dictOptions
|
this.dictOptions = dictOptions
|
||||||
|
@ -87,6 +85,10 @@
|
||||||
getCurrentDictOptions(){
|
getCurrentDictOptions(){
|
||||||
return this.dictOptions
|
return this.dictOptions
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
|
@ -40,10 +40,9 @@
|
||||||
export default {
|
export default {
|
||||||
name: 'JSearchSelectTag',
|
name: 'JSearchSelectTag',
|
||||||
props:{
|
props:{
|
||||||
triggerChange: Boolean,
|
|
||||||
disabled: Boolean,
|
disabled: Boolean,
|
||||||
value: String,
|
value: String,
|
||||||
dictCode: String,
|
dict: String,
|
||||||
dictOptions: Array,
|
dictOptions: Array,
|
||||||
async: Boolean,
|
async: Boolean,
|
||||||
placeholder:{
|
placeholder:{
|
||||||
|
@ -76,6 +75,11 @@
|
||||||
this.initSelectValue()
|
this.initSelectValue()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"dict":{
|
||||||
|
handler(){
|
||||||
|
this.initDictData()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
|
@ -83,7 +87,7 @@
|
||||||
if(this.async){
|
if(this.async){
|
||||||
if(!this.selectedAsyncValue || !this.selectedAsyncValue.key || this.selectedAsyncValue.key!=this.value){
|
if(!this.selectedAsyncValue || !this.selectedAsyncValue.key || this.selectedAsyncValue.key!=this.value){
|
||||||
console.log("这才请求后台")
|
console.log("这才请求后台")
|
||||||
getAction(`/sys/dict/loadDictItem/${this.dictCode}`,{key:this.value}).then(res=>{
|
getAction(`/sys/dict/loadDictItem/${this.dict}`,{key:this.value}).then(res=>{
|
||||||
if(res.success){
|
if(res.success){
|
||||||
let obj = {
|
let obj = {
|
||||||
key:this.value,
|
key:this.value,
|
||||||
|
@ -104,7 +108,7 @@
|
||||||
this.options = []
|
this.options = []
|
||||||
this.loading=true
|
this.loading=true
|
||||||
// 字典code格式:table,text,code
|
// 字典code格式:table,text,code
|
||||||
getAction(`/sys/dict/loadDict/${this.dictCode}`,{keyword:value}).then(res=>{
|
getAction(`/sys/dict/loadDict/${this.dict}`,{keyword:value}).then(res=>{
|
||||||
this.loading=false
|
this.loading=false
|
||||||
if(res.success){
|
if(res.success){
|
||||||
if(currentLoad!=this.lastLoad){
|
if(currentLoad!=this.lastLoad){
|
||||||
|
@ -126,7 +130,7 @@
|
||||||
this.options = [...this.dictOptions]
|
this.options = [...this.dictOptions]
|
||||||
}else{
|
}else{
|
||||||
//根据字典Code, 初始化字典数组
|
//根据字典Code, 初始化字典数组
|
||||||
ajaxGetDictItems(this.dictCode, null).then((res) => {
|
ajaxGetDictItems(this.dict, null).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.options = res.result;
|
this.options = res.result;
|
||||||
}
|
}
|
||||||
|
@ -148,11 +152,7 @@
|
||||||
this.callback()
|
this.callback()
|
||||||
},
|
},
|
||||||
callback(){
|
callback(){
|
||||||
if(this.triggerChange){
|
this.$emit('change', this.selectedValue);
|
||||||
this.$emit('change', this.selectedValue);
|
|
||||||
}else{
|
|
||||||
this.$emit('input', this.selectedValue);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
setCurrentDictOptions(dictOptions){
|
setCurrentDictOptions(dictOptions){
|
||||||
this.options = dictOptions
|
this.options = dictOptions
|
||||||
|
@ -161,6 +161,10 @@
|
||||||
return this.options
|
return this.options
|
||||||
}
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
|
@ -0,0 +1,181 @@
|
||||||
|
# JDictSelectTag 组件用法
|
||||||
|
----
|
||||||
|
- 从字典表获取数据,dictCode格式说明: 字典code
|
||||||
|
```html
|
||||||
|
<j-dict-select-tag v-model="queryParam.sex" placeholder="请输入用户性别"
|
||||||
|
dictCode="sex"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
v-decorator用法:
|
||||||
|
```html
|
||||||
|
<j-dict-select-tag v-decorator="['sex', {}]" :triggerChange="true" placeholder="请输入用户性别"
|
||||||
|
dictCode="sex"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
- 从数据库表获取字典数据,dictCode格式说明: 表名,文本字段,取值字段
|
||||||
|
```html
|
||||||
|
<j-dict-select-tag v-model="queryParam.username" placeholder="请选择用户名称"
|
||||||
|
dictCode="sys_user,realname,id"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# JDictSelectUtil.js 列表字典函数用法
|
||||||
|
----
|
||||||
|
|
||||||
|
- 第一步: 引入依赖方法
|
||||||
|
```html
|
||||||
|
import {initDictOptions, filterDictText} from '@/components/dict/JDictSelectUtil'
|
||||||
|
```
|
||||||
|
|
||||||
|
- 第二步: 在created()初始化方法执行字典配置方法
|
||||||
|
```html
|
||||||
|
//初始化字典配置
|
||||||
|
this.initDictConfig();
|
||||||
|
```
|
||||||
|
|
||||||
|
- 第三步: 实现initDictConfig方法,加载列表所需要的字典(列表上有多个字典项,就执行多次initDictOptions方法)
|
||||||
|
|
||||||
|
```html
|
||||||
|
initDictConfig() {
|
||||||
|
//初始化字典 - 性别
|
||||||
|
initDictOptions('sex').then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
this.sexDictOptions = res.result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
- 第四步: 实现字段的customRender方法
|
||||||
|
```html
|
||||||
|
customRender: (text, record, index) => {
|
||||||
|
//字典值替换通用方法
|
||||||
|
return filterDictText(this.sexDictOptions, text);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# JMultiSelectTag 多选组件
|
||||||
|
下拉/checkbox
|
||||||
|
|
||||||
|
## 参数配置
|
||||||
|
| 参数 | 类型 | 必填 |说明|
|
||||||
|
|--------------|---------|----|---------|
|
||||||
|
| placeholder |string | | placeholder |
|
||||||
|
| disabled |Boolean | | 是否禁用 |
|
||||||
|
| type |string | | 多选类型 select/checkbox 默认是select |
|
||||||
|
| dictCode |string | | 数据字典编码或者表名,显示字段名,存储字段名拼接而成的字符串,如果提供了options参数 则此参数可不填|
|
||||||
|
| options |Array | | 多选项,如果dictCode参数未提供,可以设置此参数加载多选项 |
|
||||||
|
|
||||||
|
使用示例
|
||||||
|
----
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<a-form>
|
||||||
|
<a-form-item label="下拉多选" style="width: 300px">
|
||||||
|
<j-multi-select-tag
|
||||||
|
v-model="selectValue"
|
||||||
|
:options="dictOptions"
|
||||||
|
placeholder="请做出你的选择">
|
||||||
|
</j-multi-select-tag>
|
||||||
|
{{ selectValue }}
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item label="checkbox">
|
||||||
|
<j-multi-select-tag
|
||||||
|
v-model="checkboxValue"
|
||||||
|
:options="dictOptions"
|
||||||
|
type="checkbox">
|
||||||
|
</j-multi-select-tag>
|
||||||
|
{{ checkboxValue }}
|
||||||
|
</a-form-item>
|
||||||
|
</a-form >
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
|
||||||
|
export default {
|
||||||
|
components: {JMultiSelectTag},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectValue:"",
|
||||||
|
checkboxValue:"",
|
||||||
|
dictOptions:[{
|
||||||
|
label:"选项一",
|
||||||
|
value:"1"
|
||||||
|
},{
|
||||||
|
label:"选项二",
|
||||||
|
value:"2"
|
||||||
|
},{
|
||||||
|
label:"选项三",
|
||||||
|
value:"3"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
# JSearchSelectTag 字典表的搜索组件
|
||||||
|
下拉搜索组件,支持异步加载,异步加载用于大数据量的字典表
|
||||||
|
|
||||||
|
## 参数配置
|
||||||
|
| 参数 | 类型 | 必填 |说明|
|
||||||
|
|--------------|---------|----|---------|
|
||||||
|
| placeholder |string | | placeholder |
|
||||||
|
| disabled |Boolean | | 是否禁用 |
|
||||||
|
| dict |string | | 表名,显示字段名,存储字段名拼接而成的字符串,如果提供了dictOptions参数 则此参数可不填|
|
||||||
|
| dictOptions |Array | | 多选项,如果dict参数未提供,可以设置此参数加载多选项 |
|
||||||
|
| async |Boolean | | 是否支持异步加载,设置成true,则通过输入的内容加载远程数据,否则在本地过滤数据,默认false|
|
||||||
|
|
||||||
|
使用示例
|
||||||
|
----
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<a-form>
|
||||||
|
<a-form-item label="下拉搜索" style="width: 300px">
|
||||||
|
<j-search-select-tag
|
||||||
|
placeholder="请做出你的选择"
|
||||||
|
v-model="selectValue"
|
||||||
|
:dictOptions="dictOptions">
|
||||||
|
</j-search-select-tag>
|
||||||
|
{{ selectValue }}
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item label="异步加载" style="width: 300px">
|
||||||
|
<j-search-select-tag
|
||||||
|
placeholder="请做出你的选择"
|
||||||
|
v-model="asyncSelectValue"
|
||||||
|
dict="sys_depart,depart_name,id"
|
||||||
|
:async="true">
|
||||||
|
</j-search-select-tag>
|
||||||
|
{{ asyncSelectValue }}
|
||||||
|
</a-form-item>
|
||||||
|
</a-form >
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import JSearchSelectTag from '@/components/dict/JSearchSelectTag'
|
||||||
|
export default {
|
||||||
|
components: {JSearchSelectTag},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectValue:"",
|
||||||
|
asyncSelectValue:"",
|
||||||
|
dictOptions:[{
|
||||||
|
text:"选项一",
|
||||||
|
value:"1"
|
||||||
|
},{
|
||||||
|
text:"选项二",
|
||||||
|
value:"2"
|
||||||
|
},{
|
||||||
|
text:"选项三",
|
||||||
|
value:"3"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
|
@ -10,20 +10,10 @@
|
||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
readOnly:{
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
/*label value*/
|
/*label value*/
|
||||||
options:{
|
options:{
|
||||||
type: Array,
|
type: Array,
|
||||||
required: true
|
required: true
|
||||||
},
|
|
||||||
triggerChange:{
|
|
||||||
type: Boolean,
|
|
||||||
required: false,
|
|
||||||
default: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
|
@ -42,12 +32,12 @@
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
onChange (checkedValues) {
|
onChange (checkedValues) {
|
||||||
if(this.triggerChange){
|
this.$emit('change', checkedValues.join(","));
|
||||||
this.$emit('change', checkedValues.join(","));
|
|
||||||
}else{
|
|
||||||
this.$emit('input', checkedValues.join(","));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<a-date-picker
|
<a-date-picker
|
||||||
:disabled="readOnly"
|
:disabled="disabled || readOnly"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
@change="handleDateChange"
|
@change="handleDateChange"
|
||||||
:value="momVal"
|
:value="momVal"
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
default: 'YYYY-MM-DD',
|
default: 'YYYY-MM-DD',
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
//此属性可以被废弃了
|
||||||
triggerChange:{
|
triggerChange:{
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
|
@ -38,6 +39,11 @@
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
|
disabled:{
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
showTime:{
|
showTime:{
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
|
@ -67,13 +73,13 @@
|
||||||
methods: {
|
methods: {
|
||||||
moment,
|
moment,
|
||||||
handleDateChange(mom,dateStr){
|
handleDateChange(mom,dateStr){
|
||||||
if(this.triggerChange){
|
this.$emit('change', dateStr);
|
||||||
this.$emit('change', dateStr);
|
|
||||||
}else{
|
|
||||||
this.$emit('input', dateStr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//note: do not set the prop value one default property
|
|
||||||
</script>
|
</script>
|
|
@ -1,5 +1,5 @@
|
||||||
<!-- JEditableTable -->
|
<!-- JEditableTable -->
|
||||||
<!-- @version 1.4 -->
|
<!-- @version 1.4.1 -->
|
||||||
<!-- @author sjlei -->
|
<!-- @author sjlei -->
|
||||||
<template>
|
<template>
|
||||||
<a-spin :spinning="loading">
|
<a-spin :spinning="loading">
|
||||||
|
@ -40,6 +40,7 @@
|
||||||
<!-- 右侧动态生成td -->
|
<!-- 右侧动态生成td -->
|
||||||
<template v-for="col in columns">
|
<template v-for="col in columns">
|
||||||
<div
|
<div
|
||||||
|
v-show="col.type !== formTypes.hidden"
|
||||||
class="td"
|
class="td"
|
||||||
:key="col.key"
|
:key="col.key"
|
||||||
:style="buildTdStyle(col)">
|
:style="buildTdStyle(col)">
|
||||||
|
@ -93,6 +94,7 @@
|
||||||
<div
|
<div
|
||||||
class="td"
|
class="td"
|
||||||
v-for="col in columns"
|
v-for="col in columns"
|
||||||
|
v-show="col.type !== formTypes.hidden"
|
||||||
:key="col.key"
|
:key="col.key"
|
||||||
:style="buildTdStyle(col)">
|
:style="buildTdStyle(col)">
|
||||||
|
|
||||||
|
@ -132,7 +134,6 @@
|
||||||
</template>
|
</template>
|
||||||
<!-- select -->
|
<!-- select -->
|
||||||
<template v-else-if="col.type === formTypes.select">
|
<template v-else-if="col.type === formTypes.select">
|
||||||
<!-- select 真身 -->
|
|
||||||
<a-tooltip
|
<a-tooltip
|
||||||
:key="i"
|
:key="i"
|
||||||
:id="id"
|
:id="id"
|
||||||
|
@ -154,7 +155,10 @@
|
||||||
:options="col.options"
|
:options="col.options"
|
||||||
:getPopupContainer="getParentContainer"
|
:getPopupContainer="getParentContainer"
|
||||||
:placeholder="replaceProps(col, col.placeholder)"
|
:placeholder="replaceProps(col, col.placeholder)"
|
||||||
@change="(v)=>handleChangeSelectCommon(v,id,row,col)">
|
@change="(v)=>handleChangeSelectCommon(v,id,row,col)"
|
||||||
|
@search="(v)=>handleSearchSelect(v,id,row,col)"
|
||||||
|
@blur="(v)=>handleBlurSearch(v,id,row,col)"
|
||||||
|
>
|
||||||
|
|
||||||
<!--<template v-for="(opt,optKey) in col.options">-->
|
<!--<template v-for="(opt,optKey) in col.options">-->
|
||||||
<!--<a-select-option :value="opt.value" :key="optKey">{{ opt.title }}</a-select-option>-->
|
<!--<a-select-option :value="opt.value" :key="optKey">{{ opt.title }}</a-select-option>-->
|
||||||
|
@ -247,7 +251,7 @@
|
||||||
|
|
||||||
<div v-else-if="col.type === formTypes.slot" :key="i">
|
<div v-else-if="col.type === formTypes.slot" :key="i">
|
||||||
<slot
|
<slot
|
||||||
:name="col.slotName || col.key"
|
:name="(col.slot || col.slotName) || col.key"
|
||||||
:text="inputValues[rowIndex][col.key]"
|
:text="inputValues[rowIndex][col.key]"
|
||||||
:column="col"
|
:column="col"
|
||||||
:rowId="removeCaseId(row.id)"
|
:rowId="removeCaseId(row.id)"
|
||||||
|
@ -294,7 +298,8 @@
|
||||||
// 数据源
|
// 数据源
|
||||||
dataSource: {
|
dataSource: {
|
||||||
type: Array,
|
type: Array,
|
||||||
required: true
|
required: true,
|
||||||
|
default: () => []
|
||||||
},
|
},
|
||||||
// 是否显示操作按钮
|
// 是否显示操作按钮
|
||||||
actionButton: {
|
actionButton: {
|
||||||
|
@ -327,6 +332,11 @@
|
||||||
default() {
|
default() {
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
// 是否禁用全部组件
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -421,22 +431,24 @@
|
||||||
realTrWidth() {
|
realTrWidth() {
|
||||||
let calcWidth = 'calc('
|
let calcWidth = 'calc('
|
||||||
this.columns.forEach((column, i) => {
|
this.columns.forEach((column, i) => {
|
||||||
let { width } = column
|
let { type, width } = column
|
||||||
if (typeof width === 'number') {
|
// 隐藏字段不参与计算
|
||||||
calcWidth += width + 'px'
|
if (type !== FormTypes.hidden) {
|
||||||
} else if (typeof width === 'string') {
|
if (typeof width === 'number') {
|
||||||
calcWidth += width
|
calcWidth += width + 'px'
|
||||||
} else {
|
} else if (typeof width === 'string') {
|
||||||
calcWidth += '120px'
|
calcWidth += width
|
||||||
}
|
} else {
|
||||||
|
calcWidth += '120px'
|
||||||
|
}
|
||||||
|
|
||||||
if (i < this.columns.length - 1) {
|
if (i < this.columns.length - 1) {
|
||||||
calcWidth += ' + '
|
calcWidth += ' + '
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
calcWidth += ')'
|
calcWidth += ')'
|
||||||
console.log('calcWidth: ', calcWidth)
|
// console.log('calcWidth: ', calcWidth)
|
||||||
return calcWidth
|
return calcWidth
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -451,7 +463,12 @@
|
||||||
let jdateValues = {}
|
let jdateValues = {}
|
||||||
// 禁用行的id
|
// 禁用行的id
|
||||||
let disabledRowIds = (this.disabledRowIds || [])
|
let disabledRowIds = (this.disabledRowIds || [])
|
||||||
newValue.forEach(data => {
|
newValue.forEach((data, newValueIndex) => {
|
||||||
|
// 判断源数据是否带有id
|
||||||
|
if (data.id == null || data.id === '') {
|
||||||
|
data.id = this.removeCaseId(this.generateId() + newValueIndex)
|
||||||
|
}
|
||||||
|
|
||||||
let value = { id: this.caseId + data.id }
|
let value = { id: this.caseId + data.id }
|
||||||
let row = { id: value.id }
|
let row = { id: value.id }
|
||||||
let disabled = false
|
let disabled = false
|
||||||
|
@ -475,19 +492,7 @@
|
||||||
} else {
|
} else {
|
||||||
selectValues[inputId] = undefined
|
selectValues[inputId] = undefined
|
||||||
}
|
}
|
||||||
// 兼容 旧版本 options
|
|
||||||
if (column.options instanceof Array) {
|
|
||||||
column.options = column.options.map(item => {
|
|
||||||
if (item) {
|
|
||||||
return {
|
|
||||||
text: item.text || item.title,
|
|
||||||
title: item.text || item.title,
|
|
||||||
value: item.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else if (column.type === FormTypes.date || column.type === FormTypes.datetime) {
|
} else if (column.type === FormTypes.date || column.type === FormTypes.datetime) {
|
||||||
jdateValues[inputId] = sourceValue
|
jdateValues[inputId] = sourceValue
|
||||||
|
|
||||||
|
@ -533,6 +538,28 @@
|
||||||
})
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
|
columns: {
|
||||||
|
immediate: true,
|
||||||
|
handler(columns) {
|
||||||
|
columns.forEach(column => {
|
||||||
|
if (column.type === FormTypes.select) {
|
||||||
|
// 兼容 旧版本 options
|
||||||
|
if (column.options instanceof Array) {
|
||||||
|
column.options = column.options.map(item => {
|
||||||
|
if (item) {
|
||||||
|
return {
|
||||||
|
text: item.text || item.title,
|
||||||
|
title: item.text || item.title,
|
||||||
|
value: item.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
// 当selectRowIds改变时触发事件
|
// 当selectRowIds改变时触发事件
|
||||||
selectedRowIds(newValue) {
|
selectedRowIds(newValue) {
|
||||||
this.$emit('selectRowChange', cloneObject(newValue))
|
this.$emit('selectRowChange', cloneObject(newValue))
|
||||||
|
@ -651,14 +678,14 @@
|
||||||
// record中是否有该列的值
|
// record中是否有该列的值
|
||||||
let recordHasValue = record[key] != null
|
let recordHasValue = record[key] != null
|
||||||
if (column.type === FormTypes.input) {
|
if (column.type === FormTypes.input) {
|
||||||
value[key] = recordHasValue ? record[key] : column.defaultValue
|
value[key] = recordHasValue ? record[key] : (column.defaultValue || (column.defaultValue === 0 ? 0 : ''))
|
||||||
|
|
||||||
} else if (column.type === FormTypes.inputNumber) {
|
} else if (column.type === FormTypes.inputNumber) {
|
||||||
// 判断是否是排序字段,如果是就赋最大值
|
// 判断是否是排序字段,如果是就赋最大值
|
||||||
if (column.isOrder === true) {
|
if (column.isOrder === true) {
|
||||||
value[key] = this.getInputNumberMaxValue(column) + 1
|
value[key] = this.getInputNumberMaxValue(column) + 1
|
||||||
} else {
|
} else {
|
||||||
value[key] = recordHasValue ? record[key] : column.defaultValue
|
value[key] = recordHasValue ? record[key] : (column.defaultValue || (column.defaultValue === 0 ? 0 : ''))
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (column.type === FormTypes.checkbox) {
|
} else if (column.type === FormTypes.checkbox) {
|
||||||
|
@ -1026,29 +1053,26 @@
|
||||||
},
|
},
|
||||||
/** 通过规则验证值是否正确 */
|
/** 通过规则验证值是否正确 */
|
||||||
validateValue(rules, value) {
|
validateValue(rules, value) {
|
||||||
if (!(rules instanceof Array)) {
|
let passed = true, message = ''
|
||||||
return [true, ''] // 没有验证规则,或验证规则格式不正确,默认通过
|
// 判断有没有验证规则或验证规则格式正不正确,若条件不符合则默认通过
|
||||||
}
|
if (rules instanceof Array) {
|
||||||
|
for (let rule of rules) {
|
||||||
let passed = true
|
// 当前值是否为空
|
||||||
let message = ''
|
let isNull = (value == null || value === '')
|
||||||
for (let rule of rules) {
|
// 验证规则:非空
|
||||||
let isNull = (value == null || value === '')
|
if (rule.required === true && isNull) {
|
||||||
// 非空验证
|
|
||||||
if (rule.required === true) {
|
|
||||||
if (isNull) {
|
|
||||||
passed = false
|
passed = false
|
||||||
|
} else // 使用 else-if 是为了防止一个 rule 中出现两个规则
|
||||||
|
// 验证规则:正则表达式
|
||||||
|
if (!!rule.pattern && !isNull) {
|
||||||
|
passed = new RegExp(rule.pattern).test(value)
|
||||||
|
}
|
||||||
|
// 如果没有通过验证,则跳出循环。如果通过了验证,则继续验证下一条规则
|
||||||
|
if (!passed) {
|
||||||
message = rule.message
|
message = rule.message
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
} else // 使用 else-if 是为了防止一个 rule 中出现两个规则
|
|
||||||
// 正则表达式验证
|
|
||||||
if (rule.pattern && !isNull) {
|
|
||||||
passed = new RegExp(rule.pattern).test(value)
|
|
||||||
message = rule.message
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return [passed, message]
|
return [passed, message]
|
||||||
},
|
},
|
||||||
|
@ -1136,7 +1160,46 @@
|
||||||
handleClickClearSelect() {
|
handleClickClearSelect() {
|
||||||
this.selectedRowIds = []
|
this.selectedRowIds = []
|
||||||
},
|
},
|
||||||
|
/** select 搜索时的事件,用于动态添加options */
|
||||||
|
handleSearchSelect(value, id, row, col) {
|
||||||
|
if (col.allowInput === true) {
|
||||||
|
// 是否找到了对应的项,找不到则添加这一项
|
||||||
|
let flag = false
|
||||||
|
for (let option of col.options) {
|
||||||
|
if (option.value.toLocaleString() === value.toLocaleString()) {
|
||||||
|
flag = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// !!value :不添加空值
|
||||||
|
if (!flag && !!value) {
|
||||||
|
// searchAdd 是否是通过搜索添加的
|
||||||
|
col.options.push({ title: value, value: value, searchAdd: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// blur 失去焦点
|
||||||
|
handleBlurSearch(value, id, row, col) {
|
||||||
|
if (col.allowInput === true) {
|
||||||
|
// 删除无用的因搜索(用户输入)而创建的项
|
||||||
|
if (typeof value === 'string') {
|
||||||
|
let indexs = []
|
||||||
|
col.options.forEach((option, index) => {
|
||||||
|
if (option.value.toLocaleString() === value.toLocaleString()) {
|
||||||
|
delete option.searchAdd
|
||||||
|
} else if (option.searchAdd === true) {
|
||||||
|
indexs.push(index)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 翻转删除数组中的项
|
||||||
|
for (let index of indexs.reverse()) {
|
||||||
|
col.options.splice(index, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/* --- common function begin --- */
|
/* --- common function begin --- */
|
||||||
|
|
||||||
|
@ -1251,7 +1314,8 @@
|
||||||
|
|
||||||
/** 将caseId去除 */
|
/** 将caseId去除 */
|
||||||
removeCaseId(id) {
|
removeCaseId(id) {
|
||||||
return id.split(this.caseId)[1]
|
let remove = id.split(this.caseId)[1]
|
||||||
|
return remove ? remove : id
|
||||||
},
|
},
|
||||||
|
|
||||||
handleClickDelFile(id) {
|
handleClickDelFile(id) {
|
||||||
|
@ -1329,10 +1393,21 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 判断select是否允许输入
|
||||||
|
if (col.type === FormTypes.select && col.allowInput === true) {
|
||||||
|
props['showSearch'] = true
|
||||||
|
}
|
||||||
|
|
||||||
// 判断是否为禁用的行
|
// 判断是否为禁用的行
|
||||||
if (props['disabled'] !== true) {
|
if (props['disabled'] !== true) {
|
||||||
props['disabled'] = ((this.disabledRowIds || []).indexOf(row.id) !== -1)
|
props['disabled'] = ((this.disabledRowIds || []).indexOf(row.id) !== -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 判断是否禁用全部组件
|
||||||
|
if (this.disabled === true) {
|
||||||
|
props['disabled'] = true
|
||||||
|
}
|
||||||
|
|
||||||
return props
|
return props
|
||||||
},
|
},
|
||||||
/** upload 辅助方法:获取 headers */
|
/** upload 辅助方法:获取 headers */
|
|
@ -21,6 +21,7 @@
|
||||||
import 'tinymce/plugins/wordcount'
|
import 'tinymce/plugins/wordcount'
|
||||||
import 'tinymce/plugins/colorpicker'
|
import 'tinymce/plugins/colorpicker'
|
||||||
import 'tinymce/plugins/textcolor'
|
import 'tinymce/plugins/textcolor'
|
||||||
|
import 'tinymce/plugins/fullscreen'
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
Editor
|
Editor
|
||||||
|
@ -41,11 +42,11 @@
|
||||||
},
|
},
|
||||||
plugins: {
|
plugins: {
|
||||||
type: [String, Array],
|
type: [String, Array],
|
||||||
default: 'lists image media table textcolor wordcount contextmenu'
|
default: 'lists image media table textcolor wordcount contextmenu fullscreen'
|
||||||
},
|
},
|
||||||
toolbar: {
|
toolbar: {
|
||||||
type: [String, Array],
|
type: [String, Array],
|
||||||
default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists image media table | removeformat'
|
default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists image media table | removeformat | fullscreen'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
|
@ -0,0 +1,48 @@
|
||||||
|
<template>
|
||||||
|
<div v-if="disabled" class="jeecg-form-container-disabled">
|
||||||
|
<fieldset disabled>
|
||||||
|
<slot></slot>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* 使用方法
|
||||||
|
* 在form下直接写这个组件就行了,
|
||||||
|
*<a-form layout="inline" :form="form" >
|
||||||
|
* <j-form-container :disabled="true">
|
||||||
|
* <!-- 表单内容省略..... -->
|
||||||
|
* </j-form-container>
|
||||||
|
*</a-form>
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
name: 'JFormContainer',
|
||||||
|
props:{
|
||||||
|
disabled:{
|
||||||
|
type:Boolean,
|
||||||
|
default:false,
|
||||||
|
required:false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted(){
|
||||||
|
console.log("我是表单禁用专用组件,但是我并不支持表单中iframe的内容禁用")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.jeecg-form-container-disabled{
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
.jeecg-form-container-disabled fieldset[disabled] {
|
||||||
|
-ms-pointer-events: none;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
.jeecg-form-container-disabled .ant-select{
|
||||||
|
-ms-pointer-events: none;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -60,6 +60,7 @@
|
||||||
this.$emit('input', selectedValue.join(","));
|
this.$emit('input', selectedValue.join(","));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|