12 changed files with 400 additions and 14 deletions
			
			
		@ -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}" | 
				
			||||
        } | 
				
			||||
    ] | 
				
			||||
} | 
				
			||||
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						| 
		 After Width: | Height: | Size: 43 KiB  | 
| 
		 After Width: | Height: | Size: 44 KiB  | 
@ -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 }) | 
				
			||||
  }, | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -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) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 | 
				
			||||
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> | 
				
			||||
@ -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…
					
					
				
		Reference in new issue