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. 116
      src/views/system/user/UserForm.vue
  14. 206
      src/views/system/user/index.vue
  15. 197
      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' }) defineOptions({ name: 'Login' })
const isIpAccess = ref(false) const isIpAccess = ref(false)
onMounted(() => { onMounted(() => {
const hostname = window.location.hostname // const hostname = window.location.hostname
if (hostname == 'localhost') { // if (hostname == 'localhost') {
isIpAccess.value = true // isIpAccess.value = true
} else { // } else {
isIpAccess.value = /^(\d{1,3}\.){3}\d{1,3}$/.test(hostname) // isIpAccess.value = /^(\d{1,3}\.){3}\d{1,3}$/.test(hostname)
} // }
// IP访 // IP访
}) })
const { getPrefixCls } = useDesign() const { getPrefixCls } = useDesign()

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

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

4
src/views/enterpriseinspections/index.vue

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

6
src/views/enterprises/index.vue

@ -114,6 +114,12 @@
{{ getDictLabel(DICT_TYPE.ENTERPRISES_AREA, scope.row.region) }} {{ getDictLabel(DICT_TYPE.ENTERPRISES_AREA, scope.row.region) }}
</template> </template>
</el-table-column> </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="行业类别"> <el-table-column label="行业类别">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.tagListName"> <span v-if="scope.row.tagListName">

3
src/views/enterprises/update.vue

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

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

@ -24,41 +24,25 @@
<el-form-item label="显示排序" prop="sort"> <el-form-item label="显示排序" prop="sort">
<el-input-number v-model="formData.sort" :min="0" controls-position="right" /> <el-input-number v-model="formData.sort" :min="0" controls-position="right" />
</el-form-item> </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-form-item label="联系电话" prop="phone">
<el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" /> <el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />
</el-form-item> </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> </el-form>
<template #footer> <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 @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { defaultProps, handleTree } from '@/utils/tree' import { defaultProps, handleTree } from '@/utils/tree'
import * as DeptApi from '@/api/system/dept' import * as DeptApi from '@/api/system/dept'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
@ -121,6 +105,18 @@ const open = async (type: string, id?: number) => {
} }
defineExpose({ open }) // open 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 emit = defineEmits(['success']) // success
const submitForm = async () => { const submitForm = async () => {

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

@ -1,57 +1,42 @@
<template> <template>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<ContentWrap> <ContentWrap>
<section class="flex flex-col gap-20px">
<el-form <el-form
class="-mb-15px" class="-mb-15px form-box"
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="68px" label-width="68px"
size="large"
> >
<el-form-item label="部门名称" prop="name"> <el-form-item label="" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
placeholder="请输入部门名称" placeholder="请输入部门名称"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-370px"
:prefix-icon="Search"
/> />
</el-form-item> </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-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <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-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
</el-form-item>
<el-form-item class="import">
<el-button <el-button
type="primary" type="primary"
plain
@click="openForm('create')" @click="openForm('create')"
v-hasPermi="['system:dept:create']" v-hasPermi="['system:dept:create']"
> >
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="list" :data="list"
@ -60,22 +45,18 @@
v-if="refreshTable" v-if="refreshTable"
> >
<el-table-column prop="name" label="部门名称" /> <el-table-column prop="name" label="部门名称" />
<el-table-column prop="leader" label="负责人"> <el-table-column prop="leader" label="部门电话">
<template #default="scope"> <template #default="scope">
{{ userList.find((user) => user.id === scope.row.leaderUserId)?.nickname }} {{ scope.row.phone || '-' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="sort" label="排序" /> <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 <el-table-column
label="创建时间" label="创建时间"
align="center" align="center"
prop="createTime" prop="createTime"
width="180" width="220"
:formatter="dateFormatter" :formatter="dateFormatter"
/> />
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
@ -86,31 +67,25 @@
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['system:dept:update']" v-hasPermi="['system:dept:update']"
> >
修改 编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:dept:delete']"
>
删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</section>
</ContentWrap> </ContentWrap>
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
<DeptForm ref="formRef" @success="getList" /> <DeptForm ref="formRef" @success="getList" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import { handleTree } from '@/utils/tree' import { handleTree } from '@/utils/tree'
import * as DeptApi from '@/api/system/dept' import * as DeptApi from '@/api/system/dept'
import DeptForm from './DeptForm.vue' import DeptForm from './DeptForm.vue'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
import { Search } from '@element-plus/icons-vue'
defineOptions({ name: 'SystemDept' }) defineOptions({ name: 'SystemDept' })
@ -188,3 +163,15 @@ onMounted(async () => {
userList.value = await UserApi.getSimpleUserList() userList.value = await UserApi.getSimpleUserList()
}) })
</script> </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 <el-button
link link
type="primary" type="primary"
@click="handleExport(scope.row.id)" @click="handleExport(scope.row)"
v-hasPermi="['system:job-info:delete']" v-hasPermi="['system:job-info:delete']"
> >
下载 下载
@ -139,18 +139,13 @@ const openForm = (type: string, id?: number) => {
/** 导出按钮操作 */ /** 导出按钮操作 */
const handleExport = async () => { const handleExport = async (row:any) => {
try { const link = document.createElement('a')
// link.href = row.pdfUrl
await message.exportConfirm() link.download = row.title || '未命名文件.pdf'
// document.body.appendChild(link)
exportLoading.value = true link.click()
const data = await JobInfoApi.exportJobInfo(queryParams) document.body.removeChild(link)
download.excel(data, '工作汇报.xls')
} catch {
} finally {
exportLoading.value = false
}
} }
/** 初始化 **/ /** 初始化 **/

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

@ -7,10 +7,10 @@
:rules="formRules" :rules="formRules"
label-width="80px" label-width="80px"
> >
<el-form-item label="角色名称" prop="name"> <el-form-item label="职位名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入角色名称" /> <el-input v-model="formData.name" placeholder="请输入角色名称" />
</el-form-item> </el-form-item>
<el-form-item label="角色标识" prop="code"> <el-form-item label="职位标识" prop="code">
<el-input v-model="formData.code" placeholder="请输入角色标识" /> <el-input v-model="formData.code" placeholder="请输入角色标识" />
</el-form-item> </el-form-item>
<el-form-item label="显示顺序" prop="sort"> <el-form-item label="显示顺序" prop="sort">
@ -31,8 +31,15 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <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 @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
</template> </template>
</Dialog> </Dialog>
</template> </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 = () => { const resetForm = () => {
formData.value = { formData.value = {

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

@ -1,6 +1,6 @@
<template> <template>
<ContentWrap> <ContentWrap>
<section class="flex flex-col gap-20px"> <section class="flex flex-col gap-20px form-box">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form
ref="queryFormRef" ref="queryFormRef"
@ -9,57 +9,30 @@
class="-mb-15px" class="-mb-15px"
label-width="68px" label-width="68px"
> >
<el-form-item label="角色名称" prop="name"> <el-form-item label="" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
class="!w-240px" class="!w-370px"
clearable clearable
placeholder="请输入角色名称" placeholder="请输入职位名称"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
:prefix-icon="Search"
/> />
</el-form-item> </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-form-item>
<el-button @click="handleQuery"> <el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" /> <Icon class="mr-5px" icon="ep:search" />
搜索 查询
</el-button> </el-button>
<el-button @click="resetQuery"> <el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" /> <Icon class="mr-5px" icon="ep:refresh" />
重置 重置
</el-button> </el-button>
</el-form-item>
<el-form-item class="import">
<el-button <el-button
v-hasPermi="['system:role:create']" v-hasPermi="['system:role:create']"
plain
type="primary" type="primary"
@click="openForm('create')" @click="openForm('create')"
> >
@ -69,8 +42,7 @@
<el-button <el-button
v-hasPermi="['system:role:export']" v-hasPermi="['system:role:export']"
:loading="exportLoading" :loading="exportLoading"
plain
type="success"
@click="handleExport" @click="handleExport"
> >
<Icon class="mr-5px" icon="ep:download" /> <Icon class="mr-5px" icon="ep:download" />
@ -79,27 +51,18 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column align="center" label="角色编号" prop="id" /> <el-table-column label="职位名称" prop="name" width="200"/>
<el-table-column align="center" label="角色名称" prop="name" /> <el-table-column label="职位备注" prop="remark" width="200" />
<el-table-column label="角色类型" align="center" prop="type"> <el-table-column label="显示顺序" prop="sort" width="200" />
<template #default="scope"> <el-table-column label="开启状态" prop="status" width="200">
<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">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
:formatter="dateFormatter" :formatter="dateFormatter"
align="center"
label="创建时间" label="创建时间"
prop="createTime" prop="createTime"
width="180"
/> />
<el-table-column :width="300" align="center" label="操作"> <el-table-column :width="300" align="center" label="操作">
<template #default="scope"> <template #default="scope">
@ -119,36 +82,21 @@
type="primary" type="primary"
@click="openAssignMenuForm(scope.row)" @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> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <el-pagination
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo"
:total="total" :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> </section>
</ContentWrap> </ContentWrap>
@ -160,18 +108,18 @@
<RoleDataPermissionForm ref="dataPermissionFormRef" @success="getList" /> <RoleDataPermissionForm ref="dataPermissionFormRef" @success="getList" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import * as RoleApi from '@/api/system/role' import * as RoleApi from '@/api/system/role'
import RoleForm from './RoleForm.vue' import RoleForm from './RoleForm.vue'
import RoleAssignMenuForm from './RoleAssignMenuForm.vue' import RoleAssignMenuForm from './RoleAssignMenuForm.vue'
import RoleDataPermissionForm from './RoleDataPermissionForm.vue' import RoleDataPermissionForm from './RoleDataPermissionForm.vue'
import { Search } from '@element-plus/icons-vue'
defineOptions({ name: 'SystemRole' }) defineOptions({ name: 'SystemRole' })
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
@ -229,18 +177,6 @@ const openAssignMenuForm = async (row: RoleApi.RoleVO) => {
assignMenuFormRef.value.open(row) 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 () => { const handleExport = async () => {
@ -262,3 +198,15 @@ onMounted(() => {
getList() getList()
}) })
</script> </script>
<style lang="scss" scoped>
.form-box {
display: flex;
flex-wrap: wrap;
gap: 12px;
.import {
margin-left: auto; //
align-self: flex-end;
}
}
</style>

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

@ -9,14 +9,24 @@
> >
<el-row> <el-row>
<el-col :span="12"> <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-form-item label="真实姓名" prop="realName">
<el-input v-model="formData.realName" placeholder="请输入真实姓名" /> <el-input v-model="formData.realName" placeholder="请输入真实姓名" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <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-form-item label="归属部门" prop="deptId">
<el-tree-select <el-tree-select
v-model="formData.deptId" v-model="formData.deptId"
@ -26,76 +36,63 @@
node-key="id" node-key="id"
placeholder="请选择归属部门" placeholder="请选择归属部门"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="24">
<el-form-item label="手机号码" prop="mobile"> <el-form-item label="手机号码" prop="mobile">
<el-input v-model="formData.mobile" maxlength="11" placeholder="请输入手机号码" /> <el-input v-model="formData.mobile" maxlength="11" placeholder="请输入手机号码" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="24">
<el-form-item label="邮箱" prop="email"> <el-form-item label="职位权限">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" /> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <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-input v-model="formData.username" placeholder="请输入用户名称" />
</el-form-item> </el-form-item>
</el-col> </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-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="用户性别"> <el-form-item label="用户头像">
<el-select v-model="formData.sex" placeholder="请选择"> <el-image style="width: 148px; height: 148px" :src="formData.avatar" :preview-src-list="[formData.avatar]"
<el-option :preview-teleported="true"
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> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="12">
<el-form-item label="备注"> <el-form-item label="审核通过">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" /> <el-switch v-model="formData.audit" :active-value="2"
:inactive-value="1"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <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 @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -107,6 +104,10 @@ import * as PostApi from '@/api/system/post'
import * as DeptApi from '@/api/system/dept' import * as DeptApi from '@/api/system/dept'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
import { FormRules } from 'element-plus' import { FormRules } from 'element-plus'
import * as RoleApi from '@/api/system/role'
const roleList = ref([] as RoleApi.RoleVO[]) //
defineOptions({ name: 'SystemUserForm' }) defineOptions({ name: 'SystemUserForm' })
@ -129,12 +130,14 @@ const formData = ref({
sex: undefined, sex: undefined,
postIds: [], postIds: [],
remark: '', remark: '',
status: CommonStatusEnum.ENABLE, status: undefined,
roleIds: [], roleIds: [],
area: undefined area: undefined,
avatar: undefined,
}) })
const formRules = reactive<FormRules>({ const formRules = reactive<FormRules>({
username: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }], realName: [{ required: true, message: '真实姓名不能为空', trigger: 'blur' }],
nickname: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }], nickname: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }], password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }],
email: [ email: [
@ -171,11 +174,25 @@ const open = async (type: string, id?: number) => {
formLoading.value = false formLoading.value = false
} }
} }
// //
deptList.value = handleTree(await DeptApi.getSimpleDeptList()) deptList.value = handleTree(await DeptApi.getSimpleDeptList())
// //
postList.value = await PostApi.getSimplePostList() 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 defineExpose({ open }) // open
/** 提交表单 */ /** 提交表单 */
@ -225,3 +242,8 @@ const resetForm = () => {
formRef.value?.resetFields() formRef.value?.resetFields()
} }
</script> </script>
<style scoped>
.el-image-viewer__wrapper {
z-index: 98 !important;
}
</style>

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

@ -2,78 +2,44 @@
<ContentWrap> <ContentWrap>
<section class="flex flex-col gap-20px"> <section class="flex flex-col gap-20px">
<el-form <el-form
class="-mb-15px" class="-mb-15px form-box"
:model="queryParams" :model="queryParams"
ref="queryFormRef" ref="queryFormRef"
:inline="true" :inline="true"
label-width="68px" label-width="68px"
> >
<el-form-item label="用名称" prop="username"> <el-form-item label="" prop="username">
<el-input <el-input
v-model="queryParams.realName" v-model="queryParams.realName"
placeholder="请输入用户名称" placeholder="请输入真实姓名"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px" class="!w-370px"
/> :prefix-icon="Search"
</el-form-item>
<el-form-item label="" prop="mobile">
<el-input
v-model="queryParams.mobile"
placeholder="请输入手机号码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="" prop="status" v-if="!isInset"> <el-form-item label="" prop="status" v-if="!isInset">
<el-select <el-select
v-model="queryParams.status" v-model="queryParams.deptId"
placeholder="用户状态" placeholder="请选择所属部门"
clearable clearable
class="!w-240px" class="!w-370px"
> >
<el-option <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" v-for="dict in deptList"
:key="dict.value" :key="dict.id"
:label="dict.label" :label="dict.name"
:value="dict.value" :value="dict.id"
/> />
</el-select> </el-select>
</el-form-item> </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-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-button @click="resetQuery"><Icon icon="ep:refresh" />重置</el-button>
</el-form-item>
<el-form-item class="import">
<el-button <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 plain
@click="handleExport" @click="handleExport"
:loading="exportLoading" :loading="exportLoading"
@ -83,47 +49,48 @@
<Icon icon="ep:download" />导出 <Icon icon="ep:download" />导出
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column <el-table-column
label="真实姓名" label="真实姓名"
align="center"
prop="realName" prop="realName"
:show-overflow-tooltip="true" :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"> <template #default="scope">
{{getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, scope.row.sex)}} {{getDictLabel(DICT_TYPE.SYSTEM_USER_SEX, scope.row.sex)}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="手机号码" align="center" prop="mobile" width="120" /> <el-table-column label="手机号码" prop="mobile" width="150" />
<el-table-column <el-table-column
label="所属部门" label="所属部门"
align="center" align="center"
key="deptName" key="deptName"
prop="deptName" prop="deptName"
width="200"
:show-overflow-tooltip="true" :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"> <template #default="scope">
<el-switch <dict-tag :type="DICT_TYPE.USER_AUDIT_TYPE" :value="scope.row.audit" />
v-model="scope.row.status"
:active-value="0"
:inactive-value="1"
@change="handleStatusChange(scope.row)"
:disabled="!checkPermi(['system:user:update'])"
/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="创建时间" label="创建时间"
align="center"
prop="createTime" prop="createTime"
:formatter="dateFormatter" :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"> <template #default="scope">
<div class="flex items-center justify-center"> <div class="flex items-center justify-center">
<el-button <el-button
@ -132,46 +99,9 @@
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['system:user:update']" v-hasPermi="['system:user:update']"
> >
<Icon icon="ep:edit" />修改 编辑
</el-button> </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> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -204,15 +134,15 @@
<UserAssignRoleForm ref="assignRoleFormRef" @success="getList" /> <UserAssignRoleForm ref="assignRoleFormRef" @success="getList" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions, getDictLabel } from '@/utils/dict' import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { checkPermi } from '@/utils/permission'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { CommonStatusEnum } from '@/utils/constants'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
import UserForm from './UserForm.vue' import UserForm from './UserForm.vue'
import UserImportForm from './UserImportForm.vue' import UserImportForm from './UserImportForm.vue'
import UserAssignRoleForm from './UserAssignRoleForm.vue' import UserAssignRoleForm from './UserAssignRoleForm.vue'
import * as DeptApi from '@/api/system/dept'
import { Search } from '@element-plus/icons-vue'
defineOptions({ name: 'SystemUser' }) defineOptions({ name: 'SystemUser' })
@ -231,7 +161,7 @@ const queryParams = reactive({
mobile: undefined, mobile: undefined,
status: undefined, status: undefined,
deptId: undefined, deptId: undefined,
audit: '2', audit: undefined,
userType: '3', userType: '3',
createTime: [] createTime: []
}) })
@ -266,6 +196,8 @@ const resetQuery = () => {
handleQuery() handleQuery()
} }
/** 处理部门被点击 */ /** 处理部门被点击 */
const handleDeptNodeClick = async (row) => { const handleDeptNodeClick = async (row) => {
queryParams.deptId = row.id queryParams.deptId = row.id
@ -280,26 +212,26 @@ const openForm = (type: string, id?: number) => {
/** 用户导入 */ /** 用户导入 */
const importFormRef = ref() const importFormRef = ref()
const handleImport = () => { // const handleImport = () => {
importFormRef.value.open() // importFormRef.value.open()
} // }
/** 修改用户状态 */ // /** */
const handleStatusChange = async (row: UserApi.UserVO) => { // const handleStatusChange = async (row: UserApi.UserVO) => {
try { // try {
// // //
const text = row.status === CommonStatusEnum.ENABLE ? '启用' : '停用' // const text = row.status === CommonStatusEnum.ENABLE ? '' : ''
await message.confirm('确认要"' + text + '""' + row.username + '"用户吗?') // await message.confirm('"' + text + '""' + row.username + '"?')
// // //
await UserApi.updateUserStatus(row.id, row.status) // await UserApi.updateUserStatus(row.id, row.status)
// // //
await getList() // await getList()
} catch { // } catch {
// // //
row.status = // row.status =
row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE // row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE
} // }
} // }
/** 导出按钮操作 */ /** 导出按钮操作 */
const exportLoading = ref(false) const exportLoading = ref(false)
@ -384,8 +316,30 @@ const handleRole = (row: UserApi.UserVO) => {
assignRoleFormRef.value.open(row) assignRoleFormRef.value.open(row)
} }
//
const deptList:any = ref([]) //
const getDeptList = async () => {
const res = await DeptApi.getSimpleDeptList()
deptList.value = []
deptList.value = res
}
/** 初始化 */ /** 初始化 */
onMounted(() => { onMounted(() => {
getDeptList()
getList() getList()
}) })
</script> </script>
<style lang="scss" scoped>
.form-box {
display: flex;
flex-wrap: wrap;
gap: 12px;
.import {
margin-left: auto; //
align-self: flex-end;
}
}
</style>

197
src/views/task/create.vue

@ -3,9 +3,9 @@
<div class="wrapper"> <div class="wrapper">
<div class="title">基本信息</div> <div class="title">基本信息</div>
<div class="box"> <div class="box">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" class="formClass" size="large"> <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" class="formClass" size="large">
<el-form-item label="任务标题" prop="title"> <el-form-item label="任务标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入任务标题" /> <el-input v-model="formData.title" placeholder="请输入任务标题" />
</el-form-item> </el-form-item>
@ -20,7 +20,7 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="描述" prop="description" style="width: 100%; padding: 0; margin-top: 0px;" class="descClass"> <el-form-item label="描述" prop="description" style="width: 100%; padding: 0; margin-top: 0px;" class="descClass">
<el-input <el-input
type="textarea" type="textarea"
@ -45,7 +45,7 @@
/> />
</el-form-item> </el-form-item>
<!-- <el-form-item label="执行周期" prop="execCycle" v-if="formData.taskType == 2"> <!-- <el-form-item label="执行周期" prop="execCycle" v-if="formData.taskType == 2">
<el-select v-model="formData.execCycle" placeholder="请选择执行周期"> <el-select v-model="formData.execCycle" placeholder="请选择执行周期">
<el-option <el-option
@ -66,10 +66,39 @@
/> />
</el-select> </el-select>
</el-form-item> </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> </el-form>
</div> </div>
</div> </div>
<div class="wrapper-down"> <div class="wrapper-down">
@ -88,9 +117,9 @@
:value="dict.id" :value="dict.id"
/> />
</el-select> </el-select>
</div> </div>
<div> <div>
<el-select <el-select
@ -106,8 +135,8 @@
:value="dict.value" :value="dict.value"
/> />
</el-select> </el-select>
<div class="btn"> <div class="btn">
<el-button type="primary" plain size="large" @click="handleQuery"> <el-button type="primary" plain size="large" @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 查询 <Icon icon="ep:search" class="mr-5px" /> 查询
@ -117,7 +146,7 @@
</el-button> </el-button>
</div> </div>
</div> </div>
<div> <div>
<el-select <el-select
@ -135,7 +164,7 @@
:value="dict.tagName" :value="dict.tagName"
/> />
</el-select> </el-select>
<div class="btn2"> <div class="btn2">
<el-button @click="insertEnterprise" type="primary" size="large"> <el-button @click="insertEnterprise" type="primary" size="large">
<el-icon><Sort /></el-icon> &nbsp; <el-icon><Sort /></el-icon> &nbsp;
@ -223,11 +252,11 @@
</div> </div>
</div> </div>
<div class="footer"> <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="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> <el-button @click="goBack" size="large">返回列表</el-button>
</div> </div>
</div> </div>
</div> </div>
<CreateEnterprise ref="formCreateRef" @success="getList" /> <CreateEnterprise ref="formCreateRef" @success="getList" />
@ -241,6 +270,10 @@ import { useTagsViewStore } from '@/store/modules/tagsView'
import CreateEnterprise from './createEnterprise.vue' import CreateEnterprise from './createEnterprise.vue'
import { cloneDeep } from 'lodash-es'; import { cloneDeep } from 'lodash-es';
import { getSimpleUserZGList } from '@/api/system/user' 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'}) defineOptions({ name: 'CreateTask'})
const formData:any = ref({ const formData:any = ref({
@ -261,6 +294,7 @@ const formData:any = ref({
taskStep: undefined, taskStep: undefined,
taskTotal: undefined, taskTotal: undefined,
planTime: [] as any, planTime: [] as any,
fileIds: [],
tags: [], tags: [],
enterprises: [] as any enterprises: [] as any
}) })
@ -289,6 +323,52 @@ const formRules = reactive({
}) })
const { query } = useRoute() const { query } = useRoute()
const formRef = ref() // Ref` 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({ const enterprise:any = ref({
list: [] as any, list: [] as any,
queryParams: reactive({ queryParams: reactive({
@ -314,14 +394,14 @@ const handleDeleteTask = async () => {
await message.delConfirm("是否确定删除任务!", "删除任务") await message.delConfirm("是否确定删除任务!", "删除任务")
try { try {
await TaskInfoApi.deleteTaskInfo(formData.value.id) await TaskInfoApi.deleteTaskInfo(formData.value.id)
} finally { } finally {
message.success('操作成功') message.success('操作成功')
tagView.delView(route) tagView.delView(route)
router.go(-1) router.go(-1)
} }
} }
@ -329,7 +409,7 @@ const handleDeleteTask = async () => {
const paginatedData = computed(() => { const paginatedData = computed(() => {
const start = (enterprise.value.queryParams.pageNo -1) * enterprise.value.queryParams.pageSize const start = (enterprise.value.queryParams.pageNo -1) * enterprise.value.queryParams.pageSize
const end = enterprise.value.queryParams.pageNo * enterprise.value.queryParams.pageSize const end = enterprise.value.queryParams.pageNo * enterprise.value.queryParams.pageSize
return enterprise.value.list.slice(start, end); // :ml-citation{ref="1,4" data="citationList"} return enterprise.value.list.slice(start, end); // :ml-citation{ref="1,4" data="citationList"}
}); });
@ -353,12 +433,12 @@ const handleDelete = async (id: number) => {
// //
await message.delConfirm() await message.delConfirm()
// //
deleteHandle(id) deleteHandle(id)
} }
const deleteHandle = (id: number) => { const deleteHandle = (id: number) => {
const targetIndex = enterprise.value.list.findIndex(item => item.id === id); const targetIndex = enterprise.value.list.findIndex(item => item.id === id);
if (targetIndex === -1) return; if (targetIndex === -1) return;
// //
@ -371,13 +451,13 @@ const deleteHandle = (id: number) => {
// //
const { pageNo, pageSize } = enterprise.value.queryParams; const { pageNo, pageSize } = enterprise.value.queryParams;
const itemsOnCurrentPage = enterprise.value.list.slice( const itemsOnCurrentPage = enterprise.value.list.slice(
(pageNo - 1) * pageSize, (pageNo - 1) * pageSize,
pageNo * pageSize pageNo * pageSize
) )
if (itemsOnCurrentPage.length === 0 && pageNo > 1) { if (itemsOnCurrentPage.length === 0 && pageNo > 1) {
enterprise.value.queryParams.pageNo = pageNo - 1; enterprise.value.queryParams.pageNo = pageNo - 1;
} }
} }
const enterprise_copy = ref({ const enterprise_copy = ref({
@ -411,11 +491,11 @@ const isAllConditionsEmpty = computed(() => {
const isTagMatched2 = (hy: string[], tagList?: string[] | null) => { const isTagMatched2 = (hy: string[], tagList?: string[] | null) => {
// 1 => // 1 =>
if (!hy?.length) return true; if (!hy?.length) return true;
// 2 => // 2 =>
if (!Array.isArray(tagList) || tagList.length === 0) return false; if (!Array.isArray(tagList) || tagList.length === 0) return false;
// 3 // 3
return hy.some(tag => tagList.includes(tag)); return hy.some(tag => tagList.includes(tag));
}; };
@ -439,28 +519,28 @@ const filterList = (list: EnterprisesVO[]) => {
} }
// 2. undefined // 2. undefined
const { const {
enterprisesName = '', enterprisesName = '',
qy = null, qy = null,
hy = [], hy = [],
userId = null userId = null
} = enterprise.value.queryParams || {}; } = enterprise.value.queryParams || {};
// 3. 使 // 3. 使
return list.filter(item => { return list.filter(item => {
const isNameMatched = enterprisesName const isNameMatched = enterprisesName
? item.enterprisesName?.toLowerCase().includes(enterprisesName.toLowerCase()) ? item.enterprisesName?.toLowerCase().includes(enterprisesName.toLowerCase())
: true; : true;
const isRegionMatched = qy const isRegionMatched = qy
? item.region === qy ? item.region === qy
: true; : true;
const isTagMatched = isTagMatched2(hy, item.tagList); const isTagMatched = isTagMatched2(hy, item.tagList);
const isUserMatched = userId const isUserMatched = userId
? item.userId === userId ? item.userId === userId
: true; : true;
return isNameMatched && isRegionMatched && isTagMatched && isUserMatched; return isNameMatched && isRegionMatched && isTagMatched && isUserMatched;
@ -504,9 +584,9 @@ const hyList:any = ref([])
async function getTagList() { async function getTagList() {
const codeList = 'hy' const codeList = 'hy'
const data = await TagLibraryApi.tagLibraryList(codeList) const data = await TagLibraryApi.tagLibraryList(codeList)
hyList.value = data[0].children hyList.value = data[0].children
} }
/** /**
@ -524,9 +604,12 @@ function uniqueFunc(arr, uniId) {
*/ */
async function submitForm() { async function submitForm() {
const validate = await unref(formRef).validate()
let title:any = '' let title:any = ''
let content:any = '' let content:any = ''
if (formData.value.id) { if (formData.value.id) {
title = '修改任务' title = '修改任务'
content = '是否确定修改任务?' content = '是否确定修改任务?'
@ -536,12 +619,13 @@ async function submitForm() {
} }
await message.delConfirm(content, title) await message.delConfirm(content, title)
const validate = await unref(formRef).validate()
if (validate) { if (validate) {
// id // id
const data = JSON.parse(JSON.stringify(formData.value)) const data = JSON.parse(JSON.stringify(formData.value))
enterprise.value.list enterprise.value.list
//1 //1
@ -573,7 +657,7 @@ async function submitForm() {
message.success('温馨提示:该任务已经执行,无法再进行修改') message.success('温馨提示:该任务已经执行,无法再进行修改')
} }
} }
} }
} }
@ -600,11 +684,13 @@ async function init() {
taskTopQuery() taskTopQuery()
if (query.id) { if (query.id) {
btnTitle.value = '修改任务' btnTitle.value = '修改任务'
showButton.value = true showButton.value = true
const res= await TaskInfoApi.getTaskInfo(query.id) const res= await TaskInfoApi.getTaskInfo(query.id)
formData.value = res formData.value = res
// //
const tag = await TagLibraryApi.getTagLibrary(res.taskType) const tag = await TagLibraryApi.getTagLibrary(res.taskType)
@ -615,12 +701,23 @@ async function init() {
formData.value.execCycle = formData.value.execCycle.toString() 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.planTime = [formData.value.startDate, formData.value.endDate]
formData.value.enterprises = res.enterpriseIdes 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) formData.value.tags = res.taskTagIdes.map((t) => t.tagId)
enterprise.value.list = res.enterpriseIdes enterprise.value.list = res.enterpriseIdes
enterprise.value.total = res.enterpriseIdes.length enterprise.value.total = res.enterpriseIdes.length
// //
enterprise_copy.value = cloneDeep(enterprise.value); enterprise_copy.value = cloneDeep(enterprise.value);
@ -692,7 +789,7 @@ onMounted(() => {
} }
} }
} }
@ -729,7 +826,7 @@ onMounted(() => {
display: flex; display: flex;
align-items: flex-end; align-items: flex-end;
justify-content: center; justify-content: center;
} }
} }
} }

34
src/views/task/detail.vue

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

Loading…
Cancel
Save