保存进度!
This commit is contained in:
324
企业级管理系统/web/项目源码/src/views/system/Menu.vue
Normal file
324
企业级管理系统/web/项目源码/src/views/system/Menu.vue
Normal file
@@ -0,0 +1,324 @@
|
||||
<template>
|
||||
<BasisTable
|
||||
:columns="table_config.table_header"
|
||||
:config="table_config.config"
|
||||
:request="table_config.request"
|
||||
>
|
||||
<template v-slot:operation="slotData">
|
||||
<el-button type="danger" @click="handlerMenu('edit', slotData.data.menu_id)" v-has-button="'menu:edit'">编辑</el-button>
|
||||
<el-button type="danger" @click="handlerMenu('add_sub', slotData.data.menu_id)" v-has-button="'menu:add_sub'">添加子菜单</el-button>
|
||||
</template>
|
||||
</BasisTable>
|
||||
<el-dialog :title="data.title" @closed="dislogClose" @open="dialogOpen" v-model="dialogVisible" width="30%" :close-on-click-modal="false" :close-on-press-escape="false">
|
||||
<BasisForm
|
||||
ref="basisFormRef"
|
||||
label-width="100px"
|
||||
:item="form_config.form_item"
|
||||
:button="form_config.form_button"
|
||||
:field="form_config.form_data"
|
||||
:loading="form_config.form_loading"
|
||||
@callback="handlerSubmit"
|
||||
>
|
||||
<template v-slot:menu_function>
|
||||
<el-row :gutter="10">
|
||||
<el-col :span="9">页面元素</el-col>
|
||||
<el-col :span="9">标识符</el-col>
|
||||
<el-col :span="4">操作</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="10" v-for="(item, index) in form_config.page_item" :key="item.id">
|
||||
<el-col :span="9"><el-input v-model.trim="item.label" size="small" /></el-col>
|
||||
<el-col :span="9"><el-input v-model.trim="item.value" size="small" /></el-col>
|
||||
<el-col :span="4"><el-button size="small" @click="handlerDel(index)">删除</el-button></el-col>
|
||||
</el-row>
|
||||
<el-button type="primary" @click="handlerPush">添加功能</el-button>
|
||||
</template>
|
||||
</BasisForm>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { useRouter } from "vue-router";
|
||||
import{ reactive, provide, ref } from "vue";
|
||||
// store
|
||||
import { useStore } from "vuex";
|
||||
// components
|
||||
import BasisTable from "@c/table";
|
||||
import BasisForm from "@c/form";
|
||||
// 全局数据
|
||||
import globalData from "@/js/data";
|
||||
// API
|
||||
import { MenuCreate, MenuDetailed, MenuUpdate } from "@/api/menu";
|
||||
// utils
|
||||
import { formatRequestData, formatTree } from "@/utils/format";
|
||||
export default {
|
||||
name: 'MenuIndex',
|
||||
components: { BasisTable, BasisForm },
|
||||
props: {},
|
||||
setup(props){
|
||||
const dialogVisible = ref(false);
|
||||
// router
|
||||
const { push } = useRouter();
|
||||
// store
|
||||
const store = useStore();
|
||||
// 页面功能初始参数
|
||||
const page_fun_json = { value: "", label: "" };
|
||||
const data = reactive({
|
||||
menu_handler_flag: "",
|
||||
row_id: 0,
|
||||
title: "",
|
||||
title_item: {
|
||||
add: "添加一级菜单",
|
||||
edit: "编辑菜单",
|
||||
add_sub: "添加子级菜单"
|
||||
}
|
||||
})
|
||||
// 列表表格配置
|
||||
const table_config = reactive({
|
||||
table_header: [
|
||||
{ label: "菜单名称", prop: "menu_name" },
|
||||
{ label: "菜单路径", prop: "menu_path" },
|
||||
{ label: "映射组件", prop: "menu_component" },
|
||||
{ label: "重定向", prop: "menu_redirect" },
|
||||
{
|
||||
label: "是否隐藏",
|
||||
prop: "menu_hidden",
|
||||
type: "switch",
|
||||
key_id: "menu_id",
|
||||
api_module: "menu",
|
||||
api_key: "hidden_status",
|
||||
},
|
||||
{
|
||||
label: "是否禁用",
|
||||
prop: "menu_disabled",
|
||||
type: "switch",
|
||||
key_id: "menu_id",
|
||||
api_module: "menu",
|
||||
api_key: "disabled_status",
|
||||
},
|
||||
{ label: "操作", type: "slot", slot_name: "operation", width: "280", delete_elem: true }
|
||||
],
|
||||
config: {
|
||||
selection: false,
|
||||
batch_delete: false,
|
||||
pagination: false,
|
||||
action_request: true,
|
||||
row_key: "menu_id"
|
||||
},
|
||||
request: {
|
||||
url: "menu",
|
||||
data: {},
|
||||
delete_key: "menu_id",
|
||||
format_data: (data) => formatTree(data, "menu_id", "parent_id", "children", 0)
|
||||
}
|
||||
})
|
||||
const search_config = reactive({
|
||||
label_width: "70px",
|
||||
form_button_group: [
|
||||
{ label: "新增一级菜单", type: "danger", callback: () => handlerMenu('add') },
|
||||
],
|
||||
form_button: {
|
||||
reset_button: true
|
||||
},
|
||||
form_item: [
|
||||
{
|
||||
type: "select",
|
||||
label: "禁启用",
|
||||
prop: "menu_disabled",
|
||||
width: "100px",
|
||||
options: globalData.whether
|
||||
},
|
||||
{
|
||||
type: "keyword",
|
||||
label: "关键字",
|
||||
prop: "keyword",
|
||||
options: [
|
||||
{ label: "菜单名称", value: "menu_name" },
|
||||
{ label: "菜单路径", value: "menu_path" },
|
||||
{ label: "组件名称", value: "menu_component" }
|
||||
]
|
||||
},
|
||||
],
|
||||
form_data: {
|
||||
menu_disabled: ""
|
||||
}
|
||||
})
|
||||
provide("search_config", search_config);
|
||||
const form_config = reactive({
|
||||
form_item: [
|
||||
{
|
||||
type: "input",
|
||||
label: "菜单名称",
|
||||
prop: "menu_name",
|
||||
width: "300px",
|
||||
required: true
|
||||
},
|
||||
{
|
||||
type: "input",
|
||||
label: "菜单路径",
|
||||
prop: "menu_path",
|
||||
width: "300px",
|
||||
required: true
|
||||
},
|
||||
{
|
||||
type: "input",
|
||||
label: "路由名称",
|
||||
prop: "menu_router",
|
||||
width: "300px",
|
||||
required: true
|
||||
},
|
||||
{
|
||||
type: "input",
|
||||
label: "映射组件",
|
||||
prop: "menu_component",
|
||||
width: "300px",
|
||||
required: true
|
||||
},
|
||||
{ type: "upload", label: "图标", prop: "menu_icon" },
|
||||
{ type: "inputNumber", label: "排序", prop: "menu_sort", required: true },
|
||||
{
|
||||
type: "radio",
|
||||
label: "是否禁用",
|
||||
prop: "menu_disabled",
|
||||
options: globalData.whether
|
||||
},
|
||||
{
|
||||
type: "radio",
|
||||
label: "是否隐藏",
|
||||
prop: "menu_hidden",
|
||||
options: globalData.whether
|
||||
},
|
||||
{
|
||||
type: "radio",
|
||||
label: "是否缓存",
|
||||
prop: "menu_keep",
|
||||
options: globalData.whether
|
||||
},
|
||||
{
|
||||
type: "input",
|
||||
label: "重定向",
|
||||
prop: "menu_redirect",
|
||||
width: "300px"
|
||||
},
|
||||
{
|
||||
type: "slot",
|
||||
label: "页面功能",
|
||||
slot_name: "menu_function"
|
||||
}
|
||||
],
|
||||
form_button: [
|
||||
{ label: "确认提交", type: "danger", key: "submit" }
|
||||
],
|
||||
form_data: {
|
||||
menu_name: "",
|
||||
menu_path: "",
|
||||
menu_router: "",
|
||||
menu_component: "",
|
||||
menu_sort: 0,
|
||||
menu_disabled: "2",
|
||||
menu_hidden: "2",
|
||||
menu_keep: "2",
|
||||
menu_redirect: "",
|
||||
menu_icon: ""
|
||||
},
|
||||
form_loading: false,
|
||||
page_item: [JSON.parse(JSON.stringify(page_fun_json))]
|
||||
})
|
||||
|
||||
const handlerSubmit = (value) => {
|
||||
if(data.menu_handler_flag === "edit" && data.row_id) {
|
||||
handlerMenuEdit();
|
||||
}
|
||||
if(data.menu_handler_flag === "add" || data.menu_handler_flag === "add_sub") {
|
||||
handlerMenuCreate();
|
||||
}
|
||||
}
|
||||
const basisFormRef = ref(null);
|
||||
const dislogClose = () => {
|
||||
form_config.page_item = [JSON.parse(JSON.stringify(page_fun_json))];
|
||||
data.row_id = "";
|
||||
data.menu_handler_flag = "";
|
||||
basisFormRef.value && basisFormRef.value.handlerFormReset();
|
||||
dialogVisible.value = false;
|
||||
}
|
||||
const dialogOpen = () => {
|
||||
if(data.menu_handler_flag === "edit" && data.row_id) {
|
||||
handlerMenuDetailed();
|
||||
}
|
||||
}
|
||||
const handlerPush = () => {
|
||||
form_config.page_item.push(JSON.parse(JSON.stringify(page_fun_json)));
|
||||
}
|
||||
const handlerDel = (index) => {
|
||||
form_config.page_item.splice(index, 1);
|
||||
}
|
||||
const formatPageItem = () => {
|
||||
const data = Object.assign([], form_config.page_item);
|
||||
const dataItem = data.filter(item => item.label && item.value);
|
||||
return JSON.stringify(dataItem);
|
||||
}
|
||||
const handlerMenu = (type, id = "") => {
|
||||
data.menu_handler_flag = type;
|
||||
data.row_id = id;
|
||||
dialogVisible.value = true;
|
||||
// 更新标题
|
||||
data.title = data.title_item[type];
|
||||
}
|
||||
const handlerMenuDetailed = () => {
|
||||
form_config.form_loading = true;
|
||||
MenuDetailed({menu_id: data.row_id}).then(response => {
|
||||
form_config.form_loading = false;
|
||||
// form表单赋值
|
||||
form_config.form_data = formatRequestData(response.data, form_config.form_data);
|
||||
// 页面功能选值还原
|
||||
const pageItemInit = response.data.menu_fun;
|
||||
pageItemInit && (form_config.page_item = JSON.parse(pageItemInit));
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
const handlerMenuEdit = () => {
|
||||
form_config.form_loading = true;
|
||||
MenuUpdate({
|
||||
...form_config.form_data,
|
||||
menu_fun: formatPageItem(),
|
||||
menu_id: data.row_id
|
||||
}).then(response => {
|
||||
form_config.form_loading = false;
|
||||
dislogClose();
|
||||
store.commit("app/SET_TABLE_REQUEST");
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
const handlerMenuCreate = () => {
|
||||
form_config.form_loading = true;
|
||||
const request_data = {
|
||||
...form_config.form_data,
|
||||
menu_fun: formatPageItem()
|
||||
}
|
||||
if(data.menu_handler_flag === "add_sub") { request_data.parent_id = data.row_id; }
|
||||
MenuCreate(request_data).then(response => {
|
||||
form_config.form_loading = false;
|
||||
dislogClose();
|
||||
store.commit("app/SET_TABLE_REQUEST");
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
return {
|
||||
table_config,
|
||||
dialogVisible,
|
||||
form_config,
|
||||
basisFormRef,
|
||||
handlerSubmit,
|
||||
dislogClose,
|
||||
dialogOpen,
|
||||
handlerDel,
|
||||
handlerPush,
|
||||
handlerMenu,
|
||||
data
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
100
企业级管理系统/web/项目源码/src/views/system/Role.vue
Normal file
100
企业级管理系统/web/项目源码/src/views/system/Role.vue
Normal file
@@ -0,0 +1,100 @@
|
||||
<template>
|
||||
<BasisTable :columns="table_config.table_header" :config="table_config.config" :request="table_config.request">
|
||||
<template v-slot:operation="slotData">
|
||||
<el-button type="danger" @click="handlerRole(slotData.data.role_id)">编辑</el-button>
|
||||
</template>
|
||||
</BasisTable>
|
||||
<DialogRole v-model:flag="data.dialogFlag" v-model:row-id="data.row_id" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import{ reactive, provide } from "vue";
|
||||
// components
|
||||
import BasisTable from "@c/table";
|
||||
import DialogRole from "./components/dialogRole";
|
||||
// 全局数据
|
||||
import globalData from "@/js/data";
|
||||
export default {
|
||||
name: 'InfoIndex',
|
||||
components: { BasisTable, DialogRole },
|
||||
props: {},
|
||||
setup(props){
|
||||
const data = reactive({
|
||||
dialogFlag: false,
|
||||
row_id: ""
|
||||
})
|
||||
const table_config = reactive({
|
||||
table_header: [
|
||||
{ label: "角色名称", prop: "role_name" },
|
||||
{
|
||||
label: "是否禁用",
|
||||
prop: "role_disabled",
|
||||
type: "switch",
|
||||
key_id: "role_id",
|
||||
api_module: "role",
|
||||
api_key: "status"
|
||||
},
|
||||
{
|
||||
label: "操作",
|
||||
type: "slot",
|
||||
slot_name: "operation",
|
||||
width: "200",
|
||||
delete_elem: true
|
||||
}
|
||||
],
|
||||
config: {
|
||||
action_request: true,
|
||||
has_button_delete: "role:delete",
|
||||
has_button_batch_delete: "role:batch_delete"
|
||||
},
|
||||
request: {
|
||||
url: "role",
|
||||
data: {
|
||||
pageNumber: 1,
|
||||
pageSize: 10,
|
||||
},
|
||||
delete_key: "role_id"
|
||||
}
|
||||
})
|
||||
const search_config = reactive({
|
||||
label_width: "80px",
|
||||
form_button_group: [
|
||||
{ label: "添加角色", type: "danger", callback: () => handlerRole() },
|
||||
],
|
||||
form_button: {
|
||||
reset_button: true
|
||||
},
|
||||
form_item: [
|
||||
{
|
||||
type: "input",
|
||||
label: "角色名称",
|
||||
prop: "role_name",
|
||||
placeholder: "请输入角色名称"
|
||||
},
|
||||
{
|
||||
type: "select",
|
||||
label: "禁用状态",
|
||||
prop: "role_disabled",
|
||||
width: "100px",
|
||||
options: globalData.whether
|
||||
},
|
||||
],
|
||||
form_data: {
|
||||
role_name: "",
|
||||
role_disabled: ""
|
||||
}
|
||||
})
|
||||
provide("search_config", search_config);
|
||||
const handlerRole = (id = "") => {
|
||||
data.row_id = id;
|
||||
data.dialogFlag = true;
|
||||
}
|
||||
return {
|
||||
table_config,
|
||||
data,
|
||||
handlerRole
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
115
企业级管理系统/web/项目源码/src/views/system/User.vue
Normal file
115
企业级管理系统/web/项目源码/src/views/system/User.vue
Normal file
@@ -0,0 +1,115 @@
|
||||
<template>
|
||||
<BasisTable
|
||||
:columns="table_config.table_header"
|
||||
:config="table_config.config"
|
||||
:request="table_config.request"
|
||||
>
|
||||
<template v-slot:operation="slotData">
|
||||
<el-button type="danger" @click="handlerDialog(slotData.data.id)" v-has-button="'user:edit'">编辑</el-button>
|
||||
<el-button type="danger" @click="handlerPassword(slotData.data.id)" v-has-button="'user:password'">修改密码</el-button>
|
||||
</template>
|
||||
</BasisTable>
|
||||
<DialogUser v-model:flag="dialogFlag" v-model:row-id="row_id" />
|
||||
<DialogPass v-model:flag="dialogPassFlag" v-model:row-id="row_id" title="修改密码" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { reactive, provide, toRefs } from "vue";
|
||||
// components
|
||||
import BasisTable from "@c/table";
|
||||
import DialogUser from "./components/dialogUser";
|
||||
import DialogPass from "./components/dialogPassword";
|
||||
// 全局数据
|
||||
import globalData from "@/js/data";
|
||||
export default {
|
||||
name: "SystemUser",
|
||||
components: { BasisTable, DialogUser, DialogPass },
|
||||
props: {},
|
||||
setup(props){
|
||||
const data = reactive({
|
||||
dialogFlag: false,
|
||||
dialogPassFlag: false,
|
||||
row_id: ""
|
||||
})
|
||||
// 列表表格配置
|
||||
const table_config = reactive({
|
||||
table_header: [
|
||||
{ label: "用户名", prop: "username" },
|
||||
{ label: "真实姓名", prop: "truename" },
|
||||
{ label: "角色类型", prop: "role_type" },
|
||||
{
|
||||
label: "帐号状态",
|
||||
prop: "user_disabled",
|
||||
type: "switch",
|
||||
key_id: "id",
|
||||
api_module: "user",
|
||||
api_key: "status"
|
||||
},
|
||||
{ label: "创建时间", prop: "user_createtime" },
|
||||
{ label: "操作", type: "slot", slot_name: "operation", width: "280", delete_elem: true }
|
||||
],
|
||||
config: {
|
||||
action_request: true,
|
||||
has_button_delete: "user:delete",
|
||||
has_button_batch_delete: "user:batch_delete"
|
||||
},
|
||||
request: {
|
||||
url: "user",
|
||||
data: {
|
||||
pageSize: 10,
|
||||
pageNumber: 1
|
||||
},
|
||||
delete_key: "id"
|
||||
}
|
||||
})
|
||||
// 搜索项配置
|
||||
const search_config = reactive({
|
||||
label_width: "70px",
|
||||
form_button_group: [
|
||||
{ label: "添加用户", type: "danger", callback: () => handlerDialog() },
|
||||
],
|
||||
form_button: {
|
||||
reset_button: true
|
||||
},
|
||||
form_item: [
|
||||
{
|
||||
type: "select",
|
||||
label: "禁启用",
|
||||
prop: "user_disabled",
|
||||
width: "100px",
|
||||
options: globalData.whether
|
||||
},
|
||||
{
|
||||
type: "keyword",
|
||||
label: "关键字",
|
||||
prop: "keyword",
|
||||
options: [
|
||||
{ label: "用户名", value: "username" },
|
||||
{ label: "真实姓名", value: "truename" },
|
||||
{ label: "角色类型", value: "role_type" }
|
||||
]
|
||||
},
|
||||
],
|
||||
form_data: {
|
||||
user_disabled: ""
|
||||
}
|
||||
})
|
||||
provide("search_config", search_config);
|
||||
const handlerDialog = (id = '') => {
|
||||
data.row_id = id;
|
||||
data.dialogFlag = true;
|
||||
}
|
||||
const handlerPassword = (id) => {
|
||||
data.row_id = id;
|
||||
data.dialogPassFlag = true;
|
||||
}
|
||||
return {
|
||||
table_config,
|
||||
handlerDialog,
|
||||
handlerPassword,
|
||||
...toRefs(data)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
@@ -0,0 +1,95 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
:title="title"
|
||||
:width="width"
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
@close="dialogClose"
|
||||
@open="dialogOpen"
|
||||
>
|
||||
<BasisForm @callback="handlerSubmit" ref="basisFormRef" label-width="100px" :item="form_config.form_item" :button="form_config.form_button" :field="form_config.form_data" :loading="form_config.form_loading">
|
||||
</BasisForm>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, watch, reactive, getCurrentInstance, defineProps, defineEmits } from "vue";
|
||||
// components
|
||||
import BasisForm from "@c/form";
|
||||
// validate
|
||||
import { checkPassword } from "@/utils/validate";
|
||||
// hook
|
||||
import { propsType, dialogHook } from "@/hook/dialogHook.js";
|
||||
// sha1
|
||||
import sha1 from "js-sha1";
|
||||
// API
|
||||
import { UpdatePass } from "@/api/user";
|
||||
// store
|
||||
import { useStore } from "vuex";
|
||||
// Props对象
|
||||
const props = defineProps({
|
||||
...propsType,
|
||||
rowId: {
|
||||
type: [String, Number],
|
||||
default: ""
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(["update:flag"])
|
||||
// 变量
|
||||
const dialogVisible = ref(props.flag);
|
||||
const width = ref(props.width);
|
||||
const title = ref(props.title);
|
||||
const basisFormRef = ref(null);
|
||||
// 获取实例上下文
|
||||
const { proxy } = getCurrentInstance();
|
||||
// dialog
|
||||
const { close } = dialogHook(emit);
|
||||
// store
|
||||
const store = useStore();
|
||||
// form表单配置
|
||||
const form_config = reactive({
|
||||
form_item: [
|
||||
{
|
||||
type: "input",
|
||||
label: "密码",
|
||||
prop: "password",
|
||||
width: "300px",
|
||||
value_type: "password",
|
||||
required: true
|
||||
}
|
||||
],
|
||||
form_button: [
|
||||
{ label: "确认修改", type: "danger", key: "submit" }
|
||||
],
|
||||
form_data: {
|
||||
password: "",
|
||||
},
|
||||
form_loading: false
|
||||
})
|
||||
|
||||
const dialogClose = () => {
|
||||
dialogVisible.value = false;
|
||||
close(basisFormRef);
|
||||
}
|
||||
const dialogOpen = () => {}
|
||||
watch(() => props.flag, (newValue, oldValue) => {
|
||||
dialogVisible.value = newValue;
|
||||
})
|
||||
/** 表单提交 */
|
||||
const handlerSubmit = () => {
|
||||
if(!props.rowId) { return false; } // 不存在ID
|
||||
form_config.form_loading = true; // 添加表单遮罩
|
||||
UpdatePass({
|
||||
password: sha1(form_config.form_data.password),
|
||||
id: props.rowId
|
||||
}).then(response => {
|
||||
form_config.form_loading = false; // 清除表单遮罩
|
||||
proxy.$message.success(response.message); // 成功弹窗提示
|
||||
dialogClose(); // 关闭弹窗
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false; // 清除表单遮罩
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<style lang='scss' scoped></style>
|
204
企业级管理系统/web/项目源码/src/views/system/components/dialogRole.vue
Normal file
204
企业级管理系统/web/项目源码/src/views/system/components/dialogRole.vue
Normal file
@@ -0,0 +1,204 @@
|
||||
<template>
|
||||
<el-dialog v-model="dialogVisible" :title="title" :width="width" :close-on-click-modal="false" :close-on-press-escape="false" @close="dialogClose" @open="dialogOpen">
|
||||
<BasisForm ref="basisFormRef" label-width="100px"
|
||||
:item="form_config.form_item"
|
||||
:button="form_config.form_button"
|
||||
:field="form_config.form_data"
|
||||
:loading="form_config.form_loading"
|
||||
@callback="handlerSubmit">
|
||||
<template v-slot:permit>
|
||||
<el-tree
|
||||
ref="treeRef"
|
||||
:data="datas.tree_data"
|
||||
node-key="menu_id"
|
||||
:props="{label: 'menu_name', class: customNodeClass}"
|
||||
:expand-on-click-node="false"
|
||||
show-checkbox
|
||||
default-expand-all
|
||||
/>
|
||||
</template>
|
||||
</BasisForm>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, defineProps, watch, defineEmits, nextTick } from "vue";
|
||||
// store
|
||||
import { useStore } from "vuex";
|
||||
// components
|
||||
import BasisForm from "@c/form";
|
||||
// 全局数据
|
||||
import globalData from "@/js/data";
|
||||
// API
|
||||
import { RoleCreate, RoleDetailed, RoleUpdate } from "@/api/role";
|
||||
import { MenuListTree } from "@/api/menu";
|
||||
// utils
|
||||
import { formatRequestData } from "@/utils/format";
|
||||
const store = useStore();
|
||||
// props对象
|
||||
const props = defineProps({
|
||||
flag: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
width: {
|
||||
type: String,
|
||||
default: "30%"
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: "消息"
|
||||
},
|
||||
rowId: {
|
||||
type: [String, Number],
|
||||
default: ""
|
||||
}
|
||||
})
|
||||
|
||||
// 变量
|
||||
const dialogVisible = ref(props.flag);
|
||||
const width = ref(props.width);
|
||||
const title = ref(props.title);
|
||||
const datas = reactive({
|
||||
tree_data: []
|
||||
})
|
||||
const basisFormRef = ref(null);
|
||||
const treeRef = ref(null);
|
||||
// emit对象
|
||||
const emit = defineEmits(["update:flag", "update:rowId"])
|
||||
// 角色form表单配置
|
||||
const form_config = reactive({
|
||||
form_item: [
|
||||
{ type: "input", label: "角色名称", prop: "role_name", required: true },
|
||||
{ type: "input", label: "角色标识", prop: "role_value", required: true },
|
||||
{
|
||||
type: "radio",
|
||||
label: "是否超管",
|
||||
prop: "has_admin",
|
||||
options: globalData.whether,
|
||||
relation_hidden: [
|
||||
['role_name', {"1":true, "0": false}],
|
||||
['role_value', {"1":true, "0": false}]
|
||||
]
|
||||
},
|
||||
{ type: "radio", label: "是否启用", prop: "role_disabled", options: globalData.whether },
|
||||
{ type: "slot", label: "角色权限", prop: "role_permit", slot_name: "permit" }
|
||||
],
|
||||
form_button: [
|
||||
{ label: "确认提交", type: "danger", key: "submit" }
|
||||
],
|
||||
form_data: { role_name: "", role_value: "", role_disabled: "1", has_admin: "0" },
|
||||
form_loading: false,
|
||||
form_hidden: {}
|
||||
})
|
||||
|
||||
// 函数
|
||||
const dialogOpen = async () => {
|
||||
try {
|
||||
await getMenuList();
|
||||
}catch {
|
||||
console.log("权限数据请求失败")
|
||||
}
|
||||
props.rowId && getDetailed();
|
||||
title.value = props.rowId ? "编辑角色" : "添加角色";
|
||||
}
|
||||
const handlerSubmit = () => {
|
||||
props.rowId ? handlerEdit() : handlerAdd();
|
||||
}
|
||||
|
||||
/** 角色新增函数接口 */
|
||||
const handlerAdd = () => {
|
||||
const request_data = formatRequest();
|
||||
form_config.form_loading = true;
|
||||
RoleCreate(request_data).then(response => {
|
||||
form_config.form_loading = false;
|
||||
store.commit("app/SET_TABLE_REQUEST");
|
||||
dialogClose();
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
/** 角色编辑函数接口 */
|
||||
const handlerEdit = () => {
|
||||
const request_data = formatRequest();
|
||||
form_config.form_loading = true;
|
||||
RoleUpdate(request_data).then(response => {
|
||||
form_config.form_loading = false;
|
||||
store.commit("app/SET_TABLE_REQUEST");
|
||||
dialogClose();
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
|
||||
/** 接口参数格式化 */
|
||||
const formatRequest = () => {
|
||||
const id = treeRef.value.getCheckedKeys().concat(treeRef.value.getHalfCheckedKeys());
|
||||
const request_data = {
|
||||
...form_config.form_data,
|
||||
menu_id: id,
|
||||
}
|
||||
// 编辑状态
|
||||
if(props.rowId) { request_data.role_id = props.rowId; }
|
||||
return request_data;
|
||||
}
|
||||
const dialogClose = () => {
|
||||
basisFormRef.value.handlerFormReset();
|
||||
treeRef.value.setCheckedKeys([]);
|
||||
dialogVisible.value = false;
|
||||
emit("update:flag", false);
|
||||
}
|
||||
const getMenuList = () => {
|
||||
if(datas.tree_data.length !== 0) { return false; }
|
||||
return new Promise((resolve, reject) => {
|
||||
MenuListTree().then(response => {
|
||||
resolve()
|
||||
datas.tree_data = response.data.data;
|
||||
})
|
||||
})
|
||||
}
|
||||
const getDetailed= () => {
|
||||
form_config.form_loading = true;
|
||||
RoleDetailed({role_id: props.rowId}).then(response => {
|
||||
// 响应报文数据
|
||||
const response_data = response.data;
|
||||
// 表单数据赋值
|
||||
form_config.form_data = formatRequestData(response_data, form_config.form_data);
|
||||
// 菜单复选框赋值
|
||||
nextTick(() => {
|
||||
const menu_id = response_data.menu_id || [];
|
||||
menu_id.length > 0 && menu_id.forEach(item => {
|
||||
// 获取node节点
|
||||
const node = treeRef.value.getNode(item);
|
||||
// 判断node是否为子节点,非半选状态
|
||||
node.isLeaf && treeRef.value.setChecked(node, true)
|
||||
});
|
||||
})
|
||||
form_config.form_loading = false;
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const customNodeClass = (data, node) => {
|
||||
return `tree-level-${node.level}`
|
||||
}
|
||||
|
||||
// 监听
|
||||
watch(() => props.flag, (newValue, oldValue) => {
|
||||
dialogVisible.value = newValue;
|
||||
})
|
||||
</script>
|
||||
<style lang='scss' scoped>
|
||||
:deep(.tree-level-2) {
|
||||
margin-bottom: 8px;
|
||||
> .el-tree-node__children {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
:deep(.tree-level-3) {
|
||||
width: 33.33333%;
|
||||
}
|
||||
</style>
|
193
企业级管理系统/web/项目源码/src/views/system/components/dialogUser.vue
Normal file
193
企业级管理系统/web/项目源码/src/views/system/components/dialogUser.vue
Normal file
@@ -0,0 +1,193 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
:title="title"
|
||||
:width="width"
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
@close="dialogClose"
|
||||
@open="dialogOpen"
|
||||
>
|
||||
<BasisForm ref="basisFormRef" @callback="handlerSubmit" label-width="100px" :item="form_config.form_item" :button="form_config.form_button" :field="form_config.form_data" :loading="form_config.form_loading" :hidden="form_config.form_hidden" />
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, watch, defineProps, defineEmits, getCurrentInstance } from "vue";
|
||||
// API
|
||||
import { RoleListAll } from "@/api/role";
|
||||
// components
|
||||
import BasisForm from "@c/form";
|
||||
// 全局数据
|
||||
import globalData from "@/js/data";
|
||||
// 验证
|
||||
import { validate_email, validate_password } from "@/utils/validate";
|
||||
// hook
|
||||
import { propsType, dialogHook } from "@/hook/dialogHook.js";
|
||||
// API
|
||||
import { UserCreate, UserDetailed, UserUpdate } from "@/api/user";
|
||||
// sha1
|
||||
import sha1 from "js-sha1";
|
||||
// vuex
|
||||
import { useStore } from "vuex";
|
||||
// store
|
||||
const store = useStore();
|
||||
// props 对象
|
||||
const props = defineProps({
|
||||
...propsType,
|
||||
rowId: {
|
||||
type: [String, Number],
|
||||
default: ""
|
||||
}
|
||||
})
|
||||
// emit 对象
|
||||
const emit = defineEmits(["update:flag", "update:rowId"])
|
||||
// dialoghook
|
||||
const { close } = dialogHook(emit);
|
||||
// 获取实例上下文
|
||||
const { proxy } = getCurrentInstance();
|
||||
// 变量
|
||||
const dialogVisible = ref(props.flag);
|
||||
const width = ref(props.width);
|
||||
const title = ref(props.title);
|
||||
const basisFormRef = ref(null);
|
||||
const form_config = reactive({
|
||||
form_item: [
|
||||
{
|
||||
type: "input",
|
||||
value_type: "username",
|
||||
label: "用户名",
|
||||
prop: "username",
|
||||
width: "300px",
|
||||
required: true
|
||||
},
|
||||
{ type: "input", label: "真实姓名", prop: "truename" },
|
||||
{
|
||||
type: "input",
|
||||
value_type: "password",
|
||||
label: "密码",
|
||||
prop: "password",
|
||||
width: "300px",
|
||||
required: true
|
||||
},
|
||||
{ type: "radio", label: "是否启用", prop: "user_disabled", options: globalData.whether, required: true },
|
||||
{
|
||||
type: "radio",
|
||||
label: "角色类型",
|
||||
prop: "role_type",
|
||||
required: true,
|
||||
key_label: "role_name",
|
||||
key_value: "role_id",
|
||||
callback: async (row) => {
|
||||
let result = []
|
||||
try {
|
||||
result = await getRoleList();
|
||||
} catch (error) {
|
||||
console.log("角色数据获取失败")
|
||||
}
|
||||
row.options = result
|
||||
}
|
||||
}
|
||||
],
|
||||
form_button: [
|
||||
{ label: "确认提交", type: "danger", key: "submit" }
|
||||
],
|
||||
form_data: { username: "", password: "", truename: "", role_type: "", user_disabled: "1" },
|
||||
form_loading: false,
|
||||
form_hidden: {}
|
||||
})
|
||||
|
||||
/** dialog关闭 */
|
||||
const dialogClose = () => {
|
||||
close(basisFormRef);
|
||||
emit("update:rowId", "");
|
||||
}
|
||||
/** dialog打开 */
|
||||
const dialogOpen = async () => {
|
||||
form_config.form_hidden.password = !!props.rowId;
|
||||
props.rowId && getUserDetailed();
|
||||
}
|
||||
/** 监听 */
|
||||
watch(() => props.flag, (newValue, oldValue) => {
|
||||
dialogVisible.value = newValue;
|
||||
})
|
||||
|
||||
// 获取角色列表
|
||||
const getRoleList = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
RoleListAll().then(response => {
|
||||
resolve(response.data)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/** 表单提交 */
|
||||
const handlerSubmit = () => {
|
||||
props.rowId ? handlerEdit() : handlerAdd();
|
||||
}
|
||||
|
||||
const handlerAdd= () => {
|
||||
// 表单加载遮罩
|
||||
form_config.form_loading = true;
|
||||
// 拷贝数据
|
||||
const request_data = Object.assign({}, form_config.form_data);
|
||||
// 密码加密
|
||||
request_data.password = sha1(request_data.password);
|
||||
// 调用创建用户接口
|
||||
UserCreate(request_data).then(response => {
|
||||
userResponse(response);
|
||||
}).catch(error => {
|
||||
// 清除表单遮罩
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
/** 修改用户 */
|
||||
const handlerEdit = () => {
|
||||
// 表单加载遮罩
|
||||
form_config.form_loading = true;
|
||||
// 拷贝数据
|
||||
const request_data = Object.assign({}, form_config.form_data);
|
||||
// 删除密码参数
|
||||
delete request_data.password;
|
||||
// 调用修改用户接口
|
||||
UserUpdate({...request_data, id: props.rowId}).then(response => {
|
||||
userResponse(response);
|
||||
}).catch(error => {
|
||||
// 清除表单遮罩
|
||||
form_config.form_loading = false;
|
||||
})
|
||||
}
|
||||
/** 获取用户详情 */
|
||||
const getUserDetailed = () => {
|
||||
form_config.form_loading = true; // 表单加载遮罩
|
||||
UserDetailed({id: props.rowId}).then(response => {
|
||||
form_config.form_loading = false; // 清除表单遮罩
|
||||
form_config.form_data = response.data; // 表单赋值
|
||||
}).catch(error => {
|
||||
form_config.form_loading = false; // 清除表单遮罩
|
||||
})
|
||||
}
|
||||
|
||||
/** 接口响应结果 */
|
||||
const userResponse = (params) => {
|
||||
// 清除表单遮罩
|
||||
form_config.form_loading = false;
|
||||
// 获取报文
|
||||
const response_data = params;
|
||||
// 判断状态
|
||||
if(!response_data.data.user) {
|
||||
// 失败弹窗提示
|
||||
proxy.$message.error(response_data.message);
|
||||
return false;
|
||||
}
|
||||
// 成功弹窗提示
|
||||
proxy.$message.success(response_data.message);
|
||||
// 刷新列表
|
||||
store.commit("app/SET_TABLE_REQUEST");
|
||||
// 关闭弹窗
|
||||
dialogClose();
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
<style lang='scss' scoped></style>
|
Reference in New Issue
Block a user