Procházet zdrojové kódy

科技人才-栏目-招聘信息更新

guhongwei před 5 roky
rodič
revize
d7de1cf4ef

+ 13 - 1
src/layout/layout-part/menus.vue

@@ -8,7 +8,19 @@
       <el-menu-item index="/record/index"> <i class="el-icon-s-grid"></i>科技数据</el-menu-item>
       <el-menu-item index="/serve/index"> <i class="el-icon-s-grid"></i>科技服务</el-menu-item>
       <el-menu-item index="/resource/index"> <i class="el-icon-s-grid"></i>科技资源</el-menu-item>
-      <el-menu-item index="/personnel/index"> <i class="el-icon-s-grid"></i>科技人才</el-menu-item>
+      <el-submenu index="1">
+        <template v-slot:title>
+          <i class="el-icon-s-grid"></i>
+          <span>科技人才</span>
+        </template>
+        <el-menu-item-group>
+          <el-menu-item index="/personnel/column">栏目管理</el-menu-item>
+          <el-menu-item index="/personnel/recruit">招聘信息管理</el-menu-item>
+          <el-menu-item index="/personnel/resume">人才信息管理</el-menu-item>
+          <el-menu-item index="/personnel/experts">专家信息管理</el-menu-item>
+          <el-menu-item index="/personnel/informate">基本信息管理</el-menu-item>
+        </el-menu-item-group>
+      </el-submenu>
       <el-menu-item index="/site/index"> <i class="el-icon-s-grid"></i>站点信息管理</el-menu-item>
       <el-menu-item index="/links/index"> <i class="el-icon-attract"></i>友情链接管理</el-menu-item>
     </el-menu>

+ 99 - 0
src/layout/personnel/column.vue

@@ -0,0 +1,99 @@
+<template>
+  <div id="column">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="24" class="top">
+          <el-col :span="12" class="topTitle">
+            <span>栏目列表</span>
+          </el-col>
+          <el-col :span="12" class="topAdd">
+            <el-button type="primary" size="mini" @click="addData()"><i class="el-icon-plus"></i></el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="list">
+          <template>
+            <el-table :data="columnInfo" style="width: 100%">
+              <!-- <el-table-column label="栏目名称" align="center">
+                <template slot-scope="scoped">
+                  <el-tooltip effect="dark" content="点击查询栏目" placement="left">
+                    <el-col :span="24" @click.native="handleClick(scoped.row)">{{ scoped.row.name }}</el-col>
+                  </el-tooltip>
+                </template>
+              </el-table-column> -->
+              <el-table-column prop="name" label="栏目名称" align="center"> </el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot-scope="scoped">
+                  <el-button type="text" size="small" @click="$router.push({ path: '/personnel/columnDetail', query: { id: scoped.row.id } })"
+                    ><i class="el-icon-edit"></i
+                  ></el-button>
+                  <el-button type="text" size="small" @click="handleDelete(scoped.row)"><i class="el-icon-delete"></i></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <el-col :span="24" class="page">
+              <el-pagination
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :current-page="currentPage"
+                layout="total, prev, pager, next, jumper"
+                :total="total"
+              >
+              </el-pagination>
+            </el-col>
+          </template>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'column',
+  props: {
+    columnInfo: null,
+    total: null,
+  },
+  components: {},
+  data: () => ({
+    currentPage: 1,
+  }),
+  created() {},
+  computed: {},
+  methods: {
+    addData() {
+      this.$router.push({ path: '/personnel/columnDetail' });
+    },
+    handleDelete(item) {
+      this.$emit('delete', item);
+    },
+    handleClick(row) {
+      this.$emit('list', { data: row });
+    },
+    handleSizeChange(val) {
+      console.log(`每页 ${val} 条`);
+    },
+    handleCurrentChange(val) {
+      console.log(`当前页: ${val}`);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.top {
+  padding: 15px 0;
+  border-bottom: 1px solid #cccc;
+}
+.top .topTitle {
+  padding: 0 10px;
+}
+.top .topAdd {
+  padding: 0 10px 0 0;
+  text-align: right;
+}
+.page {
+  padding: 20px 0;
+  text-align: center;
+}
+</style>

+ 69 - 0
src/layout/personnel/columnDetail.vue

@@ -0,0 +1,69 @@
+<template>
+  <div id="columnDetail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <el-col :span="12" class="topTitle">
+            添加栏目
+          </el-col>
+          <el-col :span="12" class="topBtn">
+            <el-button type="primary" size="mini" @click="returnBtn()">返回</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="messgae">
+          <el-form ref="form" :model="form" label-width="80px">
+            <el-form-item label="栏目名称">
+              <el-input v-model="form.name"></el-input>
+            </el-form-item>
+            <el-form-item label="所在位置">
+              <el-select v-model="form.site" placeholder="请选择所在位置">
+                <el-option label="招聘信息" value="zpxx"></el-option>
+                <el-option label="就业指导" value="jyzd"></el-option>
+                <el-option label="学习实践" value="xxsj"></el-option>
+                <el-option label="勤工俭学" value="qgjx"></el-option>
+                <el-option label="工作顾问" value="gzgw"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit()">提交</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'columnDetail',
+  props: {
+    form: null,
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {
+    onSubmit() {
+      this.$emit('submitDate', { data: this.form, id: this.form.id });
+    },
+    returnBtn() {
+      this.$router.push({ path: '/personnel/column' });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.top {
+  padding: 15px 0;
+}
+.top .topTitle {
+  text-align: left;
+}
+.top .topBtn {
+  text-align: right;
+  padding: 0 5px;
+}
+</style>

+ 117 - 0
src/layout/personnel/recruit.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="column">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col :span="24" class="top">
+          <el-col :span="12" class="topTitle">
+            <span>招聘信息列表</span>
+          </el-col>
+          <el-col :span="12" class="topAdd">
+            <el-button type="primary" size="mini" @click="addData()"><i class="el-icon-plus"></i></el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="list">
+          <template>
+            <el-table :data="recruitInfo" style="width: 100%">
+              <!-- <el-table-column label="栏目名称" align="center">
+                <template slot-scope="scoped">
+                  <el-tooltip effect="dark" content="点击查询栏目" placement="left">
+                    <el-col :span="24" @click.native="handleClick(scoped.row)">{{ scoped.row.name }}</el-col>
+                  </el-tooltip>
+                </template>
+              </el-table-column> -->
+              <el-table-column prop="license" label="信用代码" align="center"> </el-table-column>
+              <el-table-column prop="name" label="招聘信息名称" align="center"> </el-table-column>
+              <el-table-column prop="column_name" label="所属栏目" align="center"> </el-table-column>
+              <el-table-column prop="salary" label="职位月薪" align="center"> </el-table-column>
+              <el-table-column prop="job_nature" label="工作性质" align="center">
+                <template v-slot="scoped">
+                  {{ `${scoped.row.job_nature}` === `0` ? '兼职' : '全职' }}
+                </template>
+              </el-table-column>
+              <el-table-column prop="profession" label="公司名称" align="center"> </el-table-column>
+              <el-table-column prop="workplace" label="公司地址" align="center"> </el-table-column>
+              <el-table-column prop="workexp" label="工作经验" align="center"> </el-table-column>
+              <el-table-column prop="education" label="学历" align="center"> </el-table-column>
+              <el-table-column prop="people_number" label="招聘人数" align="center"> </el-table-column>
+              <el-table-column prop="state" label="状态" align="center">
+                <template v-slot="scoped">
+                  {{ `${scoped.row.state}` === `0` ? '草稿' : `${scoped.row.state}` === `1` ? '发布' : '删除' }}
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot-scope="scoped">
+                  <el-button type="text" size="small" @click="$router.push({ path: '/personnel/recruitDetail', query: { id: scoped.row.id } })"
+                    ><i class="el-icon-edit"></i
+                  ></el-button>
+                  <el-button type="text" size="small" @click="handleDelete(scoped.row)"><i class="el-icon-delete"></i></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <el-col :span="24" class="page">
+              <el-pagination
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :current-page="currentPage"
+                layout="total, prev, pager, next, jumper"
+                :total="total"
+              >
+              </el-pagination>
+            </el-col>
+          </template>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'column',
+  props: {
+    recruitInfo: null,
+    total: null,
+  },
+  components: {},
+  data: () => ({
+    currentPage: 1,
+  }),
+  created() {},
+  computed: {},
+  methods: {
+    addData() {
+      this.$router.push({ path: '/personnel/recruitDetail' });
+    },
+    handleDelete(item) {
+      this.$emit('delete', item);
+    },
+    handleClick(row) {
+      this.$emit('list', { data: row });
+    },
+    handleSizeChange(val) {
+      console.log(`每页 ${val} 条`);
+    },
+    handleCurrentChange(val) {
+      console.log(`当前页: ${val}`);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.top {
+  padding: 15px 0;
+  border-bottom: 1px solid #cccc;
+}
+.top .topTitle {
+  padding: 0 10px;
+}
+.top .topAdd {
+  padding: 0 10px 0 0;
+  text-align: right;
+}
+.page {
+  padding: 20px 0;
+  text-align: center;
+}
+</style>

+ 137 - 0
src/layout/personnel/recruitDetail.vue

@@ -0,0 +1,137 @@
+<template>
+  <div id="recruitDetail">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="top">
+          <el-col :span="12" class="topTitle">
+            添加招聘信息
+          </el-col>
+          <el-col :span="12" class="topBtn">
+            <el-button type="primary" size="mini" @click="returnBtn()">返回</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="messgae">
+          <el-form ref="form" :model="form" label-width="100px">
+            <el-form-item label="信用代码">
+              <el-input v-model="form.license"></el-input>
+            </el-form-item>
+            <el-form-item label="招聘信息名称">
+              <el-input v-model="form.name"></el-input>
+            </el-form-item>
+            <el-form-item label="所在位置">
+              <el-select v-model="form.site" placeholder="请选择所在位置">
+                <el-option label="招聘信息" value="zpxx"></el-option>
+                <el-option label="就业指导" value="jyzd"></el-option>
+                <el-option label="学习实践" value="xxsj"></el-option>
+                <el-option label="勤工俭学" value="qgjx"></el-option>
+                <el-option label="工作顾问" value="gzgw"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="职位月薪">
+              <el-input v-model="form.salary"></el-input>
+            </el-form-item>
+            <el-form-item label="工作性质">
+              <el-select v-model="form.job_nature" placeholder="请选择工作性质">
+                <el-option label="兼职" value="0"></el-option>
+                <el-option label="全职" value="1"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="公司名称">
+              <el-input v-model="form.profession"></el-input>
+            </el-form-item>
+            <el-form-item label="工作地点">
+              <el-input v-model="form.workplace"></el-input>
+            </el-form-item>
+            <el-form-item label="工作经验">
+              <el-input v-model="form.workexp"></el-input>
+            </el-form-item>
+            <el-form-item label="学历">
+              <el-select v-model="form.education" placeholder="请选择学历要求">
+                <el-option v-for="(item, index) in edu_list" :key="index" :label="item.name" :value="item.name"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="招聘人数">
+              <el-input v-model="form.people_number"></el-input>
+            </el-form-item>
+            <el-form-item label="职位说明">
+              <el-input type="textarea" v-model="form.explains"></el-input>
+            </el-form-item>
+            <el-form-item label="状态">
+              <el-select v-model="form.state" placeholder="请选择信息状态">
+                <el-option label="草稿" value="0"></el-option>
+                <el-option label="发布" value="1" :disabled="true"></el-option>
+                <el-option label="删除" value="2" :disabled="true"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit()">提交</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: mapDictionary } = createNamespacedHelpers('dictionary');
+export default {
+  name: 'recruitDetail',
+  props: {
+    form: null,
+  },
+  components: {},
+  data: () => ({
+    edu_list: [
+      {
+        name: '中专及以上',
+      },
+      {
+        name: '大专及以上',
+      },
+      {
+        name: '本科及以上',
+      },
+      {
+        name: '研究生及以上',
+      },
+    ],
+  }),
+  created() {
+    // this.otherList();
+  },
+  computed: {},
+  methods: {
+    ...mapDictionary(['dicOperation']),
+    onSubmit() {
+      this.$emit('submitDate', { data: this.form, id: this.form.id });
+    },
+    returnBtn() {
+      this.$router.push({ path: '/personnel/recruit' });
+    },
+    // async otherList(type) {
+    //   console.log(type);
+    //   let result = await this.dicOperation('xl');
+    //   if (`${result.errcode}` === '0') {
+    //     this.$set(this, `edu_list`, result.data);
+    //   } else {
+    //     this.$message.error(result.errmsg ? result.errmsg : 'error');
+    //   }
+    // },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.top {
+  padding: 15px 0;
+}
+.top .topTitle {
+  text-align: left;
+}
+.top .topBtn {
+  text-align: right;
+  padding: 0 5px;
+}
+</style>

+ 33 - 3
src/router/index.js

@@ -81,10 +81,40 @@ export default new Router({
       path: '/resource/index',
       component: () => import('../views/resource/index.vue'),
     },
-    // 科技人才
+    // 科技人才-栏目管理
     {
-      path: '/personnel/index',
-      component: () => import('../views/personnel/index.vue'),
+      path: '/personnel/column',
+      component: () => import('../views/personnel/column.vue'),
+    },
+    // 科技人才-添加栏目
+    {
+      path: '/personnel/columnDetail',
+      component: () => import('../views/personnel/columnDetail.vue'),
+    },
+    // 科技人才-招聘信息管理
+    {
+      path: '/personnel/recruit',
+      component: () => import('../views/personnel/recruit.vue'),
+    },
+    // 科技人才-添加招聘信息
+    {
+      path: '/personnel/recruitDetail',
+      component: () => import('../views/personnel/recruitDetail.vue'),
+    },
+    // 科技人才-人才信息管理
+    {
+      path: '/personnel/resume',
+      component: () => import('../views/personnel/resume.vue'),
+    },
+    // 科技人才-专家信息管理
+    {
+      path: '/personnel/experts',
+      component: () => import('../views/personnel/experts.vue'),
+    },
+    // 科技人才-基本信息管理
+    {
+      path: '/personnel/informate',
+      component: () => import('../views/personnel/informate.vue'),
     },
     // 站点信息
     {

+ 34 - 0
src/store/dictionary.js

@@ -0,0 +1,34 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  dictionary: '/api/code/{type}/items', //type === xzqh:query:level(1/2);parent(无/code)
+  findOne: '/api/code/xzqh/findOne', //query:name
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  // 字典表
+  async dicOperation({ state }, type) {
+    let result;
+    if (!_.isObject(type)) {
+      result = await this.$axios.$get(api.dictionary, { type: type });
+    } else {
+      let { level, parent, name } = type;
+      if (name) {
+        result = await this.$axios.$get(api.findOne, {}, { name: name });
+      } else {
+        result = await this.$axios.$get(api.dictionary, { type: 'xzqh' }, { level: level, parent: parent });
+      }
+    }
+    return result;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 13 - 0
src/store/index.js

@@ -11,6 +11,13 @@ import recordNews from './recordNews';
 import serveColumn from './serveColumn';
 import serveNews from './serveNews';
 
+import talentColumn from './talentColumn';
+import talentExperts from './talentExperts';
+import talentInformation from './talentInformation';
+import talentRecruitment from './talentRecruitment';
+import talentResume from './talentResume';
+import dictionary from './dictionary';
+
 Vue.use(Vuex);
 
 export default new Vuex.Store({
@@ -25,6 +32,12 @@ export default new Vuex.Store({
     recordNews,
     serveColumn,
     serveNews,
+    talentColumn,
+    talentExperts,
+    talentInformation,
+    talentRecruitment,
+    talentResume,
+    dictionary,
   },
   state: {},
   mutations: {},

+ 38 - 0
src/store/talentColumn.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  columnInfo: `/api/talent/column`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.columnInfo}`, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.columnInfo}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.columnInfo}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.columnInfo}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.columnInfo}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 38 - 0
src/store/talentExperts.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  expertsInfo: `/api/talent/experts`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.expertsInfo}`, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.expertsInfo}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.expertsInfo}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.expertsInfo}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.expertsInfo}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 38 - 0
src/store/talentInformation.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  informate: `/api/talent/information`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.informate}`, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.informate}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.informate}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.informate}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.informate}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 38 - 0
src/store/talentRecruitment.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  recruit: `/api/talent/recruitment`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.recruit}`, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.recruit}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.recruit}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.recruit}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.recruit}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 38 - 0
src/store/talentResume.js

@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  resumeInfo: `/api/talent/resume`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.resumeInfo}`, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.resumeInfo}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.resumeInfo}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.resumeInfo}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.resumeInfo}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 62 - 0
src/views/personnel/column.vue

@@ -0,0 +1,62 @@
+<template>
+  <div id="column">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <columnInfo :columnInfo="columnInfo" :total="total" @delete="deleteData"></columnInfo>
+        <!-- :columnInfo="columnInfo" @delete="deleteData" @list="handleList" -->
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import topInfo from '@/layout/public/top.vue';
+import columnInfo from '@/layout/personnel/column.vue';
+import { createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: mapColumn } = createNamespacedHelpers('talentColumn');
+export default {
+  name: 'column',
+  props: {},
+  components: {
+    topInfo,
+    columnInfo,
+  },
+  data: () => ({
+    topTitle: '栏目管理',
+    columnInfo: [],
+    total: 1,
+  }),
+  created() {
+    this.search();
+  },
+  computed: {},
+  methods: {
+    ...mapColumn(['query', 'delete', 'fetch']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `columnInfo`, res.data);
+        this.$set(this, `total`, res.total);
+        console.log(res);
+      }
+    },
+    async deleteData(item) {
+      const res = await this.delete(item.id);
+      this.$checkRes(res, '删除成功', '删除失败');
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 20px;
+  margin: 10px 20px;
+  border: 1px solid #ccc;
+  width: 96%;
+}
+</style>

+ 76 - 0
src/views/personnel/columnDetail.vue

@@ -0,0 +1,76 @@
+<template>
+  <div id="columnDetail">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <column :form="form" @submitDate="onSubmit"></column>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import topInfo from '@/layout/public/top.vue';
+import column from '@/layout/personnel/columnDetail.vue';
+import { createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('talentColumn');
+export default {
+  name: 'columnDetail',
+  props: {},
+  components: {
+    column,
+    topInfo,
+  },
+  data: () => ({
+    topTitle: '添加栏目',
+    form: {},
+  }),
+  created() {
+    this.search();
+  },
+  computed: {
+    id() {
+      return this.$route.query.id;
+    },
+    keyWord() {
+      let meta = this.$route.meta;
+      let main = meta.title || '';
+      return main;
+    },
+  },
+  methods: {
+    ...mapActions(['fetch', 'create', 'update']),
+    async search() {
+      if (this.$route.query.id) {
+        const res = await this.fetch(this.id);
+        this.$set(this, `form`, res.data);
+      }
+    },
+    async onSubmit(form) {
+      let data = this.form;
+      console.log(data);
+      let res;
+      let msg;
+      if (data.id) {
+        res = await this.update(data);
+        msg = `${this.keyWord}修改成功`;
+      } else {
+        res = await this.create(data);
+        msg = `${this.keyWord}添加成功`;
+      }
+      if (this.$checkRes(res, msg)) this.$router.push({ path: '/personnel/column' });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 20px;
+  margin: 10px 20px;
+  border: 1px solid #ccc;
+  width: 96%;
+}
+</style>

+ 19 - 0
src/views/personnel/experts.vue

@@ -0,0 +1,19 @@
+<template>
+  <div id="experts">
+    <p>experts</p>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'experts',
+  props: {},
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 3 - 3
src/views/personnel/index.vue

@@ -1,12 +1,12 @@
 <template>
-  <div id="index">
-    <p>科技人才暂未开通</p>
+  <div id="informate">
+    <p>informate</p>
   </div>
 </template>
 
 <script>
 export default {
-  name: 'index',
+  name: 'informate',
   props: {},
   components: {},
   data: () => ({}),

+ 60 - 0
src/views/personnel/recruit.vue

@@ -0,0 +1,60 @@
+<template>
+  <div id="recruit">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <recruitInfo :recruitInfo="recruitInfo" :total="total" @delete="deleteData"></recruitInfo>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import topInfo from '@/layout/public/top.vue';
+import recruitInfo from '@/layout/personnel/recruit.vue';
+import { createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: mapColumn } = createNamespacedHelpers('talentRecruitment');
+export default {
+  name: 'recruit',
+  props: {},
+  components: {
+    topInfo,
+    recruitInfo,
+  },
+  data: () => ({
+    topTitle: '招聘信息管理',
+    recruitInfo: [],
+    total: 1,
+  }),
+  created() {
+    this.search();
+  },
+  computed: {},
+  methods: {
+    ...mapColumn(['query', 'delete', 'fetch']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `recruitInfo`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    async deleteData(item) {
+      const res = await this.delete(item.id);
+      this.$checkRes(res, '删除成功', '删除失败');
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 20px;
+  margin: 10px 20px;
+  border: 1px solid #ccc;
+  width: 96%;
+}
+</style>

+ 76 - 0
src/views/personnel/recruitDetail.vue

@@ -0,0 +1,76 @@
+<template>
+  <div id="recruitDetail">
+    <el-row>
+      <el-col :span="24" class="top">
+        <topInfo :topTitle="topTitle"></topInfo>
+      </el-col>
+      <el-col :span="24" class="main">
+        <column :form="form" @submitDate="onSubmit"></column>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import topInfo from '@/layout/public/top.vue';
+import column from '@/layout/personnel/recruitDetail.vue';
+import { createNamespacedHelpers, mapGetters } from 'vuex';
+const { mapActions: mapTalentRecruitment } = createNamespacedHelpers('talentRecruitment');
+export default {
+  name: 'recruitDetail',
+  props: {},
+  components: {
+    column,
+    topInfo,
+  },
+  data: () => ({
+    topTitle: '添加招聘信息',
+    form: {},
+  }),
+  created() {
+    this.search();
+  },
+  computed: {
+    id() {
+      return this.$route.query.id;
+    },
+    keyWord() {
+      let meta = this.$route.meta;
+      let main = meta.title || '';
+      return main;
+    },
+  },
+  methods: {
+    ...mapTalentRecruitment(['fetch', 'create', 'update']),
+    async search() {
+      if (this.$route.query.id) {
+        const res = await this.fetch(this.id);
+        this.$set(this, `form`, res.data);
+      }
+    },
+    async onSubmit(form) {
+      let data = this.form;
+      console.log(data);
+      let res;
+      let msg;
+      if (data.id) {
+        res = await this.update(data);
+        msg = `${this.keyWord}修改成功`;
+      } else {
+        res = await this.create(data);
+        msg = `${this.keyWord}添加成功`;
+      }
+      if (this.$checkRes(res, msg)) this.$router.push({ path: '/personnel/recruit' });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  padding: 20px;
+  margin: 10px 20px;
+  border: 1px solid #ccc;
+  width: 96%;
+}
+</style>

+ 19 - 0
src/views/personnel/resume.vue

@@ -0,0 +1,19 @@
+<template>
+  <div id="resume">
+    <p>resume</p>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'resume',
+  props: {},
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 10 - 0
vue.config.js

@@ -22,6 +22,10 @@ module.exports = {
         changeOrigin: true,
         ws: true,
       },
+      // '/api': {
+      //   target: 'http://smart.cc-lotus.info',
+      //   ws: true,
+      // },
       '/files': {
         target: 'http://smart.cc-lotus.info',
       },
@@ -51,6 +55,12 @@ module.exports = {
         ws: true,
         // pathRewrite: { '^/api/affairs': '/api' },
       },
+      '/api/talent': {
+        target: 'http://free.liaoningdoupo.com',
+        changeOrigin: true,
+        ws: true,
+        // pathRewrite: { '^/api/affairs': '/api' },
+      },
     },
   },
 };