Parcourir la source

删除垃圾和重命名

aexiaoliou il y a 1 an
Parent
commit
ddd6e37fc5

+ 5 - 0
h5/src/api/Result.ts

@@ -0,0 +1,5 @@
+export interface Result<T = any> {
+    code: number
+    msg: string
+    data: T
+}

+ 172 - 0
h5/src/components/files/import.vue

@@ -0,0 +1,172 @@
+<template>
+    <div class="system-edit-user-container">
+        <el-dialog :title="state.dialog.title" v-model="state.dialog.isShowDialog" width="800px" draggable
+            :close-on-click-modal="false">
+            <el-form :model="state.ruleForm" ref="refForm">
+                <el-form-item label="文件" prop="path" :rules="[{ required: true, message: '请上传文件' }]">
+                    <el-upload ref="uploadEle" class="upload-demo" drag :action="state.uploadUrl" :limit="1"
+                        :on-exceed="handleExceed" method="post" :on-success="handleAvatarSuccess" :on-remove="ClearFiles"
+                        :auto-upload="false" :headers="{ token: state.getToken }">
+                        <el-icon class="el-icon--upload">
+                            <upload-filled />
+                        </el-icon>
+                        <div class="el-upload__text">拖拽文件或者 <em>点击上传</em></div>
+                        <template #tip>
+                            <div class="el-upload__tip" v-if="state.isTips">已上传文件到:{{ state.fileUrl }},请点击导入按钮开始导入</div>
+                        </template>
+                    </el-upload>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="onCancel">取 消</el-button>
+                    <el-button type="primary" @click="onSubmit()">{{ state.dialog.submitTxt }}</el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script lang="ts" setup name="payrollModuleAttendanceImport">
+import { reactive, ref, } from 'vue'
+import { ElMessage, genFileId } from 'element-plus'
+import type { ElForm, UploadInstance, UploadProps, UploadRawFile } from 'element-plus'
+import { UploadFilled } from '@element-plus/icons-vue'
+type FormInstance = InstanceType<typeof ElForm>
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['refresh'])
+const deptDialogFormRef = ref()
+
+const upload = ref<UploadInstance>()
+const refForm = ref<FormInstance>()
+const uploadEle = ref<any>(null)
+const state = reactive<any>({
+    productOptions: [],
+    ruleForm: {
+        path: '',
+    },
+    dialog: {
+        isShowDialog: false,
+        type: '',
+        title: '',
+        submitTxt: '',
+    },
+    isTips: false,
+    fileUrl: '',
+})
+
+// 打开弹窗
+const openDialog = () => {
+    state.ruleForm = {
+        path: '',
+    }
+    ClearFiles()
+    state.dialog.isShowDialog = true
+    state.dialog.title = '上传附件'
+    state.dialog.submitTxt = '上传'
+}
+// 关闭弹窗
+const closeDialog = () => {
+    state.dialog.isShowDialog = false
+}
+// 取消
+const onCancel = () => {
+    closeDialog()
+}
+// 清除文件缓存
+const ClearFiles = () => {
+    console.log('uploadEle.value=>', uploadEle.value)
+    if (uploadEle.value != null) {
+        state.isTips = false
+        state.ruleForm.path = ''
+        uploadEle.value.clearFiles()
+    }
+}
+
+// 新增
+const onSubmit = () => {
+    uploadEle.value!.submit()
+    closeDialog()
+}
+//替换上一次文件
+const handleExceed: UploadProps['onExceed'] = (files) => {
+    uploadEle.value!.clearFiles()
+    const file = files[0] as UploadRawFile
+    file.uid = genFileId()
+    uploadEle.value!.handleStart(file)
+}
+
+const clearData = () => {
+    state.isTips = false
+    state.ruleForm.path = ''
+    uploadEle.value.clearFiles()
+}
+
+// 上传文件成功的事件
+const handleAvatarSuccess = (res: any, file: any) => {
+    if (res.code == 0) {
+        ElMessage.success('上传成功!')
+        console.log('res=>', res)
+        console.log('file=>', file)
+        state.ruleForm.path = res.data.path
+        state.fileUrl = res.data.url
+        state.isTips = true
+
+        emit('refresh', [state.ruleForm.path, file.name])
+    }
+}
+
+// 暴露变量
+defineExpose({
+    openDialog,
+})
+</script>
+
+<style lang="scss" scoped>
+.tips {
+    font-size: 12px;
+    line-height: 1.2;
+    color: #666;
+}
+
+.two {
+    margin: 8px 0px;
+}
+
+a {
+    text-decoration: none;
+    color: #409eff;
+}
+
+.download-file {
+    margin-top: 10px;
+}
+
+.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;
+}
+</style>

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

@@ -131,7 +131,7 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 					{
 						path: '/project',
                         name: 'project', 
-						component: defineAsyncComponent(() => import('/@/views/data/repertory.vue')),
+						component: defineAsyncComponent(() => import('/@/views/data/project.vue')),
 						meta: {
 							title: '项目汇总',
 							isLink: '',
@@ -143,56 +143,8 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 							icon: 'iconfont icon-caidan',
 						},
 					},
-					// {
-					// 	path: '/data/good',
-					// 	name: 'dataGood',//gzs:name一定不能重复
-					// 	component: () => import('/@/views/data/good.vue'),//gzs:仓库管理页面文件的路径
-					// 	meta: {
-					// 		title: 'message.router.dataGood', //gzs:左侧菜单栏显示的名称
-					// 		isLink: '',
-					// 		isHide: false,
-					// 		isKeepAlive: true,
-					// 		isAffix: false, 
-					// 		isIframe: false,
-					// 		roles: ['admin'],
-					// 		icon: 'iconfont icon-caidan',
-					// 	},
-					// },
 				],
 			},
-			// {
-			// 	path: '/system',
-			// 	name: 'system',
-			// 	component: () => import('/@/layout/routerView/parent.vue'),
-			// 	redirect: '/system/baseSettings',
-			// 	meta: {
-			// 		title: 'message.router.system',
-			// 		isLink: '',
-			// 		isHide: false,
-			// 		isKeepAlive: true,
-			// 		isAffix: false,
-			// 		isIframe: false,
-			// 		roles: ['admin'],
-			// 		icon: 'iconfont icon-xitongshezhi',
-			// 	},
-			// 	children: [
-			// 		{
-			// 			path: '/system/baseSettings',
-			// 			name: 'systemBaseSettings',
-			// 			component: () => import('/@/views/system/baseSettings/index.vue'),
-			// 			meta: {
-			// 				title: 'message.router.systemBaseSettings',
-			// 				isLink: '',
-			// 				isHide: false,
-			// 				isKeepAlive: true,
-			// 				isAffix: false,
-			// 				isIframe: false,
-			// 				roles: ['admin'],
-			// 				icon: 'iconfont icon-xitongshezhi',
-			// 			},
-			// 		},
-			// 	],
-			// },
 		],
 	},
 ];

+ 0 - 13
h5/src/types/axios.d.ts

@@ -1,13 +0,0 @@
-/* eslint-disable */
-import * as axios from 'axios';
-
-// 扩展 axios 数据返回类型,可自行扩展
-declare module 'axios' {
-	export interface AxiosResponse<T = any> {
-		code: number;
-		data: T;
-		message: string;
-		type?: string;
-		[key: string]: T;
-	}
-}

+ 0 - 6
h5/src/types/views.d.ts

@@ -75,12 +75,6 @@ declare interface SysRoleState {
 	tableData: SysRoleTableType;
 }
 
-declare type TreeType = {
-	id: number;
-	label: string;
-	children?: TreeType[];
-};
-
 // user
 declare type RowUserType<T = any> = {
 	userName: string;

+ 0 - 5
h5/src/utils/component/suspense.tsx

@@ -1,5 +0,0 @@
-import { Suspense } from "vue"
-
-export const withSuspense = (component) => {
-    return () => <Suspense>{component}</Suspense>
-}

+ 30 - 4
h5/src/utils/moneyHelper.tsx

@@ -1,3 +1,8 @@
+/**
+ * 获取格式化后的金额文本
+ * @param money 金额 分为单位
+ * @returns 格式化文本
+ */
 export const getFormatedMoney = (money: number) => {
     const million = 100 * 100 * 10000
     const tenThousand = 100 * 10000
@@ -11,12 +16,33 @@ export const getFormatedMoney = (money: number) => {
     }
 }
 
-export const getMoneyCent = (money: number) => money * 100
+/**
+ * 乘100得到分
+ * @param money 金额,也许是元? 
+ * @param multiply 乘数
+ * @returns 按分算的金额
+ */
+export const getMoneyCent = (money: number, multiply: number = 100) => money * multiply
 
 /**
- * 金额函数式组件
+ * 金额函数式组件,提供一个简易的显示金额的tooltip
  */
-export const money = ({ money, multiply = 1 }: { money: number, multiply?: number }) =>
-    <el-tooltip content={(money / 100).toFixed(2) + ' 元' + " | " +money + ' 分'} placement="right" effect="light">
+export const money = (
+    { money, multiply = 1 }:
+        {
+            /**
+             * 金额
+             */
+            money: number,
+            /**
+             * 所有金额会乘上该值,默认为1,(即以分为单位)
+             */
+            multiply?: number
+        }
+) =>
+    <el-tooltip
+        content={(money * multiply / 100).toFixed(2) + ' 元' + " | " + money * multiply + ' 分'}
+        placement="right"
+        effect="light">
         <el-tag effect="plain">{getFormatedMoney(money * multiply)}</el-tag>
     </el-tooltip>

+ 38 - 12
h5/src/utils/net/Http.ts

@@ -1,33 +1,59 @@
-import Sign from './Sign.js'
-const tagInfo = '/utils/net/Http'
+// 不知道这是个什么鬼玩意,也无法理解为什么要用这个东西,但是既然用了就用了,懒得改了
 import to from 'await-to-js'
 import request from '../request'
 import { Session } from '/@/utils/storage'
-import { AxiosRequestConfig } from 'axios'
+import { AxiosRequestConfig, AxiosResponse } from 'axios'
 import { ElMessage } from 'element-plus'
+import { Result } from '/@/api/Result'
 
+interface CheckResponseConfig {
+    /**
+     * 是否检查非零结果
+     */
+    useNotZeroCodeCheck: boolean
+    /**
+     * 报错类型
+     */
+    msgType: 'box' | 'popup'
+}
 
 const Http = {
-    async post(url: string, param: object = {}, axiosConfig: AxiosRequestConfig = {}, { useNotZeroCodeCheck = true } = {}): Promise<any> {
+    /**
+     * 二次封装axios的Post请求
+     * @param url 接口url
+     * @param param post data
+     * @param axiosConfig axios config
+     * @param checkResConfig 检查返回值的设置
+     * @returns 接口数据
+     */
+    async post<
+        T = any
+    >(
+        url: string,
+        param: any,
+        axiosConfig: AxiosRequestConfig = {},
+        checkResConfig: CheckResponseConfig = { useNotZeroCodeCheck: true, msgType: 'box' }
+    ) {
         axiosConfig.headers = { ...axiosConfig.headers, token: Session.get('token') }
 
         // 检查http错误
-        let result = await request.post(url, param, axiosConfig)
+        let result = await request.post<any, Result<T>>(url, param, axiosConfig)
             .catch((err) => {
                 return { code: 999, data: err, msg: '请求失败' }
             })
 
         // 检查业务错误
-        if (useNotZeroCodeCheck && result?.code != 0) {
-            ElMessage({
-                message: result?.msg,
+        if (checkResConfig.useNotZeroCodeCheck && result?.code != 0) {
+            ElMessage.error({
+                message: result?.msg
             })
         }
         return result
     },
-    async get(url: string, param: object = {}, { useNotZeroCodeCheck = true } = {}): Promise<any> {
-        //param = sign(param);
+    async get<T = any>(url: string, param: any = {}, checkResConfig: CheckResponseConfig = { useNotZeroCodeCheck: true, msgType: 'box' }) {
+
         let [err, result] = await to(request.get(url, { params: this.combineData(param) }))
+
         // 检查http错误
         if (err) {
             console.log('err', err)
@@ -35,12 +61,12 @@ const Http = {
         }
 
         // 检查业务错误
-        if (useNotZeroCodeCheck && result?.code != 0) {
+        if (checkResConfig.useNotZeroCodeCheck && result?.code != 0) {
             ElMessage({
                 message: result?.msg,
             })
         }
-        return result
+        return result as AxiosResponse<Result<T>>
     },
     combineData(param: any = {}): any {
         // 在请求发送之前做一些处理

+ 0 - 67
h5/src/utils/request.ts.bak

@@ -1,67 +0,0 @@
-import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
-import { ElMessage, ElMessageBox } from 'element-plus';
-import { Session } from '/@/utils/storage';
-import qs from 'qs';
-
-// 配置新建一个 axios 实例
-const service: AxiosInstance = axios.create({
-	baseURL: import.meta.env.VITE_API_URL,
-	timeout: 50000,
-	headers: { 'Content-Type': 'application/json' },
-	paramsSerializer: {
-		serialize(params) {
-			return qs.stringify(params, { allowDots: true });
-		},
-	},
-});
-
-// 添加请求拦截器
-service.interceptors.request.use(
-	(config: AxiosRequestConfig) => {
-		// 在发送请求之前做些什么 token
-		if (Session.get('token')) {
-			config.headers!['Authorization'] = `${Session.get('token')}`;
-		}
-		return config;
-	},
-	(error) => {
-		// 对请求错误做些什么
-		return Promise.reject(error);
-	}
-);
-
-// 添加响应拦截器
-service.interceptors.response.use(
-	(response) => {
-		// 对响应数据做点什么
-		const res = response.data;
-		if (res.code && res.code !== 0) {
-			// `token` 过期或者账号已在别处登录
-			if (res.code === 401 || res.code === 4001) {
-				Session.clear(); // 清除浏览器全部临时缓存
-				window.location.href = '/'; // 去登录页
-				ElMessageBox.alert('你已被登出,请重新登录', '提示', {})
-					.then(() => {})
-					.catch(() => {});
-			}
-			return Promise.reject(service.interceptors.response);
-		} else {
-			return response.data;
-		}
-	},
-	(error) => {
-		// 对响应错误做点什么
-		if (error.message.indexOf('timeout') != -1) {
-			ElMessage.error('网络超时');
-		} else if (error.message == 'Network Error') {
-			ElMessage.error('网络连接错误');
-		} else {
-			if (error.response.data) ElMessage.error(error.response.statusText);
-			else ElMessage.error('接口路径找不到');
-		}
-		return Promise.reject(error);
-	}
-);
-
-// 导出 axios 实例
-export default service;

+ 1 - 2
h5/src/views/admin/admin/import.vue

@@ -45,8 +45,7 @@ import { ElMessageBox, ElMessage } from 'element-plus';
 import type { ElForm, UploadInstance, UploadProps, UploadRawFile } from 'element-plus';
 import { UploadFilled } from '@element-plus/icons-vue';
 type FormInstance = InstanceType<typeof ElForm>;
-import Department from '/@/api/department/department.ts';
-import config from '/@/config.ts';
+import config from '/@/config';
 
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['refresh']);

+ 10 - 10
h5/src/views/data/repertory.vue

@@ -43,7 +43,7 @@
 					<el-text class="">负责人:</el-text>
 					<el-select class="width160" v-model="data.params.responsibility_person_id" clearable
 						placeholder="请选择负责人" @change="getList">
-						<el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
+						<el-option :label="item.real_name" :value="item.id" v-for="item in data.projects" />
 					</el-select>
 				</el-col>
 				<el-col :span="6" class="tr">
@@ -165,14 +165,14 @@
 						<el-form-item label="责任人" prop="responsibility_person_id"
 							:rules="[{ required: true, message: '填写责任人', trigger: 'blur' }]">
 							<el-select v-model="data.form.responsibility_person_id" placeholder="选择责任人">
-								<el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
+								<el-option :label="item.real_name" :value="item.id" v-for="item in data.projects" />
 							</el-select>
 						</el-form-item>
 						<el-form-item label="参与人员" prop="participants_id"
 							:rules="[{ required: true, message: '填写参与人员', trigger: 'blur' }]">
 							<el-select v-model="data.form.participants_id" multiple placeholder="选择参与人员" clearable
 								filterable :style="{ width: '70%' }">
-								<el-option v-for="item in data.repertoryList" :key="item.id" :label="item.real_name"
+								<el-option v-for="item in data.projects" :key="item.id" :label="item.real_name"
 									:value="item.id" />
 							</el-select>
 						</el-form-item>
@@ -297,7 +297,7 @@
 					<el-form-item label="进度负责人" prop="updater_id"
 						:rules="[{ required: true, message: '选择进度负责人', trigger: 'blur' }]">
 						<el-select v-model="data.formList.updater_id" placeholder="选择进度负责人">
-							<el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
+							<el-option :label="item.real_name" :value="item.id" v-for="item in data.projects" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="开始时间" prop="start_date">
@@ -356,7 +356,7 @@
 					<el-form-item label="进度负责人" prop="updater_id"
 						:rules="[{ required: true, message: '选择进度负责人', trigger: 'blur' }]">
 						<el-select v-model="data.formList.updater_id" placeholder="选择进度负责人">
-							<el-option :label="item.real_name" :value="item.id" v-for="item in data.repertoryList" />
+							<el-option :label="item.real_name" :value="item.id" v-for="item in data.projects" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="开始时间" prop="start_date">
@@ -718,12 +718,12 @@ let data = reactive({
 	formList: {} as any, //新增和修改进度数据
 	formContract: {} as any, //新增和修改合同数据
 	formStatus: {} as any, //新增和修改状态数据
-	repertoryList: [] as any,//参与人员列表
+	projects: [] as any,//参与人员列表
 });
 /**
  * 上传
  */
-const ImportExcelDialog = defineAsyncComponent(() => import("/@/views/payrollModule/import.vue"));
+const ImportExcelDialog = defineAsyncComponent(() => import("/@/components/files/import.vue"));
 const importExcelDialogRef = ref();
 const importExcel = () => {
 	importExcelDialogRef.value.openDialog();
@@ -833,11 +833,11 @@ const search = async () => {
 const init = async () => {
 	await Repertory.statuslist({});
 
-	let Repertoryres = await Repertory.all({});
-	if (Repertoryres.code != 0) {
+	let res = await Repertory.all({});
+	if (res.code != 0) {
 		return;
 	}
-	data.repertoryList = Repertoryres.data;
+	data.projects = res.data;
 
 };
 /**

+ 1 - 1
h5/src/views/login/component/account.vue

@@ -159,7 +159,7 @@ const onSignIn = async () => {
 	}
 	let res = await Login.login(state.ruleForm);
 	if (res.code != 0) {
-		return ElMessage.error(res.msg);
+		return;
 	}
 	/* if (res.data.is_pass !== 1 && res.data.is_root !== 1) {
 		Session.clear();

+ 0 - 167
h5/src/views/system/dept/dialog.vue

@@ -1,167 +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="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="上级部门">
-							<el-cascader
-								:options="state.deptData"
-								:props="{ checkStrictly: true, value: 'deptName', label: 'deptName' }"
-								placeholder="请选择部门"
-								clearable
-								class="w100"
-								v-model="state.ruleForm.deptLevel"
-							>
-								<template #default="{ node, data }">
-									<span>{{ data.deptName }}</span>
-									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
-								</template>
-							</el-cascader>
-						</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.deptName" 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.person" 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.phone" 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.email" 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-number v-model="state.ruleForm.sort" :min="0" :max="999" controls-position="right" placeholder="请输入排序" class="w100" />
-						</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.ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="部门描述">
-							<el-input v-model="state.ruleForm.describe" type="textarea" placeholder="请输入部门描述" maxlength="150"></el-input>
-						</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="systemDeptDialog">
-import { reactive, ref } from 'vue';
-
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['refresh']);
-
-// 定义变量内容
-const deptDialogFormRef = ref();
-const state = reactive({
-	ruleForm: {
-		deptLevel: [] as string[], // 上级部门
-		deptName: '', // 部门名称
-		person: '', // 负责人
-		phone: '', // 手机号
-		email: '', // 邮箱
-		sort: 0, // 排序
-		status: true, // 部门状态
-		describe: '', // 部门描述
-	},
-	deptData: [] as DeptTreeType[], // 部门数据
-	dialog: {
-		isShowDialog: false,
-		type: '',
-		title: '',
-		submitTxt: '',
-	},
-});
-
-// 打开弹窗
-const openDialog = (type: string, row: RowDeptType) => {
-	if (type === 'edit') {
-		row.deptLevel = ['vueNextAdmin'];
-		row.person = 'lyt';
-		row.phone = '12345678910';
-		row.email = 'vueNextAdmin@123.com';
-		state.ruleForm = row;
-		state.dialog.title = '修改部门';
-		state.dialog.submitTxt = '修 改';
-	} else {
-		state.dialog.title = '新增部门';
-		state.dialog.submitTxt = '新 增';
-		// 清空表单,此项需加表单验证才能使用
-		// nextTick(() => {
-		// 	deptDialogFormRef.value.resetFields();
-		// });
-	}
-	state.dialog.isShowDialog = true;
-	getMenuData();
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialog.isShowDialog = false;
-};
-// 取消
-const onCancel = () => {
-	closeDialog();
-};
-// 提交
-const onSubmit = () => {
-	closeDialog();
-	emit('refresh');
-	// if (state.dialog.type === 'add') { }
-};
-// 初始化部门数据
-const getMenuData = () => {
-	state.deptData.push({
-		deptName: 'vueNextAdmin',
-		createTime: new Date().toLocaleString(),
-		status: true,
-		sort: Math.random(),
-		describe: '顶级部门',
-		id: Math.random(),
-		children: [
-			{
-				deptName: 'IT外包服务',
-				createTime: new Date().toLocaleString(),
-				status: true,
-				sort: Math.random(),
-				describe: '总部',
-				id: Math.random(),
-			},
-			{
-				deptName: '资本控股',
-				createTime: new Date().toLocaleString(),
-				status: true,
-				sort: Math.random(),
-				describe: '分部',
-				id: Math.random(),
-			},
-		],
-	});
-};
-
-// 暴露变量
-defineExpose({
-	openDialog,
-});
-</script>

+ 0 - 135
h5/src/views/system/dept/index.vue

@@ -1,135 +0,0 @@
-<template>
-	<div class="system-dept-container layout-padding">
-		<el-card shadow="hover" class="layout-padding-auto">
-			<div class="system-dept-search mb15">
-				<el-input size="default" placeholder="请输入部门名称" style="max-width: 180px"> </el-input>
-				<el-button size="default" type="primary" class="ml10">
-					<el-icon>
-						<ele-Search />
-					</el-icon>
-					查询
-				</el-button>
-				<el-button size="default" type="success" class="ml10" @click="onOpenAddDept('add')">
-					<el-icon>
-						<ele-FolderAdd />
-					</el-icon>
-					新增部门
-				</el-button>
-			</div>
-			<el-table
-				:data="state.tableData.data"
-				v-loading="state.tableData.loading"
-				style="width: 100%"
-				row-key="id"
-				default-expand-all
-				:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-			>
-				<el-table-column prop="deptName" label="部门名称" show-overflow-tooltip> </el-table-column>
-				<el-table-column label="排序" show-overflow-tooltip width="80">
-					<template #default="scope">
-						{{ scope.$index }}
-					</template>
-				</el-table-column>
-				<el-table-column prop="status" label="部门状态" show-overflow-tooltip>
-					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status">启用</el-tag>
-						<el-tag type="info" v-else>禁用</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="describe" label="部门描述" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="createTime" label="创建时间" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" show-overflow-tooltip width="140">
-					<template #default="scope">
-						<el-button size="small" text type="primary" @click="onOpenAddDept('add')">新增</el-button>
-						<el-button size="small" text type="primary" @click="onOpenEditDept('edit', scope.row)">修改</el-button>
-						<el-button size="small" text type="primary" @click="onTabelRowDel(scope.row)">删除</el-button>
-					</template>
-				</el-table-column>
-			</el-table>
-		</el-card>
-		<DeptDialog ref="deptDialogRef" @refresh="getTableData()" />
-	</div>
-</template>
-
-<script setup lang="ts" name="systemDept">
-import { defineAsyncComponent, ref, reactive, onMounted } from 'vue';
-import { ElMessageBox, ElMessage } from 'element-plus';
-
-// 引入组件
-const DeptDialog = defineAsyncComponent(() => import('/@/views/system/dept/dialog.vue'));
-
-// 定义变量内容
-const deptDialogRef = ref();
-const state = reactive<SysDeptState>({
-	tableData: {
-		data: [],
-		total: 0,
-		loading: false,
-		param: {
-			pageNum: 1,
-			pageSize: 10,
-		},
-	},
-});
-
-// 初始化表格数据
-const getTableData = () => {
-	state.tableData.loading = true;
-	state.tableData.data = [];
-	state.tableData.data.push({
-		deptName: 'vueNextAdmin',
-		createTime: new Date().toLocaleString(),
-		status: true,
-		sort: Math.random(),
-		describe: '顶级部门',
-		id: Math.random(),
-		children: [
-			{
-				deptName: 'IT外包服务',
-				createTime: new Date().toLocaleString(),
-				status: true,
-				sort: Math.random(),
-				describe: '总部',
-				id: Math.random(),
-			},
-			{
-				deptName: '资本控股',
-				createTime: new Date().toLocaleString(),
-				status: true,
-				sort: Math.random(),
-				describe: '分部',
-				id: Math.random(),
-			},
-		],
-	});
-	state.tableData.total = state.tableData.data.length;
-	setTimeout(() => {
-		state.tableData.loading = false;
-	}, 500);
-};
-// 打开新增菜单弹窗
-const onOpenAddDept = (type: string) => {
-	deptDialogRef.value.openDialog(type);
-};
-// 打开编辑菜单弹窗
-const onOpenEditDept = (type: string, row: DeptTreeType) => {
-	deptDialogRef.value.openDialog(type, row);
-};
-// 删除当前行
-const onTabelRowDel = (row: DeptTreeType) => {
-	ElMessageBox.confirm(`此操作将永久删除部门:${row.deptName}, 是否继续?`, '提示', {
-		confirmButtonText: '删除',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(() => {
-			getTableData();
-			ElMessage.success('删除成功');
-		})
-		.catch(() => {});
-};
-// 页面加载时
-onMounted(() => {
-	getTableData();
-});
-</script>

+ 0 - 150
h5/src/views/system/dic/dialog.vue

@@ -1,150 +0,0 @@
-<template>
-	<div class="system-dic-dialog-container">
-		<el-dialog :title="state.dialog.title" v-model="state.dialog.isShowDialog" width="769px">
-			<el-alert title="半成品,交互过于复杂,请自行扩展!" type="warning" :closable="false" class="mb20"> </el-alert>
-			<el-form ref="dicDialogFormRef" :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.dicName" 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.fieldName" placeholder="请输入字段名,拼接 ruleForm.list" clearable></el-input>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="字典状态">
-							<el-switch v-model="state.ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-row :gutter="35" v-for="(v, k) in state.ruleForm.list" :key="k">
-							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-								<el-form-item :prop="`list[${k}].label`">
-									<template #label>
-										<el-button type="primary" circle size="small" @click="onAddRow" v-if="k === 0">
-											<el-icon>
-												<ele-Plus />
-											</el-icon>
-										</el-button>
-										<el-button type="danger" circle size="small" @click="onDelRow(k)" v-else>
-											<el-icon>
-												<ele-Delete />
-											</el-icon>
-										</el-button>
-										<span class="ml10">字段</span>
-									</template>
-									<el-input v-model="v.label" style="width: 100%" placeholder="请输入字段名"> </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="属性" :prop="`list[${k}].value`">
-									<el-input v-model="v.value" style="width: 100%" placeholder="请输入属性值"> </el-input>
-								</el-form-item>
-							</el-col>
-						</el-row>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="字典描述">
-							<el-input v-model="state.ruleForm.describe" type="textarea" placeholder="请输入字典描述" maxlength="150"></el-input>
-						</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="systemDicDialog">
-import { reactive, ref } from 'vue';
-
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['refresh']);
-
-// 定义变量内容
-const dicDialogFormRef = ref();
-const state = reactive({
-	ruleForm: {
-		dicName: '', // 字典名称
-		fieldName: '', // 字段名
-		status: true, // 字典状态
-		list: [] as ListType[], // 子集字段 + 属性值
-		describe: '', // 字典描述
-	},
-	dialog: {
-		isShowDialog: false,
-		type: '',
-		title: '',
-		submitTxt: '',
-	},
-});
-
-// 打开弹窗
-const openDialog = (type: string, row: RowDicType) => {
-	if (type === 'edit') {
-		if (row.fieldName === 'SYS_UERINFO') {
-			row.list = [
-				{ id: Math.random(), label: 'sex', value: '1' },
-				{ id: Math.random(), label: 'sex', value: '0' },
-			];
-		} else {
-			row.list = [
-				{ id: Math.random(), label: 'role', value: 'admin' },
-				{ id: Math.random(), label: 'role', value: 'common' },
-				{ id: Math.random(), label: 'roleName', value: '超级管理员' },
-				{ id: Math.random(), label: 'roleName', value: '普通用户' },
-			];
-		}
-		state.ruleForm = row;
-		state.dialog.title = '修改字典';
-		state.dialog.submitTxt = '修 改';
-	} else {
-		state.dialog.title = '新增字典';
-		state.dialog.submitTxt = '新 增';
-		// 清空表单,此项需加表单验证才能使用
-		// nextTick(() => {
-		// 	dicDialogFormRef.value.resetFields();
-		// });
-	}
-	state.dialog.isShowDialog = true;
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialog.isShowDialog = false;
-};
-// 取消
-const onCancel = () => {
-	closeDialog();
-};
-// 提交
-const onSubmit = () => {
-	closeDialog();
-	emit('refresh');
-	// if (state.dialog.type === 'add') { }
-};
-// 新增行
-const onAddRow = () => {
-	state.ruleForm.list.push({
-		id: Math.random(),
-		label: '',
-		value: '',
-	});
-};
-// 删除行
-const onDelRow = (k: number) => {
-	state.ruleForm.list.splice(k, 1);
-};
-
-// 暴露变量
-defineExpose({
-	openDialog,
-});
-</script>

+ 0 - 132
h5/src/views/system/dic/index.vue

@@ -1,132 +0,0 @@
-<template>
-	<div class="system-dic-container layout-padding">
-		<el-card shadow="hover" class="layout-padding-auto">
-			<div class="system-user-search mb15">
-				<el-input size="default" placeholder="请输入字典名称" style="max-width: 180px"> </el-input>
-				<el-button size="default" type="primary" class="ml10">
-					<el-icon>
-						<ele-Search />
-					</el-icon>
-					查询
-				</el-button>
-				<el-button size="default" type="success" class="ml10" @click="onOpenAddDic('add')">
-					<el-icon>
-						<ele-FolderAdd />
-					</el-icon>
-					新增字典
-				</el-button>
-			</div>
-			<el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%">
-				<el-table-column type="index" label="序号" width="50" />
-				<el-table-column prop="dicName" label="字典名称" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="fieldName" label="字段名" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="status" label="字典状态" show-overflow-tooltip>
-					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status">启用</el-tag>
-						<el-tag type="info" v-else>禁用</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="describe" label="字典描述" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="createTime" label="创建时间" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="100">
-					<template #default="scope">
-						<el-button size="small" text type="primary" @click="onOpenEditDic('edit', scope.row)">修改</el-button>
-						<el-button size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
-					</template>
-				</el-table-column>
-			</el-table>
-			<el-pagination
-				@size-change="onHandleSizeChange"
-				@current-change="onHandleCurrentChange"
-				class="mt15"
-				:pager-count="5"
-				:page-sizes="[10, 20, 30]"
-				v-model:current-page="state.tableData.param.pageNum"
-				background
-				v-model:page-size="state.tableData.param.pageSize"
-				layout="total, sizes, prev, pager, next, jumper"
-				:total="state.tableData.total"
-			>
-			</el-pagination>
-		</el-card>
-		<DicDialog ref="dicDialogRef" @refresh="getTableData()" />
-	</div>
-</template>
-
-<script setup lang="ts" name="systemDic">
-import { defineAsyncComponent, reactive, onMounted, ref } from 'vue';
-import { ElMessageBox, ElMessage } from 'element-plus';
-
-// 引入组件
-const DicDialog = defineAsyncComponent(() => import('/@/views/system/dic/dialog.vue'));
-
-// 定义变量内容
-const dicDialogRef = ref();
-const state = reactive<SysDicState>({
-	tableData: {
-		data: [],
-		total: 0,
-		loading: false,
-		param: {
-			pageNum: 1,
-			pageSize: 10,
-		},
-	},
-});
-
-// 初始化表格数据
-const getTableData = () => {
-	state.tableData.loading = true;
-	const data = [];
-	for (let i = 0; i < 2; i++) {
-		data.push({
-			dicName: i === 0 ? '角色标识' : '用户性别',
-			fieldName: i === 0 ? 'SYS_ROLE' : 'SYS_UERINFO',
-			describe: i === 0 ? '这是角色字典' : '这是用户性别字典',
-			status: true,
-			createTime: new Date().toLocaleString(),
-			list: [],
-		});
-	}
-	state.tableData.data = data;
-	state.tableData.total = state.tableData.data.length;
-	setTimeout(() => {
-		state.tableData.loading = false;
-	}, 500);
-};
-// 打开新增字典弹窗
-const onOpenAddDic = (type: string) => {
-	dicDialogRef.value.openDialog(type);
-};
-// 打开修改字典弹窗
-const onOpenEditDic = (type: string, row: RowDicType) => {
-	dicDialogRef.value.openDialog(type, row);
-};
-// 删除字典
-const onRowDel = (row: RowDicType) => {
-	ElMessageBox.confirm(`此操作将永久删除字典名称:“${row.dicName}”,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(() => {
-			getTableData();
-			ElMessage.success('删除成功');
-		})
-		.catch(() => {});
-};
-// 分页改变
-const onHandleSizeChange = (val: number) => {
-	state.tableData.param.pageSize = val;
-	getTableData();
-};
-// 分页改变
-const onHandleCurrentChange = (val: number) => {
-	state.tableData.param.pageNum = val;
-	getTableData();
-};
-// 页面加载时
-onMounted(() => {
-	getTableData();
-});
-</script>

+ 0 - 236
h5/src/views/system/role/dialog.vue

@@ -1,236 +0,0 @@
-<template>
-	<div class="system-role-dialog-container">
-		<el-dialog :title="state.dialog.title" v-model="state.dialog.isShowDialog" width="769px">
-			<el-form ref="roleDialogFormRef" :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.roleName" 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="角色标识">
-							<template #label>
-								<el-tooltip effect="dark" content="用于 `router/route.ts` meta.roles" placement="top-start">
-									<span>角色标识</span>
-								</el-tooltip>
-							</template>
-							<el-input v-model="state.ruleForm.roleSign" 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-number v-model="state.ruleForm.sort" :min="0" :max="999" controls-position="right" placeholder="请输入排序" class="w100" />
-						</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.ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="角色描述">
-							<el-input v-model="state.ruleForm.describe" type="textarea" placeholder="请输入角色描述" maxlength="150"></el-input>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="菜单权限">
-							<el-tree :data="state.menuData" :props="state.menuProps" show-checkbox 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="systemRoleDialog">
-import { reactive, ref } from 'vue';
-
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['refresh']);
-
-// 定义变量内容
-const roleDialogFormRef = ref();
-const state = reactive({
-	ruleForm: {
-		roleName: '', // 角色名称
-		roleSign: '', // 角色标识
-		sort: 0, // 排序
-		status: true, // 角色状态
-		describe: '', // 角色描述
-	},
-	menuData: [] as TreeType[],
-	menuProps: {
-		children: 'children',
-		label: 'label',
-	},
-	dialog: {
-		isShowDialog: false,
-		type: '',
-		title: '',
-		submitTxt: '',
-	},
-});
-
-// 打开弹窗
-const openDialog = (type: string, row: RowRoleType) => {
-	if (type === 'edit') {
-		state.ruleForm = row;
-		state.dialog.title = '修改角色';
-		state.dialog.submitTxt = '修 改';
-	} else {
-		state.dialog.title = '新增角色';
-		state.dialog.submitTxt = '新 增';
-		// 清空表单,此项需加表单验证才能使用
-		// nextTick(() => {
-		// 	roleDialogFormRef.value.resetFields();
-		// });
-	}
-	state.dialog.isShowDialog = true;
-	getMenuData();
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialog.isShowDialog = false;
-};
-// 取消
-const onCancel = () => {
-	closeDialog();
-};
-// 提交
-const onSubmit = () => {
-	closeDialog();
-	emit('refresh');
-	// if (state.dialog.type === 'add') { }
-};
-// 获取菜单结构数据
-const getMenuData = () => {
-	state.menuData = [
-		{
-			id: 1,
-			label: '系统管理',
-			children: [
-				{
-					id: 11,
-					label: '菜单管理',
-					children: [
-						{
-							id: 111,
-							label: '菜单新增',
-						},
-						{
-							id: 112,
-							label: '菜单修改',
-						},
-						{
-							id: 113,
-							label: '菜单删除',
-						},
-						{
-							id: 114,
-							label: '菜单查询',
-						},
-					],
-				},
-				{
-					id: 12,
-					label: '角色管理',
-					children: [
-						{
-							id: 121,
-							label: '角色新增',
-						},
-						{
-							id: 122,
-							label: '角色修改',
-						},
-						{
-							id: 123,
-							label: '角色删除',
-						},
-						{
-							id: 124,
-							label: '角色查询',
-						},
-					],
-				},
-				{
-					id: 13,
-					label: '用户管理',
-					children: [
-						{
-							id: 131,
-							label: '用户新增',
-						},
-						{
-							id: 132,
-							label: '用户修改',
-						},
-						{
-							id: 133,
-							label: '用户删除',
-						},
-						{
-							id: 134,
-							label: '用户查询',
-						},
-					],
-				},
-			],
-		},
-		{
-			id: 2,
-			label: '权限管理',
-			children: [
-				{
-					id: 21,
-					label: '前端控制',
-					children: [
-						{
-							id: 211,
-							label: '页面权限',
-						},
-						{
-							id: 212,
-							label: '页面权限',
-						},
-					],
-				},
-				{
-					id: 22,
-					label: '后端控制',
-					children: [
-						{
-							id: 221,
-							label: '页面权限',
-						},
-					],
-				},
-			],
-		},
-	];
-};
-
-// 暴露变量
-defineExpose({
-	openDialog,
-});
-</script>
-
-<style scoped lang="scss">
-.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 - 146
h5/src/views/system/role/index.vue

@@ -1,146 +0,0 @@
-<template>
-	<div class="system-role-container layout-padding">
-		<div class="system-role-padding layout-padding-auto layout-padding-view">
-			<div class="system-user-search mb15">
-				<el-input v-model="state.tableData.param.search" size="default" placeholder="请输入角色名称" style="max-width: 180px"> </el-input>
-				<el-button size="default" type="primary" class="ml10">
-					<el-icon>
-						<ele-Search />
-					</el-icon>
-					查询
-				</el-button>
-				<el-button size="default" type="success" class="ml10" @click="onOpenAddRole('add')">
-					<el-icon>
-						<ele-FolderAdd />
-					</el-icon>
-					新增角色
-				</el-button>
-			</div>
-			<el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%">
-				<el-table-column type="index" label="序号" width="60" />
-				<el-table-column prop="roleName" label="角色名称" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="roleSign" label="角色标识" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="sort" label="排序" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="status" label="角色状态" show-overflow-tooltip>
-					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status">启用</el-tag>
-						<el-tag type="info" v-else>禁用</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="describe" label="角色描述" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="createTime" label="创建时间" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="100">
-					<template #default="scope">
-						<el-button :disabled="scope.row.roleName === '超级管理员'" size="small" text type="primary" @click="onOpenEditRole('edit', scope.row)"
-							>修改</el-button
-						>
-						<el-button :disabled="scope.row.roleName === '超级管理员'" size="small" text type="primary" @click="onRowDel(scope.row)">删除</el-button>
-					</template>
-				</el-table-column>
-			</el-table>
-			<el-pagination
-				@size-change="onHandleSizeChange"
-				@current-change="onHandleCurrentChange"
-				class="mt15"
-				:pager-count="5"
-				:page-sizes="[10, 20, 30]"
-				v-model:current-page="state.tableData.param.pageNum"
-				background
-				v-model:page-size="state.tableData.param.pageSize"
-				layout="total, sizes, prev, pager, next, jumper"
-				:total="state.tableData.total"
-			>
-			</el-pagination>
-		</div>
-		<RoleDialog ref="roleDialogRef" @refresh="getTableData()" />
-	</div>
-</template>
-
-<script setup lang="ts" name="systemRole">
-import { defineAsyncComponent, reactive, onMounted, ref } from 'vue';
-import { ElMessageBox, ElMessage } from 'element-plus';
-
-// 引入组件
-const RoleDialog = defineAsyncComponent(() => import('/@/views/system/role/dialog.vue'));
-
-// 定义变量内容
-const roleDialogRef = ref();
-const state = reactive<SysRoleState>({
-	tableData: {
-		data: [],
-		total: 0,
-		loading: false,
-		param: {
-			search: '',
-			pageNum: 1,
-			pageSize: 10,
-		},
-	},
-});
-// 初始化表格数据
-const getTableData = () => {
-	state.tableData.loading = true;
-	const data = [];
-	for (let i = 0; i < 20; i++) {
-		data.push({
-			roleName: i === 0 ? '超级管理员' : '普通用户',
-			roleSign: i === 0 ? 'admin' : 'common',
-			describe: `测试角色${i + 1}`,
-			sort: i,
-			status: true,
-			createTime: new Date().toLocaleString(),
-		});
-	}
-	state.tableData.data = data;
-	state.tableData.total = state.tableData.data.length;
-	setTimeout(() => {
-		state.tableData.loading = false;
-	}, 500);
-};
-// 打开新增角色弹窗
-const onOpenAddRole = (type: string) => {
-	roleDialogRef.value.openDialog(type);
-};
-// 打开修改角色弹窗
-const onOpenEditRole = (type: string, row: Object) => {
-	roleDialogRef.value.openDialog(type, row);
-};
-// 删除角色
-const onRowDel = (row: RowRoleType) => {
-	ElMessageBox.confirm(`此操作将永久删除角色名称:“${row.roleName}”,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(() => {
-			getTableData();
-			ElMessage.success('删除成功');
-		})
-		.catch(() => {});
-};
-// 分页改变
-const onHandleSizeChange = (val: number) => {
-	state.tableData.param.pageSize = val;
-	getTableData();
-};
-// 分页改变
-const onHandleCurrentChange = (val: number) => {
-	state.tableData.param.pageNum = val;
-	getTableData();
-};
-// 页面加载时
-onMounted(() => {
-	getTableData();
-});
-</script>
-
-<style scoped lang="scss">
-.system-role-container {
-	.system-role-padding {
-		padding: 15px;
-		.el-table {
-			flex: 1;
-		}
-	}
-}
-</style>