Sfoglia il codice sorgente

修改行研产研

zs 8 mesi fa
parent
commit
93d0fd0e3a

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

@@ -9,7 +9,8 @@ export default {
   password: '修改密码',
   log: '日志管理',
   message: '站内消息',
-  journal: '行研产研'
+  journal: '行研产研',
+  journal_notes: '期刊管理'
 
   // system_menus: '菜单设置',
   // system_userMenus: '用户目录',

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

@@ -358,6 +358,7 @@ export default {
     file: '封面',
     name: '名称',
     brief: '简介',
+    content: '内容',
     status: '审核状态',
     is_use: '是否启用',
     titleMessage: '请输入期刊名称'

+ 1 - 1
src/router/guard.js

@@ -3,7 +3,7 @@ import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 import { UserStore } from '@/store/user'
 import { ElMessage } from 'element-plus'
-const whiteList = ['/redirect', '/login', '/401', '/404', '/test']
+const whiteList = ['/redirect', '/login', '/401', '/404', '/test', '/journal/notes']
 NProgress.configure({ showSpinner: false }) // 进度条
 const dontRedirectList = ['/login', '/', '/401', '/404']
 const getRedirectUri = (route) => {

+ 11 - 0
src/router/modules/journal.js

@@ -10,5 +10,16 @@ export const routes = [
       alwaysShow: false
     },
     component: () => import('@/views/journal/index.vue')
+  },
+  {
+    path: '/journal/notes',
+    name: 'journal_notes',
+    meta: {
+      title: i18n.global.t('menus.journal_notes'),
+      affix: true,
+      keepAlive: true,
+      alwaysShow: false
+    },
+    component: () => import('@/views/journal/notes.vue')
   }
 ]

+ 5 - 6
src/utils/axios-wrapper.js

@@ -1,17 +1,17 @@
 /* eslint-disable no-console */
 /* eslint-disable no-param-reassign */
 
-import { get, isObject, pick, isArray } from 'lodash-es'
+import { get, pick, isArray } from 'lodash-es'
 import Axios from 'axios'
-import { trimData, isNullOrUndefined } from './util-methods'
+import { isNullOrUndefined } from './util-methods'
 import { ErrorCode } from './error-code'
 import router from '@/router'
 import i18n from '@/lang'
 import * as crypto from './crypto'
-import { ElMessage, ElMessageBox } from 'element-plus'
+import { ElMessageBox } from 'element-plus'
 let currentRequests = 0
 const { VITE_APP_BASE_API, VITE_USE_CRYPTO } = import.meta.env
-const userErrorCodeList = ['NOT_LOGIN', 'ACCOUNT_HAS_EXPIRED', 'ACCOUNT_LOGGED_IN_ELESWHERE', 'USER_NOT_FOUND', 'USER_IS_DISABLED', 'ROLE_IS_DISABLED', 'SERVICE_REPEAT', 'SERVICE_COPY', 'SERVICE_END']
+const userErrorCodeList = ['NOT_LOGIN', 'ACCOUNT_HAS_EXPIRED', 'ACCOUNT_LOGGED_IN_ELESWHERE', 'USER_NOT_FOUND', 'USER_IS_DISABLED', 'ROLE_IS_DISABLED']
 export class AxiosWrapper {
   constructor({ baseUrl = VITE_APP_BASE_API, unwrap = true } = {}) {
     this.baseUrl = baseUrl
@@ -126,6 +126,7 @@ export class AxiosWrapper {
         console.warn(`[${uri}] fail: ${errcode}-${errmsg} ${details}`)
         if (errcode !== 0) {
           if (userErrorCodeList.includes(errcode)) {
+            console.log(errcode)
             const nowRouteFullPath = router.currentRoute.value.fullPath
             ElMessageBox.confirm(errmsg, i18n.global.t('common.user_confirm'), {
               confirmButtonText: i18n.global.t('common.re_login'),
@@ -138,8 +139,6 @@ export class AxiosWrapper {
               .catch(() => {
                 if (nowRouteFullPath !== '/login') location.reload()
               })
-          } else {
-            ElMessage.error(errmsg)
           }
         }
         return returnRes

+ 2 - 0
src/utils/error-code.js

@@ -17,6 +17,7 @@ const DATABASE_FAULT = 'DATABASE_FAULT'
 const FILE_FAULT = 'FILE_FAULT'
 const USER_NOT_BIND = 'USER_NOT_BIND'
 const BUSINESS = 'BUSINESS'
+const SERVICE_COPY = 'SERVICE_COPY'
 
 const ErrorCode = {
   [UNKNOW]: -1,
@@ -35,6 +36,7 @@ const ErrorCode = {
   [DATABASE_FAULT]: -14,
   [FILE_FAULT]: -15,
   [USER_NOT_BIND]: -16,
+  [SERVICE_COPY]: -17,
   [BUSINESS]: -100
 }
 

+ 4 - 1
src/views/information/parts/match/score/index.vue

@@ -49,7 +49,10 @@
               <el-option v-for="i in matchPathList" disabled :key="i.id" :label="i.name" :value="i.id"></el-option>
             </template>
             <template #sign>
-              <el-option v-for="i in signList" :key="i.id" :label="i.name" :value="i.id"></el-option>
+              <el-option v-for="i in signList" :key="i.id" :label="i.name" :value="i.id">
+                <span style="float: left">{{ i.name }}</span>
+                <span style="float: right; font-size: 13px" v-if="i.card">身份证号码:{{ i.card }} </span>
+              </el-option>
             </template>
           </custom-form>
         </el-col>

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

@@ -1,223 +0,0 @@
-<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>

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

@@ -5,19 +5,7 @@
     </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"
-      @directory="toDirectory"
-      @exam="toExam"
-      @edit="toEdit"
-      @delete="toDelete"
-      @toSelect="toSelect"
-      :select="true"
-    >
+    <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>
@@ -33,6 +21,9 @@
             <template #is_use>
               <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
             </template>
+            <template #content>
+              <WangEditor v-model="form.content" />
+            </template>
           </custom-form>
         </el-col>
         <el-col :span="24" v-if="dialog.type == '2'">
@@ -51,8 +42,6 @@
 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'
@@ -66,7 +55,6 @@ const fields = [
   { 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' }
@@ -91,6 +79,7 @@ const formFields = ref([
   { label: t('pages.notes.file'), model: 'file', custom: true },
   { label: t('pages.notes.name'), model: 'name' },
   { label: t('pages.notes.is_use'), model: 'is_use', type: 'radio' },
+  { label: t('pages.notes.content'), model: 'content', custom: true },
   { label: t('pages.notes.brief'), model: 'brief', type: 'textarea' }
 ])
 const rules = reactive({ name: [{ required: true, message: t('pages.notes.titleMessage'), trigger: 'blur' }] })
@@ -140,10 +129,6 @@ 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) {