Commit 5ae1d98f authored by 赵啸非's avatar 赵啸非

修改前后端结构

parent 8bc5e74d
doc-transform-manage-ui/admin/src/assets/images/logo.png

752 Bytes | W: 0px | H: 0px

doc-transform-manage-ui/admin/src/assets/images/logo.png

81.4 KB | W: 0px | H: 0px

doc-transform-manage-ui/admin/src/assets/images/logo.png
doc-transform-manage-ui/admin/src/assets/images/logo.png
doc-transform-manage-ui/admin/src/assets/images/logo.png
doc-transform-manage-ui/admin/src/assets/images/logo.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -62,10 +62,10 @@ caption,th {
text-align: left
}
h1,h2,h3,h4,h5,h6 {
font-size: 100%;
font-weight: 500
}
// h1,h2,h3,h4,h5,h6 {
// font-size: 100%;
// font-weight: 500
// }
q:before,q:after {
content: ''
......@@ -150,9 +150,18 @@ ins,a {
}
}
}
.table-foot{
display: flex;
justify-content: flex-end;
}
.el-table th {
user-select: all;
}
/* el-table列数据为空自动显示-- */
.cell:empty::before{
content:'--';
color:gray;
}
.el-progress-bar{
padding-right: 70px;
margin-right: -70px;
......@@ -182,26 +191,6 @@ ins,a {
}
// 选择柜子弹窗
.choose-cabin-dialog{
h2{
margin-bottom: 10px;
padding-bottom: 10px;
font-size: 16px;
border-bottom: 1px solid;
.search{
margin-left: 20px;
width: 200px;
}
}
.el-row{
margin-bottom: 20px;
max-height: 150px;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
}
@media screen and (max-width: 800px){
.page{
......@@ -222,6 +211,10 @@ ins,a {
}
}
// .is-active{
// background-color: red;
// }
.mobile-table-card{
margin: 10px auto;
padding: 10px;
......
export default {
created () {
created() {
this.getData();
},
beforeDestroy () {
beforeDestroy() {
clearTimeout(this.loadingTimer);
},
methods: {
......@@ -24,57 +24,53 @@ export default {
},
// 默认拉取数据
getData() {
this.loading = true;
this.$post(this.urls.currUrl || this.pageInfo.currUrl, this.query)
.then(({data})=>{
const res = this.beforeRender(data);
// 转化枚举类型字段的number值为string
res.entity = this.util_toString(res.entity, this.toString);
this.form = Object.assign({}, this.form, res.entity);
this.dict = Object.assign({}, this.dict, res.dict);
this.afterRender(res);
})
.catch(error=>{
console.error(error)
this.$message.error(error.message);
})
.then(data=>{
clearTimeout(this.loadingTimer);
this.loadingTimer = setTimeout(() => {
this.loading = false;
}, 300);
})
},
// 提交表单
submitForm(ref) {
const el = ref || this.$refs.form;
el.validate((valid) => {
if (!valid) return;
this.loading = true;
this.$post( this.urls.saveUrl || this.pageInfo.saveUrl, {
entity: this.beforeSubmit(this.form),
...this.extendFormData
})
.then(res=>{
// 更新数据
if (res.data.import) {
this.$message.success(res.msg);
} else {
this.$message.success('更新成功');
}
this.afterSubmit(res);
this.$get(this.urls.currUrl || this.pageInfo.currUrl, this.query)
.then(({ data }) => {
const res = this.beforeRender(data);
//转化枚举类型字段的number值为arrays
res.entity = this.util_toArrays(res.entity, this.toArrays);
// 转化枚举类型字段的number值为string
res.entity = this.util_toString(res.entity, this.toString);
//
res.entity = this.util_toDateStr(res.entity, this.toDate);
this.form = Object.assign({}, this.form, res.entity);
this.dict = Object.assign({}, this.dict, res.dict);
this.afterRender(res);
})
.catch(error=>{
.catch(error => {
console.error(error)
this.$message.error(error.message);
})
.then(data=>{
.then(data => {
clearTimeout(this.loadingTimer);
this.loadingTimer = setTimeout(() => {
this.loading = false;
}, 200);
}, 300);
})
},
// 提交表单
submitForm(ref) {
const el = this.$refs.form;
el.validate((valid) => {
if (!valid) return;
this.loading = true;
this.$post(this.urls.saveUrl || this.pageInfo.saveUrl,
this.beforeSubmit(this.form)
)
.then(res => {
this.$message.success(res.msg);
this.afterSubmit(res);
})
.catch(error => {
this.$message.error(error.message);
})
.then(data => {
clearTimeout(this.loadingTimer);
this.loadingTimer = setTimeout(() => {
this.loading = false;
}, 200);
})
});
},
// 复制一个数组或对象
......@@ -83,13 +79,44 @@ export default {
},
// 工具方法,把数字转化为字符串
util_toString(data, array) {
//原始数据
const dataCopy = Object.assign({}, data);
array.forEach(item => {
//如果相等做操作
dataCopy[item] = dataCopy[item] === undefined ? '' : dataCopy[item] + '';
})
return dataCopy;
},
// 工具方法,把字符串转化为数组
util_toArrays(data, array) {
const dataCopy = Object.assign({}, data);
array.forEach(item => {
dataCopy[item] = dataCopy[item] === undefined ? [] : dataCopy[item].split(",");
})
return dataCopy;
},
// 工具方法,把字符串转化为格式化日期
util_toDateStr(data, array) {
const dataCopy = Object.assign({}, data);
array.forEach(item=>{
dataCopy[item] = dataCopy[item] === undefined ? '' : dataCopy[item]+'';
array.forEach(item => {
dataCopy[item] = dataCopy[item] === undefined ? '' : this.util_formatterDate(dataCopy[item]);
})
return dataCopy;
},
util_formatterDate(time) {
let date = new Date(Number(time));
let Y = date.getFullYear() + '-';
let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
let D = this.panLeft(date.getDate()) + ' ';
let h = this.panLeft(date.getHours()) + ':';
let m = this.panLeft(date.getMinutes()) + ':';
let s = this.panLeft(date.getSeconds());
return Y+M+D+h+m+s;
},
panLeft(num){
return num < 10 ? '0'+num : num;
},
// 从dict字段暴力取值,取不到则返回原值
util_formatter(key, val) {
try {
......@@ -97,6 +124,15 @@ export default {
} catch (error) {
return val;
}
},
resetForm(refName) {
setTimeout(() => {
this.$nextTick(() => {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
});
}, 0);
}
},
computed: {
......@@ -106,10 +142,22 @@ export default {
let type = urlArray.pop();
urlArray.push('save');
let saveUrl = urlArray.join('/');
urlArray.pop();
urlArray.push('edit');
let editUrl = urlArray.join('/');
urlArray.pop();
urlArray.push('add');
let addUrl = urlArray.join('/');
urlArray.pop();
urlArray.push('view');
let viewUrl = urlArray.join('/');
return {
type,
currUrl,
saveUrl,
editUrl,
addUrl,
viewUrl,
};
},
},
......@@ -124,6 +172,8 @@ export default {
rules: {}, // 表单验证规则
dict: {}, // 数据字典
toString: [], // 需要把number转化为string的表单字段name数组
toArrays: [], // 需要把number转化为arrays的表单字段name数组
toDate: [], // 需要把number转化为date的表单字段name数组
}
}
}
......
......@@ -8,7 +8,7 @@ const instance = axios.create({
baseURL: '/m',
headers: {
post: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'Content-Type': 'application/json;charset=UTF-8',
'dataType': 'json',
}
},
......@@ -24,19 +24,15 @@ const instance = axios.create({
instance.interceptors.request.use(config => {
//config.data = Qs.stringify(config.data, {arrayFormat: 'repeat', allowDots: true});
config.data = Qs.stringify(config.data, {arrayFormat: 'indices', allowDots: true});
//config.data = Qs.stringify(config.data, {arrayFormat: 'indices', allowDots: true});
//brackets
// 也可以在这里给请求添加token之类的字段
// config.headers['Content-Type'] = 'application/json;charset=UTF-8'
// config.headers.timestamp = Math.floor(new Date().getTime() / 1000)
// config.headers.token = sessionStorage.getItem('token') || ''
//console.log("request config",config);
// console.log("sessionStorage",window.sessionStorage)
config.headers.Authorization = window.sessionStorage.getItem('token') || ''
//console.log("request config and session",config,window.sessionStorage);
return config;
}, err => {
return Promise.reject(err);
......@@ -56,7 +52,7 @@ instance.interceptors.response.use(response=>{
*/
export function post(url, option, config = {}) {
const data = Object.assign({}, option, {
__mortals_token__: cookie.getItem('__mortals_token__'),
// __mortals_token__: cookie.getItem('__mortals_token__'),
})
return instance.post(url, data, config)
}
......@@ -71,7 +67,7 @@ export function post(url, option, config = {}) {
*/
export function get(url, option, config = {}) {
const data = Object.assign({}, option, {
__mortals_token__: cookie.getItem('__mortals_token__'),
//__mortals_token__: cookie.getItem('__mortals_token__'),
})
return instance.get(url, { params: data }, config)
}
......
......@@ -26,7 +26,7 @@ export default class Cache {
fecthData() {
return new Promise(async (resolve)=>{
const {data} = await normalCallPost(this.fecthUrl, {pageInfo: {prePageResult: -1}});
resolve(data.result);
resolve(data.data);
})
}
}
\ No newline at end of file
......@@ -5,12 +5,16 @@ import TableButtons from '@/components/tools/TableButtons';
import FormButtons from '@/components/tools/FormButtons';
import Breadcrumb from '@/components/Breadcrumb';
import MySwitch from '@/components/Switch';
import DeviceSwitch from '@/components/DeviceSwitch';
import Confirm from '@/components/Confirm';
import FormField from '@/components/FormField';
import Upload from '@/components/Upload';
import ImageUpload from '@/components/ImageUpload';
import ImagePreview from '@/components/ImagePreview';
import FileUpload from '@/components/FileUpload';
import Editor from '@/components/Editor';
import Map from '@/components/Map';
import MapDetail from '@/components/MapDetail';
const Prototype = function() {};
......@@ -22,11 +26,15 @@ Prototype.install = (Vue, options) => {
Vue.component('Breadcrumb', Breadcrumb) // 面包屑导航
Vue.component('Field', FormField) // 表单字段
Vue.component('MySwitch', MySwitch) // 拨动开关
Vue.component('DeviceSwitch', DeviceSwitch) // 拨动开关
Vue.component('Confirm', Confirm) // 局部确认窗口
Vue.component('Upload', Upload) // 文件上传
Vue.component('ImageUpload', ImageUpload) // 图片上传
Vue.component('ImagePreview', ImagePreview) // 图片预览
Vue.component('FileUpload', FileUpload) // 文件上传
Vue.component('Editor', Editor) // 富文本
Vue.component('Map', Map) // 地图
Vue.component('MapDetail', MapDetail) // 地图
}
export default Prototype;
......@@ -70,7 +70,7 @@ export class TreeCache extends Cache {
export const treeCache = new TreeCache('/area/list', 6000);
//export const treeCache = new TreeCache('/area/list', 6000);
/**
* 获取父级节点的id列表
......
let Socket = ''
let setIntervalWesocketPush = null
let reUrl=''
/**
* 建立websocket连接
* @param {string} url ws地址
*/
export const createSocket = url => {
Socket && Socket.close()
// Socket && Socket.close()
Socket=null
if (!Socket) {
console.log('建立websocket连接')
console.log('建立websocket连接:'+url)
reUrl=url
Socket = new WebSocket(url)
Socket.onopen = onopenWS
Socket.onmessage = onmessageWS
......@@ -29,9 +32,11 @@ const onerrorWS = () => {
Socket.close()
clearInterval(setIntervalWesocketPush)
console.log('连接失败重连中')
setTimeout(() => {
}, 1000)
if (Socket.readyState !== 3) {
Socket = null
createSocket()
createSocket(reUrl)
}
}
......@@ -65,7 +70,7 @@ const connecting = message => {
export const sendWSPush = message => {
if (Socket !== null && Socket.readyState === 3) {
Socket.close()
createSocket()
createSocket(reUrl)
} else if (Socket.readyState === 1) {
Socket.send(JSON.stringify(message))
} else if (Socket.readyState === 0) {
......@@ -77,9 +82,11 @@ export const sendWSPush = message => {
const oncloseWS = () => {
clearInterval(setIntervalWesocketPush)
console.log('websocket已断开....正在尝试重连')
setTimeout(() => {
}, 1000)
if (Socket.readyState !== 2) {
Socket = null
createSocket()
createSocket(reUrl)
}
}
/**发送心跳
......
......@@ -2,7 +2,9 @@
<el-table
size='small'
:data="tableData"
:row-key="handleRowKeyMethod"
:span-method="handleSpanMethod"
:toggleRowSelection="toggleRowSelection"
@selection-change="handleSelectionChange"
@sort-change="handleSortChange"
@row-click="handleRowClick"
......@@ -14,6 +16,8 @@
v-for='column in columns'
:key='column.prop'
:type="column.type"
:index="handleIndexMethod"
:selectable="handleSelectableMethod"
:prop="column.prop"
:label="column.label"
:width="column.width"
......@@ -21,6 +25,7 @@
:show-overflow-tooltip="column.tooltip"
:align="column.align || 'left'"
:formatter='column.formatter'
:reserve-selection='column.reserveSelection'
:subColumns='column.subColumns'
>
......@@ -44,6 +49,21 @@
export default {
props: {
handleRowKeyMethod: {
type: Function,
required: false,
default: row => { return row.id }
},
handleSelectableMethod: {
type: Function,
required: false,
default: () => {}
},
handleIndexMethod: {
type: Function,
required: false,
default: () => {}
},
handleSpanMethod: {
type: Function,
required: false,
......@@ -90,6 +110,8 @@ export default {
return (!this.loading && !this.tableData.length) ? '暂无数据' : '加载中...'
},
},
methods:{
},
data() {
return {}
}
......
<template>
<div class="upload-file">
<el-upload
:action="uploadFileUrl+'?prePath=' +prePath"
:action="uploadFileUrl + '?prePath=' + prePath"
:before-upload="handleBeforeUpload"
:file-list="fileList"
:limit="1"
......@@ -14,27 +14,46 @@
ref="upload"
>
<!-- 上传按钮 -->
<el-button size="mini" type="primary">选取文件</el-button>
<el-button size="mini" type="primary">选取文件</el-button>
<!-- 上传提示 -->
<div class="el-upload__tip" slot="tip" v-if="showTip">
<div class="el-upload__tip" slot="tip" v-if="showTip">
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
</template>
的文件
</div>
</el-upload>
<!-- 文件列表 -->
<transition-group style="width:45%" class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in list">
<transition-group
style="width: 80%"
class="upload-file-list el-upload-list el-upload-list--text"
name="el-fade-in-linear"
tag="ul"
>
<li
:key="file.uid"
class="el-upload-list__item ele-upload-list__item-content"
v-for="(file, index) in list"
>
<el-link :href="file.url" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
<span class="el-icon-document" style="font-size: 12px">
{{ getFileName(file.name) }}
</span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
<el-link
:underline="false"
style="font-size: 12px"
@click="handleDelete(index)"
type="danger"
>删除</el-link
>
</div>
</li>
</transition-group>
......@@ -50,12 +69,13 @@ export default {
// 大小限制(MB)
fileSize: {
type: Number,
default: 5,
default: 50,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
// default: () => ["doc", "xls", "pdf", "xml"],
fileType: {
type: Array,
default: () => ["doc", "xls", "pdf", "xml"],
default:null,
},
// 是否显示提示
isShowTip: {
......@@ -66,12 +86,17 @@ export default {
prePath: {
type: String,
default: '',
},
//默认文件名称
fileName: {
type: String,
default: '',
}
},
data() {
return {
uploadFileUrl: "/m/file/commonupload", // 上传的地址
headers:{},
fileList: [],
};
},
......@@ -82,7 +107,6 @@ export default {
},
// 列表
list() {
console.log("value",this.value);
let temp = 1;
if (this.value) {
// 首先将值转为数组
......@@ -90,10 +114,14 @@ export default {
// 然后将数组转为对象数组
return list.map((item) => {
if (typeof item === "string") {
item = { name: item, url: item };
if(this.fileName!=''){
item = { name: this.fileName, url: item };
}else{
item = { name: item, url: item };
}
}
item.uid = item.uid || new Date().getTime() + temp++;
return item;
return item;
});
} else {
this.fileList = [];
......@@ -142,6 +170,8 @@ export default {
handleUploadSuccess(res, file) {
this.$message.success("上传成功");
this.$emit("input", res.url);
this.fileName=res.fileName
this.$emit("getFileName", res.fileName);
},
// 删除文件
handleDelete(index) {
......@@ -153,7 +183,7 @@ export default {
if (name.lastIndexOf("/") > -1) {
return name.slice(name.lastIndexOf("/") + 1).toLowerCase();
} else {
return "";
return name;
}
}
},
......@@ -180,6 +210,6 @@ export default {
color: inherit;
}
.ele-upload-list__item-content-action .el-link {
margin-right: 10px;
margin-right: 5px;
}
</style>
\ No newline at end of file
......@@ -7,6 +7,9 @@
<el-input :disabled='disabled' :placeholder='placeholder' v-model="field" @change="emit" @input="emit" v-if='type === "text"' :class="inputClass" :clearable='clearable'></el-input>
<el-input :disabled='disabled' :placeholder='placeholder' v-model="field" @change="emit" @input="emit" type='password' v-if='type === "password"'></el-input>
<el-input-number :disabled='disabled' v-model="field" size="small" :placeholder='placeholder' @change="emit" @input="emit" v-if='type === "num"'></el-input-number>
<el-input :disabled='disabled' :placeholder='placeholder' v-model="field" @change="emit" :rows='rows' @input="emit" v-if='type === "textarea"' type='textarea' :autosize="textareaSize" :class="inputClass"></el-input>
<el-select :disabled='disabled' v-model="field" @change="emit" :multiple='multiple' :filterable='filterable' :clearable='clearable' v-if='type === "select"'>
......
......@@ -2,7 +2,7 @@
<template>
<div class="component-upload-image">
<el-upload
:action="uploadImgUrl"
:action="uploadImgUrl+'?prePath=' +prePath"
list-type="picture-card"
:on-success="handleUploadSuccess"
:before-upload="handleBeforeUpload"
......@@ -42,7 +42,7 @@ export default {
data() {
return {
dialogVisible: false,
uploadImgUrl: "/m/file/upload", // 上传的图片服务器地址
uploadImgUrl: "/m/file/commonupload", // 上传的图片服务器地址
};
},
props: {
......@@ -50,6 +50,11 @@ export default {
type: String,
default: "",
},
//保存服务器路径前缀地址
prePath: {
type: String,
default: '',
}
},
methods: {
removeImage() {
......
......@@ -28,6 +28,7 @@ export default {
},
watch: {
'$route'(route) {
this.initPage(route.query);
}
},
......@@ -36,21 +37,23 @@ export default {
},
methods: {
initPage(query) {
this.currPage = parseInt(query['pageInfo.currPage']) || 1;
this.currSize = parseInt(query['pageInfo.prePageResult']) || this.prePageResult;
console.log("query",query)
this.currPage = parseInt(query['page']) || 1;
this.currSize = parseInt(query['size']) || this.prePageResult;
},
changeHash(key, val) {
let {path, query} = this.$route;
this.$router.push({
path: path,
query: Object.assign({}, query, {[`pageInfo.${key}`]: val})
query: Object.assign({}, query, {[`${key}`]: val})
})
},
handleSizeChange(currSize) {
this.changeHash('prePageResult', currSize);
console.log("currsize"+currSize)
this.changeHash('size', currSize);
},
handleCurrentChange(currPage) {
this.changeHash('currPage', currPage);
this.changeHash('page', currPage);
},
},
data() {
......
......@@ -3,22 +3,7 @@
<template>
<div class="search-form-wapper">
<el-form :inline="true" :model="form" ref="search-form" size="small">
<!-- 省市区选择器 -->
<template v-if="areaSelect.enable">
<el-form-item label="区域">
<el-cascader
v-model="area"
clearable="true"
filterable
change-on-select
@change="treeSelected"
:options="treeData"
></el-cascader>
</el-form-item>
</template>
<el-form-item
:label="item.label"
v-for="(item, i) in search"
:key="i"
v-bind:class="{ search_new_line: item.newLine }"
......@@ -27,11 +12,7 @@
v-model="form[item.name]"
v-if="item.type === 'text'"
:placeholder="
item.placeholder
? item.placeholder
: item.fuzzy !== true
? '请输入' + item.label
: '支持模糊查询'
item.placeholder ? item.placeholder : '请输入' + item.label
"
></el-input>
......@@ -165,11 +146,9 @@
v-if="item.type === 'datetime'"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期时间"
:placeholder="item.label"
>
</el-date-picker>
</el-form-item>
<el-form-item>
......@@ -177,9 +156,10 @@
type="primary"
icon="el-icon-search"
@click="onSubmit"
circle
title="查询"
></el-button>
>查询</el-button
>
<el-button
icon="el-icon-download"
@click="downloadFile"
......@@ -187,12 +167,9 @@
v-if="downloadUrl"
>下载</el-button
>
<el-button
icon="el-icon-refresh-left"
@click="cleanForm"
circle
title="清空"
></el-button>
<el-button icon="el-icon-refresh-left" @click="cleanForm" title="清空"
>清空</el-button
>
</el-form-item>
</el-form>
</div>
......@@ -200,13 +177,7 @@
<script>
import Qs from "qs";
import {
type,
download,
downloadWithCustName,
getUserListByQuery,
} from "@/assets/utils";
import { treeCache } from "@/assets/utils/tree";
import { type } from "@/assets/utils";
import { isArray } from "util";
export default {
......@@ -219,19 +190,6 @@ export default {
type: Object,
default: () => {},
},
downloadUrl: {
type: String,
default: "",
},
areaSelect: {
type: Object,
default: () => {
return {
enable: false,
level: 1, // 1,仅区域
};
},
},
},
watch: {
$route(route) {
......@@ -239,35 +197,18 @@ export default {
},
},
async created() {
this.treeDatas = await treeCache.getTree();
if (this.areaSelect.enable) {
this.treeData = await treeCache.getTree();
}
let tempAreaId = this.$route.query["query.areaId"];
if (tempAreaId) {
this.selectedTreeID = treeCache.getPid(Number(tempAreaId));
}
this.initForm(this.$route.query);
},
methods: {
afterRender() {
this.selectedTreeID = treeCache.getPid(this.form.areaId);
},
beforeSubmit(form) {
form.areaId = this.selectedTreeID.slice().pop();
return form;
},
treeSelecteds(val) {
this.form.areaId = val.slice().pop();
},
remoteMethod(query, searchType) {
if (query == "") {
console.log("查询参数为空!");
return;
}
this.loading = true;
var param = {
"query.name": query,
"query.searchType": searchType,
name: query,
searchType: searchType,
};
try {
this.$post("/common/autoComplete/list", param).then(({ data }) => {
......@@ -285,9 +226,11 @@ export default {
} catch (error) {}
},
async initForm(data) {
//初始化查询表单
let newFormData = {};
this.form = this.encode(data, this.form);
// this.form = this.encode(data, this.form);
this.search.forEach((item) => {
//复选框
if (item.type === "checkbox") {
if (this.form[item.name] == undefined) {
newFormData[item.name] = [];
......@@ -308,27 +251,9 @@ export default {
}
}
}
if (item.type === "remoteSelect") {
if (
this.form[item.name] == undefined ||
(item.multiple === true && this.form[item.name].length == 0)
) {
this.remoteOptions[item.searchType] = {};
} else {
this.remoteOptions[item.searchType] = JSON.parse(
sessionStorage.getItem(item.searchType + "OptionsDict")
);
}
}
});
this.form = Object.assign({}, this.form, newFormData);
//this.form = Object.assign({}, this.form, this.encode(data));
// 区域选择器
if (this.areaSelect.enable) {
this.form.areaId = this.form.areaId ? this.form.areaId : 510100;
this.area = treeCache.getPid(this.form.areaId).map(Number);
this.treeSelected(this.area, "man");
}
this.form = Object.assign({}, this.form, data);
},
cleanForm() {
this.clean();
......@@ -344,12 +269,7 @@ export default {
newData[item.name] = item.multiple ? [] : undefined;
}
});
if (this.areaSelect.enable) {
newData.areaId = "";
this.area = [510000, 510100];
}
this.form = Object.assign({}, this.form, newData);
this.selectedTreeID = [];
},
onSubmit() {
let { path, query } = this.$route;
......@@ -363,6 +283,7 @@ export default {
encode(data, formTemp) {
let newData = {};
Object.keys(Qs.parse(data)).forEach((item) => {
console.log(item);
if (/^query\./.test(item)) {
let val = data[item];
let key = item.replace(/^query\./, "");
......@@ -389,23 +310,10 @@ export default {
});
return newData;
},
decodeVal(val) {
let valType = type(val);
if (["Number", "Boolean"].indexOf(valType) > -1) {
return val;
}
if (valType == "Undefined" || valType == "Null") {
return undefined;
}
if (valType == "String") {
let str = val.trim();
return str.length ? str : undefined;
}
return val;
},
// 解析url字符串,加入query字段
decode(data) {
let newData = { "pageInfo.currPage": 1 };
let newData = { page: 1 };
Object.keys(data).forEach((item) => {
let val = data[item];
this.search.forEach((obj) => {
......@@ -417,62 +325,34 @@ export default {
) {
//支持模糊查询,收尾增加百分号
val = val.trim();
val = "%" + val + "%";
if(val.charAt(0)!='%'){
val = "%" + val
}
if(val.charAt(val.length-1)!='%'){
val =val + "%";
}
}
});
newData["query." + item] = this.decodeVal(val);
newData[item] = this.decodeVal(val);
});
return newData;
},
// 下载文件
async downloadFile() {
let data = this.decode(this.form);
let searchString = Object.assign({}, this.$route.query, data);
this.isDownload = true;
try {
// await download(this.downloadUrl, searchString )
await downloadWithCustName(this.downloadUrl, searchString);
} catch (error) {
this.$message.error(error);
}
this.isDownload = false;
},
// 区域选择
async treeSelected(val, type) {
let areas = [];
const [province, city, area] = val;
if (!type) {
this.form.areaId = val.slice().pop();
decodeVal(val) {
let valType = type(val);
if (["Number", "Boolean"].indexOf(valType) > -1) {
return val;
}
// 查找省市关联的区域
switch (val.length) {
case 1:
areas = await treeCache.getAreasByProvinceId([province]);
break;
case 2:
areas = await treeCache.getAreasByCityId([city]);
break;
case 3:
areas = [val[2]];
break;
default:
break;
if (valType == "Undefined" || valType == "Null") {
return undefined;
}
},
//用户远程搜索
async userRemoteMethod(name) {
if (name !== "") {
this.loading = true;
const userQuery = {
"pageInfo.prePageResult": 50,
"query.realName": name,
};
this.userData = await getUserListByQuery(userQuery);
this.loading = false;
} else {
this.userData = [];
if (valType == "String") {
let str = val.trim();
return str.length ? str : undefined;
}
return val;
},
listChange() {},
},
computed: {},
......@@ -482,12 +362,6 @@ export default {
groupList: [],
},
remoteOptions: {},
treeData: [],
userData: [],
area: [],
isDownload: false,
treeDatas: [],
selectedTreeID: [],
};
},
};
......
......@@ -49,21 +49,23 @@ export default {
async statusClick() {
const status = this.row.status === this.on.value ? this.off.value : this.on.value;
const id = this.row.id;
const getTokenUrl = this.url.replace('/save', '/edit');
await this.$post(getTokenUrl, {id});
this.$post(this.url, {
entity: {
status,
id,
}
})
.then(res=>{
// 更新数据
console.log("table",this.value)
let table = JSON.parse(JSON.stringify(this.value))
let {index, data} = this.find(table, id);
data.status = status;
console.log("data",data)
data.status = res.data.entity.status;
table.splice(index, 1, data);
this.$emit("input", table);
this.$emit("change");
})
......
<template>
<span>
<el-button v-if='!noEdit' type="primary" icon="el-icon-edit" round size='mini' @click='$emit("edit", row)' circle title="编辑"></el-button>
<el-button v-if='!noEdit' type="text" icon="el-icon-edit" size='mini' @click='$emit("edit", row)' title="编辑">编辑</el-button>
<span>&nbsp;</span>
<el-button v-if='!noView' type="info" icon="el-icon-view" round size='mini' @click='$emit("view", row)' circle title="查看"></el-button>
<el-button v-if='!noView' type="text" icon="el-icon-view" size='mini' @click='$emit("view", row)' title="查看">查看</el-button>
<span>&nbsp;</span>
<Confirm @confirm='$emit("del", row.id)' message='确定要删除该条记录吗?'>
<el-button v-if='!noDel' type="danger" icon="el-icon-delete" size='mini' circle title="删除"></el-button>
<el-button v-if='!noDel' type="text" icon="el-icon-delete" size='mini' title="删除">删除</el-button>
</Confirm>
</span>
</template>
......@@ -22,6 +22,10 @@ export default {
type: Boolean,
default: false
},
noAdd: {
type: Boolean,
default: false
},
noView: {
type: Boolean,
default: false
......
......@@ -30,8 +30,10 @@ const router = new Router({
...restBuilder('param', 'system/param'), // 系统管理--参数管理
...restBuilder('task', 'system/task'), // 系统管理--任务管理
...restBuilder('area', 'system/area'), // 系统管理-区域管理
//工作流业务模块
builder('/template/form', 'tool/build/docIndex'),//模板表单配置
// builder('/template/form', 'tool/build/docIndex'),//模板表单配置
builder('/template/form/view', 'doc/form/show'),//模板表单配置
...restBuilder('platform', 'platform'), // 系统管理-区域管理
......
......@@ -55,11 +55,13 @@ export default new Vuex.Store({
state.userData = Object.assign({}, state.userData, data);
state.isLogin = true;
window.sessionStorage.userData = JSON.stringify(data);
window.sessionStorage.token = data.token;
},
logout(state) {
state.userData = {};
state.isLogin = false;
window.sessionStorage.userData = '';
window.sessionStorage.token = '';
},
setGroup(state, data) {
state.group = data;
......
......@@ -17,17 +17,23 @@
v-model="form.name"
placeholder="请输入业务名称"
/>
<el-col span="18">
<!-- <el-col span="18">
<el-form-item label="空白样表" class="my-form-field">
<FileUpload v-model="form.samplePath" prePath="/fileupload" />
</el-form-item>
</el-col>
</el-col> -->
<el-col span="18">
<Field label="空白样表" :span="18" prop="filePath"><fileUpload v-model="form.samplePath" prePath="/file/uploadfile"/></Field>
<Field label="模板样表" :span="18" prop="filePath"><fileUpload v-model="form.docTemplateEntity.templatePath" prePath="/template"/></Field>
<!-- <el-col span="18">
<el-form-item label="模板样表" class="my-form-field">
<FileUpload v-model="form.docTemplateEntity.templatePath" :fileType="fileType" prePath="/template" />
</el-form-item>
</el-col>
</el-col> -->
<Field
:span="18"
label="备注"
......
<template>
<layout-form>
<el-form :model="form" :loading="loading" :rules="rules" size='small' style="width:100%" label-width='120px' ref="form">
<el-row>
<Field label="模板ID" prop="templateId" v-model="form.templateId" placeholder="请输入模板ID"/>
<Field label="表单名称" prop="formName" v-model="form.formName" placeholder="请输入表单名称"/>
<el-col span="12">
<el-form-item label="表单内容">
<editor v-model="form.formContent" :min-height="192"/>
</el-form-item>
</el-col>
<Field label="备注" prop="remark" v-model="form.remark" placeholder="请输入备注"/>
</el-row>
<form-buttons @submit='submitForm'/>
</el-form>
</layout-form>
<div class="page">
<form-designer ref="formDesigner" :value="tmp" v-model="form1.fdForm"></form-designer>
</div>
</template>
<script>
import form from "@/assets/mixins/form";
import Editor from '@/components/Editor';
export default {
mixins: [form],
components: {
Editor,
},
toString:[
],
methods: {
created() {
console.log("form",this.form)
},
methods: {
beforeRender(data) {
this.tmp=data.entity.formContent
console.log("data",data)
return data
},
},
data() {
return {
rules: {
formName: [
{ trigger: "blur" },
],
formContent: [
{ trigger: "blur" },
],
remark: [
{ trigger: "blur" },
],
}
form1:{
fdForm:''
},
tmp:''
};
}
};
......
......@@ -37,10 +37,10 @@ export default {
/**表单配置 */
toParseForm(row) {
this.$router.push({
path: "/template/form",
path: "/doc/form/view",
query: {
formId:row.docFormEntity.id,
templateId: row.id,
//formId:row.docFormEntity.id,
id: row.id,
},
});
......
......@@ -4,18 +4,13 @@
<div class="page page-login flex flex-v">
<div class="form-wrap flex flex-1">
<el-form @submit.prevent='onSubmit' ref="form" :model="form" label-width="80px" size="small">
<h1>工作流管理平台</h1>
<h1>自助填单平台</h1>
<el-form-item label="用户名">
<el-input v-model="form.loginName"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" type='password'></el-input>
</el-form-item>
<el-form-item label="验证码">
<el-input v-model="form.securityCode">
<img slot="append" width='60' height="30" :src='securityCodeUrl' @click='refreshCode'/>
</el-input>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" native-type='submit' :loading='loading' @click='onSubmit'>登录</el-button>
</el-form-item>
......@@ -24,109 +19,122 @@
<div class="footer">
登陆 &copy; <a href="">信宏翔网络科技有限公司</a> 出品
</div>
</div>
</div>
</template>
<script>
//import { createSocket } from '@/assets/utils/websocket'
const securityCodeUrl = '/m/securitycode/createCode?v=';
import { createSocket } from "@/assets/utils/websocket";
export default {
name: 'login',
name: "login",
created() {
// console.log(11111)
this.refreshCode()
// let obj = {};
// obj.lng = 104.21;
// obj.lat = 30.56;
// obj.address = "测试站点";
// obj.siteId = 2;
// this.originData.push(obj);
// this.$nextTick(() => {
// this.$refs.map1.refresh(this.originData);
// });
// window.location.href=process.env.VUE_APP_PORTAL_URL=='undefined'?'http://192.168.0.98:11072':process.env.VUE_APP_PORTAL_URL
},
methods: {
login() {
this.loading = true;
this.$post('/login/login', this.form).then(this.loginSuccess).catch(this.loginFail)
this.$post("/login/login", this.form)
.then(this.loginSuccess)
.catch(this.loginFail);
},
loginSuccess({data}) {
this.$store.commit('setUserData', data);
loginSuccess({ data }) {
console.log("userData", data);
this.$store.commit("setUserData", data);
this.$router.replace({
path: this.redirect,
});
//成功 创建websocket连接
//createSocket('ws://127.0.0.1:17011/m/ws?accessToken='+data.id)
//成功 创建websocket连接 process.env.VUE_WEBSOCKET_BASE_API +
console.log("process", process.env);
// createSocket("ws://"+process.env.VUE_APP_BASE_API +"/ws?accessToken="+data.id)
},
loginFail(error) {
this.loading = false;
this.refreshCode();
//this.refreshCode();
this.$message.error(error.message);
},
refreshCode() {
this.form.securityCode = '';
this.securityCodeUrl = securityCodeUrl + Math.random();
},
// refreshCode() {
// this.form.securityCode = '';
// this.securityCodeUrl = securityCodeUrl + Math.random();
// },
onSubmit(e) {
e.preventDefault();
if(!this.form.loginName.length){
return this.$message.warning('请输入用户名')
}
if(!this.form.password.length){
return this.$message.warning('请输入密码')
if (!this.form.loginName.length) {
return this.$message.warning("请输入用户名");
}
if(!this.form.securityCode.length){
return this.$message.warning('请输入验证码')
if (!this.form.password.length) {
return this.$message.warning("请输入密码");
}
this.login();
},
},
data() {
return {
originData: [],
loading: false,
redirect: this.$route.query.redirect || '/',
securityCodeUrl: securityCodeUrl,
redirect: this.$route.query.redirect || "/",
form: {
loginName: '',
password: '',
securityCode: '',
}
}
}
}
loginName: "",
password: "",
},
};
},
};
</script>
<style lang="less">
.el-divider--horizontal {
margin: 5px 0;
background: 0 0;
border-top: 2px solid #e8eaec;
}
.page-login {
background-image: linear-gradient(45deg, #333, #111);
background-size: 40px 40px;
margin: 0;
height: 100%;
.el-form{
.el-form {
margin: auto;
width: 400px;
padding: 25px 25px 0 0;
background: #fff;
h1{
h1 {
text-align: center;
font-size: 20px;
font-weight: 500;
margin-bottom: 20px;
}
button{
button {
margin-top: 10px;
width: 240px;
}
.el-input-group__append{
.el-input-group__append {
padding: 0;
font-size: 0;
}
}
.footer{
.footer {
height: 80px;
font-size: 12px;
color: #999;
text-align: center;
line-height: 80px;
a{
a {
color: #999;
}
}
......
let treeData = [];
// 查找该条数据所处的层级深度
function getDeep(list, parentId, deep) {
try {
let pid = list.filter(i=>i.id == parentId)[0].parentId;
deep++;
if(pid != 0) {
return getDeep(list, pid, deep);
}else{
return deep
}
} catch (error) {
return deep;
}
}
// 分组排序
function sort(list) {
let array = [];
list.filter(i=>!i.parentId).forEach(item=>{
array = array.concat(child(list, item, []))
})
return array
}
function child(list, data, arr) {
arr.push(data);
if(data.hasChild) {
list.filter(i=>i.parentId==data.id).forEach(item=>{
return child(list, item, arr)
})
}
return arr;
}
let render = function(result) {
return treeData = sort(result.map(i=>{
i.hasChild = result.filter(j=>j.parentId==i.id).length > 0; // 是否有下级
i.deep = getDeep(result, i.parentId, 0); // 缩进层级
i.open = false;
i.isShow = true;
return i;
}));
}
let toggle = function(row) {
// 关闭的时候,需要递归关闭下面全部子级
let childId = []
// 打开下级
if(row.open) {
childId = child(treeData, row, []).map(i=>i.id)
childId.shift();
}
return treeData.map(i=>{
if(i.id == row.id) {
i.open = !i.open;
}
if(i.parentId == row.id) {
i.isShow = !i.isShow;
}
if(childId.indexOf(i.id) > -1) {
i.open = false;
i.isShow = childId.indexOf(i.id) === -1
}
return i;
})
.filter(i=>i.isShow)
}
function getParentId(id, list, arr) {
arr.unshift(id);
const pid = list.filter(i=>id == i.id)[0].parentId;
if(pid) {
return getParentId(pid, list, arr)
}else{
return arr;
}
}
function buildTree(pid, list) {
const data = list.filter(i=>pid == i.parentId);
return data.length ? data.map(i=>{
return {
value: i.id,
label: i.name,
children: buildTree(i.id, list),
}
}) : undefined
}
export default {
render,
toggle,
getParentId,
buildTree,
}
\ No newline at end of file
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' notPagination notDel>
<div>
<el-tree
:data="tree"
:props="treeProps"
:load="loadNode"
lazy>
<span style="width:100%" slot-scope="{ node, data }">
<span >{{ node.label }}</span>
<span style="float:right;">
<el-button
icon="el-icon-plus"
style="padding:3px 10px"
round
@click="() => addChild(data)">新增
</el-button>
<el-button
icon="el-icon-edit"
type="primary"
style="padding:3px 10px"
round
@click="() => editChild(data)"> 编辑
</el-button>
</span>
</span>
</el-tree>
</div>
</LayoutTable>
</div>
</template>
<script>
import table from "@/assets/mixins/table";
export default {
mixins: [table],
methods: {
async loadNode(node, resolve) {
if(node.level === 0) return
let res = await this.$post('/area/getAreaByParentId', {
'query.parentId': node.data.id,
'pageInfo.prePageResult': -1
});
resolve(this.clean(res.data.result));
},
clean(data) {
return data.map(i=>{
return {
name: i.name,
children: [],
id: i.id,
isLeaf: i.level > 2
}
});
},
afterRender({result}) {
this.tree = result;
},
addChild(data) {
this.$router.push({
path: this.pageInfo.add,
query: { pid: data.id }
});
},
editChild(data) {
this.$router.push({
path: this.pageInfo.edit,
query: Object.assign({}, {id: data.id}, this.query)
})
}
},
data() {
return {
tree:[],
openIds: [],
treeProps: {
children: 'children',
label: 'name',
isLeaf: 'isLeaf',
},
urls: {
del: "/area/disable"
},
query: {
pageInfo: {
prePageResult: -1
}
},
config: {
search: [
{
name: "name",
type: "text",
label: "名称"
},
{
name: "status",
type: "select",
label: "是否启用"
}
],
columns: [
{
type: "selection",
width: 60
},
{
label: "区域名称",
width: 200,
formatter: (row, col, val, index) => {
const width = `width: ${row.deep *
18}px;height: 20px;display: inline-block;`;
return (
<div>
<span style={width} />
{row.hasChild ? (
<i
onClick={() =>
this.loadArea(row)
}
class={
row.open
? "el-icon-caret-bottom"
: "el-icon-caret-right"
}
>
{row.name}
</i>
) : (
<span>{row.name}</span>
)}
</div>
);
}
},
{
prop: "id",
label: "区域ID"
},
{
prop: "parentId",
label: "上级区域ID"
},
{
prop: "name",
label: "区域名称"
},
{
prop: "level",
label: "区域级别",
width: 70,
formatter: this.formatter
},
{
prop: "code",
label: "区域编码"
},
// {
// prop: "contactsPeople",
// label: "区域负责人"
// },
// {
// prop: "contactsMobile",
// label: "区域负责人电话"
// },
{
prop: "status",
label: "启用",
formatter: this.formatter
},
{
prop: "remark",
label: "描述"
},
{
label: "操作",
width: 180,
formatter: row => {
return (
<div>
<el-button
icon="el-icon-plus"
size="mini"
round
onClick={() => {
this.addChild(row);
}}
>
新增
</el-button>{" "}
<table-buttons
row={row}
onEdit={this.toEdit}
noDel
/>
</div>
);
}
}
]
}
};
}
};
</script>
<template>
<layout-form>
<el-form
:model="form"
:loading="loading"
:rules="rules"
size='small'
label-width='120px'
ref="form"
>
<el-row>
<el-col :span='12'>
<el-form-item
label="区域"
prop="parentId"
>
<el-cascader
@change='treeSelected'
:options="treeData"
change-on-select
v-model="selectedTreeID"
></el-cascader>
</el-form-item>
</el-col>
<Field
label="区域名称"
prop="name"
v-model="form.name"
/>
<Field
label="区域级别"
prop="level"
v-model="form.level"
:enumData='dict.level'
type='select'
/>
<Field
label="编码"
prop="code"
v-model="form.code"
/>
<!-- <Field label="负责人" prop="contactsPeople" v-model="form.contactsPeople"/>
<Field label="负责人电话" prop="contactsMobile" v-model="form.contactsMobile"/> -->
<Field
label="子区域数量"
prop="childSize"
v-model="form.childSize"
/>
<Field
label="子区域的最大ID"
prop="maxChildId"
v-model="form.maxChildId"
/>
<Field
label="是否启用"
prop="status"
v-model="form.status"
:enumData="dict.status"
type='select'
/>
<Field
label="描述"
prop="remark"
v-model="form.remark"
:span='24'
/>
</el-row>
<form-buttons @submit='submitForm' />
</el-form>
</layout-form>
</template>
<script>
import form from "@/assets/mixins/form";
import { treeCache } from "@/assets/utils/tree";
export default {
mixins: [form],
async created() {
this.treeData = await treeCache.getTree();
this.form.parentId = this.query.pid;
},
methods: {
afterRender() {
this.selectedTreeID = treeCache.getPid(this.form.parentId);
},
beforeSubmit(form) {
form.parentId = this.selectedTreeID.slice().pop();
return form;
},
treeSelected(val) {
console.log(val);
this.form.parentId = val.slice().pop();
}
},
data() {
return {
toString: ["level", "status"],
treeData: [],
selectedTreeID: [],
rules: {
name: [{ required: true, message: "请输入区域名称", trigger: "blur" }],
remark: [{validator: (rule, val, callback) => {
if (val && val.split("").length > 200) {
return callback(new Error('描述不得超过200字'))
}
callback();
}, trigger: ['change','blur']
},
],
}
};
}
};
</script>
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' />
</div>
<div class="page">
<LayoutTable :data="tableData" notAdd notDel :config="tableConfig" />
</div>
</template>
<script>
import table from '@/assets/mixins/table';
export default {
mixins: [table],
data() {
return {
config: {
search: [
{
name: 'loginName',
type: 'text',
label: '登录名',
},
{
name: 'requestUrl',
type: 'text',
label: '请求地址',
},
],
columns: [
{
type: 'selection',
width: 60,
},
{
prop: 'id',
label: '序号',
},
{
prop: 'userName',
label: '用户名称',
},
{
prop: 'loginName',
label: '用户登录名',
},
{
prop: 'requestUrl',
label: '请求地址',
},
{
prop: 'content',
label: '操作内容',
},
{
prop: 'ip',
label: '操作IP地址',
},
{
prop: 'logDate',
label: '操作时间',
width: 140,
formatter: this.formatterDate
},
{
label: '操作',
width: 100,
formatter: (row)=> {
return (
<table-buttons row={row} onDel={this.toDel} noEdit/>
)
},
},
],
},
}
}
}
import table from "@/assets/mixins/table";
export default {
mixins: [table],
data() {
return {
config: {
search: [
{
name: "loginName",
type: "text",
label: "登录名",
},
{
name: "requestUrl",
type: "text",
label: "请求地址",
},
],
columns: [
{
type: "index",
align: "center",
label: "序号",
align: "center",
width: 50,
},
{
prop: "userName",
label: "用户名称",
align: "center",
},
{
prop: "loginName",
label: "用户登录名",
align: "center",
},
{
prop: "requestUrl",
label: "请求地址",
align: "center",
},
{
prop: "content",
label: "操作内容",
align: "center",
},
{
prop: "ip",
label: "操作IP地址",
align: "center",
},
{
prop: "logDate",
label: "操作时间",
align: "center",
formatter: this.formatterDate,
},
],
},
};
},
};
</script>
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' notPagination />
<LayoutTable :data="tableData" :config="tableConfig" notPagination />
<dialog-show ref="dialogform" @ok="getData" />
</div>
</template>
<script>
import table from '@/assets/mixins/table';
import table from "@/assets/mixins/table";
import dialogShow from "./dialogshow";
export default {
mixins: [table],
components: { dialogShow },
methods: {
beforeRender(data) {
this.allMenu = this.sortByGroup(this.util_copy(data.result));
this.allMenu = this.sortByGroup(this.util_copy(data.data));
// 存在查询条件,展开全部
if(Object.keys(this.$route.query).length) {
this.select = this.allMenu.filter(i=>!i.parentId).map(i=>i.id);
if (Object.keys(this.$route.query).length) {
this.select = this.allMenu.filter((i) => !i.parentId).map((i) => i.id);
}
return data;
},
......@@ -23,132 +26,221 @@ export default {
},
// 按parentId排序分组
sortByGroup(data) {
return data.filter(i=>!i.parentId).reduce((prev, item)=>{
return prev.concat([item], data.filter(i=>i.parentId == item.id));
}, [])
return data
.filter((i) => !i.parentId)
.reduce((prev, item) => {
return prev.concat(
[item],
data.filter((i) => i.parentId == item.id)
);
}, []);
},
// 查看下级菜单
selectHandler({id}) {
selectHandler({ id }) {
// 如果已展开,则关闭
const index = this.select.indexOf(id);
if(index > -1) {
if (index > -1) {
this.select.splice(index, 1);
}else{
} else {
this.select.push(id);
}
this.showChild();
},
showChild() {
this.tableData.result = this.allMenu.filter(item=>{
return !item.parentId || this.select.indexOf(item.parentId) > -1
this.tableData.data = this.allMenu.filter((item) => {
return !item.parentId || this.select.indexOf(item.parentId) > -1;
});
},
// 展示菜单图标
showIcon(row, column) {
return <i class={'el-icon-'+row.imgPath}></i>
return <i class={"el-icon-" + row.imgPath}></i>;
},
// 操作菜单状态
changeStatus(row, column) {
return (
<my-switch
confirm
url='/menu/save'
row={row}
<my-switch
confirm
url="/menu/save"
row={row}
onChange={this.statusChange}
value={this.tableData.result}
onInput={(data)=>{
this.tableData.result = data;
}}/>
)
value={this.tableData.data}
onInput={(data) => {
this.tableData.data = data;
}}
/>
);
},
afterDel(id) {
this.$store.dispatch('login');
this.$store.dispatch("login");
},
statusChange() {
this.$store.dispatch('login');
this.$store.dispatch("login");
},
handleUp(data) {
let type = 0;
let url = "/menu/upOrDown";
this.switchSort(url, data.id, type);
},
handleDown(data) {
let type = 1;
let url = "/menu/upOrDown";
this.switchSort(url, data.id, type);
},
switchSort(url, id, type) {
this.loading = true;
this.$post(url, {
id: id,
type: type,
})
.then((res) => {
if (res && res.code && res.code == 1) {
this.getData();
this.loading = false;
this.$message.success("更新排序成功!");
}
})
.catch((error) => {
this.loading = false;
this.$message.error(error.message);
});
},
/** 重写新增方法 */
// toAdd(row) {
// this.$refs.dialogform.add(row);
// },
// /** 重写编辑方法 */
// toEdit(row) {
// this.$refs.dialogform.edit(row);
// },
// /** 重写查看方法 */
// toView(row) {
// this.$refs.dialogform.view(row);
// },
},
data() {
return {
allMenu: [], // 经过分组排序的表格数据
select: [], // 当前展开的树节点
query: {
'pageInfo.prePageResult': -1
size: -1,
},
config: {
search: [
{
name: 'name',
type: 'text',
label: '菜单名称',
name: "name",
type: "text",
label: "菜单名称",
},
],
columns: [
{
type: 'selection',
type: "selection",
align: "center",
reserveSelection: true,
width: 60,
},
{ type: "index", label: "序号", align: "center", width: 50 },
{
width: 60,
formatter: row => {
const icon = this.select.indexOf(row.id) === -1 ? 'right' : 'down';
return (
!row.parentId
? <div onClick={()=>{this.selectHandler(row)}}>
<i class={'el-icon-arrow-'+icon}></i>
align: "center",
formatter: (row) => {
const icon =
this.select.indexOf(row.id) === -1 ? "right" : "down";
return !row.parentId ? (
<div
onClick={() => {
this.selectHandler(row);
}}
>
<i class={"el-icon-arrow-" + icon}></i>
</div>
: ''
)
}
) : (
""
);
},
},
{
prop: 'id',
label: 'ID',
prop: "id",
align: "center",
label: "ID",
width: 60,
},
{
prop: 'name',
label: '名称',
prop: "name",
align: "center",
label: "名称",
width: 160,
},
{
prop: 'imgPath',
label: '图标',
width: 50,
formatter: this.showIcon,
prop: "imgPath",
align: "center",
label: "图标",
width: 120,
// formatter: this.showIcon,
},
{
prop: 'authType',
label: '权限类型',
prop: "authType",
align: "center",
label: "权限类型",
formatter: this.formatter,
},
{
prop: 'parentId',
label: '父ID',
prop: "parentId",
align: "center",
label: "父ID",
},
{
prop: 'url',
label: '地址',
prop: "url",
align: "center",
label: "地址",
},
{
prop: 'status',
label: '状态',
prop: "status",
align: "center",
label: "状态",
width: 100,
formatter: this.changeStatus,
},
{
label: '操作',
formatter: (row)=> {
label: "操作",
align: "center",
formatter: (row) => {
return (
<table-buttons row={row} onEdit={this.toEdit} onDel={this.toDel} />
)
<div>
<el-link
style="margin-right:5px;margin-left:5px"
icon="el-icon-top"
onClick={() => {
this.handleUp(row);
}}
></el-link>
<el-link
style="margin-right:5px;margin-left:5px"
icon="el-icon-bottom"
onClick={() => {
this.handleDown(row);
}}
></el-link>
<table-buttons
noView
row={row}
onEdit={this.toEdit}
onDel={this.toDel}
/>
</div>
);
},
},
],
},
}
}
}
};
},
};
</script>
<template>
<layout-form>
<el-form
:model="form"
:loading="loading"
:rules="rules"
size='small'
label-width='100px'
ref="form"
:model="form"
:loading="loading"
:rules="rules"
size="small"
label-width="100px"
ref="form"
>
<el-row>
<Field label="ID" prop="id" v-model="form.id" v-if='pageInfo.type !== "add"' disabled />
<Field label="名称" prop="name" v-model="form.name"/>
<Field label="权限类型" prop="authType" v-model="form.authType" :enumData='dict.authType' type='select' />
<Field label="父级菜单" prop="parentId" v-model="form.parentId" :enumData='menu' type='select' />
<Field
label="ID"
prop="id"
v-model="form.id"
v-if="pageInfo.type !== 'add'"
disabled
/>
<Field label="名称" prop="name" v-model="form.name" />
<Field
label="权限类型"
prop="authType"
v-model="form.authType"
:enumData="dict.authType"
type="select"
/>
<Field
label="父级菜单"
prop="parentId"
v-model="form.parentId"
:enumData="menu"
type="select"
/>
<Field label="访问地址" prop="url" v-model="form.url" />
<Field label="状态" prop="status" v-model="form.status" :enumData='dict.status' type='radio' />
<Field label="图标" prop="imgPath" :span='24'>
<el-radio-group v-model="form.imgPath" class='form-el-radio-group'>
<Field
label="状态"
prop="status"
v-model="form.status"
:enumData="dict.status"
type="radio"
/>
<Field label="图标" prop="imgPath" :span="24">
<el-radio-group v-model="form.imgPath" class="form-el-radio-group">
<el-radio-button label="">不需要图标</el-radio-button>
<el-radio-button v-for='(icon, index) in icons' :key='index' :label="icon">
<i :class="'el-icon-'+icon"></i>
{{icon}}
<el-radio-button
v-for="(icon, index) in icons"
:key="index"
:label="icon"
>
<i :class="`iconfont ${icon}`"></i>
{{ icon }}
</el-radio-button>
</el-radio-group>
</Field>
</el-row>
<form-buttons @submit='submitForm'/>
<form-buttons @submit="submitForm" />
</el-form>
</layout-form>
</template>
<script>
import form from '@/assets/mixins/form';
import form from "@/assets/mixins/form";
export default {
mixins: [form],
methods: {
afterSubmit() {
this.$store.dispatch('login');
this.$store.dispatch("login");
this.$router.go(-1);
},
},
computed: {
menu() {
let menu = {'0': ''};
this.$store.state.userData.barList.forEach(item=>{
menu[item.id+''] = item.name
let menu = { 0: "" };
this.$store.state.userData.barList.forEach((item) => {
menu[item.id + ""] = item.name;
});
return menu;
}
},
},
data() {
return {
toString: ['parentId', 'authType', 'status'],
toString: ["parentId", "authType", "status"],
icons: [
'info', 'error', 'success', 'warning', 'question',
'tickets', 'document', 'goods', 'sold-out', 'news',
'message', 'date', 'printer', 'time', 'bell',
'mobile-phone', 'service', 'view', 'menu', 'star-on',
'location', 'phone', 'picture', 'delete', 'search',
'edit', 'rank', 'refresh', 'share', 'setting',
'upload', 'upload2', 'download', 'loading',
"icon-shouye",
"icon-shezhi",
"icon-xiaoxi",
"icon-xitongguanli",
"icon-gaojing",
"icon-dalou",
"icon-xitongguanli1",
],
rules: {
name: [
{ required: true, message: '请输入名称', trigger: 'blur' },
],
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
},
}
}
}
};
},
};
</script>
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' />
<LayoutTable :data="tableData" :config="tableConfig" />
<dialog-show ref="dialogform" @ok="getData" />
</div>
</template>
<script>
import table from '@/assets/mixins/table';
import table from "@/assets/mixins/table";
import dialogShow from "./dialogshow";
export default {
mixins: [table],
components: { dialogShow },
methods: {
// 新增
toAdd(row) {
this.$refs.dialogform.add(row);
},
// 编辑
toEdit(row) {
this.$refs.dialogform.edit(row);
},
// 查看
toView(row) {
this.$refs.dialogform.view(row);
},
},
data() {
return {
config: {
search: [
{
name: 'name',
type: 'text',
label: '参数名称',
name: "name",
type: "text",
label: "参数名称",
},
],
columns: [
{
type: 'selection',
type: "selection",
align: "center",
reserveSelection: true,
width: 60,
},
{ type: "index", label: "序号", align: "center", width: 50 },
{
prop: 'name',
label: '参数名称',
prop: "name",
align: "center",
label: "参数名称",
},
{
prop: 'firstOrganize',
label: '一级组织',
prop: "firstOrganize",
align: "center",
label: "一级组织",
},
{
prop: 'secondOrganize',
label: '二级组织',
prop: "secondOrganize",
align: "center",
label: "二级组织",
},
{
prop: 'paramKey',
label: '参数键',
prop: "paramKey",
align: "center",
label: "参数键",
},
{
prop: 'paramValue',
label: '参数值',
prop: "paramValue",
align: "center",
label: "参数值",
// formatter: this.util_short('paramValue', 20)
},
{
prop: 'validStatus',
label: '有效状态',
prop: "validStatus",
align: "center",
label: "有效状态",
width: 70,
formatter: this.formatter
formatter: this.formatter,
},
{
prop: 'modStatus',
label: '修改状态',
prop: "modStatus",
align: "center",
label: "修改状态",
width: 100,
formatter: this.formatter
formatter: this.formatter,
},
{
prop: 'displayType',
label: '展现类型',
prop: "displayType",
align: "center",
label: "展现类型",
width: 100,
formatter: this.formatter
formatter: this.formatter,
},
{
prop: 'remark',
label: '备注',
prop: "remark",
align: "center",
label: "备注",
},
{
label: '操作',
width: 180,
formatter: (row)=> {
label: "操作",
align: "center",
width: 260,
formatter: (row) => {
return (
<table-buttons row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
)
<table-buttons
noAdd
row={row}
onEdit={this.toEdit}
onView={this.toView}
onDel={this.toDel}
/>
);
},
},
],
},
}
}
}
};
},
};
</script>
<style lang="css">
.el-tooltip__popper{
.el-tooltip__popper {
display: inline-block;
max-width: 80%;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal ;
white-space: normal;
line-height: 18px;
cursor: pointer;
}
......
......@@ -8,15 +8,8 @@
label-width='120px'
ref="form"
>
<el-row>
<Field label="任务名称" prop="name" v-model="form.name"/>
<Field label="关键字" prop="taskKey" v-model="form.taskKey"/>
<Field label="执行服务" prop="excuteService" v-model="form.excuteService" :enumData='dict.excuteService' type='select' />
......
<template>
<div class="page">
<LayoutTable :data='tableData' :config='tableConfig' notAdd notDel/>
<LayoutTable :data='tableData' :config='tableConfig' notAdd notDel />
</div>
</template>
......
......@@ -13,14 +13,15 @@ module.exports = {
devServer: {
inline: true,
disableHostCheck: true,
port: 8083,
port: 8084,
hot: true,//自动保存
proxy: {
'/m': {
target: 'http://127.0.0.1:18228',
target: 'http://localhost:18228',
ws: true,
changeOrigin: true,
secure: false,
cookieDomainRewrite: 'localhost',
}
}
}
......
......@@ -48,16 +48,6 @@
<orderEntry type="library" name="Maven: redis.clients:jedis:2.9.0" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.6" level="project" />
<orderEntry type="library" name="Maven: com.mortals.util:mortals-util:1.0.5-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi:5.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:5.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-lite:5.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:5.0.3" level="project" />
<orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.21" level="project" />
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.07" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.13" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3" level="project" />
<orderEntry type="library" name="Maven: com.belerweb:pinyin4j:2.5.0" level="project" />
......@@ -111,7 +101,6 @@
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.15.RELEASE" level="project" />
......@@ -163,6 +152,40 @@
<orderEntry type="library" name="Maven: logkit:logkit:1.0.1" level="project" />
<orderEntry type="library" name="Maven: avalon-framework:avalon-framework:4.1.3" level="project" />
<orderEntry type="library" name="Maven: javax.servlet:servlet-api:2.3" level="project" />
<orderEntry type="library" name="Maven: com.deepoove:poi-tl:1.12.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.10" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:5.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi:5.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:SparseBitSet:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-lite:5.2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:5.0.3" level="project" />
<orderEntry type="library" name="Maven: xml-apis:xml-apis:1.4.01" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.21" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.07" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-transcoder:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-anim:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-css:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-ext:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-parser:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-svg-dom:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-awt-util:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:xmlgraphics-commons:2.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-bridge:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-script:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-dom:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-gvt:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-shared-resources:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-svggen:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-util:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-constants:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-i18n:1.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-xml:1.14" level="project" />
<orderEntry type="library" name="Maven: xml-apis:xml-apis-ext:1.3.04" level="project" />
<orderEntry type="library" name="Maven: org.apache.xmlgraphics:batik-codec:1.14" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.3.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:6.1.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.65.Final" level="project" />
......@@ -175,12 +198,10 @@
<orderEntry type="library" name="Maven: com.alibaba.spring:spring-context-support:1.0.10" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-client:1.3.3" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-common:1.3.3" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpasyncclient:4.1.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.14" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.14" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-api:1.3.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.10" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
<orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.5.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:2.2.9.RELEASE" level="project" />
......
This diff is collapsed.
package com.mortals.xhx.base.framework.annotation;
public enum Logical {
AND, OR
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment