"eladmin-system/vscode:/vscode.git/clone" did not exist on "784d670c54da9fdc838646383e02498d0299534c"
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 @@
},
"dependencies": {
"axios": "0.18.1",
"body-parser": "^1.19.0",
"clipboard": "2.0.4",
"codemirror": "5.45.0",
"core-js": "^3.6.4",
"driver.js": "0.9.5",
"dropzone": "5.5.1",
"echarts": "4.2.1",
......@@ -57,57 +59,57 @@
"jsonlint": "1.6.3",
"jszip": "3.2.1",
"lodash": "^4.17.15",
"node-sass": "^4.13.1",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",
"screenfull": "4.2.0",
"showdown": "1.9.0",
"showdown": "^1.9.1",
"sortablejs": "1.8.4",
"tui-editor": "1.3.3",
"vue": "2.6.10",
"vue": "2.6.11",
"vue-count-to": "1.0.13",
"vue-router": "3.0.2",
"vue-splitpane": "1.0.4",
"vuedraggable": "2.20.0",
"vuex": "3.1.0",
"vue-router": "3.1.6",
"vue-splitpane": "1.0.6",
"vuedraggable": "2.23.2",
"vuex": "3.1.3",
"xlsx": "0.14.1"
},
"devDependencies": {
"@babel/core": "7.0.0",
"@babel/register": "7.0.0",
"@vue/cli-plugin-babel": "3.5.3",
"@vue/cli-plugin-eslint": "^3.9.1",
"@vue/eslint-config-prettier": "^5.0.0",
"@vue/cli-plugin-unit-jest": "3.5.3",
"@vue/cli-service": "3.5.3",
"@vue/test-utils": "1.0.0-beta.29",
"@vue/cli-plugin-babel": "4.2.3",
"@vue/cli-plugin-eslint": "^4.2.3",
"@vue/cli-plugin-unit-jest": "4.2.3",
"@vue/cli-service": "4.2.3",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/test-utils": "1.0.0-beta.32",
"autoprefixer": "^9.5.1",
"babel-core": "7.0.0-bridge.0",
"babel-eslint": "10.0.1",
"babel-jest": "23.6.0",
"babel-jest": "^25.1.0",
"chalk": "2.4.2",
"chokidar": "2.1.5",
"chokidar": "^2.1.5",
"connect": "3.6.6",
"eslint": "5.15.3",
"eslint-plugin-prettier": "^3.1.0",
"eslint-plugin-vue": "5.2.2",
"eslint-config-prettier": "^6.1.0",
"prettier-eslint-cli": "^5.0.0",
"prettier": "^1.18.2",
"eslint-plugin-prettier": "^3.1.0",
"eslint-plugin-vue": "6.2.2",
"html-webpack-plugin": "3.2.0",
"husky": "1.3.1",
"lint-staged": "8.1.5",
"mockjs": "1.0.1-beta3",
"node-sass": "^4.9.0",
"plop": "2.3.0",
"prettier": "^1.18.2",
"prettier-eslint-cli": "^5.0.0",
"runjs": "^4.3.2",
"sass-loader": "^7.1.0",
"sass-loader": "^8.0.2",
"script-ext-html-webpack-plugin": "2.1.3",
"script-loader": "0.7.2",
"serve-static": "^1.13.2",
"svg-sprite-loader": "4.1.3",
"svgo": "1.2.0",
"vue-template-compiler": "2.6.10"
"vue-template-compiler": "2.6.11"
},
"engines": {
"node": ">=8.9",
......
......@@ -7,9 +7,17 @@
*/
import request from '@/utils/request';
export function getDictsByParent(params) {
export function layzyLoadDicts(params) {
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',
params: params
});
......
/*
* @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @LastEditTime : 2020-01-11 20:47:10
* @LastEditors : 一日看尽长安花
* @LastEditTime: 2020-03-05 15:29:10
* @LastEditors: 一日看尽长安花
* @Description:
*/
import request from '@/utils/request';
export function getOrgsByParent(params) {
export function layzyLoadOrgs(params) {
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',
params: params
});
......
......@@ -44,3 +44,19 @@ export function usersMetadata() {
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: 一日看尽长安花
* @since: 2019-10-12 16:14:37
* @LastEditTime : 2020-02-03 16:21:23
* @LastEditors : 一日看尽长安花
* @LastEditTime: 2020-03-09 14:28:00
* @LastEditors: 一日看尽长安花
* @Description:
-->
<template>
......@@ -55,6 +55,7 @@
<slot name="filter-condition" :filter-data="filterData"> </slot>
<div class="filter-item-container">
<el-button
ref="searchButton"
:size="size"
class="filter-item"
type="primary"
......
<!--
* @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18
* @LastEditTime : 2020-01-08 22:51:466
* @LastEditors : 一日看尽长安花安花
* @LastEditTime: 2020-03-06 16:02:51
* @LastEditors: 一日看尽长安花
* @Description: 后台管理页面的自动生成,
* 主要暴露了分页方法、数据表格搜索方法、条件查询方法、增删改方法
* 以及 查询面板插槽,功能按钮组插槽,编辑对话框插槽
......@@ -29,7 +29,7 @@
@update:tabledata="$emit('update:tabledata', $event)"
@pagination="pagination"
@handle-edit="handleEdit"
@delete-data="$emit('delete-data')"
@delete-data="$emit('delete-data', $event)"
></data-table>
<detail-page
:metadata="metadata"
......@@ -37,8 +37,8 @@
:dialog-title="dialogTitle"
:operation-type="operationType"
:dialog-data="dialogData"
@create-data="$emit('create-data')"
@update-data="$emit('update-data')"
@create-data="$emit('create-data', $event)"
@update-data="$emit('update-data', $event)"
>
<!-- #dialog-form-item等价v-slot:dialog-form-item 语法
详情参照 解构插槽 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: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @LastEditTime: 2019-10-29 21:52:51
* @LastEditTime: 2020-03-11 16:00:50
* @LastEditors: 一日看尽长安花
* @Description:
*/
......
/*
* @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @LastEditTime: 2019-10-30 19:54:00
* @LastEditTime: 2020-03-11 13:38:40
* @LastEditors: 一日看尽长安花
* @Description:
*/
......
/*
* @Author: 一日看尽长安花
* @since: 2020-01-13 23:12:07
* @LastEditTime : 2020-02-05 17:03:34
* @LastEditors : 一日看尽长安花
* @LastEditTime: 2020-03-09 19:32:36
* @LastEditors: 一日看尽长安花
* @Description: 与业务有关的非纯api的js
*/
import { getDictsByParent } from '@/api/dict';
import { layzyLoadDicts, immaditeLoadDicts } from '@/api/dict';
/**
* @description: 异步载入级联器的数据
......@@ -13,7 +13,7 @@ import { getDictsByParent } from '@/api/dict';
* @param {resolve} 同上
* @param {type} 第一级字典类型
*/
export function loadDictCascaderData(node, resolve, type) {
export function layzyLoadDictTree(node, resolve, type) {
const { root, data } = node;
const { id } = data || {};
let datas = [];
......@@ -24,7 +24,7 @@ export function loadDictCascaderData(node, resolve, type) {
parentId: id,
type: type
};
getDictsByParent(reqParam)
layzyLoadDicts(reqParam)
.then(result => {
const { code, data } = { ...result };
// 通过调用resolve将子节点数据返回,通知组件数据加载完成
......@@ -36,18 +36,22 @@ export function loadDictCascaderData(node, resolve, type) {
}
/**
* @description: 处理级联器的选中值,级联器选中值是个数组,需要处理为指定key-value
* @description: 将json中一个key值为数组的每个值转成指定key-value,主要用于el中的级联选择器
* @param {obj} 包含选中值的对象
* @param {modelKey} 级联器 cascader 的 v-model 选中值的key名称
* @param {keyNames} 转换后的 key 名称级,必须按照级联器选中值的顺序
* @param {arrayKey} 数组的key
* @param {keyNames} 转换后的 key 名称级,必须按照数组中每个值的顺序对应
* @returns {Object} 包含转换后的 key-value 值
*/
export function handleDictCascaderValue(obj, modelKey, keyNames) {
let selValArray = obj[modelKey] || [];
export function handleCascaderValue(obj, arrayKey, keyNames) {
let selValArray = obj[arrayKey] || [];
let resObj = {};
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);
}
/*
* @Author: 一日看尽长安花
* @since: 2020-01-13 23:12:07
* @LastEditTime : 2020-02-05 17:04:59
* @LastEditors : 一日看尽长安花
* @LastEditTime: 2020-03-04 16:22:10
* @LastEditors: 一日看尽长安花
* @Description: 与业务有关的非纯api的js
*/
import { getOrgsByParent } from '@/api/org';
......@@ -13,7 +13,7 @@ import { getOrgsByParent } from '@/api/org';
* @param {resolve} 同上
* @param {type} 第一级字典类型
*/
export function loadOrgCascaderData(node, resolve) {
export function layzyLoadOrgTree(node, resolve) {
const { root, data } = node;
const { id } = data || {};
let datas = [];
......@@ -29,17 +29,3 @@ export function loadOrgCascaderData(node, resolve) {
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 @@
* @Description: In User Settings Edit
* @Author: your name
* @Date: 2019-09-09 12:16:28
* @LastEditTime : 2020-02-04 13:19:39
* @LastEditors : 一日看尽长安花
* @LastEditTime: 2020-03-08 15:59:43
* @LastEditors: 一日看尽长安花
*/
import axios from 'axios';
import { MessageBox, Message } from 'element-ui';
......@@ -22,9 +22,16 @@ const service = axios.create({
service.interceptors.request.use(
config => {
const method = config.method;
/**get方法为params,post、put、delete为data */
const params = config.params || config.data || null;
/**下划线转为驼峰 */
if (params) {
const changedKeyParams = toCamelCaseDeep(params);
const sourceParams = Object.assign({}, params);
const changedKeyParams = Object.assign(
{},
toCamelCaseDeep(params),
sourceParams
);
if (method === 'get') {
config.params = changedKeyParams;
} else {
......@@ -86,8 +93,10 @@ service.interceptors.response.use(
});
});
}
/**将code非200返回码的情况转成错误传出去 */
return Promise.reject(new Error(res.message || 'Error'));
} else {
/** 每次请求成功都要将授权码存放在cookie中,只要五分钟无动作登录授权便失效 */
const authorization = response.headers['authorization'];
setToken(authorization);
return res;
......
<!--
* @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18
* @LastEditTime : 2020-02-04 16:15:14
* @LastEditors : 一日看尽长安花
* @LastEditTime: 2020-03-11 15:30:15
* @LastEditors: 一日看尽长安花
* @Description:
-->
<template>
......@@ -21,29 +21,38 @@
<!-- 往搜索栏中添加搜索条件 -->
<template #filter-condition="{filterData:filterData}">
<div class="filter-item-container">
<el-cascader
v-model="filterData['orgId']"
:props="orgIdCascaderProps"
:show-all-levels="false"
clearable
placeholder="部门"
></el-cascader>
<el-form-item>
<el-cascader
v-model="filterData['orgId']"
:props="orgIdCascaderProps"
:options="orgIdCascaderProps.options"
:show-all-levels="false"
clearable
placeholder="部门"
></el-cascader>
</el-form-item>
</div>
<div class="filter-item-container">
<el-cascader
v-model="filterData['jobType']"
:props="jobTypeCascaderProps"
clearable
placeholder="岗位/职务"
></el-cascader>
<el-form-item>
<el-cascader
v-model="filterData['jobType']"
:props="jobTypeCascaderProps"
:options="jobTypeCascaderProps.options"
clearable
placeholder="岗位/职务"
></el-cascader>
</el-form-item>
</div>
<div class="filter-item-container">
<el-cascader
v-model="filterData['state']"
:props="stateCascaderProps"
clearable
placeholder="状态"
></el-cascader>
<el-form-item>
<el-cascader
v-model="filterData['state']"
:props="stateCascaderProps"
:options="stateCascaderProps.options"
clearable
placeholder="状态"
></el-cascader>
</el-form-item>
</div>
</template>
<!-- 往操作按钮组中添加自定义操作按钮 -->
......@@ -58,15 +67,54 @@
测试
</el-button>
</template>
<!-- 编辑弹窗的插槽 -->
<template #dialog-form-item="{dialogData:dialogData}">
<el-form-item key="slotkey" label="测试插槽" prop="test">
<el-input
v-model="dialogData['test']"
placeholder="test"
:clearable="true"
style="width: 200px;"
class="filter-item"
/>
<el-form-item key="orgIdKey" label="所在机构" prop="org_id">
<el-cascader
v-model="dialogData['org_id_value']"
:props="orgIdCascaderProps"
:options="orgIdCascaderProps.options"
:show-all-levels="false"
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>
</template>
</general-page>
......@@ -75,13 +123,17 @@
<script>
import GeneralPage from '@/components/GeneralPage';
import { users, usersMetadata } from '@/api/user';
import { loadDictCascaderData, handleDictCascaderValue } from '@/services/dict';
import { loadOrgCascaderData, handleOrgCascaderValue } from '@/services/org';
import FileUpload from '@/components/Upload/FileUpload';
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 {
name: 'CoreUsersView',
components: { GeneralPage },
components: { GeneralPage, FileUpload },
props: {},
data() {
return {
......@@ -94,29 +146,41 @@ export default {
loading: true,
orgIdCascaderProps: {
checkStrictly: true,
lazy: true,
lazyLoad(node, resolve) {
loadOrgCascaderData(node, resolve);
}
options: []
},
jobTypeCascaderProps: {
checkStrictly: true,
lazy: true,
lazyLoad(node, resolve) {
loadDictCascaderData(node, resolve, 'job_type');
}
options: []
},
stateCascaderProps: {
checkStrictly: true,
lazy: true,
lazyLoad(node, resolve) {
loadDictCascaderData(node, resolve, 'user_state');
}
options: []
}
};
},
computed: {},
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.obtainData({ page: 1, limit: 10 });
},
......@@ -135,15 +199,31 @@ export default {
},
obtainData(queryParams) {
this.loading = true;
queryParams = handleOrgCascaderValue(queryParams, 'orgId', 'org_id');
queryParams = handleDictCascaderValue(queryParams, 'jobType', [
'jobType0',
'jobType1'
queryParams = handleCascaderValue(queryParams, 'orgId', ['org_id']);
queryParams = handleCascaderValue(queryParams, 'jobType', [
'job_type0',
'job_type1'
]);
queryParams = handleDictCascaderValue(queryParams, 'state', ['state']);
queryParams = handleCascaderValue(queryParams, 'state', ['state']);
users(queryParams)
.then(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);
})
.catch(err => {})
......@@ -163,24 +243,85 @@ export default {
this.obtainData(Object.assign({ page: 1, limit: 10 }, queryParams));
},
createData(dialogData) {
this.$nextTick(() => {
this.$notify({
title: '成功',
message: '添加成功',
type: 'success',
duration: 2000
});
this.handleEditorDataObject(dialogData, 'org_id_value', {
org_id: 'org.id'
});
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) {
this.$nextTick(() => {
this.$notify({
title: '成功',
message: '修改成功',
type: 'success',
duration: 2000
});
this.handleEditorDataObject(dialogData, 'org_id_value', {
org_id: 'org.id'
});
this.handleEditorDataObject(dialogData, 'state_value', {
state: 'state.value'
});
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) {
this.$nextTick(() => {
......
'use strict'
const path = require('path')
const defaultSettings = require('./src/settings.js')
'use strict';
const path = require('path');
const defaultSettings = require('./src/settings.js');
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,
// use administrator privileges to execute the command line.
// For example, Mac: sudo npm run
// You can change the port by the following method:
// 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/
module.exports = {
......@@ -60,14 +60,14 @@ module.exports = {
}
},
chainWebpack(config) {
config.plugins.delete('preload') // TODO: need test
config.plugins.delete('prefetch') // TODO: need test
config.plugins.delete('preload'); // TODO: need test
config.plugins.delete('prefetch'); // TODO: need test
// set svg-sprite-loader
config.module
.rule('svg')
.exclude.add(resolve('src/icons'))
.end()
.end();
config.module
.rule('icons')
.test(/\.svg$/)
......@@ -78,7 +78,7 @@ module.exports = {
.options({
symbolId: 'icon-[name]'
})
.end()
.end();
// set preserveWhitespace
config.module
......@@ -86,16 +86,16 @@ module.exports = {
.use('vue-loader')
.loader('vue-loader')
.tap(options => {
options.compilerOptions.preserveWhitespace = true
return options
options.compilerOptions.preserveWhitespace = true;
return options;
})
.end()
.end();
config
// https://webpack.js.org/configuration/devtool/#development
.when(process.env.NODE_ENV === 'development', config =>
config.devtool('cheap-source-map')
)
);
config.when(process.env.NODE_ENV !== 'development', config => {
config
......@@ -107,7 +107,7 @@ module.exports = {
inline: /runtime\..*\.js$/
}
])
.end()
.end();
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
......@@ -130,8 +130,8 @@ module.exports = {
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