JeecgBoot 2.4.2 积木报表版本发布,基于SpringBoot的低代码平台
This commit is contained in:
parent
b5488231cb
commit
bac98af0b7
|
@ -7,12 +7,12 @@
|
||||||
JEECG BOOT 低代码开发平台(前后端分离版本)
|
JEECG BOOT 低代码开发平台(前后端分离版本)
|
||||||
===============
|
===============
|
||||||
|
|
||||||
当前最新版本: 2.4.0(发布日期:2020-12-01)
|
当前最新版本: 2.4.2(发布日期:2021-01-26)
|
||||||
|
|
||||||
|
|
||||||
[![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-北京国炬软件-orange.svg)](http://www.jeecg.com)
|
[![](https://img.shields.io/badge/Author-北京国炬软件-orange.svg)](http://www.jeecg.com)
|
||||||
[![](https://img.shields.io/badge/version-2.4-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot)
|
[![](https://img.shields.io/badge/version-2.4.2-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot)
|
[![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot)
|
[![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
VUE_APP_PLATFORM_NAME=Jeecg-Boot 企业级快速开发平台
|
VUE_APP_PLATFORM_NAME=JeecgBoot 企业级快速开发平台
|
||||||
VUE_APP_SSO=false
|
VUE_APP_SSO=false
|
|
@ -1,7 +1,7 @@
|
||||||
Ant Design Jeecg Vue
|
Ant Design Jeecg Vue
|
||||||
====
|
====
|
||||||
|
|
||||||
当前最新版本: 2.4.0(发布日期:20201201)
|
当前最新版本: 2.4.2(发布日期:20210126)
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
----
|
----
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "vue-antd-jeecg",
|
"name": "vue-antd-jeecg",
|
||||||
"version": "2.4.0",
|
"version": "2.4.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"pre": "cnpm install || yarn --registry https://registry.npm.taobao.org || npm install --registry https://registry.npm.taobao.org ",
|
"pre": "cnpm install || yarn --registry https://registry.npm.taobao.org || npm install --registry https://registry.npm.taobao.org ",
|
||||||
|
@ -10,7 +10,7 @@
|
||||||
"lint": "vue-cli-service lint"
|
"lint": "vue-cli-service lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jeecg/antd-online-mini": "2.4.0-beta4",
|
"@jeecg/antd-online-mini": "2.4.21-beta",
|
||||||
"ant-design-vue": "^1.7.2",
|
"ant-design-vue": "^1.7.2",
|
||||||
"@antv/data-set": "^0.11.4",
|
"@antv/data-set": "^0.11.4",
|
||||||
"viser-vue": "^2.4.8",
|
"viser-vue": "^2.4.8",
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2421,7 +2421,9 @@ a.listItemMetaTitle {
|
||||||
color: rgba(0, 0, 0, 0.85);
|
color: rgba(0, 0, 0, 0.85);
|
||||||
}
|
}
|
||||||
.main {
|
.main {
|
||||||
background-color: #fff;
|
//update-begin---author:liusq Date:20210108 for:[JT-409]编译主题色,然后退出登录后的首页是这样子------------
|
||||||
|
//background-color: #fff;
|
||||||
|
//update-end---author:liusq Date:20210108 for:[JT-409]编译主题色,然后退出登录后的首页是这样子------------
|
||||||
}
|
}
|
||||||
.main .leftmenu {
|
.main .leftmenu {
|
||||||
border-right: 1px solid #e8e8e8;
|
border-right: 1px solid #e8e8e8;
|
||||||
|
@ -7687,9 +7689,6 @@ font.weak {
|
||||||
color: @primary-color;
|
color: @primary-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.ant-menu-submenu-selected {
|
|
||||||
color: @primary-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// begin -------- JAreaLinkage 三级联动样式 --------------
|
// begin -------- JAreaLinkage 三级联动样式 --------------
|
||||||
.cascader-menu-list .cascader-menu-option.hover,
|
.cascader-menu-list .cascader-menu-option.hover,
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
<title>Jeecg-Boot 企业级快速开发平台</title>
|
<title>JeecgBoot 企业级快速开发平台</title>
|
||||||
<link rel="icon" href="<%= BASE_URL %>logo.png">
|
<link rel="icon" href="<%= BASE_URL %>logo.png">
|
||||||
<script src="<%= BASE_URL %>cdn/babel-polyfill/polyfill_7_2_5.js"></script>
|
<script src="<%= BASE_URL %>cdn/babel-polyfill/polyfill_7_2_5.js"></script>
|
||||||
<style>
|
<style>
|
||||||
|
@ -251,7 +251,7 @@
|
||||||
<div id="loader"></div>
|
<div id="loader"></div>
|
||||||
<div class="loader-section section-left"></div>
|
<div class="loader-section section-left"></div>
|
||||||
<div class="loader-section section-right"></div>
|
<div class="loader-section section-right"></div>
|
||||||
<div class="load_title">正在加载 Jeecg-Boot 快速开发平台,请耐心等待
|
<div class="load_title">正在加载 JeecgBoot 快速开发平台,请耐心等待
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -18,6 +18,7 @@ const frozenBatch = (params)=>putAction("/sys/user/frozenBatch",params);
|
||||||
const checkOnlyUser = (params)=>getAction("/sys/user/checkOnlyUser",params);
|
const checkOnlyUser = (params)=>getAction("/sys/user/checkOnlyUser",params);
|
||||||
//改变密码
|
//改变密码
|
||||||
const changePassword = (params)=>putAction("/sys/user/changePassword",params);
|
const changePassword = (params)=>putAction("/sys/user/changePassword",params);
|
||||||
|
|
||||||
//权限管理
|
//权限管理
|
||||||
const addPermission= (params)=>postAction("/sys/permission/add",params);
|
const addPermission= (params)=>postAction("/sys/permission/add",params);
|
||||||
const editPermission= (params)=>putAction("/sys/permission/edit",params);
|
const editPermission= (params)=>putAction("/sys/permission/edit",params);
|
||||||
|
@ -25,7 +26,6 @@ const getPermissionList = (params)=>getAction("/sys/permission/list",params);
|
||||||
const getSystemMenuList = (params)=>getAction("/sys/permission/getSystemMenuList",params);
|
const getSystemMenuList = (params)=>getAction("/sys/permission/getSystemMenuList",params);
|
||||||
const getSystemSubmenu = (params)=>getAction("/sys/permission/getSystemSubmenu",params);
|
const getSystemSubmenu = (params)=>getAction("/sys/permission/getSystemSubmenu",params);
|
||||||
const getSystemSubmenuBatch = (params) => getAction('/sys/permission/getSystemSubmenuBatch', params)
|
const getSystemSubmenuBatch = (params) => getAction('/sys/permission/getSystemSubmenuBatch', params)
|
||||||
|
|
||||||
const queryTreeList = (params)=>getAction("/sys/permission/queryTreeList",params);
|
const queryTreeList = (params)=>getAction("/sys/permission/queryTreeList",params);
|
||||||
const queryTreeListForRole = (params)=>getAction("/sys/role/queryTreeList",params);
|
const queryTreeListForRole = (params)=>getAction("/sys/role/queryTreeList",params);
|
||||||
const queryListAsync = (params)=>getAction("/sys/permission/queryListAsync",params);
|
const queryListAsync = (params)=>getAction("/sys/permission/queryListAsync",params);
|
||||||
|
@ -52,6 +52,7 @@ const saveDeptRolePermission = (params)=>postAction("/sys/sysDepartPermission/sa
|
||||||
const queryMyDepartTreeList = (params)=>getAction("/sys/sysDepart/queryMyDeptTreeList",params);
|
const queryMyDepartTreeList = (params)=>getAction("/sys/sysDepart/queryMyDeptTreeList",params);
|
||||||
|
|
||||||
//日志管理
|
//日志管理
|
||||||
|
//const getLogList = (params)=>getAction("/sys/log/list",params);
|
||||||
const deleteLog = (params)=>deleteAction("/sys/log/delete",params);
|
const deleteLog = (params)=>deleteAction("/sys/log/delete",params);
|
||||||
const deleteLogList = (params)=>deleteAction("/sys/log/deleteBatch",params);
|
const deleteLogList = (params)=>deleteAction("/sys/log/deleteBatch",params);
|
||||||
|
|
||||||
|
@ -79,8 +80,10 @@ const doReovkeData = (params)=>getAction("/sys/annountCement/doReovkeData",param
|
||||||
//获取系统访问量
|
//获取系统访问量
|
||||||
const getLoginfo = (params)=>getAction("/sys/loginfo",params);
|
const getLoginfo = (params)=>getAction("/sys/loginfo",params);
|
||||||
const getVisitInfo = (params)=>getAction("/sys/visitInfo",params);
|
const getVisitInfo = (params)=>getAction("/sys/visitInfo",params);
|
||||||
|
|
||||||
// 根据部门主键查询用户信息
|
// 根据部门主键查询用户信息
|
||||||
const queryUserByDepId = (params)=>getAction("/sys/user/queryUserByDepId",params);
|
const queryUserByDepId = (params)=>getAction("/sys/user/queryUserByDepId",params);
|
||||||
|
|
||||||
// 重复校验
|
// 重复校验
|
||||||
const duplicateCheck = (params)=>getAction("/sys/duplicate/check",params);
|
const duplicateCheck = (params)=>getAction("/sys/duplicate/check",params);
|
||||||
// 加载分类字典
|
// 加载分类字典
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
mode="multiple"
|
mode="multiple"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
:getPopupContainer="(node) => node.parentNode"
|
:getPopupContainer="getParentContainer"
|
||||||
optionFilterProp="children"
|
optionFilterProp="children"
|
||||||
:filterOption="filterOption"
|
:filterOption="filterOption"
|
||||||
allowClear>
|
allowClear>
|
||||||
|
@ -36,13 +36,23 @@
|
||||||
disabled: Boolean,
|
disabled: Boolean,
|
||||||
value: String,
|
value: String,
|
||||||
type: String,
|
type: String,
|
||||||
options:Array
|
options:Array,
|
||||||
|
spliter:{
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: ','
|
||||||
|
},
|
||||||
|
popContainer:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
dictOptions: [],
|
dictOptions: [],
|
||||||
tagType:"",
|
tagType:"",
|
||||||
arrayValue:!this.value?[]:this.value.split(",")
|
arrayValue:!this.value?[]:this.value.split(this.spliter)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
@ -68,7 +78,7 @@
|
||||||
if(!val){
|
if(!val){
|
||||||
this.arrayValue = []
|
this.arrayValue = []
|
||||||
}else{
|
}else{
|
||||||
this.arrayValue = this.value.split(",")
|
this.arrayValue = this.value.split(this.spliter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -78,8 +88,9 @@
|
||||||
this.dictOptions = [...this.options]
|
this.dictOptions = [...this.options]
|
||||||
}else{
|
}else{
|
||||||
//优先从缓存中读取字典配置
|
//优先从缓存中读取字典配置
|
||||||
if(getDictItemsFromCache(this.dictCode)){
|
let cacheOption = getDictItemsFromCache(this.dictCode)
|
||||||
this.dictOptions = getDictItemsFromCache(this.dictCode);
|
if(cacheOption && cacheOption.length>0){
|
||||||
|
this.dictOptions = cacheOption
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//根据字典Code, 初始化字典数组
|
//根据字典Code, 初始化字典数组
|
||||||
|
@ -92,7 +103,7 @@
|
||||||
|
|
||||||
},
|
},
|
||||||
onChange (selectedValue) {
|
onChange (selectedValue) {
|
||||||
this.$emit('change', selectedValue.join(","));
|
this.$emit('change', selectedValue.join(this.spliter));
|
||||||
},
|
},
|
||||||
setCurrentDictOptions(dictOptions){
|
setCurrentDictOptions(dictOptions){
|
||||||
this.dictOptions = dictOptions
|
this.dictOptions = dictOptions
|
||||||
|
@ -100,6 +111,13 @@
|
||||||
getCurrentDictOptions(){
|
getCurrentDictOptions(){
|
||||||
return this.dictOptions
|
return this.dictOptions
|
||||||
},
|
},
|
||||||
|
getParentContainer(node){
|
||||||
|
if(!this.popContainer){
|
||||||
|
return node.parentNode
|
||||||
|
}else{
|
||||||
|
return document.querySelector(this.popContainer)
|
||||||
|
}
|
||||||
|
},
|
||||||
// update--begin--autor:lvdandan-----date:20201120------for:LOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
|
// update--begin--autor:lvdandan-----date:20201120------for:LOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
|
||||||
filterOption(input, option) {
|
filterOption(input, option) {
|
||||||
return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
showSearch
|
showSearch
|
||||||
labelInValue
|
labelInValue
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:getPopupContainer="(node) => node.parentNode"
|
:getPopupContainer="getParentContainer"
|
||||||
@search="loadData"
|
@search="loadData"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
v-model="selectedAsyncValue"
|
v-model="selectedAsyncValue"
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
<a-select
|
<a-select
|
||||||
v-else
|
v-else
|
||||||
:getPopupContainer="(node) => node.parentNode"
|
:getPopupContainer="getParentContainer"
|
||||||
showSearch
|
showSearch
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
|
@ -55,6 +55,16 @@
|
||||||
type:String,
|
type:String,
|
||||||
default:"请选择",
|
default:"请选择",
|
||||||
required:false
|
required:false
|
||||||
|
},
|
||||||
|
popContainer:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
},
|
||||||
|
pageSize:{
|
||||||
|
type: Number,
|
||||||
|
default: 10,
|
||||||
|
required: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
|
@ -126,7 +136,7 @@
|
||||||
this.options = []
|
this.options = []
|
||||||
this.loading=true
|
this.loading=true
|
||||||
// 字典code格式:table,text,code
|
// 字典code格式:table,text,code
|
||||||
getAction(`/sys/dict/loadDict/${this.dict}`,{keyword:value}).then(res=>{
|
getAction(`/sys/dict/loadDict/${this.dict}`,{keyword:value, pageSize: this.pageSize}).then(res=>{
|
||||||
this.loading=false
|
this.loading=false
|
||||||
if(res.success){
|
if(res.success){
|
||||||
if(currentLoad!=this.lastLoad){
|
if(currentLoad!=this.lastLoad){
|
||||||
|
@ -171,6 +181,17 @@
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
//异步一开始也加载一点数据
|
||||||
|
this.loading=true
|
||||||
|
getAction(`/sys/dict/loadDict/${this.dict}`,{pageSize: this.pageSize, keyword:''}).then(res=>{
|
||||||
|
this.loading=false
|
||||||
|
if(res.success){
|
||||||
|
this.options = res.result
|
||||||
|
}else{
|
||||||
|
this.$message.warning(res.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
filterOption(input, option) {
|
filterOption(input, option) {
|
||||||
|
@ -182,9 +203,18 @@
|
||||||
this.callback()
|
this.callback()
|
||||||
},
|
},
|
||||||
handleAsyncChange(selectedObj){
|
handleAsyncChange(selectedObj){
|
||||||
this.selectedAsyncValue = selectedObj
|
//update-begin-author:scott date:20201222 for:【搜索】搜索查询组件,删除条件,默认下拉还是上次的缓存数据,不好 JT-191
|
||||||
this.selectedValue = selectedObj.key
|
if(selectedObj){
|
||||||
|
this.selectedAsyncValue = selectedObj
|
||||||
|
this.selectedValue = selectedObj.key
|
||||||
|
}else{
|
||||||
|
this.selectedAsyncValue = null
|
||||||
|
this.selectedValue = null
|
||||||
|
this.options = null
|
||||||
|
this.loadData("")
|
||||||
|
}
|
||||||
this.callback()
|
this.callback()
|
||||||
|
//update-end-author:scott date:20201222 for:【搜索】搜索查询组件,删除条件,默认下拉还是上次的缓存数据,不好 JT-191
|
||||||
},
|
},
|
||||||
callback(){
|
callback(){
|
||||||
this.$emit('change', this.selectedValue);
|
this.$emit('change', this.selectedValue);
|
||||||
|
@ -194,7 +224,14 @@
|
||||||
},
|
},
|
||||||
getCurrentDictOptions(){
|
getCurrentDictOptions(){
|
||||||
return this.options
|
return this.options
|
||||||
}
|
},
|
||||||
|
getParentContainer(node){
|
||||||
|
if(!this.popContainer){
|
||||||
|
return node.parentNode
|
||||||
|
}else{
|
||||||
|
return document.querySelector(this.popContainer)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
},
|
},
|
||||||
model: {
|
model: {
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
import JDictSelectTag from './JDictSelectTag.vue'
|
import JDictSelectTag from './JDictSelectTag.vue'
|
||||||
import JMultiSelectTag from './JMultiSelectTag.vue'
|
import JMultiSelectTag from './JMultiSelectTag.vue'
|
||||||
import JSearchSelectTag from './JSearchSelectTag.vue'
|
import JSearchSelectTag from './JSearchSelectTag.vue'
|
||||||
|
import { filterMultiDictText,filterDictText,initDictOptions,filterDictTextByCache } from './JDictSelectUtil'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
install: function (Vue) {
|
install: function (Vue) {
|
||||||
Vue.component('JDictSelectTag',JDictSelectTag);
|
Vue.component('JDictSelectTag',JDictSelectTag);
|
||||||
Vue.component('JMultiSelectTag',JMultiSelectTag);
|
Vue.component('JMultiSelectTag',JMultiSelectTag);
|
||||||
Vue.component('JSearchSelectTag',JSearchSelectTag);
|
Vue.component('JSearchSelectTag',JSearchSelectTag);
|
||||||
|
Vue.prototype.$initDictOptions = (dictCode) => initDictOptions(dictCode)
|
||||||
|
Vue.prototype.$filterMultiDictText = (dictOptions, text) => filterMultiDictText(dictOptions, text)
|
||||||
|
Vue.prototype.$filterDictText = (dictOptions, text) => filterDictText(dictOptions, text)
|
||||||
|
Vue.prototype.$filterDictTextByCache = (...param) => filterDictTextByCache(...param)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -251,6 +251,9 @@
|
||||||
},
|
},
|
||||||
style: {}
|
style: {}
|
||||||
}
|
}
|
||||||
|
if(isIE() || isIE11()){
|
||||||
|
props.style['height'] = '240px'
|
||||||
|
}
|
||||||
if (this.fullCoder) {
|
if (this.fullCoder) {
|
||||||
props.style['z-index'] = this.zIndex
|
props.style['z-index'] = this.zIndex
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,282 +0,0 @@
|
||||||
<template>
|
|
||||||
<div v-bind="fullScreenParentProps">
|
|
||||||
<a-icon v-if="fullScreen" class="full-screen-icon" :type="iconType" @click="()=>fullCoder=!fullCoder"/>
|
|
||||||
|
|
||||||
<div class="code-editor-cust full-screen-child">
|
|
||||||
<a-textarea auto-size v-model="textareaValue" :placeholder="placeholderShow" @change="handleChange" :style="{'max-height': maxHeight+'px','min-height': minHeight+'px'}"></a-textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script type="text/ecmascript-6">
|
|
||||||
export default {
|
|
||||||
name: 'JCodeEditor',
|
|
||||||
props: {
|
|
||||||
value: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
placeholder: {
|
|
||||||
type: String,
|
|
||||||
default: null
|
|
||||||
},
|
|
||||||
// 是否显示全屏按钮
|
|
||||||
fullScreen: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
// 全屏以后的z-index
|
|
||||||
zIndex: {
|
|
||||||
type: [Number, String],
|
|
||||||
default: 999
|
|
||||||
},
|
|
||||||
// 是否自适应高度,可以传String或Boolean
|
|
||||||
// 传 String 类型只能写"!ie" ,
|
|
||||||
// 填写这个字符串,代表其他浏览器自适应高度
|
|
||||||
// 唯独IE下不自适应高度,因为IE下不支持min、max-height样式
|
|
||||||
// 如果填写的不是"!ie"就视为true
|
|
||||||
autoHeight: {
|
|
||||||
type: [String, Boolean],
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
// 不自适应高度的情况下生效的固定高度
|
|
||||||
height: {
|
|
||||||
type: [String, Number],
|
|
||||||
default: '240px'
|
|
||||||
},
|
|
||||||
language: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
minHeight:{
|
|
||||||
type:Number,
|
|
||||||
default: 100,
|
|
||||||
required:false
|
|
||||||
},
|
|
||||||
maxHeight:{
|
|
||||||
type:Number,
|
|
||||||
default: 320,
|
|
||||||
required:false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
textareaValue: '',
|
|
||||||
// 内部真实的内容
|
|
||||||
code: '',
|
|
||||||
iconType: 'fullscreen',
|
|
||||||
hasCode:false,
|
|
||||||
// 默认的语法类型
|
|
||||||
mode: 'javascript',
|
|
||||||
// 编辑器实例
|
|
||||||
coder: null,
|
|
||||||
// 默认配置
|
|
||||||
options: {
|
|
||||||
// 缩进格式
|
|
||||||
tabSize: 2,
|
|
||||||
// 主题,对应主题库 JS 需要提前引入
|
|
||||||
theme: 'panda-syntax',
|
|
||||||
line: true,
|
|
||||||
// extraKeys: {'Ctrl': 'autocomplete'},//自定义快捷键
|
|
||||||
hintOptions: {
|
|
||||||
tables: {
|
|
||||||
users: ['name', 'score', 'birthDate'],
|
|
||||||
countries: ['name', 'population', 'size']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
// code 编辑器 是否全屏
|
|
||||||
fullCoder: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
fullCoder:{
|
|
||||||
handler(value) {
|
|
||||||
if(value){
|
|
||||||
this.iconType="fullscreen-exit"
|
|
||||||
}else{
|
|
||||||
this.iconType="fullscreen"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
placeholderShow() {
|
|
||||||
if (this.placeholder == null) {
|
|
||||||
return `请在此输入代码`
|
|
||||||
} else {
|
|
||||||
return this.placeholder
|
|
||||||
}
|
|
||||||
},
|
|
||||||
isAutoHeight() {
|
|
||||||
let {autoHeight} = this
|
|
||||||
if (typeof autoHeight === 'string' && autoHeight.toLowerCase().trim() === '!ie') {
|
|
||||||
autoHeight = !(isIE() || isIE11())
|
|
||||||
} else {
|
|
||||||
autoHeight = true
|
|
||||||
}
|
|
||||||
return autoHeight
|
|
||||||
},
|
|
||||||
fullScreenParentProps() {
|
|
||||||
let props = {
|
|
||||||
class: {
|
|
||||||
'full-screen-parent': true,
|
|
||||||
'full-screen': this.fullCoder,
|
|
||||||
'auto-height': this.isAutoHeight
|
|
||||||
},
|
|
||||||
style: {}
|
|
||||||
}
|
|
||||||
if (this.fullCoder) {
|
|
||||||
props.style['z-index'] = this.zIndex
|
|
||||||
}
|
|
||||||
if (!this.isAutoHeight) {
|
|
||||||
props.style['height'] = (typeof this.height === 'number' ? this.height + 'px' : this.height)
|
|
||||||
}
|
|
||||||
return props
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
// 初始化
|
|
||||||
this._initialize()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
// 初始化
|
|
||||||
_initialize () {
|
|
||||||
this.setCodeContent(this.value)
|
|
||||||
},
|
|
||||||
handleChange(e){
|
|
||||||
this.$emit('input', e.target.value)
|
|
||||||
},
|
|
||||||
getCodeContent(){
|
|
||||||
return this.value
|
|
||||||
},
|
|
||||||
setCodeContent(val){
|
|
||||||
setTimeout(()=>{
|
|
||||||
if(!val){
|
|
||||||
this.textareaValue = ''
|
|
||||||
}else{
|
|
||||||
this.textareaValue = val
|
|
||||||
}
|
|
||||||
},300)
|
|
||||||
},
|
|
||||||
nullTipClick(){
|
|
||||||
this.coder.focus()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less">
|
|
||||||
.code-editor-cust{
|
|
||||||
flex-grow:1;
|
|
||||||
display:flex;
|
|
||||||
position:relative;
|
|
||||||
height:100%;
|
|
||||||
.CodeMirror{
|
|
||||||
flex-grow:1;
|
|
||||||
z-index:1;
|
|
||||||
.CodeMirror-code{
|
|
||||||
line-height:19px;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
.code-mode-select{
|
|
||||||
position:absolute;
|
|
||||||
z-index:2;
|
|
||||||
right:10px;
|
|
||||||
top:10px;
|
|
||||||
max-width:130px;
|
|
||||||
}
|
|
||||||
.CodeMirror{
|
|
||||||
height: auto;
|
|
||||||
min-height:100%;
|
|
||||||
}
|
|
||||||
.null-tip{
|
|
||||||
position: absolute;
|
|
||||||
top: 4px;
|
|
||||||
left: 36px;
|
|
||||||
z-index: 10;
|
|
||||||
color: #ffffffc9;
|
|
||||||
line-height: initial;
|
|
||||||
}
|
|
||||||
.null-tip-hidden{
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 全屏样式 */
|
|
||||||
.full-screen-parent {
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.full-screen-icon {
|
|
||||||
opacity: 0;
|
|
||||||
color: black;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 24px;
|
|
||||||
background-color: white;
|
|
||||||
position: absolute;
|
|
||||||
top: 2px;
|
|
||||||
right: 2px;
|
|
||||||
z-index: 9;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: opacity 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
.full-screen-icon {
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(255, 255, 255, 0.88);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.full-screen {
|
|
||||||
position: fixed;
|
|
||||||
top: 10px;
|
|
||||||
left: 10px;
|
|
||||||
width: calc(100% - 20px);
|
|
||||||
height: calc(100% - 20px);
|
|
||||||
padding: 10px;
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
|
|
||||||
.full-screen-icon {
|
|
||||||
top: 12px;
|
|
||||||
right: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.full-screen-child {
|
|
||||||
height: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.full-screen-child {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.auto-height {
|
|
||||||
.full-screen-child {
|
|
||||||
min-height: 120px;
|
|
||||||
max-height: 320px;
|
|
||||||
height: unset;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.full-screen .full-screen-child {
|
|
||||||
height: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-cursor{
|
|
||||||
height:18.4px !important;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -11,13 +11,13 @@
|
||||||
<a-col>
|
<a-col>
|
||||||
<!-- 操作按钮 -->
|
<!-- 操作按钮 -->
|
||||||
<div v-if="actionButton" class="action-button">
|
<div v-if="actionButton" class="action-button">
|
||||||
<a-button type="primary" icon="plus" @click="handleClickAdd" :disabled="disabled">新增</a-button>
|
<a-button v-if="buttonPermission('add')" type="primary" icon="plus" @click="handleClickAdd" :disabled="disabled">新增</a-button>
|
||||||
<span class="gap"></span>
|
<span class="gap"></span>
|
||||||
<template v-if="selectedRowIds.length>0">
|
<template v-if="selectedRowIds.length>0">
|
||||||
<a-popconfirm
|
<a-popconfirm
|
||||||
:title="`确定要删除这 ${selectedRowIds.length} 项吗?`"
|
:title="`确定要删除这 ${selectedRowIds.length} 项吗?`"
|
||||||
@confirm="handleConfirmDelete">
|
@confirm="handleConfirmDelete">
|
||||||
<a-button type="primary" icon="minus" :disabled="disabled">删除</a-button>
|
<a-button v-if="buttonPermission('batch_delete')" type="primary" icon="minus" :disabled="disabled">删除</a-button>
|
||||||
<span class="gap"></span>
|
<span class="gap"></span>
|
||||||
</a-popconfirm>
|
</a-popconfirm>
|
||||||
<template v-if="showClearSelectButton">
|
<template v-if="showClearSelectButton">
|
||||||
|
@ -59,7 +59,7 @@
|
||||||
v-show="col.type !== formTypes.hidden"
|
v-show="col.type !== formTypes.hidden"
|
||||||
class="td"
|
class="td"
|
||||||
:key="col.key"
|
:key="col.key"
|
||||||
:style="buildTdStyle(col,true)">
|
:style="buildTdStyle(col)">
|
||||||
|
|
||||||
<span>{{ col.title }}</span>
|
<span>{{ col.title }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -188,6 +188,7 @@
|
||||||
:getPopupContainer="getParentContainer"
|
:getPopupContainer="getParentContainer"
|
||||||
:placeholder="replaceProps(col, col.placeholder)"
|
:placeholder="replaceProps(col, col.placeholder)"
|
||||||
:filterOption="(i,o)=>handleSelectFilterOption(i,o,col)"
|
:filterOption="(i,o)=>handleSelectFilterOption(i,o,col)"
|
||||||
|
:maxTagCount="1"
|
||||||
@change="(v)=>handleChangeSelectCommon(v,id,row,col)"
|
@change="(v)=>handleChangeSelectCommon(v,id,row,col)"
|
||||||
@search="(v)=>handleSearchSelect(v,id,row,col)"
|
@search="(v)=>handleSearchSelect(v,id,row,col)"
|
||||||
@blur="(v)=>handleBlurSearch(v,id,row,col)"
|
@blur="(v)=>handleBlurSearch(v,id,row,col)"
|
||||||
|
@ -201,6 +202,55 @@
|
||||||
>{{ getSelectTranslateText(selectValues[id], row, col) }}</span>
|
>{{ getSelectTranslateText(selectValues[id], row, col) }}</span>
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<!-- 部门选择 -->
|
||||||
|
<template v-else-if="col.type === formTypes.sel_depart">
|
||||||
|
<a-tooltip v-bind="buildTooltipProps(row, col, id)">
|
||||||
|
<j-select-depart
|
||||||
|
v-if="isEditRow(row, col)"
|
||||||
|
:id="id"
|
||||||
|
:key="i"
|
||||||
|
v-bind="buildProps(row,col)"
|
||||||
|
style="width: 100%;"
|
||||||
|
:value="departCompValues[id]"
|
||||||
|
:placeholder="replaceProps(col, col.placeholder)"
|
||||||
|
:trigger-change="true"
|
||||||
|
:multi="true"
|
||||||
|
@change="(v)=>handleChangeDepartCommon(v,id,row,col)"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
v-else
|
||||||
|
class="j-td-span no-edit"
|
||||||
|
:class="{disabled: buildProps(row,col).disabled}"
|
||||||
|
@click="handleEditRow(row, col)"
|
||||||
|
>{{ departCompValues[id] }}</span>
|
||||||
|
</a-tooltip>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<!-- 用户选择 -->
|
||||||
|
<template v-else-if="col.type === formTypes.sel_user">
|
||||||
|
<a-tooltip v-bind="buildTooltipProps(row, col, id)">
|
||||||
|
<j-select-user-by-dep
|
||||||
|
v-if="isEditRow(row, col)"
|
||||||
|
:id="id"
|
||||||
|
:key="i"
|
||||||
|
v-bind="buildProps(row,col)"
|
||||||
|
style="width: 100%;"
|
||||||
|
:value="userCompValues[id]"
|
||||||
|
:placeholder="replaceProps(col, col.placeholder)"
|
||||||
|
:trigger-change="true"
|
||||||
|
:multi="true"
|
||||||
|
@change="(v)=>handleChangeUserCommon(v,id,row,col)"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
v-else
|
||||||
|
class="j-td-span no-edit"
|
||||||
|
:class="{disabled: buildProps(row,col).disabled}"
|
||||||
|
@click="handleEditRow(row, col)"
|
||||||
|
>{{ userCompValues[id] }}</span>
|
||||||
|
</a-tooltip>
|
||||||
|
</template>
|
||||||
|
|
||||||
<!-- date -->
|
<!-- date -->
|
||||||
<template v-else-if="col.type === formTypes.date || col.type === formTypes.datetime">
|
<template v-else-if="col.type === formTypes.date || col.type === formTypes.datetime">
|
||||||
<a-tooltip v-bind="buildTooltipProps(row, col, id)">
|
<a-tooltip v-bind="buildTooltipProps(row, col, id)">
|
||||||
|
@ -628,6 +678,7 @@
|
||||||
import { getFileAccessHttpUrl } from '@/api/manage';
|
import { getFileAccessHttpUrl } from '@/api/manage';
|
||||||
import JInputPop from '@/components/jeecg/minipop/JInputPop'
|
import JInputPop from '@/components/jeecg/minipop/JInputPop'
|
||||||
import JFilePop from '@/components/jeecg/minipop/JFilePop'
|
import JFilePop from '@/components/jeecg/minipop/JFilePop'
|
||||||
|
import { getNoAuthCols } from "@/utils/authFilter"
|
||||||
|
|
||||||
// 行高,需要在实例加载完成前用到
|
// 行高,需要在实例加载完成前用到
|
||||||
let rowHeight = 61
|
let rowHeight = 61
|
||||||
|
@ -704,6 +755,11 @@
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
},
|
},
|
||||||
|
authPre: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -749,6 +805,10 @@
|
||||||
uploadValues: {},
|
uploadValues: {},
|
||||||
//popup信息
|
//popup信息
|
||||||
popupValues: {},
|
popupValues: {},
|
||||||
|
//部门组件信息
|
||||||
|
departCompValues:{},
|
||||||
|
//用户组件信息
|
||||||
|
userCompValues: {},
|
||||||
|
|
||||||
radioValues: {},
|
radioValues: {},
|
||||||
metaCheckboxValues: {},
|
metaCheckboxValues: {},
|
||||||
|
@ -775,6 +835,8 @@
|
||||||
// 上次push数据的事件,用于判断是否点击过快
|
// 上次push数据的事件,用于判断是否点击过快
|
||||||
lastPushTimeMap: new Map(),
|
lastPushTimeMap: new Map(),
|
||||||
number:0,
|
number:0,
|
||||||
|
//不显示的按钮编码
|
||||||
|
excludeCode:[]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
@ -883,6 +945,8 @@
|
||||||
columns: {
|
columns: {
|
||||||
immediate: true,
|
immediate: true,
|
||||||
handler(columns) {
|
handler(columns) {
|
||||||
|
//列改变的时候重新设置按钮权限信息
|
||||||
|
this.loadExcludeCode()
|
||||||
// 兼容IE
|
// 兼容IE
|
||||||
this.getElementPromise('tbody').then(() => {
|
this.getElementPromise('tbody').then(() => {
|
||||||
columns.forEach(column => {
|
columns.forEach(column => {
|
||||||
|
@ -964,41 +1028,46 @@
|
||||||
this.visibleTrEls = []
|
this.visibleTrEls = []
|
||||||
// 判断是否是首次进入该方法,如果是就不清空行,防止删除了预添加的数据
|
// 判断是否是首次进入该方法,如果是就不清空行,防止删除了预添加的数据
|
||||||
if (!this.isFirst) {
|
if (!this.isFirst) {
|
||||||
// inputValues:用来存储input表单的值
|
this.clearRow();
|
||||||
// 数组里的每项都是一个对象,对象里每个key都是input的rowKey,值就是input的值,其中有个id的字段来区分
|
|
||||||
// 示例:
|
|
||||||
// [{
|
|
||||||
// id: "_jet-4sp0iu-15541771111770"
|
|
||||||
// dbDefaultVal: "aaa",
|
|
||||||
// dbFieldName: "bbb",
|
|
||||||
// dbFieldTxt: "ccc",
|
|
||||||
// dbLength: 32
|
|
||||||
// }]
|
|
||||||
this.inputValues = []
|
|
||||||
this.rows = []
|
|
||||||
this.deleteIds = []
|
|
||||||
this.selectValues = {}
|
|
||||||
this.checkboxValues = {}
|
|
||||||
this.jdateValues = {}
|
|
||||||
this.jInputPopValues = {}
|
|
||||||
this.slotValues = {}
|
|
||||||
this.selectedRowIds = []
|
|
||||||
this.tooltips = {}
|
|
||||||
this.notPassedIds = []
|
|
||||||
this.uploadValues = []
|
|
||||||
this.popupValues = []
|
|
||||||
this.radioValues = []
|
|
||||||
this.multiSelectValues = []
|
|
||||||
this.searchSelectValues = []
|
|
||||||
this.scrollTop = 0
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.getElement('tbody').scrollTop = 0
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
this.isFirst = false
|
this.isFirst = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
/**清空行*/
|
||||||
|
clearRow(){
|
||||||
|
// inputValues:用来存储input表单的值
|
||||||
|
// 数组里的每项都是一个对象,对象里每个key都是input的rowKey,值就是input的值,其中有个id的字段来区分
|
||||||
|
// 示例:
|
||||||
|
// [{
|
||||||
|
// id: "_jet-4sp0iu-15541771111770"
|
||||||
|
// dbDefaultVal: "aaa",
|
||||||
|
// dbFieldName: "bbb",
|
||||||
|
// dbFieldTxt: "ccc",
|
||||||
|
// dbLength: 32
|
||||||
|
// }]
|
||||||
|
this.inputValues = []
|
||||||
|
this.rows = []
|
||||||
|
this.deleteIds = []
|
||||||
|
this.selectValues = {}
|
||||||
|
this.checkboxValues = {}
|
||||||
|
this.jdateValues = {}
|
||||||
|
this.jInputPopValues = {}
|
||||||
|
this.departCompValues = {}
|
||||||
|
this.userCompValues = {}
|
||||||
|
this.slotValues = {}
|
||||||
|
this.selectedRowIds = []
|
||||||
|
this.tooltips = {}
|
||||||
|
this.notPassedIds = []
|
||||||
|
this.uploadValues = []
|
||||||
|
this.popupValues = []
|
||||||
|
this.radioValues = []
|
||||||
|
this.multiSelectValues = []
|
||||||
|
this.searchSelectValues = []
|
||||||
|
this.scrollTop = 0
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.getElement('tbody').scrollTop = 0
|
||||||
|
})
|
||||||
|
},
|
||||||
/** 同步滚动条状态 */
|
/** 同步滚动条状态 */
|
||||||
syncScrollBar(scrollLeft) {
|
syncScrollBar(scrollLeft) {
|
||||||
// this.style.tbody.left = `${scrollLeft}px`
|
// this.style.tbody.left = `${scrollLeft}px`
|
||||||
|
@ -1058,6 +1127,8 @@
|
||||||
let checkboxValues = { ...this.checkboxValues }
|
let checkboxValues = { ...this.checkboxValues }
|
||||||
let selectValues = { ...this.selectValues }
|
let selectValues = { ...this.selectValues }
|
||||||
let jdateValues = { ...this.jdateValues }
|
let jdateValues = { ...this.jdateValues }
|
||||||
|
let departCompValues = { ...this.departCompValues }
|
||||||
|
let userCompValues = { ...this.userCompValues }
|
||||||
let jInputPopValues = { ...this.jInputPopValues }
|
let jInputPopValues = { ...this.jInputPopValues }
|
||||||
let slotValues = { ...this.slotValues }
|
let slotValues = { ...this.slotValues }
|
||||||
let uploadValues = { ...this.uploadValues }
|
let uploadValues = { ...this.uploadValues }
|
||||||
|
@ -1144,6 +1215,10 @@
|
||||||
|
|
||||||
} else if (column.type === FormTypes.popup) {
|
} else if (column.type === FormTypes.popup) {
|
||||||
popupValues[inputId] = sourceValue
|
popupValues[inputId] = sourceValue
|
||||||
|
} else if (column.type === FormTypes.sel_depart) {
|
||||||
|
departCompValues[inputId] = sourceValue
|
||||||
|
} else if (column.type === FormTypes.sel_user) {
|
||||||
|
userCompValues[inputId] = sourceValue
|
||||||
} else if (column.type === FormTypes.input_pop) {
|
} else if (column.type === FormTypes.input_pop) {
|
||||||
jInputPopValues[inputId] = sourceValue
|
jInputPopValues[inputId] = sourceValue
|
||||||
} else if (column.type === FormTypes.radio) {
|
} else if (column.type === FormTypes.radio) {
|
||||||
|
@ -1225,6 +1300,8 @@
|
||||||
this.checkboxValues = checkboxValues
|
this.checkboxValues = checkboxValues
|
||||||
this.selectValues = selectValues
|
this.selectValues = selectValues
|
||||||
this.jdateValues = jdateValues
|
this.jdateValues = jdateValues
|
||||||
|
this.departCompValues = departCompValues
|
||||||
|
this.userCompValues = userCompValues
|
||||||
this.jInputPopValues = jInputPopValues
|
this.jInputPopValues = jInputPopValues
|
||||||
this.slotValues = slotValues
|
this.slotValues = slotValues
|
||||||
this.uploadValues = uploadValues
|
this.uploadValues = uploadValues
|
||||||
|
@ -1440,6 +1517,12 @@
|
||||||
} else if (column.type === FormTypes.date || column.type === FormTypes.datetime) {
|
} else if (column.type === FormTypes.date || column.type === FormTypes.datetime) {
|
||||||
value[column.key] = this.jdateValues[inputId]
|
value[column.key] = this.jdateValues[inputId]
|
||||||
|
|
||||||
|
} else if (column.type === FormTypes.sel_depart) {
|
||||||
|
value[column.key] = this.departCompValues[inputId]
|
||||||
|
|
||||||
|
} else if (column.type === FormTypes.sel_user) {
|
||||||
|
value[column.key] = this.userCompValues[inputId]
|
||||||
|
|
||||||
} else if (column.type === FormTypes.input_pop) {
|
} else if (column.type === FormTypes.input_pop) {
|
||||||
value[column.key] = this.jInputPopValues[inputId]
|
value[column.key] = this.jInputPopValues[inputId]
|
||||||
|
|
||||||
|
@ -1579,6 +1662,8 @@
|
||||||
selectValues: this.selectValues,
|
selectValues: this.selectValues,
|
||||||
checkboxValues: this.checkboxValues,
|
checkboxValues: this.checkboxValues,
|
||||||
jdateValues: this.jdateValues,
|
jdateValues: this.jdateValues,
|
||||||
|
departCompValues: this.departCompValues,
|
||||||
|
userCompValues: this.userCompValues,
|
||||||
jInputPopValues: this.jInputPopValues,
|
jInputPopValues: this.jInputPopValues,
|
||||||
slotValues: this.slotValues,
|
slotValues: this.slotValues,
|
||||||
uploadValues: this.uploadValues,
|
uploadValues: this.uploadValues,
|
||||||
|
@ -1633,6 +1718,10 @@
|
||||||
edited = true
|
edited = true
|
||||||
} else if (column.type === FormTypes.date || column.type === FormTypes.datetime) {
|
} else if (column.type === FormTypes.date || column.type === FormTypes.datetime) {
|
||||||
edited = this.setOneValue(this.jdateValues, modelKey, newValue)
|
edited = this.setOneValue(this.jdateValues, modelKey, newValue)
|
||||||
|
} else if (column.type === FormTypes.sel_depart) {
|
||||||
|
edited = this.setOneValue(this.departCompValues, modelKey, newValue)
|
||||||
|
} else if (column.type === FormTypes.sel_user) {
|
||||||
|
edited = this.setOneValue(this.userCompValues, modelKey, newValue)
|
||||||
} else if (column.type === FormTypes.input_pop) {
|
} else if (column.type === FormTypes.input_pop) {
|
||||||
edited = this.setOneValue(this.jInputPopValues, modelKey, newValue)
|
edited = this.setOneValue(this.jInputPopValues, modelKey, newValue)
|
||||||
} else if (column.type === FormTypes.slot) {
|
} else if (column.type === FormTypes.slot) {
|
||||||
|
@ -1809,7 +1898,7 @@
|
||||||
|
|
||||||
// 兼容 online 的规则
|
// 兼容 online 的规则
|
||||||
let foo = [
|
let foo = [
|
||||||
{ title: '6到16位数字', value: 'n6-16', pattern: /^\d{6,18}$/ },
|
{ title: '6到16位数字', value: 'n6-16', pattern: /^\d{6,16}$/ },
|
||||||
{ title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/ },
|
{ title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/ },
|
||||||
{ title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/ },
|
{ title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/ },
|
||||||
{ title: '网址', value: 'url', pattern: /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/ },
|
{ title: '网址', value: 'url', pattern: /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/ },
|
||||||
|
@ -2183,6 +2272,20 @@
|
||||||
this.elemValueChange(FormTypes.date, row, column, value)
|
this.elemValueChange(FormTypes.date, row, column, value)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
//部门组件值改变
|
||||||
|
handleChangeDepartCommon(value, id, row, column){
|
||||||
|
this.departCompValues = this.bindValuesChange(value, id, 'departCompValues')
|
||||||
|
this.validateOneInput(value, row, column, this.notPassedIds, true, 'change')
|
||||||
|
// 触发valueChange 事件
|
||||||
|
this.elemValueChange(FormTypes.sel_depart, row, column, value)
|
||||||
|
},
|
||||||
|
//用户组件值改变
|
||||||
|
handleChangeUserCommon(value, id, row, column){
|
||||||
|
this.userCompValues = this.bindValuesChange(value, id, 'userCompValues')
|
||||||
|
this.validateOneInput(value, row, column, this.notPassedIds, true, 'change')
|
||||||
|
// 触发valueChange 事件
|
||||||
|
this.elemValueChange(FormTypes.sel_user, row, column, value)
|
||||||
|
},
|
||||||
handleChangeJInputPopCommon(value, id, row, column){
|
handleChangeJInputPopCommon(value, id, row, column){
|
||||||
this.jInputPopValues = this.bindValuesChange(value, id, 'jInputPopValues')
|
this.jInputPopValues = this.bindValuesChange(value, id, 'jInputPopValues')
|
||||||
// 做单个表单验证
|
// 做单个表单验证
|
||||||
|
@ -2462,7 +2565,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/** view辅助方法:构建 td style */
|
/** view辅助方法:构建 td style */
|
||||||
buildTdStyle(col,isTitle) {
|
buildTdStyle(col) {
|
||||||
const isEmptyWidth = (column) => (column.type === FormTypes.hidden || column.width === '0px' || column.width === '0' || column.width === 0)
|
const isEmptyWidth = (column) => (column.type === FormTypes.hidden || column.width === '0px' || column.width === '0' || column.width === 0)
|
||||||
|
|
||||||
let style = {}
|
let style = {}
|
||||||
|
@ -2475,13 +2578,15 @@
|
||||||
style['width'] = '120px'
|
style['width'] = '120px'
|
||||||
}
|
}
|
||||||
//update-begin-author:lvdandan date:20201116 for:LOWCOD-984 默认风格功能测试附表样式问题 日期时间控件长度太大
|
//update-begin-author:lvdandan date:20201116 for:LOWCOD-984 默认风格功能测试附表样式问题 日期时间控件长度太大
|
||||||
//是否为标题,如果是时间控件设为200,时间控件的标题设为240 时间
|
//如果是时间控件设为200px
|
||||||
if(col.type === FormTypes.datetime){
|
if(col.type === FormTypes.datetime){
|
||||||
if(true === isTitle){
|
style['width'] = '200px'
|
||||||
style['width'] = '240px'
|
}
|
||||||
}else{
|
if(col.type === FormTypes.sel_user && !col.width){
|
||||||
style['width'] = '200px'
|
style['width'] = '220px'
|
||||||
}
|
}
|
||||||
|
if(col.type === FormTypes.sel_depart && !col.width){
|
||||||
|
style['width'] = '160px'
|
||||||
}
|
}
|
||||||
//update-end-author:lvdandan date:20201116 for:LOWCOD-984 默认风格功能测试附表样式问题 日期时间控件长度太大
|
//update-end-author:lvdandan date:20201116 for:LOWCOD-984 默认风格功能测试附表样式问题 日期时间控件长度太大
|
||||||
|
|
||||||
|
@ -2718,15 +2823,35 @@
|
||||||
removeEventListener() {
|
removeEventListener() {
|
||||||
window.removeEventListener('mouseup', this.handleMouseup)
|
window.removeEventListener('mouseup', this.handleMouseup)
|
||||||
},
|
},
|
||||||
|
|
||||||
/* --------------------------- 2020年5月18日 默认span模式 ------------------------------ */
|
/* --------------------------- 2020年5月18日 默认span模式 ------------------------------ */
|
||||||
|
|
||||||
|
//获取没有授权的按钮编码
|
||||||
|
loadExcludeCode(){
|
||||||
|
if(!this.authPre || this.authPre.length==0){
|
||||||
|
this.excludeCode = []
|
||||||
|
}else{
|
||||||
|
let pre = this.authPre
|
||||||
|
if(!pre.endsWith(':')){
|
||||||
|
pre += ':'
|
||||||
|
}
|
||||||
|
this.excludeCode = getNoAuthCols(pre)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//判断button是否显示
|
||||||
|
buttonPermission(code){
|
||||||
|
if(!this.excludeCode || this.excludeCode.length==0){
|
||||||
|
return true
|
||||||
|
}else{
|
||||||
|
return this.excludeCode.indexOf(code)<0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
this.removeEventListener()
|
this.removeEventListener()
|
||||||
this.destroyCleanGroupRequest = true
|
this.destroyCleanGroupRequest = true
|
||||||
},
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,11 @@
|
||||||
required: false,
|
required: false,
|
||||||
default: ()=>{}
|
default: ()=>{}
|
||||||
},
|
},
|
||||||
|
spliter:{
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: ','
|
||||||
|
},
|
||||||
/** 分组ID,用于将多个popup的请求合并到一起,不传不分组 */
|
/** 分组ID,用于将多个popup的请求合并到一起,不传不分组 */
|
||||||
groupId: String
|
groupId: String
|
||||||
|
|
||||||
|
@ -108,7 +113,7 @@
|
||||||
if (!val) {
|
if (!val) {
|
||||||
this.showText = ''
|
this.showText = ''
|
||||||
} else {
|
} else {
|
||||||
this.showText = val
|
this.showText = val.split(this.spliter).join(',')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,7 +193,11 @@
|
||||||
} else {
|
} else {
|
||||||
//v-model时 需要传一个参数field 表示当前这个字段 从而根据这个字段的顺序找到原始值
|
//v-model时 需要传一个参数field 表示当前这个字段 从而根据这个字段的顺序找到原始值
|
||||||
// this.$emit("input",row[orgFieldsArr[destFieldsArr.indexOf(this.field)]])
|
// this.$emit("input",row[orgFieldsArr[destFieldsArr.indexOf(this.field)]])
|
||||||
this.$emit('input', this.showText, res)
|
let str = ''
|
||||||
|
if(this.showText){
|
||||||
|
str = this.showText.split(',').join(this.spliter)
|
||||||
|
}
|
||||||
|
this.$emit('input', str, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
<a-select-option
|
<a-select-option
|
||||||
v-for="(item,index) in options"
|
v-for="(item,index) in options"
|
||||||
:key="index"
|
:key="index"
|
||||||
|
:getPopupContainer="getParentContainer"
|
||||||
:value="item.value">
|
:value="item.value">
|
||||||
{{ item.text || item.label }}
|
{{ item.text || item.label }}
|
||||||
</a-select-option>
|
</a-select-option>
|
||||||
|
@ -36,11 +37,21 @@
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
}
|
},
|
||||||
|
spliter:{
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: ','
|
||||||
|
},
|
||||||
|
popContainer:{
|
||||||
|
type:String,
|
||||||
|
default:'',
|
||||||
|
required:false
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
return {
|
return {
|
||||||
arrayValue:!this.value?[]:this.value.split(",")
|
arrayValue:!this.value?[]:this.value.split(this.spliter)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch:{
|
watch:{
|
||||||
|
@ -48,18 +59,25 @@
|
||||||
if(!val){
|
if(!val){
|
||||||
this.arrayValue = []
|
this.arrayValue = []
|
||||||
}else{
|
}else{
|
||||||
this.arrayValue = this.value.split(",")
|
this.arrayValue = this.value.split(this.spliter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
onChange (selectedValue) {
|
onChange (selectedValue) {
|
||||||
if(this.triggerChange){
|
if(this.triggerChange){
|
||||||
this.$emit('change', selectedValue.join(","));
|
this.$emit('change', selectedValue.join(this.spliter));
|
||||||
}else{
|
}else{
|
||||||
this.$emit('input', selectedValue.join(","));
|
this.$emit('input', selectedValue.join(this.spliter));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getParentContainer(node){
|
||||||
|
if(!this.popContainer){
|
||||||
|
return node.parentNode
|
||||||
|
}else{
|
||||||
|
return document.querySelector(this.popContainer)
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,15 @@
|
||||||
</a-col>
|
</a-col>
|
||||||
|
|
||||||
<a-col :md="8" :xs="24" style="margin-bottom: 12px;">
|
<a-col :md="8" :xs="24" style="margin-bottom: 12px;">
|
||||||
<template v-if="item.dictCode">
|
<!-- 下拉搜索 -->
|
||||||
|
<j-search-select-tag v-if="item.type==='sel_search'" v-model="item.val" :dict="getDictInfo(item)" placeholder="请选择"/>
|
||||||
|
<!-- 下拉多选 -->
|
||||||
|
<template v-else-if="item.type==='list_multi'">
|
||||||
|
<j-multi-select-tag v-if="item.options" v-model="item.val" :options="item.options" placeholder="请选择"/>
|
||||||
|
<j-multi-select-tag v-else v-model="item.val" :dictCode="getDictInfo(item)" placeholder="请选择"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template v-else-if="item.dictCode">
|
||||||
<template v-if="item.type === 'table-dict'">
|
<template v-if="item.type === 'table-dict'">
|
||||||
<j-popup
|
<j-popup
|
||||||
v-model="item.val"
|
v-model="item.val"
|
||||||
|
@ -109,6 +117,7 @@
|
||||||
:field="item.dictCode"
|
:field="item.dictCode"
|
||||||
:orgFields="item.dictCode"
|
:orgFields="item.dictCode"
|
||||||
:destFields="item.dictCode"
|
:destFields="item.dictCode"
|
||||||
|
:multi="true"
|
||||||
></j-popup>
|
></j-popup>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
|
@ -116,7 +125,13 @@
|
||||||
<j-dict-select-tag v-show="!allowMultiple(item)" v-model="item.val" :dictCode="item.dictCode" placeholder="请选择"/>
|
<j-dict-select-tag v-show="!allowMultiple(item)" v-model="item.val" :dictCode="item.dictCode" placeholder="请选择"/>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<j-popup v-else-if="item.type === 'popup'" :value="item.val" v-bind="item.popup" group-id="superQuery" @input="(e,v)=>handleChangeJPopup(item,e,v)"/>
|
<j-popup
|
||||||
|
v-else-if="item.type === 'popup'"
|
||||||
|
:value="item.val"
|
||||||
|
v-bind="item.popup"
|
||||||
|
group-id="superQuery"
|
||||||
|
@input="(e,v)=>handleChangeJPopup(item,e,v)"
|
||||||
|
:multi="true"/>
|
||||||
<j-select-multi-user
|
<j-select-multi-user
|
||||||
v-else-if="item.type === 'select-user' || item.type === 'sel_user'"
|
v-else-if="item.type === 'select-user' || item.type === 'sel_user'"
|
||||||
v-model="item.val"
|
v-model="item.val"
|
||||||
|
@ -338,6 +353,17 @@
|
||||||
}
|
}
|
||||||
this.visible = true
|
this.visible = true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getDictInfo(item) {
|
||||||
|
let str = ''
|
||||||
|
if(!item.dictTable){
|
||||||
|
str = item.dictCode
|
||||||
|
}else{
|
||||||
|
str = item.dictTable+','+item.dictText+','+item.dictCode
|
||||||
|
}
|
||||||
|
console.log('高级查询字典信息',str)
|
||||||
|
return str
|
||||||
|
},
|
||||||
handleOk() {
|
handleOk() {
|
||||||
if (!this.isNullArray(this.queryParamsModel)) {
|
if (!this.isNullArray(this.queryParamsModel)) {
|
||||||
let event = {
|
let event = {
|
||||||
|
@ -386,11 +412,12 @@
|
||||||
this.queryParamsModel.splice(index, 1)
|
this.queryParamsModel.splice(index, 1)
|
||||||
},
|
},
|
||||||
handleSelected(node, item) {
|
handleSelected(node, item) {
|
||||||
let { type, options, dictCode, dictTable, customReturnField, popup } = node.dataRef
|
let { type, options, dictCode, dictTable, dictText, customReturnField, popup } = node.dataRef
|
||||||
item['type'] = type
|
item['type'] = type
|
||||||
item['options'] = options
|
item['options'] = options
|
||||||
item['dictCode'] = dictCode
|
item['dictCode'] = dictCode
|
||||||
item['dictTable'] = dictTable
|
item['dictTable'] = dictTable
|
||||||
|
item['dictText'] = dictText
|
||||||
item['customReturnField'] = customReturnField
|
item['customReturnField'] = customReturnField
|
||||||
if (popup) {
|
if (popup) {
|
||||||
item['popup'] = popup
|
item['popup'] = popup
|
||||||
|
|
|
@ -374,14 +374,17 @@
|
||||||
},
|
},
|
||||||
mounted(){
|
mounted(){
|
||||||
const moverObj = document.getElementById(this.containerId+'-mover');
|
const moverObj = document.getElementById(this.containerId+'-mover');
|
||||||
moverObj.addEventListener('mouseover',()=>{
|
if(moverObj){
|
||||||
this.moverHold = true
|
moverObj.addEventListener('mouseover',()=>{
|
||||||
this.moveDisplay = 'block';
|
this.moverHold = true
|
||||||
});
|
this.moveDisplay = 'block';
|
||||||
moverObj.addEventListener('mouseout',()=>{
|
});
|
||||||
this.moverHold = false
|
moverObj.addEventListener('mouseout',()=>{
|
||||||
this.moveDisplay = 'none';
|
this.moverHold = false
|
||||||
});
|
this.moveDisplay = 'none';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let picList = document.getElementById(this.containerId)?document.getElementById(this.containerId).getElementsByClassName('ant-upload-list-picture-card'):[];
|
let picList = document.getElementById(this.containerId)?document.getElementById(this.containerId).getElementsByClassName('ant-upload-list-picture-card'):[];
|
||||||
if(picList && picList.length>0){
|
if(picList && picList.length>0){
|
||||||
picList[0].addEventListener('mouseover',(ev)=>{
|
picList[0].addEventListener('mouseover',(ev)=>{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<a-popover :visible="visible" placement="bottom" overlayClassName="j-vxe-popover-overlay" :overlayStyle="overlayStyle">
|
<a-popover :visible="visible" :placement="placement" overlayClassName="j-vxe-popover-overlay" :overlayStyle="overlayStyle">
|
||||||
<div class="j-vxe-popover-title" slot="title">
|
<div class="j-vxe-popover-title" slot="title">
|
||||||
<div>子表</div>
|
<div>子表</div>
|
||||||
<div class="j-vxe-popover-title-close" @click="close">
|
<div class="j-vxe-popover-title-close" @click="close">
|
||||||
|
@ -34,6 +34,7 @@
|
||||||
width: null,
|
width: null,
|
||||||
zIndex: 100
|
zIndex: 100
|
||||||
},
|
},
|
||||||
|
placement: 'bottom'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
@ -41,6 +42,14 @@
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
toggle(event) {
|
toggle(event) {
|
||||||
|
|
||||||
|
//update-begin-author:taoyan date:20200921 for: 弹出子表时,子表会闪一下,类似重新计算子表的位置
|
||||||
|
if(document.body.clientHeight - event.$event.clientY > 350){
|
||||||
|
this.placement = 'bottom'
|
||||||
|
}else{
|
||||||
|
this.placement = 'top'
|
||||||
|
}
|
||||||
|
//update-end-author:taoyan date:20200921 for: 弹出子表时,子表会闪一下,类似重新计算子表的位置
|
||||||
if (this.row == null) {
|
if (this.row == null) {
|
||||||
this.open(event)
|
this.open(event)
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,13 +92,22 @@
|
||||||
this.$refs.div.style.height = clientHeight + 'px'
|
this.$refs.div.style.height = clientHeight + 'px'
|
||||||
this.overlayStyle.width = Number.parseInt((clientWidth - clientWidth * 0.04)) + 'px'
|
this.overlayStyle.width = Number.parseInt((clientWidth - clientWidth * 0.04)) + 'px'
|
||||||
this.overlayStyle.maxWidth = this.overlayStyle.width
|
this.overlayStyle.maxWidth = this.overlayStyle.width
|
||||||
domAlign(this.$refs.div, tr, {
|
//update-begin-author:taoyan date:20200921 for: 子表弹出位置存在现实位置问题。
|
||||||
|
//let realTable = getParentNodeByTagName(tr, 'table')
|
||||||
|
//let left = realTable.parentNode.scrollLeft
|
||||||
|
let h = event.$event.clientY
|
||||||
|
if(h){
|
||||||
|
h = h-140
|
||||||
|
}
|
||||||
|
let toolbar = this.$refs.div.nextSibling
|
||||||
|
domAlign(this.$refs.div, toolbar, {
|
||||||
points: ['tl', 'tl'],
|
points: ['tl', 'tl'],
|
||||||
offset: [0, 0],
|
offset: [0, h],
|
||||||
overflow: {
|
overflow: {
|
||||||
alwaysByViewport: true
|
alwaysByViewport: true
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
//update-end-author:taoyan date:20200921 for: 子表弹出位置存在现实位置问题。
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.visible = true
|
this.visible = true
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import XEUtils from 'xe-utils'
|
import XEUtils from 'xe-utils'
|
||||||
import PropTypes from 'ant-design-vue/es/_util/vue-types'
|
import PropTypes from 'ant-design-vue/es/_util/vue-types'
|
||||||
import { JVXETypes } from '@/components/jeecg/JVxeTable/index'
|
import { JVXETypes } from '@/components/jeecg/JVxeTable/jvxeTypes'
|
||||||
import VxeWebSocketMixins from '../mixins/vxe.web.socket.mixins'
|
import VxeWebSocketMixins from '../mixins/vxe.web.socket.mixins'
|
||||||
import { initDictOptions } from '@/components/dict/JDictSelectUtil'
|
import { initDictOptions } from '@/components/dict/JDictSelectUtil'
|
||||||
|
|
||||||
|
@ -188,6 +188,21 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update--begin--autor:lvdandan-----date:20201019------for:LOWCOD-882 【新行编辑】列表上带按钮的遮挡问题
|
// update--begin--autor:lvdandan-----date:20201019------for:LOWCOD-882 【新行编辑】列表上带按钮的遮挡问题
|
||||||
|
|
||||||
|
// update--begin--autor:lvdandan-----date:20201211------for:JT-118 【online】 日期、时间控件长度较小
|
||||||
|
if (column.$type === JVXETypes.datetime || column.$type === JVXETypes.userSelect || column.$type === JVXETypes.departSelect) {
|
||||||
|
let width = column.width && column.width.endsWith('px')?Number.parseInt(column.width.substr(0,column.width.length-2)):0;
|
||||||
|
if(width <= 190){
|
||||||
|
column.width = '190px'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (column.$type === JVXETypes.date) {
|
||||||
|
let width = column.width && column.width.endsWith('px')?Number.parseInt(column.width.substr(0,column.width.length-2)):0;
|
||||||
|
if(width <= 135){
|
||||||
|
column.width = '135px'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// update--end--autor:lvdandan-----date:20201211------for:JT-118 【online】 日期、时间控件长度较小
|
||||||
})
|
})
|
||||||
return this._innerColumns
|
return this._innerColumns
|
||||||
},
|
},
|
||||||
|
@ -709,6 +724,11 @@ export default {
|
||||||
deleteData: this.getDeleteData()
|
deleteData: this.getDeleteData()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
/** 获取表格表单里的值 */
|
||||||
|
getValues(callback, rowIds) {
|
||||||
|
let tableData = this.getTableData({rowIds: rowIds})
|
||||||
|
callback('', tableData)
|
||||||
|
},
|
||||||
/** 获取表格数据 */
|
/** 获取表格数据 */
|
||||||
getTableData(options = {}) {
|
getTableData(options = {}) {
|
||||||
let {rowIds} = options
|
let {rowIds} = options
|
||||||
|
@ -887,7 +907,11 @@ export default {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
//options自定义赋值 刷新
|
||||||
|
virtualRefresh(){
|
||||||
|
this.scrolling = true
|
||||||
|
this.closeScrolling()
|
||||||
|
},
|
||||||
// 设置 this.scrolling 防抖模式
|
// 设置 this.scrolling 防抖模式
|
||||||
closeScrolling: simpleDebounce(function () {
|
closeScrolling: simpleDebounce(function () {
|
||||||
this.scrolling = false
|
this.scrolling = false
|
||||||
|
@ -1203,7 +1227,7 @@ export default {
|
||||||
// 兼容 online 的规则
|
// 兼容 online 的规则
|
||||||
const fooPatterns = [
|
const fooPatterns = [
|
||||||
{title: '非空', value: '*', pattern: /^.+$/},
|
{title: '非空', value: '*', pattern: /^.+$/},
|
||||||
{title: '6到16位数字', value: 'n6-16', pattern: /^\d{6,18}$/},
|
{title: '6到16位数字', value: 'n6-16', pattern: /^\d{6,16}$/},
|
||||||
{title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/},
|
{title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/},
|
||||||
{title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/},
|
{title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/},
|
||||||
{title: '网址', value: 'url', pattern: /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/},
|
{title: '网址', value: 'url', pattern: /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/},
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
// TODO 需要将remove替换batch_delete
|
// TODO 需要将remove替换batch_delete
|
||||||
// 系统默认的批量删除编码配置为 batch_delete 此处需要转化一下
|
// 系统默认的批量删除编码配置为 batch_delete 此处需要转化一下
|
||||||
if(exclude.indexOf('batch_delete')>=0){
|
if(exclude.indexOf('batch_delete')>=0){
|
||||||
exclude.add('remove')
|
exclude.push('remove')
|
||||||
}
|
}
|
||||||
// 按钮权限 需要去掉不被授权的按钮
|
// 按钮权限 需要去掉不被授权的按钮
|
||||||
return arr.filter(item=>{
|
return arr.filter(item=>{
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<a-input
|
||||||
|
v-show="!departIds"
|
||||||
|
@click="openSelect"
|
||||||
|
placeholder="请点击选择部门"
|
||||||
|
v-model="departNames"
|
||||||
|
readOnly
|
||||||
|
:disabled="componentDisabled"
|
||||||
|
class="jvxe-select-input">
|
||||||
|
<a-icon slot="prefix" type="cluster" title="部门选择控件"/>
|
||||||
|
</a-input>
|
||||||
|
<j-select-depart-modal
|
||||||
|
ref="innerDepartSelectModal"
|
||||||
|
:modal-width="modalWidth"
|
||||||
|
:multi="multi"
|
||||||
|
:rootOpened="rootOpened"
|
||||||
|
:depart-id="departIds"
|
||||||
|
@ok="handleOK"
|
||||||
|
@initComp="initComp"/>
|
||||||
|
<span style="display: inline-block;height:100%;padding-left:14px" v-if="departIds" >
|
||||||
|
<span @click="openSelect" style="display: inline-block;vertical-align: middle">{{ departNames }}</span>
|
||||||
|
<a-icon style="margin-left:5px;vertical-align: middle" type="close-circle" @click="handleEmpty" title="清空"/>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import JVxeCellMixins, { dispatchEvent } from '@/components/jeecg/JVxeTable/mixins/JVxeCellMixins'
|
||||||
|
import JSelectDepartModal from '@/components/jeecgbiz/modal/JSelectDepartModal'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JVxeDepartSelectCell',
|
||||||
|
mixins: [JVxeCellMixins],
|
||||||
|
components:{
|
||||||
|
JSelectDepartModal
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
departNames: '',
|
||||||
|
departIds: '',
|
||||||
|
selectedOptions: [],
|
||||||
|
customReturnField: 'id'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
custProps() {
|
||||||
|
const {departIds, originColumn: col, caseId, cellProps} = this
|
||||||
|
return {
|
||||||
|
...cellProps,
|
||||||
|
value: departIds,
|
||||||
|
field: col.field || col.key,
|
||||||
|
groupId: caseId,
|
||||||
|
class: 'jvxe-select'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
componentDisabled(){
|
||||||
|
if(this.cellProps.disabled==true){
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
modalWidth(){
|
||||||
|
if(this.cellProps.modalWidth){
|
||||||
|
return this.cellProps.modalWidth
|
||||||
|
}else{
|
||||||
|
return 500
|
||||||
|
}
|
||||||
|
},
|
||||||
|
multi(){
|
||||||
|
if(this.cellProps.multi==false){
|
||||||
|
return false
|
||||||
|
}else{
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rootOpened(){
|
||||||
|
if(this.cellProps.open==false){
|
||||||
|
return false
|
||||||
|
}else{
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
innerValue: {
|
||||||
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
if (val == null || val === '') {
|
||||||
|
this.departIds = ''
|
||||||
|
} else {
|
||||||
|
this.departIds = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
openSelect(){
|
||||||
|
this.$refs.innerDepartSelectModal.show()
|
||||||
|
},
|
||||||
|
handleEmpty(){
|
||||||
|
this.handleOK('')
|
||||||
|
},
|
||||||
|
handleOK(rows, idstr) {
|
||||||
|
let value = ''
|
||||||
|
if (!rows && rows.length <= 0) {
|
||||||
|
this.departNames = ''
|
||||||
|
this.departIds = ''
|
||||||
|
} else {
|
||||||
|
value = rows.map(row => row[this.customReturnField]).join(',')
|
||||||
|
this.departNames = rows.map(row => row['departName']).join(',')
|
||||||
|
this.departIds = idstr
|
||||||
|
}
|
||||||
|
this.handleChangeCommon(this.departIds)
|
||||||
|
},
|
||||||
|
initComp(departNames){
|
||||||
|
this.departNames = departNames
|
||||||
|
},
|
||||||
|
handleChange(value) {
|
||||||
|
this.handleChangeCommon(value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
enhanced: {
|
||||||
|
switches: {
|
||||||
|
visible: true
|
||||||
|
},
|
||||||
|
translate: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/deep/ .jvxe-select-input .ant-input{
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,136 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<a-input
|
||||||
|
v-show="!userIds"
|
||||||
|
@click="openSelect"
|
||||||
|
placeholder="请选择用户"
|
||||||
|
v-model="userNames"
|
||||||
|
readOnly
|
||||||
|
class="jvxe-select-input"
|
||||||
|
:disabled="componentDisabled">
|
||||||
|
<a-icon slot="prefix" type="user" title="用户选择控件"/>
|
||||||
|
</a-input>
|
||||||
|
<j-select-user-by-dep-modal
|
||||||
|
ref="selectModal"
|
||||||
|
:modal-width="modalWidth"
|
||||||
|
:multi="multi"
|
||||||
|
:user-ids="userIds"
|
||||||
|
@ok="selectOK"
|
||||||
|
@initComp="initComp"/>
|
||||||
|
<span style="display: inline-block;height:100%;padding-left:14px" v-if="userIds" >
|
||||||
|
<span @click="openSelect" style="display: inline-block;vertical-align: middle">{{ userNames }}</span>
|
||||||
|
<a-icon style="margin-left:5px;vertical-align: middle" type="close-circle" @click="handleEmpty" title="清空"/>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <j-select-user-by-dep
|
||||||
|
v-bind="custProps"
|
||||||
|
@change="handleChange"
|
||||||
|
:trigger-change="true">
|
||||||
|
</j-select-user-by-dep>-->
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import JVxeCellMixins, { dispatchEvent } from '@/components/jeecg/JVxeTable/mixins/JVxeCellMixins'
|
||||||
|
import JSelectUserByDepModal from '@/components/jeecgbiz/modal/JSelectUserByDepModal'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'JVxeUserSelectCell',
|
||||||
|
mixins: [JVxeCellMixins],
|
||||||
|
components: { JSelectUserByDepModal },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
userIds:'',
|
||||||
|
userNames:'',
|
||||||
|
innerUserValue: '',
|
||||||
|
selectedOptions: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
custProps() {
|
||||||
|
const {userIds, originColumn: col, caseId, cellProps} = this
|
||||||
|
return {
|
||||||
|
...cellProps,
|
||||||
|
value: userIds,
|
||||||
|
field: col.field || col.key,
|
||||||
|
groupId: caseId,
|
||||||
|
class: 'jvxe-select'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
componentDisabled(){
|
||||||
|
console.log('333',this.cellProps)
|
||||||
|
if(this.cellProps.disabled==true){
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
modalWidth(){
|
||||||
|
if(this.cellProps.modalWidth){
|
||||||
|
return this.cellProps.modalWidth
|
||||||
|
}else{
|
||||||
|
return 1250
|
||||||
|
}
|
||||||
|
},
|
||||||
|
multi(){
|
||||||
|
if(this.cellProps.multi==false){
|
||||||
|
return false
|
||||||
|
}else{
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
innerValue: {
|
||||||
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
if (val == null || val === '') {
|
||||||
|
this.userIds = ''
|
||||||
|
} else {
|
||||||
|
this.userIds = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
openSelect() {
|
||||||
|
this.$refs.selectModal.showModal()
|
||||||
|
},
|
||||||
|
selectOK(rows, idstr) {
|
||||||
|
console.log("当前选中用户", rows)
|
||||||
|
console.log("当前选中用户ID", idstr)
|
||||||
|
if (!rows) {
|
||||||
|
this.userNames = ''
|
||||||
|
this.userIds = ''
|
||||||
|
} else {
|
||||||
|
let temp = ''
|
||||||
|
for (let item of rows) {
|
||||||
|
temp += ',' + item.realname
|
||||||
|
}
|
||||||
|
this.userNames = temp.substring(1)
|
||||||
|
this.userIds = idstr
|
||||||
|
}
|
||||||
|
this.handleChangeCommon(this.userIds)
|
||||||
|
},
|
||||||
|
handleEmpty(){
|
||||||
|
this.selectOK('')
|
||||||
|
},
|
||||||
|
initComp(userNames) {
|
||||||
|
this.userNames = userNames
|
||||||
|
},
|
||||||
|
},
|
||||||
|
enhanced: {
|
||||||
|
switches: {
|
||||||
|
visible: true
|
||||||
|
},
|
||||||
|
translate: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/deep/ .jvxe-select-input .ant-input {
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,3 +1,4 @@
|
||||||
|
import * as jvxeTypes from './jvxeTypes'
|
||||||
import { installCell, mapCell } from './install'
|
import { installCell, mapCell } from './install'
|
||||||
import JVxeTable from './components/JVxeTable'
|
import JVxeTable from './components/JVxeTable'
|
||||||
|
|
||||||
|
@ -12,46 +13,13 @@ import { TagsInputCell, TagsSpanCell } from './components/cells/JVxeTagsCell'
|
||||||
import JVxeProgressCell from './components/cells/JVxeProgressCell'
|
import JVxeProgressCell from './components/cells/JVxeProgressCell'
|
||||||
import JVxeTextareaCell from './components/cells/JVxeTextareaCell'
|
import JVxeTextareaCell from './components/cells/JVxeTextareaCell'
|
||||||
import JVxeDragSortCell from './components/cells/JVxeDragSortCell'
|
import JVxeDragSortCell from './components/cells/JVxeDragSortCell'
|
||||||
|
import JVxeDepartSelectCell from './components/cells/JVxeDepartSelectCell'
|
||||||
|
import JVxeUserSelectCell from './components/cells/JVxeUserSelectCell'
|
||||||
|
|
||||||
|
//update--begin--autor:lvdandan-----date:20201216------for:JVxeTable--JVXETypes 【online】代码结构调整,便于online打包
|
||||||
// 组件类型
|
// 组件类型
|
||||||
export const JVXETypes = {
|
export const JVXETypes = jvxeTypes.JVXETypes
|
||||||
// 为了防止和 vxe 内置的类型冲突,所以加上一个前缀
|
//update--end--autor:lvdandan-----date:20201216------for:JVxeTable--JVXETypes 【online】代码结构调整,便于online打包
|
||||||
// 前缀是自动加的,代码中直接用就行(JVXETypes.input)
|
|
||||||
_prefix: 'j-',
|
|
||||||
|
|
||||||
// 行号列
|
|
||||||
rowNumber: 'row-number',
|
|
||||||
// 选择列
|
|
||||||
rowCheckbox: 'row-checkbox',
|
|
||||||
// 单选列
|
|
||||||
rowRadio: 'row-radio',
|
|
||||||
// 展开列
|
|
||||||
rowExpand: 'row-expand',
|
|
||||||
// 上下排序
|
|
||||||
rowDragSort: 'row-drag-sort',
|
|
||||||
|
|
||||||
input: 'input',
|
|
||||||
inputNumber: 'inputNumber',
|
|
||||||
textarea: 'textarea',
|
|
||||||
select: 'select',
|
|
||||||
date: 'date',
|
|
||||||
datetime: 'datetime',
|
|
||||||
checkbox: 'checkbox',
|
|
||||||
upload: 'upload',
|
|
||||||
// 下拉搜索
|
|
||||||
selectSearch: 'select-search',
|
|
||||||
// 下拉多选
|
|
||||||
selectMultiple: 'select-multiple',
|
|
||||||
// 进度条
|
|
||||||
progress: 'progress',
|
|
||||||
|
|
||||||
// 拖轮Tags(暂无用)
|
|
||||||
tags: 'tags',
|
|
||||||
|
|
||||||
slot: 'slot',
|
|
||||||
normal: 'normal',
|
|
||||||
hidden: 'hidden',
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注册自定义组件
|
// 注册自定义组件
|
||||||
export const AllCells = {
|
export const AllCells = {
|
||||||
|
@ -72,6 +40,8 @@ export const AllCells = {
|
||||||
|
|
||||||
...mapCell(JVXETypes.rowDragSort, JVxeDragSortCell),
|
...mapCell(JVXETypes.rowDragSort, JVxeDragSortCell),
|
||||||
...mapCell(JVXETypes.slot, JVxeSlotCell),
|
...mapCell(JVXETypes.slot, JVxeSlotCell),
|
||||||
|
...mapCell(JVXETypes.departSelect, JVxeDepartSelectCell),
|
||||||
|
...mapCell(JVXETypes.userSelect, JVxeUserSelectCell)
|
||||||
|
|
||||||
/* hidden 是特殊的组件,不在这里注册 */
|
/* hidden 是特殊的组件,不在这里注册 */
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,8 +62,8 @@ VXETable.interceptor.add('event.clearActived', function (params, event, target)
|
||||||
if (className.includes('j-input-pop')) {
|
if (className.includes('j-input-pop')) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// 点击的标签是JPopup的弹出层
|
// 点击的标签是JPopup的弹出层、部门选择、用户选择
|
||||||
if (className.includes('j-popup-modal')) {
|
if (className.includes('j-popup-modal') || className.includes('j-depart-select-modal') || className.includes('j-user-select-modal')) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// 执行增强
|
// 执行增强
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
// 组件类型
|
||||||
|
export default JVXETypes
|
||||||
|
export const JVXETypes = {
|
||||||
|
// 为了防止和 vxe 内置的类型冲突,所以加上一个前缀
|
||||||
|
// 前缀是自动加的,代码中直接用就行(JVXETypes.input)
|
||||||
|
_prefix: 'j-',
|
||||||
|
|
||||||
|
// 行号列
|
||||||
|
rowNumber: 'row-number',
|
||||||
|
// 选择列
|
||||||
|
rowCheckbox: 'row-checkbox',
|
||||||
|
// 单选列
|
||||||
|
rowRadio: 'row-radio',
|
||||||
|
// 展开列
|
||||||
|
rowExpand: 'row-expand',
|
||||||
|
// 上下排序
|
||||||
|
rowDragSort: 'row-drag-sort',
|
||||||
|
|
||||||
|
input: 'input',
|
||||||
|
inputNumber: 'inputNumber',
|
||||||
|
textarea: 'textarea',
|
||||||
|
select: 'select',
|
||||||
|
date: 'date',
|
||||||
|
datetime: 'datetime',
|
||||||
|
checkbox: 'checkbox',
|
||||||
|
upload: 'upload',
|
||||||
|
// 下拉搜索
|
||||||
|
selectSearch: 'select-search',
|
||||||
|
// 下拉多选
|
||||||
|
selectMultiple: 'select-multiple',
|
||||||
|
// 进度条
|
||||||
|
progress: 'progress',
|
||||||
|
//部门选择
|
||||||
|
departSelect: 'sel_depart',
|
||||||
|
//用户选择
|
||||||
|
userSelect: 'sel_user',
|
||||||
|
|
||||||
|
// 拖轮Tags(暂无用)
|
||||||
|
tags: 'tags',
|
||||||
|
|
||||||
|
slot: 'slot',
|
||||||
|
normal: 'normal',
|
||||||
|
hidden: 'hidden',
|
||||||
|
}
|
|
@ -1,246 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="tinymce-containerty" :style="{width:containerWidth}">
|
|
||||||
<textarea :id="tinymceId" class="tinymce-textarea" @change="ada"/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
/**
|
|
||||||
* docs:
|
|
||||||
* https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html#tinymce
|
|
||||||
*/
|
|
||||||
import load from './load'
|
|
||||||
//const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen']
|
|
||||||
//const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount']
|
|
||||||
// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
|
|
||||||
const tinymceCDN = 'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'JEditorDyn',
|
|
||||||
props: {
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
default: function() {
|
|
||||||
return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
value: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
toolbar: {
|
|
||||||
type: [String, Array],
|
|
||||||
required: false,
|
|
||||||
default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat | fullscreen',
|
|
||||||
},
|
|
||||||
menubar: {
|
|
||||||
type: String,
|
|
||||||
default: 'file edit insert view format table'
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: [Number, String],
|
|
||||||
required: false,
|
|
||||||
default: 360
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
type: [Number, String],
|
|
||||||
required: false,
|
|
||||||
default: 'auto'
|
|
||||||
},
|
|
||||||
plugins: {
|
|
||||||
type: [String, Array],
|
|
||||||
default: 'lists image link media table textcolor wordcount contextmenu fullscreen'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
hasChange: false,
|
|
||||||
hasInit: false,
|
|
||||||
tinymceId: this.id,
|
|
||||||
fullscreen: false,
|
|
||||||
languageTypeList: {
|
|
||||||
'en': 'en',
|
|
||||||
'zh': 'zh_CN',
|
|
||||||
'es': 'es_MX',
|
|
||||||
'ja': 'ja'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
containerWidth() {
|
|
||||||
const width = this.width
|
|
||||||
if (/^[\d]+(\.[\d]+)?$/.test(width)) { // matches `100`, `'100'`
|
|
||||||
return `${width}px`
|
|
||||||
}
|
|
||||||
return width
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
value(val) {
|
|
||||||
if (!this.hasChange && this.hasInit) {
|
|
||||||
this.$nextTick(() =>
|
|
||||||
window.tinymce.get(this.tinymceId).setContent(val || ''))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.init()
|
|
||||||
},
|
|
||||||
activated() {
|
|
||||||
if (window.tinymce) {
|
|
||||||
this.initTinymce()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
deactivated() {
|
|
||||||
this.destroyTinymce()
|
|
||||||
},
|
|
||||||
destroyed() {
|
|
||||||
this.destroyTinymce()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
ada() {
|
|
||||||
console.log('change')
|
|
||||||
},
|
|
||||||
init() {
|
|
||||||
// dynamic load tinymce from cdn
|
|
||||||
load(tinymceCDN, (err) => {
|
|
||||||
if (err) {
|
|
||||||
this.$message.error(err.message)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.initTinymce()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
initTinymce() {
|
|
||||||
const _this = this
|
|
||||||
window.tinymce.init({
|
|
||||||
selector: `#${this.tinymceId}`,
|
|
||||||
language: this.languageTypeList['zh'],
|
|
||||||
height: this.height,
|
|
||||||
body_class: 'panel-body ',
|
|
||||||
object_resizing: false,
|
|
||||||
toolbar: this.toolbar,
|
|
||||||
menubar: false,
|
|
||||||
plugins: this.plugins,
|
|
||||||
end_container_on_empty_block: true,
|
|
||||||
powerpaste_word_import: 'clean',
|
|
||||||
code_dialog_height: 450,
|
|
||||||
code_dialog_width: 1000,
|
|
||||||
advlist_bullet_styles: 'square',
|
|
||||||
advlist_number_styles: 'default',
|
|
||||||
imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
|
|
||||||
default_link_target: '_blank',
|
|
||||||
link_title: false,
|
|
||||||
nonbreaking_force_tab: true, // inserting nonbreaking space need Nonbreaking Space Plugin
|
|
||||||
init_instance_callback: editor => {
|
|
||||||
if (_this.value) {
|
|
||||||
editor.setContent(_this.value)
|
|
||||||
}
|
|
||||||
_this.hasInit = true
|
|
||||||
editor.on('NodeChange Change KeyUp SetContent', () => {
|
|
||||||
this.hasChange = true
|
|
||||||
this.$emit('input', editor.getContent())
|
|
||||||
})
|
|
||||||
},
|
|
||||||
setup(editor) {
|
|
||||||
editor.on('FullscreenStateChanged', (e) => {
|
|
||||||
_this.fullscreen = e.state
|
|
||||||
})
|
|
||||||
},
|
|
||||||
// it will try to keep these URLs intact
|
|
||||||
// https://www.tiny.cloud/docs-3x/reference/configuration/Configuration3x@convert_urls/
|
|
||||||
// https://stackoverflow.com/questions/5196205/disable-tinymce-absolute-to-relative-url-conversions
|
|
||||||
convert_urls: false
|
|
||||||
// 整合七牛上传
|
|
||||||
// images_dataimg_filter(img) {
|
|
||||||
// setTimeout(() => {
|
|
||||||
// const $image = $(img);
|
|
||||||
// $image.removeAttr('width');
|
|
||||||
// $image.removeAttr('height');
|
|
||||||
// if ($image[0].height && $image[0].width) {
|
|
||||||
// $image.attr('data-wscntype', 'image');
|
|
||||||
// $image.attr('data-wscnh', $image[0].height);
|
|
||||||
// $image.attr('data-wscnw', $image[0].width);
|
|
||||||
// $image.addClass('wscnph');
|
|
||||||
// }
|
|
||||||
// }, 0);
|
|
||||||
// return img
|
|
||||||
// },
|
|
||||||
// images_upload_handler(blobInfo, success, failure, progress) {
|
|
||||||
// progress(0);
|
|
||||||
// const token = _this.$store.getters.token;
|
|
||||||
// getToken(token).then(response => {
|
|
||||||
// const url = response.data.qiniu_url;
|
|
||||||
// const formData = new FormData();
|
|
||||||
// formData.append('token', response.data.qiniu_token);
|
|
||||||
// formData.append('key', response.data.qiniu_key);
|
|
||||||
// formData.append('file', blobInfo.blob(), url);
|
|
||||||
// upload(formData).then(() => {
|
|
||||||
// success(url);
|
|
||||||
// progress(100);
|
|
||||||
// })
|
|
||||||
// }).catch(err => {
|
|
||||||
// failure('err')
|
|
||||||
// console.log(err);
|
|
||||||
// });
|
|
||||||
// },
|
|
||||||
})
|
|
||||||
},
|
|
||||||
destroyTinymce() {
|
|
||||||
const tinymce = window.tinymce.get(this.tinymceId)
|
|
||||||
if (this.fullscreen) {
|
|
||||||
tinymce.execCommand('mceFullScreen')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tinymce) {
|
|
||||||
tinymce.destroy()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setContent(value) {
|
|
||||||
window.tinymce.get(this.tinymceId).setContent(value)
|
|
||||||
},
|
|
||||||
getContent() {
|
|
||||||
window.tinymce.get(this.tinymceId).getContent()
|
|
||||||
},
|
|
||||||
imageSuccessCBK(arr) {
|
|
||||||
arr.forEach(v => window.tinymce.get(this.tinymceId).insertContent(`<img class="wscnph" src="${v.url}" >`))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="less" scoped>
|
|
||||||
.tinymce-containerty {
|
|
||||||
position: relative;
|
|
||||||
line-height: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tinymce-containerty {
|
|
||||||
::v-deep {
|
|
||||||
.mce-fullscreen {
|
|
||||||
z-index: 10000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tinymce-textarea {
|
|
||||||
visibility: hidden;
|
|
||||||
z-index: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor-custom-btn-container {
|
|
||||||
position: absolute;
|
|
||||||
right: 4px;
|
|
||||||
top: 4px;
|
|
||||||
/*z-index: 2005;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.fullscreen .editor-custom-btn-container {
|
|
||||||
z-index: 10000;
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor-upload-btn {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,142 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="j-markdown-editor" :id="dynamicId"/>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import load from './load'
|
|
||||||
import { md_js, md_zh_cn_js } from './Resource'
|
|
||||||
import defaultOptions from '@/components/jeecg/JMarkdownEditor/default-options.js'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'JMdEditorDyn',
|
|
||||||
props: {
|
|
||||||
value: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default() {
|
|
||||||
return 'markdown-editor-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
type: Object,
|
|
||||||
default() {
|
|
||||||
return defaultOptions
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mode: {
|
|
||||||
type: String,
|
|
||||||
default: 'markdown'
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default: '300px'
|
|
||||||
},
|
|
||||||
language: {
|
|
||||||
type: String,
|
|
||||||
required: false,
|
|
||||||
default: 'zh-CN'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
editor: null,
|
|
||||||
dynamicId: this.id
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
editorOptions() {
|
|
||||||
const options = Object.assign({}, defaultOptions, this.options)
|
|
||||||
options.initialEditType = this.mode
|
|
||||||
options.height = this.height
|
|
||||||
options.language = this.language
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
value(newValue, preValue) {
|
|
||||||
if (newValue !== preValue && newValue !== this.editor.getMarkdown()) {
|
|
||||||
this.editor.setMarkdown(newValue)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
language(val) {
|
|
||||||
this.destroyEditor()
|
|
||||||
this.initEditor()
|
|
||||||
},
|
|
||||||
height(newValue) {
|
|
||||||
this.editor.height(newValue)
|
|
||||||
},
|
|
||||||
mode(newValue) {
|
|
||||||
this.editor.changeMode(newValue)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.init()
|
|
||||||
},
|
|
||||||
destroyed() {
|
|
||||||
this.destroyEditor()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
init(){
|
|
||||||
|
|
||||||
this.initEditor()
|
|
||||||
/* load(md_js,'',()=>{
|
|
||||||
load(md_zh_cn_js,'',()=>{
|
|
||||||
|
|
||||||
})
|
|
||||||
})*/
|
|
||||||
},
|
|
||||||
initEditor() {
|
|
||||||
const Editor = toastui.Editor
|
|
||||||
this.editor = new Editor({
|
|
||||||
el: document.getElementById(this.dynamicId),
|
|
||||||
...this.editorOptions
|
|
||||||
})
|
|
||||||
if (this.value) {
|
|
||||||
this.editor.setMarkdown(this.value)
|
|
||||||
}
|
|
||||||
this.editor.on('change', () => {
|
|
||||||
this.$emit('change', this.editor.getMarkdown())
|
|
||||||
})
|
|
||||||
},
|
|
||||||
destroyEditor() {
|
|
||||||
if (!this.editor) return
|
|
||||||
this.editor.off('change')
|
|
||||||
this.editor.remove()
|
|
||||||
},
|
|
||||||
setMarkdown(value) {
|
|
||||||
this.editor.setMarkdown(value)
|
|
||||||
},
|
|
||||||
getMarkdown() {
|
|
||||||
return this.editor.getMarkdown()
|
|
||||||
},
|
|
||||||
setHtml(value) {
|
|
||||||
this.editor.setHtml(value)
|
|
||||||
},
|
|
||||||
getHtml() {
|
|
||||||
return this.editor.getHtml()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
model: {
|
|
||||||
prop: 'value',
|
|
||||||
event: 'change'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style scoped lang="less">
|
|
||||||
|
|
||||||
.j-markdown-editor {
|
|
||||||
/deep/ .tui-editor-defaultUI {
|
|
||||||
.te-mode-switch,
|
|
||||||
.tui-scrollsync
|
|
||||||
{
|
|
||||||
line-height: 1.5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -1,325 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="jeecg-editor-ty" :class="fullCoder?'jeecg-editor-max':'jeecg-editor-min'">
|
|
||||||
<a-icon v-if="fullScreen" class="full-screen-icon" :type="iconType" @click="()=>fullCoder=!fullCoder"/>
|
|
||||||
<textarea :id="dynamicId" />
|
|
||||||
<span @click="nullTipClick" class="null-tip" :class="{'null-tip-hidden': hasCode}" :style="nullTipStyle">{{ placeholderShow }}</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import load from './load'
|
|
||||||
import '@/assets/less/codemirror_idea.css'
|
|
||||||
import './cm_sql_hint.js'
|
|
||||||
import { sql_keyword } from './Resource'
|
|
||||||
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'JSqlCodeEditorDyn',
|
|
||||||
props:{
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
default: function() {
|
|
||||||
return 'vue-editor-' + new Date() + ((Math.random() * 1000).toFixed(0) + '')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
value: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
// 显示行号
|
|
||||||
lineNumbers: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
placeholder: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
zIndex: {
|
|
||||||
type: [Number, String],
|
|
||||||
default: 999
|
|
||||||
},
|
|
||||||
autoHeight: {
|
|
||||||
type: [String, Boolean],
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
// 不自适应高度的情况下生效的固定高度
|
|
||||||
height: {
|
|
||||||
type: [String, Number],
|
|
||||||
default: '240px'
|
|
||||||
},
|
|
||||||
autoHeight: {
|
|
||||||
type: [String, Boolean],
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
// 是否显示全屏按钮
|
|
||||||
fullScreen: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
autoHint:{
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
data(){
|
|
||||||
return {
|
|
||||||
dynamicId: this.id,
|
|
||||||
coder: '',
|
|
||||||
hasCode: false,
|
|
||||||
code: '',
|
|
||||||
// code 编辑器 是否全屏
|
|
||||||
fullCoder: false,
|
|
||||||
iconType: 'fullscreen',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed:{
|
|
||||||
placeholderShow() {
|
|
||||||
if (this.placeholder == null) {
|
|
||||||
return `请在此输入javascript代码`
|
|
||||||
} else {
|
|
||||||
return this.placeholder
|
|
||||||
}
|
|
||||||
},
|
|
||||||
nullTipStyle(){
|
|
||||||
if (this.lineNumbers) {
|
|
||||||
return { left: '36px' }
|
|
||||||
} else {
|
|
||||||
return { left: '12px' }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
isAutoHeight() {
|
|
||||||
let {autoHeight} = this
|
|
||||||
if (typeof autoHeight === 'string' && autoHeight.toLowerCase().trim() === '!ie') {
|
|
||||||
autoHeight = !(isIE() || isIE11())
|
|
||||||
} else {
|
|
||||||
autoHeight = true
|
|
||||||
}
|
|
||||||
return autoHeight
|
|
||||||
},
|
|
||||||
fullScreenParentProps() {
|
|
||||||
let props = {
|
|
||||||
class: {
|
|
||||||
'full-screen-parent': true,
|
|
||||||
'full-screen': this.fullCoder,
|
|
||||||
'auto-height': this.isAutoHeight
|
|
||||||
},
|
|
||||||
style: {}
|
|
||||||
}
|
|
||||||
if (this.fullCoder) {
|
|
||||||
props.style['z-index'] = this.zIndex
|
|
||||||
}
|
|
||||||
if (!this.isAutoHeight) {
|
|
||||||
props.style['height'] = (typeof this.height === 'number' ? this.height + 'px' : this.height)
|
|
||||||
}
|
|
||||||
return props
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
fullCoder:{
|
|
||||||
handler(value) {
|
|
||||||
if(value){
|
|
||||||
this.iconType="fullscreen-exit"
|
|
||||||
}else{
|
|
||||||
this.iconType="fullscreen"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.init()
|
|
||||||
},
|
|
||||||
methods:{
|
|
||||||
init(){
|
|
||||||
this.main();
|
|
||||||
},
|
|
||||||
main(){
|
|
||||||
let obj = document.getElementById(this.dynamicId);
|
|
||||||
const that = this;
|
|
||||||
let editor = CodeMirror.fromTextArea(obj,{
|
|
||||||
theme:'idea',
|
|
||||||
lineNumbers: this.lineNumbers,
|
|
||||||
lineWrapping: true,
|
|
||||||
mode: "sql",
|
|
||||||
indentUnit: 1,
|
|
||||||
indentWithTabs: true,
|
|
||||||
styleActiveLine: true,
|
|
||||||
/* styleSelectedText: false, */
|
|
||||||
extraKeys: {
|
|
||||||
"F11": function(cm) {
|
|
||||||
that.fullCoder = !that.fullCoder
|
|
||||||
cm.setOption("fullScreen", !cm.getOption("fullScreen"));
|
|
||||||
},
|
|
||||||
"Esc": function(cm) {
|
|
||||||
that.fullCoder = false
|
|
||||||
if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
|
|
||||||
},
|
|
||||||
"Alt-/": function(cm) {
|
|
||||||
cm.showHint();
|
|
||||||
},
|
|
||||||
"Tab": (cm) => {
|
|
||||||
if (cm.somethingSelected()) {
|
|
||||||
cm.indentSelection('add');
|
|
||||||
} else {
|
|
||||||
//cm.indentLine(cm.getCursor().line, "add");
|
|
||||||
//走两格 第三格输入
|
|
||||||
cm.replaceSelection(Array(3).join(" "), "end", "+input");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Shift-Tab": (cm) => {
|
|
||||||
if (cm.somethingSelected()) {
|
|
||||||
cm.indentSelection('subtract');
|
|
||||||
} else {
|
|
||||||
// cm.indentLine(cm.getCursor().line, "subtract");
|
|
||||||
const cursor = cm.getCursor();
|
|
||||||
// 光标回退 indexUnit 字符
|
|
||||||
cm.setCursor({line: cursor.line, ch: cursor.ch - 4});
|
|
||||||
}
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.coder = editor
|
|
||||||
this.addEvent();
|
|
||||||
this.setCoderValue();
|
|
||||||
this.addSystemHint();
|
|
||||||
},
|
|
||||||
setCoderValue(){
|
|
||||||
if(this.value||this.code){
|
|
||||||
this.hasCode=true
|
|
||||||
this.setCodeContent(this.value || this.code)
|
|
||||||
}else{
|
|
||||||
this.coder.setValue('')
|
|
||||||
this.hasCode=false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getCodeContent(){
|
|
||||||
return this.code
|
|
||||||
},
|
|
||||||
setCodeContent(val){
|
|
||||||
setTimeout(()=>{
|
|
||||||
if(!val){
|
|
||||||
this.coder.setValue('')
|
|
||||||
}else{
|
|
||||||
this.coder.setValue(val)
|
|
||||||
}
|
|
||||||
},300)
|
|
||||||
},
|
|
||||||
addSystemHint(){
|
|
||||||
this.coder.setOption('hintOptions', {
|
|
||||||
completeSingle: false,
|
|
||||||
tables: sql_keyword
|
|
||||||
});
|
|
||||||
},
|
|
||||||
addEvent(){
|
|
||||||
if(this.autoHint){
|
|
||||||
this.coder.on('cursorActivity', ()=>{
|
|
||||||
this.coder.showHint();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.coder.on('change', (coder) => {
|
|
||||||
this.code = coder.getValue()
|
|
||||||
if(this.code){
|
|
||||||
this.hasCode=true
|
|
||||||
}else{
|
|
||||||
this.hasCode=false
|
|
||||||
}
|
|
||||||
if (this.$emit) {
|
|
||||||
this.$emit('input', this.code)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.coder.on('focus', () => {
|
|
||||||
this.hasCode=true
|
|
||||||
});
|
|
||||||
this.coder.on('blur', () => {
|
|
||||||
if(this.code){
|
|
||||||
this.hasCode=true
|
|
||||||
}else{
|
|
||||||
this.hasCode=false
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
loadResource(src,type){
|
|
||||||
return new Promise((resolve,reject)=>{
|
|
||||||
load(src,type,(msg)=>{
|
|
||||||
if(!msg){
|
|
||||||
resolve();
|
|
||||||
}else{
|
|
||||||
reject(msg)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
nullTipClick(){
|
|
||||||
this.coder.focus()
|
|
||||||
},
|
|
||||||
fullToggle(){
|
|
||||||
this.fullCoder = !this.fullCoder
|
|
||||||
this.coder.setOption("fullScreen", this.fullCoder);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style lang="less" >
|
|
||||||
.jeecg-editor-ty{
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.full-screen-icon {
|
|
||||||
opacity: 0;
|
|
||||||
color: black;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 24px;
|
|
||||||
background-color: white;
|
|
||||||
position: absolute;
|
|
||||||
top: 4px;
|
|
||||||
right: 2px;
|
|
||||||
z-index: 9;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: opacity 0.3s;
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
.full-screen-icon {
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(255, 255, 255, 0.88);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.null-tip{
|
|
||||||
position: absolute;
|
|
||||||
top: 4px;
|
|
||||||
left: 36px;
|
|
||||||
z-index: 10;
|
|
||||||
font-size:16px;
|
|
||||||
color: #acaaaac9;
|
|
||||||
line-height: initial;
|
|
||||||
}
|
|
||||||
.null-tip-hidden{
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.jeecg-editor-max{
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: 999;
|
|
||||||
height: 100%;
|
|
||||||
width: 100% !important;
|
|
||||||
|
|
||||||
.CodeMirror{
|
|
||||||
position: inherit !important;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.full-screen-icon{
|
|
||||||
z-index:9999;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,319 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="jeecg-editor-ty" :class="fullCoder?'jeecg-editor-max':'jeecg-editor-min'">
|
|
||||||
<a-icon v-if="fullScreen" class="full-screen-icon" :type="iconType" @click="()=>fullCoder=!fullCoder"/>
|
|
||||||
<textarea :id="dynamicId" />
|
|
||||||
<span @click="nullTipClick" class="null-tip" :class="{'null-tip-hidden': hasCode}" :style="nullTipStyle">{{ placeholderShow }}</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
import '@/assets/less/codemirror_idea.css'
|
|
||||||
import './cm_hint.js'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'JsCodeEditorDyn',
|
|
||||||
props:{
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
default: function() {
|
|
||||||
return 'vue-editor-' + new Date() + ((Math.random() * 1000).toFixed(0) + '')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
value: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
// 显示行号
|
|
||||||
lineNumbers: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
placeholder: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
zIndex: {
|
|
||||||
type: [Number, String],
|
|
||||||
default: 999
|
|
||||||
},
|
|
||||||
autoHeight: {
|
|
||||||
type: [String, Boolean],
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
// 不自适应高度的情况下生效的固定高度
|
|
||||||
height: {
|
|
||||||
type: [String, Number],
|
|
||||||
default: '240px'
|
|
||||||
},
|
|
||||||
autoHeight: {
|
|
||||||
type: [String, Boolean],
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
// 是否显示全屏按钮
|
|
||||||
fullScreen: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
|
|
||||||
},
|
|
||||||
data(){
|
|
||||||
return {
|
|
||||||
dynamicId: this.id,
|
|
||||||
coder: '',
|
|
||||||
hasCode: false,
|
|
||||||
code: '',
|
|
||||||
// code 编辑器 是否全屏
|
|
||||||
fullCoder: false,
|
|
||||||
iconType: 'fullscreen',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed:{
|
|
||||||
placeholderShow() {
|
|
||||||
if (this.placeholder == null) {
|
|
||||||
return `请在此输入javascript代码`
|
|
||||||
} else {
|
|
||||||
return this.placeholder
|
|
||||||
}
|
|
||||||
},
|
|
||||||
nullTipStyle(){
|
|
||||||
if (this.lineNumbers) {
|
|
||||||
return { left: '36px' }
|
|
||||||
} else {
|
|
||||||
return { left: '12px' }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
isAutoHeight() {
|
|
||||||
let {autoHeight} = this
|
|
||||||
if (typeof autoHeight === 'string' && autoHeight.toLowerCase().trim() === '!ie') {
|
|
||||||
autoHeight = !(isIE() || isIE11())
|
|
||||||
} else {
|
|
||||||
autoHeight = true
|
|
||||||
}
|
|
||||||
return autoHeight
|
|
||||||
},
|
|
||||||
fullScreenParentProps() {
|
|
||||||
let props = {
|
|
||||||
class: {
|
|
||||||
'full-screen-parent': true,
|
|
||||||
'full-screen': this.fullCoder,
|
|
||||||
'auto-height': this.isAutoHeight
|
|
||||||
},
|
|
||||||
style: {}
|
|
||||||
}
|
|
||||||
if (this.fullCoder) {
|
|
||||||
props.style['z-index'] = this.zIndex
|
|
||||||
}
|
|
||||||
if (!this.isAutoHeight) {
|
|
||||||
props.style['height'] = (typeof this.height === 'number' ? this.height + 'px' : this.height)
|
|
||||||
}
|
|
||||||
return props
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
fullCoder:{
|
|
||||||
handler(value) {
|
|
||||||
if(value){
|
|
||||||
this.iconType="fullscreen-exit"
|
|
||||||
}else{
|
|
||||||
this.iconType="fullscreen"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.init()
|
|
||||||
},
|
|
||||||
methods:{
|
|
||||||
init(){
|
|
||||||
this.main();
|
|
||||||
},
|
|
||||||
main(){
|
|
||||||
let obj = document.getElementById(this.dynamicId);
|
|
||||||
const that = this;
|
|
||||||
let editor = CodeMirror.fromTextArea(obj,{
|
|
||||||
theme:'idea',
|
|
||||||
lineNumbers: this.lineNumbers,
|
|
||||||
lineWrapping: true,
|
|
||||||
mode: "javascript",
|
|
||||||
indentUnit: 1,
|
|
||||||
indentWithTabs: true,
|
|
||||||
styleActiveLine: true,
|
|
||||||
/* styleSelectedText: false, */
|
|
||||||
extraKeys: {
|
|
||||||
"F11": function(cm) {
|
|
||||||
that.fullCoder = !that.fullCoder
|
|
||||||
cm.setOption("fullScreen", !cm.getOption("fullScreen"));
|
|
||||||
},
|
|
||||||
"Esc": function(cm) {
|
|
||||||
that.fullCoder = false
|
|
||||||
if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
|
|
||||||
},
|
|
||||||
"Alt-/": function(cm) {
|
|
||||||
let a = cm.getValue()+""
|
|
||||||
console.log('a',a)
|
|
||||||
cm.showHint();
|
|
||||||
},
|
|
||||||
"Tab": (cm) => {
|
|
||||||
if (cm.somethingSelected()) {
|
|
||||||
cm.indentSelection('add');
|
|
||||||
} else {
|
|
||||||
//cm.indentLine(cm.getCursor().line, "add");
|
|
||||||
//走两格 第三格输入
|
|
||||||
cm.replaceSelection(Array(3).join(" "), "end", "+input");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Shift-Tab": (cm) => {
|
|
||||||
if (cm.somethingSelected()) {
|
|
||||||
cm.indentSelection('subtract');
|
|
||||||
} else {
|
|
||||||
// cm.indentLine(cm.getCursor().line, "subtract");
|
|
||||||
const cursor = cm.getCursor();
|
|
||||||
// 光标回退 indexUnit 字符
|
|
||||||
cm.setCursor({line: cursor.line, ch: cursor.ch - 4});
|
|
||||||
}
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.coder = editor
|
|
||||||
this.addEvent();
|
|
||||||
this.setCoderValue();
|
|
||||||
},
|
|
||||||
setCoderValue(){
|
|
||||||
if(this.value||this.code){
|
|
||||||
this.hasCode=true
|
|
||||||
this.setCodeContent(this.value || this.code)
|
|
||||||
}else{
|
|
||||||
this.coder.setValue('')
|
|
||||||
this.hasCode=false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getCodeContent(){
|
|
||||||
return this.code
|
|
||||||
},
|
|
||||||
setCodeContent(val){
|
|
||||||
setTimeout(()=>{
|
|
||||||
if(!val){
|
|
||||||
this.coder.setValue('')
|
|
||||||
}else{
|
|
||||||
this.coder.setValue(val)
|
|
||||||
}
|
|
||||||
},300)
|
|
||||||
},
|
|
||||||
addEvent(){
|
|
||||||
const that = this;
|
|
||||||
this.coder.on('cursorActivity',function(wl) {
|
|
||||||
let arr = wl.state.activeLines
|
|
||||||
if(arr && arr.length>0){
|
|
||||||
let text = arr[0].text
|
|
||||||
if(text.lastIndexOf('that.')>=0){
|
|
||||||
that.coder.showHint();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.coder.on('change', (coder) => {
|
|
||||||
this.code = coder.getValue()
|
|
||||||
if(this.code){
|
|
||||||
this.hasCode=true
|
|
||||||
}else{
|
|
||||||
this.hasCode=false
|
|
||||||
}
|
|
||||||
if (this.$emit) {
|
|
||||||
this.$emit('input', this.code)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.coder.on('focus', () => {
|
|
||||||
this.hasCode=true
|
|
||||||
});
|
|
||||||
this.coder.on('blur', () => {
|
|
||||||
if(this.code){
|
|
||||||
this.hasCode=true
|
|
||||||
}else{
|
|
||||||
this.hasCode=false
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
loadResource(src,type){
|
|
||||||
return new Promise((resolve,reject)=>{
|
|
||||||
load(src,type,(msg)=>{
|
|
||||||
if(!msg){
|
|
||||||
resolve();
|
|
||||||
}else{
|
|
||||||
reject(msg)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
nullTipClick(){
|
|
||||||
this.coder.focus()
|
|
||||||
},
|
|
||||||
fullToggle(){
|
|
||||||
this.fullCoder = !this.fullCoder
|
|
||||||
this.coder.setOption("fullScreen", this.fullCoder);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style lang="less" >
|
|
||||||
.jeecg-editor-ty{
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.full-screen-icon {
|
|
||||||
opacity: 0;
|
|
||||||
color: black;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 24px;
|
|
||||||
background-color: white;
|
|
||||||
position: absolute;
|
|
||||||
top: 4px;
|
|
||||||
right: 2px;
|
|
||||||
z-index: 9;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: opacity 0.3s;
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
.full-screen-icon {
|
|
||||||
opacity: 1;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(255, 255, 255, 0.88);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.null-tip{
|
|
||||||
position: absolute;
|
|
||||||
top: 4px;
|
|
||||||
left: 36px;
|
|
||||||
z-index: 10;
|
|
||||||
font-size:16px;
|
|
||||||
color: #acaaaac9;
|
|
||||||
line-height: initial;
|
|
||||||
}
|
|
||||||
.null-tip-hidden{
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.jeecg-editor-max{
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: 999;
|
|
||||||
height: 100%;
|
|
||||||
width: 100% !important;
|
|
||||||
|
|
||||||
.CodeMirror{
|
|
||||||
position: inherit !important;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.full-screen-icon{
|
|
||||||
z-index:9999;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,24 +0,0 @@
|
||||||
|
|
||||||
/**js编辑器关键词用于提示*/
|
|
||||||
const js_keyword = [
|
|
||||||
'that',
|
|
||||||
'getAction','postAction','deleteAction',
|
|
||||||
'beforeAdd','beforeEdit','beforeDelete','mounted','created','show'
|
|
||||||
]
|
|
||||||
|
|
||||||
/**js编辑器 方法名用于提示*/
|
|
||||||
const js_method = [
|
|
||||||
'.getSelectOptions','.changeOptions','.triggleChangeValues','.immediateEnhance ','.simpleDateFormat','.lodash'
|
|
||||||
]
|
|
||||||
|
|
||||||
/**sql编辑器 表名字段名用于提示*/
|
|
||||||
const sql_keyword = {
|
|
||||||
sys_user: ['USERNAME', 'REALNAME', 'ID','BIRTHDAY','AGE'],
|
|
||||||
demo: ['name', 'age', 'id', 'sex']
|
|
||||||
}
|
|
||||||
|
|
||||||
export {
|
|
||||||
js_keyword,
|
|
||||||
js_method,
|
|
||||||
sql_keyword
|
|
||||||
}
|
|
|
@ -1,177 +0,0 @@
|
||||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
||||||
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
|
||||||
import { js_keyword, js_method } from './Resource'
|
|
||||||
(function(mod) {
|
|
||||||
mod(CodeMirror);
|
|
||||||
/*if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
||||||
mod(require("../../lib/codemirror"));
|
|
||||||
else if (typeof define == "function" && define.amd) // AMD
|
|
||||||
define(["../../lib/codemirror"], mod);
|
|
||||||
else // Plain browser env*/
|
|
||||||
|
|
||||||
})(function(CodeMirror) {
|
|
||||||
var Pos = CodeMirror.Pos;
|
|
||||||
|
|
||||||
function forEach(arr, f) {
|
|
||||||
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function arrayContains(arr, item) {
|
|
||||||
if (!Array.prototype.indexOf) {
|
|
||||||
var i = arr.length;
|
|
||||||
while (i--) {
|
|
||||||
if (arr[i] === item) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return arr.indexOf(item) != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function scriptHint(editor, keywords, getToken, options) {
|
|
||||||
// Find the token at the cursor
|
|
||||||
var cur = editor.getCursor(), token = getToken(editor, cur);
|
|
||||||
if (/\b(?:string|comment)\b/.test(token.type)) return;
|
|
||||||
var innerMode = CodeMirror.innerMode(editor.getMode(), token.state);
|
|
||||||
if (innerMode.mode.helperType === "json") return;
|
|
||||||
token.state = innerMode.state;
|
|
||||||
if('.' === token.string){
|
|
||||||
let arr = []
|
|
||||||
for(let k of js_method){
|
|
||||||
arr.push(k)
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
list: arr,
|
|
||||||
from: Pos(cur.line, token.start),
|
|
||||||
to: Pos(cur.line, token.end)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
// If it's not a 'word-style' token, ignore the token.
|
|
||||||
if (!/^[\w$_]*$/.test(token.string)) {
|
|
||||||
token = {start: cur.ch, end: cur.ch, string: "", state: token.state,
|
|
||||||
type: token.string == "." ? "property" : null};
|
|
||||||
} else if (token.end > cur.ch) {
|
|
||||||
token.end = cur.ch;
|
|
||||||
token.string = token.string.slice(0, cur.ch - token.start);
|
|
||||||
}
|
|
||||||
|
|
||||||
var tprop = token;
|
|
||||||
// If it is a property, find out what it is a property of.
|
|
||||||
while (tprop.type == "property") {
|
|
||||||
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
|
||||||
if (tprop.string != ".") return;
|
|
||||||
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
|
||||||
if (!context) var context = [];
|
|
||||||
context.push(tprop);
|
|
||||||
}
|
|
||||||
return {list: getCompletions(token, context, keywords, options),
|
|
||||||
from: Pos(cur.line, token.start),
|
|
||||||
to: Pos(cur.line, token.end)};
|
|
||||||
}
|
|
||||||
|
|
||||||
function javascriptHint(editor, options) {
|
|
||||||
return scriptHint(editor, javascriptKeywords,
|
|
||||||
function (e, cur) {return e.getTokenAt(cur);},
|
|
||||||
options);
|
|
||||||
};
|
|
||||||
CodeMirror.registerHelper("hint", "javascript", javascriptHint);
|
|
||||||
|
|
||||||
function getCoffeeScriptToken(editor, cur) {
|
|
||||||
// This getToken, it is for coffeescript, imitates the behavior of
|
|
||||||
// getTokenAt method in javascript.js, that is, returning "property"
|
|
||||||
// type and treat "." as indepenent token.
|
|
||||||
var token = editor.getTokenAt(cur);
|
|
||||||
if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
|
|
||||||
token.end = token.start;
|
|
||||||
token.string = '.';
|
|
||||||
token.type = "property";
|
|
||||||
}
|
|
||||||
else if (/^\.[\w$_]*$/.test(token.string)) {
|
|
||||||
token.type = "property";
|
|
||||||
token.start++;
|
|
||||||
token.string = token.string.replace(/\./, '');
|
|
||||||
}
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
function coffeescriptHint(editor, options) {
|
|
||||||
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
|
|
||||||
}
|
|
||||||
CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
|
|
||||||
|
|
||||||
var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
|
|
||||||
"toUpperCase toLowerCase split concat match replace search").split(" ");
|
|
||||||
var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " +
|
|
||||||
"lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");
|
|
||||||
var funcProps = "prototype apply call bind".split(" ");
|
|
||||||
|
|
||||||
var javascriptKeywords = ("break case catch class const continue debugger default delete do else export extends false finally for function " +
|
|
||||||
"if in import instanceof new null return super switch this throw true try typeof var void while with yield that").split(" ");
|
|
||||||
for(let jk of js_keyword){
|
|
||||||
javascriptKeywords.push(jk)
|
|
||||||
}
|
|
||||||
var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " +
|
|
||||||
"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
|
|
||||||
|
|
||||||
function forAllProps(obj, callback) {
|
|
||||||
if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {
|
|
||||||
for (var name in obj) callback(name)
|
|
||||||
} else {
|
|
||||||
for (var o = obj; o; o = Object.getPrototypeOf(o))
|
|
||||||
Object.getOwnPropertyNames(o).forEach(callback)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getCompletions(token, context, keywords, options) {
|
|
||||||
var found = [], start = token.string, global = options && options.globalScope || window;
|
|
||||||
function maybeAdd(str) {
|
|
||||||
if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);
|
|
||||||
}
|
|
||||||
function gatherCompletions(obj) {
|
|
||||||
if (typeof obj == "string") forEach(stringProps, maybeAdd);
|
|
||||||
else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
|
|
||||||
else if (obj instanceof Function) forEach(funcProps, maybeAdd);
|
|
||||||
forAllProps(obj, maybeAdd)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (context && context.length) {
|
|
||||||
// If this is a property, see if it belongs to some object we can
|
|
||||||
// find in the current environment.
|
|
||||||
var obj = context.pop(), base;
|
|
||||||
if (obj.type && obj.type.indexOf("variable") === 0) {
|
|
||||||
if (options && options.additionalContext)
|
|
||||||
base = options.additionalContext[obj.string];
|
|
||||||
if (!options || options.useGlobalScope !== false)
|
|
||||||
base = base || global[obj.string];
|
|
||||||
} else if (obj.type == "string") {
|
|
||||||
base = "";
|
|
||||||
} else if (obj.type == "atom") {
|
|
||||||
base = 1;
|
|
||||||
} else if (obj.type == "function") {
|
|
||||||
if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
|
|
||||||
(typeof global.jQuery == 'function'))
|
|
||||||
base = global.jQuery();
|
|
||||||
else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))
|
|
||||||
base = global._();
|
|
||||||
}
|
|
||||||
while (base != null && context.length)
|
|
||||||
base = base[context.pop().string];
|
|
||||||
if (base != null) gatherCompletions(base);
|
|
||||||
} else {
|
|
||||||
// If not, just look in the global object, any local scope, and optional additional-context
|
|
||||||
// (reading into JS mode internals to get at the local and global variables)
|
|
||||||
for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
|
|
||||||
for (var c = token.state.context; c; c = c.prev)
|
|
||||||
for (var v = c.vars; v; v = v.next) maybeAdd(v.name)
|
|
||||||
for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
|
|
||||||
if (options && options.additionalContext != null)
|
|
||||||
for (var key in options.additionalContext)
|
|
||||||
maybeAdd(key);
|
|
||||||
if (!options || options.useGlobalScope !== false)
|
|
||||||
gatherCompletions(global);
|
|
||||||
forEach(keywords, maybeAdd);
|
|
||||||
}
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,305 +0,0 @@
|
||||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
||||||
// Distributed under an MIT license: https://codemirror.net/LICENSE
|
|
||||||
|
|
||||||
(function(mod) {
|
|
||||||
/*if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
||||||
mod(require("../../lib/codemirror"), require("../../mode/sql/sql"));
|
|
||||||
else if (typeof define == "function" && define.amd) // AMD
|
|
||||||
define(["../../lib/codemirror", "../../mode/sql/sql"], mod);
|
|
||||||
else */
|
|
||||||
// Plain browser env
|
|
||||||
mod(CodeMirror);
|
|
||||||
})(function(CodeMirror) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var tables;
|
|
||||||
var defaultTable;
|
|
||||||
var keywords;
|
|
||||||
var identifierQuote;
|
|
||||||
var CONS = {
|
|
||||||
QUERY_DIV: ";",
|
|
||||||
ALIAS_KEYWORD: "AS"
|
|
||||||
};
|
|
||||||
var Pos = CodeMirror.Pos, cmpPos = CodeMirror.cmpPos;
|
|
||||||
|
|
||||||
function isArray(val) { return Object.prototype.toString.call(val) == "[object Array]" }
|
|
||||||
|
|
||||||
function getKeywords(editor) {
|
|
||||||
var mode = editor.doc.modeOption;
|
|
||||||
if (mode === "sql") mode = "text/x-sql";
|
|
||||||
return CodeMirror.resolveMode(mode).keywords;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIdentifierQuote(editor) {
|
|
||||||
var mode = editor.doc.modeOption;
|
|
||||||
if (mode === "sql") mode = "text/x-sql";
|
|
||||||
return CodeMirror.resolveMode(mode).identifierQuote || "`";
|
|
||||||
}
|
|
||||||
|
|
||||||
function getText(item) {
|
|
||||||
return typeof item == "string" ? item : item.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
function wrapTable(name, value) {
|
|
||||||
if (isArray(value)) value = {columns: value}
|
|
||||||
if (!value.text) value.text = name
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseTables(input) {
|
|
||||||
var result = {}
|
|
||||||
if (isArray(input)) {
|
|
||||||
for (var i = input.length - 1; i >= 0; i--) {
|
|
||||||
var item = input[i]
|
|
||||||
result[getText(item).toUpperCase()] = wrapTable(getText(item), item)
|
|
||||||
}
|
|
||||||
} else if (input) {
|
|
||||||
for (var name in input)
|
|
||||||
result[name.toUpperCase()] = wrapTable(name, input[name])
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTable(name) {
|
|
||||||
return tables[name.toUpperCase()]
|
|
||||||
}
|
|
||||||
|
|
||||||
function shallowClone(object) {
|
|
||||||
var result = {};
|
|
||||||
for (var key in object) if (object.hasOwnProperty(key))
|
|
||||||
result[key] = object[key];
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function match(string, word) {
|
|
||||||
var len = string.length;
|
|
||||||
var sub = getText(word).substr(0, len);
|
|
||||||
return string.toUpperCase() === sub.toUpperCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
function addMatches(result, search, wordlist, formatter) {
|
|
||||||
if (isArray(wordlist)) {
|
|
||||||
for (var i = 0; i < wordlist.length; i++)
|
|
||||||
if (match(search, wordlist[i])) result.push(formatter(wordlist[i]))
|
|
||||||
} else {
|
|
||||||
for (var word in wordlist) if (wordlist.hasOwnProperty(word)) {
|
|
||||||
var val = wordlist[word]
|
|
||||||
if (!val || val === true)
|
|
||||||
val = word
|
|
||||||
else
|
|
||||||
val = val.displayText ? {text: val.text, displayText: val.displayText} : val.text
|
|
||||||
if (match(search, val)) result.push(formatter(val))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function cleanName(name) {
|
|
||||||
// Get rid name from identifierQuote and preceding dot(.)
|
|
||||||
if (name.charAt(0) == ".") {
|
|
||||||
name = name.substr(1);
|
|
||||||
}
|
|
||||||
// replace doublicated identifierQuotes with single identifierQuotes
|
|
||||||
// and remove single identifierQuotes
|
|
||||||
var nameParts = name.split(identifierQuote+identifierQuote);
|
|
||||||
for (var i = 0; i < nameParts.length; i++)
|
|
||||||
nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote,"g"), "");
|
|
||||||
return nameParts.join(identifierQuote);
|
|
||||||
}
|
|
||||||
|
|
||||||
function insertIdentifierQuotes(name) {
|
|
||||||
var nameParts = getText(name).split(".");
|
|
||||||
for (var i = 0; i < nameParts.length; i++)
|
|
||||||
nameParts[i] = identifierQuote +
|
|
||||||
// doublicate identifierQuotes
|
|
||||||
nameParts[i].replace(new RegExp(identifierQuote,"g"), identifierQuote+identifierQuote) +
|
|
||||||
identifierQuote;
|
|
||||||
var escaped = nameParts.join(".");
|
|
||||||
if (typeof name == "string") return escaped;
|
|
||||||
name = shallowClone(name);
|
|
||||||
name.text = escaped;
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
function nameCompletion(cur, token, result, editor) {
|
|
||||||
// Try to complete table, column names and return start position of completion
|
|
||||||
var useIdentifierQuotes = false;
|
|
||||||
var nameParts = [];
|
|
||||||
var start = token.start;
|
|
||||||
var cont = true;
|
|
||||||
while (cont) {
|
|
||||||
cont = (token.string.charAt(0) == ".");
|
|
||||||
useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote);
|
|
||||||
|
|
||||||
start = token.start;
|
|
||||||
nameParts.unshift(cleanName(token.string));
|
|
||||||
|
|
||||||
token = editor.getTokenAt(Pos(cur.line, token.start));
|
|
||||||
if (token.string == ".") {
|
|
||||||
cont = true;
|
|
||||||
token = editor.getTokenAt(Pos(cur.line, token.start));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to complete table names
|
|
||||||
var string = nameParts.join(".");
|
|
||||||
addMatches(result, string, tables, function(w) {
|
|
||||||
return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Try to complete columns from defaultTable
|
|
||||||
addMatches(result, string, defaultTable, function(w) {
|
|
||||||
return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Try to complete columns
|
|
||||||
string = nameParts.pop();
|
|
||||||
var table = nameParts.join(".");
|
|
||||||
|
|
||||||
var alias = false;
|
|
||||||
var aliasTable = table;
|
|
||||||
// Check if table is available. If not, find table by Alias
|
|
||||||
if (!getTable(table)) {
|
|
||||||
var oldTable = table;
|
|
||||||
table = findTableByAlias(table, editor);
|
|
||||||
if (table !== oldTable) alias = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var columns = getTable(table);
|
|
||||||
if (columns && columns.columns)
|
|
||||||
columns = columns.columns;
|
|
||||||
|
|
||||||
if (columns) {
|
|
||||||
addMatches(result, string, columns, function(w) {
|
|
||||||
var tableInsert = table;
|
|
||||||
if (alias == true) tableInsert = aliasTable;
|
|
||||||
if (typeof w == "string") {
|
|
||||||
w = tableInsert + "." + w;
|
|
||||||
} else {
|
|
||||||
w = shallowClone(w);
|
|
||||||
w.text = tableInsert + "." + w.text;
|
|
||||||
}
|
|
||||||
return useIdentifierQuotes ? insertIdentifierQuotes(w) : w;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return start;
|
|
||||||
}
|
|
||||||
|
|
||||||
function eachWord(lineText, f) {
|
|
||||||
var words = lineText.split(/\s+/)
|
|
||||||
for (var i = 0; i < words.length; i++)
|
|
||||||
if (words[i]) f(words[i].replace(/[,;]/g, ''))
|
|
||||||
}
|
|
||||||
|
|
||||||
function findTableByAlias(alias, editor) {
|
|
||||||
var doc = editor.doc;
|
|
||||||
var fullQuery = doc.getValue();
|
|
||||||
var aliasUpperCase = alias.toUpperCase();
|
|
||||||
var previousWord = "";
|
|
||||||
var table = "";
|
|
||||||
var separator = [];
|
|
||||||
var validRange = {
|
|
||||||
start: Pos(0, 0),
|
|
||||||
end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)
|
|
||||||
};
|
|
||||||
|
|
||||||
//add separator
|
|
||||||
var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);
|
|
||||||
while(indexOfSeparator != -1) {
|
|
||||||
separator.push(doc.posFromIndex(indexOfSeparator));
|
|
||||||
indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);
|
|
||||||
}
|
|
||||||
separator.unshift(Pos(0, 0));
|
|
||||||
separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));
|
|
||||||
|
|
||||||
//find valid range
|
|
||||||
var prevItem = null;
|
|
||||||
var current = editor.getCursor()
|
|
||||||
for (var i = 0; i < separator.length; i++) {
|
|
||||||
if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) {
|
|
||||||
validRange = {start: prevItem, end: separator[i]};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
prevItem = separator[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (validRange.start) {
|
|
||||||
var query = doc.getRange(validRange.start, validRange.end, false);
|
|
||||||
|
|
||||||
for (var i = 0; i < query.length; i++) {
|
|
||||||
var lineText = query[i];
|
|
||||||
eachWord(lineText, function(word) {
|
|
||||||
var wordUpperCase = word.toUpperCase();
|
|
||||||
if (wordUpperCase === aliasUpperCase && getTable(previousWord))
|
|
||||||
table = previousWord;
|
|
||||||
if (wordUpperCase !== CONS.ALIAS_KEYWORD)
|
|
||||||
previousWord = word;
|
|
||||||
});
|
|
||||||
if (table) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return table;
|
|
||||||
}
|
|
||||||
|
|
||||||
CodeMirror.registerHelper("hint", "sql", function(editor, options) {
|
|
||||||
tables = parseTables(options && options.tables)
|
|
||||||
var defaultTableName = options && options.defaultTable;
|
|
||||||
var disableKeywords = options && options.disableKeywords;
|
|
||||||
defaultTable = defaultTableName && getTable(defaultTableName);
|
|
||||||
keywords = getKeywords(editor);
|
|
||||||
identifierQuote = getIdentifierQuote(editor);
|
|
||||||
|
|
||||||
if (defaultTableName && !defaultTable)
|
|
||||||
defaultTable = findTableByAlias(defaultTableName, editor);
|
|
||||||
|
|
||||||
defaultTable = defaultTable || [];
|
|
||||||
|
|
||||||
if (defaultTable.columns)
|
|
||||||
defaultTable = defaultTable.columns;
|
|
||||||
|
|
||||||
var cur = editor.getCursor();
|
|
||||||
var result = [];
|
|
||||||
var token = editor.getTokenAt(cur), start, end, search;
|
|
||||||
if (token.end > cur.ch) {
|
|
||||||
token.end = cur.ch;
|
|
||||||
token.string = token.string.slice(0, cur.ch - token.start);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (token.string.match(/^[.`"'\w@][\w$#]*$/g)) {
|
|
||||||
search = token.string;
|
|
||||||
start = token.start;
|
|
||||||
end = token.end;
|
|
||||||
} else {
|
|
||||||
start = end = cur.ch;
|
|
||||||
search = "";
|
|
||||||
}
|
|
||||||
if (search.charAt(0) == "." || search.charAt(0) == identifierQuote) {
|
|
||||||
start = nameCompletion(cur, token, result, editor);
|
|
||||||
} else {
|
|
||||||
var objectOrClass = function(w, className) {
|
|
||||||
if (typeof w === "object") {
|
|
||||||
w.className = className;
|
|
||||||
} else {
|
|
||||||
w = { text: w, className: className };
|
|
||||||
}
|
|
||||||
return w;
|
|
||||||
};
|
|
||||||
addMatches(result, search, defaultTable, function(w) {
|
|
||||||
return objectOrClass(w, "CodeMirror-hint-table CodeMirror-hint-default-table");
|
|
||||||
});
|
|
||||||
addMatches(
|
|
||||||
result,
|
|
||||||
search,
|
|
||||||
tables, function(w) {
|
|
||||||
return objectOrClass(w, "CodeMirror-hint-table");
|
|
||||||
}
|
|
||||||
);
|
|
||||||
if (!disableKeywords)
|
|
||||||
addMatches(result, search, keywords, function(w) {
|
|
||||||
return objectOrClass(w.toUpperCase(), "CodeMirror-hint-keyword");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,92 +0,0 @@
|
||||||
let callbacks = []
|
|
||||||
|
|
||||||
function loadSuccess(key) {
|
|
||||||
// to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2144
|
|
||||||
// check is successfully downloaded script
|
|
||||||
return window[key]
|
|
||||||
}
|
|
||||||
|
|
||||||
const load = (src, type, callback) => {
|
|
||||||
if(type=='link'){
|
|
||||||
|
|
||||||
loadStyle(src, callback)
|
|
||||||
}else{
|
|
||||||
let loadKey = ''
|
|
||||||
if(src.indexOf('tinymce')>=0){
|
|
||||||
loadKey = 'tinymce'
|
|
||||||
}else if(src.indexOf('codemirror')>=0){
|
|
||||||
loadKey = 'CodeMirror'
|
|
||||||
}
|
|
||||||
const scriptTag = document.getElementById(src)
|
|
||||||
//const cb = callback || function() {}
|
|
||||||
if (!scriptTag) {
|
|
||||||
const script = document.createElement('script')
|
|
||||||
script.src = src // src url for the third-party library being loaded.
|
|
||||||
script.id = src
|
|
||||||
script.onload=()=>callback()
|
|
||||||
script.onerror=()=>callback('加载失败:'+src)
|
|
||||||
document.body.appendChild(script)
|
|
||||||
//callbacks.push(cb)
|
|
||||||
// const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd
|
|
||||||
// onEnd(script)
|
|
||||||
}else{
|
|
||||||
if (loadSuccess(loadKey)) {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scriptTag) {
|
|
||||||
/* else {
|
|
||||||
callbacks.push(cb)
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function stdOnEnd(script) {
|
|
||||||
script['onload'] = function() {
|
|
||||||
// this.onload = null here is necessary
|
|
||||||
// because even IE9 works not like others
|
|
||||||
this.onerror = this.onload = null
|
|
||||||
for (const cb of callbacks) {
|
|
||||||
cb(null, script)
|
|
||||||
}
|
|
||||||
callbacks = null
|
|
||||||
}
|
|
||||||
script['onerror'] = function() {
|
|
||||||
this.onerror = this.onload = null
|
|
||||||
cb(new Error('Failed to load ' + src), script)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function ieOnEnd(script) {
|
|
||||||
script.onreadystatechange = function() {
|
|
||||||
if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
|
|
||||||
this.onreadystatechange = null
|
|
||||||
for (const cb of callbacks) {
|
|
||||||
cb(null, script) // there is no way to catch loading errors in IE8
|
|
||||||
}
|
|
||||||
callbacks = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadStyle(src, callback) {
|
|
||||||
const link = document.getElementById(src)
|
|
||||||
if (!link) {
|
|
||||||
const link = document.createElement('link')
|
|
||||||
link.setAttribute("rel", "stylesheet");
|
|
||||||
link.setAttribute("type", "text/css");
|
|
||||||
link.setAttribute("href", src);
|
|
||||||
link.id = src
|
|
||||||
let heads = document.getElementsByTagName("head")
|
|
||||||
if(heads.length){
|
|
||||||
heads[0].appendChild(link)
|
|
||||||
}else{
|
|
||||||
document.documentElement.appendChild(link)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export default load
|
|
|
@ -27,6 +27,13 @@ import JSwitch from './JSwitch.vue'
|
||||||
import JTime from './JTime.vue'
|
import JTime from './JTime.vue'
|
||||||
import JTreeTable from './JTreeTable.vue'
|
import JTreeTable from './JTreeTable.vue'
|
||||||
|
|
||||||
|
//jeecgbiz
|
||||||
|
import JSelectDepart from '../jeecgbiz/JSelectDepart.vue'
|
||||||
|
import JSelectMultiUser from '../jeecgbiz/JSelectMultiUser.vue'
|
||||||
|
import JSelectPosition from '../jeecgbiz/JSelectPosition.vue'
|
||||||
|
import JSelectRole from '../jeecgbiz/JSelectRole.vue'
|
||||||
|
import JSelectUserByDep from '../jeecgbiz/JSelectUserByDep.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
install(Vue) {
|
install(Vue) {
|
||||||
Vue.component('JMarkdownEditor', JMarkdownEditor)
|
Vue.component('JMarkdownEditor', JMarkdownEditor)
|
||||||
|
@ -57,5 +64,12 @@ export default {
|
||||||
Vue.component('JTreeSelect', JTreeSelect)
|
Vue.component('JTreeSelect', JTreeSelect)
|
||||||
Vue.component('JTreeTable', JTreeTable)
|
Vue.component('JTreeTable', JTreeTable)
|
||||||
Vue.component('JUpload', JUpload)
|
Vue.component('JUpload', JUpload)
|
||||||
|
|
||||||
|
//jeecgbiz
|
||||||
|
Vue.component('JSelectDepart', JSelectDepart)
|
||||||
|
Vue.component('JSelectMultiUser', JSelectMultiUser)
|
||||||
|
Vue.component('JSelectPosition', JSelectPosition)
|
||||||
|
Vue.component('JSelectRole', JSelectRole)
|
||||||
|
Vue.component('JSelectUserByDep', JSelectUserByDep)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -14,7 +14,6 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import JUpload from '@/components/jeecg/JUpload'
|
|
||||||
import { getFileAccessHttpUrl } from '@/api/manage';
|
import { getFileAccessHttpUrl } from '@/api/manage';
|
||||||
|
|
||||||
const getFileName=(path)=>{
|
const getFileName=(path)=>{
|
||||||
|
@ -27,7 +26,7 @@
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'JFilePop',
|
name: 'JFilePop',
|
||||||
components: { JUpload },
|
components: { },
|
||||||
props:{
|
props:{
|
||||||
title:{
|
title:{
|
||||||
type:String,
|
type:String,
|
||||||
|
|
|
@ -121,7 +121,7 @@
|
||||||
},
|
},
|
||||||
cgRpConfigId:"",
|
cgRpConfigId:"",
|
||||||
modalWidth:MODAL_WIDTH,
|
modalWidth:MODAL_WIDTH,
|
||||||
tableScroll:{x:MODAL_WIDTH-100},
|
tableScroll:{x:true},
|
||||||
dynamicParam:{}
|
dynamicParam:{}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,11 @@
|
||||||
customReturnField: {
|
customReturnField: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'id'
|
default: 'id'
|
||||||
|
},
|
||||||
|
backDepart: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
required: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
|
@ -90,6 +95,24 @@
|
||||||
}).join(',')
|
}).join(',')
|
||||||
}
|
}
|
||||||
//update-end-author:lvdandan date:20200513 for:TESTA-438 部门选择组件自定义返回值,数据无法回填
|
//update-end-author:lvdandan date:20200513 for:TESTA-438 部门选择组件自定义返回值,数据无法回填
|
||||||
|
this.backDeparInfo()
|
||||||
|
},
|
||||||
|
//返回选中的部门信息
|
||||||
|
backDeparInfo(){
|
||||||
|
if(this.backDepart===true){
|
||||||
|
if(this.departIds && this.departIds.length>0){
|
||||||
|
let arr1 = this.departIds.split(',')
|
||||||
|
let arr2 = this.departNames.split(',')
|
||||||
|
let info = []
|
||||||
|
for(let i=0;i<arr1.length;i++){
|
||||||
|
info.push({
|
||||||
|
value: arr1[i],
|
||||||
|
text: arr2[i]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.$emit('back', info)
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
openModal(){
|
openModal(){
|
||||||
this.$refs.innerDepartSelectModal.show()
|
this.$refs.innerDepartSelectModal.show()
|
||||||
|
|
|
@ -38,6 +38,11 @@
|
||||||
default: true,
|
default: true,
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
|
backUser: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
required: false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -61,6 +66,23 @@
|
||||||
initComp(userNames) {
|
initComp(userNames) {
|
||||||
this.userNames = userNames
|
this.userNames = userNames
|
||||||
},
|
},
|
||||||
|
//返回选中的用户信息
|
||||||
|
backDeparInfo(){
|
||||||
|
if(this.backUser===true){
|
||||||
|
if(this.userIds && this.userIds.length>0){
|
||||||
|
let arr1 = this.userIds.split(',')
|
||||||
|
let arr2 = this.userNames.split(',')
|
||||||
|
let info = []
|
||||||
|
for(let i=0;i<arr1.length;i++){
|
||||||
|
info.push({
|
||||||
|
value: arr1[i],
|
||||||
|
text: arr2[i]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.$emit('back', info)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
onSearchDepUser() {
|
onSearchDepUser() {
|
||||||
this.$refs.selectModal.showModal()
|
this.$refs.selectModal.showModal()
|
||||||
},
|
},
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
:confirmLoading="confirmLoading"
|
:confirmLoading="confirmLoading"
|
||||||
@ok="handleSubmit"
|
@ok="handleSubmit"
|
||||||
@cancel="handleCancel"
|
@cancel="handleCancel"
|
||||||
|
wrapClassName="j-depart-select-modal"
|
||||||
switchFullscreen
|
switchFullscreen
|
||||||
cancelText="关闭">
|
cancelText="关闭">
|
||||||
<a-spin tip="Loading..." :spinning="false">
|
<a-spin tip="Loading..." :spinning="false">
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
:title="title"
|
:title="title"
|
||||||
switchFullscreen
|
switchFullscreen
|
||||||
|
wrapClassName="j-user-select-modal"
|
||||||
@ok="handleSubmit"
|
@ok="handleSubmit"
|
||||||
@cancel="close"
|
@cancel="close"
|
||||||
style="top:50px"
|
style="top:50px"
|
||||||
|
|
|
@ -19,14 +19,14 @@
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
</a-tabs>
|
</a-tabs>
|
||||||
<div style="margin: 12px 12px 0;">
|
<div style="margin: 12px 12px 0;">
|
||||||
<transition name="page-toggle">
|
<!-- update-begin-author:taoyan date:20201221 for:此处删掉transition标签 不知道为什么加上后 页面路由切换的时候即1及菜单切到2及菜单的时候 两个菜单页面会同时出现300-500秒左右 -->
|
||||||
<keep-alive v-if="multipage">
|
<keep-alive v-if="multipage">
|
||||||
<router-view v-if="reloadFlag"/>
|
<router-view v-if="reloadFlag"/>
|
||||||
</keep-alive>
|
</keep-alive>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<router-view v-if="reloadFlag"/>
|
<router-view v-if="reloadFlag"/>
|
||||||
</template>
|
</template>
|
||||||
</transition>
|
<!-- update-end-author:taoyan date:20201221 for:此处删掉transition标签 不知道为什么加上后 页面路由切换的时候即1及菜单切到2及菜单的时候 两个菜单页面会同时出现300-500秒左右 -->
|
||||||
</div>
|
</div>
|
||||||
</global-layout>
|
</global-layout>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -54,6 +54,10 @@ import {
|
||||||
Carousel,
|
Carousel,
|
||||||
Pagination,
|
Pagination,
|
||||||
FormModel,
|
FormModel,
|
||||||
|
Cascader,
|
||||||
|
Slider,
|
||||||
|
Transfer,
|
||||||
|
Rate
|
||||||
} from 'ant-design-vue'
|
} from 'ant-design-vue'
|
||||||
import Viser from 'viser-vue'
|
import Viser from 'viser-vue'
|
||||||
|
|
||||||
|
@ -104,6 +108,10 @@ Vue.use(TreeSelect)
|
||||||
Vue.use(Carousel)
|
Vue.use(Carousel)
|
||||||
Vue.use(Pagination)
|
Vue.use(Pagination)
|
||||||
Vue.use(FormModel)
|
Vue.use(FormModel)
|
||||||
|
Vue.use(Cascader)
|
||||||
|
Vue.use(Slider)
|
||||||
|
Vue.use(Transfer)
|
||||||
|
Vue.use(Rate)
|
||||||
|
|
||||||
Vue.prototype.$confirm = Modal.confirm
|
Vue.prototype.$confirm = Modal.confirm
|
||||||
Vue.prototype.$message = message
|
Vue.prototype.$message = message
|
||||||
|
|
|
@ -136,41 +136,8 @@
|
||||||
background-color: #999999;
|
background-color: #999999;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
background-color: rgb(48, 65, 86);
|
|
||||||
/deep/ .ant-menu-submenu-title:hover{
|
|
||||||
background-color: #263445;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-item:hover{
|
|
||||||
background-color: #263445;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-item-selected {
|
|
||||||
background-color: #263445;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-item-selected i{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-item-selected span{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-inline.ant-menu-sub{
|
|
||||||
background-color: #1f2d3d;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-inline.ant-menu-sub li:hover{
|
|
||||||
background-color: #1f2d3d;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-inline.ant-menu-sub .ant-menu-submenu-title:hover{
|
|
||||||
background-color: #1f2d3d;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-inline.ant-menu-sub .ant-menu-item-selected{
|
|
||||||
background-color: #1f2d3d;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-inline.ant-menu-sub .ant-menu-item-selected span{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-inline.ant-menu-sub .ant-menu-item-selected i{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update_end author:sunjianlei date:20190509 for: 修改侧边导航栏滚动条的样式 */
|
/* update_end author:sunjianlei date:20190509 for: 修改侧边导航栏滚动条的样式 */
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
<user-menu class="header-index-right" :theme="theme" :style="topMenuStyle.headerIndexRight"/>
|
<user-menu class="header-index-right" :theme="theme" :style="topMenuStyle.headerIndexRight"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</a-layout-header>
|
</a-layout-header>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
@ -528,43 +528,8 @@
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
/deep/ .ant-menu-dark{
|
|
||||||
background-color: rgb(48, 65, 86);
|
|
||||||
/deep/ .ant-menu-submenu:hover{
|
|
||||||
background-color: #263445;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-item:hover{
|
|
||||||
background-color: #263445;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu.ant-menu-dark .ant-menu-item-selected{
|
|
||||||
background-color: #263445;
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu.ant-menu-dark .ant-menu-item-selected i{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu.ant-menu-dark .ant-menu-item-selected span{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
/deep/ .ant-menu-dark .ant-menu-submenu-active{
|
|
||||||
color: #FFFFFF !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.dark.header-index-right{
|
|
||||||
background-color: rgb(48, 65, 86) !important;
|
|
||||||
}
|
|
||||||
.layout .top-nav-header-index.dark .user-wrapper .action:hover{
|
|
||||||
background-color: #263445 !important;
|
|
||||||
}
|
|
||||||
.layout .top-nav-header-index .dark .user-wrapper .action i{
|
|
||||||
color: #FFFFFF !important;
|
|
||||||
}
|
|
||||||
.layout .top-nav-header-index .user-wrapper .action .anticon{
|
|
||||||
color: inherit !important;
|
|
||||||
}
|
|
||||||
.dark.ant-dropdown-menu{
|
|
||||||
background-color: #999999;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// drawer-sider 自定义
|
// drawer-sider 自定义
|
||||||
.ant-drawer.drawer-sider {
|
.ant-drawer.drawer-sider {
|
||||||
.sider {
|
.sider {
|
||||||
|
@ -715,22 +680,4 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.ant-menu-dark .ant-menu-vertical.ant-menu-sub li:hover{
|
|
||||||
background-color: #001528;
|
|
||||||
}
|
|
||||||
.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected{
|
|
||||||
background-color: #001528 !important;
|
|
||||||
}
|
|
||||||
.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected span{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected i{
|
|
||||||
color: rgb(24, 144, 255);
|
|
||||||
}
|
|
||||||
.ant-menu-dark .ant-menu-sub{
|
|
||||||
background: #1f2d3d !important;
|
|
||||||
.ant-menu-submenu-open,.ant-menu-submenu-active{
|
|
||||||
color: #FFFFFF !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
:closable="false"
|
:closable="false"
|
||||||
@close="onClose"
|
@close="onClose"
|
||||||
:visible="visible"
|
:visible="visible"
|
||||||
:style="{}"
|
style="height: 100%;overflow: auto;"
|
||||||
>
|
>
|
||||||
<div class="setting-drawer-index-content">
|
<div class="setting-drawer-index-content">
|
||||||
|
|
||||||
|
@ -178,19 +178,12 @@
|
||||||
mixins: [mixin, mixinDevice],
|
mixins: [mixin, mixinDevice],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
visible: true,
|
visible: false,
|
||||||
colorList,
|
colorList,
|
||||||
dataFixSiderbar: false
|
dataFixSiderbar: false
|
||||||
}
|
}
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
|
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
const vm = this
|
|
||||||
setTimeout(() => {
|
|
||||||
vm.visible = false
|
|
||||||
}, 16)
|
|
||||||
// 当主题色不是默认色时,才进行主题编译
|
// 当主题色不是默认色时,才进行主题编译
|
||||||
if (this.primaryColor !== config.primaryColor) {
|
if (this.primaryColor !== config.primaryColor) {
|
||||||
updateTheme(this.primaryColor)
|
updateTheme(this.primaryColor)
|
||||||
|
|
|
@ -50,6 +50,7 @@ export const JEditableTableMixin = {
|
||||||
add() {
|
add() {
|
||||||
//update-begin-author:lvdandan date:20201113 for:LOWCOD-1049 JEditaTable,子表默认添加一条数据,addDefaultRowNum设置无效 #1930
|
//update-begin-author:lvdandan date:20201113 for:LOWCOD-1049 JEditaTable,子表默认添加一条数据,addDefaultRowNum设置无效 #1930
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
|
this.tableReset();
|
||||||
resolve();
|
resolve();
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
// 默认新增空数据
|
// 默认新增空数据
|
||||||
|
@ -68,6 +69,9 @@ export const JEditableTableMixin = {
|
||||||
},
|
},
|
||||||
/** 当点击了编辑(修改)按钮时调用此方法 */
|
/** 当点击了编辑(修改)按钮时调用此方法 */
|
||||||
edit(record) {
|
edit(record) {
|
||||||
|
if(record && '{}'!=JSON.stringify(record)){
|
||||||
|
this.tableReset();
|
||||||
|
}
|
||||||
if (typeof this.editBefore === 'function') this.editBefore(record)
|
if (typeof this.editBefore === 'function') this.editBefore(record)
|
||||||
this.visible = true
|
this.visible = true
|
||||||
this.activeKey = this.refKeys[0]
|
this.activeKey = this.refKeys[0]
|
||||||
|
@ -78,12 +82,14 @@ export const JEditableTableMixin = {
|
||||||
/** 关闭弹窗,并将所有JEditableTable实例回归到初始状态 */
|
/** 关闭弹窗,并将所有JEditableTable实例回归到初始状态 */
|
||||||
close() {
|
close() {
|
||||||
this.visible = false
|
this.visible = false
|
||||||
this.eachAllTable((item) => {
|
|
||||||
item.initialize()
|
|
||||||
})
|
|
||||||
this.$emit('close')
|
this.$emit('close')
|
||||||
},
|
},
|
||||||
|
//清空子表table的数据
|
||||||
|
tableReset(){
|
||||||
|
this.eachAllTable((item) => {
|
||||||
|
item.clearRow()
|
||||||
|
})
|
||||||
|
},
|
||||||
/** 查询某个tab的数据 */
|
/** 查询某个tab的数据 */
|
||||||
requestSubTableData(url, params, tab, success) {
|
requestSubTableData(url, params, tab, success) {
|
||||||
tab.loading = true
|
tab.loading = true
|
||||||
|
|
|
@ -6,15 +6,13 @@
|
||||||
import { filterObj } from '@/utils/util';
|
import { filterObj } from '@/utils/util';
|
||||||
import { deleteAction, getAction,downFile,getFileAccessHttpUrl } from '@/api/manage'
|
import { deleteAction, getAction,downFile,getFileAccessHttpUrl } from '@/api/manage'
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import { ACCESS_TOKEN } from "@/store/mutation-types"
|
import { ACCESS_TOKEN, TENANT_ID } from "@/store/mutation-types"
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import {Modal} from 'ant-design-vue'
|
import {Modal} from 'ant-design-vue'
|
||||||
|
|
||||||
export const JeecgListMixin = {
|
export const JeecgListMixin = {
|
||||||
data(){
|
data(){
|
||||||
return {
|
return {
|
||||||
//token header
|
|
||||||
tokenHeader: {'X-Access-Token': Vue.ls.get(ACCESS_TOKEN)},
|
|
||||||
/* 查询条件-请不要在queryParam中声明非字符串值的属性 */
|
/* 查询条件-请不要在queryParam中声明非字符串值的属性 */
|
||||||
queryParam: {},
|
queryParam: {},
|
||||||
/* 数据源 */
|
/* 数据源 */
|
||||||
|
@ -62,6 +60,17 @@ export const JeecgListMixin = {
|
||||||
this.initDictConfig();
|
this.initDictConfig();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
//token header
|
||||||
|
tokenHeader(){
|
||||||
|
let head = {'X-Access-Token': Vue.ls.get(ACCESS_TOKEN)}
|
||||||
|
let tenantid = Vue.ls.get(TENANT_ID)
|
||||||
|
if(tenantid){
|
||||||
|
head['tenant_id'] = tenantid
|
||||||
|
}
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
},
|
||||||
methods:{
|
methods:{
|
||||||
loadData(arg) {
|
loadData(arg) {
|
||||||
if(!this.url.list){
|
if(!this.url.list){
|
||||||
|
@ -81,6 +90,8 @@ export const JeecgListMixin = {
|
||||||
if(res.result.total)
|
if(res.result.total)
|
||||||
{
|
{
|
||||||
this.ipagination.total = res.result.total;
|
this.ipagination.total = res.result.total;
|
||||||
|
}else{
|
||||||
|
this.ipagination.total = 0;
|
||||||
}
|
}
|
||||||
//update-end---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------
|
//update-end---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------
|
||||||
}
|
}
|
||||||
|
@ -224,6 +235,8 @@ export const JeecgListMixin = {
|
||||||
modalFormOk() {
|
modalFormOk() {
|
||||||
// 新增/修改 成功时,重载列表
|
// 新增/修改 成功时,重载列表
|
||||||
this.loadData();
|
this.loadData();
|
||||||
|
//清空列表选中
|
||||||
|
this.onClearSelected()
|
||||||
},
|
},
|
||||||
handleDetail:function(record){
|
handleDetail:function(record){
|
||||||
this.$refs.modalForm.edit(record);
|
this.$refs.modalForm.edit(record);
|
||||||
|
@ -278,8 +291,7 @@ export const JeecgListMixin = {
|
||||||
let href = window._CONFIG['domianURL'] + fileUrl
|
let href = window._CONFIG['domianURL'] + fileUrl
|
||||||
this.$warning({
|
this.$warning({
|
||||||
title: message,
|
title: message,
|
||||||
content: (
|
content: (<div>
|
||||||
<div>
|
|
||||||
<span>{msg}</span><br/>
|
<span>{msg}</span><br/>
|
||||||
<span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
|
<span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -155,6 +155,8 @@ const user = {
|
||||||
commit('SET_TOKEN', '')
|
commit('SET_TOKEN', '')
|
||||||
commit('SET_PERMISSIONLIST', [])
|
commit('SET_PERMISSIONLIST', [])
|
||||||
Vue.ls.remove(ACCESS_TOKEN)
|
Vue.ls.remove(ACCESS_TOKEN)
|
||||||
|
Vue.ls.remove(USER_INFO)
|
||||||
|
Vue.ls.remove(USER_NAME)
|
||||||
Vue.ls.remove(UI_CACHE_DB_DICT_DATA)
|
Vue.ls.remove(UI_CACHE_DB_DICT_DATA)
|
||||||
Vue.ls.remove(CACHE_INCLUDED_ROUTES)
|
Vue.ls.remove(CACHE_INCLUDED_ROUTES)
|
||||||
//console.log('logoutToken: '+ logoutToken)
|
//console.log('logoutToken: '+ logoutToken)
|
||||||
|
|
|
@ -21,7 +21,6 @@ export const TENANT_ID = 'TENANT_ID'
|
||||||
export const ONL_AUTH_FIELDS = 'ONL_AUTH_FIELDS'
|
export const ONL_AUTH_FIELDS = 'ONL_AUTH_FIELDS'
|
||||||
//路由缓存问题,关闭了tab页时再打开就不刷新 #842
|
//路由缓存问题,关闭了tab页时再打开就不刷新 #842
|
||||||
export const CACHE_INCLUDED_ROUTES = 'CACHE_INCLUDED_ROUTES'
|
export const CACHE_INCLUDED_ROUTES = 'CACHE_INCLUDED_ROUTES'
|
||||||
|
|
||||||
export const CONTENT_WIDTH_TYPE = {
|
export const CONTENT_WIDTH_TYPE = {
|
||||||
Fluid: 'Fluid',
|
Fluid: 'Fluid',
|
||||||
Fixed: 'Fixed'
|
Fixed: 'Fixed'
|
||||||
|
|
|
@ -17,7 +17,8 @@ const FormTypes = {
|
||||||
radio:'radio',
|
radio:'radio',
|
||||||
checkbox_meta:"checkbox_meta",
|
checkbox_meta:"checkbox_meta",
|
||||||
input_pop:'input_pop',
|
input_pop:'input_pop',
|
||||||
|
sel_depart: 'sel_depart',
|
||||||
|
sel_user: 'sel_user',
|
||||||
slot: 'slot',
|
slot: 'slot',
|
||||||
hidden: 'hidden'
|
hidden: 'hidden'
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,6 +206,37 @@ export function getNoAuthCols(pre){
|
||||||
return cols;
|
return cols;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将Online的行编辑按钮权限,添加至本地存储
|
||||||
|
*/
|
||||||
|
export function addOnlineBtAuth2Storage(pre, authList){
|
||||||
|
let allAuthList = JSON.parse(sessionStorage.getItem(SYS_BUTTON_AUTH) || "[]");
|
||||||
|
let newAuthList = allAuthList.filter(item=>{
|
||||||
|
if(!item.action){
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return item.action.indexOf(pre)<0
|
||||||
|
})
|
||||||
|
if(authList && authList.length>0){
|
||||||
|
for(let item of authList){
|
||||||
|
newAuthList.push({
|
||||||
|
action: pre+item,
|
||||||
|
type:1,
|
||||||
|
status:1
|
||||||
|
})
|
||||||
|
}
|
||||||
|
let temp = JSON.parse(sessionStorage.getItem(USER_AUTH) || "[]");
|
||||||
|
let newArr = temp.filter(item=>{
|
||||||
|
if(!item.action){
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return item.action.indexOf(pre)<0 || authList.indexOf(item.action.replace(pre, ''))<0
|
||||||
|
})
|
||||||
|
sessionStorage.setItem(USER_AUTH, JSON.stringify(newArr))
|
||||||
|
}
|
||||||
|
sessionStorage.setItem(SYS_BUTTON_AUTH, JSON.stringify(newAuthList))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -108,6 +108,7 @@ export function filterGlobalPermission(el, binding, vnode) {
|
||||||
}
|
}
|
||||||
let permissions = [];
|
let permissions = [];
|
||||||
for (let item of permissionList) {
|
for (let item of permissionList) {
|
||||||
|
//权限策略1显示2禁用
|
||||||
if(item.type != '2'){
|
if(item.type != '2'){
|
||||||
//update--begin--autor:wangshuai-----date:20200729------for:按钮权限,授权标识的提示信息是多个用逗号分隔逻辑处理 gitee#I1OUGU-------
|
//update--begin--autor:wangshuai-----date:20200729------for:按钮权限,授权标识的提示信息是多个用逗号分隔逻辑处理 gitee#I1OUGU-------
|
||||||
if(item.action){
|
if(item.action){
|
||||||
|
|
|
@ -22,7 +22,6 @@ const service = axios.create({
|
||||||
|
|
||||||
const err = (error) => {
|
const err = (error) => {
|
||||||
if (error.response) {
|
if (error.response) {
|
||||||
let that=this;
|
|
||||||
let data = error.response.data
|
let data = error.response.data
|
||||||
const token = Vue.ls.get(ACCESS_TOKEN)
|
const token = Vue.ls.get(ACCESS_TOKEN)
|
||||||
console.log("------异常响应------",token)
|
console.log("------异常响应------",token)
|
||||||
|
|
|
@ -145,6 +145,7 @@ function generateChildRouters (data) {
|
||||||
component: componentPath,
|
component: componentPath,
|
||||||
//component: resolve => require(['@/' + component+'.vue'], resolve),
|
//component: resolve => require(['@/' + component+'.vue'], resolve),
|
||||||
hidden:item.hidden,
|
hidden:item.hidden,
|
||||||
|
//component:()=> import(`@/views/${item.component}.vue`),
|
||||||
meta: {
|
meta: {
|
||||||
title:item.meta.title ,
|
title:item.meta.title ,
|
||||||
icon: item.meta.icon,
|
icon: item.meta.icon,
|
||||||
|
@ -539,4 +540,24 @@ export function getVmParentByName(vm, name) {
|
||||||
*/
|
*/
|
||||||
export function neverNull(value, def) {
|
export function neverNull(value, def) {
|
||||||
return value == null ? (neverNull(def, '')) : value
|
return value == null ? (neverNull(def, '')) : value
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据元素值移除数组中的一个元素
|
||||||
|
* @param array 数组
|
||||||
|
* @param prod 属性名
|
||||||
|
* @param value 属性值
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export function removeArrayElement(array, prod, value) {
|
||||||
|
let index = -1
|
||||||
|
for(let i = 0;i<array.length;i++){
|
||||||
|
if(array[i][prod] == value){
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(index>=0){
|
||||||
|
array.splice(index, 1);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -134,7 +134,7 @@
|
||||||
title: '下拉框_多选',
|
title: '下拉框_多选',
|
||||||
key: 'select_multiple',
|
key: 'select_multiple',
|
||||||
type: JVXETypes.selectMultiple,
|
type: JVXETypes.selectMultiple,
|
||||||
width: '180px',
|
width: '205px',
|
||||||
options: [
|
options: [
|
||||||
{title: 'String', value: 'string'},
|
{title: 'String', value: 'string'},
|
||||||
{title: 'Integer', value: 'int'},
|
{title: 'Integer', value: 'int'},
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
placeholder="请做出你的选择"
|
placeholder="请做出你的选择"
|
||||||
v-model="formData.asyncSelectValue"
|
v-model="formData.asyncSelectValue"
|
||||||
dict="sys_depart,depart_name,id"
|
dict="sys_depart,depart_name,id"
|
||||||
|
:pageSize="6"
|
||||||
:async="true">
|
:async="true">
|
||||||
</j-search-select-tag>
|
</j-search-select-tag>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
@ -130,7 +131,7 @@
|
||||||
<a-row :gutter="24">
|
<a-row :gutter="24">
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="选择职务">
|
<a-form-item label="选择职务">
|
||||||
<j-select-position :buttons="false" :disabled="true" v-model="formData.selectPosition" />
|
<j-select-position :buttons="false" v-model="formData.selectPosition" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="12">选中值:{{ formData.selectPosition}}</a-col>
|
<a-col :span="12">选中值:{{ formData.selectPosition}}</a-col>
|
||||||
|
@ -362,10 +363,10 @@
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="特殊查询组件">
|
<a-form-item label="特殊查询组件">
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="16">
|
<a-col :span="15">
|
||||||
<j-input v-model="formData.jInput" :type="jInput.type"/>
|
<j-input v-model="formData.jInput" :type="jInput.type"/>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="3" style="text-align: right;" >查询类型:</a-col>
|
<a-col :span="4" style="text-align: right;" >查询类型:</a-col>
|
||||||
<a-col :span="5">
|
<a-col :span="5">
|
||||||
<a-select v-model="jInput.type" :options="jInput.options"></a-select>
|
<a-select v-model="jInput.type" :options="jInput.options"></a-select>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
<template>
|
<template>
|
||||||
<a-card :bordered="false">
|
<a-card :bordered="false">
|
||||||
<a-form @submit="handleSubmit" :form="form">
|
<a-form @submit="handleSubmit" :form="form">
|
||||||
|
<a-row>
|
||||||
<a-col :md="24" :sm="24">
|
<a-col :md="24" :sm="24">
|
||||||
<a-form-item label="Note" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }">
|
<a-form-item label="Note" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }">
|
||||||
<a-input v-decorator="['note',{rules: [{ required: true, message: 'Please input your note!' }]}]"/>
|
<a-input v-decorator="['note',{rules: [{ required: true, message: 'Please input your note!' }]}]"/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
<a-col :md="24" :sm="24">
|
<a-col :md="24" :sm="24">
|
||||||
<a-form-item label="Gender" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }">
|
<a-form-item label="Gender" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }">
|
||||||
<a-select v-decorator="['gender',{rules: [{ required: true, message: 'Please select your gender!' }]}]" placeholder="Select a option and change input text above" @change="this.handleSelectChange">
|
<a-select v-decorator="['gender',{rules: [{ required: true, message: 'Please select your gender!' }]}]" placeholder="Select a option and change input text above" @change="this.handleSelectChange">
|
||||||
|
@ -14,11 +17,14 @@
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row>
|
||||||
<a-col :md="24" :sm="24">
|
<a-col :md="24" :sm="24">
|
||||||
<a-form-item label="Gender" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }">
|
<a-form-item label="Gender" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }">
|
||||||
<a-cascader :options="areaOptions" @change="onChange" :showSearch="{filter}" placeholder="Please select" />
|
<a-cascader :options="areaOptions" @change="onChange" :showSearch="{filter}" placeholder="Please select" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
</a-row>
|
||||||
<a-form-item :wrapperCol="{ span: 12, offset: 5 }">
|
<a-form-item :wrapperCol="{ span: 12, offset: 5 }">
|
||||||
<a-col :md="24" :sm="24">
|
<a-col :md="24" :sm="24">
|
||||||
<a-form-item :wrapperCol="{ span: 12, offset: 5 }">
|
<a-form-item :wrapperCol="{ span: 12, offset: 5 }">
|
||||||
|
|
|
@ -167,6 +167,9 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
getQueryParams() {
|
getQueryParams() {
|
||||||
|
//update--begin--autor:wangshuai-----date:20191204------for:清空总条数 teambition JT-113------
|
||||||
|
this.ipagination.total=0;
|
||||||
|
//update--end--autor:wangshuai-----date:20191204------for:清空总条数 teambition JT-113------
|
||||||
var param = Object.assign({}, this.queryParam);
|
var param = Object.assign({}, this.queryParam);
|
||||||
param.dictId = this.dictId;
|
param.dictId = this.dictId;
|
||||||
param.field = this.getQueryField();
|
param.field = this.getQueryField();
|
||||||
|
|
|
@ -192,12 +192,14 @@
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
let childrenMap = res.result
|
let childrenMap = res.result
|
||||||
let fn = (list) => {
|
let fn = (list) => {
|
||||||
list.forEach(data => {
|
if(list&&list.length>0){
|
||||||
if (this.expandedRowKeys.includes(data.id)) {
|
list.forEach(data => {
|
||||||
data.children = childrenMap[data.id]
|
if (this.expandedRowKeys.includes(data.id)) {
|
||||||
fn(data.children)
|
data.children = childrenMap[data.id]
|
||||||
}
|
fn(data.children)
|
||||||
})
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fn(dataList)
|
fn(dataList)
|
||||||
}
|
}
|
||||||
|
|
|
@ -283,6 +283,12 @@
|
||||||
syncHeadNotic(anntId){
|
syncHeadNotic(anntId){
|
||||||
getAction("sys/annountCement/syncNotic",{anntId:anntId})
|
getAction("sys/annountCement/syncNotic",{anntId:anntId})
|
||||||
},
|
},
|
||||||
|
handleDetail:function(record){
|
||||||
|
this.$refs.modalForm.edit(record);
|
||||||
|
this.$refs.modalForm.title="详情";
|
||||||
|
this.$refs.modalForm.disableSubmit = true;
|
||||||
|
this.$refs.modalForm.disabled = true;
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -91,6 +91,7 @@
|
||||||
url: {
|
url: {
|
||||||
list: "/sys/category/rootList",
|
list: "/sys/category/rootList",
|
||||||
childList: "/sys/category/childList",
|
childList: "/sys/category/childList",
|
||||||
|
getChildListBatch: "/sys/category/getChildListBatch",
|
||||||
delete: "/sys/category/delete",
|
delete: "/sys/category/delete",
|
||||||
deleteBatch: "/sys/category/deleteBatch",
|
deleteBatch: "/sys/category/deleteBatch",
|
||||||
exportXlsUrl: "/sys/category/exportXls",
|
exportXlsUrl: "/sys/category/exportXls",
|
||||||
|
@ -125,7 +126,6 @@
|
||||||
this.ipagination.current=1
|
this.ipagination.current=1
|
||||||
}
|
}
|
||||||
this.loading = true
|
this.loading = true
|
||||||
this.expandedRowKeys = []
|
|
||||||
let params = this.getQueryParams()
|
let params = this.getQueryParams()
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
getAction(this.url.list,params).then(res=>{
|
getAction(this.url.list,params).then(res=>{
|
||||||
|
@ -134,7 +134,9 @@
|
||||||
if(Number(result.total)>0){
|
if(Number(result.total)>0){
|
||||||
this.ipagination.total = Number(result.total)
|
this.ipagination.total = Number(result.total)
|
||||||
this.dataSource = this.getDataByResult(res.result.records)
|
this.dataSource = this.getDataByResult(res.result.records)
|
||||||
resolve()
|
//update--begin--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息
|
||||||
|
return this.loadDataByExpandedRows(this.dataSource)
|
||||||
|
//update--end--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息
|
||||||
}else{
|
}else{
|
||||||
this.ipagination.total=0
|
this.ipagination.total=0
|
||||||
this.dataSource=[]
|
this.dataSource=[]
|
||||||
|
@ -142,6 +144,7 @@
|
||||||
}else{
|
}else{
|
||||||
this.$message.warning(res.message)
|
this.$message.warning(res.message)
|
||||||
}
|
}
|
||||||
|
}).finally(()=>{
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -265,15 +268,9 @@
|
||||||
let that = this;
|
let that = this;
|
||||||
deleteAction(that.url.delete, {id: record.id}).then((res) => {
|
deleteAction(that.url.delete, {id: record.id}).then((res) => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
if (record.pid && record.pid!='0') {
|
//update--begin--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息
|
||||||
let formData = {pid: record.pid};
|
that.loadData();
|
||||||
that.$message.success(res.message);
|
//update--end--autor:lvdandan-----date:20201204------for:JT-31 删除成功后默认展开已展开信息
|
||||||
that.subExpandedKeys = [];
|
|
||||||
that.getExpandKeysByPid(record.pid, this.dataSource, this.dataSource)
|
|
||||||
that.addOk(formData, this.subExpandedKeys.reverse())
|
|
||||||
} else {
|
|
||||||
that.loadData();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
that.$message.warning(res.message);
|
that.$message.warning(res.message);
|
||||||
}
|
}
|
||||||
|
@ -292,6 +289,43 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// 根据已展开的行查询数据(用于保存后刷新时异步加载子级的数据)
|
||||||
|
loadDataByExpandedRows(dataList) {
|
||||||
|
if (this.expandedRowKeys.length > 0) {
|
||||||
|
return getAction(this.url.getChildListBatch,{ parentIds: this.expandedRowKeys.join(',') }).then(res=>{
|
||||||
|
if (res.success && res.result.records.length>0) {
|
||||||
|
//已展开的数据批量子节点
|
||||||
|
let records = res.result.records
|
||||||
|
const listMap = new Map();
|
||||||
|
for (let item of records) {
|
||||||
|
let pid = item[this.pidField];
|
||||||
|
if (this.expandedRowKeys.join(',').includes(pid)) {
|
||||||
|
let mapList = listMap.get(pid);
|
||||||
|
if (mapList == null) {
|
||||||
|
mapList = [];
|
||||||
|
}
|
||||||
|
mapList.push(item);
|
||||||
|
listMap.set(pid, mapList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let childrenMap = listMap;
|
||||||
|
let fn = (list) => {
|
||||||
|
if(list) {
|
||||||
|
list.forEach(data => {
|
||||||
|
if (this.expandedRowKeys.includes(data.id)) {
|
||||||
|
data.children = this.getDataByResult(childrenMap.get(data.id))
|
||||||
|
fn(data.children)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn(dataList)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return Promise.resolve()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,7 +162,7 @@
|
||||||
delete: '/sys/position/delete',
|
delete: '/sys/position/delete',
|
||||||
deleteBatch: '/sys/position/deleteBatch',
|
deleteBatch: '/sys/position/deleteBatch',
|
||||||
exportXlsUrl: '/sys/position/exportXls',
|
exportXlsUrl: '/sys/position/exportXls',
|
||||||
importExcelUrl: '/sys/position/importExcel',
|
importExcelUrl: 'sys/position/importExcel',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
<a-form-item label="性别">
|
<a-form-item label="性别">
|
||||||
<a-select v-model="queryParam.sex" placeholder="请选择性别">
|
<a-select v-model="queryParam.sex" placeholder="请选择性别">
|
||||||
<a-select-option value="">请选择</a-select-option>
|
<a-select-option value="">请选择</a-select-option>
|
||||||
<a-select-option value="1">男性</a-select-option>
|
<a-select-option value="1">男</a-select-option>
|
||||||
<a-select-option value="2">女性</a-select-option>
|
<a-select-option value="2">女</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
|
|
||||||
<!-- 操作按钮区域 -->
|
<!-- 操作按钮区域 -->
|
||||||
<div class="table-operator" style="border-top: 5px">
|
<div class="table-operator" style="border-top: 5px">
|
||||||
<a-button @click="handleAdd" type="primary" icon="plus">添加用户</a-button>
|
<a-button @click="handleAdd" type="primary" icon="plus" >添加用户</a-button>
|
||||||
<a-button type="primary" icon="download" @click="handleExportXls('用户信息')">导出</a-button>
|
<a-button type="primary" icon="download" @click="handleExportXls('用户信息')">导出</a-button>
|
||||||
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
|
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
|
||||||
<a-button type="primary" icon="import">导入</a-button>
|
<a-button type="primary" icon="import">导入</a-button>
|
||||||
|
@ -120,7 +120,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<span slot="action" slot-scope="text, record">
|
<span slot="action" slot-scope="text, record">
|
||||||
<a @click="handleEdit(record)">编辑</a>
|
<a @click="handleEdit(record)" >编辑</a>
|
||||||
|
|
||||||
<a-divider type="vertical"/>
|
<a-divider type="vertical"/>
|
||||||
|
|
||||||
|
@ -154,7 +154,6 @@
|
||||||
<a>解冻</a>
|
<a>解冻</a>
|
||||||
</a-popconfirm>
|
</a-popconfirm>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
|
|
||||||
</a-menu>
|
</a-menu>
|
||||||
</a-dropdown>
|
</a-dropdown>
|
||||||
</span>
|
</span>
|
||||||
|
@ -165,7 +164,8 @@
|
||||||
<!-- table区域-end -->
|
<!-- table区域-end -->
|
||||||
|
|
||||||
<user-modal ref="modalForm" @ok="modalFormOk"></user-modal>
|
<user-modal ref="modalForm" @ok="modalFormOk"></user-modal>
|
||||||
<password-modal ref="passwordmodal"></password-modal>
|
|
||||||
|
<password-modal ref="passwordmodal" @ok="passwordModalOk"></password-modal>
|
||||||
|
|
||||||
<!-- 用户回收站 -->
|
<!-- 用户回收站 -->
|
||||||
<user-recycle-bin-modal :visible.sync="recycleBinVisible" @ok="modalFormOk"/>
|
<user-recycle-bin-modal :visible.sync="recycleBinVisible" @ok="modalFormOk"/>
|
||||||
|
@ -179,7 +179,6 @@
|
||||||
import {putAction,getFileAccessHttpUrl} from '@/api/manage';
|
import {putAction,getFileAccessHttpUrl} from '@/api/manage';
|
||||||
import {frozenBatch} from '@/api/api'
|
import {frozenBatch} from '@/api/api'
|
||||||
import {JeecgListMixin} from '@/mixins/JeecgListMixin'
|
import {JeecgListMixin} from '@/mixins/JeecgListMixin'
|
||||||
import SysUserAgentModal from "./modules/SysUserAgentModal";
|
|
||||||
import JInput from '@/components/jeecg/JInput'
|
import JInput from '@/components/jeecg/JInput'
|
||||||
import UserRecycleBinModal from './modules/UserRecycleBinModal'
|
import UserRecycleBinModal from './modules/UserRecycleBinModal'
|
||||||
import JSuperQuery from '@/components/jeecg/JSuperQuery'
|
import JSuperQuery from '@/components/jeecg/JSuperQuery'
|
||||||
|
@ -188,7 +187,6 @@
|
||||||
name: "UserList",
|
name: "UserList",
|
||||||
mixins: [JeecgListMixin],
|
mixins: [JeecgListMixin],
|
||||||
components: {
|
components: {
|
||||||
SysUserAgentModal,
|
|
||||||
UserModal,
|
UserModal,
|
||||||
PasswordModal,
|
PasswordModal,
|
||||||
JInput,
|
JInput,
|
||||||
|
@ -368,6 +366,9 @@
|
||||||
handleChangePassword(username) {
|
handleChangePassword(username) {
|
||||||
this.$refs.passwordmodal.show(username);
|
this.$refs.passwordmodal.show(username);
|
||||||
},
|
},
|
||||||
|
passwordModalOk() {
|
||||||
|
//TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
<script>
|
<script>
|
||||||
import pick from 'lodash.pick'
|
import pick from 'lodash.pick'
|
||||||
import {addDictItem, editDictItem} from '@/api/api'
|
import {addDictItem, editDictItem} from '@/api/api'
|
||||||
|
import { getAction } from '@api/manage'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DictItemModal",
|
name: "DictItemModal",
|
||||||
|
@ -154,12 +155,27 @@
|
||||||
this.visible = false;
|
this.visible = false;
|
||||||
},
|
},
|
||||||
validateItemValue(rule, value, callback){
|
validateItemValue(rule, value, callback){
|
||||||
|
let param = {
|
||||||
|
itemValue:value,
|
||||||
|
dictId:this.dictId,
|
||||||
|
}
|
||||||
|
if(this.model.id){
|
||||||
|
param.id = this.model.id
|
||||||
|
}
|
||||||
if(value){
|
if(value){
|
||||||
let reg=new RegExp("[`_~!@#$^&*()=|{}'.<>《》/?!¥()—【】‘;:”“。,、?]")
|
let reg=new RegExp("[`_~!@#$^&*()=|{}'.<>《》/?!¥()—【】‘;:”“。,、?]")
|
||||||
if(reg.test(value)){
|
if(reg.test(value)){
|
||||||
callback("数据值不能包含特殊字符!")
|
callback("数据值不能包含特殊字符!")
|
||||||
}else{
|
}else{
|
||||||
callback()
|
//update--begin--autor:lvdandan-----date:20201203------for:JT-27【数据字典】字典 - 数据值可重复
|
||||||
|
getAction("/sys/dictItem/dictItemCheck",param).then((res)=>{
|
||||||
|
if(res.success){
|
||||||
|
callback()
|
||||||
|
}else{
|
||||||
|
callback(res.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//update--end--autor:lvdandan-----date:20201203------for:JT-27【数据字典】字典 - 数据值可重复
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
callback()
|
callback()
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
:labelCol="labelCol"
|
:labelCol="labelCol"
|
||||||
:wrapperCol="wrapperCol"
|
:wrapperCol="wrapperCol"
|
||||||
label="授权标识">
|
label="授权标识">
|
||||||
<a-input placeholder="多个用逗号分隔, 如: user:list,user:create" v-decorator="[ 'perms', {rules:[{ required: false, message: '请输入授权标识!' },{validator: this.validatePerms }]}]" :readOnly="disableSubmit"/>
|
<a-input placeholder="请输入授权标识, 如: user:list" v-decorator="[ 'perms', {rules:[{ required: false, message: '请输入授权标识!' },{validator: this.validatePerms }]}]" :readOnly="disableSubmit"/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item
|
<a-form-item
|
||||||
|
@ -427,4 +427,4 @@
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
||||||
</style>
|
</style>
|
|
@ -17,14 +17,14 @@
|
||||||
:labelCol="labelCol"
|
:labelCol="labelCol"
|
||||||
:wrapperCol="wrapperCol"
|
:wrapperCol="wrapperCol"
|
||||||
label="角色名称">
|
label="角色名称">
|
||||||
<a-input placeholder="请输入角色名称" v-decorator.trim="[ 'roleName', validatorRules.roleName]" />
|
<a-input placeholder="请输入角色名称" v-decorator="[ 'roleName', validatorRules.roleName]" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item
|
<a-form-item
|
||||||
:labelCol="labelCol"
|
:labelCol="labelCol"
|
||||||
:wrapperCol="wrapperCol"
|
:wrapperCol="wrapperCol"
|
||||||
label="角色编码">
|
label="角色编码">
|
||||||
<a-input placeholder="请输入角色编码" :disabled="roleDisabled" v-decorator.trim="[ 'roleCode', validatorRules.roleCode]" />
|
<a-input placeholder="请输入角色编码" :disabled="roleDisabled" v-decorator="[ 'roleCode', validatorRules.roleCode]" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item
|
<a-form-item
|
||||||
|
@ -112,6 +112,8 @@
|
||||||
this.form.validateFields((err, values) => {
|
this.form.validateFields((err, values) => {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
that.confirmLoading = true;
|
that.confirmLoading = true;
|
||||||
|
values.roleName = (values.roleName || '').trim()
|
||||||
|
values.roleCode = (values.roleCode || '').trim()
|
||||||
let formData = Object.assign(this.model, values);
|
let formData = Object.assign(this.model, values);
|
||||||
let obj;
|
let obj;
|
||||||
console.log(formData)
|
console.log(formData)
|
||||||
|
|
|
@ -133,18 +133,30 @@
|
||||||
dbDriverMap: {
|
dbDriverMap: {
|
||||||
// MySQL 数据库
|
// MySQL 数据库
|
||||||
'1': { dbDriver: 'com.mysql.jdbc.Driver' },
|
'1': { dbDriver: 'com.mysql.jdbc.Driver' },
|
||||||
|
//MySQL5.7+ 数据库
|
||||||
|
'4': { dbDriver: 'com.mysql.cj.jdbc.Driver' },
|
||||||
// Oracle
|
// Oracle
|
||||||
'2': { dbDriver: 'oracle.jdbc.OracleDriver' },
|
'2': { dbDriver: 'oracle.jdbc.OracleDriver' },
|
||||||
// SQLServer 数据库
|
// SQLServer 数据库
|
||||||
'3': { dbDriver: 'com.microsoft.sqlserver.jdbc.SQLServerDriver' },
|
'3': { dbDriver: 'com.microsoft.sqlserver.jdbc.SQLServerDriver' },
|
||||||
|
// marialDB 数据库
|
||||||
|
'5': { dbDriver: 'org.mariadb.jdbc.Driver' },
|
||||||
|
// postgresql 数据库
|
||||||
|
'6': { dbDriver: 'org.postgresql.Driver' }
|
||||||
},
|
},
|
||||||
dbUrlMap: {
|
dbUrlMap: {
|
||||||
// MySQL 数据库
|
// MySQL 数据库
|
||||||
'1': { dbUrl: 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false' },
|
'1': { dbUrl: 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false' },
|
||||||
|
//MySQL5.7+ 数据库
|
||||||
|
'4': { dbUrl: 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai' },
|
||||||
// Oracle
|
// Oracle
|
||||||
'2': { dbUrl: 'jdbc:oracle:thin:@127.0.0.1:1521:ORCL' },
|
'2': { dbUrl: 'jdbc:oracle:thin:@127.0.0.1:1521:ORCL' },
|
||||||
// SQLServer 数据库
|
// SQLServer 数据库
|
||||||
'3': { dbUrl: 'jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=jeecgboot' }
|
'3': { dbUrl: 'jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=jeecgboot' },
|
||||||
|
// SQLServer 数据库
|
||||||
|
'5': { dbUrl: 'jdbc:mariadb://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useSSL=false' },
|
||||||
|
// SQLServer 数据库
|
||||||
|
'6': { dbUrl: 'jdbc:postgresql://127.0.0.1:5432/jeecg-boot' }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<template slot="title">
|
<template slot="title">
|
||||||
<span>您有多个租户,请选择登录租户</span>
|
<span>您有多个租户,请选择登录租户</span>
|
||||||
</template>
|
</template>
|
||||||
<a-avatar style="backgroundColor:#87d068" icon="gold" />
|
<a-avatar style="backgroundColor:#87d068" icon="gold" />
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
|
|
||||||
<a-select @change="handleTenantChange" :class="{'valid-error':validate_status1=='error'}" placeholder="请选择登录租户" style="margin-left:10px;width: 80%">
|
<a-select @change="handleTenantChange" :class="{'valid-error':validate_status1=='error'}" placeholder="请选择登录租户" style="margin-left:10px;width: 80%">
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<div class="user-login-other">
|
<div class="user-login-other">
|
||||||
<span>其他登录方式</span>
|
<span>其他登录方式</span>
|
||||||
<a @click="onThirdLogin('github')" title="github"><a-icon class="item-icon" type="github"></a-icon></a>
|
<a @click="onThirdLogin('github')" title="github"><a-icon class="item-icon" type="github"></a-icon></a>
|
||||||
<a @click="onThirdLogin('wechat_enterprise')" title="企业微信"><a-icon class="item-icon" type="wechat"></a-icon></a>
|
<a @click="onThirdLogin('wechat_enterprise')" title="企业微信"> <icon-font class="item-icon" type="icon-qiyeweixin3" /></a>
|
||||||
<a @click="onThirdLogin('dingtalk')" title="钉钉"><a-icon class="item-icon" type="dingding"></a-icon></a>
|
<a @click="onThirdLogin('dingtalk')" title="钉钉"><a-icon class="item-icon" type="dingding"></a-icon></a>
|
||||||
<a @click="onThirdLogin('wechat_open')" title="微信"><a-icon class="item-icon" type="wechat"></a-icon></a>
|
<a @click="onThirdLogin('wechat_open')" title="微信"><a-icon class="item-icon" type="wechat"></a-icon></a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -78,9 +78,18 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { JeecgThirdLoginMixin } from '@views/user/third/JeecgThirdLoginMixin'
|
import { JeecgThirdLoginMixin } from '@views/user/third/JeecgThirdLoginMixin'
|
||||||
|
import { Icon } from 'ant-design-vue';
|
||||||
|
|
||||||
|
const IconFont = Icon.createFromIconfontCN({
|
||||||
|
// scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',
|
||||||
|
scriptUrl: '/cdn/font-icon/font_2316098_umqusozousr.js',
|
||||||
|
});
|
||||||
export default {
|
export default {
|
||||||
name: 'thirdLogin',
|
name: 'thirdLogin',
|
||||||
mixins: [JeecgThirdLoginMixin],
|
mixins: [JeecgThirdLoginMixin],
|
||||||
|
components: {
|
||||||
|
IconFont,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -14,14 +14,6 @@ module.exports = {
|
||||||
*/
|
*/
|
||||||
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
|
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
|
||||||
productionSourceMap: false,
|
productionSourceMap: false,
|
||||||
// 多入口配置
|
|
||||||
// pages: {
|
|
||||||
// index: {
|
|
||||||
// entry: 'src/main.js',
|
|
||||||
// template: 'public/index.html',
|
|
||||||
// filename: 'index.html',
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
//打包app时放开该配置
|
//打包app时放开该配置
|
||||||
//publicPath:'./',
|
//publicPath:'./',
|
||||||
configureWebpack: config => {
|
configureWebpack: config => {
|
||||||
|
@ -37,9 +29,6 @@ module.exports = {
|
||||||
.set('@assets', resolve('src/assets'))
|
.set('@assets', resolve('src/assets'))
|
||||||
.set('@comp', resolve('src/components'))
|
.set('@comp', resolve('src/components'))
|
||||||
.set('@views', resolve('src/views'))
|
.set('@views', resolve('src/views'))
|
||||||
.set('@layout', resolve('src/layout'))
|
|
||||||
.set('@static', resolve('src/static'))
|
|
||||||
.set('@mobile', resolve('src/modules/mobile'))
|
|
||||||
|
|
||||||
//生产环境,开启js\css压缩
|
//生产环境,开启js\css压缩
|
||||||
if (process.env.NODE_ENV === 'production') {
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,7 @@
|
||||||
Jeecg-Boot 低代码开发平台
|
Jeecg-Boot 低代码开发平台
|
||||||
===============
|
===============
|
||||||
|
|
||||||
当前最新版本: 2.4.0(发布日期:20201201)
|
当前最新版本: 2.4.2(发布日期:20210126)
|
||||||
|
|
||||||
|
|
||||||
## 后端技术架构
|
## 后端技术架构
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,94 +0,0 @@
|
||||||
|
|
||||||
UPDATE `sys_data_source`
|
|
||||||
SET `id` = '1209779538310004737',
|
|
||||||
`db_password` = 'f5b6775e8d1749483f2320627de0e706'
|
|
||||||
WHERE
|
|
||||||
(`id` = '1209779538310004737');
|
|
||||||
|
|
||||||
delete from `sys_permission` where id='a2b11669e98c5fe54a53c3e3c4f35d14';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `sys_third_account`;
|
|
||||||
CREATE TABLE `sys_third_account` (
|
|
||||||
`id` varchar(32) NOT NULL COMMENT '编号',
|
|
||||||
`sys_user_id` varchar(32) DEFAULT NULL COMMENT '第三方登录id',
|
|
||||||
`third_type` varchar(255) DEFAULT NULL COMMENT '登录来源',
|
|
||||||
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
|
|
||||||
`status` tinyint(1) DEFAULT NULL COMMENT '状态(1-正常,2-冻结)',
|
|
||||||
`del_flag` tinyint(1) DEFAULT NULL COMMENT '删除状态(0-正常,1-已删除)',
|
|
||||||
`realname` varchar(100) DEFAULT NULL COMMENT '真实姓名',
|
|
||||||
`third_user_uuid` varchar(100) DEFAULT NULL COMMENT '第三方账号',
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
||||||
|
|
||||||
ALTER TABLE `sys_user`
|
|
||||||
DROP COLUMN `third_id`,
|
|
||||||
DROP COLUMN `third_type`;
|
|
||||||
|
|
||||||
update sys_permission set component = 'examples/list/UserList' where id = '05b3c82ddb2536a4a5ee1a4c46b5abef';
|
|
||||||
update sys_permission set component = 'examples/list/TableList' where id = '078f9558cdeab239aecb2bda1a8ed0d1';
|
|
||||||
update sys_permission set component = 'examples/list/TableList' where id = '200006f0edf145a2b50eacca07585451';
|
|
||||||
update sys_permission set component = 'examples/form/BasicForm' where id = '277bfabef7d76e89b33062b16a9a5020';
|
|
||||||
update sys_permission set component = 'examples/list/TableList' where id = '418964ba087b90a84897b62474496b93';
|
|
||||||
update sys_permission set component = 'examples/list/RoleList' where id = '4f84f9400e5e92c95f05b554724c2b58';
|
|
||||||
update sys_permission set component = 'examples/form/stepForm/StepForm' where id = '6531cf3421b1265aeeeabaab5e176e6d';
|
|
||||||
update sys_permission set component = 'examples/list/PermissionList' where id = '73678f9daa45ed17a3674131b03432fb';
|
|
||||||
update sys_permission set component = 'examples/list/CardList' where id = '7ac9eb9ccbde2f7a033cd4944272bf1e';
|
|
||||||
update sys_permission set component = 'examples/list/TableInnerEditList' where id = 'ae4fed059f67086fd52a73d913cf473d';
|
|
||||||
update sys_permission set component = 'examples/profile/advanced/Advanced' where id = 'b3c824fc22bd953e2eb16ae6914ac8f9';
|
|
||||||
update sys_permission set component = 'examples/profile/basic/Index' where id = 'cc50656cf9ca528e6f2150eba4714ad2';
|
|
||||||
update sys_permission set component = 'examples/list/TableList' where id = 'de13e0f6328c069748de7399fcc1dbbd';
|
|
||||||
update sys_permission set component = 'examples/form/advancedForm/AdvancedForm' where id = 'e5973686ed495c379d829ea8b2881fc6';
|
|
||||||
update sys_permission set component = 'examples/list/StandardList' where id = 'f23d9bfff4d9aa6b68569ba2cff38415';
|
|
||||||
update sys_permission set component = 'examples/list/search/SearchLayout' where id = 'fb07ca05a3e13674dbf6d3245956da2e';
|
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_route`, `is_leaf`, `keep_alive`, `hidden`, `description`, `status`, `del_flag`, `rule_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `internal_or_external`) VALUES ('1304032910990495745', 'e41b69c57a941a3bbcce45032fe57605', 'AUTO在线表单TAB', '/online/cgformTabList/:code', 'modules/online/cgform/auto/tab/OnlCgformTabList', NULL, NULL, 1, NULL, '1', 8.00, 0, NULL, 1, 1, 0, 1, NULL, '1', 0, 0, 'admin', '2020-09-10 20:24:08', 'admin', '2020-09-10 20:36:37', 0);
|
|
||||||
|
|
||||||
INSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1305827309355302914', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'API', 'api', '', 3, 1, 'admin', '2020-09-15 19:14:26', 'admin', '2020-09-15 19:14:41');
|
|
||||||
|
|
||||||
ALTER TABLE `onl_cgreport_item`
|
|
||||||
ADD COLUMN `is_total` varchar(2) COMMENT '是否合计 0否,1是(仅对数值有效)' AFTER `replace_val`;
|
|
||||||
|
|
||||||
ALTER TABLE `onl_cgform_head`
|
|
||||||
ADD COLUMN `is_des_form` varchar(2) COMMENT '是否用设计器表单' AFTER `theme_template`,
|
|
||||||
ADD COLUMN `des_form_code` varchar(50) COMMENT '设计器表单编码' AFTER `is_des_form`;
|
|
||||||
|
|
||||||
ALTER TABLE `onl_cgreport_item`
|
|
||||||
ADD COLUMN `group_title` varchar(50) COMMENT '分组标题' AFTER `is_total`;
|
|
||||||
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `sys_gateway_route`;
|
|
||||||
CREATE TABLE `sys_gateway_route` (
|
|
||||||
`id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
|
||||||
`router_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路由ID',
|
|
||||||
`name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务名',
|
|
||||||
`uri` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务地址',
|
|
||||||
`predicates` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '断言',
|
|
||||||
`filters` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '过滤器',
|
|
||||||
`retryable` int(3) NULL DEFAULT NULL COMMENT '是否重试:0-否 1-是',
|
|
||||||
`strip_prefix` int(3) NULL DEFAULT NULL COMMENT '是否忽略前缀0-否 1-是',
|
|
||||||
`persist` int(3) NULL DEFAULT NULL COMMENT '是否为保留数据:0-否 1-是',
|
|
||||||
`show_api` int(3) NULL DEFAULT NULL COMMENT '是否在接口文档中展示:0-否 1-是',
|
|
||||||
`status` int(3) NULL DEFAULT NULL COMMENT '状态:0-无效 1-有效',
|
|
||||||
`create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
|
|
||||||
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
|
|
||||||
`update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',
|
|
||||||
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期',
|
|
||||||
`sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门',
|
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
|
||||||
|
|
||||||
-- ----------------------------
|
|
||||||
-- Records of sys_gateway_route
|
|
||||||
-- ----------------------------
|
|
||||||
delete from `sys_gateway_route`;
|
|
||||||
INSERT INTO `sys_gateway_route`(`id`, `router_id`, `name`, `uri`, `predicates`, `filters`, `retryable`, `strip_prefix`, `persist`, `show_api`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`) VALUES ('1331051599401857026', 'jeecg-demo-websocket', 'jeecg-demo-websocket', 'lb:ws://jeecg-demo', '[{\"args\":[\"/vxeSocket/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-24 09:46:46', NULL, NULL, NULL);
|
|
||||||
INSERT INTO `sys_gateway_route`(`id`, `router_id`, `name`, `uri`, `predicates`, `filters`, `retryable`, `strip_prefix`, `persist`, `show_api`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`) VALUES ('jeecg-cloud-websocket', 'jeecg-system-websocket', 'jeecg-system-websocket', 'lb:ws://jeecg-system', '[{\"args\":[\"/websocket/**\",\"/eoaSocket/**\",\"/newsWebsocket/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL);
|
|
||||||
INSERT INTO `sys_gateway_route`(`id`, `router_id`, `name`, `uri`, `predicates`, `filters`, `retryable`, `strip_prefix`, `persist`, `show_api`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`) VALUES ('jeecg-demo', 'jeecg-demo', 'jeecg-demo', 'lb://jeecg-demo', '[{\"args\":[\"/mock/**\",\"/test/**\",\"/bigscreen/template1/**\",\"/bigscreen/template2/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL);
|
|
||||||
INSERT INTO `sys_gateway_route`(`id`, `router_id`, `name`, `uri`, `predicates`, `filters`, `retryable`, `strip_prefix`, `persist`, `show_api`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`) VALUES ('jeecg-system', 'jeecg-system', 'jeecg-system', 'lb://jeecg-system', '[{\"args\":[\"/sys/**\",\"/eoa/**\",\"/joa/**\",\"/online/**\",\"/bigscreen/**\",\"/jmreport/**\",\"/desform/**\",\"/process/**\",\"/act/**\",\"/plug-in/***/\",\"/druid/**\",\"/generic/**\"],\"name\":\"Path\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
INSERT INTO SYS_DICT_ITEM(ID, DICT_ID, ITEM_TEXT, ITEM_VALUE, DESCRIPTION, SORT_ORDER, STATUS, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME) VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7', '4', NULL, '1', '1', 'admin', '2020-12-03 18:16:02', 'admin', '2020-12-03 18:16:02');
|
||||||
|
UPDATE SYS_DICT_ITEM SET ITEM_TEXT = 'MySQL5.5' WHERE ID = '1209733775114702850';
|
||||||
|
UPDATE SYS_DICT_ITEM SET SORT_ORDER = '3' WHERE ID = '1209733839933476865';
|
||||||
|
UPDATE SYS_DICT_ITEM SET SORT_ORDER = '4' WHERE ID = '1209733903020003330';
|
||||||
|
|
||||||
|
ALTER TABLE `sys_gateway_route`
|
||||||
|
CHANGE COLUMN `persist` `persistable` int(3) NULL DEFAULT NULL COMMENT '是否为保留数据:0-否 1-是' AFTER `strip_prefix`;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `test_online_link`;
|
||||||
|
CREATE TABLE `test_online_link` (
|
||||||
|
`id` varchar(32) NOT NULL,
|
||||||
|
`pid` varchar(32) DEFAULT NULL COMMENT 'pid',
|
||||||
|
`name` varchar(255) DEFAULT NULL COMMENT 'name',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
INSERT INTO `test_online_link` VALUES ('1', NULL, '中国');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('10', '8', '庐阳区');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('11', '7', '黄山市');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('2', '1', '山东省');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('3', '2', '济南市');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('4', '3', '历城区');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('5', '3', '长青区');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('6', '2', '青岛市');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('7', '1', '安徽省');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('8', '7', '合肥市');
|
||||||
|
INSERT INTO `test_online_link` VALUES ('9', '8', '包河区');
|
||||||
|
|
||||||
|
update ONL_CGFORM_FIELD set DB_TYPE = 'Date' WHERE DB_TYPE = 'date';
|
File diff suppressed because one or more lines are too long
|
@ -5,7 +5,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>jeecg-boot-base-api</artifactId>
|
<artifactId>jeecg-boot-base-api</artifactId>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<version>2.4.0</version>
|
<version>2.4.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|
|
@ -140,7 +140,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* 15根据业务类型 busType 及业务 busId 修改消息已读
|
* 15根据业务类型 busType 及业务 busId 修改消息已读
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/updateSysAnnounReadFlag")
|
@GetMapping("/sys/api/updateSysAnnounReadFlag")
|
||||||
public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId")String busId);
|
public void updateSysAnnounReadFlag(@RequestParam("busType") String busType, @RequestParam("busId") String busId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 16查询表字典 支持过滤数据
|
* 16查询表字典 支持过滤数据
|
||||||
|
@ -177,7 +177,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/queryAllUser")
|
@GetMapping("/sys/api/queryAllUser")
|
||||||
public JSONObject queryAllUser(@RequestParam(name="userIds",required=false)String userIds, @RequestParam(name="pageNo",required=false) Integer pageNo,@RequestParam(name="pageSize",required=false) int pageSize);
|
public JSONObject queryAllUser(@RequestParam(name = "userIds", required = false) String userIds, @RequestParam(name = "pageNo", required = false) Integer pageNo, @RequestParam(name = "pageSize", required = false) int pageSize);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -186,7 +186,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/queryAllRole")
|
@GetMapping("/sys/api/queryAllRole")
|
||||||
public List<ComboModel> queryAllRole(@RequestParam(name = "roleIds",required = false)String[] roleIds);
|
public List<ComboModel> queryAllRole(@RequestParam(name = "roleIds", required = false) String[] roleIds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 21通过用户账号查询角色Id集合
|
* 21通过用户账号查询角色Id集合
|
||||||
|
@ -194,7 +194,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/getRoleIdsByUsername")
|
@GetMapping("/sys/api/getRoleIdsByUsername")
|
||||||
public List<String> getRoleIdsByUsername(@RequestParam("username")String username);
|
public List<String> getRoleIdsByUsername(@RequestParam("username") String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 22通过部门编号查询部门id
|
* 22通过部门编号查询部门id
|
||||||
|
@ -202,7 +202,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/getDepartIdsByOrgCode")
|
@GetMapping("/sys/api/getDepartIdsByOrgCode")
|
||||||
public String getDepartIdsByOrgCode(@RequestParam("orgCode")String orgCode);
|
public String getDepartIdsByOrgCode(@RequestParam("orgCode") String orgCode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 23查询所有部门
|
* 23查询所有部门
|
||||||
|
@ -217,7 +217,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/getParentDepartId")
|
@GetMapping("/sys/api/getParentDepartId")
|
||||||
DictModel getParentDepartId(@RequestParam("departId")String departId);
|
DictModel getParentDepartId(@RequestParam("departId") String departId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 25根据部门Id获取部门负责人
|
* 25根据部门Id获取部门负责人
|
||||||
|
@ -233,7 +233,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @param cmd
|
* @param cmd
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/sendWebSocketMsg")
|
@GetMapping("/sys/api/sendWebSocketMsg")
|
||||||
public void sendWebSocketMsg(@RequestParam("userIds")String[] userIds, @RequestParam("cmd") String cmd);
|
public void sendWebSocketMsg(@RequestParam("userIds") String[] userIds, @RequestParam("cmd") String cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 27根据id获取所有参与用户
|
* 27根据id获取所有参与用户
|
||||||
|
@ -250,7 +250,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @param userId
|
* @param userId
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/meetingSignWebsocket")
|
@GetMapping("/sys/api/meetingSignWebsocket")
|
||||||
void meetingSignWebsocket(@RequestParam("userId")String userId);
|
void meetingSignWebsocket(@RequestParam("userId") String userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 29根据name获取所有参与用户
|
* 29根据name获取所有参与用户
|
||||||
|
@ -258,7 +258,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/queryUserByNames")
|
@GetMapping("/sys/api/queryUserByNames")
|
||||||
List<LoginUser> queryUserByNames(@RequestParam("userNames")String[] userNames);
|
List<LoginUser> queryUserByNames(@RequestParam("userNames") String[] userNames);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -267,7 +267,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/getUserRoleSet")
|
@GetMapping("/sys/api/getUserRoleSet")
|
||||||
Set<String> getUserRoleSet(@RequestParam("username")String username);
|
Set<String> getUserRoleSet(@RequestParam("username") String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 31获取用户的权限集合
|
* 31获取用户的权限集合
|
||||||
|
@ -308,7 +308,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/queryUserRoles")
|
@GetMapping("/sys/api/queryUserRoles")
|
||||||
Set<String> queryUserRoles(@RequestParam("username")String username);
|
Set<String> queryUserRoles(@RequestParam("username") String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 36查询用户权限信息
|
* 36查询用户权限信息
|
||||||
|
@ -316,7 +316,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/queryUserAuths")
|
@GetMapping("/sys/api/queryUserAuths")
|
||||||
Set<String> queryUserAuths(@RequestParam("username")String username);
|
Set<String> queryUserAuths(@RequestParam("username") String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 37根据 id 查询数据库中存储的 DynamicDataSourceModel
|
* 37根据 id 查询数据库中存储的 DynamicDataSourceModel
|
||||||
|
@ -368,7 +368,7 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/queryPermissionDataRule")
|
@GetMapping("/sys/api/queryPermissionDataRule")
|
||||||
List<SysPermissionDataRuleModel> queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath")String requestPath, @RequestParam("username") String username);
|
List<SysPermissionDataRuleModel> queryPermissionDataRule(@RequestParam("component") String component, @RequestParam("requestPath") String requestPath, @RequestParam("username") String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 43查询用户信息
|
* 43查询用户信息
|
||||||
|
@ -387,10 +387,34 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
List<JSONObject> queryUsersByUsernames(String usernames);
|
List<JSONObject> queryUsersByUsernames(String usernames);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 37根据多个部门编码(逗号分隔),查询返回多个部门信息
|
* 37根据多个用户ID(逗号分隔),查询返回多个用户信息
|
||||||
|
* @param ids
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@GetMapping("/sys/api/queryUsersByIds")
|
||||||
|
List<JSONObject> queryUsersByIds(String ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 38根据多个部门编码(逗号分隔),查询返回多个部门信息
|
||||||
* @param orgCodes
|
* @param orgCodes
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/sys/api/queryDepartsByOrgcodes")
|
@GetMapping("/sys/api/queryDepartsByOrgcodes")
|
||||||
List<JSONObject> queryDepartsByOrgcodes(String orgCodes);
|
List<JSONObject> queryDepartsByOrgcodes(String orgCodes);
|
||||||
|
/**
|
||||||
|
* 39根据多个部门编码(逗号分隔),查询返回多个部门信息
|
||||||
|
* @param ids
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@GetMapping("/sys/api/queryDepartsByOrgIds")
|
||||||
|
List<JSONObject> queryDepartsByOrgIds(String ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 40发送邮件消息
|
||||||
|
* @param email
|
||||||
|
* @param title
|
||||||
|
* @param content
|
||||||
|
*/
|
||||||
|
@GetMapping("/sys/api/sendEmailMsg")
|
||||||
|
void sendEmailMsg(@RequestParam("email") String email, @RequestParam("title") String title, @RequestParam("content") String content);
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,8 +245,22 @@ public class SysBaseAPIFallback implements ISysBaseAPI {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<JSONObject> queryUsersByIds(String ids) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<JSONObject> queryDepartsByOrgcodes(String orgCodes) {
|
public List<JSONObject> queryDepartsByOrgcodes(String orgCodes) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public void sendEmailMsg(String email,String title,String content) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<JSONObject> queryDepartsByOrgIds(String ids) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>jeecg-boot-base-api</artifactId>
|
<artifactId>jeecg-boot-base-api</artifactId>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<version>2.4.0</version>
|
<version>2.4.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|
|
@ -269,10 +269,32 @@ public interface ISysBaseAPI extends CommonAPI {
|
||||||
List<JSONObject> queryUsersByUsernames(String usernames);
|
List<JSONObject> queryUsersByUsernames(String usernames);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 37根据多个部门编码(逗号分隔),查询返回多个部门信息
|
* 37根据多个用户ID(逗号分隔),查询返回多个用户信息
|
||||||
|
* @param ids
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<JSONObject> queryUsersByIds(String ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 38根据多个部门编码(逗号分隔),查询返回多个部门信息
|
||||||
* @param orgCodes
|
* @param orgCodes
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<JSONObject> queryDepartsByOrgcodes(String orgCodes);
|
List<JSONObject> queryDepartsByOrgcodes(String orgCodes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 39根据多个部门id(逗号分隔),查询返回多个部门信息
|
||||||
|
* @param ids
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<JSONObject> queryDepartsByIds(String ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 40发送邮件消息
|
||||||
|
* @param email
|
||||||
|
* @param title
|
||||||
|
* @param content
|
||||||
|
*/
|
||||||
|
void sendEmailMsg(String email,String title,String content);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>jeecg-boot-base</artifactId>
|
<artifactId>jeecg-boot-base</artifactId>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<version>2.4.0</version>
|
<version>2.4.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<artifactId>jeecg-boot-base</artifactId>
|
<artifactId>jeecg-boot-base</artifactId>
|
||||||
<version>2.4.0</version>
|
<version>2.4.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -75,13 +75,6 @@
|
||||||
<artifactId>commons-lang</artifactId>
|
<artifactId>commons-lang</artifactId>
|
||||||
<version>${commons.version}</version>
|
<version>${commons.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 拼音库 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.belerweb</groupId>
|
|
||||||
<artifactId>pinyin4j</artifactId>
|
|
||||||
<version>${pinyin4j.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- freemarker -->
|
<!-- freemarker -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
@ -121,6 +114,7 @@
|
||||||
<groupId>com.microsoft.sqlserver</groupId>
|
<groupId>com.microsoft.sqlserver</groupId>
|
||||||
<artifactId>sqljdbc4</artifactId>
|
<artifactId>sqljdbc4</artifactId>
|
||||||
<version>${sqljdbc4.version}</version>
|
<version>${sqljdbc4.version}</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- oracle驱动 -->
|
<!-- oracle驱动 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -159,7 +153,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hibernate</groupId>
|
<groupId>org.hibernate</groupId>
|
||||||
<artifactId>hibernate-re</artifactId>
|
<artifactId>hibernate-re</artifactId>
|
||||||
<version>2.3.07</version>
|
<version>2.4.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hibernate</groupId>
|
<groupId>org.hibernate</groupId>
|
||||||
|
@ -226,17 +220,6 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.minio</groupId>
|
<groupId>io.minio</groupId>
|
||||||
<artifactId>minio</artifactId>
|
<artifactId>minio</artifactId>
|
||||||
<version>${minio.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>okio</artifactId>
|
|
||||||
<groupId>com.squareup.okio</groupId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>okhttp</artifactId>
|
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
|
@ -260,17 +243,6 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xkcoding.justauth</groupId>
|
<groupId>com.xkcoding.justauth</groupId>
|
||||||
<artifactId>justauth-spring-boot-starter</artifactId>
|
<artifactId>justauth-spring-boot-starter</artifactId>
|
||||||
<version>${justauth-spring-boot-starter.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>hutool-core</artifactId>
|
|
||||||
<groupId>cn.hutool</groupId>
|
|
||||||
</exclusion>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>fastjson</artifactId>
|
|
||||||
<groupId>com.alibaba</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
|
|
|
@ -52,7 +52,7 @@ public interface CacheConstant {
|
||||||
/**
|
/**
|
||||||
* gateway路由缓存
|
* gateway路由缓存
|
||||||
*/
|
*/
|
||||||
public static final String GATEWAY_ROUTES = "geteway_routes";
|
public static final String GATEWAY_ROUTES = "gateway_routes";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.jeecg.common.constant;
|
package org.jeecg.common.constant;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
@ -14,10 +15,6 @@ import java.util.List;
|
||||||
|
|
||||||
@Component("pca")
|
@Component("pca")
|
||||||
public class ProvinceCityArea {
|
public class ProvinceCityArea {
|
||||||
|
|
||||||
@Value("classpath:static/pca.json")
|
|
||||||
private Resource jsonData;
|
|
||||||
|
|
||||||
List<Area> areaList;
|
List<Area> areaList;
|
||||||
|
|
||||||
public String getText(String code){
|
public String getText(String code){
|
||||||
|
@ -57,8 +54,7 @@ public class ProvinceCityArea {
|
||||||
if(this.areaList==null || this.areaList.size()==0){
|
if(this.areaList==null || this.areaList.size()==0){
|
||||||
this.areaList = new ArrayList<Area>();
|
this.areaList = new ArrayList<Area>();
|
||||||
try {
|
try {
|
||||||
File file = jsonData.getFile();
|
String jsonData = oConvertUtils.readStatic("classpath:static/pca.json");
|
||||||
String jsonData = this.jsonRead(file);
|
|
||||||
JSONObject baseJson = JSONObject.parseObject(jsonData);
|
JSONObject baseJson = JSONObject.parseObject(jsonData);
|
||||||
//第一层 省
|
//第一层 省
|
||||||
JSONObject provinceJson = baseJson.getJSONObject("86");
|
JSONObject provinceJson = baseJson.getJSONObject("86");
|
||||||
|
@ -83,7 +79,7 @@ public class ProvinceCityArea {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package org.jeecg.common.es;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.jeecg.common.util.RestUtil;
|
import org.jeecg.common.util.RestUtil;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package org.jeecg.common.system.query;
|
package org.jeecg.common.system.query;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -40,6 +40,10 @@ public class QueryGenerator {
|
||||||
private static final String MULTI = "_MultiString";
|
private static final String MULTI = "_MultiString";
|
||||||
private static final String STAR = "*";
|
private static final String STAR = "*";
|
||||||
private static final String COMMA = ",";
|
private static final String COMMA = ",";
|
||||||
|
/**
|
||||||
|
* 查询 逗号转义符 相当于一个逗号【作废】
|
||||||
|
*/
|
||||||
|
public static final String QUERY_COMMA_ESCAPE = "++";
|
||||||
private static final String NOT_EQUAL = "!";
|
private static final String NOT_EQUAL = "!";
|
||||||
/**页面带有规则值查询,空格作为分隔符*/
|
/**页面带有规则值查询,空格作为分隔符*/
|
||||||
private static final String QUERY_SEPARATE_KEYWORD = " ";
|
private static final String QUERY_SEPARATE_KEYWORD = " ";
|
||||||
|
@ -261,7 +265,16 @@ public class QueryGenerator {
|
||||||
&& oConvertUtils.isNotEmpty(rule.getVal())) {
|
&& oConvertUtils.isNotEmpty(rule.getVal())) {
|
||||||
|
|
||||||
log.debug("SuperQuery ==> " + rule.toString());
|
log.debug("SuperQuery ==> " + rule.toString());
|
||||||
addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), rule.getVal());
|
|
||||||
|
//update-begin-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错
|
||||||
|
Object queryValue = rule.getVal();
|
||||||
|
if("date".equals(rule.getType())){
|
||||||
|
queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get());
|
||||||
|
}else if("datetime".equals(rule.getType())){
|
||||||
|
queryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get());
|
||||||
|
}
|
||||||
|
addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue);
|
||||||
|
//update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错
|
||||||
|
|
||||||
// 如果拼接方式是OR,就拼接OR
|
// 如果拼接方式是OR,就拼接OR
|
||||||
if (MatchTypeEnum.OR == matchType && i < (conditions.size() - 1)) {
|
if (MatchTypeEnum.OR == matchType && i < (conditions.size() - 1)) {
|
||||||
|
@ -324,6 +337,7 @@ public class QueryGenerator {
|
||||||
rule = QueryRuleEnum.RIGHT_LIKE;
|
rule = QueryRuleEnum.RIGHT_LIKE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// step 4 in
|
// step 4 in
|
||||||
if (rule == null && val.contains(COMMA)) {
|
if (rule == null && val.contains(COMMA)) {
|
||||||
//TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来
|
//TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来
|
||||||
|
@ -333,6 +347,18 @@ public class QueryGenerator {
|
||||||
if(rule == null && val.startsWith(NOT_EQUAL)){
|
if(rule == null && val.startsWith(NOT_EQUAL)){
|
||||||
rule = QueryRuleEnum.NE;
|
rule = QueryRuleEnum.NE;
|
||||||
}
|
}
|
||||||
|
// step 6 xx+xx+xx 这种情况适用于如果想要用逗号作精确查询 但是系统默认逗号走in 所以可以用++替换【此逻辑作废】
|
||||||
|
if(rule == null && val.indexOf(QUERY_COMMA_ESCAPE)>0){
|
||||||
|
rule = QueryRuleEnum.EQ_WITH_ADD;
|
||||||
|
}
|
||||||
|
|
||||||
|
//update-begin--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284---------------------
|
||||||
|
//特殊处理:Oracle的表达式to_date('xxx','yyyy-MM-dd')含有逗号,会被识别为in查询,转为等于查询
|
||||||
|
if(rule == QueryRuleEnum.IN && val.indexOf("yyyy-MM-dd")>=0 && val.indexOf("to_date")>=0){
|
||||||
|
rule = QueryRuleEnum.EQ;
|
||||||
|
}
|
||||||
|
//update-end--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284---------------------
|
||||||
|
|
||||||
return rule != null ? rule : QueryRuleEnum.EQ;
|
return rule != null ? rule : QueryRuleEnum.EQ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,7 +391,9 @@ public class QueryGenerator {
|
||||||
value = specialStrConvert(value.toString());
|
value = specialStrConvert(value.toString());
|
||||||
} else if (rule == QueryRuleEnum.IN) {
|
} else if (rule == QueryRuleEnum.IN) {
|
||||||
value = val.split(",");
|
value = val.split(",");
|
||||||
} else {
|
} else if (rule == QueryRuleEnum.EQ_WITH_ADD) {
|
||||||
|
value = val.replaceAll("\\+\\+", COMMA);
|
||||||
|
}else {
|
||||||
//update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284-------------------
|
//update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284-------------------
|
||||||
if(val.startsWith(rule.getValue())){
|
if(val.startsWith(rule.getValue())){
|
||||||
//TODO 此处逻辑应该注释掉-> 如果查询内容中带有查询匹配规则符号,就会被截取的(比如:>=您好)
|
//TODO 此处逻辑应该注释掉-> 如果查询内容中带有查询匹配规则符号,就会被截取的(比如:>=您好)
|
||||||
|
@ -470,6 +498,7 @@ public class QueryGenerator {
|
||||||
queryWrapper.le(name, value);
|
queryWrapper.le(name, value);
|
||||||
break;
|
break;
|
||||||
case EQ:
|
case EQ:
|
||||||
|
case EQ_WITH_ADD:
|
||||||
queryWrapper.eq(name, value);
|
queryWrapper.eq(name, value);
|
||||||
break;
|
break;
|
||||||
case NE:
|
case NE:
|
||||||
|
@ -653,34 +682,59 @@ public class QueryGenerator {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString) {
|
public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString) {
|
||||||
|
return getSingleQueryConditionSql(field, alias, value, isString,null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报表获取查询条件 支持多数据源
|
||||||
|
* @param field
|
||||||
|
* @param alias
|
||||||
|
* @param value
|
||||||
|
* @param isString
|
||||||
|
* @param dataBaseType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString, String dataBaseType) {
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
field = alias+oConvertUtils.camelToUnderline(field);
|
field = alias+oConvertUtils.camelToUnderline(field);
|
||||||
QueryRuleEnum rule = QueryGenerator.convert2Rule(value);
|
QueryRuleEnum rule = QueryGenerator.convert2Rule(value);
|
||||||
return getSingleSqlByRule(rule, field, value, isString);
|
return getSingleSqlByRule(rule, field, value, isString, dataBaseType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString) {
|
/**
|
||||||
|
* 获取单个查询条件的值
|
||||||
|
* @param rule
|
||||||
|
* @param field
|
||||||
|
* @param value
|
||||||
|
* @param isString
|
||||||
|
* @param dataBaseType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString, String dataBaseType) {
|
||||||
String res = "";
|
String res = "";
|
||||||
switch (rule) {
|
switch (rule) {
|
||||||
case GT:
|
case GT:
|
||||||
res =field+rule.getValue()+getFieldConditionValue(value, isString);
|
res =field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
break;
|
break;
|
||||||
case GE:
|
case GE:
|
||||||
res = field+rule.getValue()+getFieldConditionValue(value, isString);
|
res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
break;
|
break;
|
||||||
case LT:
|
case LT:
|
||||||
res = field+rule.getValue()+getFieldConditionValue(value, isString);
|
res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
break;
|
break;
|
||||||
case LE:
|
case LE:
|
||||||
res = field+rule.getValue()+getFieldConditionValue(value, isString);
|
res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
break;
|
break;
|
||||||
case EQ:
|
case EQ:
|
||||||
res = field+rule.getValue()+getFieldConditionValue(value, isString);
|
res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
|
break;
|
||||||
|
case EQ_WITH_ADD:
|
||||||
|
res = field+" = "+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
break;
|
break;
|
||||||
case NE:
|
case NE:
|
||||||
res = field+" <> "+getFieldConditionValue(value, isString);
|
res = field+" <> "+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
break;
|
break;
|
||||||
case IN:
|
case IN:
|
||||||
res = field + " in "+getInConditionValue(value, isString);
|
res = field + " in "+getInConditionValue(value, isString);
|
||||||
|
@ -695,12 +749,33 @@ public class QueryGenerator {
|
||||||
res = field + " like "+getLikeConditionValue(value);
|
res = field + " like "+getLikeConditionValue(value);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
res = field+" = "+getFieldConditionValue(value, isString);
|
res = field+" = "+getFieldConditionValue(value, isString, dataBaseType);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
private static String getFieldConditionValue(Object value,boolean isString) {
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取单个查询条件的值
|
||||||
|
* @param rule
|
||||||
|
* @param field
|
||||||
|
* @param value
|
||||||
|
* @param isString
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString) {
|
||||||
|
return getSingleSqlByRule(rule, field, value, isString, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取查询条件的值
|
||||||
|
* @param value
|
||||||
|
* @param isString
|
||||||
|
* @param dataBaseType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String getFieldConditionValue(Object value,boolean isString, String dataBaseType) {
|
||||||
String str = value.toString().trim();
|
String str = value.toString().trim();
|
||||||
if(str.startsWith("!")) {
|
if(str.startsWith("!")) {
|
||||||
str = str.substring(1);
|
str = str.substring(1);
|
||||||
|
@ -712,22 +787,27 @@ public class QueryGenerator {
|
||||||
str = str.substring(1);
|
str = str.substring(1);
|
||||||
}else if(str.startsWith("<")) {
|
}else if(str.startsWith("<")) {
|
||||||
str = str.substring(1);
|
str = str.substring(1);
|
||||||
|
}else if(str.indexOf(QUERY_COMMA_ESCAPE)>0) {
|
||||||
|
str = str.replaceAll("\\+\\+", COMMA);
|
||||||
|
}
|
||||||
|
if(dataBaseType==null){
|
||||||
|
dataBaseType = getDbType();
|
||||||
}
|
}
|
||||||
if(isString) {
|
if(isString) {
|
||||||
if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){
|
if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType)){
|
||||||
return " N'"+str+"' ";
|
return " N'"+str+"' ";
|
||||||
}else{
|
}else{
|
||||||
return " '"+str+"' ";
|
return " '"+str+"' ";
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
// 如果不是字符串 有一种特殊情况 popup调用都走这个逻辑 参数传递的可能是“‘admin’”这种格式的
|
// 如果不是字符串 有一种特殊情况 popup调用都走这个逻辑 参数传递的可能是“‘admin’”这种格式的
|
||||||
if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType()) && str.endsWith("'") && str.startsWith("'")){
|
if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType) && str.endsWith("'") && str.startsWith("'")){
|
||||||
return " N"+str;
|
return " N"+str;
|
||||||
}
|
}
|
||||||
return value.toString();
|
return value.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getInConditionValue(Object value,boolean isString) {
|
private static String getInConditionValue(Object value,boolean isString) {
|
||||||
if(isString) {
|
if(isString) {
|
||||||
String temp[] = value.toString().split(",");
|
String temp[] = value.toString().split(",");
|
||||||
|
|
|
@ -19,6 +19,8 @@ public enum QueryRuleEnum {
|
||||||
LIKE("LIKE","like","全模糊"),
|
LIKE("LIKE","like","全模糊"),
|
||||||
LEFT_LIKE("LEFT_LIKE","left_like","左模糊"),
|
LEFT_LIKE("LEFT_LIKE","left_like","左模糊"),
|
||||||
RIGHT_LIKE("RIGHT_LIKE","right_like","右模糊"),
|
RIGHT_LIKE("RIGHT_LIKE","right_like","右模糊"),
|
||||||
|
EQ_WITH_ADD("EQWITHADD","eq_with_add","带加号等于"),
|
||||||
|
LIKE_WITH_AND("LIKEWITHAND","like_with_and","多词模糊匹配————暂时未用上"),
|
||||||
SQL_RULES("USE_SQL_RULES","ext","自定义SQL片段");
|
SQL_RULES("USE_SQL_RULES","ext","自定义SQL片段");
|
||||||
|
|
||||||
private String value;
|
private String value;
|
||||||
|
|
|
@ -75,10 +75,6 @@ public class CommonUtils {
|
||||||
}
|
}
|
||||||
//替换上传文件名字的特殊字符
|
//替换上传文件名字的特殊字符
|
||||||
fileName = fileName.replace("=","").replace(",","").replace("&","").replace("#", "");
|
fileName = fileName.replace("=","").replace(",","").replace("&","").replace("#", "");
|
||||||
//替换上传文件名字中的中文
|
|
||||||
if(ifContainChinese(fileName)){
|
|
||||||
fileName= PinyinUtil.getPinyin(fileName, StrUtil.EMPTY);
|
|
||||||
}
|
|
||||||
//替换上传文件名字中的空格
|
//替换上传文件名字中的空格
|
||||||
fileName=fileName.replaceAll("\\s","");
|
fileName=fileName.replaceAll("\\s","");
|
||||||
return fileName;
|
return fileName;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.jeecg.common.util;
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
public enum DySmsEnum {
|
public enum DySmsEnum {
|
||||||
|
|
||||||
|
|
|
@ -1,436 +0,0 @@
|
||||||
package org.jeecg.common.util;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.apache.poi.POIXMLDocument;
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
|
||||||
import org.apache.poi.ss.usermodel.*;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
||||||
import org.jeecgframework.core.util.ApplicationContextUtil;
|
|
||||||
import org.jeecgframework.dict.service.AutoPoiDictServiceI;
|
|
||||||
import org.jeecgframework.poi.excel.annotation.Excel;
|
|
||||||
import org.jeecgframework.poi.excel.annotation.ExcelCollection;
|
|
||||||
import org.jeecgframework.poi.excel.annotation.ExcelTarget;
|
|
||||||
import org.jeecgframework.poi.excel.annotation.ExcelVerify;
|
|
||||||
import org.jeecgframework.poi.excel.entity.ImportParams;
|
|
||||||
import org.jeecgframework.poi.excel.entity.params.ExcelCollectionParams;
|
|
||||||
import org.jeecgframework.poi.excel.entity.params.ExcelImportEntity;
|
|
||||||
import org.jeecgframework.poi.excel.entity.params.ExcelVerifyEntity;
|
|
||||||
import org.jeecgframework.poi.exception.excel.ExcelImportException;
|
|
||||||
import org.jeecgframework.poi.exception.excel.enums.ExcelImportEnum;
|
|
||||||
import org.jeecgframework.poi.util.ExcelUtil;
|
|
||||||
import org.jeecgframework.poi.util.PoiPublicUtil;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.PushbackInputStream;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.lang.reflect.ParameterizedType;
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 验证excel标题是否存在,当前默认有0.8(80%)即可通过验证
|
|
||||||
*/
|
|
||||||
public class FieldPresenceUtil {
|
|
||||||
/**当有标题到达多少可以通过验证*/
|
|
||||||
public static final Double NUM = 0.8;
|
|
||||||
|
|
||||||
public static Boolean fieldPresence(InputStream inputstream, Class<?> pojoClass, ImportParams params) {
|
|
||||||
Workbook book = null;
|
|
||||||
int errorNum = 0;
|
|
||||||
int successNum = 0;
|
|
||||||
if (!(inputstream.markSupported())) {
|
|
||||||
inputstream = new PushbackInputStream(inputstream, 8);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (POIFSFileSystem.hasPOIFSHeader(inputstream)) {
|
|
||||||
book = new HSSFWorkbook(inputstream);
|
|
||||||
} else if (POIXMLDocument.hasOOXMLHeader(inputstream)) {
|
|
||||||
book = new XSSFWorkbook(OPCPackage.open(inputstream));
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (InvalidFormatException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
for (int i = 0; i < params.getSheetNum(); i++) {
|
|
||||||
Row row = null;
|
|
||||||
//跳过表头和标题行
|
|
||||||
Iterator<Row> rows;
|
|
||||||
try{
|
|
||||||
rows= book.getSheetAt(i).rowIterator();
|
|
||||||
}catch (Exception e){
|
|
||||||
//为空说明读取不到,故不是excel
|
|
||||||
throw new RuntimeException("请导入正确格式的excel文件!");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (int j = 0; j < params.getTitleRows() + params.getHeadRows(); j++) {
|
|
||||||
try{
|
|
||||||
row = rows.next();
|
|
||||||
}catch (NoSuchElementException e){
|
|
||||||
//为空说明标题不出在,excel格式错误
|
|
||||||
throw new RuntimeException("请填写内容标题!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Sheet sheet = book.getSheetAt(i);
|
|
||||||
Map<Integer, String> titlemap = null;
|
|
||||||
try {
|
|
||||||
titlemap = getTitleMap(sheet, params);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
Set<Integer> columnIndexSet = titlemap.keySet();
|
|
||||||
Integer maxColumnIndex = Collections.max(columnIndexSet);
|
|
||||||
Integer minColumnIndex = Collections.min(columnIndexSet);
|
|
||||||
while (rows.hasNext() && (row == null || sheet.getLastRowNum() - row.getRowNum() > params.getLastOfInvalidRow())) {
|
|
||||||
row = rows.next();
|
|
||||||
Map<String, ExcelImportEntity> excelParams = new HashMap<String, ExcelImportEntity>();
|
|
||||||
List<ExcelCollectionParams> excelCollection = new ArrayList<ExcelCollectionParams>();
|
|
||||||
String targetId = null;
|
|
||||||
if (!Map.class.equals(pojoClass)) {
|
|
||||||
Field fileds[] = PoiPublicUtil.getClassFields(pojoClass);
|
|
||||||
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class);
|
|
||||||
if (etarget != null) {
|
|
||||||
targetId = etarget.value();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
getAllExcelField(targetId, fileds, excelParams, excelCollection, pojoClass, null);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
int firstCellNum = row.getFirstCellNum();
|
|
||||||
if (firstCellNum > minColumnIndex) {
|
|
||||||
firstCellNum = minColumnIndex;
|
|
||||||
}
|
|
||||||
int lastCellNum = row.getLastCellNum();
|
|
||||||
if (lastCellNum < maxColumnIndex + 1) {
|
|
||||||
lastCellNum = maxColumnIndex + 1;
|
|
||||||
}
|
|
||||||
for (int j = firstCellNum, le = lastCellNum; j < le; j++) {
|
|
||||||
String titleString = (String) titlemap.get(j);
|
|
||||||
if (excelParams.containsKey(titleString) || Map.class.equals(pojoClass)) {
|
|
||||||
successNum+=1;
|
|
||||||
}else{
|
|
||||||
if(excelCollection.size()>0){
|
|
||||||
Iterator var33 = excelCollection.iterator();
|
|
||||||
ExcelCollectionParams param = (ExcelCollectionParams)var33.next();
|
|
||||||
if (param.getExcelParams().containsKey(titleString)) {
|
|
||||||
successNum+=1;
|
|
||||||
}else{
|
|
||||||
errorNum+=1;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
errorNum+=1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(successNum<errorNum){
|
|
||||||
return false;
|
|
||||||
}else if(successNum>errorNum){
|
|
||||||
if(errorNum>0){
|
|
||||||
double newNumber = (double) successNum / (successNum + errorNum);
|
|
||||||
BigDecimal bg = new BigDecimal(newNumber);
|
|
||||||
double f1 = bg.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
||||||
if(f1<NUM){
|
|
||||||
return false;
|
|
||||||
}else{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}else if(successNum==errorNum){
|
|
||||||
return false;
|
|
||||||
}else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} catch (ExcelImportException e) {
|
|
||||||
if (!e.getType().equals(ExcelImportEnum.VERIFY_ERROR)) {
|
|
||||||
throw new ExcelImportException(e.getType(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取文件名称标题
|
|
||||||
* @Author JEECG
|
|
||||||
* @date 20201023
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
private static Map<Integer, String> getTitleMap(Sheet sheet, ImportParams params) throws Exception {
|
|
||||||
Map<Integer, String> titlemap = new HashMap<Integer, String>();
|
|
||||||
Iterator<Cell> cellTitle = null;
|
|
||||||
String collectionName = null;
|
|
||||||
Row headRow = null;
|
|
||||||
int headBegin = params.getTitleRows();
|
|
||||||
int allRowNum = sheet.getPhysicalNumberOfRows();
|
|
||||||
while(headRow == null && headBegin < allRowNum){
|
|
||||||
headRow = sheet.getRow(headBegin++);
|
|
||||||
}
|
|
||||||
if(headRow==null){
|
|
||||||
throw new Exception("不识别该文件");
|
|
||||||
}
|
|
||||||
if (ExcelUtil.isMergedRegion(sheet, headRow.getRowNum(), 0)) {
|
|
||||||
params.setHeadRows(2);
|
|
||||||
}else{
|
|
||||||
params.setHeadRows(1);
|
|
||||||
}
|
|
||||||
cellTitle = headRow.cellIterator();
|
|
||||||
while (cellTitle.hasNext()) {
|
|
||||||
Cell cell = cellTitle.next();
|
|
||||||
String value = getKeyValue(cell);
|
|
||||||
if (StringUtils.isNotEmpty(value)) {
|
|
||||||
titlemap.put(cell.getColumnIndex(), value);//加入表头列表
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//多行表头
|
|
||||||
for (int j = headBegin; j < headBegin + params.getHeadRows()-1; j++) {
|
|
||||||
headRow = sheet.getRow(j);
|
|
||||||
cellTitle = headRow.cellIterator();
|
|
||||||
while (cellTitle.hasNext()) {
|
|
||||||
Cell cell = cellTitle.next();
|
|
||||||
String value = getKeyValue(cell);
|
|
||||||
if (StringUtils.isNotEmpty(value)) {
|
|
||||||
int columnIndex = cell.getColumnIndex();
|
|
||||||
//当前cell的上一行是否为合并单元格
|
|
||||||
if(ExcelUtil.isMergedRegion(sheet, cell.getRowIndex()-1, columnIndex)){
|
|
||||||
collectionName = ExcelUtil.getMergedRegionValue(sheet, cell.getRowIndex()-1, columnIndex);
|
|
||||||
if(params.isIgnoreHeader(collectionName)){
|
|
||||||
titlemap.put(cell.getColumnIndex(), value);
|
|
||||||
}else{
|
|
||||||
titlemap.put(cell.getColumnIndex(), collectionName + "_" + value);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
titlemap.put(cell.getColumnIndex(), value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return titlemap;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取key的值,针对不同类型获取不同的值
|
|
||||||
*
|
|
||||||
* @Author JEECG
|
|
||||||
* @date 20201023
|
|
||||||
* @param cell
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private static String getKeyValue(Cell cell) {
|
|
||||||
if(cell==null){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
Object obj = null;
|
|
||||||
switch (cell.getCellType()) {
|
|
||||||
case Cell.CELL_TYPE_STRING:
|
|
||||||
obj = cell.getStringCellValue();
|
|
||||||
break;
|
|
||||||
case Cell.CELL_TYPE_BOOLEAN:
|
|
||||||
obj = cell.getBooleanCellValue();
|
|
||||||
break;
|
|
||||||
case Cell.CELL_TYPE_NUMERIC:
|
|
||||||
obj = cell.getNumericCellValue();
|
|
||||||
break;
|
|
||||||
case Cell.CELL_TYPE_FORMULA:
|
|
||||||
obj = cell.getCellFormula();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return obj == null ? null : obj.toString().trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取需要导出的全部字段
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param targetId
|
|
||||||
* 目标ID
|
|
||||||
* @param fields
|
|
||||||
* @param excelCollection
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static void getAllExcelField(String targetId, Field[] fields, Map<String, ExcelImportEntity> excelParams, List<ExcelCollectionParams> excelCollection, Class<?> pojoClass, List<Method> getMethods) throws Exception {
|
|
||||||
ExcelImportEntity excelEntity = null;
|
|
||||||
for (int i = 0; i < fields.length; i++) {
|
|
||||||
Field field = fields[i];
|
|
||||||
if (PoiPublicUtil.isNotUserExcelUserThis(null, field, targetId)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (PoiPublicUtil.isCollection(field.getType())) {
|
|
||||||
// 集合对象设置属性
|
|
||||||
ExcelCollectionParams collection = new ExcelCollectionParams();
|
|
||||||
collection.setName(field.getName());
|
|
||||||
Map<String, ExcelImportEntity> temp = new HashMap();
|
|
||||||
ParameterizedType pt = (ParameterizedType)field.getGenericType();
|
|
||||||
Class<?> clz = (Class)pt.getActualTypeArguments()[0];
|
|
||||||
collection.setType(clz);
|
|
||||||
getExcelFieldList(targetId, PoiPublicUtil.getClassFields(clz), clz, temp, (List)null);
|
|
||||||
collection.setExcelParams(temp);
|
|
||||||
collection.setExcelName(((ExcelCollection)field.getAnnotation(ExcelCollection.class)).name());
|
|
||||||
additionalCollectionName(collection);
|
|
||||||
excelCollection.add(collection);
|
|
||||||
} else if (PoiPublicUtil.isJavaClass(field)) {
|
|
||||||
addEntityToMap(targetId, field, (ExcelImportEntity)excelEntity, pojoClass, getMethods, excelParams);
|
|
||||||
} else {
|
|
||||||
List<Method> newMethods = new ArrayList<Method>();
|
|
||||||
if (getMethods != null) {
|
|
||||||
newMethods.addAll(getMethods);
|
|
||||||
}
|
|
||||||
newMethods.add(PoiPublicUtil.getMethod(field.getName(), pojoClass));
|
|
||||||
getAllExcelField(targetId, PoiPublicUtil.getClassFields(field.getType()), excelParams, excelCollection, field.getType(), newMethods);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static void getExcelFieldList(String targetId, Field[] fields, Class<?> pojoClass, Map<String, ExcelImportEntity> temp, List<Method> getMethods) throws Exception {
|
|
||||||
ExcelImportEntity excelEntity = null;
|
|
||||||
for (int i = 0; i < fields.length; i++) {
|
|
||||||
Field field = fields[i];
|
|
||||||
if (!PoiPublicUtil.isNotUserExcelUserThis((List)null, field, targetId)) {
|
|
||||||
if (PoiPublicUtil.isJavaClass(field)) {
|
|
||||||
addEntityToMap(targetId, field, (ExcelImportEntity)excelEntity, pojoClass, getMethods, temp);
|
|
||||||
} else {
|
|
||||||
List<Method> newMethods = new ArrayList();
|
|
||||||
if (getMethods != null) {
|
|
||||||
newMethods.addAll(getMethods);
|
|
||||||
}
|
|
||||||
|
|
||||||
newMethods.add(PoiPublicUtil.getMethod(field.getName(), pojoClass, field.getType()));
|
|
||||||
getExcelFieldList(targetId, PoiPublicUtil.getClassFields(field.getType()), field.getType(), temp, newMethods);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 追加集合名称到前面
|
|
||||||
*
|
|
||||||
* @param collection
|
|
||||||
*/
|
|
||||||
private static void additionalCollectionName(ExcelCollectionParams collection) {
|
|
||||||
Set<String> keys = new HashSet();
|
|
||||||
keys.addAll(collection.getExcelParams().keySet());
|
|
||||||
Iterator var3 = keys.iterator();
|
|
||||||
|
|
||||||
while(var3.hasNext()) {
|
|
||||||
String key = (String)var3.next();
|
|
||||||
collection.getExcelParams().put(collection.getExcelName() + "_" + key, collection.getExcelParams().get(key));
|
|
||||||
collection.getExcelParams().remove(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 把这个注解解析放到类型对象中
|
|
||||||
*
|
|
||||||
* @param targetId
|
|
||||||
* @param field
|
|
||||||
* @param excelEntity
|
|
||||||
* @param pojoClass
|
|
||||||
* @param getMethods
|
|
||||||
* @param temp
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static void addEntityToMap(String targetId, Field field, ExcelImportEntity excelEntity, Class<?> pojoClass, List<Method> getMethods, Map<String, ExcelImportEntity> temp) throws Exception {
|
|
||||||
Excel excel = field.getAnnotation(Excel.class);
|
|
||||||
excelEntity = new ExcelImportEntity();
|
|
||||||
excelEntity.setType(excel.type());
|
|
||||||
excelEntity.setSaveUrl(excel.savePath());
|
|
||||||
excelEntity.setSaveType(excel.imageType());
|
|
||||||
excelEntity.setReplace(excel.replace());
|
|
||||||
excelEntity.setDatabaseFormat(excel.databaseFormat());
|
|
||||||
excelEntity.setVerify(getImportVerify(field));
|
|
||||||
excelEntity.setSuffix(excel.suffix());
|
|
||||||
excelEntity.setNumFormat(excel.numFormat());
|
|
||||||
excelEntity.setGroupName(excel.groupName());
|
|
||||||
//update-begin-author:taoYan date:20180202 for:TASK #2067 【bug excel 问题】excel导入字典文本翻译问题
|
|
||||||
excelEntity.setMultiReplace(excel.multiReplace());
|
|
||||||
if(StringUtils.isNotEmpty(excel.dicCode())){
|
|
||||||
AutoPoiDictServiceI jeecgDictService = null;
|
|
||||||
try {
|
|
||||||
jeecgDictService = ApplicationContextUtil.getContext().getBean(AutoPoiDictServiceI.class);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
if(jeecgDictService!=null){
|
|
||||||
String[] dictReplace = jeecgDictService.queryDict(excel.dictTable(), excel.dicCode(), excel.dicText());
|
|
||||||
if(excelEntity.getReplace()!=null && dictReplace!=null && dictReplace.length!=0){
|
|
||||||
excelEntity.setReplace(dictReplace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//update-end-author:taoYan date:20180202 for:TASK #2067 【bug excel 问题】excel导入字典文本翻译问题
|
|
||||||
getExcelField(targetId, field, excelEntity, excel, pojoClass);
|
|
||||||
if (getMethods != null) {
|
|
||||||
List<Method> newMethods = new ArrayList<Method>();
|
|
||||||
newMethods.addAll(getMethods);
|
|
||||||
newMethods.add(excelEntity.getMethod());
|
|
||||||
excelEntity.setMethods(newMethods);
|
|
||||||
}
|
|
||||||
temp.put(excelEntity.getName(), excelEntity);
|
|
||||||
|
|
||||||
}
|
|
||||||
public static void getExcelField(String targetId, Field field, ExcelImportEntity excelEntity, Excel excel, Class<?> pojoClass) throws Exception {
|
|
||||||
excelEntity.setName(getExcelName(excel.name(), targetId));
|
|
||||||
String fieldname = field.getName();
|
|
||||||
//update-begin-author:taoyan for:TASK #2798 【例子】导入扩展方法,支持自定义导入字段转换规则
|
|
||||||
excelEntity.setMethod(PoiPublicUtil.getMethod(fieldname, pojoClass, field.getType(),excel.importConvert()));
|
|
||||||
//update-end-author:taoyan for:TASK #2798 【例子】导入扩展方法,支持自定义导入字段转换规则
|
|
||||||
if (StringUtils.isNotEmpty(excel.importFormat())) {
|
|
||||||
excelEntity.setFormat(excel.importFormat());
|
|
||||||
} else {
|
|
||||||
excelEntity.setFormat(excel.format());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 判断在这个单元格显示的名称
|
|
||||||
*
|
|
||||||
* @param exportName
|
|
||||||
* @param targetId
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static String getExcelName(String exportName, String targetId) {
|
|
||||||
if (exportName.indexOf("_") < 0) {
|
|
||||||
return exportName;
|
|
||||||
}
|
|
||||||
String[] arr = exportName.split(",");
|
|
||||||
for (String str : arr) {
|
|
||||||
if (str.indexOf(targetId) != -1) {
|
|
||||||
return str.split("_")[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取导入校验参数
|
|
||||||
*
|
|
||||||
* @param field
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static ExcelVerifyEntity getImportVerify(Field field) {
|
|
||||||
ExcelVerify verify = field.getAnnotation(ExcelVerify.class);
|
|
||||||
if (verify != null) {
|
|
||||||
ExcelVerifyEntity entity = new ExcelVerifyEntity();
|
|
||||||
entity.setEmail(verify.isEmail());
|
|
||||||
entity.setInterHandler(verify.interHandler());
|
|
||||||
entity.setMaxLength(verify.maxLength());
|
|
||||||
entity.setMinLength(verify.minLength());
|
|
||||||
entity.setMobile(verify.isMobile());
|
|
||||||
entity.setNotNull(verify.notNull());
|
|
||||||
entity.setRegex(verify.regex());
|
|
||||||
entity.setRegexTip(verify.regexTip());
|
|
||||||
entity.setTel(verify.isTel());
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.jeecg.common.handler.IFillRuleHandler;
|
import org.jeecg.common.handler.IFillRuleHandler;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.jeecg.common.util;
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.web.util.HtmlUtils;
|
import org.springframework.web.util.HtmlUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue