فهرست منبع

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner into dev

lifanagju_citu 9 ماه پیش
والد
کامیت
d739f5e927

+ 1 - 0
components.d.ts

@@ -20,6 +20,7 @@ declare module 'vue' {
     CtMenu: typeof import('./src/components/CtVuetify/CtMenu/index.vue')['default']
     CtPagination: typeof import('./src/components/CtPagination/index.vue')['default']
     CtSearch: typeof import('./src/components/CtSearch/index.vue')['default']
+    CtTable: typeof import('./src/components/CtTable/index.vue')['default']
     CtTextField: typeof import('./src/components/CtVuetify/CtTextField/index.vue')['default']
     DatePicker: typeof import('./src/components/DatePicker/index.vue')['default']
     Details: typeof import('./src/components/Enterprise/details.vue')['default']

+ 159 - 0
src/components/CtTable/index.vue

@@ -0,0 +1,159 @@
+<template>
+  <div>
+    <div v-if="isTools" class="text-end mb-3">
+      <v-btn class="ml-2" color="primary" @click="emit('add')">
+        <v-icon left>mdi-plus</v-icon>
+        新增
+      </v-btn>
+      <slot name="addToTools"></slot>
+    </div>
+    <v-data-table
+      ref="table"
+      :class="`elevation-${elevation} tableColor ${noRadius ? 'noRadius' : ''}`"
+      :headers="headers"
+      :items="items"
+      :item-key="itemKey"
+      :show-select="false"
+      :loading="loading"
+      color="primary"
+      hover
+      hide-default-footer
+      loading-text="Loading... Please wait"
+      fixed-header
+      return-object
+      :disable-sort="disableSort"
+      :items-per-page="itemsPerPage"
+      :no-data-text="noDataText"
+      :hide-default-header="hideDefaultHeader"
+    >
+      <template v-for="name in itemSlot" v-slot:[`item.${name}`]="slotProps">
+        <slot :name="name" v-bind="slotProps"></slot>
+      </template>
+      <template v-for="name in headerSlot" v-slot:[`${name}`]="slotProps">
+        <slot :name="name" v-bind="slotProps"></slot>
+      </template>
+      <template v-if="!Object.keys(slot).includes('actions')" v-slot:[`item.actions`]="{ item }">
+        <td>
+          <v-btn variant="text" color="primary" @click="edit(item)">编辑</v-btn>
+          <v-btn variant="text" color="error" @click="del(item)">删除</v-btn>
+        </td>
+      </template>
+      <template #bottom>
+        <div v-if="showPage && total > 0">
+          <v-divider></v-divider>
+          <CtPagination :total="total" :page="pageInfo.pageNo" :limit="pageInfo.pageSize" @handleChange="handleChangePage"></CtPagination>
+        </div>
+      </template>
+    </v-data-table>
+  </div>
+</template>
+
+<script setup>
+defineOptions({ name: 'CtTable'})
+import { ref, computed, useSlots } from 'vue'
+
+const emit = defineEmits(['pageHandleChange', 'del', 'edit', 'add'])
+defineProps({
+  elevation: {
+    type: [Number, String],
+    default: 0
+  },
+  itemKey: {
+    type: String,
+    default: 'id'
+  },
+  disableSort: {
+    type: Boolean,
+    default: true
+  },
+  // 展示列表所有数据
+  itemsPerPage: {
+    type: Number,
+    default: -1
+  },
+  hideDefaultHeader: {
+    type: Boolean,
+    default: false
+  },
+  showPage: {
+    type: Boolean,
+    default: true
+  },
+  loading: {
+    type: Boolean,
+    default: true
+  },
+  headers: {
+    type: Array,
+    default: () => []
+  },
+  items: {
+    type: Array,
+    default: () => []
+  },
+  total: {
+    type: [String, Number],
+    default: 0
+  },
+  pageInfo: {
+    type: Object,
+    default: () => ({
+      size: 10
+    })
+  },
+  isTools: {
+    type: Boolean,
+    default: true
+  },
+  height: {
+    type: [String, Number],
+    default: ''
+  },
+  noRadius: {
+    type: Boolean,
+    default: false
+  },
+  noDataText: {
+    type: String,
+    default: 'No data available'
+  }
+})
+
+const table = ref()
+const slot = useSlots()
+
+const itemSlot = computed(() => {
+  return Object.keys(slot).filter(key => {
+    const data = key.split('.')
+    return data.length === 1
+  })
+})
+
+const headerSlot = computed(() => {
+  return Object.keys(slot).filter(key => {
+    const data = key.split('.')
+    return data.length === 2 && data[0] === 'header'
+  })
+})
+
+const edit = (item) => {
+  emit('edit', item)
+}
+
+const del = (item) => {
+  emit('del', item)
+}
+
+const handleChangePage = (e) => {
+  emit('pageHandleChange', e)
+}
+</script>
+
+<style scoped lang="scss">
+:deep(.v-table > .v-table__wrapper > table > thead) {
+  background-color: #f7f8fa !important;
+}
+:deep(.v-selection-control__input) {
+  color: var(--v-primary-base) !important;
+}
+</style>

+ 1 - 1
src/views/entrances/list/index.vue

@@ -37,7 +37,7 @@ const smallTitle = [
 ]
 const menuList = ref([
   { icon: 'mdi-account-group-outline', title: '门墩儿直聘', to: '/personal' },
-  { icon: 'mdi-shopping-outline', title: '选商城', to: '/mall' },
+  { icon: 'mdi-shopping-outline', title: '选商城', to: '/mall' },
   { icon: 'mdi-school-outline', title: '火苗儿校企', to: '' },
   { icon: 'mdi-account-search', title: '门墩儿猎寻服务', to: '/headhunting' },
   { icon: 'mdi-town-hall', title: '门墩儿产业与院校联合会', to: '' },

+ 0 - 46
src/views/integral/pointsManagement/components/integralTable.vue

@@ -1,46 +0,0 @@
-<template>
-  <v-data-table
-    class="mt-3"
-    :items="items"
-    :headers="tab === 0 ? integralHeaders : balanceHeaders"
-    hover
-    item-value="id"
-  >
-    <template #bottom></template>
-  </v-data-table>
-</template>
-
-<script setup>
-defineOptions({ name: 'myRegistration-integralTable'})
-import { timesTampChange } from '@/utils/date'
-
-defineProps({
-  tab: Number,
-  items: Array
-})
-
-const integralHeaders = [
-  { title: '标题', key: 'title', sortable: false },
-  { title: '描述', key: 'description', sortable: false },
-  { title: '积分点', key: 'point', sortable: false },
-  { title: '剩余点数', key: 'totalPoint', sortable: false },
-  { title: '发生时间', key: 'createTime', value: item =>  timesTampChange(item.createTime), sortable: false },
-]
-const balanceHeaders = [
-  { title: '标题', key: 'title', sortable: false },
-  { title: '描述', key: 'description', sortable: false },
-  { title: '金额', key: 'balance', sortable: false},
-  { title: '账户余额', key: 'totalBalance', sortable: false },
-  { title: '发生时间', key: 'createTime', value: item =>  timesTampChange(item.createTime), sortable: false },
-]
-</script>
-
-<style scoped lang="scss">
-:deep(.v-table > .v-table__wrapper > table > thead) {
-  background-color: #f7f8fa !important;
-}
-:deep(.v-selection-control__input) {
-  // color: var(--v-primary-base) !important;
-  color: #767778;
-}
-</style>

+ 29 - 8
src/views/integral/pointsManagement/index.vue

@@ -8,14 +8,20 @@
         <v-tab :value="0">{{ $t('points.pointsDetails') }}</v-tab>
         <v-tab :value="1">{{ $t('points.balanceDetails') }}</v-tab>
       </v-tabs>
-      <TablePage :items="dataList" :tab="tab"></TablePage>
-      <CtPagination
-        v-if="total > 0"
+      <CtTable
+        class="mt-3"
+        :items="dataList"
+        :headers="tab === 0 ? integralHeaders : balanceHeaders"
+        :loading="false"
+        :elevation="0"
+        :isTools="false"
+        :showPage="true"
         :total="total"
-        :page="query.pageNo"
-        :limit="query.pageSize"
-        @handleChange="handleChangePage"
-      ></CtPagination>
+        :page-info="query"
+        itemKey="id"
+        @pageHandleChange="handleChangePage"
+      >
+      </CtTable>
     </div>
   </div>
 </template>
@@ -23,9 +29,9 @@
 <script setup>
 defineOptions({name: 'personal-pointsManagement-index'})
 import { ref } from 'vue'
+import { timesTampChange } from '@/utils/date'
 import { getUserRewardPointPage } from '@/api/integral'
 import { getEnterpriseAccountRecordPage } from '@/api/recruit/enterprise/member/points'
-import TablePage from './components/integralTable.vue'
 import integralShow from '@/views/integral/pointsManagement/components/integralShow.vue'
 
 const props = defineProps({
@@ -44,6 +50,21 @@ const query = ref({
 })
 const dataList = ref([])
 
+const integralHeaders = [
+  { title: '标题', key: 'title', sortable: false },
+  { title: '描述', key: 'description', sortable: false },
+  { title: '积分点', key: 'point', sortable: false },
+  { title: '剩余点数', key: 'totalPoint', sortable: false },
+  { title: '发生时间', key: 'createTime', value: item =>  timesTampChange(item.createTime), sortable: false },
+]
+const balanceHeaders = [
+  { title: '标题', key: 'title', sortable: false },
+  { title: '描述', key: 'description', sortable: false },
+  { title: '金额', key: 'balance', sortable: false},
+  { title: '账户余额', key: 'totalBalance', sortable: false },
+  { title: '发生时间', key: 'createTime', value: item =>  timesTampChange(item.createTime), sortable: false },
+]
+
 // 积分、签到明细
 const getData = async () => {
   const res = props.type ? await getEnterpriseAccountRecordPage(query.value) : await getUserRewardPointPage(query.value)

+ 1 - 1
src/views/recruit/enterprise/positionManagement/components/baseInfo.vue

@@ -3,7 +3,7 @@
     <CtForm ref="formPageRef" :items="items" style="width: 650px;">
       <template #explain>
         <div class="d-flex align-center font-size-13">
-          <div style="color: var(--v-error-base); cursor: pointer;" @click="handleViewRule">
+          <div style="color: var(--v-error-base); cursor: pointer; text-decoration: underline;" @click="handleViewRule">
             <v-icon size="20" color="error">mdi-help-circle-outline</v-icon>
             众聘岗位规则说明;
           </div>

+ 12 - 15
src/views/recruit/enterprise/systemManagement/groupAccount/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <v-card class="card-box d-flex pa-3" height="80vh">
+  <v-card class="card-box d-flex pa-3">
     <v-row no-gutters justify="space-between">
       <v-col cols="2">
         <div class="d-flex justify-start pr-3">
@@ -30,27 +30,24 @@
           <TextInput v-model="query.name" :item="textItem" @change="getUserList"></TextInput>
           <v-btn prepend-icon="mdi-plus" color="primary" @click="handleAdd(0)">{{ $t('enterprise.userManagement.inviteNewColleagues') }}</v-btn>
         </div>
-        <v-data-table
-          :loading="loading"
-          color="#00897B"
+        <CtTable
           :items="tableData"
           :headers="headers"
+          :loading="loading"
+          :elevation="0"
+          :is-tools="false"
+          :showPage="true"
+          :total="total"
+          :page-info="query"
+          itemKey="id"
+          @pageHandleChange="handleChangePage"
         >
-          <template v-slot:item.actions="{ item }">
+          <template #actions="{ item }">
             <v-btn color="primary" variant="text" @click="handleBinding(item)">{{ $t('enterprise.userManagement.jobBinding') }}</v-btn>
             <v-btn v-if="item.status === '1' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 0, item)">{{ $t('enterprise.userManagement.enable') }}</v-btn>
             <v-btn v-if="item.status === '0' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 1, item)">{{ $t('enterprise.userManagement.disable') }}</v-btn>
           </template>
-          <template #bottom>
-            <CtPagination
-              v-if="total > 0"
-              :total="total"
-              :page="query.pageNo"
-              :limit="query.pageSize"
-              @handleChange="handleChangePage"
-            ></CtPagination>
-          </template>
-        </v-data-table>
+        </CtTable>
       </v-col>
     </v-row>
   </v-card>

+ 19 - 26
src/views/recruit/enterprise/systemManagement/postManagement/index.vue

@@ -1,27 +1,20 @@
 <template>
   <v-card class="pa-5 card-box">
-    <div class="text-end">
-      <v-btn prepend-icon="mdi-plus" color="primary" @click="handleAdd">{{ $t('common.add') }}</v-btn>
-    </div>
-    <v-data-table
-      :headers="headers"
+    <CtTable
       :items="items"
-      hide-default-header
-      height="70vh"
-      item-value="id"
-    >
-      <template #bottom></template>
-      <template v-slot:item.actions="{ item }">
-        <v-btn color="primary" variant="text" @click="handleEdit(item)">{{ $t('common.edit') }}</v-btn>
-        <v-btn color="primary" variant="text" @click="handleDelete(item)">{{ $t('common.delete') }}</v-btn>
-      </template>
-    </v-data-table>
-    <CtPagination
+      :headers="headers"
+      :loading="false"
+      :elevation="0"
+      :showPage="true"
       :total="total"
-      :page="query.pageNo"
-      :limit="query.pageSize"
-      @handleChange="handleChangePage"
-    ></CtPagination>
+      :page-info="query"
+      itemKey="id"
+      @add="handleAdd"
+      @edit="handleEdit"
+      @del="handleDelete"
+      @pageHandleChange="handleChangePage"
+    >
+    </CtTable>
   </v-card>
 </template>
 
@@ -45,14 +38,14 @@ const query = ref({
 })
 
 const headers = [
-  { title: '岗位名称', key: 'nameCn' },
-  { title: '英文名称', key: 'nameEn' },
-  { title: '岗位缩写', key: 'code' },
-  { title: '显示顺序', key: 'sort' },
+  { title: '岗位名称', key: 'nameCn', sortable: false },
+  { title: '英文名称', key: 'nameEn', sortable: false },
+  { title: '岗位缩写', key: 'code', sortable: false },
+  { title: '显示顺序', key: 'sort', sortable: false },
   { title: '状态', key: 'status', value: item => item.status === '1' ? '停用' : '正常', sortable: false },
-  { title: '备注', key: 'remark' },
+  { title: '备注', key: 'remark', sortable: false },
   { title: '更新时间', key: 'updateTime', value: item => timesTampChange(item.updateTime), sortable: false },
-  { title: t('common.actions'), key: 'actions' }
+  { title: t('common.actions'), key: 'actions', sortable: false }
 ]
 
 const getList = async () => {