update 修改页面代码 去除ele的引入以及vue的类型声明
| | |
| | | |
| | | <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']); |
| | |
| | | </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> |
| | |
| | | <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; |
| | | |
| | |
| | | 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, |
| | |
| | | value: undefined, |
| | | } |
| | | const data = reactive<PageData<DemoForm, DemoQuery>>({ |
| | | form: {...initFormData}, |
| | | form: { ...initFormData }, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | |
| | | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = {...initFormData}; |
| | | demoFormRef.value.resetFields(); |
| | | form.value = { ...initFormData }; |
| | | demoFormRef.value?.resetFields(); |
| | | } |
| | | |
| | | /** 搜索按钮操作 */ |
| | |
| | | |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | |
| | |
| | | |
| | | /** 提交按钮 */ |
| | | 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; |
| | |
| | | <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 = { |
| | |
| | | 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, |
| | |
| | | // 表单重置 |
| | | const reset = () => { |
| | | form.value = {...initFormData} |
| | | treeFormRef.value.resetFields(); |
| | | treeFormRef.value?.resetFields(); |
| | | } |
| | | |
| | | /** 搜索按钮操作 */ |
| | |
| | | |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | |
| | |
| | | /** 展开/折叠操作 */ |
| | | 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) |
| | | }) |
| | | } |
| | |
| | | |
| | | /** 提交按钮 */ |
| | | const submitForm = () => { |
| | | treeFormRef.value.validate(async (valid: boolean) => { |
| | | treeFormRef.value?.validate(async (valid: boolean) => { |
| | | if (valid) { |
| | | buttonLoading.value = true; |
| | | if (form.value.id) { |
| | |
| | | } |
| | | proxy?.$modal.msgSuccess("操作成功"); |
| | | dialog.visible = false; |
| | | getList(); |
| | | await getList(); |
| | | } |
| | | }); |
| | | } |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import errImage from '@/assets/401_images/401.gif'; |
| | | import { ComponentInternalInstance } from "vue"; |
| | | |
| | | let { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | |
| | | 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(); |
| | |
| | | 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: '请输入您的密码' }], |
| | |
| | | <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(); |
| | |
| | | |
| | | <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")); |
| | |
| | | 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, |
| | |
| | | /** 重置按钮操作 */ |
| | | 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[]) => { |
| | |
| | | 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("清空成功"); |
| | | } |
| | | /** 解锁按钮操作 */ |
| | |
| | | |
| | | <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; |
| | |
| | | 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> |
| | |
| | | <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> |
| | |
| | | |
| | | <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); |
| | |
| | | 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> |
| | |
| | | <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(); |
| | |
| | | } |
| | | }; |
| | | |
| | | const registerRules: FormRules = { |
| | | const registerRules: ElFormRules = { |
| | | tenantId: [ |
| | | { required: true, trigger: "blur", message: "请输入您的租户编号" } |
| | | ], |
| | |
| | | <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")); |
| | |
| | | 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> |
| | |
| | | |
| | | <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; |
| | |
| | | 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, |
| | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = {...initFormData}; |
| | | deptFormRef.value.resetFields(); |
| | | deptFormRef.value?.resetFields(); |
| | | } |
| | | |
| | | /** 搜索按钮操作 */ |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery() |
| | | } |
| | | /** 新增按钮操作 */ |
| | |
| | | /** 展开/折叠所有 */ |
| | | 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) |
| | | }) |
| | | } |
| | |
| | | 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(); |
| | | } |
| | | }) |
| | | } |
| | |
| | | const handleDelete = async (row: DeptVO) => { |
| | | await proxy?.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?'); |
| | | await delDept(row.deptId); |
| | | getList(); |
| | | await getList(); |
| | | proxy?.$modal.msgSuccess("删除成功"); |
| | | } |
| | | |
| | |
| | | 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")); |
| | |
| | | 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>({ |
| | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | dataFormRef.value.resetFields(); |
| | | dataFormRef.value?.resetFields(); |
| | | } |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | queryParams.value.dictType = defaultDictType.value; |
| | | handleQuery(); |
| | | } |
| | |
| | | } |
| | | /** 提交按钮 */ |
| | | 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(); |
| | | |
| | | } |
| | | }); |
| | |
| | | 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); |
| | | |
| | |
| | | <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")) |
| | |
| | | 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>({ |
| | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = {...initFormData}; |
| | | dictFormRef.value.resetFields(); |
| | | dictFormRef.value?.resetFields(); |
| | | } |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | dateRange.value = ['', '']; |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 新增按钮操作 */ |
| | |
| | | } |
| | | /** 提交按钮 */ |
| | | 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("操作成功"); |
| | |
| | | <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; |
| | |
| | | title: '' |
| | | }); |
| | | |
| | | const queryFormRef = ref(ElForm); |
| | | const menuFormRef = ref(ElForm); |
| | | const queryFormRef = ref<ElFormInstance>(); |
| | | const menuFormRef = ref<ElFormInstance>(); |
| | | const initFormData = { |
| | | path: '', |
| | | menuId: undefined, |
| | |
| | | }, |
| | | }) |
| | | |
| | | const menuTableRef = ref(ElTable); |
| | | const menuTableRef = ref<ElTableInstance>(); |
| | | |
| | | const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data) |
| | | /** 查询菜单列表 */ |
| | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | menuFormRef.value.resetFields(); |
| | | menuFormRef.value?.resetFields(); |
| | | } |
| | | |
| | | /** 搜索按钮操作 */ |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 新增按钮操作 */ |
| | |
| | | /** 展开/折叠所有 */ |
| | | 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) |
| | | }) |
| | | } |
| | |
| | | } |
| | | /** 提交按钮 */ |
| | | 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(); |
| | | } |
| | | }) |
| | | } |
| | |
| | | const handleDelete = async (row: MenuVO) => { |
| | | await proxy?.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?'); |
| | | await delMenu(row.menuId); |
| | | getList(); |
| | | await getList(); |
| | | proxy?.$modal.msgSuccess("删除成功"); |
| | | } |
| | | |
| | |
| | | |
| | | <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")); |
| | |
| | | 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>({ |
| | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | noticeFormRef.value.resetFields(); |
| | | noticeFormRef.value?.resetFields(); |
| | | } |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 多选框选中数据 */ |
| | |
| | | } |
| | | /** 提交按钮 */ |
| | | 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(); |
| | | } |
| | | }); |
| | | } |
| | |
| | | const noticeIds = row?.noticeId || ids.value |
| | | await proxy?.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?'); |
| | | await delNotice(noticeIds); |
| | | getList(); |
| | | await getList(); |
| | | proxy?.$modal.msgSuccess("删除成功"); |
| | | } |
| | | |
| | |
| | | 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 |
| | |
| | | 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, |
| | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | ossConfigFormRef.value.resetFields(); |
| | | ossConfigFormRef.value?.resetFields(); |
| | | } |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 选择条数 */ |
| | |
| | | } |
| | | /** 提交按钮 */ |
| | | const submitForm = () => { |
| | | ossConfigFormRef.value.validate(async (valid: boolean) => { |
| | | ossConfigFormRef.value?.validate(async (valid: boolean) => { |
| | | if (valid) { |
| | | buttonLoading.value = true; |
| | | if (form.value.ossConfigId) { |
| | |
| | | <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; |
| | |
| | | // 默认排序 |
| | | 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, |
| | |
| | | /** 表单重置 */ |
| | | function reset() { |
| | | form.value = { ...initFormData }; |
| | | ossFormRef.value.resetFields(); |
| | | ossFormRef.value?.resetFields(); |
| | | } |
| | | /** 搜索按钮操作 */ |
| | | 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(); |
| | |
| | | <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")); |
| | |
| | | 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, |
| | |
| | | /** 表单重置 */ |
| | | const reset = () => { |
| | | form.value = {...initFormData}; |
| | | postFormRef.value.resetFields(); |
| | | postFormRef.value?.resetFields(); |
| | | } |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 多选框选中数据 */ |
| | |
| | | } |
| | | /** 提交按钮 */ |
| | | 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(); |
| | | } |
| | | }); |
| | | } |
| | |
| | | const postIds = row?.postId || ids.value; |
| | | await proxy?.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?'); |
| | | await delPost(postIds); |
| | | getList(); |
| | | await getList(); |
| | | proxy?.$modal.msgSuccess("删除成功"); |
| | | } |
| | | /** 导出按钮操作 */ |
| | |
| | | </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> |
| | |
| | | <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(); |
| | |
| | | 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, |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery=() =>{ |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | // 多选框选中数据 |
| | |
| | | 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("取消授权成功"); |
| | | } |
| | | /** 批量取消授权按钮操作 */ |
| | |
| | | const uIds = userIds.value.join(","); |
| | | await proxy?.$modal.confirm("是否取消选中用户授权数据项?"); |
| | | await authUserCancelAll({ roleId: roleId, userIds: uIds }); |
| | | getList(); |
| | | await getList(); |
| | | proxy?.$modal.msgSuccess("取消授权成功"); |
| | | } |
| | | |
| | |
| | | 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; |
| | |
| | | { 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, |
| | |
| | | /** 重置 */ |
| | | const resetQuery = () => { |
| | | dateRange.value = ['', ''] |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /**删除按钮操作 */ |
| | |
| | | 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(); |
| | | |
| | | } |
| | | |
| | |
| | | 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查询菜单树结构 */ |
| | |
| | | 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 : []); |
| | | } |
| | | } |
| | | /** 树权限(父子联动) */ |
| | |
| | | } |
| | | } |
| | | /** 所有菜单节点数据 */ |
| | | 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); |
| | |
| | | /** 选择角色权限范围触发 */ |
| | | const dataScopeSelectChange = (value: string) => { |
| | | if (value !== "2") { |
| | | deptRef.value.setCheckedKeys([]) |
| | | deptRef.value?.setCheckedKeys([]) |
| | | } |
| | | } |
| | | /** 分配数据权限操作 */ |
| | |
| | | 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); |
| | | } |
| | | }) |
| | | }) |
| | | } |
| | | /** 提交按钮(数据权限) */ |
| | |
| | | } |
| | | /** 取消按钮(数据权限)*/ |
| | | const cancelDataScope = () => { |
| | | dataScopeRef.value.resetFields(); |
| | | dataScopeRef.value?.resetFields(); |
| | | form.value = {...initForm}; |
| | | openDataScope.value = false; |
| | | } |
| | |
| | | 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({ |
| | |
| | | phonenumber: undefined |
| | | }) |
| | | |
| | | const tableRef = ref(ElTable); |
| | | const queryFormRef = ref(ElForm); |
| | | const tableRef = ref<ElTableInstance>(); |
| | | const queryFormRef = ref<ElFormInstance>(); |
| | | |
| | | const show = () => { |
| | | queryParams.roleId = props.roleId; |
| | |
| | | * 选择行 |
| | | */ |
| | | const clickRow = (row: any) => { |
| | | tableRef.value.toggleRowSelection(row); |
| | | // ele的bug |
| | | tableRef.value?.toggleRowSelection(row); |
| | | } |
| | | /** 多选框选中数据 */ |
| | | const handleSelectionChange = (selection: UserVO[]) => { |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | getList(); |
| | | } |
| | | |
| | |
| | | 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; |
| | | |
| | |
| | | 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, |
| | |
| | | // 表单重置 |
| | | const reset = () => { |
| | | form.value = {...initFormData}; |
| | | tenantFormRef.value.resetFields(); |
| | | tenantFormRef.value?.resetFields(); |
| | | } |
| | | |
| | | /** 搜索按钮操作 */ |
| | |
| | | |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | |
| | |
| | | dialog.title = "修改租户"; |
| | | nextTick(async () => { |
| | | reset(); |
| | | getTenantPackage(); |
| | | await getTenantPackage(); |
| | | const _id = row?.id || ids.value[0]; |
| | | const res = await getTenant(_id); |
| | | loading.value = false; |
| | |
| | | |
| | | /** 提交按钮 */ |
| | | const submitForm = () => { |
| | | tenantFormRef.value.validate(async (valid: boolean) => { |
| | | tenantFormRef.value?.validate(async (valid: boolean) => { |
| | | if (valid) { |
| | | buttonLoading.value = true; |
| | | if (form.value.id) { |
| | |
| | | await proxy?.$modal.confirm('是否确认删除租户编号为"' + _ids + '"的数据项?') |
| | | loading.value = true; |
| | | await delTenant(_ids).finally(() => loading.value = false); |
| | | getList(); |
| | | await getList(); |
| | | proxy?.$modal.msgSuccess("删除成功"); |
| | | |
| | | |
| | |
| | | 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; |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | </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" |
| | |
| | | </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; |
| | |
| | | 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> |
| | |
| | | </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; |
| | | |
| | |
| | | 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> |
| | |
| | | </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 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, |
| | |
| | | } |
| | | /** 根据名称筛选部门树 */ |
| | | watchEffect( |
| | | () => {deptTreeRef.value.filter(deptName.value);}, |
| | | () => {deptTreeRef.value?.filter(deptName.value);}, |
| | | { |
| | | flush: 'post' // watchEffect会在DOM挂载或者更新之前就会触发,此属性控制在DOM元素更新后运行 |
| | | } |
| | |
| | | |
| | | /** 查询部门下拉树结构 */ |
| | | 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; |
| | |
| | | /** 重置按钮操作 */ |
| | | 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(); |
| | | } |
| | | |
| | |
| | | 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("删除成功"); |
| | | } |
| | |
| | | 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"; |
| | |
| | | inputErrorMessage: "用户密码长度必须介于 5 和 20 之间", |
| | | })) |
| | | if (!err) { |
| | | await resetUserPwd(row.userId, res.value); |
| | | await api.resetUserPwd(row.userId, res.value); |
| | | proxy?.$modal.msgSuccess("修改成功,新密码是:" + res.value); |
| | | } |
| | | } |
| | |
| | | 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(); |
| | | } |
| | | |
| | | /** 初始化部门数据 */ |
| | |
| | | /** 重置操作表单 */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | userFormRef.value.resetFields(); |
| | | userFormRef.value?.resetFields(); |
| | | } |
| | | /** 取消按钮 */ |
| | | const cancel = () => { |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | |
| | | /** 提交按钮 */ |
| | | 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(); |
| | |
| | | * 重置表单 |
| | | */ |
| | | const resetForm = () => { |
| | | userFormRef.value.resetFields(); |
| | | userFormRef.value.clearValidate(); |
| | | userFormRef.value?.resetFields(); |
| | | userFormRef.value?.clearValidate(); |
| | | |
| | | form.value.id = undefined; |
| | | form.value.status = '1'; |
| | |
| | | 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: '' |
| | |
| | | </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> |
| | |
| | | <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> |
| | |
| | | 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; |
| | | } |
| | | |
| | | |
| | |
| | | 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> |
| | |
| | | |
| | | <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> |
| | |
| | | </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) |
| | |
| | | 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; |
| | |
| | | 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 = () => { |
| | |
| | | |
| | | <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; |
| | |
| | | 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); |
| | |
| | | } |
| | | } |
| | | const setSubTableColumns = (value: string) => { |
| | | table.value.forEach(item => { |
| | | table.value.forEach((item: any) => { |
| | | const name = item.tableName; |
| | | if (value === name) { |
| | | subColumns.value = item.columns; |
| | |
| | | <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"> |
| | |
| | | <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); |
| | |
| | | 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, |
| | |
| | | } |
| | | /** 单击选择行 */ |
| | | const clickRow = (row: DbTableVO) => { |
| | | tableRef.value.toggleRowSelection(row); |
| | | // ele bug |
| | | tableRef.value?.toggleRowSelection(row); |
| | | } |
| | | /** 多选框选中数据 */ |
| | | const handleSelectionChange = (selection: DbTableVO[]) => { |
| | |
| | | } |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 导入按钮操作 */ |
| | |
| | | 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; |
| | |
| | | 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, |
| | |
| | | uniqueId.value = time as string; |
| | | queryParams.value.pageNum = Number(route.query.pageNum); |
| | | dateRange.value = ['', '']; |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | getList(); |
| | | } |
| | | }) |
| | |
| | | /** 重置按钮操作 */ |
| | | const resetQuery = () => { |
| | | dateRange.value = ['', '']; |
| | | queryFormRef.value.resetFields(); |
| | | queryFormRef.value?.resetFields(); |
| | | handleQuery(); |
| | | } |
| | | /** 预览按钮 */ |