فهرست منبع

人才地图-标签管理

Xiao_123 4 روز پیش
والد
کامیت
eec55f2513

+ 37 - 0
src/api/menduner/system/talentMap/tag.ts

@@ -0,0 +1,37 @@
+import request from '@/config/axios'
+
+export const talentTagApi = {
+	// 标签列表
+	getTalentTagList: async () => {
+		return await request.get({ 
+			url: `/api/parse/get-talent-tag-list`, 
+			baseURL: import.meta.env.VITE_BASE_URL 
+		})
+	},
+
+	// 创建人才标签
+	createTalentTag: async (data: TagVO) => {
+		return await request.post({ 
+			url: `/api/parse/create-talent-tag`, 
+			data, 
+			baseURL: import.meta.env.VITE_BASE_URL
+		})
+	},
+
+	// 更新人才标签
+	updateTalentTag: async (tag_id: number, data: TagVO) => {
+		return await request.put({ 
+			url: `/api/parse/update-talent-tag/${tag_id}`, 
+			data, 
+			baseURL: import.meta.env.VITE_BASE_URL 
+		})
+	},
+
+	// 删除人才标签
+	deleteTalentTag: async (tag_id: number) => {
+		return await request.delete({ 
+			url: `/api/parse/delete-talent-tag/${tag_id}`, 
+			baseURL: import.meta.env.VITE_BASE_URL 
+		})
+	}
+}

+ 2 - 1
src/config/axios/index.ts

@@ -5,13 +5,14 @@ import { config } from './config'
 const { default_headers } = config
 
 const request = (option: any) => {
-  const { url, method, params, data, headersType, responseType, ...config } = option
+  const { url, method, params, data, headersType, responseType, baseURL, ...config } = option
   return service({
     url: url,
     method,
     params,
     data,
     ...config,
+    baseURL,
     responseType: responseType,
     headers: {
       'Content-Type': headersType || default_headers

+ 122 - 0
src/views/menduner/system/talentMap/tag/TagForm.vue

@@ -0,0 +1,122 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="80px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="标签名称" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入标签名称" />
+      </el-form-item>
+      <el-form-item label="标签分类" prop="category">
+        <el-input v-model="formData.category" disabled placeholder="请输入标签分类" />
+      </el-form-item>
+      <el-form-item label="标签描述" prop="description">
+        <el-input v-model="formData.description" type="textarea" :rows="3" placeholder="请输入标签描述" />
+      </el-form-item>
+      <el-form-item label="标签状态" prop="status">
+        <el-radio-group v-model="formData.status">
+          <el-radio
+            v-for="dict in statusOptions"
+            :key="dict.value"
+            :value="dict.value"
+          >
+            {{ dict.label }}
+          </el-radio>
+        </el-radio-group>
+      </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 { talentTagApi } from '@/api/menduner/system/talentMap/tag'
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const statusOptions = [
+	{ label: '启用', value: 'active' },
+	{ label: '禁用', value: 'disable' },
+]
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formRef = ref() // 表单 Ref
+const formData = ref({
+  name: undefined,
+  description: undefined,
+  category: '人才',
+  status: 'active'
+})
+const formRules = reactive({
+  status: [{ required: true, message: '标签状态不能为空', trigger: 'blur' }],
+  name: [{ required: true, message: '标签中文名称不能为空', trigger: 'blur' }]
+})
+
+/** 打开弹窗 */
+const open = async (type: string, data?: any) => {
+  
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+
+  // 修改时,设置数据
+  if (data && Object.keys(data).length) {
+    formData.value = data
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  if (!formRef) return
+  await formRef.value.validate()
+
+  const params = {
+    status: formData.value.status,
+    category: formData.value.category,
+    description: formData.value.description,
+    name: formData.value.name
+  }
+
+  // 提交请求
+  formLoading.value = true
+  try {
+    if (formType.value === 'create') {
+      await talentTagApi.createTalentTag(params)
+      message.success(t('common.createSuccess'))
+    } else {
+      await talentTagApi.updateTalentTag(formData.value.id, params)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    name: undefined,
+    description: undefined,
+    category: '人才',
+    status: 'active'
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 164 - 0
src/views/menduner/system/talentMap/tag/index.vue

@@ -0,0 +1,164 @@
+<template>
+  <!-- 搜索工作栏 -->
+  <ContentWrap>
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="标签名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入标签中文名称"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="标签分类" prop="category">
+        <el-input
+          v-model="queryParams.category"
+          placeholder="请输入标签分类"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </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 statusOptions"
+            :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-button
+          type="primary"
+          plain
+          @click="openForm('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" row-key="id">
+      <el-table-column label="标签名称" align="center" prop="name" />
+      <el-table-column label="标签英文名称" align="center" prop="en_name" :show-overflow-tooltip="true" />
+      <el-table-column label="标签分类" align="center" prop="category" />
+      <el-table-column label="标签描述" align="center" prop="description" :show-overflow-tooltip="true" />
+      <el-table-column label="标签状态" align="center" prop="status">
+        <template #default="scope">
+          <el-tag :type="scope.row.status === 'active' ? 'success' : 'danger'">
+            {{ scope.row.status === 'active' ? '已启用' : '已禁用' }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新时间" align="center" prop="time" width="180" />
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row)"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <TagForm ref="formRef" @success="getList" />
+</template>
+<script setup lang="ts" name="Tag">
+import { talentTagApi } from '@/api/menduner/system/talentMap/tag'
+import TagForm from './TagForm.vue'
+
+const loading = ref(false)
+const list = ref([])
+const queryParams = reactive({
+  name: undefined,
+  category: undefined,
+  status: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const statusOptions = [
+	{ label: '启用', value: 'active' },
+	{ label: '禁用', value: 'disable' },
+]
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await talentTagApi.getTalentTagList()
+    list.value = data
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, data?: any) => {
+  formRef.value.open(type, data)
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await talentTagApi.deleteTalentTag(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    setTimeout(async () => {
+      await getList()
+    }, 0)
+  } catch {}
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 10 - 0
vite.config.ts

@@ -37,6 +37,16 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
       //     rewrite: (path) => path.replace(new RegExp(`^/admin-api`), ''),
       //   },
       // },
+
+      proxy: {
+        '/api': {
+          target: 'http://192.168.3.143:5500',
+          // target: 'https://company.citupro.com:18183',
+          secure: false, // 是否支持 https,默认 false
+          changeOrigin: true, // 是否支持跨域
+          rewrite: (path) => path.replace(new RegExp(`^/api`), '/api')
+        }
+      }
     },
     // 项目使用的vite插件。 单独提取到build/vite/plugin中管理
     plugins: createVitePlugins(),