aexiaoliou hace 1 año
padre
commit
ef1d6e77e8

+ 6 - 0
api/app/admin/controller/Project.php

@@ -94,6 +94,12 @@ class Project extends BaseAuthorized
     /*
      * 合同相关接口
      */
+    #[Post('contract/page')]
+    public function pageContranct()
+    {
+        $res = $this->ContractService()->page();
+        return Result::rest($res);        
+    }
 
     #[Post('contract/create')]
     public function createContract()

+ 6 - 1
api/app/admin/controller/Role.php

@@ -9,11 +9,16 @@ class Role extends BaseAuthorized
 {
     public function list()
     {
-        //第1段:校验输入
         $res = $this->RoleService()->list();
         return Result::rest($res);
     }
 
+    public function update()
+    {
+        $res = $this->RoleService()->update();
+        return Result::rest($res);
+    }
+
     public function codes()
     {
         $res = $this->RoleService()->codes();

+ 18 - 2
api/app/common/service/ContractService.php

@@ -2,19 +2,35 @@
 
 namespace app\common\service;
 use app\common\model\Contract;
+use app\common\util\WhereBuilder;
 
 class ContractService extends Service
 {
-    public function create($param = [])
+    public function page($param = [])
     {
         $this->autoParams($param);
 
+        $project_id = $this->pg('project_id');
+
+        $where = WhereBuilder::builder()
+            ->eq('project_id', $project_id)
+            ->build();
+
+        return (new Contract)
+            ->where($where)
+            ->paginate($this->tp6Page());
+    }
+
+    public function create($param = [])
+    {
+        $param = $this->autoParams($param);
+
         return Contract::create($param);
     }
 
     public function update($param = [])
     {
-        $this->autoParams($param);
+        $param = $this->autoParams($param);
 
         return Contract::update($param);
     }

+ 30 - 30
api/app/common/service/RoleService.php

@@ -25,35 +25,35 @@ class RoleService extends Service
     public function codes()
     {
         // 从缓存获取之前生成好的值
-        // $cache = Cache::get(self::CODE_CACHE_KEY);
-        // if ($cache) {
-        //     return $cache;
-        // }
+        $cache = Cache::get(self::CODE_CACHE_KEY);
+        if ($cache) {
+            return $cache;
+        }
 
-        $crud = function($parent, $create = true, $read = true, $update = true, $delete = true) {
+        $crud = function($parent, $name, $create = true, $read = true, $update = true, $delete = true) {
             $codes = [];
             if ($create) {
                 $codes[] = [
-                    'code' => "$parent.create",
-                    'cn' => '创建'
+                    'id' => "$parent.create",
+                    'lable' => "创建-$name"
                 ];
             }
             if ($read) {
                 $codes[] = [
-                    'code' => "$parent.read",
-                    'cn' => '创建'
+                    'id' => "$parent.read",
+                    'lable' => "读取-$name"
                 ];
             }
             if ($update) {
                 $codes[] = [
-                    'code' => "$parent.update",
-                    'cn' => '创建'
+                    'id' => "$parent.update",
+                    'lable' => "编辑-$name"
                 ];
             }
             if ($delete) {
                 $codes[] = [
-                    'code' => "$parent.delete",
-                    'cn' => '创建'
+                    'id' => "$parent.delete",
+                    'lable' => "删除-$name"
                 ];
             }
 
@@ -62,33 +62,33 @@ class RoleService extends Service
 
         $codes = [
             [
-                'code' => Role::CODE_SUPER_ADMIN,
-                'cn' => '超级管理员(所有权限)',
+                'id' => Role::CODE_SUPER_ADMIN,
+                'lable' => '超级管理员(所有权限)',
             ],
             [
-                'code' => 'admin',
-                'cn' => '人员管理',
-                'children' => $crud('admin')
+                'id' => 'admin',
+                'lable' => '人员管理',
+                'children' => $crud('admin', '人员管理')
             ],
             [
-                'code' => 'project',
-                'cn' => '项目',
+                'id' => 'project',
+                'lable' => '项目',
                 'children' => [
-                    ...$crud('project'),
+                    ...$crud('project', '项目'),
                     [
-                        'code' => 'project.schedule',
-                        'cn' => '进程',
-                        'children' => $crud('project.schedule')
+                        'id' => 'project.schedule',
+                        'lable' => '进程',
+                        'children' => $crud('project.schedule', '进程')
                     ],
                     [
-                        'code' => 'project.status',
-                        'cn' => '状态',
-                        'children' => $crud('project.status', delete: false)
+                        'id' => 'project.status',
+                        'lable' => '状态',
+                        'children' => $crud('project.status', '状态', delete: false)
                     ],
                     [
-                        'code' => 'project.contract',
-                        'cn' => '合同',
-                        'children' => $crud('project.contract')
+                        'id' => 'project.contract',
+                        'lable' => '合同',
+                        'children' => $crud('project.contract', '合同')
                     ]
                 ]
             ]

+ 1 - 1
h5/src/api/Urls.ts

@@ -93,7 +93,7 @@ const Urls = {
 	role: {
 		list: 'admin/role/list', //列表
         codes: '/admin/role/codes', // 权限列表
-		edit: 'admin/role/edit', //更新
+		update: 'admin/role/update', //更新
 		add: 'admin/role/add', //添加
 		del: 'admin/role/del', //删除/批量删除
 	},

+ 7 - 21
h5/src/api/role/index.ts

@@ -36,17 +36,18 @@ export interface Role {
     update_time?: Date | string
     delete_time?: Date | string
 }
+
+export interface CodeTree {
+    code: string
+    cn: string
+    children?: CodeTree[]
+}
 /**
  * 角色
  * @returns 角色列表
  */
 export const list = async () => {
     const res = await Http.get(role.list)
-    if (res?.code != 0) {
-        ElMessage({
-            message: res?.msg,
-        })
-    }
     return res
 }
 /**
@@ -66,11 +67,6 @@ export const init = async () => {
  */
 export const create = async (param: object) => {
     const res = await Http.post(role.add, param)
-    if (res?.code != 0) {
-        ElMessage({
-            message: res?.msg,
-        })
-    }
     return res
 }
 /**
@@ -79,12 +75,7 @@ export const create = async (param: object) => {
  * @returns 更新后对象
  */
 export const update = async (param: any) => {
-    const res = await Http.post(role.edit, param)
-    if (res?.code != 0) {
-        ElMessage({
-            message: res?.msg,
-        })
-    }
+    const res = await Http.post(role.update, param)
     return res
 }
 /**
@@ -94,11 +85,6 @@ export const update = async (param: any) => {
  */
 export const del = async (id: number[]) => {
     const res = await Http.post(role.del, { id })
-    if (res?.code != 0) {
-        ElMessage({
-            message: res?.msg,
-        })
-    }
     return res
 }
 

+ 0 - 0
h5/src/components/role/edit.tsx


+ 65 - 0
h5/src/components/role/edit.vue

@@ -0,0 +1,65 @@
+<template>
+    <el-dialog :modelValue="modelValue" @close="$emit('update:modelValue', false)" title="编辑权限">
+        <el-tree-v2 ref="tree" :data="codes" :props="treeProps" :default-checked-keys="role?.codes" show-checkbox>
+            <template #default="{ node }">
+                <span>{{ node.data.lable }}</span>
+            </template>
+        </el-tree-v2>
+        <template #footer>
+            <el-button type="default" @click="$emit('update:modelValue', false)">取消</el-button>
+            <el-button v-loading="submitLoading" type="primary" @click="submitForm()">提交</el-button>
+        </template>
+    </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { update, codes as getCodes } from '/@/api/role'
+import type { Role, CodeTree } from '/@/api/role'
+import { ref, onMounted } from 'vue'
+import type { ElTreeV2 } from 'element-plus'
+import { clone } from 'lodash'
+import { ElMessage } from 'element-plus'
+
+const { modelValue, role } = defineProps<{
+    modelValue: boolean,
+    role?: Role
+}>()
+const emit = defineEmits(['update:modelValue'])
+
+const codes = ref()
+
+const tree = ref()
+
+const submitLoading = ref(false)
+
+const treeProps = {
+    value: 'id',
+    label: 'label',
+    children: 'children',
+}
+
+onMounted(async () => {
+    codes.value = (await getCodes()).data
+})
+
+const submitForm = async () => {
+    const checkedCodes = tree.value?.getCheckedNodes(true).map(node => node.lable)
+    console.log("🚀 ~ file: edit.vue:43 ~ submitForm ~ checkedCodes:", checkedCodes)
+    const checkedKeys = tree.value?.getCheckedKeys()
+
+    const updateRole = clone(role) as Role
+    updateRole.codes = checkedKeys
+    updateRole.codes_cn = checkedCodes
+
+    submitLoading.value = true
+    const result = await update(updateRole)
+    if (result.code != 0) {
+        return
+    }
+    submitLoading.value = false
+    ElMessage({ message: '更新成功' })
+
+    emit('update:modelValue', false)
+}
+
+</script>

+ 1 - 1
h5/src/router/route.ts

@@ -97,7 +97,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 					{
 						path: '/admin/adminrole',
 						name: 'adminRole',
-						component: () => import('/@/views/admin/roleManage/index.vue'),
+						component: () => import('/@/views/admin/role/index.vue'),
 						meta: {
 							title: 'message.router.adminRole', //角色管理
 							isLink: '',

+ 0 - 1
h5/src/utils/request.ts

@@ -42,7 +42,6 @@ service.interceptors.response.use(
 	(response) => {
 		// 对响应数据做点什么
 		const res = response.data;
-		console.log('axios res:', response)
 		//console.log("service.interceptors.response", response, res);
 		if (res.code && res.code !== 0) {
 			// 刷新页面

+ 141 - 0
h5/src/views/admin/role/index.vue

@@ -0,0 +1,141 @@
+<template>
+    <Edit v-model="showCodesEditForm" :role="editRole"></Edit>
+    <div>
+        <el-card class="box-card" v-loading="wholeLoading" element-loading-text="Loading..." style="height: 600px">
+            <template #header>
+                <div class="card-header">
+                    <span>权限管理</span>
+                    <div>
+                        <el-button type="default" @click="reflush()">刷新列表</el-button>
+                        <el-button type="primary" @click="create()">新增角色</el-button>
+                    </div>
+                </div>
+            </template>
+            <el-auto-resizer>
+                <template #default="{ height, width }">
+                    <el-table-v2 :data="data" :columns="columns" :width="width" :height="600" fixed />
+                </template>
+            </el-auto-resizer>
+        </el-card>
+    </div>
+</template>
+
+<script lang="ts" setup name="underlyingRoleManage">
+import { ref, reactive, onMounted, h } from 'vue'
+import { ElSwitch, ElTag, ElMessage, ElMessageBox, ElButton, TableV2FixedDir, roleTypes } from 'element-plus'
+import type { Column, RowClassNameGetter } from 'element-plus'
+import { throttle } from 'lodash'
+import { init, update } from '/@/api/role'
+import type { Role } from '/@/api/role'
+import Edit from '/@/components/role/edit.vue'
+
+/**
+ * 表格数据
+ */
+const data = await init()
+/**
+ * 整个页面的loading
+ */
+const wholeLoading = ref(false)
+/**
+ * 编辑权限表单的显示控制
+ */
+const showCodesEditForm = ref(false)
+
+const editRole = ref<Role>()
+
+/**
+ * 虚拟表格列信息
+ */
+const columns: Column<any>[] = [
+    {
+        key: 'name',
+        title: '角色名',
+        dataKey: 'name',
+        width: 150,
+    },
+    {
+        key: 'codes_cn',
+        title: '权限值',
+        dataKey: 'codes_cn',
+        width: 400,
+        cellRenderer: ({ cellData: codes_cn }) => h(
+            'div',
+            codes_cn?.map(cn => h(ElTag, { style: { 'margin-right': '5px' } }, cn))
+        ),
+    },
+    {
+        key: 'remark',
+        title: '备注',
+        dataKey: 'remark',
+        width: 300,
+    },
+    {
+        key: 'valid',
+        title: '是否启用',
+        dataKey: 'valid',
+        width: 100,
+        cellRenderer: ({ cellData: valid }) => h(
+            ElTag,
+            { effect: valid ? 'dark' : 'plain' }, valid ? '已启用' : '已禁用'
+        ),
+    },
+    {
+        key: 'op',
+        title: '操作',
+        width: 400,
+        fixed: TableV2FixedDir.RIGHT,
+        flexGrow: 1,
+        cellRenderer: ({ rowData: row }) =>
+            h('div', [
+                // 启用禁用
+                h(
+                    ElButton,
+                    {
+                        type: row.valid ? 'danger' : 'success',
+                        onClick: throttle(() => {
+                            row.valid = !row.valid
+                            update(row)
+                        }),
+                    },
+                    row.valid ? '禁用' : '启用'
+                ),
+                // 打开权限表单
+                h(
+                    ElButton,
+                    {
+                        type: 'primary',
+                        onClick: throttle(() => {
+                            showCodesEditForm.value = true
+                            console.log(showCodesEditForm)
+                            editRole.value = row
+                        }),
+                    },
+                    '权限'
+                ),
+            ]),
+    },
+]
+
+/**
+ * 创建
+ */
+const create = () => { }
+/**
+ * 刷新
+ */
+const reflush = () => { }
+</script>
+
+<style lang="scss" scoped>
+.box-card {
+    margin: 10px;
+}
+
+.card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    overflow-x: auto;
+}
+</style>

h5/src/views/admin/roleManage/role.ts → h5/src/views/admin/role/role.ts


+ 0 - 295
h5/src/views/admin/roleManage/edit.vue

@@ -1,295 +0,0 @@
-<template>
-	<div class="system-dept-dialog-container">
-		<el-dialog :title="state.dialog.title" v-model="state.dialog.isShowDialog" width="769px">
-			<el-form ref="deptDialogFormRef" :model="state.ruleForm" size="default" label-width="90px">
-				<el-row :gutter="35">
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="权限名称">
-							<el-input v-model="state.ruleForm.name" placeholder="请输入权限名称" clearable></el-input>
-						</el-form-item>
-					</el-col>
-
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="备注说明">
-							<el-input v-model="state.ruleForm.remark" placeholder="请输入备注说明" clearable></el-input>
-						</el-form-item>
-					</el-col>
-
-					<!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="角色状态">
-							<el-switch v-model="state.status" inline-prompt active-text="启用" inactive-text="禁用"></el-switch>
-						</el-form-item>
-					</el-col> -->
-
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="权限状态" :rules="[{ required: true, message: '权限状态不能为空' }]">
-							<el-radio-group v-model="state.ruleForm.valid">
-								<el-radio :label="1">启用</el-radio>
-								<el-radio :label="0">禁用</el-radio>
-							</el-radio-group>
-						</el-form-item>
-					</el-col>
-
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="菜单权限">
-							<!-- :default-expanded-keys="state.ruleForm.codes" -->
-							<el-tree
-								show-checkbox
-							 	ref="treeRef"
-								node-key="id"
-								:data="state.role_list"
-								:props="state.menuProps"
-								:default-checked-keys="state.ruleForm.code"
-								@check-change="getCheckedNodes()"
-								class="menu-data-tree"
-							/>
-						</el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="onCancel" size="default">取 消</el-button>
-					<el-button type="primary" @click="onSubmit" size="default">{{ state.dialog.submitTxt }}</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script setup lang="ts" name="underlyingProductManageEdit">
-import { reactive, ref } from 'vue';
-import { ElMessage, ElTree } from 'element-plus';
-import type Node from 'element-plus/es/components/tree/src/model/node';
-import { Plus } from '@element-plus/icons-vue';
-import type { UploadProps } from 'element-plus';
-import config from '/@/config.ts';
-import Role from '/@/api/role/role.ts';
-import ruleReg from '/@/utils/ruleReg.ts';
-import Data from './role.ts';
-
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['refresh']);
-
-// 定义变量内容
-const deptDialogFormRef = ref();
-const state = reactive({
-	ruleForm: {
-		id: 0,
-		name: '',
-		remark: '',
-		valid: 1,
-		code:<any> [],
-		codes:<any> [],
-		codes_cn:<any> [],
-	},
-	code:<any> [],
-	codes:<any> [],
-	codes_cn:<any> [],
-	status: true,
-	options: [], // 单位类型
-	dialog: {
-		isShowDialog: false,
-		type: '',
-		title: '',
-		submitTxt: '',
-	},
-	action: config.host + '/admin/upload/file',
-	menuData: [] as TreeType[],
-	menuProps: {
-		children: 'children',
-		label: 'label',
-	},
-	role_list: [],//Data.role_list
-});
-
-const handleCheckChange = (
-  data: TreeType,
-  checked: boolean,
-  indeterminate: boolean
-) => {
-  	let getCheckedNodes = treeRef.value!.getCheckedNodes(false, true);
-	console.log('getCheckedNodes', getCheckedNodes);
-	treeFormat(getCheckedNodes);
-}
-
-const treeRef = ref<InstanceType<typeof ElTree>>()
-const getCheckedNodes = () => {
-	let getCheckedNodes = treeRef.value!.getCheckedNodes(false, true);
-	console.log('getCheckedNodes', getCheckedNodes);
-	treeFormat(getCheckedNodes);
-}
-// 树状列表处理
-const treeFormat = (tree_list:any) => {
-	state.code = [];
-	state.codes = [];
-	state.codes_cn = [];
-	let ids:any = [];
-	tree_list.forEach((item:any)=>{
-		state.codes.push(item.id);
-		state.codes_cn.push(item.label);
-	})
-	for(let i=0;i<tree_list.length;i++){
-		for(let j=0;j<tree_list.length;j++){
-			if(tree_list[i].id==tree_list[j].pId){
-				ids.push(tree_list[i].id);
-			}
-		}
-	}
-	for(let k=0;k<tree_list.length;k++){
-		for(let l=0;l<ids.length;l++){
-			if(tree_list[k].id==ids[l]){
-				tree_list.splice(k,1);
-			}
-		}
-	}
-	tree_list.forEach((item:any)=>{
-		state.code.push(item.id);
-	})
-	console.log('state.code',state.code);
-	console.log('state.codes',state.codes);
-	console.log('state.codes_cn',state.codes_cn);
-}
-
-// 打开弹窗
-const openDialog = (type: string, row: any) => {
-	state.dialog.type = type;
-	if (type === 'edit') {
-		state.ruleForm = {
-            id: row.id,
-			name: row.name,
-			remark: row.remark,
-			valid: row.valid,
-			code: row.code,
-			codes: row.codes,
-			codes_cn: row.codes_cn,
-        };
-		state.dialog.title = '编辑权限022';
-		state.dialog.submitTxt = '修 改';
-		state.code = row.code;
-		state.codes = row.codes;
-		state.codes_cn = row.codes_cn;
-		console.log('state.ruleForm.codes->',state.ruleForm.code);
-		console.log('state.ruleForm.codes->',state.ruleForm.codes);
-		console.log('state.ruleForm.codes_cn->',state.ruleForm.codes_cn);
-	} else {
-        state.ruleForm = {
-            id: 0,
-			name: '',
-			remark: '',
-			valid: 1,
-			code: [],
-			codes: [],
-			codes_cn: [],
-        };
-		state.status = true;
-		state.dialog.title = '新增权限021';
-		state.dialog.submitTxt = '保 存';
-		// 清空表单,此项需加表单验证才能使用
-		// nextTick(() => {
-		// 	deptDialogFormRef.value.resetFields();
-		// });
-	}
-	state.dialog.isShowDialog = true;
-	getMenuData();
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialog.isShowDialog = false;
-};
-// 取消
-const onCancel = () => {
-	closeDialog();
-};
-// 提交
-const onSubmit = async() => {
-	if(!ruleReg.emptyReg(state.ruleForm.name)){
-		return ElMessage.warning("请输入权限名称");
-	}
-	if(!ruleReg.emptyReg(state.ruleForm.remark)){
-		return ElMessage.warning("请输入备注说明");
-	}
-	if(state.code[0]!=='home'&&state.codes[0]!=='home'&&state.codes_cn[0]!=='首页'){
-		state.code.unshift('home');
-		state.codes.unshift('home');
-		state.codes_cn.unshift('首页');
-	}
-	state.ruleForm.code = state.code;
-	state.ruleForm.codes = state.codes;
-	state.ruleForm.codes_cn = state.codes_cn;
-	// state.ruleForm.code.push([]);
-	// state.ruleForm.codes.push([]);
-	// state.ruleForm.codes_cn.push([]);
-	// state.ruleForm.code.splice(-1,1);
-	// state.ruleForm.codes.splice(-1,1);
-	// state.ruleForm.codes_cn.splice(-1,1);
-	let res: any = null;
-	if(state.dialog.type=='edit' || state.ruleForm.id!=0){
-		res = await Role.edit(state.ruleForm);
-		if(res.code != 0){
-            return ElMessage.error(res.msg);
-        }
-	}else{
-		res = await Role.add(state.ruleForm);
-		if(res.code != 0){
-            return ElMessage.error(res.msg);
-        }
-	}
-	ElMessage.success(res.msg);
-	closeDialog();
-	emit('refresh');
-};
-
-// 初始化权限菜单
-const init = async() => {
-	let res = await Role.init();
-	if(res.code != 0){
-		return ElMessage.error(res.msg);
-	}
-	state.role_list = res.data;
-};
-
-// 获取菜单结构数据
-const getMenuData = () => {
-	init();
-};
-
-// 暴露变量
-defineExpose({
-	openDialog,
-});
-</script>
-
-<style lang="scss" scoped>
-	.avatar-uploader .avatar {
-		width: 178px;
-		height: 178px;
-		display: block;
-	}
-	.avatar-uploader .el-upload {
-		border: 1px dashed var(--el-border-color);
-		border-radius: 6px;
-		cursor: pointer;
-		position: relative;
-		overflow: hidden;
-		transition: var(--el-transition-duration-fast);
-	}
-	.avatar-uploader .el-upload:hover {
-		border-color: var(--el-color-primary);
-	}
-	.el-icon.avatar-uploader-icon {
-		font-size: 28px;
-		color: #8c939d;
-		width: 178px;
-		height: 178px;
-		text-align: center;
-	}
-	.system-role-dialog-container {
-		.menu-data-tree {
-			width: 100%;
-			border: 1px solid var(--el-border-color);
-			border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
-			padding: 5px;
-		}
-	}
-</style>

+ 0 - 130
h5/src/views/admin/roleManage/index.vue

@@ -1,130 +0,0 @@
-<template>
-	<div>
-		<el-card class="box-card" v-loading="wholeLoading" element-loading-text="Loading..." style="height: 600px">
-			<template #header>
-				<div class="card-header">
-					<span>权限管理</span>
-					<div>
-						<el-button type="default" @click="reflush()">刷新列表</el-button>
-						<el-button type="primary" @click="create()">新增权限</el-button>
-						<el-button type="danger" @click="remove()">批量删除</el-button>
-					</div>
-				</div>
-			</template>
-			<el-auto-resizer>
-				<template #default="{ height, width }">
-					<el-table-v2 :data="data" :columns="columns" :width="width" :height="600" fixed />
-				</template>
-			</el-auto-resizer>
-		</el-card>
-	</div>
-</template>
-
-<script lang="ts" setup name="underlyingRoleManage">
-import { ref, reactive, onMounted, h } from 'vue';
-import { ElSwitch, ElTag, ElMessage, ElMessageBox, ElButton, TableV2FixedDir } from 'element-plus';
-import type { Column, RowClassNameGetter } from 'element-plus';
-import _ from 'lodash';
-import { init, update } from '/@/api/role';
-
-/**
- * 表格数据
- */
-const data = await init();
-/**
- * 整个页面的loading
- */
-const wholeLoading = ref(false);
-/**
- * 编辑权限表单的显示控制
- */
-const showCodesEditForm = ref(false);
-
-/**
- * 虚拟表格列信息
- */
-const columns: Column<any>[] = [
-	{
-		key: 'name',
-		title: '角色名',
-		dataKey: 'name',
-		width: 150,
-	},
-	{
-		key: 'codes_cn',
-		title: '权限值',
-		dataKey: 'codes_cn',
-		width: 400,
-		cellRenderer: ({ cellData: codes_cn }) => h('div', codes_cn?.join(',')),
-	},
-	{
-		key: 'remark',
-		title: '备注',
-		dataKey: 'remark',
-		width: 300,
-	},
-	{
-		key: 'valid',
-		title: '是否启用',
-		dataKey: 'valid',
-		width: 100,
-		cellRenderer: ({ cellData: valid }) => h(ElTag, valid ? '启用' : '禁用'),
-	},
-	{
-		key: 'op',
-		title: '操作',
-		width: 400,
-		fixed: TableV2FixedDir.RIGHT,
-		flexGrow: 1,
-		cellRenderer: ({ rowData: row }) =>
-			h('div', [
-				// 启用禁用
-				h(
-					ElButton,
-					{
-						type: row.valid ? 'danger' : 'success',
-						onClick: _.throttle(() => {
-							row.valid = !row.valid;
-							update(row);
-						}),
-					},
-					row.valid ? '禁用' : '启用'
-				),
-				// 打开权限表单
-				h(
-					ElButton,
-					{
-						type: 'primary',
-						onClick: _.throttle(() => (showCodesEditForm.value = true)),
-					},
-					'权限'
-				),
-			]),
-	},
-];
-
-/**
- * 删除
- */
-const remove = () => {};
-/**
- * 创建
- */
-const create = () => {};
-/**
- * 刷新
- */
-const reflush = () => {};
-</script>
-
-<style lang="scss" scoped>
-.box-card {
-	margin: 10px;
-}
-.card-header {
-	display: flex;
-	justify-content: space-between;
-	align-items: center;
-	overflow-x: auto;
-}
-</style>