docs: update readme
Signed-off-by: yovinchen <gzh298255@gmail.com>
This commit is contained in:
parent
714ded1155
commit
535a5dd1b5
@ -8,6 +8,15 @@
|
|||||||
|
|
||||||
目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0),它不依赖 `vue-cli`。
|
目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0),它不依赖 `vue-cli`。
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<b>SPONSORED BY</b>
|
||||||
|
</p>
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://finclip.com?from=vue_element" title="FinClip" target="_blank">
|
||||||
|
<img height="200px" src="https://gitee.com/panjiachen/gitee-cdn/raw/master/vue%E8%B5%9E%E5%8A%A9.png" title="FinClip">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
## Extra
|
## Extra
|
||||||
|
|
||||||
如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
|
如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
|
||||||
|
@ -9,6 +9,15 @@ English | [简体中文](./README-zh.md)
|
|||||||
|
|
||||||
**The current version is `v4.0+` build on `vue-cli`. If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0), it does not rely on `vue-cli`**
|
**The current version is `v4.0+` build on `vue-cli`. If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0), it does not rely on `vue-cli`**
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<b>SPONSORED BY</b>
|
||||||
|
</p>
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://finclip.com?from=vue_element" title="FinClip" target="_blank">
|
||||||
|
<img height="200px" src="https://gitee.com/panjiachen/gitee-cdn/raw/master/vue%E8%B5%9E%E5%8A%A9.png" title="FinClip">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
## Build Setup
|
## Build Setup
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
116
src/api/system/sysRole.js
Normal file
116
src/api/system/sysRole.js
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
角色管理相关的API请求函数
|
||||||
|
*/
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
const api_name = '/admin/system/sysRole'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取角色分页列表(带搜索)
|
||||||
|
* @param {*} page
|
||||||
|
* @param {*} limit
|
||||||
|
* @param {*} searchObj
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
getPageList(page, limit, searchObj) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/${page}/${limit}`,
|
||||||
|
method: 'get',
|
||||||
|
// 如果是普通对象参数写法,params:对象参数名
|
||||||
|
// 如果是使用json格式传递,data:对象参数名
|
||||||
|
params: searchObj
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色删除
|
||||||
|
* @param {*} id
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
removeById(id) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/remove/${id}`,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色添加
|
||||||
|
* @param {*} role
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
save(role) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/save`,
|
||||||
|
method: 'post',
|
||||||
|
data: role
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 回显要修改的id信息
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
getById(id) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/get/${id}`,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/** 修改
|
||||||
|
*
|
||||||
|
* @param role
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
updateById(role) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/update`,
|
||||||
|
method: 'put',
|
||||||
|
data: role
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除
|
||||||
|
*
|
||||||
|
* @param idList
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
batchRemove(idList) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/batchRemove`,
|
||||||
|
method: `delete`,
|
||||||
|
data: idList
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 根据用户获取角色数据
|
||||||
|
*
|
||||||
|
* @param adminId
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
getRoles(adminId) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/toAssign/${adminId}`,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 为用户分配角色
|
||||||
|
*
|
||||||
|
* @param assginRoleVo
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
assignRoles(assginRoleVo) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/doAssign`,
|
||||||
|
method: 'post',
|
||||||
|
data: assginRoleVo
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
49
src/api/system/sysUser.js
Normal file
49
src/api/system/sysUser.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
const api_name = '/admin/system/sysUser'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
|
||||||
|
getPageList(page, limit, searchObj) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/${page}/${limit}`,
|
||||||
|
method: 'get',
|
||||||
|
params: searchObj // url查询字符串或表单键值对
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getById(id) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/get/${id}`,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
save(role) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/save`,
|
||||||
|
method: 'post',
|
||||||
|
data: role
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
updateById(role) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/update`,
|
||||||
|
method: 'put',
|
||||||
|
data: role
|
||||||
|
})
|
||||||
|
},
|
||||||
|
removeById(id) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/remove/${id}`,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
updateStatus(id, status) {
|
||||||
|
return request({
|
||||||
|
url: `${api_name}/updateStatus/${id}/${status}`,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,7 @@ import request from '@/utils/request'
|
|||||||
|
|
||||||
export function login(data) {
|
export function login(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/vue-admin-template/user/login',
|
url: '/admin/system/index/login',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
@ -10,15 +10,15 @@ export function login(data) {
|
|||||||
|
|
||||||
export function getInfo(token) {
|
export function getInfo(token) {
|
||||||
return request({
|
return request({
|
||||||
url: '/vue-admin-template/user/info',
|
url: '/admin/system/index/info',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: { token }
|
params: {token}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function logout() {
|
export function logout() {
|
||||||
return request({
|
return request({
|
||||||
url: '/vue-admin-template/user/logout',
|
url: '/admin/system/index/logout',
|
||||||
method: 'post'
|
method: 'post'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import Router from 'vue-router'
|
import Router from 'vue-router'
|
||||||
|
|
||||||
Vue.use(Router)
|
|
||||||
|
|
||||||
/* Layout */
|
/* Layout */
|
||||||
import Layout from '@/layout'
|
import Layout from '@/layout'
|
||||||
|
|
||||||
|
Vue.use(Router)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Note: sub-menu only appear when route children.length >= 1
|
* Note: sub-menu only appear when route children.length >= 1
|
||||||
* Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
|
* Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
|
||||||
@ -54,6 +53,34 @@ export const constantRoutes = [
|
|||||||
meta: { title: 'Dashboard', icon: 'dashboard' }
|
meta: { title: 'Dashboard', icon: 'dashboard' }
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/system',
|
||||||
|
component: Layout,
|
||||||
|
meta: {
|
||||||
|
title: '系统管理',
|
||||||
|
icon: 'el-icon-s-tools'
|
||||||
|
},
|
||||||
|
alwaysShow: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: 'sysUser',
|
||||||
|
path: 'sysUser',
|
||||||
|
component: () => import('@/views/system/sysUser/list'),
|
||||||
|
meta: {
|
||||||
|
title: '用户管理',
|
||||||
|
icon: 'el-icon-s-custom'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'sysRole',
|
||||||
|
component: () => import('@/views/system/sysRole/list'),
|
||||||
|
meta: {
|
||||||
|
title: '角色管理',
|
||||||
|
icon: 'el-icon-s-help'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
path: '/example',
|
path: '/example',
|
||||||
|
@ -46,7 +46,7 @@ service.interceptors.response.use(
|
|||||||
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 !== 20000) {
|
if (res.code !== 200) {
|
||||||
Message({
|
Message({
|
||||||
message: res.message || 'Error',
|
message: res.message || 'Error',
|
||||||
type: 'error',
|
type: 'error',
|
||||||
|
230
src/views/system/sysRole/list.vue
Normal file
230
src/views/system/sysRole/list.vue
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
|
||||||
|
<!--查询表单-->
|
||||||
|
<div class="search-div">
|
||||||
|
<el-form label-width="70px" size="small">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item label="角色名称">
|
||||||
|
<el-input v-model="searchObj.roleName" placeholder="角色名称" style="width: 100%" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row style="display:flex">
|
||||||
|
<el-button :loading="loading" icon="el-icon-search" size="mini" type="primary" @click="fetchData()">搜索
|
||||||
|
</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetData">重置</el-button>
|
||||||
|
<!-- 工具条 -->
|
||||||
|
<!-- <div class="tools-div" style="padding-left: 15px">-->
|
||||||
|
<el-button icon="el-icon-plus" size="mini" type="success" @click="add">添 加</el-button>
|
||||||
|
<el-button class="btn-add" size="mini" @click="batchRemove()">批量删除</el-button>
|
||||||
|
<!-- </div>-->
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 表格 -->
|
||||||
|
<el-table
|
||||||
|
v-loading="listLoading"
|
||||||
|
:data="list"
|
||||||
|
border
|
||||||
|
stripe
|
||||||
|
style="width: 100%;margin-top: 10px;"
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
>
|
||||||
|
|
||||||
|
<el-table-column type="selection" />
|
||||||
|
|
||||||
|
<el-table-column
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
width="70"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ (page - 1) * limit + scope.$index + 1 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column label="角色名称" prop="roleName" />
|
||||||
|
<el-table-column label="角色编码" prop="roleCode" />
|
||||||
|
<el-table-column label="创建时间" prop="createTime" width="160" />
|
||||||
|
<el-table-column align="center" label="操作" width="200">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button icon="el-icon-edit" size="mini" title="修改" type="primary" @click="edit(scope.row.id)" />
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-delete"
|
||||||
|
size="mini"
|
||||||
|
title="删除"
|
||||||
|
type="danger"
|
||||||
|
@click="removeDataById(scope.row.id)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<!-- 分页组件 -->
|
||||||
|
<el-pagination
|
||||||
|
:current-page="page"
|
||||||
|
:page-size="limit"
|
||||||
|
:total="total"
|
||||||
|
layout="total, prev, pager, next, jumper"
|
||||||
|
style="padding: 30px 0; text-align: center;"
|
||||||
|
@current-change="fetchData"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<el-dialog :visible.sync="dialogVisible" title="添加/修改" width="40%">
|
||||||
|
<el-form ref="dataForm" :model="sysRole" label-width="150px" size="small" style="padding-right: 40px;">
|
||||||
|
<el-form-item label="角色名称">
|
||||||
|
<el-input v-model="sysRole.roleName" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="角色编码">
|
||||||
|
<el-input v-model="sysRole.roleCode" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button icon="el-icon-refresh-right" size="small" @click="dialogVisible = false">取 消</el-button>
|
||||||
|
<el-button icon="el-icon-check" size="small" type="primary" @click="saveOrUpdate()">确 定</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import api from '@/api/system/sysRole'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
// 定义数据模型
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
list: [], // 列表
|
||||||
|
total: 0, // 总记录数
|
||||||
|
page: 1, // 页码
|
||||||
|
limit: 10, // 每页记录数
|
||||||
|
searchObj: {}, // 查询条件
|
||||||
|
multipleSelection: [], // 批量删除选中的记录列表
|
||||||
|
dialogVisible: false, // 是否弹框
|
||||||
|
sysRole: {}, // 封装表单用户数据
|
||||||
|
saveBtnDisabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 页面渲染成功后获取数据
|
||||||
|
created() {
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
// 定义方法
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
// 当多选选项发生变化的时候调用
|
||||||
|
handleSelectionChange(selection) {
|
||||||
|
console.log(selection)
|
||||||
|
this.multipleSelection = selection
|
||||||
|
},
|
||||||
|
// 批量删除
|
||||||
|
batchRemove() {
|
||||||
|
if (this.multipleSelection.length === 0) {
|
||||||
|
this.$message.warning('请选择要删除的记录!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
// 点击确定,远程调用ajax
|
||||||
|
// 遍历selection,将id取出放入id列表
|
||||||
|
var idList = []
|
||||||
|
this.multipleSelection.forEach(item => {
|
||||||
|
idList.push(item.id)
|
||||||
|
})
|
||||||
|
// 调用api
|
||||||
|
return api.batchRemove(idList)
|
||||||
|
}).then((response) => {
|
||||||
|
this.fetchData()
|
||||||
|
this.$message.success(response.message)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 点击修改,弹出框,根据id查询数据显示
|
||||||
|
edit(id) {
|
||||||
|
// 弹出框
|
||||||
|
this.dialogVisible = true
|
||||||
|
// 根据id查询
|
||||||
|
this.fetchDataById(id)
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchDataById(id) {
|
||||||
|
api.getById(id).then(response => {
|
||||||
|
this.sysRole = response.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 点击添加弹框
|
||||||
|
add() {
|
||||||
|
this.dialogVisible = true
|
||||||
|
},
|
||||||
|
|
||||||
|
saveOrUpdate() {
|
||||||
|
this.saveBtnDisabled = true // 防止表单重复提交
|
||||||
|
// 根据id判断
|
||||||
|
if (!this.sysRole.id) { // 添加
|
||||||
|
this.saveData()
|
||||||
|
} else { // 修改
|
||||||
|
this.updateData()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增
|
||||||
|
saveData() {
|
||||||
|
api.save(this.sysRole).then(response => {
|
||||||
|
// 提示
|
||||||
|
this.$message.success(response.message || '操作成功')
|
||||||
|
// 关闭弹框
|
||||||
|
this.dialogVisible = false
|
||||||
|
// 刷新页面
|
||||||
|
this.fetchData(this.page)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改
|
||||||
|
updateData() {
|
||||||
|
api.updateById(this.sysRole).then(response => {
|
||||||
|
// 提示
|
||||||
|
this.$message.success(response.message || '操作成功')
|
||||||
|
// 关闭弹框
|
||||||
|
this.dialogVisible = false
|
||||||
|
// 刷新页面
|
||||||
|
this.fetchData(this.page)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 条件分页查询
|
||||||
|
fetchData(current = 1) {
|
||||||
|
this.page = current
|
||||||
|
// 调用api
|
||||||
|
api.getPageList(this.page, this.limit, this.searchObj).then(response => {
|
||||||
|
this.list = response.data.records
|
||||||
|
this.total = response.data.total
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 根据id删除数据
|
||||||
|
removeDataById(id) {
|
||||||
|
// debugger
|
||||||
|
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => { // promise
|
||||||
|
// 点击确定,远程调用ajax
|
||||||
|
return api.removeById(id)
|
||||||
|
}).then((response) => {
|
||||||
|
// 刷新页面
|
||||||
|
this.fetchData(this.page)
|
||||||
|
// 提示信息
|
||||||
|
this.$message.success(response.message || '删除成功')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
370
src/views/system/sysUser/list.vue
Normal file
370
src/views/system/sysUser/list.vue
Normal file
@ -0,0 +1,370 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
|
||||||
|
<div class="search-div">
|
||||||
|
<el-form label-width="70px" size="small">
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="关 键 字">
|
||||||
|
<el-input v-model="searchObj.keyword" placeholder="用户名/姓名/手机号码" style="width: 95%" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item label="操作时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="createTimes"
|
||||||
|
end-placeholder="结束时间"
|
||||||
|
range-separator="至"
|
||||||
|
start-placeholder="开始时间"
|
||||||
|
style="margin-right: 10px;width: 100%;"
|
||||||
|
type="datetimerange"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row style="display:flex">
|
||||||
|
<el-button :loading="loading" icon="el-icon-search" size="mini" type="primary" @click="fetchData()">搜索
|
||||||
|
</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetData">重置</el-button>
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 工具条 -->
|
||||||
|
<div class="tools-div">
|
||||||
|
<el-button icon="el-icon-plus" size="mini" type="success" @click="add">添 加</el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<el-table
|
||||||
|
v-loading="listLoading"
|
||||||
|
:data="list"
|
||||||
|
border
|
||||||
|
stripe
|
||||||
|
style="width: 100%;margin-top: 10px;"
|
||||||
|
>
|
||||||
|
|
||||||
|
<el-table-column
|
||||||
|
align="center"
|
||||||
|
label="序号"
|
||||||
|
width="70"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ (page - 1) * limit + scope.$index + 1 }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column label="用户名" prop="username" width="100" />
|
||||||
|
<el-table-column label="姓名" prop="name" width="70" />
|
||||||
|
<el-table-column label="手机" prop="phone" width="120" />
|
||||||
|
<el-table-column label="岗位" prop="postName" width="100" />
|
||||||
|
<el-table-column label="部门" prop="deptName" width="100" />
|
||||||
|
<el-table-column label="所属角色" width="130">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span v-for="item in scope.row.roleList" :key="item.id" style="margin-right: 10px;">{{ item.roleName }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="状态" width="80">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-switch
|
||||||
|
v-model="scope.row.status === 1"
|
||||||
|
@change="switchStatus(scope.row)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" prop="createTime" width="160" />
|
||||||
|
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button icon="el-icon-edit" size="mini" title="修改" type="primary" @click="edit(scope.row.id)" />
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-delete"
|
||||||
|
size="mini"
|
||||||
|
title="删除"
|
||||||
|
type="danger"
|
||||||
|
@click="removeDataById(scope.row.id)"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
icon="el-icon-baseball"
|
||||||
|
size="mini"
|
||||||
|
title="分配角色"
|
||||||
|
type="warning"
|
||||||
|
@click="showAssignRole(scope.row)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<!-- 分页组件 -->
|
||||||
|
<el-pagination
|
||||||
|
:current-page="page"
|
||||||
|
:page-size="limit"
|
||||||
|
:page-sizes="[5, 10, 20, 30, 40, 50, 100]"
|
||||||
|
:total="total"
|
||||||
|
layout="sizes, prev, pager, next, jumper, ->, total, slot"
|
||||||
|
style="padding: 30px 0; text-align: center;"
|
||||||
|
@current-change="fetchData"
|
||||||
|
@size-change="changeSize"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<el-dialog :visible.sync="dialogVisible" title="添加/修改" width="40%">
|
||||||
|
<el-form ref="dataForm" :model="sysUser" label-width="100px" size="small" style="padding-right: 40px;">
|
||||||
|
<el-form-item label="用户名" prop="username">
|
||||||
|
<el-input v-model="sysUser.username" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="!sysUser.id" label="密码" prop="password">
|
||||||
|
<el-input v-model="sysUser.password" type="password" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="姓名" prop="name">
|
||||||
|
<el-input v-model="sysUser.name" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="手机" prop="phone">
|
||||||
|
<el-input v-model="sysUser.phone" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button icon="el-icon-refresh-right" size="small" @click="dialogVisible = false">取 消</el-button>
|
||||||
|
<el-button icon="el-icon-check" size="small" type="primary" @click="saveOrUpdate()">确 定</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<el-dialog :visible.sync="dialogRoleVisible" title="分配角色">
|
||||||
|
<el-form label-width="80px">
|
||||||
|
<el-form-item label="用户名">
|
||||||
|
<el-input :value="sysUser.username" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item label="角色列表">
|
||||||
|
<el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全选
|
||||||
|
</el-checkbox>
|
||||||
|
<div style="margin: 15px 0;" />
|
||||||
|
<el-checkbox-group v-model="userRoleIds" @change="handleCheckedChange">
|
||||||
|
<el-checkbox v-for="role in allRoles" :key="role.id" :label="role.id">{{ role.roleName }}</el-checkbox>
|
||||||
|
</el-checkbox-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer">
|
||||||
|
<el-button size="small" type="primary" @click="assignRole">保存</el-button>
|
||||||
|
<el-button size="small" @click="dialogRoleVisible = false">取消</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import api from '@/api/system/sysUser'
|
||||||
|
import roleApi from '@/api/system/sysRole'
|
||||||
|
|
||||||
|
const defaultForm = {
|
||||||
|
id: '',
|
||||||
|
username: '',
|
||||||
|
password: '',
|
||||||
|
name: '',
|
||||||
|
phone: '',
|
||||||
|
status: 1
|
||||||
|
}
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
listLoading: true, // 数据是否正在加载
|
||||||
|
list: null, // banner列表
|
||||||
|
total: 0, // 数据库中的总记录数
|
||||||
|
page: 1, // 默认页码
|
||||||
|
limit: 10, // 每页记录数
|
||||||
|
searchObj: {}, // 查询表单对象
|
||||||
|
|
||||||
|
createTimes: [],
|
||||||
|
|
||||||
|
dialogVisible: false,
|
||||||
|
sysUser: defaultForm,
|
||||||
|
saveBtnDisabled: false,
|
||||||
|
|
||||||
|
dialogRoleVisible: false,
|
||||||
|
allRoles: [], // 所有角色列表
|
||||||
|
userRoleIds: [], // 用户的角色ID的列表
|
||||||
|
isIndeterminate: false, // 是否是不确定的
|
||||||
|
checkAll: false // 是否全选
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 生命周期函数:内存准备完毕,页面尚未渲染
|
||||||
|
created() {
|
||||||
|
console.log('list created......')
|
||||||
|
this.fetchData()
|
||||||
|
|
||||||
|
roleApi.findAll().then(response => {
|
||||||
|
this.roleList = response.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 生命周期函数:内存准备完毕,页面渲染成功
|
||||||
|
mounted() {
|
||||||
|
console.log('list mounted......')
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
// 当页码发生改变的时候
|
||||||
|
changeSize(size) {
|
||||||
|
console.log(size)
|
||||||
|
this.limit = size
|
||||||
|
this.fetchData(1)
|
||||||
|
},
|
||||||
|
|
||||||
|
// 加载banner列表数据
|
||||||
|
fetchData(page = 1) {
|
||||||
|
debugger
|
||||||
|
this.page = page
|
||||||
|
console.log('翻页。。。' + this.page)
|
||||||
|
|
||||||
|
if (this.createTimes && this.createTimes.length === 2) {
|
||||||
|
this.searchObj.createTimeBegin = this.createTimes[0]
|
||||||
|
this.searchObj.createTimeEnd = this.createTimes[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
api.getPageList(this.page, this.limit, this.searchObj).then(
|
||||||
|
response => {
|
||||||
|
// this.list = response.data.list
|
||||||
|
this.list = response.data.records
|
||||||
|
this.total = response.data.total
|
||||||
|
|
||||||
|
// 数据加载并绑定成功
|
||||||
|
this.listLoading = false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
|
||||||
|
// 重置查询表单
|
||||||
|
resetData() {
|
||||||
|
console.log('重置查询表单')
|
||||||
|
this.searchObj = {}
|
||||||
|
this.createTimes = []
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
|
||||||
|
// 根据id删除数据
|
||||||
|
removeDataById(id) {
|
||||||
|
// debugger
|
||||||
|
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => { // promise
|
||||||
|
// 点击确定,远程调用ajax
|
||||||
|
return api.removeById(id)
|
||||||
|
}).then((response) => {
|
||||||
|
this.fetchData(this.page)
|
||||||
|
this.$message.success(response.message || '删除成功')
|
||||||
|
}).catch(() => {
|
||||||
|
this.$message.info('取消删除')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// -------------
|
||||||
|
add() {
|
||||||
|
this.dialogVisible = true
|
||||||
|
this.sysUser = Object.assign({}, defaultForm)
|
||||||
|
},
|
||||||
|
|
||||||
|
edit(id) {
|
||||||
|
this.dialogVisible = true
|
||||||
|
this.fetchDataById(id)
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchDataById(id) {
|
||||||
|
api.getById(id).then(response => {
|
||||||
|
this.sysUser = response.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
saveOrUpdate() {
|
||||||
|
this.$refs.dataForm.validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
this.saveBtnDisabled = true // 防止表单重复提交
|
||||||
|
if (!this.sysUser.id) {
|
||||||
|
this.saveData()
|
||||||
|
} else {
|
||||||
|
this.updateData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增
|
||||||
|
saveData() {
|
||||||
|
api.save(this.sysUser).then(response => {
|
||||||
|
this.$message.success('操作成功')
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.fetchData(this.page)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 根据id更新记录
|
||||||
|
updateData() {
|
||||||
|
api.updateById(this.sysUser).then(response => {
|
||||||
|
this.$message.success(response.message || '操作成功')
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.fetchData(this.page)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
showAssignRole(row) {
|
||||||
|
this.sysUser = row
|
||||||
|
this.dialogRoleVisible = true
|
||||||
|
this.getRoles()
|
||||||
|
},
|
||||||
|
|
||||||
|
getRoles() {
|
||||||
|
roleApi.getRoles(this.sysUser.id).then(response => {
|
||||||
|
const { allRolesList, assginRoleList } = response.data
|
||||||
|
this.allRoles = allRolesList
|
||||||
|
this.userRoleIds = assginRoleList.map(item => item.id)
|
||||||
|
this.checkAll = allRolesList.length === assginRoleList.length
|
||||||
|
this.isIndeterminate = assginRoleList.length > 0 && assginRoleList.length < allRolesList.length
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
全选勾选状态发生改变的监听
|
||||||
|
*/
|
||||||
|
handleCheckAllChange(value) { // value 当前勾选状态true/false
|
||||||
|
// 如果当前全选, userRoleIds就是所有角色id的数组, 否则是空数组
|
||||||
|
this.userRoleIds = value ? this.allRoles.map(item => item.id) : []
|
||||||
|
// 如果当前不是全选也不全不选时, 指定为false
|
||||||
|
this.isIndeterminate = false
|
||||||
|
},
|
||||||
|
|
||||||
|
/*
|
||||||
|
角色列表选中项发生改变的监听
|
||||||
|
*/
|
||||||
|
handleCheckedChange(value) {
|
||||||
|
const { userRoleIds, allRoles } = this
|
||||||
|
this.checkAll = userRoleIds.length === allRoles.length && allRoles.length > 0
|
||||||
|
this.isIndeterminate = userRoleIds.length > 0 && userRoleIds.length < allRoles.length
|
||||||
|
},
|
||||||
|
|
||||||
|
assignRole() {
|
||||||
|
const assginRoleVo = {
|
||||||
|
userId: this.sysUser.id,
|
||||||
|
roleIdList: this.userRoleIds
|
||||||
|
}
|
||||||
|
roleApi.assignRoles(assginRoleVo).then(response => {
|
||||||
|
this.$message.success(response.message || '分配角色成功')
|
||||||
|
this.dialogRoleVisible = false
|
||||||
|
this.fetchData(this.page)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
switchStatus(row) {
|
||||||
|
row.status = row.status === 1 ? 0 : 1
|
||||||
|
api.updateStatus(row.id, row.status).then(response => {
|
||||||
|
if (response.code) {
|
||||||
|
this.$message.success(response.message || '操作成功')
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.fetchData()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -36,7 +36,16 @@ module.exports = {
|
|||||||
warnings: false,
|
warnings: false,
|
||||||
errors: true
|
errors: true
|
||||||
},
|
},
|
||||||
before: require('./mock/mock-server.js')
|
// before: require('./mock/mock-server.js')
|
||||||
|
proxy: {
|
||||||
|
'/dev-api': { // 匹配所有以 '/dev-api'开头的请求路径
|
||||||
|
target: 'http://localhost:8800',
|
||||||
|
changeOrigin: true, // 支持跨域
|
||||||
|
pathRewrite: { // 重写路径: 去掉路径中开头的'/dev-api'
|
||||||
|
'^/dev-api': ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
configureWebpack: {
|
configureWebpack: {
|
||||||
// provide the app's title in webpack's name field, so that
|
// provide the app's title in webpack's name field, so that
|
||||||
@ -87,34 +96,34 @@ module.exports = {
|
|||||||
.plugin('ScriptExtHtmlWebpackPlugin')
|
.plugin('ScriptExtHtmlWebpackPlugin')
|
||||||
.after('html')
|
.after('html')
|
||||||
.use('script-ext-html-webpack-plugin', [{
|
.use('script-ext-html-webpack-plugin', [{
|
||||||
// `runtime` must same as runtimeChunk name. default is `runtime`
|
// `runtime` must same as runtimeChunk name. default is `runtime`
|
||||||
inline: /runtime\..*\.js$/
|
inline: /runtime\..*\.js$/
|
||||||
}])
|
}])
|
||||||
.end()
|
.end()
|
||||||
config
|
config
|
||||||
.optimization.splitChunks({
|
.optimization.splitChunks({
|
||||||
chunks: 'all',
|
chunks: 'all',
|
||||||
cacheGroups: {
|
cacheGroups: {
|
||||||
libs: {
|
libs: {
|
||||||
name: 'chunk-libs',
|
name: 'chunk-libs',
|
||||||
test: /[\\/]node_modules[\\/]/,
|
test: /[\\/]node_modules[\\/]/,
|
||||||
priority: 10,
|
priority: 10,
|
||||||
chunks: 'initial' // only package third parties that are initially dependent
|
chunks: 'initial' // only package third parties that are initially dependent
|
||||||
},
|
},
|
||||||
elementUI: {
|
elementUI: {
|
||||||
name: 'chunk-elementUI', // split elementUI into a single package
|
name: 'chunk-elementUI', // split elementUI into a single package
|
||||||
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
|
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
|
||||||
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
|
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
|
||||||
},
|
},
|
||||||
commons: {
|
commons: {
|
||||||
name: 'chunk-commons',
|
name: 'chunk-commons',
|
||||||
test: resolve('src/components'), // can customize your rules
|
test: resolve('src/components'), // can customize your rules
|
||||||
minChunks: 3, // minimum common number
|
minChunks: 3, // minimum common number
|
||||||
priority: 5,
|
priority: 5,
|
||||||
reuseExistingChunk: true
|
reuseExistingChunk: true
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
})
|
||||||
// https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
|
// https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
|
||||||
config.optimization.runtimeChunk('single')
|
config.optimization.runtimeChunk('single')
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user