Browse Source

代码优化

master
DX 2 weeks ago
parent
commit
48f4d9035b
  1. 6
      src/api/system/fileinfo/index.ts
  2. 62
      src/components/UploadFile/UploadFile.vue
  3. 12
      src/views/Login/Login.vue
  4. 12
      src/views/Login/components/QrCodeForm.vue
  5. 4
      src/views/enterpriseinspections/index.vue
  6. 6
      src/views/enterprises/index.vue
  7. 3
      src/views/enterprises/update.vue
  8. 46
      src/views/system/dept/DeptForm.vue
  9. 73
      src/views/system/dept/index.vue
  10. 21
      src/views/system/jobinfo/index.vue
  11. 26
      src/views/system/role/RoleForm.vue
  12. 126
      src/views/system/role/index.vue
  13. 114
      src/views/system/user/UserForm.vue
  14. 206
      src/views/system/user/index.vue
  15. 101
      src/views/task/create.vue
  16. 34
      src/views/task/detail.vue

6
src/api/system/fileinfo/index.ts

@ -0,0 +1,6 @@
import request from '@/config/axios'
// 删除文件
export const deleteFile = (id: number) => {
return request.delete({ url: '/system/file-info/deleteByInfraId?id=' + id })
}

62
src/components/UploadFile/UploadFile.vue

@ -0,0 +1,62 @@
<template>
<div>
<el-upload
:action="uploadUrl"
:limit="limit"
:on-exceed="handleExceed"
:on-success="handleSuccess"
:on-error="handleError"
:before-upload="beforeUpload"
:file-list="fileList"
:show-file-list="isShowTip"
>
<el-button type="primary">点击上传</el-button>
</el-upload>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
const props = defineProps({
modelValue: {
type: String,
default: ''
},
limit: {
type: Number,
default: 1
},
isShowTip: {
type: Boolean,
default: true
}
})
const emit = defineEmits(['update:modelValue'])
const uploadUrl = ref('https://jsonplaceholder.typicode.com/posts/')
const fileList = ref([])
const handleExceed = () => {
ElMessage.warning(`最多只能上传${props.limit}个文件`)
}
const handleSuccess = (response: any) => {
emit('update:modelValue', response.url)
ElMessage.success('上传成功')
}
const handleError = () => {
ElMessage.error('上传失败,请重试')
}
const beforeUpload = (file: File) => {
const isLt2M = file.size / 1024 / 1024 < 2
if (!isLt2M) {
ElMessage.error('文件大小不能超过 2MB!')
}
return isLt2M
}
</script>

12
src/views/Login/Login.vue

@ -58,12 +58,12 @@ import {
defineOptions({ name: 'Login' })
const isIpAccess = ref(false)
onMounted(() => {
const hostname = window.location.hostname
if (hostname == 'localhost') {
isIpAccess.value = true
} else {
isIpAccess.value = /^(\d{1,3}\.){3}\d{1,3}$/.test(hostname)
}
// const hostname = window.location.hostname
// if (hostname == 'localhost') {
// isIpAccess.value = true
// } else {
// isIpAccess.value = /^(\d{1,3}\.){3}\d{1,3}$/.test(hostname)
// }
// IP访
})
const { getPrefixCls } = useDesign()

12
src/views/Login/components/QrCodeForm.vue

@ -95,11 +95,13 @@ const refaulst = () => {
return
}
const res = await LoginApi.qrLoginCode({ code: uuid.value })
intervalId.value && clearInterval(intervalId.value)
authUtil.setToken(res)
await nextTick(() => {
router.push({ path: '/' })
})
if (res) {
intervalId.value && clearInterval(intervalId.value)
authUtil.setToken(res)
await nextTick(() => {
router.push({ path: '/' })
})
}
} catch (error) {
console.error('获取扫码状态失败:', error)
}

4
src/views/enterpriseinspections/index.vue

@ -13,7 +13,7 @@
/>
</el-form-item>
<el-form-item label="" prop="departmentId">
<el-select v-model="queryParams.departmentId" placeholder="请选择部门">
<el-select v-model="queryParams.departmentId" placeholder="请选择部门" clearable>
<el-option
v-for="item in deptList"
:key="item.id"
@ -23,7 +23,7 @@
</el-select>
</el-form-item>
<el-form-item label="" prop="inspectionsStatus">
<el-select v-model="queryParams.inspectionsStatus" placeholder="请选择进度状态">
<el-select v-model="queryParams.inspectionsStatus" placeholder="请选择进度状态" clearable>
<el-option
v-for="dict in getDictOptions(DICT_TYPE.INSPECTIONS_STATUS)"
:key="dict.value"

6
src/views/enterprises/index.vue

@ -114,6 +114,12 @@
{{ getDictLabel(DICT_TYPE.ENTERPRISES_AREA, scope.row.region) }}
</template>
</el-table-column>
<el-table-column label="审核状态" width="200">
<template #default="scope">
<el-tag v-if="scope.row.isAudit" class="ml-2" type="success">已审核</el-tag>
<el-tag v-else class="ml-2" type="warning">未审核</el-tag>
</template>
</el-table-column>
<el-table-column label="行业类别">
<template #default="scope">
<span v-if="scope.row.tagListName">

3
src/views/enterprises/update.vue

@ -280,7 +280,8 @@ const formData = ref({
enterpriseUserId: undefined,
tagIds: undefined,
photo: [] as any,
signRadius: 30
signRadius: 30,
isAudit: 1
} as any)
const formRules = reactive({
type: [{ required: true, message: '企业类型不能为空', trigger: 'change' }],

46
src/views/system/dept/DeptForm.vue

@ -24,41 +24,25 @@
<el-form-item label="显示排序" prop="sort">
<el-input-number v-model="formData.sort" :min="0" controls-position="right" />
</el-form-item>
<el-form-item label="负责人" prop="leaderUserId">
<el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" clearable placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm"> </el-button>
<el-popconfirm title="是否确定删除当前部门?" @confirm="deleteReport" width="230">
<template #reference>
<el-button type="danger" v-if="formType == 'update'" link class="underline">
我要删除
</el-button>
</template>
</el-popconfirm>
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { defaultProps, handleTree } from '@/utils/tree'
import * as DeptApi from '@/api/system/dept'
import * as UserApi from '@/api/system/user'
@ -121,6 +105,18 @@ const open = async (type: string, id?: number) => {
}
defineExpose({ open }) // open
/** 删除按钮操作 */
const deleteReport = async () => {
try {
//
await DeptApi.deleteDept(formData.value.id)
dialogVisible.value = false
message.success(t('common.delSuccess'))
//
emit('success')
} catch {}
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {

73
src/views/system/dept/index.vue

@ -1,57 +1,42 @@
<template>
<!-- 搜索工作栏 -->
<ContentWrap>
<section class="flex flex-col gap-20px">
<el-form
class="-mb-15px"
class="-mb-15px form-box"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
size="large"
>
<el-form-item label="部门名称" prop="name">
<el-form-item label="" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入部门名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
class="!w-370px"
:prefix-icon="Search"
/>
</el-form-item>
<el-form-item label="部门状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择部门状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
</el-form-item>
<el-form-item class="import">
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:dept:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading="loading"
:data="list"
@ -60,22 +45,18 @@
v-if="refreshTable"
>
<el-table-column prop="name" label="部门名称" />
<el-table-column prop="leader" label="负责人">
<el-table-column prop="leader" label="部门电话">
<template #default="scope">
{{ userList.find((user) => user.id === scope.row.leaderUserId)?.nickname }}
{{ scope.row.phone || '-' }}
</template>
</el-table-column>
<el-table-column prop="sort" label="排序" />
<el-table-column prop="status" label="状态">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
width="180"
width="220"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
@ -86,31 +67,25 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:dept:update']"
>
修改
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:dept:delete']"
>
删除
编辑
</el-button>
</template>
</el-table-column>
</el-table>
</section>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<DeptForm ref="formRef" @success="getList" />
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import { handleTree } from '@/utils/tree'
import * as DeptApi from '@/api/system/dept'
import DeptForm from './DeptForm.vue'
import * as UserApi from '@/api/system/user'
import { Search } from '@element-plus/icons-vue'
defineOptions({ name: 'SystemDept' })
@ -188,3 +163,15 @@ onMounted(async () => {
userList.value = await UserApi.getSimpleUserList()
})
</script>
<style lang="scss" scoped>
.form-box {
display: flex;
flex-wrap: wrap;
gap: 12px;
.import {
margin-left: auto; //
align-self: flex-end;
}
}
</style>

21
src/views/system/jobinfo/index.vue

@ -55,7 +55,7 @@
<el-button
link
type="primary"
@click="handleExport(scope.row.id)"
@click="handleExport(scope.row)"
v-hasPermi="['system:job-info:delete']"
>
下载
@ -139,18 +139,13 @@ const openForm = (type: string, id?: number) => {
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await JobInfoApi.exportJobInfo(queryParams)
download.excel(data, '工作汇报.xls')
} catch {
} finally {
exportLoading.value = false
}
const handleExport = async (row:any) => {
const link = document.createElement('a')
link.href = row.pdfUrl
link.download = row.title || '未命名文件.pdf'
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}
/** 初始化 **/

26
src/views/system/role/RoleForm.vue

@ -7,10 +7,10 @@
:rules="formRules"
label-width="80px"
>
<el-form-item label="角色名称" prop="name">
<el-form-item label="职位名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item label="角色标识" prop="code">
<el-form-item label="职位标识" prop="code">
<el-input v-model="formData.code" placeholder="请输入角色标识" />
</el-form-item>
<el-form-item label="显示顺序" prop="sort">
@ -31,8 +31,15 @@
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-popconfirm title="是否确定删除当前角色?" @confirm="deleteReport" width="230">
<template #reference>
<el-button type="danger" v-if="formType == 'update'" link class="underline">
我要删除
</el-button>
</template>
</el-popconfirm>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
</template>
</Dialog>
</template>
@ -84,6 +91,19 @@ const open = async (type: string, id?: number) => {
}
}
/** 删除按钮操作 */
const deleteReport = async () => {
try {
//
await RoleApi.deleteRole(formData.value.id)
message.success(t('common.delSuccess'))
//
dialogVisible.value = false
emit('success')
} catch {}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {

126
src/views/system/role/index.vue

@ -1,6 +1,6 @@
<template>
<ContentWrap>
<section class="flex flex-col gap-20px">
<section class="flex flex-col gap-20px form-box">
<!-- 搜索工作栏 -->
<el-form
ref="queryFormRef"
@ -9,57 +9,30 @@
class="-mb-15px"
label-width="68px"
>
<el-form-item label="角色名称" prop="name">
<el-form-item label="" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
class="!w-370px"
clearable
placeholder="请输入角色名称"
placeholder="请输入职位名称"
@keyup.enter="handleQuery"
:prefix-icon="Search"
/>
</el-form-item>
<el-form-item label="角色标识" prop="code">
<el-input
v-model="queryParams.code"
class="!w-240px"
clearable
placeholder="请输入角色标识"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" class="!w-240px" clearable placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
end-placeholder="结束日期"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
查询
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
</el-button>
</el-form-item>
<el-form-item class="import">
<el-button
v-hasPermi="['system:role:create']"
plain
type="primary"
@click="openForm('create')"
>
@ -69,8 +42,7 @@
<el-button
v-hasPermi="['system:role:export']"
:loading="exportLoading"
plain
type="success"
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" />
@ -79,27 +51,18 @@
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="list">
<el-table-column align="center" label="角色编号" prop="id" />
<el-table-column align="center" label="角色名称" prop="name" />
<el-table-column label="角色类型" align="center" prop="type">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_ROLE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column align="center" label="角色标识" prop="code" />
<el-table-column align="center" label="显示顺序" prop="sort" />
<el-table-column align="center" label="备注" prop="remark" />
<el-table-column align="center" label="状态" prop="status">
<el-table-column label="职位名称" prop="name" width="200"/>
<el-table-column label="职位备注" prop="remark" width="200" />
<el-table-column label="显示顺序" prop="sort" width="200" />
<el-table-column label="开启状态" prop="status" width="200">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
:formatter="dateFormatter"
align="center"
label="创建时间"
prop="createTime"
width="180"
/>
<el-table-column :width="300" align="center" label="操作">
<template #default="scope">
@ -119,36 +82,21 @@
type="primary"
@click="openAssignMenuForm(scope.row)"
>
菜单权限
</el-button>
<el-button
v-hasPermi="['system:permission:assign-role-data-scope']"
link
preIcon="ep:coin"
title="数据权限"
type="primary"
@click="openDataPermissionForm(scope.row)"
>
数据权限
</el-button>
<el-button
v-hasPermi="['system:role:delete']"
link
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
权限
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo"
<el-pagination
:total="total"
@pagination="getList"
/>
:show-page-size="false"
layout="total, prev, pager, next"
v-model:current-page="queryParams.pageNo"
v-model:page-size="queryParams.pageSize"
@change="getList"
class="ml-auto"
/>
</section>
</ContentWrap>
@ -160,18 +108,18 @@
<RoleDataPermissionForm ref="dataPermissionFormRef" @success="getList" />
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as RoleApi from '@/api/system/role'
import RoleForm from './RoleForm.vue'
import RoleAssignMenuForm from './RoleAssignMenuForm.vue'
import RoleDataPermissionForm from './RoleDataPermissionForm.vue'
import { Search } from '@element-plus/icons-vue'
defineOptions({ name: 'SystemRole' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
@ -229,18 +177,6 @@ const openAssignMenuForm = async (row: RoleApi.RoleVO) => {
assignMenuFormRef.value.open(row)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await RoleApi.deleteRole(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
@ -262,3 +198,15 @@ onMounted(() => {
getList()
})
</script>
<style lang="scss" scoped>
.form-box {
display: flex;
flex-wrap: wrap;
gap: 12px;
.import {
margin-left: auto; //
align-self: flex-end;
}
}
</style>

114
src/views/system/user/UserForm.vue

@ -9,14 +9,24 @@
>
<el-row>
<el-col :span="12">
<el-form-item label="用户昵称" prop="nickname">
<el-input v-model="formData.nickname" placeholder="请输入用户昵称" />
</el-form-item>
<el-form-item label="真实姓名" prop="realName">
<el-input v-model="formData.realName" placeholder="请输入真实姓名" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户性别">
<el-radio-group v-model="formData.sex">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="归属部门" prop="deptId">
<el-tree-select
v-model="formData.deptId"
@ -31,71 +41,58 @@
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="手机号码" prop="mobile">
<el-input v-model="formData.mobile" maxlength="11" placeholder="请输入手机号码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
<el-col :span="24">
<el-form-item label="职位权限">
<el-select v-model="formData.roleIds" multiple placeholder="请选择">
<el-option v-for="item in roleList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="用户名称" prop="username">
<el-form-item v-if="formData.id === undefined" label="用户头像" prop="username">
<el-input v-model="formData.username" placeholder="请输入用户名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="用户密码" prop="password">
<el-input
v-model="formData.password"
placeholder="请输入用户密码"
show-password
type="password"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="formData.sex" placeholder="请选择">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="formData.postIds" multiple placeholder="请选择">
<el-option
v-for="item in postList"
:key="item.id"
:label="item.name"
:value="item.id!"
/>
</el-select>
<el-form-item label="用户头像">
<el-image style="width: 148px; height: 148px" :src="formData.avatar" :preview-src-list="[formData.avatar]"
:preview-teleported="true"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
<el-col :span="12">
<el-form-item label="审核通过">
<el-switch v-model="formData.audit" :active-value="2"
:inactive-value="1"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-popconfirm title="是否确定删除当前人员?" @confirm="deleteReport" width="230">
<template #reference>
<el-button type="danger" v-if="formType == 'update'" link class="underline">
我要删除
</el-button>
</template>
</el-popconfirm>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
</template>
</Dialog>
</template>
@ -107,6 +104,10 @@ import * as PostApi from '@/api/system/post'
import * as DeptApi from '@/api/system/dept'
import * as UserApi from '@/api/system/user'
import { FormRules } from 'element-plus'
import * as RoleApi from '@/api/system/role'
const roleList = ref([] as RoleApi.RoleVO[]) //
defineOptions({ name: 'SystemUserForm' })
@ -129,12 +130,14 @@ const formData = ref({
sex: undefined,
postIds: [],
remark: '',
status: CommonStatusEnum.ENABLE,
status: undefined,
roleIds: [],
area: undefined
area: undefined,
avatar: undefined,
})
const formRules = reactive<FormRules>({
username: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }],
realName: [{ required: true, message: '真实姓名不能为空', trigger: 'blur' }],
nickname: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }],
email: [
@ -171,11 +174,25 @@ const open = async (type: string, id?: number) => {
formLoading.value = false
}
}
//
deptList.value = handleTree(await DeptApi.getSimpleDeptList())
//
postList.value = await PostApi.getSimplePostList()
//
roleList.value = await RoleApi.getSimpleRoleList()
}
const deleteReport = () => {
UserApi.deleteUser(formData.value.id).then(() => {
message.success(t('common.deleteSuccess'))
dialogVisible.value = false
})
}
defineExpose({ open }) // open
/** 提交表单 */
@ -225,3 +242,8 @@ const resetForm = () => {
formRef.value?.resetFields()
}
</script>
<style scoped>
.el-image-viewer__wrapper {
z-index: 98 !important;
}
</style>

206
src/views/system/user/index.vue

@ -2,78 +2,44 @@
<ContentWrap>
<section class="flex flex-col gap-20px">
<el-form
class="-mb-15px"
class="-mb-15px form-box"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="用名称" prop="username">
<el-form-item label="" prop="username">
<el-input
v-model="queryParams.realName"
placeholder="请输入用户名称"
placeholder="请输入真实姓名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="" prop="mobile">
<el-input
v-model="queryParams.mobile"
placeholder="请输入手机号码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
class="!w-370px"
:prefix-icon="Search"
/>
</el-form-item>
<el-form-item label="" prop="status" v-if="!isInset">
<el-select
v-model="queryParams.status"
placeholder="用户状态"
v-model="queryParams.deptId"
placeholder="请选择所属部门"
clearable
class="!w-240px"
class="!w-370px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
v-for="dict in deptList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
/>
</el-select>
</el-form-item>
<el-form-item label="" prop="createTime" v-if="!isInset">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
start-placeholder="开始日期"
end-placeholder="结束日期"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" />搜索</el-button>
<el-button type="per" @click="handleQuery"><Icon icon="ep:search" /> 查询 </el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" />重置</el-button>
</el-form-item>
<el-form-item class="import">
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:user:create']"
v-if="!isInset"
>
<Icon icon="ep:plus" /> 新增
</el-button>
<el-button
type="warning"
plain
@click="handleImport"
v-hasPermi="['system:user:import']"
v-if="!isInset"
>
<Icon icon="ep:upload" /> 导入
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
@ -83,47 +49,48 @@
<Icon icon="ep:download" />导出
</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="list">
<el-table-column
label="真实姓名"
align="center"
prop="realName"
:show-overflow-tooltip="true"
width="130"
/>
<el-table-column label="用户性别" align="center" prop="sex" width="120" >
<el-table-column label="用户性别" prop="sex" width="130" >
<template #default="scope">
{{getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, scope.row.sex)}}
</template>
</el-table-column>
<el-table-column label="手机号码" align="center" prop="mobile" width="120" />
<el-table-column label="手机号码" prop="mobile" width="150" />
<el-table-column
label="所属部门"
align="center"
key="deptName"
prop="deptName"
width="200"
:show-overflow-tooltip="true"
/>
<el-table-column label="状态" key="status" v-if="!isInset">
<el-table-column
label="职位权限"
key="roleList"
prop="roleList"
width="200"
:show-overflow-tooltip="true"
/>
<el-table-column label="审核状态" key="audit" v-if="!isInset" width="200">
<template #default="scope">
<el-switch
v-model="scope.row.status"
:active-value="0"
:inactive-value="1"
@change="handleStatusChange(scope.row)"
:disabled="!checkPermi(['system:user:update'])"
/>
<dict-tag :type="DICT_TYPE.USER_AUDIT_TYPE" :value="scope.row.audit" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180"
/>
<el-table-column label="操作" align="center" width="160" v-if="!isInset">
<el-table-column label="操作" v-if="!isInset" align="center">
<template #default="scope">
<div class="flex items-center justify-center">
<el-button
@ -132,46 +99,9 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:user:update']"
>
<Icon icon="ep:edit" />修改
编辑
</el-button>
<el-dropdown
@command="(command) => handleCommand(command, scope.row)"
v-hasPermi="[
'system:user:delete',
'system:user:update-password',
'system:permission:assign-user-role'
]"
>
<el-button type="primary" link><Icon icon="ep:d-arrow-right" /> 更多</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
command="handleDelete"
v-if="checkPermi(['system:user:delete'])"
>
<Icon icon="ep:delete" />删除
</el-dropdown-item>
<el-dropdown-item
command="handleDelete2"
v-if="checkPermi(['system:user:deleteAllData'])"
>
<Icon icon="ep:delete" />测试删除全部数据
</el-dropdown-item>
<el-dropdown-item
command="handleResetPwd"
v-if="checkPermi(['system:user:update-password'])"
>
<Icon icon="ep:key" />重置密码
</el-dropdown-item>
<el-dropdown-item
command="handleRole"
v-if="checkPermi(['system:permission:assign-user-role'])"
>
<Icon icon="ep:circle-check" />分配角色
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
</el-table-column>
@ -204,15 +134,15 @@
<UserAssignRoleForm ref="assignRoleFormRef" @success="getList" />
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions, getDictLabel } from '@/utils/dict'
import { checkPermi } from '@/utils/permission'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CommonStatusEnum } from '@/utils/constants'
import * as UserApi from '@/api/system/user'
import UserForm from './UserForm.vue'
import UserImportForm from './UserImportForm.vue'
import UserAssignRoleForm from './UserAssignRoleForm.vue'
import * as DeptApi from '@/api/system/dept'
import { Search } from '@element-plus/icons-vue'
defineOptions({ name: 'SystemUser' })
@ -231,7 +161,7 @@ const queryParams = reactive({
mobile: undefined,
status: undefined,
deptId: undefined,
audit: '2',
audit: undefined,
userType: '3',
createTime: []
})
@ -266,6 +196,8 @@ const resetQuery = () => {
handleQuery()
}
/** 处理部门被点击 */
const handleDeptNodeClick = async (row) => {
queryParams.deptId = row.id
@ -280,26 +212,26 @@ const openForm = (type: string, id?: number) => {
/** 用户导入 */
const importFormRef = ref()
const handleImport = () => {
importFormRef.value.open()
}
// const handleImport = () => {
// importFormRef.value.open()
// }
/** 修改用户状态 */
const handleStatusChange = async (row: UserApi.UserVO) => {
try {
//
const text = row.status === CommonStatusEnum.ENABLE ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.username + '"用户吗?')
//
await UserApi.updateUserStatus(row.id, row.status)
//
await getList()
} catch {
//
row.status =
row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE
}
}
// /** */
// const handleStatusChange = async (row: UserApi.UserVO) => {
// try {
// //
// const text = row.status === CommonStatusEnum.ENABLE ? '' : ''
// await message.confirm('"' + text + '""' + row.username + '"?')
// //
// await UserApi.updateUserStatus(row.id, row.status)
// //
// await getList()
// } catch {
// //
// row.status =
// row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE
// }
// }
/** 导出按钮操作 */
const exportLoading = ref(false)
@ -384,8 +316,30 @@ const handleRole = (row: UserApi.UserVO) => {
assignRoleFormRef.value.open(row)
}
//
const deptList:any = ref([]) //
const getDeptList = async () => {
const res = await DeptApi.getSimpleDeptList()
deptList.value = []
deptList.value = res
}
/** 初始化 */
onMounted(() => {
getDeptList()
getList()
})
</script>
<style lang="scss" scoped>
.form-box {
display: flex;
flex-wrap: wrap;
gap: 12px;
.import {
margin-left: auto; //
align-self: flex-end;
}
}
</style>

101
src/views/task/create.vue

@ -66,6 +66,35 @@
/>
</el-select>
</el-form-item>
<el-form-item label="上传文件" prop="execCycle">
<el-upload
ref="upload"
class="upload-demo"
:limit="3"
:auto-upload="true"
:on-change="handleFileChange"
:on-remove="handleFileRemove"
:file-list="fileList"
:action="fileAction"
:headers="{ Authorization: 'Bearer ' + getAccessToken() }"
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
accept=".doc,.docx,.pdf,.xls,.xlsx"
:before-upload="beforeUpload"
:on-preview="handlePreview"
>
<template #trigger>
<el-button type="primary">上传文件</el-button>
</template>
<template #tip>
</template>
</el-upload>
</el-form-item>
</el-form>
@ -223,8 +252,8 @@
</div>
</div>
<div class="footer">
<el-button type="danger" link v-if="formData.status < 2" @click="handleDeleteTask">删除任务?</el-button>
<el-button type="primary" @click="submitForm" size="large" v-if="!formData.status || formData.status == 0 || formData.status == 1" >{{btnTitle}}</el-button>
<el-button type="danger" link v-if="formData.status == 0" @click="handleDeleteTask">删除任务?</el-button>
<el-button @click="goBack" size="large">返回列表</el-button>
</div>
@ -241,6 +270,10 @@ import { useTagsViewStore } from '@/store/modules/tagsView'
import CreateEnterprise from './createEnterprise.vue'
import { cloneDeep } from 'lodash-es';
import { getSimpleUserZGList } from '@/api/system/user'
// import { UploadFile } from '@/components/UploadFile'
import { getAccessToken } from '@/utils/auth'
import { deleteFile } from '@/api/system/fileinfo'
defineOptions({ name: 'CreateTask'})
const formData:any = ref({
@ -261,6 +294,7 @@ const formData:any = ref({
taskStep: undefined,
taskTotal: undefined,
planTime: [] as any,
fileIds: [],
tags: [],
enterprises: [] as any
})
@ -289,6 +323,52 @@ const formRules = reactive({
})
const { query } = useRoute()
const formRef = ref() // Ref`
const fileList:any = ref([])
const fileAction = ref(import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/infra/file/upload')
//
const beforeUpload = (file) => {
const isLt10M = file.size / 1024 / 1024 < 10
if (!isLt10M) {
message.error('文件大小不能超过10MB')
return false
}
return true
}
const handleFileChange = (file, fileList) => {
fileList.value = fileList
}
//
const handleFileRemove = async (file, fileList) => {
// fileList.value = fileList
console.log(file)
await message.delConfirm('是否确定删除文件?', '删除文件')
if (file.id) {
await deleteFile(file.id)
}
message.success('删除成功')
}
//
const handleUploadSuccess = (response, file, fileList) => {
console.log(response.data)
formData.value.fileIds.push(response.data.id)
message.success('文件上传成功')
}
//
const handlePreview = (file) => {
window.open(file.url)
}
const handleUploadError = (error, file, fileList) => {
message.error('文件上传失败')
}
const enterprise:any = ref({
list: [] as any,
queryParams: reactive({
@ -524,6 +604,9 @@ function uniqueFunc(arr, uniId) {
*/
async function submitForm() {
const validate = await unref(formRef).validate()
let title:any = ''
let content:any = ''
@ -537,11 +620,12 @@ async function submitForm() {
await message.delConfirm(content, title)
const validate = await unref(formRef).validate()
if (validate) {
// id
const data = JSON.parse(JSON.stringify(formData.value))
enterprise.value.list
//1
@ -605,6 +689,8 @@ async function init() {
showButton.value = true
const res= await TaskInfoApi.getTaskInfo(query.id)
formData.value = res
//
const tag = await TagLibraryApi.getTagLibrary(res.taskType)
@ -615,12 +701,23 @@ async function init() {
formData.value.execCycle = formData.value.execCycle.toString()
}
fileList.value = (res.fileList || []).map(item => ({
name: item.name,
url: item.url,
id: item.id,
status: 'success'
}));
formData.value.planTime = [formData.value.startDate, formData.value.endDate]
formData.value.enterprises = res.enterpriseIdes
formData.value.fileIds = (res.fileList || []).map(i =>i.id)
// formData.value.fileList = res.fileList.map(i =>i.name)
formData.value.tags = res.taskTagIdes.map((t) => t.tagId)
enterprise.value.list = res.enterpriseIdes
enterprise.value.total = res.enterpriseIdes.length
//
enterprise_copy.value = cloneDeep(enterprise.value);

34
src/views/task/detail.vue

@ -33,6 +33,20 @@
<div class="label">任务描述</div> {{formData.description}}
</div>
<div class="merge">
<div class="label">任务文件</div>
<el-link
v-for="file in fileList"
:key="file"
type="primary"
:underline="true"
style="margin-right: 5px"
@click="handlePreview(file)"
>
{{ file.name }}
</el-link>
</div>
</div>
@ -171,7 +185,7 @@
v-if="formData.status == 0"
@click="auditForm"
size="large"
v-hasPermi="['system:enterprise-inspections:audit']"
v-hasPermi="['system:task-info:audit']"
>审核通过</el-button
>
<el-button type="warning" link v-if="formData.status == 2" @click="handleDeleteTask">结束任务?</el-button>
@ -215,6 +229,8 @@ const formData:any = ref({
enterprises: [] as any
})
const fileList = ref([])
const tagView = useTagsViewStore()
const formCreateRef = ref()
const message = useMessage()
@ -267,7 +283,6 @@ const goBack = () => {
//
const paginatedData = computed(() => {
const start = (enterprise.value.queryParams.pageNo -1) * enterprise.value.queryParams.pageSize
const end = enterprise.value.queryParams.pageNo * enterprise.value.queryParams.pageSize
@ -455,6 +470,13 @@ async function init() {
formData.value.execCycle = formData.value.execCycle.toString()
}
fileList.value = (res.fileList || []).map(item => ({
name: item.name,
url: item.url,
id: item.id,
status: 'success'
}));
formData.value.planTime = [formData.value.startDate, formData.value.endDate]
formData.value.enterprises = res.enterpriseIdes
formData.value.tags = res.taskTagIdes.map((t) => t.tagId)
@ -467,6 +489,11 @@ async function init() {
}
}
//
const handlePreview = (file) => {
//
window.open(file.url, '_blank')
}
function getList(data) {
@ -539,7 +566,7 @@ onMounted(() => {
.merge {
grid-column: span 3;
div{
width: 6%;
width: 5%;
text-align: right;
}
}
@ -617,3 +644,4 @@ onMounted(() => {
}
</style>

Loading…
Cancel
Save