Kaynağa Gözat

Merge branch 'kingbase' of http://git.cc-lotus.info/Information/technique_admin into kingbase

lrf 8 ay önce
ebeveyn
işleme
2bf95fee77

+ 1 - 0
src/lang/package/zh-cn/common.js

@@ -11,6 +11,7 @@ export default {
   dict: '字典数据',
   sign: '报名',
   journal: '期刊',
+  directory: '目录',
   delete_confirm: '您确定删除该数据?',
   search: '查询',
   reset: '重置',

+ 1 - 0
src/lang/package/zh-cn/menus.js

@@ -35,6 +35,7 @@ export default {
   support: '服务管理',
   journal: '行研产研管理',
   notes: '期刊管理',
+  directory: '目录管理',
   incubator: '全省孵化器情况',
   elevenHatch: '孵化器情况',
   log: '日志管理',

+ 14 - 1
src/lang/package/zh-cn/pages.js

@@ -333,11 +333,24 @@ export default {
     upDialogTitle: '修改期刊',
     examDialogTitle: '审核期刊',
     journal: '所属期刊',
+    file: '封面',
+    name: '名称',
+    brief: '简介',
+    status: '审核状态',
+    is_use: '是否启用',
+    titleMessage: '请输入期刊名称'
+  },
+  directory: {
+    addDialogTitle: '新增目录',
+    upDialogTitle: '修改目录',
+    examDialogTitle: '审核目录',
+    journal: '所属行研产研',
+    notes: '所属期刊',
     client: '委托方',
     partner: '合作方',
-    file: '封面',
     name: '名称',
     brief: '简介',
+    detail: '详情',
     status: '审核状态',
     is_use: '是否启用',
     titleMessage: '请输入期刊名称'

+ 40 - 0
src/store/api/platform/directory.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/directory'
+const axios = new AxiosWrapper()
+
+export const DirectoryStore = defineStore('directory', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, 'id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 223 - 0
src/views/journal/directory.vue

@@ -0,0 +1,223 @@
+<template>
+  <div class="main animate__animated animate__backInRight" v-loading="loading">
+    <el-col :span="24" class="one">
+      <el-button type="primary" @click="toBack()">返回</el-button>
+    </el-col>
+    <custom-search-bar :fields="fields.filter((f) => f.isSearch)" v-model="searchForm" @search="search" @reset="toReset"> </custom-search-bar>
+    <custom-button-bar :fields="buttonFields" @add="toAdd" @select="toMoreDelect"></custom-button-bar>
+    <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @exam="toExam" @edit="toEdit" @delete="toDelete" @toSelect="toSelect" :select="true">
+      <template #is_use="{ row }">
+        <el-tag v-if="row.is_use == '0'" type="success" @click="toUse(row, '1')">启用</el-tag>
+        <el-tag v-else type="info" @click="toUse(row, '0')">禁用</el-tag>
+      </template>
+    </custom-table>
+    <el-dialog v-model="dialog.show" :title="dialog.title" :destroy-on-close="false" @close="toClose">
+      <el-row>
+        <el-col :span="24" v-if="dialog.type == '1'">
+          <custom-form v-model="form" :fields="formFields" :rules="rules" @save="toSave">
+            <template #is_use>
+              <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
+            </template>
+            <template #detail>
+              <WangEditor v-model="form.detail" />
+            </template>
+          </custom-form>
+        </el-col>
+        <el-col :span="24" v-if="dialog.type == '2'">
+          <custom-form v-model="examForm" :fields="examFormFields" :rules="examRules" @save="toExamSave">
+            <template #status>
+              <el-option v-for="i in statusList" :key="i.id" :label="i.label" :value="i.value"></el-option>
+            </template>
+          </custom-form>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { cloneDeep, get } from 'lodash-es'
+const $checkRes = inject('$checkRes')
+const { t } = useI18n()
+// 接口
+import { DirectoryStore } from '@/store/api/platform/directory'
+import { DictDataStore } from '@/store/api/system/dictData'
+const store = DirectoryStore()
+const dictDataStore = DictDataStore()
+const data = ref([])
+const searchForm = ref({})
+const fields = [
+  { label: t('pages.directory.name'), model: 'name', isSearch: true },
+  { label: t('pages.directory.client'), model: 'client', isSearch: true },
+  { label: t('pages.directory.partner'), model: 'partner', isSearch: true },
+  { label: t('pages.directory.is_use'), model: 'is_use', custom: true, format: (i) => getDict(i, 'is_use') },
+  { label: t('pages.directory.status'), model: 'status', format: (i) => getDict(i, 'status') }
+]
+const opera = [
+  { label: t('common.update'), method: 'edit' },
+  { label: t('common.exam'), method: 'exam', type: 'warning', display: (i) => i.status === '0' },
+  { label: t('common.delete'), method: 'delete', confirm: true, type: 'danger', display: (i) => i.is_use === '1' }
+]
+const buttonFields = [
+  { label: t('common.create'), method: 'add' },
+  { label: t('common.select'), method: 'select', type: 'danger' }
+]
+let skip = 0
+let limit = inject('limit')
+const total = ref(0)
+// 路由
+const route = useRoute()
+// 字典表
+const isUseList = ref([])
+const statusList = ref([])
+// 多选列表
+const selectList = ref([])
+// 加载中
+const loading = ref(false)
+const formFields = ref([
+  { label: t('pages.directory.file'), model: 'file', custom: true },
+  { label: t('pages.directory.name'), model: 'name' },
+  { label: t('pages.directory.client'), model: 'client' },
+  { label: t('pages.directory.partner'), model: 'partner' },
+  { label: t('pages.directory.is_use'), model: 'is_use', type: 'radio' },
+  { label: t('pages.directory.brief'), model: 'brief', type: 'textarea' },
+  { label: t('pages.directory.detail'), model: 'detail', custom: true }
+])
+const rules = reactive({ name: [{ required: true, message: t('pages.directory.titleMessage'), trigger: 'blur' }] })
+const dialog = ref({ type: '1', show: false, title: t('pages.directory.addDialogTitle') })
+const form = ref({ notes: route.query.id, journal: route.query.journal })
+// 审核
+const examFormFields = [{ label: t('pages.directory.status'), model: 'status', type: 'select' }]
+const examRules = reactive({ status: [{ required: true, message: t('common.statusMessage'), trigger: 'blur' }] })
+const examForm = ref({})
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search({ skip, limit })
+  loading.value = false
+})
+
+const searchOther = async () => {
+  let result
+  // 是否使用
+  result = await dictDataStore.query({ code: 'isUse', is_use: '0' })
+  if ($checkRes(result)) isUseList.value = result.data
+  // 状态
+  result = await dictDataStore.query({ code: 'examStatus', is_use: '0' })
+  if ($checkRes(result)) statusList.value = result.data
+}
+const search = async (query = { skip, limit }) => {
+  skip = query.skip
+  limit = query.limit
+  const info = { skip: query.skip, limit: query.limit, ...searchForm.value, notes: route.query.id, journal: route.query.journal }
+  const res = await store.query(info)
+  if (res.errcode == '0') {
+    data.value = res.data
+    total.value = res.total
+  }
+}
+// 字典数据转换
+const getDict = (data, model) => {
+  if (data) {
+    let res
+    if (model == 'is_use') res = isUseList.value.find((f) => f.value == data)
+    else if (model == 'status') res = statusList.value.find((f) => f.value == data)
+    return get(res, 'label')
+  }
+}
+// 多选
+const toSelect = (val) => {
+  selectList.value = val
+}
+// 批量删除
+const toMoreDelect = () => {
+  if (selectList.value.length > 0) {
+    ElMessageBox.confirm(`确定批量删除数据?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' })
+      .then(async () => {
+        console.log(selectList.value)
+      })
+      .catch(() => {})
+  } else {
+    ElMessage({
+      message: '未选择要处理的数据!',
+      type: 'warning'
+    })
+  }
+}
+// 添加
+const toAdd = () => {
+  form.value = { notes: route.query.id, journal: route.query.journal }
+  dialog.value = { type: '1', show: true, title: t('pages.directory.addDialogTitle') }
+}
+// 修改
+const toEdit = (data) => {
+  if (!data.file) data.file = []
+  form.value = data
+  dialog.value = { type: '1', show: true, title: t('pages.directory.upDialogTitle') }
+}
+// 删除
+const toDelete = async (data) => {
+  const res = await store.del(data.id)
+  if ($checkRes(res, true)) {
+    search({ skip, limit })
+  }
+}
+const toSave = async () => {
+  const data = cloneDeep(form.value)
+  const other = { status: '0' }
+  let res
+  if (get(data, 'id')) res = await store.update({ ...data, ...other })
+  else res = await store.create({ ...data, ...other })
+  if ($checkRes(res, true)) {
+    search({ skip, limit })
+    toClose()
+  }
+}
+// 审核
+const toExam = (data) => {
+  examForm.value = data
+  dialog.value = { type: '2', show: true, title: t('pages.directory.examDialogTitle') }
+}
+// 审核保存
+const toExamSave = async () => {
+  const data = cloneDeep(examForm.value)
+  let res = await store.update({ id: data.id, status: data.status })
+  if ($checkRes(res, true)) {
+    search({ skip, limit })
+    toClose()
+  }
+}
+// 开启或禁用
+const toUse = async (data, is_use) => {
+  ElMessageBox.confirm(`确定修改【${data.name}】数据?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' })
+    .then(async () => {
+      let res = await store.update({ id: get(data, 'id'), is_use, status: get(data, 'status') })
+      if ($checkRes(res, true)) {
+        search({ skip, limit })
+      }
+    })
+    .catch(() => {})
+}
+// 重置
+const toReset = async () => {
+  searchForm.value = {}
+  await search({ skip, limit })
+}
+const toClose = () => {
+  form.value = { notes: route.query.id, journal: route.query.journal }
+  dialog.value = { show: false }
+}
+// 返回上一页
+const toBack = () => {
+  window.history.go(-1)
+}
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    margin: 0 0 10px 0;
+    text-align: right;
+  }
+}
+</style>

+ 20 - 5
src/views/journal/notes.vue

@@ -5,7 +5,19 @@
     </el-col>
     <custom-search-bar :fields="fields.filter((f) => f.isSearch)" v-model="searchForm" @search="search" @reset="toReset"> </custom-search-bar>
     <custom-button-bar :fields="buttonFields" @add="toAdd" @select="toMoreDelect"></custom-button-bar>
-    <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @exam="toExam" @edit="toEdit" @delete="toDelete" @toSelect="toSelect" :select="true">
+    <custom-table
+      :data="data"
+      :fields="fields"
+      @query="search"
+      :total="total"
+      :opera="opera"
+      @directory="toDirectory"
+      @exam="toExam"
+      @edit="toEdit"
+      @delete="toDelete"
+      @toSelect="toSelect"
+      :select="true"
+    >
       <template #is_use="{ row }">
         <el-tag v-if="row.is_use == '0'" type="success" @click="toUse(row, '1')">启用</el-tag>
         <el-tag v-else type="info" @click="toUse(row, '0')">禁用</el-tag>
@@ -39,6 +51,8 @@
 import { cloneDeep, get } from 'lodash-es'
 const $checkRes = inject('$checkRes')
 const { t } = useI18n()
+// 路由
+const router = useRouter()
 // 接口
 import { NotesStore } from '@/store/api/platform/notes'
 import { DictDataStore } from '@/store/api/system/dictData'
@@ -48,12 +62,11 @@ const data = ref([])
 const searchForm = ref({})
 const fields = [
   { label: t('pages.notes.name'), model: 'name', isSearch: true },
-  { label: t('pages.notes.client'), model: 'client', isSearch: true },
-  { label: t('pages.notes.partner'), model: 'partner', isSearch: true },
   { label: t('pages.notes.is_use'), model: 'is_use', custom: true, format: (i) => getDict(i, 'is_use') },
   { label: t('pages.notes.status'), model: 'status', format: (i) => getDict(i, 'status') }
 ]
 const opera = [
+  { label: t('common.directory'), method: 'directory' },
   { label: t('common.update'), method: 'edit' },
   { label: t('common.exam'), method: 'exam', type: 'warning', display: (i) => i.status === '0' },
   { label: t('common.delete'), method: 'delete', confirm: true, type: 'danger', display: (i) => i.is_use === '1' }
@@ -77,8 +90,6 @@ const loading = ref(false)
 const formFields = ref([
   { label: t('pages.notes.file'), model: 'file', custom: true },
   { label: t('pages.notes.name'), model: 'name' },
-  { label: t('pages.notes.client'), model: 'client' },
-  { label: t('pages.notes.partner'), model: 'partner' },
   { label: t('pages.notes.is_use'), model: 'is_use', type: 'radio' },
   { label: t('pages.notes.brief'), model: 'brief', type: 'textarea' }
 ])
@@ -129,6 +140,10 @@ const getDict = (data, model) => {
 const toSelect = (val) => {
   selectList.value = val
 }
+// 目录管理
+const toDirectory = (data) => {
+  router.push({ path: '/journal/directory', query: { id: data.id, journal: data.journal } })
+}
 // 批量删除
 const toMoreDelect = () => {
   if (selectList.value.length > 0) {