Pārlūkot izejas kodu

update 修改页面代码 去除ele的引入以及vue的类型声明

LiuHao 2 gadi atpakaļ
vecāks
revīzija
6af68085ff
35 mainītis faili ar 704 papildinājumiem un 773 dzēšanām
  1. 12 41
      src/components/Pagination/index.vue
  2. 10 12
      src/views/demo/demo/index.vue
  3. 8 10
      src/views/demo/tree/index.vue
  4. 0 1
      src/views/error/401.vue
  5. 1 2
      src/views/login.vue
  6. 0 1
      src/views/monitor/cache/index.vue
  7. 6 8
      src/views/monitor/logininfor/index.vue
  8. 19 20
      src/views/monitor/online/index.vue
  9. 70 72
      src/views/monitor/operlog/index.vue
  10. 1 2
      src/views/register.vue
  11. 72 74
      src/views/system/config/index.vue
  12. 24 22
      src/views/system/dept/index.vue
  13. 7 9
      src/views/system/dict/data.vue
  14. 5 7
      src/views/system/dict/index.vue
  15. 9 11
      src/views/system/menu/index.vue
  16. 7 9
      src/views/system/notice/index.vue
  17. 5 7
      src/views/system/oss/config.vue
  18. 4 6
      src/views/system/oss/index.vue
  19. 7 8
      src/views/system/post/index.vue
  20. 6 14
      src/views/system/role/authUser.vue
  21. 50 44
      src/views/system/role/index.vue
  22. 5 6
      src/views/system/role/selectUser.vue
  23. 8 10
      src/views/system/tenant/index.vue
  24. 165 156
      src/views/system/tenantPackage/index.vue
  25. 39 39
      src/views/system/user/authRole.vue
  26. 23 34
      src/views/system/user/index.vue
  27. 1 1
      src/views/system/user/profile/index.vue
  28. 30 26
      src/views/system/user/profile/resetPwd.vue
  29. 61 59
      src/views/system/user/profile/userAvatar.vue
  30. 24 22
      src/views/system/user/profile/userInfo.vue
  31. 2 7
      src/views/tool/gen/basicInfoForm.vue
  32. 4 5
      src/views/tool/gen/editTable.vue
  33. 4 10
      src/views/tool/gen/genInfoForm.vue
  34. 10 11
      src/views/tool/gen/importTable.vue
  35. 5 7
      src/views/tool/gen/index.vue

+ 12 - 41
src/components/Pagination/index.vue

@@ -22,52 +22,23 @@ export default {
 
 <script setup lang="ts">
 import { scrollTo } from '@/utils/scroll-to'
-import { PropType } from "vue";
+import { propTypes } from "@/utils/propTypes";
 
 const props = defineProps({
-    total: {
-        required: true,
-        type: Number
-    },
-    page: {
-        type: Number,
-        default: 1
-    },
-    limit: {
-        type: Number,
-        default: 20
-    },
+    total: propTypes.number,
+    page: propTypes.number.def(1),
+    limit: propTypes.number.def(20),
     pageSizes: {
-        type: Array as PropType<number[]>,
-        default() {
-            return [10, 20, 30, 50]
-        }
+      type: Array as PropType<number[]>,
+      default: () => [10, 20, 30, 50]
     },
     // 移动端页码按钮的数量端默认值5
-    pagerCount: {
-        type: Number,
-        default: document.body.clientWidth < 992 ? 5 : 7
-    },
-    layout: {
-        type: String,
-        default: 'total, sizes, prev, pager, next, jumper'
-    },
-    background: {
-        type: Boolean,
-        default: true
-    },
-    autoScroll: {
-        type: Boolean,
-        default: true
-    },
-    hidden: {
-        type: Boolean,
-        default: false
-    },
-    float: {
-        type: String,
-        default: 'right'
-    }
+    pagerCount: propTypes.number.def(document.body.clientWidth < 992 ? 5 : 7),
+    layout: propTypes.string.def('total, sizes, prev, pager, next, jumper'),
+    background: propTypes.bool.def(true),
+    autoScroll: propTypes.bool.def(true),
+    hidden: propTypes.bool.def(false),
+    float: propTypes.string.def('right')
 })
 
 const emit = defineEmits(['update:page', 'update:limit', 'pagination']);

+ 10 - 12
src/views/demo/demo/index.vue

@@ -69,7 +69,7 @@
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
     </el-card>
     <!-- 添加或修改测试单对话框 -->
     <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
@@ -103,8 +103,6 @@
 <script setup name="Demo" lang="ts">
 import { listDemo, getDemo, delDemo, addDemo, updateDemo } from '@/api/demo/demo';
 import { DemoVO, DemoQuery, DemoForm } from '@/api/demo/demo/types';
-import { ComponentInternalInstance } from 'vue';
-import { ElForm } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -117,8 +115,8 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 
-const queryFormRef = ref(ElForm);
-const demoFormRef = ref(ElForm);
+const queryFormRef = ref<ElFormInstance>();
+const demoFormRef = ref<ElFormInstance>();
 
 const dialog = reactive<DialogOption>({
   visible: false,
@@ -134,7 +132,7 @@ const initFormData: DemoForm = {
   value: undefined,
 }
 const data = reactive<PageData<DemoForm, DemoQuery>>({
-  form: {...initFormData},
+  form: { ...initFormData },
   queryParams: {
     pageNum: 1,
     pageSize: 10,
@@ -185,8 +183,8 @@ const cancel = () => {
 
 /** 表单重置 */
 const reset = () => {
-  form.value = {...initFormData};
-  demoFormRef.value.resetFields();
+  form.value = { ...initFormData };
+  demoFormRef.value?.resetFields();
 }
 
 /** 搜索按钮操作 */
@@ -197,7 +195,7 @@ const handleQuery = () => {
 
 /** 重置按钮操作 */
 const resetQuery = () => {
-  queryFormRef.value.resetFields();
+  queryFormRef.value?.resetFields();
   handleQuery();
 }
 
@@ -233,13 +231,13 @@ const handleUpdate = (row?: DemoVO) => {
 
 /** 提交按钮 */
 const submitForm = () => {
-  demoFormRef.value.validate(async (valid: boolean) => {
+  demoFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
       buttonLoading.value = true;
       if (form.value.id) {
-        await updateDemo(form.value).finally(() =>  buttonLoading.value = false);
+        await updateDemo(form.value).finally(() => buttonLoading.value = false);
       } else {
-        await addDemo(form.value).finally(() =>  buttonLoading.value = false);
+        await addDemo(form.value).finally(() => buttonLoading.value = false);
       }
       proxy?.$modal.msgSuccess("修改成功");
       dialog.visible = false;

+ 8 - 10
src/views/demo/tree/index.vue

@@ -91,8 +91,6 @@
 <script setup name="Tree" lang="ts">
 import { listTree, getTree, delTree, addTree, updateTree } from "@/api/demo/tree";
 import { TreeVO, TreeQuery, TreeForm } from '@/api/demo/tree/types';
-import { ComponentInternalInstance } from 'vue';
-import { ElForm, ElTable } from 'element-plus';
 
 
 type TreeOption = {
@@ -111,9 +109,9 @@ const showSearch = ref(true);
 const isExpandAll = ref(true);
 const loading = ref(false);
 
-const queryFormRef = ref(ElForm);
-const treeFormRef = ref(ElForm);
-const treeTableRef = ref(ElTable)
+const queryFormRef = ref<ElFormInstance>();
+const treeFormRef = ref<ElFormInstance>();
+const treeTableRef = ref<ElTableInstance>()
 
 const dialog = reactive<DialogOption>({
     visible: false,
@@ -187,7 +185,7 @@ const cancel = () => {
 // 表单重置
 const reset = () => {
   form.value = {...initFormData}
-  treeFormRef.value.resetFields();
+  treeFormRef.value?.resetFields();
 }
 
 /** 搜索按钮操作 */
@@ -197,7 +195,7 @@ const handleQuery = () => {
 
 /** 重置按钮操作 */
 const resetQuery = () => {
-  queryFormRef.value.resetFields();
+  queryFormRef.value?.resetFields();
   handleQuery();
 }
 
@@ -225,7 +223,7 @@ const handleToggleExpandAll = () => {
 /** 展开/折叠操作 */
 const toggleExpandAll = (data: TreeVO[], status: boolean) => {
   data.forEach((item) => {
-    treeTableRef.value.toggleRowExpansion(item, status)
+    treeTableRef.value?.toggleRowExpansion(item, status)
     if (item.children && item.children.length > 0) toggleExpandAll(item.children, status)
   })
 }
@@ -249,7 +247,7 @@ const handleUpdate = (row: TreeVO) => {
 
 /** 提交按钮 */
 const submitForm = () => {
-  treeFormRef.value.validate(async (valid: boolean) => {
+  treeFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
       buttonLoading.value = true;
       if (form.value.id) {
@@ -259,7 +257,7 @@ const submitForm = () => {
       }
       proxy?.$modal.msgSuccess("操作成功");
       dialog.visible = false;
-      getList();
+      await getList();
     }
   });
 }

+ 0 - 1
src/views/error/401.vue

@@ -21,7 +21,6 @@
 
 <script setup lang="ts">
 import errImage from '@/assets/401_images/401.gif';
-import { ComponentInternalInstance } from "vue";
 
 let { proxy } = getCurrentInstance() as ComponentInternalInstance;
 

+ 1 - 2
src/views/login.vue

@@ -50,7 +50,6 @@ import Cookies from 'js-cookie';
 import { encrypt, decrypt } from '@/utils/jsencrypt';
 import { useUserStore } from '@/store/modules/user';
 import { LoginData, TenantVO } from '@/api/types';
-import { FormRules } from 'element-plus';
 import { to } from 'await-to-js';
 
 const userStore = useUserStore();
@@ -65,7 +64,7 @@ const loginForm = ref<LoginData>({
     uuid: ''
 });
 
-const loginRules: FormRules = {
+const loginRules: ElFormRules = {
     tenantId: [{ required: true, trigger: "blur", message: "请输入您的租户编号" }],
     username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
     password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],

+ 0 - 1
src/views/monitor/cache/index.vue

@@ -126,7 +126,6 @@
 <script setup name="Cache" lang="ts">
 import { getCache } from '@/api/monitor/cache';
 import * as echarts from 'echarts';
-import { ComponentInternalInstance } from "vue";
 
 const cache = ref<any>({});
 const commandstats = ref();

+ 6 - 8
src/views/monitor/logininfor/index.vue

@@ -100,9 +100,7 @@
 
 <script setup name="Logininfor" lang="ts">
 import { list, delLoginInfo, cleanLoginInfo, unlockLoginInfo } from "@/api/monitor/loginInfo";
-import { ComponentInternalInstance } from "vue";
 import { LoginInfoQuery, LoginInfoVO } from "@/api/monitor/loginInfo/types";
-import { DateModelType } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_common_status } = toRefs<any>(proxy?.useDict("sys_common_status"));
@@ -118,8 +116,8 @@ const total = ref(0);
 const dateRange = ref<[DateModelType,DateModelType]>(['', '']);
 const defaultSort = ref<any>({ prop: "loginTime", order: "descending" });
 
-const queryFormRef = ref(ElForm);
-const loginInfoTableRef = ref(ElTable);
+const queryFormRef = ref<ElFormInstance>();
+const loginInfoTableRef = ref<ElTableInstance>();
 // 查询参数
 const queryParams = ref<LoginInfoQuery>({
     pageNum: 1,
@@ -147,9 +145,9 @@ const handleQuery = () => {
 /** 重置按钮操作 */
 const resetQuery = () => {
     dateRange.value = ['', ''];
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     queryParams.value.pageNum = 1;
-    loginInfoTableRef.value.sort(defaultSort.value.prop, defaultSort.value.order);
+    loginInfoTableRef.value?.sort(defaultSort.value.prop, defaultSort.value.order);
 }
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: LoginInfoVO[]) => {
@@ -169,14 +167,14 @@ const handleDelete = async (row?: LoginInfoVO) => {
     const infoIds = row?.infoId || ids.value;
     await proxy?.$modal.confirm('是否确认删除访问编号为"' + infoIds + '"的数据项?');
     await delLoginInfo(infoIds);
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("删除成功");
 }
 /** 清空按钮操作 */
 const handleClean = async () => {
     await proxy?.$modal.confirm("是否确认清空所有登录日志数据项?");
     await cleanLoginInfo();
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("清空成功");
 }
 /** 解锁按钮操作 */

+ 19 - 20
src/views/monitor/online/index.vue

@@ -56,7 +56,6 @@
 
 <script setup name="Online" lang="ts">
 import { forceLogout, list as initData } from "@/api/monitor/online";
-import { ComponentInternalInstance } from "vue";
 import { OnlineQuery, OnlineVO } from "@/api/monitor/online/types";
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -65,42 +64,42 @@ const onlineList = ref<OnlineVO[]>([]);
 const loading = ref(true);
 const total = ref(0);
 
-const queryFormRef = ref(ElForm);
+const queryFormRef = ref<ElFormInstance>();
 
 const queryParams = ref<OnlineQuery>({
-    pageNum: 1,
-    pageSize: 10,
-    ipaddr: '',
-    userName: ''
+  pageNum: 1,
+  pageSize: 10,
+  ipaddr: '',
+  userName: ''
 });
 
 /** 查询登录日志列表 */
 const getList = async () => {
-    loading.value = true;
-    const res = await initData(queryParams.value);
-    onlineList.value = res.rows;
-    total.value = res.total;
-    loading.value = false;
+  loading.value = true;
+  const res = await initData(queryParams.value);
+  onlineList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
-    queryParams.value.pageNum = 1;
-    getList();
+  queryParams.value.pageNum = 1;
+  getList();
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
-    handleQuery();
+  queryFormRef.value?.resetFields();
+  handleQuery();
 }
 /** 强退按钮操作 */
 const handleForceLogout = async (row: OnlineVO) => {
-    await proxy?.$modal.confirm('是否确认强退名称为"' + row.userName + '"的用户?');
-    await forceLogout(row.tokenId);
-    getList();
-    proxy?.$modal.msgSuccess("删除成功");
+  await proxy?.$modal.confirm('是否确认强退名称为"' + row.userName + '"的用户?');
+  await forceLogout(row.tokenId);
+  getList();
+  proxy?.$modal.msgSuccess("删除成功");
 }
 
 onMounted(() => {
-    getList();
+  getList();
 })
 </script>

+ 70 - 72
src/views/monitor/operlog/index.vue

@@ -134,7 +134,7 @@
             <el-form-item label="操作方法:">{{ form.method }}</el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="请求参数:">{{form.operParam}}</el-form-item>
+            <el-form-item label="请求参数:">{{ form.operParam }}</el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item>
@@ -167,12 +167,10 @@
 
 <script setup name="Operlog" lang="ts">
 import { list, delOperlog, cleanOperlog } from '@/api/monitor/operlog';
-import { ComponentInternalInstance } from 'vue';
 import { OperLogForm, OperLogQuery, OperLogVO } from '@/api/monitor/operlog/types';
-import { DateModelType } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict("sys_oper_type","sys_common_status"));
+const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict("sys_oper_type", "sys_common_status"));
 
 const operlogList = ref<OperLogVO[]>([]);
 const loading = ref(true);
@@ -183,116 +181,116 @@ const total = ref(0);
 const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
 const defaultSort = ref<any>({ prop: "operTime", order: "descending" });
 
-const operLogTableRef = ref(ElTable);
-const queryFormRef = ref(ElForm);
+const operLogTableRef = ref<ElTableInstance>();
+const queryFormRef = ref<ElFormInstance>();
 
 const dialog = reactive<DialogOption>({
-    visible: false,
-    title: ''
+  visible: false,
+  title: ''
 });
 
 
 const data = reactive<PageData<OperLogForm, OperLogQuery>>({
-    form: {
-        operId: undefined,
-        tenantId: undefined,
-        title: '',
-        businessType: 0,
-        businessTypes: undefined,
-        method: '',
-        requestMethod: '',
-        operatorType: 0,
-        operName: '',
-        deptName: '',
-        operUrl: '',
-        operIp: '',
-        operLocation: '',
-        operParam: '',
-        jsonResult: '',
-        status: 0,
-        errorMsg: '',
-        operTime: '',
-        costTime: 0
-    },
-    queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        title: '',
-        operName: '',
-        businessType: '',
-        status: '',
-        orderByColumn: defaultSort.value.prop,
-        isAsc: defaultSort.value.order
-    },
-    rules: {}
+  form: {
+    operId: undefined,
+    tenantId: undefined,
+    title: '',
+    businessType: 0,
+    businessTypes: undefined,
+    method: '',
+    requestMethod: '',
+    operatorType: 0,
+    operName: '',
+    deptName: '',
+    operUrl: '',
+    operIp: '',
+    operLocation: '',
+    operParam: '',
+    jsonResult: '',
+    status: 0,
+    errorMsg: '',
+    operTime: '',
+    costTime: 0
+  },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    title: '',
+    operName: '',
+    businessType: '',
+    status: '',
+    orderByColumn: defaultSort.value.prop,
+    isAsc: defaultSort.value.order
+  },
+  rules: {}
 });
 
 const { queryParams, form } = toRefs(data);
 
 /** 查询登录日志 */
 const getList = async () => {
-    loading.value = true;
-    const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value));
-    operlogList.value = res.rows;
-    total.value = res.total;
-    loading.value = false;
+  loading.value = true;
+  const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value));
+  operlogList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
 }
 /** 操作日志类型字典翻译 */
 const typeFormat = (row: OperLogForm) => {
-    return proxy?.selectDictLabel(sys_oper_type.value, row.businessType);
+  return proxy?.selectDictLabel(sys_oper_type.value, row.businessType);
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
-    queryParams.value.pageNum = 1;
-    getList();
+  queryParams.value.pageNum = 1;
+  getList();
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    dateRange.value = ['', ''];
-    queryFormRef.value.resetFields();
-    queryParams.value.pageNum = 1;
-    operLogTableRef.value.sort(defaultSort.value.prop, defaultSort.value.order);
+  dateRange.value = ['', ''];
+  queryFormRef.value?.resetFields();
+  queryParams.value.pageNum = 1;
+  operLogTableRef.value?.sort(defaultSort.value.prop, defaultSort.value.order);
 }
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: OperLogVO[]) => {
-    ids.value = selection.map(item => item.operId);
-    multiple.value = !selection.length;
+  ids.value = selection.map(item => item.operId);
+  multiple.value = !selection.length;
 }
 /** 排序触发事件 */
 const handleSortChange = (column: any) => {
-    queryParams.value.orderByColumn = column.prop;
-    queryParams.value.isAsc = column.order;
-    getList();
+  queryParams.value.orderByColumn = column.prop;
+  queryParams.value.isAsc = column.order;
+  getList();
 }
 /** 详细按钮操作 */
 const handleView = (row: OperLogVO) => {
-    dialog.visible = true;
-    form.value = row;
+  dialog.visible = true;
+  form.value = row;
 }
 /** 删除按钮操作 */
 const handleDelete = async (row?: OperLogVO) => {
-    const operIds = row?.operId || ids.value;
-    await proxy?.$modal.confirm('是否确认删除日志编号为"' + operIds + '"的数据项?');
-    await delOperlog(operIds);
-    getList();
-    proxy?.$modal.msgSuccess("删除成功");
+  const operIds = row?.operId || ids.value;
+  await proxy?.$modal.confirm('是否确认删除日志编号为"' + operIds + '"的数据项?');
+  await delOperlog(operIds);
+  await getList();
+  proxy?.$modal.msgSuccess("删除成功");
 }
 
 /** 清空按钮操作 */
 const handleClean = async () => {
-    await proxy?.$modal.confirm("是否确认清空所有操作日志数据项?");
-    await cleanOperlog();
-    getList();
-    proxy?.$modal.msgSuccess("清空成功");
+  await proxy?.$modal.confirm("是否确认清空所有操作日志数据项?");
+  await cleanOperlog();
+  await getList();
+  proxy?.$modal.msgSuccess("清空成功");
 }
 
 /** 导出按钮操作 */
 const handleExport = () => {
-    proxy?.download("monitor/operlog/export", {
-        ...queryParams.value,
-    }, `config_${new Date().getTime()}.xlsx`);
+  proxy?.download("monitor/operlog/export", {
+    ...queryParams.value,
+  }, `config_${new Date().getTime()}.xlsx`);
 }
 onMounted(() => {
-    getList();
+  getList();
 })
 </script>

+ 1 - 2
src/views/register.vue

@@ -58,7 +58,6 @@
 <script setup lang="ts">
 import { getCodeImg, register, getTenantList } from '@/api/login';
 import { RegisterForm, TenantVO } from '@/api/types';
-import { FormRules } from 'element-plus';
 import { to } from 'await-to-js';
 
 const router = useRouter();
@@ -85,7 +84,7 @@ const equalToPassword = (rule: any, value: string, callback: any) => {
     }
 };
 
-const registerRules: FormRules = {
+const registerRules: ElFormRules = {
     tenantId: [
         { required: true, trigger: "blur", message: "请输入您的租户编号" }
     ],

+ 72 - 74
src/views/system/config/index.vue

@@ -125,8 +125,6 @@
 <script setup name="Config" lang="ts">
 import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from "@/api/system/config";
 import { ConfigForm, ConfigQuery, ConfigVO } from "@/api/system/config/types";
-import { ComponentInternalInstance } from "vue";
-import { DateModelType } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_yes_no } = toRefs<any>(proxy?.useDict("sys_yes_no"));
@@ -140,124 +138,124 @@ const multiple = ref(true);
 const total = ref(0);
 const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
 
-const queryFormRef = ref(ElForm);
-const configFormRef = ref(ElForm);
+const queryFormRef = ref<ElFormInstance>();
+const configFormRef = ref<ElFormInstance>();
 const dialog = reactive<DialogOption>({
-    visible: false,
-    title: ''
+  visible: false,
+  title: ''
 });
 const initFormData: ConfigForm = {
-    configId: undefined,
-    configName: '',
-    configKey: '',
-    configValue: '',
-    configType: "Y",
-    remark: ''
+  configId: undefined,
+  configName: '',
+  configKey: '',
+  configValue: '',
+  configType: "Y",
+  remark: ''
 }
 const data = reactive<PageData<ConfigForm, ConfigQuery>>({
-    form: {...initFormData},
-    queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        configName: '',
-        configKey: '',
-        configType: '',
-    },
-    rules: {
-        configName: [{ required: true, message: "参数名称不能为空", trigger: "blur" }],
-        configKey: [{ required: true, message: "参数键名不能为空", trigger: "blur" }],
-        configValue: [{ required: true, message: "参数键值不能为空", trigger: "blur" }]
-    }
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    configName: '',
+    configKey: '',
+    configType: '',
+  },
+  rules: {
+    configName: [{ required: true, message: "参数名称不能为空", trigger: "blur" }],
+    configKey: [{ required: true, message: "参数键名不能为空", trigger: "blur" }],
+    configValue: [{ required: true, message: "参数键值不能为空", trigger: "blur" }]
+  }
 });
 
 const { queryParams, form, rules } = toRefs(data);
 
 /** 查询参数列表 */
 const getList = async () => {
-    loading.value = true;
-    const res = await listConfig(proxy?.addDateRange(queryParams.value, dateRange.value));
-    configList.value = res.rows;
-    total.value = res.total;
-    loading.value = false;
+  loading.value = true;
+  const res = await listConfig(proxy?.addDateRange(queryParams.value, dateRange.value));
+  configList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
 }
 /** 取消按钮 */
 const cancel = () => {
-    reset();
-    dialog.visible = false;
+  reset();
+  dialog.visible = false;
 }
 /** 表单重置 */
 const reset = () => {
-    form.value = {...initFormData};
-    configFormRef.value.resetFields();
+  form.value = { ...initFormData };
+  configFormRef.value?.resetFields();
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
-    queryParams.value.pageNum = 1;
-    getList();
+  queryParams.value.pageNum = 1;
+  getList();
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    dateRange.value = ['', ''];
-    queryFormRef.value.resetFields();
-    handleQuery();
+  dateRange.value = ['', ''];
+  queryFormRef.value?.resetFields();
+  handleQuery();
 }
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: ConfigVO[]) => {
-    ids.value = selection.map(item => item.configId);
-    single.value = selection.length != 1;
-    multiple.value = !selection.length;
+  ids.value = selection.map(item => item.configId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
 }
 /** 新增按钮操作 */
 const handleAdd = () => {
-    dialog.visible = true;
-    dialog.title = "添加参数";
-    nextTick(() => {
-        reset();
-    })
+  dialog.visible = true;
+  dialog.title = "添加参数";
+  nextTick(() => {
+    reset();
+  })
 }
 /** 修改按钮操作 */
 const handleUpdate = (row?: ConfigVO) => {
-    dialog.visible = true;
-    dialog.title = "修改参数";
-    const configId = row?.configId || ids.value[0];
-    nextTick(async () => {
-        reset();
-        const res = await getConfig(configId);
-        form.value = res.data;
-    })
+  dialog.visible = true;
+  dialog.title = "修改参数";
+  const configId = row?.configId || ids.value[0];
+  nextTick(async () => {
+    reset();
+    const res = await getConfig(configId);
+    form.value = res.data;
+  })
 }
 /** 提交按钮 */
 const submitForm = () => {
-    configFormRef.value.validate(async (valid: boolean) => {
-        if (valid) {
-            form.value.configId ? await updateConfig(form.value) : await addConfig(form.value);
-            proxy?.$modal.msgSuccess("操作成功");
-            dialog.visible = false;
-            getList();
-        }
-    });
+  configFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      form.value.configId ? await updateConfig(form.value) : await addConfig(form.value);
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
 }
 /** 删除按钮操作 */
 const handleDelete = async (row?: ConfigVO) => {
-    const configIds = row?.configId || ids.value;
-    await proxy?.$modal.confirm('是否确认删除参数编号为"' + configIds + '"的数据项?');
-    await delConfig(configIds);
-    getList();
-    proxy?.$modal.msgSuccess("删除成功");
+  const configIds = row?.configId || ids.value;
+  await proxy?.$modal.confirm('是否确认删除参数编号为"' + configIds + '"的数据项?');
+  await delConfig(configIds);
+  await getList();
+  proxy?.$modal.msgSuccess("删除成功");
 }
 /** 导出按钮操作 */
 const handleExport = () => {
-    proxy?.download("system/config/export", {
-        ...queryParams.value
-    }, `config_${new Date().getTime()}.xlsx`);
+  proxy?.download("system/config/export", {
+    ...queryParams.value
+  }, `config_${new Date().getTime()}.xlsx`);
 }
 /** 刷新缓存按钮操作 */
 const handleRefreshCache = async () => {
-    await refreshCache();
-    proxy?.$modal.msgSuccess("刷新缓存成功");
+  await refreshCache();
+  proxy?.$modal.msgSuccess("刷新缓存成功");
 }
 
 onMounted(() => {
-    getList();
+  getList();
 })
 </script>

+ 24 - 22
src/views/system/dept/index.vue

@@ -132,9 +132,7 @@
 
 <script setup name="Dept" lang="ts">
 import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"
-import { ComponentInternalInstance } from 'vue';
 import { DeptForm, DeptQuery, DeptVO } from "@/api/system/dept/types";
-import { ElTable, ElForm } from "element-plus";
 
 interface DeptOptionsType {
     deptId: number | string;
@@ -158,9 +156,9 @@ const dialog = reactive<DialogOption>({
     title: ''
 });
 
-const deptTableRef = ref(ElTable);
-const queryFormRef = ref(ElForm);
-const deptFormRef = ref(ElForm);
+const deptTableRef = ref<ElTableInstance>();
+const queryFormRef = ref<ElFormInstance>();
+const deptFormRef = ref<ElFormInstance>();
 
 const initFormData: DeptForm = {
     deptId: undefined,
@@ -209,7 +207,7 @@ const cancel = () => {
 /** 表单重置 */
 const reset = () => {
     form.value = {...initFormData};
-    deptFormRef.value.resetFields();
+    deptFormRef.value?.resetFields();
 }
 
 /** 搜索按钮操作 */
@@ -218,7 +216,7 @@ const handleQuery = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery()
 }
 /** 新增按钮操作 */
@@ -246,7 +244,7 @@ const handleToggleExpandAll = () => {
 /** 展开/折叠所有 */
 const toggleExpandAll = (data: DeptVO[], status: boolean) => {
     data.forEach((item) => {
-        deptTableRef.value.toggleRowExpansion(item, status)
+        deptTableRef.value?.toggleRowExpansion(item, status)
         if(item.children && item.children.length > 0) toggleExpandAll(item.children, status)
     })
 }
@@ -256,28 +254,32 @@ const handleUpdate = async (row: DeptVO) => {
     const res = await getDept(row.deptId);
     dialog.visible = true;
     dialog.title = "修改部门";
-    nextTick(async () => {
-        reset();
-        form.value = res.data
-        const response = await listDeptExcludeChild(row.deptId);
-        const data = proxy?.handleTree<DeptOptionsType>(response.data, "deptId")
-        if (data) {
-            deptOptions.value = data;
-            if (data.length === 0) {
-                const noResultsOptions: DeptOptionsType = { deptId: res.data.parentId, deptName: res.data.parentName, children: [] };
-                deptOptions.value.push(noResultsOptions);
-            }
+    await nextTick(async () => {
+      reset();
+      form.value = res.data
+      const response = await listDeptExcludeChild(row.deptId);
+      const data = proxy?.handleTree < DeptOptionsType > (response.data, "deptId")
+      if (data) {
+        deptOptions.value = data;
+        if (data.length === 0) {
+          const noResultsOptions: DeptOptionsType = {
+            deptId: res.data.parentId,
+            deptName: res.data.parentName,
+            children: []
+          };
+          deptOptions.value.push(noResultsOptions);
         }
+      }
     })
 }
 /** 提交按钮 */
 const submitForm = () => {
-    deptFormRef.value.validate(async (valid: boolean) => {
+    deptFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             form.value.deptId ? await updateDept(form.value) : await addDept(form.value);
             proxy?.$modal.msgSuccess("操作成功");
             dialog.visible = false;
-            getList();
+            await getList();
         }
     })
 }
@@ -285,7 +287,7 @@ const submitForm = () => {
 const handleDelete = async (row: DeptVO) => {
     await proxy?.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?');
     await delDept(row.deptId);
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("删除成功");
 }
 

+ 7 - 9
src/views/system/dict/data.vue

@@ -138,9 +138,7 @@ import useDictStore from '@/store/modules/dict'
 import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type";
 import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data";
 import { DictTypeVO } from '@/api/system/dict/type/types';
-import { ComponentInternalInstance } from "vue";
 import { DictDataForm, DictDataQuery, DictDataVO } from "@/api/system/dict/data/types";
-import { ElForm } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance
 const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable"));
@@ -156,8 +154,8 @@ const total = ref(0);
 const defaultDictType = ref("");
 const typeOptions = ref<DictTypeVO[]>([]);
 
-const dataFormRef = ref(ElForm);
-const queryFormRef = ref(ElForm);
+const dataFormRef = ref<ElFormInstance>();
+const queryFormRef = ref<ElFormInstance>();
 
 
 const dialog = reactive<DialogOption>({
@@ -233,7 +231,7 @@ const cancel = () => {
 /** 表单重置 */
 const reset = () => {
     form.value = { ...initFormData };
-    dataFormRef.value.resetFields();
+    dataFormRef.value?.resetFields();
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
@@ -247,7 +245,7 @@ const handleClose = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     queryParams.value.dictType = defaultDictType.value;
     handleQuery();
 }
@@ -279,13 +277,13 @@ const handleUpdate = (row?: DictDataVO) => {
 }
 /** 提交按钮 */
 const submitForm = () => {
-    dataFormRef.value.validate(async (valid: boolean) => {
+    dataFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             form.value.dictCode ? await updateData(form.value) : await addData(form.value);
             useDictStore().removeDict(queryParams.value.dictType);
             proxy?.$modal.msgSuccess("操作成功");
             dialog.visible = false;
-            getList();
+            await getList();
 
         }
     });
@@ -295,7 +293,7 @@ const handleDelete = async (row?: DictDataVO) => {
     const dictCodes = row?.dictCode || ids.value;
     await proxy?.$modal.confirm('是否确认删除字典编码为"' + dictCodes + '"的数据项?');
     await delData(dictCodes);
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("删除成功");
     useDictStore().removeDict(queryParams.value.dictType);
 

+ 5 - 7
src/views/system/dict/index.vue

@@ -125,9 +125,7 @@
 <script setup name="Dict" lang="ts">
 import useDictStore from '@/store/modules/dict'
 import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type";
-import { ComponentInternalInstance } from "vue";
 import { DictTypeForm, DictTypeQuery, DictTypeVO } from "@/api/system/dict/type/types";
-import { DateModelType } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable"))
@@ -141,8 +139,8 @@ const multiple = ref(true);
 const total = ref(0);
 const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
 
-const dictFormRef = ref(ElForm);
-const queryFormRef = ref(ElForm);
+const dictFormRef = ref<ElFormInstance>();
+const queryFormRef = ref<ElFormInstance>();
 
 
 const dialog = reactive<DialogOption>({
@@ -191,7 +189,7 @@ const cancel = () => {
 /** 表单重置 */
 const reset = () => {
     form.value = {...initFormData};
-    dictFormRef.value.resetFields();
+    dictFormRef.value?.resetFields();
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
@@ -201,7 +199,7 @@ const handleQuery = () => {
 /** 重置按钮操作 */
 const resetQuery = () => {
     dateRange.value = ['', ''];
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /** 新增按钮操作 */
@@ -232,7 +230,7 @@ const handleUpdate = (row?: DictTypeVO) => {
 }
 /** 提交按钮 */
 const submitForm = () => {
-    dictFormRef.value.validate(async (valid: boolean) => {
+    dictFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             form.value.dictId ? await updateType(form.value) : await addType(form.value);
             proxy?.$modal.msgSuccess("操作成功");

+ 9 - 11
src/views/system/menu/index.vue

@@ -263,9 +263,7 @@
 <script setup name="Menu" lang="ts">
 import { addMenu, delMenu, getMenu, listMenu, updateMenu } from '@/api/system/menu';
 import { MenuForm, MenuQuery, MenuVO } from '@/api/system/menu/types';
-import { ComponentInternalInstance } from 'vue';
 import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
-import { ElTable, ElForm } from 'element-plus';
 
 interface MenuOptionsType {
     menuId: number;
@@ -287,8 +285,8 @@ const dialog = reactive<DialogOption>({
     title: ''
 });
 
-const queryFormRef = ref(ElForm);
-const menuFormRef = ref(ElForm);
+const queryFormRef = ref<ElFormInstance>();
+const menuFormRef = ref<ElFormInstance>();
 const initFormData = {
     path: '',
     menuId: undefined,
@@ -315,7 +313,7 @@ const data = reactive<PageData<MenuForm, MenuQuery>>({
     },
 })
 
-const menuTableRef = ref(ElTable);
+const menuTableRef = ref<ElTableInstance>();
 
 const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data)
 /** 查询菜单列表 */
@@ -344,7 +342,7 @@ const cancel = () => {
 /** 表单重置 */
 const reset = () => {
     form.value = { ...initFormData };
-    menuFormRef.value.resetFields();
+    menuFormRef.value?.resetFields();
 }
 
 /** 搜索按钮操作 */
@@ -353,7 +351,7 @@ const handleQuery = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /** 新增按钮操作 */
@@ -375,7 +373,7 @@ const handleToggleExpandAll = () => {
 /** 展开/折叠所有 */
 const toggleExpandAll = (data: MenuVO[], status: boolean) => {
     data.forEach((item: MenuVO) => {
-        menuTableRef.value.toggleRowExpansion(item, status)
+        menuTableRef.value?.toggleRowExpansion(item, status)
         if (item.children && item.children.length > 0) toggleExpandAll(item.children, status)
     })
 }
@@ -395,12 +393,12 @@ const handleUpdate = async (row: MenuVO) => {
 }
 /** 提交按钮 */
 const submitForm = () => {
-    menuFormRef.value.validate(async (valid: boolean) => {
+    menuFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value);
             proxy?.$modal.msgSuccess("操作成功");
             dialog.visible = false;
-            getList();
+            await getList();
         }
     })
 }
@@ -408,7 +406,7 @@ const submitForm = () => {
 const handleDelete = async (row: MenuVO) => {
     await proxy?.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?');
     await delMenu(row.menuId);
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("删除成功");
 }
 

+ 7 - 9
src/views/system/notice/index.vue

@@ -121,9 +121,7 @@
 
 <script setup name="Notice" lang="ts">
 import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice";
-import { ComponentInternalInstance } from "vue";
 import { NoticeForm, NoticeQuery, NoticeVO } from "@/api/system/notice/types";
-import { ElForm } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_notice_status, sys_notice_type } = toRefs<any>(proxy?.useDict("sys_notice_status", "sys_notice_type"));
@@ -136,8 +134,8 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 
-const queryFormRef = ref(ElForm);
-const noticeFormRef = ref(ElForm);
+const queryFormRef = ref<ElFormInstance>();
+const noticeFormRef = ref<ElFormInstance>();
 
 
 const dialog = reactive<DialogOption>({
@@ -188,7 +186,7 @@ const cancel = () => {
 /** 表单重置 */
 const reset = () => {
     form.value = { ...initFormData };
-    noticeFormRef.value.resetFields();
+    noticeFormRef.value?.resetFields();
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
@@ -197,7 +195,7 @@ const handleQuery = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /** 多选框选中数据 */
@@ -227,12 +225,12 @@ const handleUpdate = (row?: NoticeVO) => {
 }
 /** 提交按钮 */
 const submitForm = () => {
-    noticeFormRef.value.validate(async (valid: boolean) => {
+    noticeFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             form.value.noticeId ? await updateNotice(form.value) : await addNotice(form.value);
             proxy?.$modal.msgSuccess("修改成功");
             dialog.visible = false;
-            getList();
+            await getList();
         }
     });
 }
@@ -241,7 +239,7 @@ const handleDelete = async (row?: NoticeVO) => {
     const noticeIds = row?.noticeId || ids.value
     await proxy?.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?');
     await delNotice(noticeIds);
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("删除成功");
 }
 

+ 5 - 7
src/views/system/oss/config.vue

@@ -140,9 +140,7 @@ import {
     updateOssConfig,
     changeOssConfigStatus
 } from "@/api/system/ossConfig";
-import { ComponentInternalInstance } from "vue";
 import { OssConfigForm, OssConfigQuery, OssConfigVO } from "@/api/system/ossConfig/types";
-import { ElForm } from 'element-plus';
 
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance
@@ -157,8 +155,8 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 
-const queryFormRef = ref(ElForm);
-const ossConfigFormRef = ref(ElForm);
+const queryFormRef = ref<ElFormInstance>();
+const ossConfigFormRef = ref<ElFormInstance>();
 
 const dialog = reactive<DialogOption>({
     visible: false,
@@ -264,7 +262,7 @@ const cancel = () => {
 /** 表单重置 */
 const reset = () => {
     form.value = { ...initFormData };
-    ossConfigFormRef.value.resetFields();
+    ossConfigFormRef.value?.resetFields();
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
@@ -273,7 +271,7 @@ const handleQuery = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /** 选择条数  */
@@ -305,7 +303,7 @@ const handleUpdate = (row?: OssConfigVO) => {
 }
 /** 提交按钮 */
 const submitForm = () => {
-    ossConfigFormRef.value.validate(async (valid: boolean) => {
+    ossConfigFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             buttonLoading.value = true;
             if (form.value.ossConfigId) {

+ 4 - 6
src/views/system/oss/index.vue

@@ -135,9 +135,7 @@
 <script setup name="Oss" lang="ts">
 import { listOss, delOss } from "@/api/system/oss";
 import ImagePreview from "@/components/ImagePreview/index.vue";
-import { ComponentInternalInstance } from "vue";
 import { OssForm, OssQuery, OssVO } from "@/api/system/oss/types";
-import { DateModelType } from 'element-plus';
 
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -163,8 +161,8 @@ const dialog = reactive<DialogOption>({
 // 默认排序
 const defaultSort = ref({ prop: 'createTime', order: 'ascending' });
 
-const ossFormRef = ref(ElForm);
-const queryFormRef = ref(ElForm);
+const ossFormRef = ref<ElFormInstance>();
+const queryFormRef = ref<ElFormInstance>();
 
 const initFormData = {
     file: undefined,
@@ -217,7 +215,7 @@ function cancel() {
 /** 表单重置 */
 function reset() {
     form.value = { ...initFormData };
-    ossFormRef.value.resetFields();
+    ossFormRef.value?.resetFields();
 }
 /** 搜索按钮操作 */
 function handleQuery() {
@@ -228,7 +226,7 @@ function handleQuery() {
 function resetQuery() {
     showTable.value = false;
     daterangeCreateTime.value = ['', ''];
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     queryParams.value.orderByColumn = defaultSort.value.prop;
     queryParams.value.isAsc = defaultSort.value.order;
     handleQuery();

+ 7 - 8
src/views/system/post/index.vue

@@ -109,7 +109,6 @@
 <script setup name="Post" lang="ts">
 import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post";
 import { PostForm, PostQuery, PostVO } from "@/api/system/post/types";
-import { ComponentInternalInstance } from "vue";
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable"));
@@ -122,8 +121,8 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 
-const postFormRef = ref(ElForm);
-const queryFormRef = ref(ElForm);
+const postFormRef = ref<ElFormInstance>();
+const queryFormRef = ref<ElFormInstance>();
 
 const dialog = reactive<DialogOption>({
     visible: false,
@@ -173,7 +172,7 @@ const cancel = () => {
 /** 表单重置 */
 const reset = () => {
     form.value = {...initFormData};
-    postFormRef.value.resetFields();
+    postFormRef.value?.resetFields();
 }
 /** 搜索按钮操作 */
 const handleQuery = () => {
@@ -182,7 +181,7 @@ const handleQuery = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /** 多选框选中数据 */
@@ -212,12 +211,12 @@ const handleUpdate = (row?: PostVO) => {
 }
 /** 提交按钮 */
 const submitForm = () => {
-    postFormRef.value.validate(async (valid: boolean) => {
+    postFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             form.value.postId ? await updatePost(form.value) : await addPost(form.value);
             proxy?.$modal.msgSuccess("操作成功");
             dialog.visible = false;
-            getList();
+            await getList();
         }
     });
 }
@@ -226,7 +225,7 @@ const handleDelete = async (row?: PostVO) => {
     const postIds = row?.postId || ids.value;
     await proxy?.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?');
     await delPost(postIds);
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("删除成功");
 }
 /** 导出按钮操作 */

+ 6 - 14
src/views/system/role/authUser.vue

@@ -58,13 +58,7 @@
         </el-table-column>
       </el-table>
 
-      <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-      />
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
       <select-user ref="selectRef" :roleId="queryParams.roleId" @ok="handleQuery" />
     </el-card>
   </div>
@@ -73,10 +67,8 @@
 <script setup name="AuthUser" lang="ts">
 import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role";
 import { UserQuery } from "@/api/system/user/types";
-import { ComponentInternalInstance } from "vue";
 import { UserVO } from "@/api/system/user/types";
 import SelectUser from "./selectUser.vue";
-// import { ElForm, ElSelect} from 'element-plus';
 
 
 const route = useRoute();
@@ -90,8 +82,8 @@ const multiple = ref(true);
 const total = ref(0);
 const userIds = ref<Array<string | number>>([]);
 
-const queryFormRef = ref(ElForm);
-const selectRef = ref(SelectUser);
+const queryFormRef = ref<ElFormInstance>();
+const selectRef = ref<InstanceType<typeof SelectUser>>();
 
 const queryParams = reactive<UserQuery>({
     pageNum: 1,
@@ -121,7 +113,7 @@ const handleQuery=() => {
 }
 /** 重置按钮操作 */
 const resetQuery=() =>{
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 // 多选框选中数据
@@ -137,7 +129,7 @@ const openSelectUser = () => {
 const cancelAuthUser = async (row: UserVO) => {
     await proxy?.$modal.confirm('确认要取消该用户"' + row.userName + '"角色吗?');
     await authUserCancel({ userId: row.userId, roleId: queryParams.roleId });
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("取消授权成功");
 }
 /** 批量取消授权按钮操作 */
@@ -146,7 +138,7 @@ const cancelAuthUserAll = async () => {
     const uIds = userIds.value.join(",");
     await proxy?.$modal.confirm("是否取消选中用户授权数据项?");
     await authUserCancelAll({ roleId: roleId, userIds: uIds });
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("取消授权成功");
 }
 

+ 50 - 44
src/views/system/role/index.vue

@@ -198,8 +198,6 @@ import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updat
 import { roleMenuTreeselect, treeselect as menuTreeselect } from '@/api/system/menu/index';
 import { RoleVO, RoleForm, RoleQuery, DeptTreeOption } from '@/api/system/role/types';
 import { MenuTreeOption, RoleMenuTree } from '@/api/system/menu/types';
-import { ComponentInternalInstance } from 'vue';
-import { ElTree, ElForm, DateModelType } from 'element-plus';
 
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -230,11 +228,11 @@ const dataScopeOptions = ref([
     { value: "5", label: "仅本人数据权限" }
 ])
 
-const queryFormRef = ref(ElForm);
-const roleFormRef = ref(ElForm);
-const dataScopeRef = ref(ElForm);
-const menuRef = ref(ElTree);
-const deptRef = ref(ElTree);
+const queryFormRef = ref<ElFormInstance>();
+const roleFormRef = ref<ElFormInstance>();
+const dataScopeRef = ref<ElFormInstance>();
+const menuRef = ref<ElTreeInstance>();
+const deptRef = ref<ElTreeInstance>();
 
 const initForm: RoleForm = {
     roleId: undefined,
@@ -297,7 +295,7 @@ const handleQuery = () => {
 /** 重置 */
 const resetQuery = () => {
     dateRange.value = ['', '']
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /**删除按钮操作 */
@@ -345,23 +343,25 @@ const getMenuTreeselect = async () => {
     menuOptions.value = res.data;
 }
 /** 所有部门节点数据 */
-const getDeptAllCheckedKeys = () => {
+const getDeptAllCheckedKeys = (): any => {
     // 目前被选中的部门节点
-    let checkedKeys = deptRef.value.getCheckedKeys();
+    let checkedKeys = deptRef.value?.getCheckedKeys();
     // 半选中的部门节点
-    let halfCheckedKeys = deptRef.value.getHalfCheckedKeys();
-    checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+    let halfCheckedKeys = deptRef.value?.getHalfCheckedKeys();
+    if(halfCheckedKeys) {
+      checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys);
+    }
     return checkedKeys
 }
 /** 重置新增的表单以及其他数据  */
 const reset = () => {
-    menuRef.value.setCheckedKeys([]);
+    menuRef.value?.setCheckedKeys([]);
     menuExpand.value = false
     menuNodeAll.value = false
     deptExpand.value = true
     deptNodeAll.value = false
     form.value = { ...initForm };
-    roleFormRef.value.resetFields();
+    roleFormRef.value?.resetFields();
 
 }
 
@@ -381,19 +381,19 @@ const handleUpdate = async (row?: RoleVO) => {
     const { data } = await getRole(roleId);
     dialog.visible = true;
     dialog.title = "修改角色";
-    nextTick(() => {
-        reset();
-        Object.assign(form.value, data);
-        form.value.roleSort = Number(form.value.roleSort);
-        nextTick(async () => {
-            const res = await roleMenu;
-            let checkedKeys = res.checkedKeys;
-            checkedKeys.forEach((v) => {
-                nextTick(() => {
-                    menuRef.value.setChecked(v, true, false);
-                })
-            })
+    await nextTick(() => {
+      reset();
+      Object.assign(form.value, data);
+      form.value.roleSort = Number(form.value.roleSort);
+      nextTick(async () => {
+        const res = await roleMenu;
+        let checkedKeys = res.checkedKeys;
+        checkedKeys.forEach((v) => {
+          nextTick(() => {
+            menuRef.value?.setChecked(v, true, false);
+          })
         })
+      })
     })
 }
 /** 根据角色ID查询菜单树结构 */
@@ -410,25 +410,29 @@ const getRoleDeptTreeSelect = async (roleId: string | number) => {
     return res.data;
 }
 /** 树权限(展开/折叠)*/
-const handleCheckedTreeExpand = (value: any, type: string) => {
+const handleCheckedTreeExpand = (value: boolean, type: string) => {
     if (type == "menu") {
         let treeList = menuOptions.value;
         for (let i = 0; i < treeList.length; i++) {
+          if (menuRef.value) {
             menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
+          }
         }
     } else if (type == "dept") {
         let treeList = deptOptions.value;
         for (let i = 0; i < treeList.length; i++) {
-            deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
+            if (deptRef.value) {
+              deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
+            }
         }
     }
 }
 /** 树权限(全选/全不选) */
 const handleCheckedTreeNodeAll = (value: any, type: string) => {
     if (type == "menu") {
-        menuRef.value.setCheckedNodes(value ? menuOptions.value : []);
+        menuRef.value?.setCheckedNodes(value ? menuOptions.value as any : []);
     } else if (type == "dept") {
-        deptRef.value.setCheckedNodes(value ? deptOptions.value : []);
+        deptRef.value?.setCheckedNodes(value ? deptOptions.value as any : []);
     }
 }
 /** 树权限(父子联动) */
@@ -440,17 +444,19 @@ const handleCheckedTreeConnect = (value: any, type: string) => {
     }
 }
 /** 所有菜单节点数据 */
-const getMenuAllCheckedKeys = () => {
+const getMenuAllCheckedKeys = (): any => {
     // 目前被选中的菜单节点
-    let checkedKeys = menuRef.value.getCheckedKeys();
+    let checkedKeys = menuRef.value?.getCheckedKeys();
     // 半选中的菜单节点
-    let halfCheckedKeys = menuRef.value.getHalfCheckedKeys();
-    checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+    let halfCheckedKeys = menuRef.value?.getHalfCheckedKeys();
+    if (halfCheckedKeys) {
+      checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys);
+    }
     return checkedKeys;
 }
 /** 提交按钮 */
 const submitForm = () => {
-    roleFormRef.value.validate(async (valid: boolean) => {
+    roleFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             form.value.menuIds = getMenuAllCheckedKeys()
             form.value.roleId ? await updateRole(form.value) : await addRole(form.value);
@@ -468,7 +474,7 @@ const cancel = () => {
 /** 选择角色权限范围触发 */
 const dataScopeSelectChange = (value: string) => {
     if (value !== "2") {
-        deptRef.value.setCheckedKeys([])
+        deptRef.value?.setCheckedKeys([])
     }
 }
 /** 分配数据权限操作 */
@@ -478,13 +484,13 @@ const handleDataScope = async (row: RoleVO) => {
     Object.assign(form.value, response.data);
     openDataScope.value = true;
     dialog.title = "分配数据权限";
-    nextTick(async () => {
-        const res = await roleDeptTreeselect;
-        nextTick(() => {
-            if (deptRef.value) {
-                deptRef.value.setCheckedKeys(res.checkedKeys);
-            }
-        })
+    await nextTick(async () => {
+      const res = await roleDeptTreeselect;
+      await nextTick(() => {
+        if (deptRef.value) {
+          deptRef.value.setCheckedKeys(res.checkedKeys);
+        }
+      })
     })
 }
 /** 提交按钮(数据权限) */
@@ -499,7 +505,7 @@ const submitDataScope = async () => {
 }
 /** 取消按钮(数据权限)*/
 const cancelDataScope = () => {
-    dataScopeRef.value.resetFields();
+    dataScopeRef.value?.resetFields();
     form.value = {...initForm};
     openDataScope.value = false;
 }

+ 5 - 6
src/views/system/role/selectUser.vue

@@ -47,8 +47,6 @@
 import { authUserSelectAll, unallocatedUserList } from "@/api/system/role";
 import { UserVO } from '@/api/system/user/types';
 import { UserQuery } from '@/api/system/user/types';
-import { ComponentInternalInstance } from 'vue';
-import { ElForm, ElTable } from 'element-plus';
 
 
 const props = defineProps({
@@ -73,8 +71,8 @@ const queryParams = reactive<UserQuery>({
     phonenumber: undefined
 })
 
-const tableRef = ref(ElTable);
-const queryFormRef = ref(ElForm);
+const tableRef = ref<ElTableInstance>();
+const queryFormRef = ref<ElFormInstance>();
 
 const show = () => {
     queryParams.roleId = props.roleId;
@@ -86,7 +84,8 @@ const show = () => {
  * 选择行
  */
 const clickRow = (row: any) => {
-    tableRef.value.toggleRowSelection(row);
+    // ele的bug
+    tableRef.value?.toggleRowSelection(row);
 }
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: UserVO[]) => {
@@ -106,7 +105,7 @@ const handleQuery = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     getList();
 }
 

+ 8 - 10
src/views/system/tenant/index.vue

@@ -145,8 +145,6 @@ import { listTenant, getTenant, delTenant, addTenant, updateTenant, changeTenant
 import { selectTenantPackage } from '@/api/system/tenantPackage';
 import { TenantForm, TenantQuery, TenantVO } from '@/api/system/tenant/types';
 import { TenantPkgVO } from '@/api/system/tenantPackage/types';
-import { ComponentInternalInstance } from 'vue';
-import { ElForm } from 'element-plus';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -160,8 +158,8 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 
-const queryFormRef = ref(ElForm);
-const tenantFormRef = ref(ElForm);
+const queryFormRef = ref<ElFormInstance>();
+const tenantFormRef = ref<ElFormInstance>();
 
 const dialog = reactive<DialogOption>({
     visible: false,
@@ -253,7 +251,7 @@ const cancel = () => {
 // 表单重置
 const reset = () => {
     form.value = {...initFormData};
-    tenantFormRef.value.resetFields();
+    tenantFormRef.value?.resetFields();
 }
 
 /** 搜索按钮操作 */
@@ -264,7 +262,7 @@ const handleQuery = () => {
 
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 
@@ -292,7 +290,7 @@ const handleUpdate = (row?: TenantVO) => {
     dialog.title = "修改租户";
     nextTick(async () => {
         reset();
-        getTenantPackage();
+        await getTenantPackage();
         const _id = row?.id || ids.value[0];
         const res = await getTenant(_id);
         loading.value = false;
@@ -302,7 +300,7 @@ const handleUpdate = (row?: TenantVO) => {
 
 /** 提交按钮 */
 const submitForm = () => {
-    tenantFormRef.value.validate(async (valid: boolean) => {
+    tenantFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
             buttonLoading.value = true;
             if (form.value.id) {
@@ -323,7 +321,7 @@ const handleDelete = async (row?: TenantVO) => {
     await proxy?.$modal.confirm('是否确认删除租户编号为"' + _ids + '"的数据项?')
     loading.value = true;
     await delTenant(_ids).finally(() => loading.value = false);
-    getList();
+    await getList();
     proxy?.$modal.msgSuccess("删除成功");
 
 
@@ -335,7 +333,7 @@ const handleSyncTenantPackage = async (row: TenantVO) => {
         await proxy?.$modal.confirm('是否确认同步租户套餐租户编号为"' + row.tenantId + '"的数据项?');
         loading.value = true;
         await syncTenantPackage(row.tenantId, row.packageId);
-        getList();
+        await getList();
         proxy?.$modal.msgSuccess("同步成功");
     } catch {return} finally {
         loading.value = false;

+ 165 - 156
src/views/system/tenantPackage/index.vue

@@ -20,20 +20,20 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenantPackage:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenantPackage:add']"> 新增 </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenantPackage:edit']"
-              >修改</el-button
-            >
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenantPackage:edit']">
+              修改
+            </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenantPackage:remove']"
-              >删除</el-button
-            >
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenantPackage:remove']">
+              删除
+            </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenantPackage:export']">导出</el-button>
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenantPackage:export']">导出 </el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
@@ -55,7 +55,7 @@
               <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenantPackage:edit']"></el-button>
             </el-tooltip>
             <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenantPackage:remove']"> </el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenantPackage:remove']"></el-button>
             </el-tooltip>
           </template>
         </el-table-column>
@@ -72,8 +72,8 @@
         </el-form-item>
         <el-form-item label="关联菜单">
           <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
-          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
-          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选 </el-checkbox>
+          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动 </el-checkbox>
           <el-tree
             class="tree-border"
             :data="menuOptions"
@@ -100,12 +100,17 @@
 </template>
 
 <script setup name="TenantPackage" lang="ts">
-import { listTenantPackage, getTenantPackage, delTenantPackage, addTenantPackage, updateTenantPackage, changePackageStatus } from "@/api/system/tenantPackage";
+import {
+  listTenantPackage,
+  getTenantPackage,
+  delTenantPackage,
+  addTenantPackage,
+  updateTenantPackage,
+  changePackageStatus
+} from "@/api/system/tenantPackage";
 import { treeselect as menuTreeselect, tenantPackageMenuTreeselect } from "@/api/system/menu";
-import { ComponentInternalInstance } from "vue";
 import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from "@/api/system/tenantPackage/types";
 import { MenuTreeOption } from "@/api/system/menu/types";
-import { CheckboxValueType, ElTree, ElForm } from 'element-plus';
 import to from "await-to-js";
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -122,212 +127,216 @@ const menuExpand = ref(false);
 const menuNodeAll = ref(false);
 const menuOptions = ref<MenuTreeOption[]>([]);
 
-const menuTreeRef = ref(ElTree);
-const queryFormRef = ref(ElForm);
-const tenantPackageFormRef = ref(ElForm);
+const menuTreeRef = ref<ElTreeInstance>();
+const queryFormRef = ref<ElFormInstance>();
+const tenantPackageFormRef = ref<ElFormInstance>();
 
 const dialog = reactive<DialogOption>({
-    visible: false,
-    title: ''
+  visible: false,
+  title: ""
 });
 
 
 const initFormData: TenantPkgForm = {
-    packageId: undefined,
-    packageName: '',
-    menuIds: '',
-    remark: '',
-    menuCheckStrictly: true
+  packageId: undefined,
+  packageName: "",
+  menuIds: "",
+  remark: "",
+  menuCheckStrictly: true
 };
 const data = reactive<PageData<TenantPkgForm, TenantPkgQuery>>({
-    form: {...initFormData},
-    queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        packageName: ''
-    },
-    rules: {
-        packageId: [{ required: true, message: "租户套餐id不能为空", trigger: "blur" }],
-        packageName: [{ required: true, message: "套餐名称不能为空", trigger: "blur" }]
-    }
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    packageName: ""
+  },
+  rules: {
+    packageId: [{ required: true, message: "租户套餐id不能为空", trigger: "blur" }],
+    packageName: [{ required: true, message: "套餐名称不能为空", trigger: "blur" }]
+  }
 });
 
 const { queryParams, form, rules } = toRefs(data);
 
 /** 查询菜单树结构 */
-const getMenuTreeselect = async() => {
-    const { data } = await menuTreeselect();
-    menuOptions.value = data;
-}
+const getMenuTreeselect = async () => {
+  const { data } = await menuTreeselect();
+  menuOptions.value = data;
+};
 
 // 所有菜单节点数据
-const getMenuAllCheckedKeys = () => {
-    // 目前被选中的菜单节点
-    let checkedKeys = menuTreeRef.value.getCheckedKeys();
-    // 半选中的菜单节点
-    let halfCheckedKeys = menuTreeRef.value.getHalfCheckedKeys();
-    checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
-    return checkedKeys;
-}
+const getMenuAllCheckedKeys = (): any => {
+  // 目前被选中的菜单节点
+  let checkedKeys = menuTreeRef.value?.getCheckedKeys();
+  // 半选中的菜单节点
+  let halfCheckedKeys = menuTreeRef.value?.getHalfCheckedKeys();
+  if (halfCheckedKeys) {
+    checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys);
+  }
+  return checkedKeys;
+};
 
 /** 根据租户套餐ID查询菜单树结构 */
-const getPackageMenuTreeselect = async(packageId: string | number) => {
-    const res = await tenantPackageMenuTreeselect(packageId);
-    menuOptions.value = res.data.menus;
-    return Promise.resolve(res);
-}
+const getPackageMenuTreeselect = async (packageId: string | number) => {
+  const res = await tenantPackageMenuTreeselect(packageId);
+  menuOptions.value = res.data.menus;
+  return Promise.resolve(res);
+};
 
 /** 查询租户套餐列表 */
 const getList = async () => {
-    loading.value = true;
-    const res = await listTenantPackage(queryParams.value);
-    tenantPackageList.value = res.rows;
-    total.value = res.total;
-    loading.value = false;
-}
+  loading.value = true;
+  const res = await listTenantPackage(queryParams.value);
+  tenantPackageList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
 
 // 租户套餐状态修改
 const handleStatusChange = async (row: TenantPkgVO) => {
-    let text = row.status === "0" ? "启用" : "停用";
-    const [err] = await to(proxy?.$modal.confirm('确认要"' + text + '""' + row.packageName + '"套餐吗?') as Promise<any>)
-    if (err) {
-        row.status = row.status === "0" ? "1" : "0";
-    } else {
-        await changePackageStatus(row.packageId, row.status);
-        proxy?.$modal.msgSuccess(text + "成功");
-    }
-}
+  let text = row.status === "0" ? "启用" : "停用";
+  const [err] = await to(proxy?.$modal.confirm("确认要\"" + text + "\"\"" + row.packageName + "\"套餐吗?") as Promise<any>);
+  if (err) {
+    row.status = row.status === "0" ? "1" : "0";
+  } else {
+    await changePackageStatus(row.packageId, row.status);
+    proxy?.$modal.msgSuccess(text + "成功");
+  }
+};
 
 // 取消按钮
 const cancel = () => {
-    reset();
-    dialog.visible = false;
-}
+  reset();
+  dialog.visible = false;
+};
 
 // 表单重置
 const reset = () => {
-    menuTreeRef.value.setCheckedKeys([]);
-    menuExpand.value = false;
-    menuNodeAll.value = false;
-    form.value = {...initFormData};
-    tenantPackageFormRef.value.resetFields();
-}
+  menuTreeRef.value?.setCheckedKeys([]);
+  menuExpand.value = false;
+  menuNodeAll.value = false;
+  form.value = { ...initFormData };
+  tenantPackageFormRef.value?.resetFields();
+};
 
 /** 搜索按钮操作 */
 const handleQuery = () => {
-    queryParams.value.pageNum = 1;
-    getList();
-}
+  queryParams.value.pageNum = 1;
+  getList();
+};
 
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
-    handleQuery();
-}
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
 
 // 多选框选中数据
 const handleSelectionChange = (selection: TenantPkgVO[]) => {
-    ids.value = selection.map(item => item.packageId);
-    single.value = selection.length != 1;
-    multiple.value = !selection.length;
-}
+  ids.value = selection.map(item => item.packageId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
 
 // 树权限(展开/折叠)
 const handleCheckedTreeExpand = (value: CheckboxValueType, type: string) => {
-    if (type == 'menu') {
-        let treeList = menuOptions.value;
-        for (let i = 0; i < treeList.length; i++) {
-            menuTreeRef.value.store.nodesMap[treeList[i].id].expanded = value;
-        }
+  if (type == "menu") {
+    let treeList = menuOptions.value;
+    for (let i = 0; i < treeList.length; i++) {
+      if (menuTreeRef.value) {
+        menuTreeRef.value.store.nodesMap[treeList[i].id].expanded = value as boolean;
+      }
     }
-}
+  }
+};
 
 // 树权限(全选/全不选)
 const handleCheckedTreeNodeAll = (value: CheckboxValueType, type: string) => {
-    if (type == 'menu') {
-        menuTreeRef.value.setCheckedNodes(value ? menuOptions.value: []);
-    }
-}
+  if (type == "menu") {
+    menuTreeRef.value?.setCheckedNodes(value ? menuOptions.value as any : []);
+  }
+};
 
 // 树权限(父子联动)
 const handleCheckedTreeConnect = (value: CheckboxValueType, type: string) => {
-    if (type == 'menu') {
-        form.value.menuCheckStrictly = value as boolean;
-    }
-}
+  if (type == "menu") {
+    form.value.menuCheckStrictly = value as boolean;
+  }
+};
 
 /** 新增按钮操作 */
 const handleAdd = () => {
-    dialog.visible = true;
-    dialog.title = "添加租户套餐";
-    nextTick(() => {
-        reset();
-        getMenuTreeselect();
-    })
-}
+  dialog.visible = true;
+  dialog.title = "添加租户套餐";
+  nextTick(() => {
+    reset();
+    getMenuTreeselect();
+  });
+};
 
 /** 修改按钮操作 */
 const handleUpdate = (row?: TenantPkgVO) => {
-    loading.value = true
-    dialog.visible = true;
-    dialog.title = "修改租户套餐";
-    nextTick(async () => {
-        reset();
-        const _packageId = row?.packageId || ids.value[0];
-        const packageMenu = getPackageMenuTreeselect(_packageId);
-        const response = await getTenantPackage(_packageId);
-        loading.value = false;
-        form.value = response.data;
-        nextTick(async () => {
-            const res = await packageMenu;
-            let checkedKeys = res.data.checkedKeys
-            checkedKeys.forEach((v) => {
-                nextTick(() => {
-                    menuTreeRef.value.setChecked(v, true ,false);
-                })
-            })
+  loading.value = true;
+  dialog.visible = true;
+  dialog.title = "修改租户套餐";
+  nextTick(async () => {
+    reset();
+    const _packageId = row?.packageId || ids.value[0];
+    const packageMenu = getPackageMenuTreeselect(_packageId);
+    const response = await getTenantPackage(_packageId);
+    loading.value = false;
+    form.value = response.data;
+    await nextTick(async () => {
+      const res = await packageMenu;
+      let checkedKeys = res.data.checkedKeys;
+      checkedKeys.forEach((v) => {
+        nextTick(() => {
+          menuTreeRef.value?.setChecked(v, true, false);
         });
-    })
-}
+      });
+    });
+  });
+};
 
 /** 提交按钮 */
 const submitForm = () => {
-    tenantPackageFormRef.value.validate(async (valid: boolean) => {
-        if (valid) {
-            buttonLoading.value = true;
-            form.value.menuIds = getMenuAllCheckedKeys();
-            if (form.value.packageId != null) {
-                await updateTenantPackage(form.value).finally(() => buttonLoading.value = false);
-            } else {
-                await addTenantPackage(form.value).finally(() => buttonLoading.value = false);
-            }
-            proxy?.$modal.msgSuccess("操作成功");
-            dialog.visible = false;
-            getList();
-        }
-    });
-}
+  tenantPackageFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      form.value.menuIds = getMenuAllCheckedKeys();
+      if (form.value.packageId != null) {
+        await updateTenantPackage(form.value).finally(() => buttonLoading.value = false);
+      } else {
+        await addTenantPackage(form.value).finally(() => buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
 
 /** 删除按钮操作 */
 const handleDelete = async (row?: TenantPkgVO) => {
-    const _packageIds = row?.packageId || ids.value;
-    await proxy?.$modal.confirm('是否确认删除租户套餐编号为"' + _packageIds + '"的数据项?').finally(() => {
-        loading.value = false;
-    });
-    await delTenantPackage(_packageIds);
-    loading.value = true;
-    getList();
-    proxy?.$modal.msgSuccess("删除成功");
-}
+  const _packageIds = row?.packageId || ids.value;
+  await proxy?.$modal.confirm("是否确认删除租户套餐编号为\"" + _packageIds + "\"的数据项?").finally(() => {
+    loading.value = false;
+  });
+  await delTenantPackage(_packageIds);
+  loading.value = true;
+  await getList();
+  proxy?.$modal.msgSuccess("删除成功");
+};
 
 /** 导出按钮操作 */
 const handleExport = () => {
-    proxy?.download('system/tenantPackage/export', {
-        ...queryParams.value
-    }, `tenantPackage_${new Date().getTime()}.xlsx`)
-}
+  proxy?.download("system/tenantPackage/export", {
+    ...queryParams.value
+  }, `tenantPackage_${new Date().getTime()}.xlsx`);
+};
 
 onMounted(() => {
-    getList();
-})
+  getList();
+});
 </script>

+ 39 - 39
src/views/system/user/authRole.vue

@@ -55,11 +55,10 @@
 </template>
 
 <script setup name="AuthRole" lang="ts">
-import { RoleVO } from '@/api/system/role/types';
-import { getAuthRole, updateAuthRole } from '@/api/system/user';
-import { UserForm } from '@/api/system/user/types';
-import { ElTable } from "element-plus";
-import { ComponentInternalInstance } from 'vue';
+import { RoleVO } from "@/api/system/role/types";
+import { getAuthRole, updateAuthRole } from "@/api/system/user";
+import { UserForm } from "@/api/system/user/types";
+
 const route = useRoute();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
@@ -70,58 +69,59 @@ const pageSize = ref(10);
 const roleIds = ref<Array<string | number>>([]);
 const roles = ref<RoleVO[]>([]);
 const form = ref<Partial<UserForm>>({
-    nickName: undefined,
-    userName: '',
-    userId: undefined
+  nickName: undefined,
+  userName: "",
+  userId: undefined
 });
 
-const tableRef = ref(ElTable)
+const tableRef = ref<ElTableInstance>();
 
 /** 单击选中行数据 */
 const clickRow = (row: RoleVO) => {
-    tableRef.value.toggleRowSelection(row);
+  // ele的方法有问题,selected应该为可选参数
+  tableRef.value?.toggleRowSelection(row);
 };
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: RoleVO[]) => {
-    roleIds.value = selection.map(item => item.roleId);
+  roleIds.value = selection.map(item => item.roleId);
 };
 /** 保存选中的数据编号 */
 const getRowKey = (row: RoleVO): string => {
-    return String(row.roleId);
+  return String(row.roleId);
 };
 /** 关闭按钮 */
 const close = () => {
-    const obj = { path: "/system/user" };
-    proxy?.$tab.closeOpenPage(obj);
+  const obj = { path: "/system/user" };
+  proxy?.$tab.closeOpenPage(obj);
 };
 /** 提交按钮 */
 const submitForm = async () => {
-    const userId = form.value.userId;
-    const rIds = roleIds.value.join(",");
-    await updateAuthRole({ userId: userId as string, roleIds: rIds })
-    proxy?.$modal.msgSuccess("授权成功");
-    close();
+  const userId = form.value.userId;
+  const rIds = roleIds.value.join(",");
+  await updateAuthRole({ userId: userId as string, roleIds: rIds });
+  proxy?.$modal.msgSuccess("授权成功");
+  close();
 };
 
-const getList = async() => {
-    const userId = route.params && route.params.userId;
-    if (userId) {
-        loading.value = true;
-        const res = await getAuthRole(userId as string);
-        Object.assign(form.value, res.data.user)
-        Object.assign(roles.value, res.data.roles)
-        total.value = roles.value.length;
-        await nextTick(() => {
-            roles.value.forEach(row => {
-                if (row?.flag) {
-                    tableRef.value.toggleRowSelection(row);
-                }
-            });
-        });
-        loading.value = false;
-    }
-}
+const getList = async () => {
+  const userId = route.params && route.params.userId;
+  if (userId) {
+    loading.value = true;
+    const res = await getAuthRole(userId as string);
+    Object.assign(form.value, res.data.user);
+    Object.assign(roles.value, res.data.roles);
+    total.value = roles.value.length;
+    await nextTick(() => {
+      roles.value.forEach(row => {
+        if (row?.flag) {
+          tableRef.value?.toggleRowSelection(row, true);
+        }
+      });
+    });
+    loading.value = false;
+  }
+};
 onMounted(() => {
-    getList();
-})
+  getList();
+});
 </script>

+ 23 - 34
src/views/system/user/index.vue

@@ -297,30 +297,19 @@
 </template>
 
 <script setup name="User" lang="ts">
-import {
-    changeUserStatus,
-    listUser,
-    resetUserPwd,
-    delUser,
-    getUser,
-    updateUser,
-    addUser,
-    deptTreeSelect
-} from "@/api/system/user"
+import api from "@/api/system/user"
 import { UserForm, UserQuery, UserVO } from '@/api/system/user/types';
-import { ComponentInternalInstance } from "vue";
 import { getToken } from "@/utils/auth";
 import { treeselect } from "@/api/system/dept";
 import { DeptVO } from "@/api/system/dept/types";
 import { RoleVO } from "@/api/system/role/types";
 import { PostVO } from "@/api/system/post/types";
-import { DateModelType, ElTree, ElUpload, UploadFile, ElForm } from 'element-plus';
 import { to } from "await-to-js";
+
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance
 const { sys_normal_disable, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex'));
 
-
 const userList = ref<UserVO[]>();
 const loading = ref(true);
 const showSearch = ref(true)
@@ -361,10 +350,10 @@ const columns = ref<FieldOption[]>([
 ])
 
 
-const deptTreeRef = ref(ElTree);
-const queryFormRef = ref(ElForm);
-const userFormRef = ref(ElForm);
-const uploadRef = ref(ElUpload);
+const deptTreeRef = ref<ElTreeInstance>();
+const queryFormRef = ref<ElFormInstance>();
+const userFormRef = ref<ElFormInstance>();
+const uploadRef = ref<ElUploadInstance>();
 
 const dialog = reactive<DialogOption>({
     visible: false,
@@ -413,7 +402,7 @@ const filterNode = (value: string, data: any) => {
 }
 /** 根据名称筛选部门树 */
 watchEffect(
-    () => {deptTreeRef.value.filter(deptName.value);},
+    () => {deptTreeRef.value?.filter(deptName.value);},
     {
         flush: 'post' // watchEffect会在DOM挂载或者更新之前就会触发,此属性控制在DOM元素更新后运行
     }
@@ -421,14 +410,14 @@ watchEffect(
 
 /** 查询部门下拉树结构 */
 const getTreeSelect = async () => {
-    const res = await deptTreeSelect();
+    const res = await api.deptTreeSelect();
     deptOptions.value = res.data;
 };
 
 /** 查询用户列表 */
 const getList = async () => {
     loading.value = true;
-    const res = await listUser(proxy?.addDateRange(queryParams.value, dateRange.value));
+    const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value));
     loading.value = false;
     userList.value = res.rows;
     total.value = res.total;
@@ -449,10 +438,10 @@ const handleQuery = () => {
 /** 重置按钮操作 */
 const resetQuery = () => {
     dateRange.value = ['','']
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     queryParams.value.pageNum = 1;
     queryParams.value.deptId = undefined;
-    deptTreeRef.value.setCurrentKey(null);
+    deptTreeRef.value?.setCurrentKey(undefined);
     handleQuery();
 }
 
@@ -461,7 +450,7 @@ const handleDelete = async (row?: UserVO) => {
     const userIds = row?.userId || ids.value;
     const [err] = await to(proxy?.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?') as any);
     if (!err) {
-        await delUser(userIds);
+        await api.delUser(userIds);
         await getList();
         proxy?.$modal.msgSuccess("删除成功");
     }
@@ -472,7 +461,7 @@ const handleStatusChange = async (row: UserVO) => {
     let text = row.status === "0" ? "启用" : "停用"
     try {
         await proxy?.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?');
-        await changeUserStatus(row.userId, row.status);
+        await api.changeUserStatus(row.userId, row.status);
         proxy?.$modal.msgSuccess(text + "成功");
     } catch (err) {
         row.status = row.status === "0" ? "1" : "0";
@@ -494,7 +483,7 @@ const handleResetPwd = async (row: UserVO) => {
         inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
     }))
     if (!err) {
-        await resetUserPwd(row.userId, res.value);
+        await api.resetUserPwd(row.userId, res.value);
         proxy?.$modal.msgSuccess("修改成功,新密码是:" + res.value);
     }
 }
@@ -531,14 +520,14 @@ const handleFileUploadProgress = () => {
 const handleFileSuccess = (response: any, file: UploadFile) => {
     upload.open = false;
     upload.isUploading = false;
-    uploadRef.value.handleRemove(file);
+    uploadRef.value?.handleRemove(file);
     ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
     getList();
 }
 
 /** 提交上传文件 */
 function submitFileForm() {
-    uploadRef.value.submit();
+    uploadRef.value?.submit();
 }
 
 /** 初始化部门数据 */
@@ -554,7 +543,7 @@ const initTreeData = async () => {
 /** 重置操作表单 */
 const reset = () => {
     form.value = { ...initFormData };
-    userFormRef.value.resetFields();
+    userFormRef.value?.resetFields();
 }
 /** 取消按钮 */
 const cancel = () => {
@@ -569,7 +558,7 @@ const handleAdd = () => {
     nextTick(async () => {
         reset();
         await initTreeData();
-        const { data } = await getUser();
+        const { data } = await api.getUser();
         postOptions.value = data.posts;
         roleOptions.value = data.roles;
         form.value.password = initPassword.value;
@@ -583,7 +572,7 @@ const handleUpdate = (row?: UserForm) => {
         reset();
         await initTreeData();
         const userId = row?.userId || ids.value[0]
-        const { data } = await getUser(userId)
+        const { data } = await api.getUser(userId)
         Object.assign(form.value, data.user);
         postOptions.value = data.posts;
         roleOptions.value = data.roles;
@@ -596,9 +585,9 @@ const handleUpdate = (row?: UserForm) => {
 
 /** 提交按钮 */
 const submitForm = () => {
-    userFormRef.value.validate(async (valid: boolean) => {
+    userFormRef.value?.validate(async (valid: boolean) => {
         if (valid) {
-            form.value.userId ? await updateUser(form.value) : await addUser(form.value);
+            form.value.userId ? await api.updateUser(form.value) : await api.addUser(form.value);
             proxy?.$modal.msgSuccess("操作成功");
             dialog.visible = false;
             await getList();
@@ -619,8 +608,8 @@ const closeDialog = () => {
  * 重置表单
  */
 const resetForm = () => {
-    userFormRef.value.resetFields();
-    userFormRef.value.clearValidate();
+    userFormRef.value?.resetFields();
+    userFormRef.value?.clearValidate();
 
     form.value.id = undefined;
     form.value.status = '1';

+ 1 - 1
src/views/system/user/profile/index.vue

@@ -69,7 +69,7 @@ import resetPwd from "./resetPwd.vue";
 import { getUserProfile } from "@/api/system/user";
 
 const activeTab = ref("userinfo");
-const state = ref<{ user: any; roleGroup: string;  postGroup: string}>({
+const state = ref<Record<string, any>>({
     user: {},
     roleGroup: '',
     postGroup: ''

+ 30 - 26
src/views/system/user/profile/resetPwd.vue

@@ -17,46 +17,50 @@
 </template>
 
 <script setup lang="ts">
-import { updateUserPwd } from '@/api/system/user';
-import { ComponentInternalInstance } from 'vue';
-import { ResetPwdForm } from '@/api/system/user/types'
-import { ElForm } from 'element-plus';
+import { updateUserPwd } from "@/api/system/user";
+import type { ResetPwdForm } from "@/api/system/user/types";
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-
-
-const pwdRef = ref(ElForm);
-
+const pwdRef = ref<ElFormInstance>();
 const user = ref<ResetPwdForm>({
-    oldPassword: '',
-    newPassword: '',
-    confirmPassword: ''
+  oldPassword: "",
+  newPassword: "",
+  confirmPassword: ""
 });
 
 const equalToPassword = (rule: any, value: string, callback: any) => {
-    if (user.value.newPassword !== value) {
-        callback(new Error("两次输入的密码不一致"));
-    } else {
-        callback();
-    }
+  if (user.value.newPassword !== value) {
+    callback(new Error("两次输入的密码不一致"));
+  } else {
+    callback();
+  }
 };
 const rules = ref({
-    oldPassword: [{ required: true, message: "旧密码不能为空", trigger: "blur" }],
-    newPassword: [{ required: true, message: "新密码不能为空", trigger: "blur" }, { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }],
-    confirmPassword: [{ required: true, message: "确认密码不能为空", trigger: "blur" }, { required: true, validator: equalToPassword, trigger: "blur" }]
+  oldPassword: [{ required: true, message: "旧密码不能为空", trigger: "blur" }],
+  newPassword: [{ required: true, message: "新密码不能为空", trigger: "blur" }, {
+    min: 6,
+    max: 20,
+    message: "长度在 6 到 20 个字符",
+    trigger: "blur"
+  }],
+  confirmPassword: [{ required: true, message: "确认密码不能为空", trigger: "blur" }, {
+    required: true,
+    validator: equalToPassword,
+    trigger: "blur"
+  }]
 });
 
 /** 提交按钮 */
 const submit = () => {
-    pwdRef.value.validate(async (valid: boolean) => {
-        if (valid) {
-            await updateUserPwd(user.value.oldPassword, user.value.newPassword)
-            proxy?.$modal.msgSuccess("修改成功");
-        }
-    });
+  pwdRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      await updateUserPwd(user.value.oldPassword, user.value.newPassword);
+      proxy?.$modal.msgSuccess("修改成功");
+    }
+  });
 };
 /** 关闭按钮 */
 const close = () => {
-    proxy?.$tab.closePage();
+  proxy?.$tab.closePage();
 };
 </script>

+ 61 - 59
src/views/system/user/profile/userAvatar.vue

@@ -29,7 +29,9 @@
           <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
             <el-button>
               选择
-              <el-icon class="el-icon--right"><Upload /></el-icon>
+              <el-icon class="el-icon--right">
+                <Upload />
+              </el-icon>
             </el-button>
           </el-upload>
         </el-col>
@@ -58,18 +60,17 @@ import "vue-cropper/dist/index.css";
 import { VueCropper } from "vue-cropper";
 import { uploadAvatar } from "@/api/system/user";
 import useUserStore from "@/store/modules/user";
-import { ComponentInternalInstance } from "vue";
 
 interface Options {
-    img: string | ArrayBuffer | null // 裁剪图片的地址
-    autoCrop: boolean // 是否默认生成截图框
-    autoCropWidth: number // 默认生成截图框宽度
-    autoCropHeight: number // 默认生成截图框高度
-    fixedBox: boolean // 固定截图框大小 不允许改变
-    fileName: string
-    previews: any // 预览数据
-    outputType: string
-    visible: boolean
+  img: string | ArrayBuffer | null; // 裁剪图片的地址
+  autoCrop: boolean; // 是否默认生成截图框
+  autoCropWidth: number; // 默认生成截图框宽度
+  autoCropHeight: number; // 默认生成截图框高度
+  fixedBox: boolean; // 固定截图框大小 不允许改变
+  fileName: string;
+  previews: any; // 预览数据
+  outputType: string;
+  visible: boolean;
 }
 
 
@@ -83,75 +84,76 @@ const title = ref("修改头像");
 const cropper = ref<any>({});
 //图片裁剪数据
 const options = reactive<Options>({
-    img: userStore.avatar,
-    autoCrop: true,
-    autoCropWidth: 200,
-    autoCropHeight: 200,
-    fixedBox: true,
-    outputType: "png",
-    fileName: '',
-    previews: {},
-    visible: false
+  img: userStore.avatar,
+  autoCrop: true,
+  autoCropWidth: 200,
+  autoCropHeight: 200,
+  fixedBox: true,
+  outputType: "png",
+  fileName: "",
+  previews: {},
+  visible: false
 });
 
 /** 编辑头像 */
 const editCropper = () => {
-    open.value = true;
-}
+  open.value = true;
+};
 /** 打开弹出层结束时的回调 */
 const modalOpened = () => {
-    visible.value = true;
-}
+  visible.value = true;
+};
 /** 覆盖默认上传行为 */
-const requestUpload = (): any => {}
+const requestUpload = (): any => {
+};
 /** 向左旋转 */
 const rotateLeft = () => {
-    cropper.value.rotateLeft();
-}
+  cropper.value.rotateLeft();
+};
 /** 向右旋转 */
 const rotateRight = () => {
-    cropper.value.rotateRight();
-}
+  cropper.value.rotateRight();
+};
 /** 图片缩放 */
 const changeScale = (num: number) => {
-    num = num || 1;
-    cropper.value.changeScale(num);
-}
+  num = num || 1;
+  cropper.value.changeScale(num);
+};
 /** 上传预处理 */
 const beforeUpload = (file: any) => {
-    if (file.type.indexOf("image/") == -1) {
-        proxy?.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
-    } else {
-        const reader = new FileReader();
-        reader.readAsDataURL(file);
-        reader.onload = () => {
-            options.img = reader.result;
-            options.fileName = file.name;
-        };
-    }
-}
+  if (file.type.indexOf("image/") == -1) {
+    proxy?.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
+  } else {
+    const reader = new FileReader();
+    reader.readAsDataURL(file);
+    reader.onload = () => {
+      options.img = reader.result;
+      options.fileName = file.name;
+    };
+  }
+};
 /** 上传图片 */
 const uploadImg = async () => {
-    cropper.value.getCropBlob(async (data: any) => {
-        let formData = new FormData();
-        formData.append("avatarfile", data, options.fileName);
-        const res = await uploadAvatar(formData);
-        open.value = false;
-        options.img = res.data.imgUrl;
-        userStore.avatar = options.img as string;
-        proxy?.$modal.msgSuccess("修改成功");
-        visible.value = false;
-    });
-}
+  cropper.value.getCropBlob(async (data: any) => {
+    let formData = new FormData();
+    formData.append("avatarfile", data, options.fileName);
+    const res = await uploadAvatar(formData);
+    open.value = false;
+    options.img = res.data.imgUrl;
+    userStore.avatar = options.img as string
+    proxy?.$modal.msgSuccess("修改成功");
+    visible.value = false;
+  });
+};
 /** 实时预览 */
 const realTime = (data: any) => {
-    options.previews = data;
-}
+  options.previews = data;
+};
 /** 关闭窗口 */
 const closeDialog = () => {
-    options.img = userStore.avatar;
-    options.visible = false;
-}
+  options.img = userStore.avatar;
+  options.visible = false;
+};
 </script>
 
 <style lang="scss" scoped>

+ 24 - 22
src/views/system/user/profile/userInfo.vue

@@ -24,40 +24,42 @@
 
 <script setup lang="ts">
 import { updateUserProfile } from "@/api/system/user";
-import { FormRules } from "element-plus";
-import { ComponentInternalInstance } from "vue";
-import { PropType } from "vue";
-import { ElForm } from "element-plus";
 
 const props = defineProps({
-    user: {
-        type: Object as PropType<any>,
-    }
+  user: {
+    type: Object as PropType<any>,
+    required: true
+  }
 });
 const userForm = computed(() => props.user);
-
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-
-const userRef = ref(ElForm);
-
-const rules = ref<FormRules>({
-    nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
-    email: [{ required: true, message: "邮箱地址不能为空", trigger: "blur" }, { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
-    phonenumber: [{ required: true, message: "手机号码不能为空", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }],
+const userRef = ref<ElFormInstance>();
+const rules = ref<ElFormRules>({
+  nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
+  email: [{ required: true, message: "邮箱地址不能为空", trigger: "blur" }, {
+    type: "email",
+    message: "请输入正确的邮箱地址",
+    trigger: ["blur", "change"]
+  }],
+  phonenumber: [{
+    required: true,
+    message: "手机号码不能为空",
+    trigger: "blur"
+  }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
 });
 
 
 /** 提交按钮 */
 const submit = () => {
-    userRef.value.validate(async (valid: boolean) => {
-        if (valid) {
-            await updateUserProfile(props.user)
-            proxy?.$modal.msgSuccess("修改成功");
-        }
-    });
+  userRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      await updateUserProfile(props.user);
+      proxy?.$modal.msgSuccess("修改成功");
+    }
+  });
 };
 /** 关闭按钮 */
 const close = () => {
-    proxy?.$tab.closePage();
+  proxy?.$tab.closePage();
 };
 </script>

+ 2 - 7
src/views/tool/gen/basicInfoForm.vue

@@ -31,15 +31,10 @@
 </template>
 
 <script setup lang="ts">
-import { PropType } from 'vue';
+import { propTypes } from "@/utils/propTypes";
 
 const prop = defineProps({
-    info: {
-        type: Object as PropType<any>,
-        default: () => {
-            return {};
-        }
-    }
+    info: propTypes.any.def({})
 });
 
 const infoForm = computed(() => prop.info)

+ 4 - 5
src/views/tool/gen/editTable.vue

@@ -117,9 +117,8 @@ import { getGenTable, updateGenTable } from '@/api/tool/gen';
 import { DbColumnVO, DbTableVO } from '@/api/tool/gen/types';
 import { optionselect as getDictOptionselect } from '@/api/system/dict/type';
 import { DictTypeVO } from '@/api/system/dict/type/types';
-import basicInfoForm from './basicInfoForm.vue';
-import genInfoForm from "./genInfoForm.vue";
-import { ComponentInternalInstance } from "vue";
+import BasicInfoForm from './basicInfoForm.vue';
+import GenInfoForm from "./genInfoForm.vue";
 
 const route = useRoute();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -131,8 +130,8 @@ const columns = ref<DbColumnVO[]>([]);
 const dictOptions = ref<DictTypeVO[]>([]);
 const info = ref<Partial<DbTableVO>>({});
 
-const basicInfo = ref(basicInfoForm);
-const genInfo = ref(genInfoForm);
+const basicInfo = ref<InstanceType<typeof BasicInfoForm>>();
+const genInfo = ref<InstanceType<typeof GenInfoForm>>();
 
 /** 提交按钮 */
 const submitForm = () => {

+ 4 - 10
src/views/tool/gen/genInfoForm.vue

@@ -223,7 +223,7 @@
 
 <script setup lang="ts">
 import { listMenu } from '@/api/system/menu';
-import { ComponentInternalInstance, PropType } from 'vue';
+import { propTypes } from "@/utils/propTypes";
 
 interface MenuOptionsType {
   menuId: number | string;
@@ -236,14 +236,8 @@ const menuOptions = ref<Array<MenuOptionsType>>([]);
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 const props = defineProps({
-  info: {
-    type: Object as PropType<any>,
-    default: null
-  },
-  tables: {
-    type: Array as PropType<any[]>,
-    default: null
-  }
+  info: propTypes.any.def(null),
+  tables: propTypes.any.def(null)
 });
 
 const infoForm = computed(() => props.info);
@@ -268,7 +262,7 @@ const tplSelectChange = (value: string) => {
   }
 }
 const setSubTableColumns = (value: string) => {
-  table.value.forEach(item => {
+  table.value.forEach((item: any) => {
     const name = item.tableName;
     if (value === name) {
       subColumns.value = item.columns;

+ 10 - 11
src/views/tool/gen/importTable.vue

@@ -3,11 +3,11 @@
   <el-dialog title="导入表" v-model="visible" width="1100px" top="5vh" append-to-body>
     <el-form :model="queryParams" ref="queryFormRef" :inline="true">
       <el-form-item label="数据源" prop="dataName">
-            <el-select v-model="queryParams.dataName" filterable placeholder="请选择/输入数据源名称" style="width: 200px">
-              <el-option v-for="item in dataNameList" :key="item" :label="item" :value="item"> </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="表名称" prop="tableName">
+        <el-select v-model="queryParams.dataName" filterable placeholder="请选择/输入数据源名称" style="width: 200px">
+          <el-option v-for="item in dataNameList" :key="item" :label="item" :value="item"> </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="表名称" prop="tableName">
         <el-input v-model="queryParams.tableName" placeholder="请输入表名称" clearable @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item label="表描述" prop="tableComment">
@@ -40,8 +40,6 @@
 <script setup lang="ts">
 import { listDbTable, importTable, getDataNames } from '@/api/tool/gen';
 import { DbTableQuery, DbTableVO } from '@/api/tool/gen/types';
-import { ComponentInternalInstance } from 'vue';
-import { ElTable, ElForm } from 'element-plus';
 
 const total = ref(0);
 const visible = ref(false);
@@ -49,8 +47,8 @@ const tables = ref<Array<string>>([]);
 const dbTableList = ref<Array<DbTableVO>>([]);
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
-const tableRef = ref(ElTable);
-const queryFormRef = ref(ElForm);
+const tableRef = ref<ElTableInstance>();
+const queryFormRef = ref<ElFormInstance>();
 
 const queryParams = reactive<DbTableQuery>({
     pageNum: 1,
@@ -76,7 +74,8 @@ const show = (dataName: string) => {
 }
 /** 单击选择行 */
 const clickRow = (row: DbTableVO) => {
-    tableRef.value.toggleRowSelection(row);
+    // ele bug
+    tableRef.value?.toggleRowSelection(row);
 }
 /** 多选框选中数据 */
 const handleSelectionChange = (selection: DbTableVO[]) => {
@@ -95,7 +94,7 @@ const handleQuery = () => {
 }
 /** 重置按钮操作 */
 const resetQuery = () => {
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /** 导入按钮操作 */

+ 5 - 7
src/views/tool/gen/index.vue

@@ -116,9 +116,7 @@
 import { listTable, previewTable, delTable, genCode, synchDb, getDataNames } from '@/api/tool/gen';
 import { TableQuery, TableVO } from '@/api/tool/gen/types';
 import router from '@/router';
-import importTable from './importTable.vue';
-import { ComponentInternalInstance } from 'vue';
-import { ElForm, DateModelType } from 'element-plus';
+import ImportTable from './importTable.vue';
 
 const route = useRoute();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -134,8 +132,8 @@ const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
 const uniqueId = ref("");
 const dataNameList = ref<Array<string>>([]);
 
-const queryFormRef = ref(ElForm);
-const importRef = ref(importTable);
+const queryFormRef = ref<ElFormInstance>();
+const importRef = ref<InstanceType<typeof ImportTable>>();
 
 const queryParams = ref<TableQuery>({
     pageNum: 1,
@@ -160,7 +158,7 @@ onActivated(() => {
         uniqueId.value = time as string;
         queryParams.value.pageNum = Number(route.query.pageNum);
         dateRange.value = ['', ''];
-        queryFormRef.value.resetFields();
+        queryFormRef.value?.resetFields();
         getList();
     }
 })
@@ -212,7 +210,7 @@ const openImportTable = () => {
 /** 重置按钮操作 */
 const resetQuery = () => {
     dateRange.value = ['', ''];
-    queryFormRef.value.resetFields();
+    queryFormRef.value?.resetFields();
     handleQuery();
 }
 /** 预览按钮 */