lrf402788946 пре 5 година
родитељ
комит
f114ccc08d

+ 2 - 0
src/router/index.js

@@ -81,12 +81,14 @@ const routes = [
       {
         path: '/work/look',
         name: 'work_look',
+        meta: { title: '作业题', sub: '管理' },
         component: () => import('@/views/work/look.vue'),
       },
 
       {
         path: '/work/lookdetail',
         name: 'work_lookdetail',
+        meta: { title: '作业题', sub: '详情' },
         component: () => import('@/views/work/lookdetail.vue'),
       },
       {

+ 4 - 0
src/store/index.js

@@ -6,6 +6,8 @@ import location from './location';
 import bedroom from './bedroom';
 import director from './director';
 import student from './student';
+import task from './task';
+import subject from './subject';
 Vue.use(Vuex);
 
 export default new Vuex.Store({
@@ -16,6 +18,8 @@ export default new Vuex.Store({
     bedroom,
     director,
     student,
+    task,
+    subject,
   },
   state: {},
   mutations: {},

+ 38 - 0
src/store/subject.js

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

+ 38 - 0
src/store/task.js

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

+ 0 - 1
src/views/classes/index.vue

@@ -31,7 +31,6 @@ export default {
         icon: 'el-icon-delete',
         method: 'delete',
         confirm: true,
-        methodZh: '删除',
       },
     ],
     fields: [

+ 0 - 1
src/views/dept/index.vue

@@ -31,7 +31,6 @@ export default {
         icon: 'el-icon-delete',
         method: 'delete',
         confirm: true,
-        methodZh: '删除',
       },
     ],
     fields: [{ label: '部门名称', prop: 'name' }],

+ 0 - 1
src/views/director/index.vue

@@ -38,7 +38,6 @@ export default {
         icon: 'el-icon-delete',
         method: 'delete',
         confirm: true,
-        methodZh: '删除',
       },
     ],
     filFields: [

+ 0 - 1
src/views/location/index.vue

@@ -31,7 +31,6 @@ export default {
         icon: 'el-icon-delete',
         method: 'delete',
         confirm: true,
-        methodZh: '删除',
       },
     ],
     fields: [{ label: '地点', prop: 'name' }],

+ 1 - 26
src/views/student/index.vue

@@ -80,32 +80,7 @@ export default {
         },
       },
     ],
-    list: [
-      {
-        id: 1,
-        name: '学生1',
-        gender: '1',
-        nation: '汉族',
-        id_number: 220103199911111922,
-        school: '测试学校',
-        yard: '测试学院',
-        major: '测试专业',
-        entry_year: '2019-01-01',
-        finish_year: '2020-01-01',
-        school_job: '无',
-        phone: '13000000000',
-        qq: '2938260457',
-        email: '2938260457@qq.com',
-        family_place: '测试地址',
-        family_is_hard: '1',
-        have_grant: '0',
-        job: '组长',
-        term: '233',
-        batch: '3',
-        class: '3',
-        is_fine: '0',
-      },
-    ],
+    list: [],
     total: 0,
   }),
   created() {

+ 33 - 4
src/views/subject/detail.vue

@@ -1,7 +1,7 @@
 <template>
   <div id="detail">
-    <detail-frame :title="mainTitle" returns="./index">
-      <data-form :fields="fields" :rules="rules" @save="handleSave" :isNew="isNew"> </data-form>
+    <detail-frame :title="mainTitle" returns="/subject/index">
+      <data-form :data="info" :fields="fields" :rules="rules" @save="handleSave" :isNew="isNew"> </data-form>
     </detail-frame>
   </div>
 </template>
@@ -9,6 +9,8 @@
 <script>
 import detailFrame from '@frame/layout/admin/detail-frame';
 import dataForm from '@frame/components/form';
+import { createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('subject');
 export default {
   metaInfo: { title: '科目详情页' },
   name: 'detail',
@@ -18,6 +20,7 @@ export default {
     dataForm,
   },
   data: () => ({
+    info: {},
     fields: [
       { label: '科目名称', required: true, model: 'name' },
       { label: '名称代码', required: true, model: 'code' },
@@ -29,6 +32,9 @@ export default {
   }),
   created() {},
   computed: {
+    id() {
+      return this.$route.query.id;
+    },
     isNew() {
       return this.$route.query.id ? false : true;
     },
@@ -44,10 +50,33 @@ export default {
       return main;
     },
   },
+  watch: {
+    isNew: {
+      immediate: true,
+      handler(val) {
+        if (val) this.loading = false;
+        else this.search();
+      },
+    },
+  },
   methods: {
+    ...mapActions(['fetch', 'create', 'update']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) this.$set(this, `info`, res.data);
+      this.loading = false;
+    },
     async handleSave({ isNew, data }) {
-      console.log(isNew);
-      console.log(data);
+      let res;
+      let msg;
+      if (isNew) {
+        res = this.create(data);
+        msg = `${this.keyWord}添加成功`;
+      } else {
+        res = this.update(data);
+        msg = `${this.keyWord}修改成功`;
+      }
+      if (this.$checkRes(res, msg)) this.$router.push({ path: '/subject/index' });
     },
   },
 };

+ 27 - 12
src/views/subject/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div id="index">
-    <list-frame title="科目列表页" @query="search" :total="total" :filter="filFields">
-      <data-table :fields="fields" :data="index" :opera="opera" @edit="toEdit"></data-table>
+    <list-frame title="科目列表页" @query="search" :total="total" :needFilter="false" @add="$router.push('/subject/detail')">
+      <data-table :fields="fields" :data="list" :opera="opera" @edit="toEdit" @delete="toDelete"></data-table>
     </list-frame>
   </div>
 </template>
@@ -9,6 +9,8 @@
 <script>
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
+import { createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('subject');
 export default {
   name: 'index',
   props: {},
@@ -23,31 +25,44 @@ export default {
         icon: 'el-icon-edit',
         method: 'edit',
       },
+      {
+        label: '删除',
+        icon: 'el-icon-delete',
+        method: 'delete',
+        confirm: true,
+      },
     ],
     fields: [
       { label: '科目名称', prop: 'name' },
       { label: '科目代码', prop: 'code' },
     ],
-    index: [
-      { name: '问卷1', code: '12' },
-      { name: '问卷2', code: '12' },
-      { name: '问卷3', code: '12' },
-    ],
     filFields: [
       { label: '科目名称', model: 'name' },
       { label: '科目代码', model: 'code' },
     ],
+    list: [],
     total: 0,
   }),
-  created() {},
+  created() {
+    this.search();
+  },
   computed: {},
   methods: {
-    search({ skip = 0, limit = 15, ...info } = {}) {
-      console.log(`in search`);
+    ...mapActions(['query', 'delete']),
+    async search({ skip = 0, limit = 15, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
     },
     toEdit(data) {
-      console.log(`in toEdit`);
-      console.log(data);
+      this.$router.push({ path: '/subject/detail', query: { id: data.id } });
+    },
+    async toDelete(data) {
+      const res = await this.delete(data.id);
+      this.$checkRes(res, '删除成功', '删除失败');
+      this.search();
     },
   },
 };

+ 58 - 106
src/views/work/detail.vue

@@ -1,67 +1,25 @@
 <template>
   <div id="detail">
     <detail-frame :title="mainTitle" returns="/work/index">
-      <data-form :fields="fields" :rules="rules" @save="handleSave" :isNew="isNew">
-        <!-- <template #options="{item}">
-          <template v-if="item.model === 'state'">
-            <el-option label="注册" value="0"></el-option>
-            <el-option label="确认身份" value="1"></el-option>
-            <el-option label="资料评分" value="2"></el-option>
-            <el-option label="面试评分" value="3"></el-option>
-            <el-option label="确认入库" value="4"></el-option>
-          </template>
-          <template v-if="item.model === 'tltype'">
-            <el-option label="ppt" value="0"></el-option>
-            <el-option label="视频" value="1"></el-option>
-            <el-option label="教案" value="2"></el-option>
-          </template>
+      <data-form :data="info" :fields="fields" :rules="rules" @save="handleSave" :isNew="isNew">
+        <template #options>
+          <el-option v-for="(item, index) in subjectList" :key="index" :label="item.name" :value="item.code"></el-option>
+        </template>
+        <template #radios>
+          <el-radio label="0">禁用</el-radio>
+          <el-radio label="1">使用</el-radio>
         </template>
-        <template #radios="{item}">
-          <template v-if="item.model === 'sex'">
-            <el-radio label="0">男</el-radio>
-            <el-radio label="1">女</el-radio>
-          </template>
-          <template v-if="item.model === 'tea'">
-            <el-radio label="1">是</el-radio>
-            <el-radio label="0">否</el-radio>
-          </template>
-        </template> -->
-        <!-- <template #custom="{ item, form, fieldChange }">
-          <el-button type="text" @click="dialogFormVisible = true">选择题类型</el-button>
-          <el-dialog title="选择题类型" :visible.sync="dialogFormVisible">
-            <el-form :model="form">
-              <template>
-                <el-tabs v-model="activeName" @tab-click="handleClick">
-                  <el-tab-pane label="单选" name="first">
-                    <data-table :fields="fieldss" :data="index" :opera="opera" @edit="toEdit"></data-table>
-                  </el-tab-pane>
-                  <el-tab-pane label="多选" name="first"></el-tab-pane>
-                  <el-tab-pane label="问答" name="third">
-                    <el-form ref="form" :model="form" label-width="80px">
-                      <el-form-item label="问答">
-                        <el-input v-model="form.duoxuan" placeholder="请输入问答题"></el-input>
-                      </el-form-item>
-                    </el-form>
-                  </el-tab-pane>
-                </el-tabs>
-              </template>
-            </el-form>
-            <div slot="footer" class="dialog-footer">
-              <el-button @click="dialogFormVisible = false">取 消</el-button>
-              <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
-            </div>
-          </el-dialog>
-        </template> -->
       </data-form>
     </detail-frame>
   </div>
 </template>
 
 <script>
-import dataTable from '@frame/components/data-table';
 import detailFrame from '@frame/layout/admin/detail-frame';
 import dataForm from '@frame/components/form';
-import upload from '@frame/components/upload';
+import { createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('task');
+const { mapActions: mapSubject } = createNamespacedHelpers('subject');
 export default {
   metaInfo: { title: '题库详情页' },
   name: 'detail',
@@ -69,56 +27,28 @@ export default {
   components: {
     detailFrame,
     dataForm,
-    // dataTable,
   },
   data: () => ({
-    opera: [
-      {
-        label: '编辑',
-        icon: 'el-icon-edit',
-        method: 'edit',
-      },
-    ],
-
-    activeName: '',
-    dialogTableVisible: false,
-    dialogFormVisible: false,
-    form: {
-      duoxuan: '',
-      name: '',
-      region: '',
-      date1: '',
-      date2: '',
-      delivery: false,
-      type: [],
-      resource: '',
-      desc: '',
-    },
-    formLabelWidth: '120px',
-    fieldss: [
-      { label: '序号', required: true, model: 'zuoyeid' },
-      { label: '名称', required: true, model: 'zuoyename' },
-      { label: '答案', required: true, model: 'answer' },
-    ],
-
-    index: [{ zuoyeid: '1' }],
+    info: { status: '1' },
     fields: [
-      { label: '作业名称', required: true, model: 'name' },
-      // { label: '状态', required: true, model: 'state', type: `select` },
-      { label: '作业代码', required: true, model: 'optionid' },
-      //   { label: '标题', required: true, model: 'title' },
-      //   { label: '题型', required: true, model: 'type', type: 'wenjian', custom: true },
+      { label: '科目', required: true, model: 'code', type: 'select' },
+      { label: '标题', required: true, model: 'title' },
+      { label: '使用状态', required: true, model: 'status', type: 'radio' },
     ],
     rules: {
-      name: [{ required: true, message: '请输入作业姓名' }],
-      state: [{ required: true, message: '请选择状态' }],
-      optionid: [{ required: true, message: '请选择作业代码' }],
-      title: [{ required: true, message: '请选择标题' }],
-      openid: [{ required: true, message: '请输入openid' }],
+      code: [{ required: true, message: '请选择科目' }],
+      title: [{ required: true, message: '请输入标题' }],
+      status: [{ required: true, message: '请选择使用状态' }],
     },
+    subjectList: [],
   }),
-  created() {},
+  created() {
+    this.getOtherList();
+  },
   computed: {
+    id() {
+      return this.$route.query.id;
+    },
     isNew() {
       return this.$route.query.id ? false : true;
     },
@@ -134,22 +64,44 @@ export default {
       return main;
     },
   },
+  watch: {
+    isNew: {
+      immediate: true,
+      handler(val) {
+        if (val) this.loading = false;
+        else this.search();
+      },
+    },
+  },
   methods: {
-    search({ skip = 0, limit = 15, ...info } = {}) {
-      console.log(`in search`);
+    ...mapActions(['fetch', 'create', 'update']),
+    ...mapSubject({ subject: 'query' }),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) this.$set(this, `info`, res.data);
+      this.loading = false;
     },
-    toEdit(data) {
-      console.log(`in toEdit`);
-      console.log(data);
+    async handleSave({ isNew, data }) {
+      let res;
+      let msg;
+      data.name = this.getName(data.code);
+      if (isNew) {
+        res = this.create(data);
+        msg = `${this.keyWord}添加成功`;
+      } else {
+        res = this.update(data);
+        msg = `${this.keyWord}修改成功`;
+      }
+      if (this.$checkRes(res, msg)) this.$router.push({ path: '/work/index' });
     },
-    handleClick(tab, event) {
-      console.log(tab, event);
+    async getOtherList() {
+      const res = await this.subject();
+      if (this.$checkRes(res)) this.$set(this, `subjectList`, res.data);
     },
-
-    uploadSuccess() {},
-    async handleSave({ isNew, data }) {
-      console.log(isNew);
-      console.log(data);
+    getName(code = undefined) {
+      if (!code) return null;
+      let res = this.subjectList.filter(fil => fil.code === code);
+      if (res.length > 0) return res[0].name;
     },
   },
 };

+ 45 - 16
src/views/work/index.vue

@@ -1,13 +1,20 @@
 <template>
   <div id="index">
-    <list-frame title="作业列表页" @query="search" :total="total" :filter="filFields" @add="$router.push({ path: '/work/detail' })">
-      <data-table :fields="fields" :data="index" :opera="opera" @edit="toEdit" @delete="toEdit" @select="$router.push({ path: '/work/detail' })"> </data-table>
+    <list-frame title="作业列表页" @query="search" :total="total" :filter="filFields" :needPag="false" @add="$router.push({ path: '/work/detail' })">
+      <template #options="{item}">
+        <el-option v-for="(item, index) in subjectList" :key="index" :label="item.name" :value="item.code"></el-option>
+      </template>
+      <data-table :fields="fields" :data="list" :opera="opera" @edit="toEdit" @delete="toEdit" @document="toDocument"> </data-table>
     </list-frame>
   </div>
 </template>
 <script>
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
+import { createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('task');
+const { mapActions: mapSubject } = createNamespacedHelpers('subject');
+
 export default {
   metaInfo: { title: '作业列表页' },
   name: 'index',
@@ -21,44 +28,66 @@ export default {
       {
         label: '编辑',
         icon: 'el-icon-edit',
-        method: 'select',
+        method: 'edit',
+      },
+      {
+        label: '查看作业题目',
+        icon: 'el-icon-document',
+        method: 'document',
       },
       {
         label: '删除',
         icon: 'el-icon-delete',
         method: 'delete',
+        confirm: true,
       },
     ],
 
     fields: [
-      { label: '科目代码', prop: 'id' },
       { label: '科目名称', prop: 'name' },
       { label: '标题', prop: 'title' },
       {
         label: '状态',
-        prop: 'state',
+        prop: 'status',
         format: item => {
           return item === '0' ? '弃用' : '使用';
         },
       },
     ],
-    index: [{ id: '001', name: '语文', title: '语文作业', timu: '0123', type: '1', state: '1' }],
-    filFields: [
-      { label: '科目代码', model: 'id' },
-      { label: '科目名称', model: 'name' },
-    ],
+    list: [],
+    subjectList: [],
+    filFields: [{ label: '科目', model: 'code', type: 'select' }],
     total: 0,
   }),
-  created() {},
+  created() {
+    this.getOtherList();
+    this.search();
+  },
   computed: {},
   methods: {
-    search({ skip = 0, limit = 15, ...info } = {}) {
-      console.log(`in search`);
+    ...mapActions(['query', 'delete']),
+    ...mapSubject({ subject: 'query' }),
+    async search({ skip = 0, limit = 15, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
     },
-
     toEdit(data) {
-      console.log(`in toEdit`);
-      console.log(data);
+      this.$router.push({ path: '/work/detail', query: { id: data.id } });
+    },
+    toDocument(data) {
+      this.$router.push({ path: '/work/look', query: { id: data.id } });
+    },
+    async toDelete(data) {
+      const res = await this.delete(data.id);
+      this.$checkRes(res, '删除成功', '删除失败');
+      this.search();
+    },
+    async getOtherList() {
+      const res = await this.subject();
+      if (this.$checkRes(res)) this.$set(this, `subjectList`, res.data);
     },
   },
 };

+ 57 - 7
src/views/work/look.vue

@@ -1,13 +1,25 @@
 <template>
   <div id="index">
-    <list-frame title="作业题列表页" @query="search" :total="total" :filter="filFields" @add="$router.push({ path: '/work/lookdetail' })">
-      <data-table :fields="fields" :data="index" :opera="opera" @edit="toEdit" @delete="toEdit" @add="$router.push({ path: '/work/lookdetail' })"> </data-table>
+    <list-frame title="作业题列表页" returns="/work/index" @query="search" :total="total" :filter="filFields" @add="toAdd">
+      <data-table :fields="fields" :data="list" :opera="opera" @edit="toEdit" @delete="toDelete"> </data-table>
     </list-frame>
+    <el-dialog title="选择题类型" :visible.sync="dialog" @close="toClose">
+      <data-form v-loading="loading" :data="info" :fields="qFields" :rules="rules" @save="handleSave" :isNew="isNew">
+        <template #radios>
+          <el-radio v-for="(item, index) in radios" :key="index" :label="item.code">{{ item.name }}</el-radio>
+        </template>
+      </data-form>
+    </el-dialog>
   </div>
 </template>
 <script>
 import listFrame from '@frame/layout/admin/list-frame';
 import dataTable from '@frame/components/data-table';
+import dataForm from '@frame/components/form';
+import _ from 'lodash';
+import { createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('task');
+const { mapActions: mapSubject } = createNamespacedHelpers('subject');
 export default {
   metaInfo: { title: '作业题列表页' },
   name: 'index',
@@ -15,8 +27,10 @@ export default {
   components: {
     listFrame,
     dataTable,
+    dataForm,
   },
   data: () => ({
+    dialog: false,
     opera: [
       {
         label: '编辑',
@@ -49,7 +63,6 @@ export default {
         },
       },
     ],
-    index: [{ id: '01', name: '礼仪题01', type: '1', state: '0' }],
     filFields: [
       { label: '题名', model: 'name' },
 
@@ -73,19 +86,56 @@ export default {
         ],
       },
     ],
+    qFields: [
+      { label: '类型', required: true, model: 'type', type: 'radio' },
+      { label: '题目', required: true, model: 'topic' },
+      { label: '选项', model: 'option', custom: true },
+      { label: '答案', model: 'answer', custom: true },
+    ],
+    list: [],
+    info: {},
+    radios: [
+      { code: '0', name: '单选' },
+      { code: '1', name: '多选' },
+      { code: '2', name: '简答' },
+    ],
     total: 0,
   }),
   created() {},
-  computed: {},
+  computed: {
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {
+    id: {
+      immediate: true,
+      handler(val) {
+        if (val) this.search();
+      },
+    },
+  },
   methods: {
-    search({ skip = 0, limit = 15, ...info } = {}) {
-      console.log(`in search`);
+    ...mapActions(['fetch']),
+    async search({ skip = 0, limit = 15, ...info } = {}) {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, _.get(res.data, `question`));
+      }
+      this.loading = false;
+    },
+    toAdd() {
+      this.dialog = true;
     },
-
     toEdit(data) {
       console.log(`in toEdit`);
       console.log(data);
     },
+    toDelete(data) {},
+    toClose() {
+      this.dialog = false;
+      this.info = {};
+    },
   },
 };
 </script>