Browse Source

工作

master
赵鹏 1 month ago
parent
commit
88c543ae08
  1. 21
      .vscode/launch.json
  2. 1
      public/5jdf9ITaXT.txt
  3. BIN
      public/Tahoma Bold.ttf
  4. BIN
      public/Tahoma.ttf
  5. 1
      public/fGlAl0bgD6.txt
  6. BIN
      public/fx_bggl.png
  7. BIN
      public/fx_qyrz.png
  8. 50
      src/api/system/jobinfo/index.ts
  9. 10
      src/views/Home/Index.vue
  10. 16
      src/views/Login/Login.vue
  11. 114
      src/views/system/jobinfo/JobInfoForm.vue
  12. 201
      src/views/system/jobinfo/index.vue

21
.vscode/launch.json vendored

@ -0,0 +1,21 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"command": "npm run dev",
"name": "Run npm start",
"request": "launch",
"type": "node-terminal"
},
{
"type": "msedge",
"request": "launch",
"name": "针对 localhost 启动 Edge",
"url": "http://localhost:48080",
"webRoot": "${workspaceFolder}"
}
]
}

1
public/5jdf9ITaXT.txt

@ -0,0 +1 @@
eac89fac33e5547940fc4dfb35d9e7e3

BIN
public/Tahoma Bold.ttf

Binary file not shown.

BIN
public/Tahoma.ttf

Binary file not shown.

1
public/fGlAl0bgD6.txt

@ -0,0 +1 @@
6158f454f1875ca6b7a6dabb0a431fe6

BIN
public/fx_bggl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
public/fx_qyrz.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

50
src/api/system/jobinfo/index.ts

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 工作汇报 VO
export interface JobInfoVO {
id: number // id
title: string // 汇报标题
content: string // 汇报内容
jobDate: Date // 汇报日期
jobName: string // 汇报人姓名
}
// 工作汇报 API
export const JobInfoApi = {
// 查询工作汇报分页
getJobInfoPage: async (params: any) => {
return await request.get({ url: `/system/job-info/page`, params })
},
// 查询工作汇报详情
getJobInfo: async (id: number) => {
return await request.get({ url: `/system/job-info/get?id=` + id })
},
// 模板信息
jobDetail: async (id: number) => {
return await request.get({ url: `/system/job-info/jobDetail?id=` + id })
},
// 新增工作汇报
createJobInfo: async (data: JobInfoVO) => {
return await request.post({ url: `/system/job-info/create`, data })
},
// 修改工作汇报
updateJobInfo: async (data: JobInfoVO) => {
return await request.put({ url: `/system/job-info/update`, data })
},
// 删除工作汇报
deleteJobInfo: async (id: number) => {
return await request.delete({ url: `/system/job-info/delete?id=` + id })
},
// 导出工作汇报 Excel
exportJobInfo: async (params) => {
return await request.download({ url: `/system/job-info/export-excel`, params })
},
}

10
src/views/Home/Index.vue

@ -3,7 +3,7 @@
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" :height="280">
<el-card shadow="hover" class="mb-8px">
<template #header>
任务分布
执法完成率
</template>
<el-skeleton :loading="loading" animated>
<Echart :options="pieOptionsData" :height="280" />
@ -14,7 +14,7 @@
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24">
<el-card shadow="hover" class="mb-8px">
<template #header>
周期任务
执法与整改
</template>
<el-skeleton :loading="loading" animated>
<Echart :options="barOptionsData" :height="280" />
@ -24,7 +24,7 @@
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24">
<el-card shadow="hover" class="mb-8px">
<template #header>
月任务概况
任务与执法
</template>
<el-skeleton :loading="loading" animated>
<Echart :options="lineOptions" :height="280" />
@ -56,7 +56,7 @@
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
<el-card shadow="never">
<template #header>
逾期情况
逾期排行
</template>
<el-skeleton :loading="loading" animated>
<div v-for="(item, index) in notice2" :key="`dynamics-${index}`">
@ -77,7 +77,7 @@
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
<el-card shadow="never">
<template #header>
整改次数
整改排行
</template>
<el-skeleton :loading="loading" animated>
<div v-for="(item, index) in notice2" :key="`dynamics-${index}`">

16
src/views/Login/Login.vue

@ -38,8 +38,6 @@
<!-- 二维码登录 -->
<QrCodeForm v-else class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
</div>
</Transition>
</div>
@ -59,13 +57,13 @@ import { LoginForm, MobileForm, QrCodeForm, RegisterForm, SSOLoginVue, ForgetPas
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 { t } = useI18n()

114
src/views/system/jobinfo/JobInfoForm.vue

@ -0,0 +1,114 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" :fullscreen=true>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
width="600px"
>
<el-form-item label="汇报标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入汇报标题" />
</el-form-item>
<el-form-item label="汇报日期" prop="jobDate">
<el-date-picker
v-model="formData.jobDate"
type="date"
placeholder="选择汇报日期"
value-format="YYYY-MM-DD"
:dafult-time="new Date()"
/>
</el-form-item>
<el-form-item label="汇报人姓名" prop="jobName">
<el-input v-model="formData.jobName" placeholder="请输入汇报人姓名" />
</el-form-item>
<el-form-item label="汇报内容" prop="content">
<Editor v-model="formData.content" height="450px" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { JobInfoApi, JobInfoVO } from '@/api/system/jobinfo'
/** 工作汇报 表单 */
defineOptions({ name: 'JobInfoForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
title: undefined,
content: undefined,
jobDate: undefined,
jobName: undefined,
})
const formRules = reactive({
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await JobInfoApi.getJobInfo(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as JobInfoVO
if (formType.value === 'create') {
await JobInfoApi.createJobInfo(data)
message.success(t('common.createSuccess'))
} else {
await JobInfoApi.updateJobInfo(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
title: undefined,
content: undefined,
jobDate: undefined,
jobName: undefined,
}
formRef.value?.resetFields()
}
</script>

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

@ -0,0 +1,201 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="汇报标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入汇报标题"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="汇报人姓名" prop="jobName">
<el-input
v-model="queryParams.jobName"
placeholder="请输入汇报人姓名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</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-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:job-info:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="id" align="center" prop="id" />
<el-table-column label="汇报标题" align="center" prop="title" />
<el-table-column label="汇报日期" :formatter="dateFormatter2" align="center" prop="jobDate" />
<el-table-column label="汇报人姓名" align="center" prop="jobName" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="handleDetail(scope.row.id)"
v-hasPermi="['system:job-info:update']"
>
详情
</el-button>
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:job-info:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:job-info:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<JobInfoForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter,dateFormatter2 } from '@/utils/formatTime'
import download from '@/utils/download'
import { JobInfoApi, JobInfoVO } from '@/api/system/jobinfo'
import JobInfoForm from './JobInfoForm.vue'
/** 工作汇报 列表 */
defineOptions({ name: 'JobInfo' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<JobInfoVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
title: undefined,
jobName: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await JobInfoApi.getJobInfoPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDetail = async (id: number) => {
try {
//
await JobInfoApi.jobDetail(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await JobInfoApi.deleteJobInfo(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
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
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
Loading…
Cancel
Save