hgwms-2098 fix 系统权限弹窗修改

hwork-master^2
A0066811 2025-11-07 11:19:50 +08:00
parent ff3740b150
commit f264d03008
3 changed files with 428 additions and 305 deletions

View File

@ -8,64 +8,107 @@
@cancel="cancel" @cancel="cancel"
> >
<a-form <a-form
ref="formRef" ref="formRef"
:model="formState" :model="formState"
:rules="formRules" :rules="formRules"
:label-col="labelCol" layout="vertical"
:wrapper-col="wrapperCol"
> >
<a-form-item label="上级" name="parent"> <a-row :gutter="[16, 0]">
<a-tree-select <a-col :span="12">
v-model:value="formState.parent" <a-form-item label="上级" name="parent">
style="width: 100%;" <a-tree-select
:dropdown-style="{ maxHeight: '360px', overflow: 'auto' }" v-model:value="formState.parent"
:tree-data="state.powers" style="width: 100%"
placeholder="上级权限" :dropdown-style="{ maxHeight: '360px', overflow: 'auto' }"
replace :tree-data="state.powers"
tree-default-expand-all placeholder="上级权限"
:replaceFields="replaceFields" replace
tree-default-expand-all
:replaceFields="replaceFields"
>
</a-tree-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item ref="title" label="名称" name="title">
<a-input v-model:value="formState.title" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item
v-if="state.showComponent"
ref="component"
label="组件"
name="component"
> >
</a-tree-select> <a-input v-model:value="formState.component" />
</a-form-item> </a-form-item>
<a-form-item ref="title" label="名称" name="title"> </a-col>
<a-input v-model:value="formState.title" /> <a-col :span="12">
</a-form-item> <a-form-item
<a-form-item v-if="state.showComponent" ref="component" label="组件" name="component"> v-if="state.showPath"
<a-input v-model:value="formState.component" /> ref="path"
</a-form-item> label="路径"
<a-form-item v-if="state.showPath" ref="path" label="路径" name="path"> name="path"
<a-input v-model:value="formState.path" /> >
</a-form-item> <a-input v-model:value="formState.path" />
<a-form-item v-if="state.showCode" ref="code" label="标识" name="code"> </a-form-item>
<a-input v-model:value="formState.code" /> </a-col>
</a-form-item> <a-col :span="12">
<a-form-item label="图标" name="icon"> <a-form-item
<pro-icon-picker v-model:modelValue="formState.icon"></pro-icon-picker> v-if="state.showCode"
</a-form-item> ref="code"
<a-form-item ref="i18n" label="i18n" name="i18n"> label="标识"
<a-input v-model:value="formState.i18n" /> name="code"
</a-form-item> >
<a-form-item ref="type" label="类型" name="type"> <a-input v-model:value="formState.code" />
<a-select v-model:value="formState.type" @change="change"> </a-form-item>
<a-select-option value="0"> 目录 </a-select-option> </a-col>
<a-select-option value="1"> 菜单 </a-select-option> <a-col :span="12">
<a-select-option value="2"> 按钮 </a-select-option> <a-form-item label="图标" name="icon">
</a-select> <pro-icon-picker
</a-form-item> v-model:modelValue="formState.icon"
<a-form-item ref="sort" label="排序" name="sort"> ></pro-icon-picker>
<a-input-number v-model:value="formState.sort" /> </a-form-item>
</a-form-item> </a-col>
<a-form-item label="状态" name="enable"> <a-col :span="12">
<a-switch v-model:checked="formState.enable" /> <a-form-item ref="i18n" label="i18n" name="i18n">
</a-form-item> <a-input v-model:value="formState.i18n" />
<a-form-item label="备注" name="remark"> </a-form-item>
<a-textarea v-model:value="formState.remark" /> </a-col>
</a-form-item> <a-col :span="12">
<a-form-item ref="type" label="类型" name="type">
<a-select v-model:value="formState.type" @change="change">
<a-select-option value="0"> 目录 </a-select-option>
<a-select-option value="1"> 菜单 </a-select-option>
<a-select-option value="2"> 按钮 </a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item ref="sort" label="排序" name="sort">
<a-input-number
style="width: 100%"
v-model:value="formState.sort"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="状态" name="enable">
<a-switch v-model:checked="formState.enable" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="备注" name="remark">
<a-textarea v-model:value="formState.remark" />
</a-form-item>
</a-col>
</a-row>
</a-form> </a-form>
</a-modal> </a-modal>
</template> </template>
<script> <script>
import { message } from '@hwork/ant-design-vue'; import { message } from "@hwork/ant-design-vue";
import { edit, tree } from "@/api/module/power"; import { edit, tree } from "@/api/module/power";
import { defineComponent, reactive, ref, toRaw, watch } from "vue"; import { defineComponent, reactive, ref, toRaw, watch } from "vue";
export default defineComponent({ export default defineComponent({
@ -74,17 +117,16 @@ export default defineComponent({
type: Boolean, type: Boolean,
}, },
record: { record: {
type: Object type: Object,
} },
}, },
emit: ["close"], emit: ["close"],
setup(props, context) { setup(props, context) {
const state = reactive({ const state = reactive({
depts: [], depts: [],
showComponent: true, showComponent: true,
showPath: true, showPath: true,
showCode: false showCode: false,
}); });
const formRef = ref(); const formRef = ref();
@ -94,7 +136,7 @@ export default defineComponent({
enable: true, enable: true,
}); });
watch(props,(props) => { watch(props, (props) => {
formState.id = props.record.id; formState.id = props.record.id;
formState.title = props.record.title; formState.title = props.record.title;
formState.component = props.record.component; formState.component = props.record.component;
@ -107,7 +149,7 @@ export default defineComponent({
formState.sort = props.record.sort; formState.sort = props.record.sort;
formState.remark = props.record.remark; formState.remark = props.record.remark;
formState.parent = props.record.parent; formState.parent = props.record.parent;
if(formState.type === '2') { if (formState.type === "2") {
state.showComponent = false; state.showComponent = false;
state.showPath = false; state.showPath = false;
state.showCode = true; state.showCode = true;
@ -116,17 +158,19 @@ export default defineComponent({
state.showPath = true; state.showPath = true;
state.showCode = false; state.showCode = false;
} }
}) });
const formRules = { const formRules = {
title: [{ required: true, message: '请输入权限名称', trigger: 'blur'}], title: [{ required: true, message: "请输入权限名称", trigger: "blur" }],
i18n: [{ required: true, message: '请输入 i18n', trigger: 'blur'}], i18n: [{ required: true, message: "请输入 i18n", trigger: "blur" }],
type: [{ required: true, message: '请输入权限类型', trigger: 'blur'}], type: [{ required: true, message: "请输入权限类型", trigger: "blur" }],
parent: [{ required: true, message: '请选择上级权限', trigger: 'change'}] parent: [
{ required: true, message: "请选择上级权限", trigger: "change" },
],
}; };
const change = function(val) { const change = function (val) {
if(val === '2') { if (val === "2") {
state.showComponent = false; state.showComponent = false;
state.showPath = false; state.showPath = false;
state.showCode = true; state.showCode = true;
@ -135,26 +179,26 @@ export default defineComponent({
state.showPath = true; state.showPath = true;
state.showCode = false; state.showCode = false;
} }
} };
const submit = (e) => { const submit = (e) => {
formRef.value formRef.value
.validate() .validate()
.then(() => { .then(() => {
edit(toRaw(formState)).then((response)=>{ edit(toRaw(formState)).then((response) => {
if(response.success){ if (response.success) {
message.success({ content: '保存成功', duration: 1 }).then(()=>{ message.success({ content: "保存成功", duration: 1 }).then(() => {
cancel(); cancel();
}); });
}else{ } else {
message.success({ content: '保存失败', duration: 1 }).then(()=>{ message.success({ content: "保存失败", duration: 1 }).then(() => {
cancel(); cancel();
}); });
} }
}); });
}) })
.catch(error => { .catch((error) => {
console.log('error', error); console.log("error", error);
}); });
}; };
@ -164,15 +208,17 @@ export default defineComponent({
}; };
const loadPower = () => { const loadPower = () => {
tree({}).then((response)=>{ tree({}).then((response) => {
response.data = [{ response.data = [
id:"0", {
title: "顶级菜单", id: "0",
children: response.data title: "顶级菜单",
}] children: response.data,
},
];
state.powers = response.data; state.powers = response.data;
}) });
} };
loadPower(); loadPower();
@ -188,7 +234,12 @@ export default defineComponent({
labelCol: { span: 6 }, labelCol: { span: 6 },
wrapperCol: { span: 18 }, wrapperCol: { span: 18 },
replaceFields: {children:'children', title:'title', key:'id', value: 'id' } replaceFields: {
children: "children",
title: "title",
key: "id",
value: "id",
},
}; };
}, },
}); });

View File

@ -8,57 +8,76 @@
@cancel="cancel" @cancel="cancel"
> >
<a-form <a-form
ref="formRef" ref="formRef"
:model="formState" :model="formState"
:rules="formRules" :rules="formRules"
:label-col="labelCol" layout="vertical"
:wrapper-col="wrapperCol"
> >
<a-form-item label="上级" name="parent"> <a-row :gutter="[16, 0]">
<a-tree-select <a-col :span="12">
v-model:value="formState.parent" <a-form-item label="上级" name="parent">
style="width: 100%" <a-tree-select
:tree-data="state.powers" v-model:value="formState.parent"
placeholder="上级权限" style="width: 100%"
replace :tree-data="state.powers"
tree-default-expand-all placeholder="上级权限"
:replaceFields="replaceFields" replace
> tree-default-expand-all
</a-tree-select> :replaceFields="replaceFields"
</a-form-item> >
<a-form-item ref="title" label="名称" name="title"> </a-tree-select>
<a-input v-model:value="formState.title" /> </a-form-item>
</a-form-item> </a-col>
<a-form-item ref="component" label="组件" name="component"> <a-col :span="12">
<a-input v-model:value="formState.component" /> <a-form-item ref="title" label="名称" name="title">
</a-form-item> <a-input v-model:value="formState.title" />
<a-form-item ref="path" label="路径" name="path"> </a-form-item>
<a-input v-model:value="formState.path" /> </a-col>
</a-form-item> <a-col :span="12">
<a-form-item ref="i18n" label="i18n" name="i18n"> <a-form-item ref="component" label="组件" name="component">
<a-input v-model:value="formState.i18n" /> <a-input v-model:value="formState.component" />
</a-form-item> </a-form-item>
<a-form-item ref="type" label="类型" name="type"> </a-col>
<a-select v-model:value="formState.type"> <a-col :span="12">
<a-select-option value="0"> 目录 </a-select-option> <a-form-item ref="path" label="路径" name="path">
<a-select-option value="1"> 菜单 </a-select-option> <a-input v-model:value="formState.path" />
<a-select-option value="2"> 按钮 </a-select-option> </a-form-item>
</a-select> </a-col>
</a-form-item> <a-col :span="12">
<a-form-item ref="sort" label="排序" name="sort"> <a-form-item ref="i18n" label="i18n" name="i18n">
<a-input-number v-model:value="formState.sort" /> <a-input v-model:value="formState.i18n" />
</a-form-item> </a-form-item>
<a-form-item label="状态" name="enable"> </a-col>
<a-switch v-model:checked="formState.enable" /> <a-col :span="12">
</a-form-item> <a-form-item ref="type" label="类型" name="type">
<a-form-item label="备注" name="remark"> <a-select v-model:value="formState.type">
<a-textarea v-model:value="formState.remark" /> <a-select-option value="0"> 目录 </a-select-option>
</a-form-item> <a-select-option value="1"> 菜单 </a-select-option>
<a-select-option value="2"> 按钮 </a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item ref="sort" label="排序" name="sort">
<a-input-number style="width: 100%" v-model:value="formState.sort" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="状态" name="enable">
<a-switch v-model:checked="formState.enable" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="备注" name="remark">
<a-textarea v-model:value="formState.remark" />
</a-form-item>
</a-col>
</a-row>
</a-form> </a-form>
</a-modal> </a-modal>
</template> </template>
<script> <script>
import { message } from '@hwork/ant-design-vue'; import { message } from "@hwork/ant-design-vue";
import { save, tree } from "@/api/module/power"; import { save, tree } from "@/api/module/power";
import { defineComponent, reactive, ref, toRaw, watch } from "vue"; import { defineComponent, reactive, ref, toRaw, watch } from "vue";
export default defineComponent({ export default defineComponent({
@ -67,15 +86,14 @@ export default defineComponent({
type: Boolean, type: Boolean,
}, },
record: { record: {
type: Object type: Object,
} },
}, },
emit: ["close"], emit: ["close"],
setup(props, context) { setup(props, context) {
const state = reactive({ const state = reactive({
depts: [], depts: [],
}) });
const formRef = ref(); const formRef = ref();
@ -84,7 +102,7 @@ export default defineComponent({
enable: true, enable: true,
}); });
watch(props,(props) => { watch(props, (props) => {
formState.id = props.record.id; formState.id = props.record.id;
formState.title = props.record.title; formState.title = props.record.title;
formState.component = props.record.component; formState.component = props.record.component;
@ -94,15 +112,19 @@ export default defineComponent({
formState.i18n = props.record.i18n; formState.i18n = props.record.i18n;
formState.remark = props.record.remark; formState.remark = props.record.remark;
formState.parent = props.record.parent; formState.parent = props.record.parent;
}) });
const formRules = { const formRules = {
title: [{ required: true, message: '请输入权限名称', trigger: 'blur'}], title: [{ required: true, message: "请输入权限名称", trigger: "blur" }],
component: [{ required: true, message: '请输入路由组件', trigger: 'blur'}], component: [
path: [{ required: true, message: '请输入路由地址', trigger: 'blur'}], { required: true, message: "请输入路由组件", trigger: "blur" },
i18n: [{ required: true, message: '请输入 i18n', trigger: 'blur'}], ],
type: [{ required: true, message: '请输入权限类型', trigger: 'blur'}], path: [{ required: true, message: "请输入路由地址", trigger: "blur" }],
parent: [{ required: true, message: '请选择上级权限', trigger: 'change'}] i18n: [{ required: true, message: "请输入 i18n", trigger: "blur" }],
type: [{ required: true, message: "请输入权限类型", trigger: "blur" }],
parent: [
{ required: true, message: "请选择上级权限", trigger: "change" },
],
}; };
const submit = (e) => { const submit = (e) => {
@ -116,10 +138,10 @@ export default defineComponent({
}; };
const loadPower = () => { const loadPower = () => {
tree({}).then((response)=>{ tree({}).then((response) => {
state.powers = response.data; state.powers = response.data;
}) });
} };
loadPower(); loadPower();
@ -134,7 +156,12 @@ export default defineComponent({
labelCol: { span: 6 }, labelCol: { span: 6 },
wrapperCol: { span: 18 }, wrapperCol: { span: 18 },
replaceFields: {children:'children', title:'title', key:'id', value: 'id' } replaceFields: {
children: "children",
title: "title",
key: "id",
value: "id",
},
}; };
}, },
}); });

View File

@ -1,8 +1,20 @@
<template> <template>
<a-modal :open="visible" title="新增权限" cancelText="取消" okText="提交" @ok="submit" @cancel="cancel"> <a-modal
<a-form ref="formRef" :model="formState" :rules="formRules" :label-col="labelCol" :wrapper-col="wrapperCol"> :open="visible"
<a-row :gutter='[1,1]'> title="新增权限"
<a-col :span ="12"> cancelText="取消"
okText="提交"
@ok="submit"
@cancel="cancel"
>
<a-form
ref="formRef"
:model="formState"
:rules="formRules"
layout="vertical"
>
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item ref="type" label="类型" name="type"> <a-form-item ref="type" label="类型" name="type">
<a-select v-model:value="formState.type" @change="change"> <a-select v-model:value="formState.type" @change="change">
<a-select-option value="0"> 目录 </a-select-option> <a-select-option value="0"> 目录 </a-select-option>
@ -11,7 +23,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span ="12"> <a-col :span="12">
<a-form-item ref="clientType" label="终端" name="clientType"> <a-form-item ref="clientType" label="终端" name="clientType">
<a-select v-model:value="formState.clientType" @change="change"> <a-select v-model:value="formState.clientType" @change="change">
<a-select-option value="PC"> PC端 </a-select-option> <a-select-option value="PC"> PC端 </a-select-option>
@ -20,191 +32,224 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12">
<a-form-item label="上级" name="parent">
<a-tree-select
v-model:value="formState.parent"
style="width: 100%"
:dropdown-style="{ maxHeight: '360px', overflow: 'auto' }"
:tree-data="state.powers"
placeholder="上级权限"
replace
tree-default-expand-all
:replaceFields="replaceFields"
>
</a-tree-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item ref="title" label="名称" name="title">
<a-input v-model:value="formState.title" />
</a-form-item>
</a-col>
<a-col :span="12" v-if="state.showComponent">
<a-form-item ref="component" label="组件" name="component">
<a-input v-model:value="formState.component" />
</a-form-item>
</a-col>
<a-col :span="12" v-if="state.showPath">
<a-form-item ref="path" label="路径" name="path">
<a-input v-model:value="formState.path" />
</a-form-item>
</a-col>
<a-col :span="12" v-if="state.showCode">
<a-form-item ref="code" label="标识" name="code">
<a-input v-model:value="formState.code" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="图标" name="icon">
<pro-icon-picker
v-model:modelValue="formState.icon"
></pro-icon-picker>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item ref="i18n" label="i18n" name="i18n">
<a-input v-model:value="formState.i18n" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item ref="sort" label="排序" name="sort">
<a-input-number style="width: 100%" v-model:value="formState.sort" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="状态" name="enable">
<a-switch v-model:checked="formState.enable" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="备注" name="remark">
<a-textarea v-model:value="formState.remark" />
</a-form-item>
</a-col>
</a-row> </a-row>
<a-form-item label="上级" name="parent">
<a-tree-select v-model:value="formState.parent" style="width: 100%;"
:dropdown-style="{ maxHeight: '360px', overflow: 'auto' }" :tree-data="state.powers" placeholder="上级权限"
replace tree-default-expand-all :replaceFields="replaceFields">
</a-tree-select>
</a-form-item>
<a-form-item ref="title" label="名称" name="title">
<a-input v-model:value="formState.title" />
</a-form-item>
<a-form-item v-if="state.showComponent" ref="component" label="组件" name="component">
<a-input v-model:value="formState.component" />
</a-form-item>
<a-form-item v-if="state.showPath" ref="path" label="路径" name="path">
<a-input v-model:value="formState.path" />
</a-form-item>
<a-form-item v-if="state.showCode" ref="code" label="标识" name="code">
<a-input v-model:value="formState.code" />
</a-form-item>
<a-form-item label="图标" name="icon">
<pro-icon-picker v-model:modelValue="formState.icon"></pro-icon-picker>
</a-form-item>
<a-form-item ref="i18n" label="i18n" name="i18n">
<a-input v-model:value="formState.i18n" />
</a-form-item>
<a-form-item ref="sort" label="排序" name="sort">
<a-input-number v-model:value="formState.sort" />
</a-form-item>
<a-form-item label="状态" name="enable">
<a-switch v-model:checked="formState.enable" />
</a-form-item>
<a-form-item label="备注" name="remark">
<a-textarea v-model:value="formState.remark" />
</a-form-item>
</a-form> </a-form>
</a-modal> </a-modal>
</template> </template>
<script> <script>
import { import { message } from "@hwork/ant-design-vue";
message import { save, tree } from "@/api/module/power";
} from "@hwork/ant-design-vue"; import { defineComponent, reactive, ref, toRaw, watch } from "vue";
import { export default defineComponent({
save, props: {
tree visible: {
} from "@/api/module/power"; type: Boolean,
import {
defineComponent,
reactive,
ref,
toRaw,
watch
} from "vue";
export default defineComponent({
props: {
visible: {
type: Boolean,
},
}, },
emit: ["close"], },
setup(props, context) { emit: ["close"],
setup(props, context) {
const state = reactive({
depts: [],
showComponent: true,
showPath: true,
showCode: false,
});
const state = reactive({ const formRef = ref();
depts: [],
showComponent: true,
showPath: true,
showCode: false
});
const formRef = ref(); const formState = reactive({
type: "0",
sort: 0,
parent: "0",
enable: true,
});
const formState = reactive({ const formRules = {
type: "0", title: [
sort: 0, {
parent: "0",
enable: true,
});
const formRules = {
title: [{
required: true, required: true,
message: "请输入权限名称", message: "请输入权限名称",
trigger: "blur" trigger: "blur",
}], },
i18n: [{ ],
i18n: [
{
required: true, required: true,
message: "请输入 i18n", message: "请输入 i18n",
trigger: "blur" trigger: "blur",
}], },
type: [{ ],
type: [
{
required: true, required: true,
message: "请输入权限类型", message: "请输入权限类型",
trigger: "blur" trigger: "blur",
}], },
clientType: [{ ],
clientType: [
{
required: true, required: true,
message: "请选择权限终端类型", message: "请选择权限终端类型",
trigger: "blur" trigger: "blur",
}], },
parent: [{ ],
parent: [
{
required: true, required: true,
message: "请选择上级权限", message: "请选择上级权限",
trigger: "change" trigger: "change",
}], },
}; ],
};
const submit = (e) => { const submit = (e) => {
formRef.value formRef.value
.validate() .validate()
.then(() => { .then(() => {
save(toRaw(formState)).then((response) => { save(toRaw(formState)).then((response) => {
if (response.success) { if (response.success) {
message.success({ message
.success({
content: "保存成功", content: "保存成功",
duration: 1 duration: 1,
}).then(() => { })
.then(() => {
cancel(); cancel();
}); });
} else { } else {
message.success({ message
.success({
content: "保存失败", content: "保存失败",
duration: 1 duration: 1,
}).then(() => { })
.then(() => {
cancel(); cancel();
}); });
} }
});
})
.catch((error) => {
console.log("error", error);
}); });
}; })
.catch((error) => {
console.log("error", error);
});
};
const cancel = (e) => { const cancel = (e) => {
formRef.value.resetFields(); formRef.value.resetFields();
context.emit("close", false); context.emit("close", false);
}; };
const loadPower = () => { const loadPower = () => {
tree({}).then((response) => { tree({}).then((response) => {
response.data = [{ response.data = [
{
id: "0", id: "0",
title: "顶级菜单", title: "顶级菜单",
children: response.data children: response.data,
}] },
state.powers = response.data; ];
}); state.powers = response.data;
}; });
};
const change = function(val) { const change = function (val) {
if (val === '2') { if (val === "2") {
state.showComponent = false; state.showComponent = false;
state.showPath = false; state.showPath = false;
state.showCode = true; state.showCode = true;
} else { } else {
state.showComponent = true; state.showComponent = true;
state.showPath = true; state.showPath = true;
state.showCode = false; state.showCode = false;
}
} }
};
loadPower(); loadPower();
return { return {
state, state,
submit, submit,
change, change,
cancel, cancel,
formRef, formRef,
formState, formState,
formRules, formRules,
labelCol: { labelCol: {
span: 6 span: 6,
}, },
wrapperCol: { wrapperCol: {
span: 18 span: 18,
}, },
replaceFields: { replaceFields: {
children: "children", children: "children",
title: "title", title: "title",
key: "id", key: "id",
value: "id", value: "id",
}, },
}; };
}, },
}); });
</script> </script>