Commit a0a51905 authored by trumansdo's avatar trumansdo
Browse files

1. 确定通用管理页面组件完成,通用组件中无法通用部分:下拉选择器;改为自定义插槽中自行添加

2. 更新element-ui版本 至2.13.0
3. 修复jwt 没有刷新过期时间。最终设置为10分钟过期时间窗口,以最后一次网络请求时间开始计算
parent 31fc8a95
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
"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",
"element-ui": "2.7.0", "element-ui": "2.13.0",
"file-saver": "2.0.1", "file-saver": "2.0.1",
"fuse.js": "3.4.4", "fuse.js": "3.4.4",
"js-cookie": "2.2.0", "js-cookie": "2.2.0",
......
/*
* @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14
* @LastEditTime : 2020-01-11 20:47:10
* @LastEditors : 一日看尽长安花
* @Description:
*/
import request from '@/utils/request';
export function getDictsByParent(params) {
return request({
url: '/core/dicts',
method: 'get',
params: params
});
}
...@@ -38,9 +38,9 @@ export function users(params) { ...@@ -38,9 +38,9 @@ export function users(params) {
}); });
} }
export function usersMetedata() { export function usersMetadata() {
return request({ return request({
url: '/users/metedata', url: '/users/metadata',
method: 'get' method: 'get'
}); });
} }
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<el-table-column :key="Math.random()" type="index"></el-table-column> <el-table-column :key="Math.random()" type="index"></el-table-column>
<el-table-column <el-table-column
v-for="(val, key) in metedata" v-for="(val, key) in metadata"
:key="key" :key="key"
:prop="val.type === 'dict' ? key + '.name' : key" :prop="val.type === 'dict' ? key + '.name' : key"
:label="val.name" :label="val.name"
...@@ -76,7 +76,7 @@ export default { ...@@ -76,7 +76,7 @@ export default {
components: { Pagination }, components: { Pagination },
props: { props: {
// 表格元数据 // 表格元数据
metedata: { metadata: {
type: Object, type: Object,
default() { default() {
return {}; return {};
...@@ -92,6 +92,7 @@ export default { ...@@ -92,6 +92,7 @@ export default {
}; };
} }
}, },
// 搜索数据表格中数据的方法
searchMethod: { searchMethod: {
type: Function, type: Function,
default() { default() {
...@@ -114,12 +115,17 @@ export default { ...@@ -114,12 +115,17 @@ export default {
}; };
}, },
updated() { updated() {
console.log(this.metedata); console.log('以下是元数据和结果数据');
console.log(this.metadata);
console.log(this.tabledata); console.log(this.tabledata);
}, },
methods: { methods: {
searchTable() { searchTable() {
// 要用一个临时数据将当前页面的数据保存下来,不然 $emit 会将原数据修改 /*
要用一个临时数据将当前页面的数据保存下来。
不然 $emit 会将原数据修改,
会造成第二次搜索是基于第一次搜索的结果数据进行搜索的
*/
this.cloneTableData = !this.cloneTableData this.cloneTableData = !this.cloneTableData
? Object.assign({}, this.tabledata) ? Object.assign({}, this.tabledata)
: this.cloneTableData; : this.cloneTableData;
...@@ -134,6 +140,7 @@ export default { ...@@ -134,6 +140,7 @@ export default {
this.cloneTable = null; this.cloneTable = null;
}, },
handleEdit(index, row) { handleEdit(index, row) {
/* index 行号;row 行数据 */
this.$emit('handle-edit', index, row); this.$emit('handle-edit', index, row);
}, },
handleDelete(index, row) { handleDelete(index, row) {
......
...@@ -7,7 +7,9 @@ ...@@ -7,7 +7,9 @@
--> -->
<template> <template>
<div class="dialog-container"> <div class="dialog-container">
<!-- 对话框 --> <!--
对话框:通过$emit 继续提交open和close事件改变对话框的显示和隐藏
-->
<el-dialog <el-dialog
:title="dialogTitle" :title="dialogTitle"
:visible="dialogVisible" :visible="dialogVisible"
...@@ -24,7 +26,7 @@ ...@@ -24,7 +26,7 @@
style="width: 400px; margin-left:50px;" style="width: 400px; margin-left:50px;"
> >
<el-form-item <el-form-item
v-for="(val, key) in metedata" v-for="(val, key) in metadata"
:key="key" :key="key"
:label="val.name" :label="val.name"
:prop="key" :prop="key"
...@@ -45,17 +47,8 @@ ...@@ -45,17 +47,8 @@
:placeholder="val.name + '时间'" :placeholder="val.name + '时间'"
> >
</el-date-picker> </el-date-picker>
<el-select
v-else-if="judgeType(val.type, 'dict')"
:placeholder="val.name"
:clearable="true"
class="filter-item"
>
<el-option />
</el-select>
</el-form-item> </el-form-item>
<!-- 给某些无法自动生成表单域的插槽,并将数据向插槽传递 --> <!-- 用于面板中的自定义表单元素,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 -->
<slot :dialog-data="dialogData" name="dialog-form-item"></slot> <slot :dialog-data="dialogData" name="dialog-form-item"></slot>
</el-form> </el-form>
<template v-slot:footer> <template v-slot:footer>
...@@ -81,7 +74,7 @@ import { equalsIgnoreCase } from '@/utils/str-util'; ...@@ -81,7 +74,7 @@ import { equalsIgnoreCase } from '@/utils/str-util';
export default { export default {
name: 'EditDialog', name: 'EditDialog',
props: { props: {
metedata: { metadata: {
type: Object, type: Object,
default() { default() {
return {}; return {};
...@@ -123,6 +116,8 @@ export default { ...@@ -123,6 +116,8 @@ export default {
this.$refs['editForm'].validate(valid => { this.$refs['editForm'].validate(valid => {
if (valid) { if (valid) {
this.$emit('create-data', this.dialogData); this.$emit('create-data', this.dialogData);
/* 将回调延迟到下次 DOM 更新循环之后执行。
而数据更新就代表dom更新,所以如果创建成功,数据就会更新 */
this.$nextTick(() => { this.$nextTick(() => {
this.$emit('update:dialogVisible', false); this.$emit('update:dialogVisible', false);
this.$notify({ this.$notify({
...@@ -166,6 +161,7 @@ export default { ...@@ -166,6 +161,7 @@ export default {
}); });
}, },
openDialog() { openDialog() {
/* 参照vue中 .sync 修饰符章节,方便的刷新父组件的dialogVisible值*/
this.$emit('update:dialogVisible', true); this.$emit('update:dialogVisible', true);
}, },
closeDialog() { closeDialog() {
......
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 16:14:37 * @since: 2019-10-12 16:14:37
* @LastEditTime: 2019-12-17 14:41:14 * @LastEditTime : 2020-01-09 23:16:28
* @LastEditors: 一日看尽长安花 * @LastEditors : 一日看尽长安花
* @Description: * @Description:
--> -->
<template> <template>
<div class="filter-container"> <div class="filter-container">
<!-- 取消表单的提交动作 -->
<el-form <el-form
ref="filterForm" ref="filterForm"
:size="size" :size="size"
:model="filterData" :model="filterData"
@submit.native.prevent @submit.native.prevent
> >
<!-- 循环元数据构建搜索面板:除了下拉框 -->
<div <div
v-for="(val, key) in metedata" v-for="(val, key) in metadata"
:key="key" :key="key"
class="filter-item-container" class="filter-item-container"
> >
...@@ -45,17 +47,9 @@ ...@@ -45,17 +47,9 @@
> >
</el-date-picker> </el-date-picker>
</div> </div>
<el-select
v-else-if="judgeType(val.type, 'dict')"
:placeholder="val.name"
:clearable="true"
class="filter-item"
>
<el-option />
</el-select>
</el-form-item> </el-form-item>
</div> </div>
<!-- 用于面板中的自定义表单,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 -->
<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
...@@ -81,6 +75,7 @@ ...@@ -81,6 +75,7 @@
> >
添加 添加
</el-button> </el-button>
<!-- 用于面板中的自定义功能按钮,例如导入导出按钮等,并通过作用域插槽的方式将数据传递给自定义表单 -->
<slot name="operation-btn-group" :filter-data="filterData"> </slot> <slot name="operation-btn-group" :filter-data="filterData"> </slot>
</div> </div>
</div> </div>
...@@ -92,7 +87,7 @@ import { equalsIgnoreCase } from '@/utils/str-util'; ...@@ -92,7 +87,7 @@ import { equalsIgnoreCase } from '@/utils/str-util';
export default { export default {
name: 'SearchPane', name: 'SearchPane',
props: { props: {
metedata: { metadata: {
type: Object, type: Object,
default() { default() {
return {}; return {};
...@@ -129,16 +124,3 @@ export default { ...@@ -129,16 +124,3 @@ export default {
} }
}; };
</script> </script>
<style>
.filter-container {
margin-top: 1rem;
}
.filter-item-container {
display: inline-block;
margin: 0.15em;
}
.filter-btn-group {
margin: 0.15em;
}
</style>
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18 * @since: 2019-10-12 15:43:18
* @LastEditTime: 2019-11-30 22:23:06 * @LastEditTime : 2020-01-08 22:51:466
* @LastEditors: 一日看尽长安花 * @LastEditors : 一日看尽长安花安花
* @Description: 后台管理页面的自动生成, * @Description: 后台管理页面的自动生成,
* 主要暴露了分页方法、过滤表格(单纯前端过滤)、条件查询、增删改方法 * 主要暴露了分页方法、数据表格搜索方法、条件查询方法、增删改方法
* 以及 查询面板插槽,功能按钮组插槽,编辑对话框插槽
--> -->
<template> <template>
<div> <div>
<search-pane <search-pane
:metedata="metedata" :metadata="metadata"
@filter-search="filterSearch" @filter-search="filterSearch"
@handle-create="handleCreate" @handle-create="handleCreate"
> >
...@@ -22,7 +23,7 @@ ...@@ -22,7 +23,7 @@
</search-pane> </search-pane>
<data-table <data-table
:loading="loading" :loading="loading"
:metedata="metedata" :metadata="metadata"
:tabledata="tabledata" :tabledata="tabledata"
:search-method="searchMethod" :search-method="searchMethod"
@update:tabledata="$emit('update:tabledata', $event)" @update:tabledata="$emit('update:tabledata', $event)"
...@@ -31,7 +32,7 @@ ...@@ -31,7 +32,7 @@
@delete-data="$emit('delete-data')" @delete-data="$emit('delete-data')"
></data-table> ></data-table>
<edit-dialog <edit-dialog
:metedata="metedata" :metadata="metadata"
:dialog-visible.sync="dialogVisible" :dialog-visible.sync="dialogVisible"
:dialog-title="dialogTitle" :dialog-title="dialogTitle"
:operation-type="operationType" :operation-type="operationType"
...@@ -39,6 +40,8 @@ ...@@ -39,6 +40,8 @@
@create-data="$emit('create-data')" @create-data="$emit('create-data')"
@update-data="$emit('update-data')" @update-data="$emit('update-data')"
> >
<!-- #dialog-form-item等价v-slot:dialog-form-item 语法
详情参照 解构插槽 Prop 章节 -->
<template #dialog-form-item="{dialogData:dialogData}"> <template #dialog-form-item="{dialogData:dialogData}">
<slot :dialog-data="dialogData" name="dialog-form-item"></slot> <slot :dialog-data="dialogData" name="dialog-form-item"></slot>
</template> </template>
...@@ -56,7 +59,7 @@ export default { ...@@ -56,7 +59,7 @@ export default {
components: { SearchPane, DataTable, EditDialog }, components: { SearchPane, DataTable, EditDialog },
props: { props: {
// 表格元数据 // 表格元数据
metedata: { metadata: {
type: Object, type: Object,
default() { default() {
return {}; return {};
...@@ -72,7 +75,6 @@ export default { ...@@ -72,7 +75,6 @@ export default {
}; };
} }
}, },
// 加载中的遮罩层 // 加载中的遮罩层
loading: { loading: {
type: Boolean, type: Boolean,
...@@ -121,3 +123,21 @@ export default { ...@@ -121,3 +123,21 @@ export default {
} }
}; };
</script> </script>
<style>
.filter-container {
margin-top: 1rem;
}
.filter-item-container {
display: inline-block;
margin: 0.15em;
}
.filter-item-container .el-cascader {
top: -4px;
}
.filter-btn-group {
margin: 0.15em;
}
</style>
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
* @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: 2019-10-27 23:12:07 * @LastEditTime : 2020-01-11 23:24:40
* @LastEditors: 一日看尽长安花 * @LastEditors : 一日看尽长安花
*/ */
import axios from 'axios'; import axios from 'axios';
import { MessageBox, Message } from 'element-ui'; import { MessageBox, Message } from 'element-ui';
import store from '@/store'; import store from '@/store';
import { getToken } from '@/utils/auth'; import { getToken, setToken } from '@/utils/auth';
// create an axios instance // create an axios instance
const service = axios.create({ const service = axios.create({
...@@ -21,7 +21,6 @@ const service = axios.create({ ...@@ -21,7 +21,6 @@ const service = axios.create({
service.interceptors.request.use( service.interceptors.request.use(
config => { config => {
// do something before request is sent // do something before request is sent
if (store.getters.token) { if (store.getters.token) {
// let each request carry token // let each request carry token
// ['Authorization'] see to MDN explain about "HTTP Authorization" // ['Authorization'] see to MDN explain about "HTTP Authorization"
...@@ -49,9 +48,8 @@ service.interceptors.response.use( ...@@ -49,9 +48,8 @@ service.interceptors.response.use(
* Here is just an example * Here is just an example
* You can also judge the status by HTTP Status Code * You can also judge the status by HTTP Status Code
*/ */
response => { (response, b, c, d) => {
const res = response.data; const res = response.data;
// if the custom code is not 20000, it is judged as an error. // if the custom code is not 20000, it is judged as an error.
if (res.code !== 200) { if (res.code !== 200) {
Message({ Message({
...@@ -79,6 +77,8 @@ service.interceptors.response.use( ...@@ -79,6 +77,8 @@ service.interceptors.response.use(
} }
return Promise.reject(new Error(res.message || 'Error')); return Promise.reject(new Error(res.message || 'Error'));
} else { } else {
const authorization = response.headers['authorization'];
setToken(authorization);
return res; return res;
} }
}, },
......
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18 * @since: 2019-10-12 15:43:18
* @LastEditTime: 2019-12-17 20:56:50 * @LastEditTime : 2020-01-11 21:15:32
* @LastEditors: 一日看尽长安花 * @LastEditors : 一日看尽长安花
* @Description: * @Description:
--> -->
<template> <template>
<div> <div>
<table-views <table-views
:metedata="metedata" :metadata="metadata"
:tabledata.sync="tabledata" :tabledata.sync="tabledata"
:loading="loading" :loading="loading"
:search-method="searchMethod" :search-method="searchMethod"
...@@ -18,19 +18,13 @@ ...@@ -18,19 +18,13 @@
@delete-data="deleteData" @delete-data="deleteData"
@update-data="updateData" @update-data="updateData"
> >
<!-- fixed 待解决的问题:样式问题。猜测原因:应该是样式穿透问题,不能是scope -->
<!-- 往搜索栏中添加搜索条件 --> <!-- 往搜索栏中添加搜索条件 -->
<template #filter-condition="{filterData:filterData}"> <template #filter-condition="{filterData:filterData}">
<div class="filter-item-container"> <div class="filter-item-container">
<el-form-item> <el-cascader
<el-input v-model="filterData['jobType']"
v-model="filterData['test']" :props="jobTypeCascaderProps"
placeholder="test" ></el-cascader>
:clearable="true"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
</div> </div>
</template> </template>
<!-- 往操作按钮组中添加自定义操作按钮 --> <!-- 往操作按钮组中添加自定义操作按钮 -->
...@@ -62,35 +56,58 @@ ...@@ -62,35 +56,58 @@
<script> <script>
import TableViews from '@/components/TableViews'; import TableViews from '@/components/TableViews';
import { users, usersMetedata } from '@/api/user'; import { users, usersMetadata } from '@/api/user';
import { getDictsByParent } from '@/api/dict';
export default { export default {
name: 'CoreUsers', name: 'CoreUsersView',
components: { TableViews }, components: { TableViews },
props: {}, props: {},
data() { data() {
return { return {
// 整个页面的数据 // 整个页面的数据
metedata: {}, metadata: {},
tabledata: { tabledata: {
data: [], data: [],
total: 0 total: 0
}, },
loading: true loading: true,
jobTypeCascaderProps: {
checkStrictly: true,
lazy: true,
lazyLoad(node, resolve) {
const { root, data } = node;
const { id } = data || {};
let datas = [],
type;
if (root) {
type = 'job_type';
}
let reqParam = {
parentId: id,
type: type
};
getDictsByParent(reqParam).then(result => {
const { code, data } = { ...result };
// 通过调用resolve将子节点数据返回,通知组件数据加载完成
resolve(data);
});
}
}
}; };
}, },
computed: {}, computed: {},
mounted() { mounted() {
this.obtainMetedata(); this.obtainMetadata();
this.obtainData({ page: 1, limit: 10 }); this.obtainData({ page: 1, limit: 10 });
}, },
methods: { methods: {
obtainMetedata() { obtainMetadata() {
this.loading = true; this.loading = true;
usersMetedata() usersMetadata()
.then(result => { .then(result => {
const { code, data } = { ...result }; const { code, data } = { ...result };
this.metedata = Object.assign({}, data); this.metadata = Object.assign({}, data);
}) })
.catch(err => {}) .catch(err => {})
.finally(() => { .finally(() => {
......
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