Commit b64a9584 authored by trumansdo's avatar trumansdo
Browse files

-

parent 98b55b93
const { run } = require('runjs')
const chalk = require('chalk')
const config = require('../vue.config.js')
const rawArgv = process.argv.slice(2)
const args = rawArgv.join(' ')
if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
const report = rawArgv.includes('--report')
run(`vue-cli-service build ${args}`)
const port = 9526
const publicPath = config.publicPath
var connect = require('connect')
var serveStatic = require('serve-static')
const app = connect()
app.use(
publicPath,
serveStatic('./dist', {
index: ['index.html', '/']
})
)
app.listen(port, function () {
console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`))
if (report) {
console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`))
}
})
} else {
run(`vue-cli-service build ${args}`)
}
...@@ -45,8 +45,10 @@ ...@@ -45,8 +45,10 @@
}, },
"dependencies": { "dependencies": {
"axios": "0.18.1", "axios": "0.18.1",
"body-parser": "^1.19.0",
"clipboard": "2.0.4", "clipboard": "2.0.4",
"codemirror": "5.45.0", "codemirror": "5.45.0",
"core-js": "^3.6.4",
"driver.js": "0.9.5", "driver.js": "0.9.5",
"dropzone": "5.5.1", "dropzone": "5.5.1",
"echarts": "4.2.1", "echarts": "4.2.1",
...@@ -57,57 +59,57 @@ ...@@ -57,57 +59,57 @@
"jsonlint": "1.6.3", "jsonlint": "1.6.3",
"jszip": "3.2.1", "jszip": "3.2.1",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"node-sass": "^4.13.1",
"normalize.css": "7.0.0", "normalize.css": "7.0.0",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"path-to-regexp": "2.4.0", "path-to-regexp": "2.4.0",
"screenfull": "4.2.0", "screenfull": "4.2.0",
"showdown": "1.9.0", "showdown": "^1.9.1",
"sortablejs": "1.8.4", "sortablejs": "1.8.4",
"tui-editor": "1.3.3", "tui-editor": "1.3.3",
"vue": "2.6.10", "vue": "2.6.11",
"vue-count-to": "1.0.13", "vue-count-to": "1.0.13",
"vue-router": "3.0.2", "vue-router": "3.1.6",
"vue-splitpane": "1.0.4", "vue-splitpane": "1.0.6",
"vuedraggable": "2.20.0", "vuedraggable": "2.23.2",
"vuex": "3.1.0", "vuex": "3.1.3",
"xlsx": "0.14.1" "xlsx": "0.14.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.0.0", "@babel/core": "7.0.0",
"@babel/register": "7.0.0", "@babel/register": "7.0.0",
"@vue/cli-plugin-babel": "3.5.3", "@vue/cli-plugin-babel": "4.2.3",
"@vue/cli-plugin-eslint": "^3.9.1", "@vue/cli-plugin-eslint": "^4.2.3",
"@vue/eslint-config-prettier": "^5.0.0", "@vue/cli-plugin-unit-jest": "4.2.3",
"@vue/cli-plugin-unit-jest": "3.5.3", "@vue/cli-service": "4.2.3",
"@vue/cli-service": "3.5.3", "@vue/eslint-config-prettier": "^6.0.0",
"@vue/test-utils": "1.0.0-beta.29", "@vue/test-utils": "1.0.0-beta.32",
"autoprefixer": "^9.5.1", "autoprefixer": "^9.5.1",
"babel-core": "7.0.0-bridge.0", "babel-core": "7.0.0-bridge.0",
"babel-eslint": "10.0.1", "babel-eslint": "10.0.1",
"babel-jest": "23.6.0", "babel-jest": "^25.1.0",
"chalk": "2.4.2", "chalk": "2.4.2",
"chokidar": "2.1.5", "chokidar": "^2.1.5",
"connect": "3.6.6", "connect": "3.6.6",
"eslint": "5.15.3", "eslint": "5.15.3",
"eslint-plugin-prettier": "^3.1.0",
"eslint-plugin-vue": "5.2.2",
"eslint-config-prettier": "^6.1.0", "eslint-config-prettier": "^6.1.0",
"prettier-eslint-cli": "^5.0.0", "eslint-plugin-prettier": "^3.1.0",
"prettier": "^1.18.2", "eslint-plugin-vue": "6.2.2",
"html-webpack-plugin": "3.2.0", "html-webpack-plugin": "3.2.0",
"husky": "1.3.1", "husky": "1.3.1",
"lint-staged": "8.1.5", "lint-staged": "8.1.5",
"mockjs": "1.0.1-beta3", "mockjs": "1.0.1-beta3",
"node-sass": "^4.9.0",
"plop": "2.3.0", "plop": "2.3.0",
"prettier": "^1.18.2",
"prettier-eslint-cli": "^5.0.0",
"runjs": "^4.3.2", "runjs": "^4.3.2",
"sass-loader": "^7.1.0", "sass-loader": "^8.0.2",
"script-ext-html-webpack-plugin": "2.1.3", "script-ext-html-webpack-plugin": "2.1.3",
"script-loader": "0.7.2", "script-loader": "0.7.2",
"serve-static": "^1.13.2", "serve-static": "^1.13.2",
"svg-sprite-loader": "4.1.3", "svg-sprite-loader": "4.1.3",
"svgo": "1.2.0", "svgo": "1.2.0",
"vue-template-compiler": "2.6.10" "vue-template-compiler": "2.6.11"
}, },
"engines": { "engines": {
"node": ">=8.9", "node": ">=8.9",
......
...@@ -7,9 +7,17 @@ ...@@ -7,9 +7,17 @@
*/ */
import request from '@/utils/request'; import request from '@/utils/request';
export function getDictsByParent(params) { export function layzyLoadDicts(params) {
return request({ return request({
url: '/core/dicts/tree', url: '/core/dicts/layzyLoad',
method: 'get',
params: params
});
}
export function immaditeLoadDicts(params) {
return request({
url: '/core/dicts/immediateLoad',
method: 'get', method: 'get',
params: params params: params
}); });
......
/* /*
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14 * @since: 2019-09-04 20:55:14
* @LastEditTime : 2020-01-11 20:47:10 * @LastEditTime: 2020-03-05 15:29:10
* @LastEditors : 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
*/ */
import request from '@/utils/request'; import request from '@/utils/request';
export function getOrgsByParent(params) { export function layzyLoadOrgs(params) {
return request({ return request({
url: '/core/orgs/tree', url: '/core/orgs/layzyLoad',
method: 'get',
params: params
});
}
export function immaditeLoadOrgs(params) {
return request({
url: '/core/orgs/immediateLoad',
method: 'get', method: 'get',
params: params params: params
}); });
......
...@@ -44,3 +44,19 @@ export function usersMetadata() { ...@@ -44,3 +44,19 @@ export function usersMetadata() {
method: 'get' method: 'get'
}); });
} }
export function saveUserData(data) {
return request({
url: '/users',
method: 'post',
data
});
}
export function updateUserData(data) {
return request({
url: '/users',
method: 'put',
data
});
}
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 16:14:37 * @since: 2019-10-12 16:14:37
* @LastEditTime : 2020-02-03 16:21:23 * @LastEditTime: 2020-03-09 14:28:00
* @LastEditors : 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
--> -->
<template> <template>
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
<slot name="filter-condition" :filter-data="filterData"> </slot> <slot name="filter-condition" :filter-data="filterData"> </slot>
<div class="filter-item-container"> <div class="filter-item-container">
<el-button <el-button
ref="searchButton"
:size="size" :size="size"
class="filter-item" class="filter-item"
type="primary" type="primary"
......
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18 * @since: 2019-10-12 15:43:18
* @LastEditTime : 2020-01-08 22:51:466 * @LastEditTime: 2020-03-06 16:02:51
* @LastEditors : 一日看尽长安花安花 * @LastEditors: 一日看尽长安花
* @Description: 后台管理页面的自动生成, * @Description: 后台管理页面的自动生成,
* 主要暴露了分页方法、数据表格搜索方法、条件查询方法、增删改方法 * 主要暴露了分页方法、数据表格搜索方法、条件查询方法、增删改方法
* 以及 查询面板插槽,功能按钮组插槽,编辑对话框插槽 * 以及 查询面板插槽,功能按钮组插槽,编辑对话框插槽
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
@update:tabledata="$emit('update:tabledata', $event)" @update:tabledata="$emit('update:tabledata', $event)"
@pagination="pagination" @pagination="pagination"
@handle-edit="handleEdit" @handle-edit="handleEdit"
@delete-data="$emit('delete-data')" @delete-data="$emit('delete-data', $event)"
></data-table> ></data-table>
<detail-page <detail-page
:metadata="metadata" :metadata="metadata"
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
:dialog-title="dialogTitle" :dialog-title="dialogTitle"
:operation-type="operationType" :operation-type="operationType"
:dialog-data="dialogData" :dialog-data="dialogData"
@create-data="$emit('create-data')" @create-data="$emit('create-data', $event)"
@update-data="$emit('update-data')" @update-data="$emit('update-data', $event)"
> >
<!-- #dialog-form-item等价v-slot:dialog-form-item 语法 <!-- #dialog-form-item等价v-slot:dialog-form-item 语法
详情参照 解构插槽 Prop 章节 --> 详情参照 解构插槽 Prop 章节 -->
......
<!--
* @Author: 一日看尽长安花
* @since: 2020-03-08 11:03:14
* @LastEditTime: 2020-03-08 15:32:26
* @LastEditors: 一日看尽长安花
* @Description:
-->
<template>
<el-upload
:ref="refs"
:headers="headers"
:multiple="multiple"
:data="data"
:name="name"
:with-credentials="withCredentials"
:show-file-list="showFileList"
:drag="drag"
:accept="accept"
:on-preview="onPreview"
:on-remove="onRemove"
:on-success="onSuccess"
:on-error="onError"
:on-progress="onProgress"
:on-change="onChange"
:before-upload="beforeUpload"
:before-remove="beforeRemove"
:list-type="listType"
:auto-upload="autoUpload"
:file-list="fileList"
:http-request="httpRequest"
:disabled="disabled"
:limit="limit"
:on-exceed="onExceed"
action="https://jsonplaceholder.typicode.com/posts/"
>
<template v-slot:default>
<slot name="default"> </slot>
</template>
<template v-slot:trigger>
<slot name="trigger"></slot>
</template>
<template v-slot:tip>
<slot name="tip"></slot>
</template>
</el-upload>
</template>
<script>
export default {
name: 'FileUpload',
components: {},
props: {
refs: {
type: String,
default: 'fileUpload'
},
headers: {
type: Object,
default() {
return undefined;
}
},
multiple: {
type: Boolean,
default: true
},
data: {
type: Object,
default() {
return undefined;
}
},
name: {
type: String,
default: 'file'
},
withCredentials: {
type: Boolean,
default: false
},
showFileList: {
type: Boolean,
default: true
},
drag: {
type: Boolean,
default: false
},
accept: {
type: String,
default: ''
},
listType: {
type: String,
default: 'text'
},
autoUpload: {
type: Boolean,
default: false
},
fileList: {
type: Array,
default() {
return [];
}
},
disabled: {
type: Boolean,
default: false
},
limit: {
type: Number,
default: undefined
},
onPreview: {
type: Function,
default: undefined
},
onRemove: {
type: Function,
default: undefined
},
onSuccess: {
type: Function,
default: undefined
},
onError: {
type: Function,
default: undefined
},
onProgress: {
type: Function,
default: undefined
},
onChange: {
type: Function,
default: undefined
},
beforeUpload: {
type: Function,
default: undefined
},
beforeRemove: {
type: Function,
default: undefined
},
httpRequest: {
type: Function,
default: undefined
},
onExceed: {
type: Function,
default: undefined
}
},
data() {
return {};
}
};
</script>
/* /*
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14 * @since: 2019-09-04 20:55:14
* @LastEditTime: 2019-10-29 21:52:51 * @LastEditTime: 2020-03-11 16:00:50
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
*/ */
......
/* /*
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14 * @since: 2019-09-04 20:55:14
* @LastEditTime: 2019-10-30 19:54:00 * @LastEditTime: 2020-03-11 13:38:40
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
*/ */
......
/* /*
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2020-01-13 23:12:07 * @since: 2020-01-13 23:12:07
* @LastEditTime : 2020-02-05 17:03:34 * @LastEditTime: 2020-03-09 19:32:36
* @LastEditors : 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: 与业务有关的非纯api的js * @Description: 与业务有关的非纯api的js
*/ */
import { getDictsByParent } from '@/api/dict'; import { layzyLoadDicts, immaditeLoadDicts } from '@/api/dict';
/** /**
* @description: 异步载入级联器的数据 * @description: 异步载入级联器的数据
...@@ -13,7 +13,7 @@ import { getDictsByParent } from '@/api/dict'; ...@@ -13,7 +13,7 @@ import { getDictsByParent } from '@/api/dict';
* @param {resolve} 同上 * @param {resolve} 同上
* @param {type} 第一级字典类型 * @param {type} 第一级字典类型
*/ */
export function loadDictCascaderData(node, resolve, type) { export function layzyLoadDictTree(node, resolve, type) {
const { root, data } = node; const { root, data } = node;
const { id } = data || {}; const { id } = data || {};
let datas = []; let datas = [];
...@@ -24,7 +24,7 @@ export function loadDictCascaderData(node, resolve, type) { ...@@ -24,7 +24,7 @@ export function loadDictCascaderData(node, resolve, type) {
parentId: id, parentId: id,
type: type type: type
}; };
getDictsByParent(reqParam) layzyLoadDicts(reqParam)
.then(result => { .then(result => {
const { code, data } = { ...result }; const { code, data } = { ...result };
// 通过调用resolve将子节点数据返回,通知组件数据加载完成 // 通过调用resolve将子节点数据返回,通知组件数据加载完成
...@@ -36,18 +36,22 @@ export function loadDictCascaderData(node, resolve, type) { ...@@ -36,18 +36,22 @@ export function loadDictCascaderData(node, resolve, type) {
} }
/** /**
* @description: 处理级联器的选中值,级联器选中值是个数组,需要处理为指定key-value * @description: 将json中一个key值为数组的每个值转成指定key-value,主要用于el中的级联选择器
* @param {obj} 包含选中值的对象 * @param {obj} 包含选中值的对象
* @param {modelKey} 级联器 cascader 的 v-model 选中值的key名称 * @param {arrayKey} 数组的key
* @param {keyNames} 转换后的 key 名称级,必须按照级联器选中值的顺序 * @param {keyNames} 转换后的 key 名称级,必须按照数组中每个值的顺序对应
* @returns {Object} 包含转换后的 key-value 值 * @returns {Object} 包含转换后的 key-value 值
*/ */
export function handleDictCascaderValue(obj, modelKey, keyNames) { export function handleCascaderValue(obj, arrayKey, keyNames) {
let selValArray = obj[modelKey] || []; let selValArray = obj[arrayKey] || [];
let resObj = {}; let resObj = {};
for (var i in selValArray) { for (var i in selValArray) {
resObj[keyNames[i]] = selValArray[i]; if (keyNames.length === 1) {
resObj[keyNames[0]] = selValArray[i];
} else {
resObj[keyNames[i]] = selValArray[i];
}
} }
delete obj[modelKey]; delete obj[arrayKey];
return Object.assign({}, obj, resObj); return Object.assign({}, obj, resObj);
} }
/* /*
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2020-01-13 23:12:07 * @since: 2020-01-13 23:12:07
* @LastEditTime : 2020-02-05 17:04:59 * @LastEditTime: 2020-03-04 16:22:10
* @LastEditors : 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: 与业务有关的非纯api的js * @Description: 与业务有关的非纯api的js
*/ */
import { getOrgsByParent } from '@/api/org'; import { getOrgsByParent } from '@/api/org';
...@@ -13,7 +13,7 @@ import { getOrgsByParent } from '@/api/org'; ...@@ -13,7 +13,7 @@ import { getOrgsByParent } from '@/api/org';
* @param {resolve} 同上 * @param {resolve} 同上
* @param {type} 第一级字典类型 * @param {type} 第一级字典类型
*/ */
export function loadOrgCascaderData(node, resolve) { export function layzyLoadOrgTree(node, resolve) {
const { root, data } = node; const { root, data } = node;
const { id } = data || {}; const { id } = data || {};
let datas = []; let datas = [];
...@@ -29,17 +29,3 @@ export function loadOrgCascaderData(node, resolve) { ...@@ -29,17 +29,3 @@ export function loadOrgCascaderData(node, resolve) {
resolve(datas); resolve(datas);
}); });
} }
/**
* @description: 组织机构是唯一级别的,只取最后一级的value。所以不像字典多个级别
* @param {obj} 包含选中值的对象
* @param {modelKey} 级联器 cascader 的 v-model 选中值的key名称
* @param {keyName} 转换后的 key 名称,必须按照级联器选中值的顺序
* @returns {Object} 包含转换后的 key-value 值
*/
export function handleOrgCascaderValue(obj, modelKey, keyName) {
let selValArray = obj[modelKey] || [];
obj[keyName] = selValArray[selValArray.length - 1];
delete obj[modelKey];
return obj;
}
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @Author: your name * @Author: your name
* @Date: 2019-09-09 12:16:28 * @Date: 2019-09-09 12:16:28
* @LastEditTime : 2020-02-04 13:19:39 * @LastEditTime: 2020-03-08 15:59:43
* @LastEditors : 一日看尽长安花 * @LastEditors: 一日看尽长安花
*/ */
import axios from 'axios'; import axios from 'axios';
import { MessageBox, Message } from 'element-ui'; import { MessageBox, Message } from 'element-ui';
...@@ -22,9 +22,16 @@ const service = axios.create({ ...@@ -22,9 +22,16 @@ const service = axios.create({
service.interceptors.request.use( service.interceptors.request.use(
config => { config => {
const method = config.method; const method = config.method;
/**get方法为params,post、put、delete为data */
const params = config.params || config.data || null; const params = config.params || config.data || null;
/**下划线转为驼峰 */
if (params) { if (params) {
const changedKeyParams = toCamelCaseDeep(params); const sourceParams = Object.assign({}, params);
const changedKeyParams = Object.assign(
{},
toCamelCaseDeep(params),
sourceParams
);
if (method === 'get') { if (method === 'get') {
config.params = changedKeyParams; config.params = changedKeyParams;
} else { } else {
...@@ -86,8 +93,10 @@ service.interceptors.response.use( ...@@ -86,8 +93,10 @@ service.interceptors.response.use(
}); });
}); });
} }
/**将code非200返回码的情况转成错误传出去 */
return Promise.reject(new Error(res.message || 'Error')); return Promise.reject(new Error(res.message || 'Error'));
} else { } else {
/** 每次请求成功都要将授权码存放在cookie中,只要五分钟无动作登录授权便失效 */
const authorization = response.headers['authorization']; const authorization = response.headers['authorization'];
setToken(authorization); setToken(authorization);
return res; return res;
......
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18 * @since: 2019-10-12 15:43:18
* @LastEditTime : 2020-02-04 16:15:14 * @LastEditTime: 2020-03-11 15:30:15
* @LastEditors : 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
--> -->
<template> <template>
...@@ -21,29 +21,38 @@ ...@@ -21,29 +21,38 @@
<!-- 往搜索栏中添加搜索条件 --> <!-- 往搜索栏中添加搜索条件 -->
<template #filter-condition="{filterData:filterData}"> <template #filter-condition="{filterData:filterData}">
<div class="filter-item-container"> <div class="filter-item-container">
<el-cascader <el-form-item>
v-model="filterData['orgId']" <el-cascader
:props="orgIdCascaderProps" v-model="filterData['orgId']"
:show-all-levels="false" :props="orgIdCascaderProps"
clearable :options="orgIdCascaderProps.options"
placeholder="部门" :show-all-levels="false"
></el-cascader> clearable
placeholder="部门"
></el-cascader>
</el-form-item>
</div> </div>
<div class="filter-item-container"> <div class="filter-item-container">
<el-cascader <el-form-item>
v-model="filterData['jobType']" <el-cascader
:props="jobTypeCascaderProps" v-model="filterData['jobType']"
clearable :props="jobTypeCascaderProps"
placeholder="岗位/职务" :options="jobTypeCascaderProps.options"
></el-cascader> clearable
placeholder="岗位/职务"
></el-cascader>
</el-form-item>
</div> </div>
<div class="filter-item-container"> <div class="filter-item-container">
<el-cascader <el-form-item>
v-model="filterData['state']" <el-cascader
:props="stateCascaderProps" v-model="filterData['state']"
clearable :props="stateCascaderProps"
placeholder="状态" :options="stateCascaderProps.options"
></el-cascader> clearable
placeholder="状态"
></el-cascader>
</el-form-item>
</div> </div>
</template> </template>
<!-- 往操作按钮组中添加自定义操作按钮 --> <!-- 往操作按钮组中添加自定义操作按钮 -->
...@@ -58,15 +67,54 @@ ...@@ -58,15 +67,54 @@
测试 测试
</el-button> </el-button>
</template> </template>
<!-- 编辑弹窗的插槽 -->
<template #dialog-form-item="{dialogData:dialogData}"> <template #dialog-form-item="{dialogData:dialogData}">
<el-form-item key="slotkey" label="测试插槽" prop="test"> <el-form-item key="orgIdKey" label="所在机构" prop="org_id">
<el-input <el-cascader
v-model="dialogData['test']" v-model="dialogData['org_id_value']"
placeholder="test" :props="orgIdCascaderProps"
:clearable="true" :options="orgIdCascaderProps.options"
style="width: 200px;" :show-all-levels="false"
class="filter-item" clearable
/> placeholder="所在机构"
class="sp-form-item"
></el-cascader>
</el-form-item>
<el-form-item key="jobTypeKey" label="岗位职务" prop="job_type">
<el-cascader
v-model="dialogData['job_type_value']"
:props="jobTypeCascaderProps"
:options="jobTypeCascaderProps.options"
:show-all-levels="false"
clearable
placeholder="岗位职务"
class="sp-form-item"
></el-cascader>
</el-form-item>
<el-form-item key="stateKey" label="用户状态" prop="state">
<el-cascader
v-model="dialogData['state_value']"
:props="stateCascaderProps"
:options="stateCascaderProps.options"
:show-all-levels="false"
clearable
placeholder="用户状态"
class="sp-form-item"
></el-cascader>
</el-form-item>
<el-form-item key="fileKey" label="上传文档" prop="file">
<file-upload>
<el-button slot="trigger" size="small" type="primary">
选取文件
</el-button>
<el-button style="margin-left: 10px;" size="small" type="success">
上传到服务器
</el-button>
<div slot="tip" class="el-upload__tip">
只能上传jpg/png文件,且不超过500kb
</div>
</file-upload>
</el-form-item> </el-form-item>
</template> </template>
</general-page> </general-page>
...@@ -75,13 +123,17 @@ ...@@ -75,13 +123,17 @@
<script> <script>
import GeneralPage from '@/components/GeneralPage'; import GeneralPage from '@/components/GeneralPage';
import { users, usersMetadata } from '@/api/user'; import FileUpload from '@/components/Upload/FileUpload';
import { loadDictCascaderData, handleDictCascaderValue } from '@/services/dict';
import { loadOrgCascaderData, handleOrgCascaderValue } from '@/services/org'; import { users, usersMetadata, saveUserData, updateUserData } from '@/api/user';
import { immaditeLoadDicts } from '@/api/dict';
import { immaditeLoadOrgs } from '@/api/org';
import { layzyLoadDictTree, handleCascaderValue } from '@/services/dict';
import { layzyLoadOrgTree } from '@/services/org';
export default { export default {
name: 'CoreUsersView', name: 'CoreUsersView',
components: { GeneralPage }, components: { GeneralPage, FileUpload },
props: {}, props: {},
data() { data() {
return { return {
...@@ -94,29 +146,41 @@ export default { ...@@ -94,29 +146,41 @@ export default {
loading: true, loading: true,
orgIdCascaderProps: { orgIdCascaderProps: {
checkStrictly: true, checkStrictly: true,
lazy: true, options: []
lazyLoad(node, resolve) {
loadOrgCascaderData(node, resolve);
}
}, },
jobTypeCascaderProps: { jobTypeCascaderProps: {
checkStrictly: true, checkStrictly: true,
lazy: true, options: []
lazyLoad(node, resolve) {
loadDictCascaderData(node, resolve, 'job_type');
}
}, },
stateCascaderProps: { stateCascaderProps: {
checkStrictly: true, checkStrictly: true,
lazy: true, options: []
lazyLoad(node, resolve) {
loadDictCascaderData(node, resolve, 'user_state');
}
} }
}; };
}, },
computed: {}, computed: {},
mounted() { mounted() {
immaditeLoadDicts({
parentId: 0,
type: 'job_type'
}).then(result => {
const { code, data } = { ...result };
this.jobTypeCascaderProps.options = data;
});
immaditeLoadDicts({
parentId: 0,
type: 'user_state'
}).then(result => {
const { code, data } = { ...result };
this.stateCascaderProps.options = data;
});
immaditeLoadOrgs({
parentId: 0
}).then(result => {
const { code, data } = { ...result };
this.orgIdCascaderProps.options = data;
});
this.obtainMetadata(); this.obtainMetadata();
this.obtainData({ page: 1, limit: 10 }); this.obtainData({ page: 1, limit: 10 });
}, },
...@@ -135,15 +199,31 @@ export default { ...@@ -135,15 +199,31 @@ export default {
}, },
obtainData(queryParams) { obtainData(queryParams) {
this.loading = true; this.loading = true;
queryParams = handleOrgCascaderValue(queryParams, 'orgId', 'org_id'); queryParams = handleCascaderValue(queryParams, 'orgId', ['org_id']);
queryParams = handleDictCascaderValue(queryParams, 'jobType', [ queryParams = handleCascaderValue(queryParams, 'jobType', [
'jobType0', 'job_type0',
'jobType1' 'job_type1'
]); ]);
queryParams = handleDictCascaderValue(queryParams, 'state', ['state']); queryParams = handleCascaderValue(queryParams, 'state', ['state']);
users(queryParams) users(queryParams)
.then(result => { .then(result => {
const { code, data } = { ...result }; const { code, data } = { ...result };
/**
* 这一步是因为编辑弹窗在创建时,v-model不能使用json多级获取,不然会报错;
* 所以将其处理为一级节点
*/
for (let i in result.data) {
result.data[i]['org_id_value'] = result.data[i]['org']['id'];
result.data[i]['state_value'] = result.data[i]['state']['value'];
if (result.data[i]['job_type0']) {
result.data[i]['job_type_value'] =
result.data[i]['job_type0']['value'];
}
if (result.data[i]['job_type1']) {
result.data[i]['job_type_value'] =
result.data[i]['job_type1']['value'];
}
}
this.tabledata = Object.assign({}, result); this.tabledata = Object.assign({}, result);
}) })
.catch(err => {}) .catch(err => {})
...@@ -163,24 +243,85 @@ export default { ...@@ -163,24 +243,85 @@ export default {
this.obtainData(Object.assign({ page: 1, limit: 10 }, queryParams)); this.obtainData(Object.assign({ page: 1, limit: 10 }, queryParams));
}, },
createData(dialogData) { createData(dialogData) {
this.$nextTick(() => { this.handleEditorDataObject(dialogData, 'org_id_value', {
this.$notify({ org_id: 'org.id'
title: '成功',
message: '添加成功',
type: 'success',
duration: 2000
});
}); });
this.handleEditorDataObject(dialogData, 'state_value', {
state: 'state.value'
});
this.handleEditorDataObject(dialogData, 'job_type_value', {
job_type0: 'job_type0.value',
job_type1: 'job_type1.value'
});
saveUserData(dialogData)
.then(result => {
this.$nextTick(() => {
this.$notify({
title: '成功',
message: '创建成功',
type: 'success',
duration: 2000
});
});
})
.catch(err => {
this.$nextTick(() => {
this.$notify({
title: '失败',
message: '创建失败',
type: 'error',
duration: 2000
});
});
});
}, },
updateData(dialogData) { updateData(dialogData) {
this.$nextTick(() => { this.handleEditorDataObject(dialogData, 'org_id_value', {
this.$notify({ org_id: 'org.id'
title: '成功', });
message: '修改成功', this.handleEditorDataObject(dialogData, 'state_value', {
type: 'success', state: 'state.value'
duration: 2000
});
}); });
this.handleEditorDataObject(dialogData, 'job_type_value', {
job_type0: 'job_type0.value',
job_type1: 'job_type1.value'
});
updateUserData(dialogData)
.then(result => {
this.$refs['searchButton'].click();
this.$nextTick(() => {
this.$notify({
title: '成功',
message: '修改成功',
type: 'success',
duration: 2000
});
});
})
.catch(err => {
this.$nextTick(() => {
this.$notify({
title: '失败',
message: '修改失败',
type: 'error',
duration: 2000
});
});
});
},
handleEditorDataObject(dialogData, arrayKey, keyPathMap) {
let _valType = Object.prototype.toString.call(dialogData[arrayKey]);
if (_valType === '[object Array]') {
dialogData = handleCascaderValue(
dialogData,
arrayKey,
this.$lodash.keys(keyPathMap)
);
} else {
for (let key in keyPathMap) {
dialogData[key] = this.$lodash.get(dialogData, keyPathMap[key]);
}
}
}, },
deleteData(index, row) { deleteData(index, row) {
this.$nextTick(() => { this.$nextTick(() => {
......
'use strict' 'use strict';
const path = require('path') const path = require('path');
const defaultSettings = require('./src/settings.js') const defaultSettings = require('./src/settings.js');
function resolve(dir) { function resolve(dir) {
return path.join(__dirname, dir) return path.join(__dirname, dir);
} }
const name = defaultSettings.title || 'Boot Plus Admin' // page title const name = defaultSettings.title || 'Boot Plus Admin'; // page title
// If your port is set to 80, // If your port is set to 80,
// use administrator privileges to execute the command line. // use administrator privileges to execute the command line.
// For example, Mac: sudo npm run // For example, Mac: sudo npm run
// You can change the port by the following method: // You can change the port by the following method:
// port = 9527 npm run dev OR npm run dev --port = 9527 // port = 9527 npm run dev OR npm run dev --port = 9527
const port = process.env.port || process.env.npm_config_port || 9527 // dev port const port = process.env.port || process.env.npm_config_port || 9527; // dev port
// All configuration item explanations can be find in https://cli.vuejs.org/config/ // All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = { module.exports = {
...@@ -60,14 +60,14 @@ module.exports = { ...@@ -60,14 +60,14 @@ module.exports = {
} }
}, },
chainWebpack(config) { chainWebpack(config) {
config.plugins.delete('preload') // TODO: need test config.plugins.delete('preload'); // TODO: need test
config.plugins.delete('prefetch') // TODO: need test config.plugins.delete('prefetch'); // TODO: need test
// set svg-sprite-loader // set svg-sprite-loader
config.module config.module
.rule('svg') .rule('svg')
.exclude.add(resolve('src/icons')) .exclude.add(resolve('src/icons'))
.end() .end();
config.module config.module
.rule('icons') .rule('icons')
.test(/\.svg$/) .test(/\.svg$/)
...@@ -78,7 +78,7 @@ module.exports = { ...@@ -78,7 +78,7 @@ module.exports = {
.options({ .options({
symbolId: 'icon-[name]' symbolId: 'icon-[name]'
}) })
.end() .end();
// set preserveWhitespace // set preserveWhitespace
config.module config.module
...@@ -86,16 +86,16 @@ module.exports = { ...@@ -86,16 +86,16 @@ module.exports = {
.use('vue-loader') .use('vue-loader')
.loader('vue-loader') .loader('vue-loader')
.tap(options => { .tap(options => {
options.compilerOptions.preserveWhitespace = true options.compilerOptions.preserveWhitespace = true;
return options return options;
}) })
.end() .end();
config config
// https://webpack.js.org/configuration/devtool/#development // https://webpack.js.org/configuration/devtool/#development
.when(process.env.NODE_ENV === 'development', config => .when(process.env.NODE_ENV === 'development', config =>
config.devtool('cheap-source-map') config.devtool('cheap-source-map')
) );
config.when(process.env.NODE_ENV !== 'development', config => { config.when(process.env.NODE_ENV !== 'development', config => {
config config
...@@ -107,7 +107,7 @@ module.exports = { ...@@ -107,7 +107,7 @@ module.exports = {
inline: /runtime\..*\.js$/ inline: /runtime\..*\.js$/
} }
]) ])
.end() .end();
config.optimization.splitChunks({ config.optimization.splitChunks({
chunks: 'all', chunks: 'all',
cacheGroups: { cacheGroups: {
...@@ -130,8 +130,8 @@ module.exports = { ...@@ -130,8 +130,8 @@ module.exports = {
reuseExistingChunk: true reuseExistingChunk: true
} }
} }
}) });
config.optimization.runtimeChunk('single') config.optimization.runtimeChunk('single');
}) });
} }
} };
Supports Markdown
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