龚焕茏
2024-06-05 41add03082382e18a3207cf08156f9416744b58a
feat:新增科目界面
4个文件已修改
1个文件已添加
273 ■■■■■ 已修改文件
src/api/subject.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Manage/Manage.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Manage/TestPaper/QuestionBank.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Manage/TestPaper/subject.vue 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/subject.js
@@ -4,6 +4,7 @@
  list: query => post('/api/admin/subject/list'),
  pageList: query => post('/api/admin/subject/page', query),
  edit: query => post('/api/admin/subject/edit', query),
  updateStatus: query => post('/api/admin/question/status', query),
  select: id => post('/api/admin/subject/select/' + id),
  deleteSubject: id => post('/api/admin/subject/delete/' + id)
}
src/router.js
@@ -129,6 +129,13 @@
        component: () => import('@/views/Manage/TestPaper/QuestionBank.vue'),
        meta: { title: '题库管理' }
      },
      // 科目管理
      {
        path: 'subject',
        name: 'subject',
        component: () => import('@/views/Manage/TestPaper/subject.vue'),
        meta: { title: '科目管理' }
      },
      // 试卷生成
      {
        path: 'test-paper-generation',
src/views/Manage/Manage.vue
@@ -503,6 +503,46 @@
              </div>
              <p>教师管理</p>
            </div>
            <!-- 科目管理 -->
            <div
              class="main-1-con"
              @click="routersTo('/manage/subject')"
            >
              <div class="icon-bg1">
                <svg
                  t="1651737345718"
                  class="icon"
                  viewBox="0 0 1024 1024"
                  version="1.1"
                  xmlns="http://www.w3.org/2000/svg"
                  p-id="4056"
                  width="32"
                  height="32"
                >
                  <path
                    d="M897.28 85.333333h-750.933333c-28.16 0-51.2 23.04-51.2 51.2v750.933334c0 28.16 23.04 51.2 51.2 51.2h276.906666c18.773333 0 34.133333-15.36 34.133334-34.133334s-15.36-34.133333-34.133334-34.133333H163.413333V153.6h716.8v275.626667c0 18.773333 15.36 34.133333 34.133334 34.133333s34.133333-15.36 34.133333-34.133333V136.533333c0-28.16-22.613333-51.2-51.2-51.2z"
                    fill="#515151"
                    p-id="4057"
                  ></path>
                  <path
                    d="M649.813333 315.733333h-324.266666c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133333h324.266666c18.773333 0 34.133333 15.36 34.133334 34.133333s-14.933333 34.133333-34.133334 34.133333zM564.48 452.266667h-238.933333c-18.773333 0-34.133333-15.36-34.133334-34.133334s15.36-34.133333 34.133334-34.133333h238.933333c18.773333 0 34.133333 15.36 34.133333 34.133333s-14.933333 34.133333-34.133333 34.133334zM479.146667 588.8h-153.6c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h153.6c18.773333 0 34.133333 15.36 34.133333 34.133334s-14.933333 34.133333-34.133333 34.133333zM743.68 529.066667c-113.066667 0-204.8 91.733333-204.8 204.8s91.733333 204.8 204.8 204.8 204.8-91.733333 204.8-204.8c0-112.64-91.306667-204.8-204.8-204.8z m0 341.333333c-75.093333 0-136.533333-61.44-136.533333-136.533333s61.013333-136.533333 136.533333-136.533334 136.533333 61.44 136.533333 136.533334c0 75.52-61.013333 136.533333-136.533333 136.533333z"
                    fill="#515151"
                    p-id="4058"
                  ></path>
                  <path
                    d="M709.546667 810.666667c-18.773333 0-34.133333-15.36-34.133334-34.133334v-85.333333c0-18.773333 15.36-34.133333 34.133334-34.133333s34.133333 15.36 34.133333 34.133333v85.333333c0 18.773333-14.933333 34.133333-34.133333 34.133334z"
                    fill="#515151"
                    p-id="4059"
                  ></path>
                  <path
                    d="M675.413333 776.533333c0-18.773333 15.36-34.133333 34.133334-34.133333h85.333333c18.773333 0 34.133333 15.36 34.133333 34.133333s-15.36 34.133333-34.133333 34.133334h-85.333333c-18.773333 0-34.133333-15.36-34.133334-34.133334z"
                    fill="#515151"
                    p-id="4060"
                  ></path>
                </svg>
              </div>
              <p>科目管理</p>
            </div>
            <!-- 题库管理 -->
            <div
              class="main-1-con"
src/views/Manage/TestPaper/QuestionBank.vue
@@ -12,7 +12,7 @@
              <el-button type="warning" size="mini" v-for="item in editUrlEnum" :key="item.key"
                @click="getDialogFormVisible(item.name)">{{ item.name }}
              </el-button>
              <el-button slot="reference" type="primary" class="link-left">录入题目</el-button>
              <el-button slot="reference" type="primary" class="link-left">新增</el-button>
            </el-popover>
          </div>
          <!-- 搜索 -->
@@ -39,7 +39,7 @@
                </el-select>
              </el-form-item>
              <el-form-item label="">
              <el-form-item>
                <el-button style="width:100px;" type="primary" size="small" @click="search()">查询</el-button>
              </el-form-item>
            </el-form>
@@ -47,14 +47,12 @@
          <!-- 表格 -->
          <el-table v-loading="listLoading" :header-cell-style="getRowClass" :data="tableData" border
            style="width: 100%;">
            <el-table-column align="center" prop="shortTitle" label="题目名" show-overflow-tooltip>
            <el-table-column align="center" prop="shortTitle" label="题目" show-overflow-tooltip>
            </el-table-column>
            <el-table-column align="center" prop="subjectName" label="科目" width="150px">
            </el-table-column>
            <el-table-column align="center" prop="questionTypeName" label="题型" width="100px">
            </el-table-column>
            <!-- <el-table-column align="center" prop="score" label="分数">
            </el-table-column> -->
            <el-table-column align="center" prop="difficult" label="难度" width="60px" />
            <el-table-column align="center" prop="createTime" label="创建时间" width="160px" />
            <el-table-column label="状态" prop="status" width="70px">
@@ -80,8 +78,8 @@
            :limit.sync="queryParam.pageSize" @pagination="search" />
        </div>
      </div>
    </div>
    <!-- 填空 -->
    <el-dialog :visible.sync="gapVisible" :close-on-click-modal="false" v-if="gapVisible">
      <gap ref="gap" @children="parentGoods" @callback="callback" :id="updateId" />
src/views/Manage/TestPaper/subject.vue
New file
@@ -0,0 +1,215 @@
<!-- 科目管理 -->
<template>
  <div class="c">
    <div class="bg">
      <div class="main">
        <!-- 待返回的标题 -->
        <TitleIndex title="科目管理" />
        <div class="content">
          <!-- 新增按钮 -->
          <div style="padding-bottom:20px; border-bottom: 3px solid #409EFF;margin-bottom: 20px;">
            <el-button type="primary" class="link-left" @click="edit()">新增</el-button>
          </div>
          <!-- 搜索 -->
          <div>
            <el-form :inline="true" :model="queryParam" class="demo-form-inline" label-width="80px">
              <el-form-item>
                <el-input v-model="queryParam.name" placeholder="请输入名称" clearable></el-input>
              </el-form-item>
              <el-form-item>
                <el-select v-model="queryParam.status" placeholder="请选择状态" clearable @change="search">
                  <el-option value="1" label="启用"></el-option>
                  <el-option value="2" label="禁用"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item>
                <el-button style="width:100px;" type="primary" size="small" @click="search()">查询</el-button>
              </el-form-item>
            </el-form>
          </div>
          <!-- 表格 -->
          <el-table v-loading="listLoading" :header-cell-style="getRowClass" :data="tableData" border
            style="width: 100%;">
            <el-table-column align="center" prop="name" label="名称" show-overflow-tooltip />
            <el-table-column align="center" prop="itemOrder" label="排序" width="150px" />
            <el-table-column align="center" prop="createTime" label="创建时间" width="160px" />
            <el-table-column label="状态" prop="status" width="70px">
              <template slot-scope="{row}">
                <el-tag :type="row.status === '禁用' ? 'danger' : 'success'">
                  {{ row.status ? row.status : '启用' }}
                </el-tag>
              </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="300px">
              <template slot-scope="{row}">
                <el-button size="mini" @click="edit(row)">编辑</el-button>
                <el-button size="mini" type="primary" @click="status(row)">{{ row.status === "禁用" ? "启用" : "禁用"
                  }}</el-button>
                <el-popconfirm title="确认删除吗" @confirm="deleteSubject(row)">
                  <el-button slot="reference" size="mini" type="danger" class="link-left">删除</el-button>
                </el-popconfirm>
              </template>
            </el-table-column>
          </el-table>
          <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex"
            :limit.sync="queryParam.pageSize" @pagination="search" />
        </div>
      </div>
    </div>
    <el-dialog :visible.sync="form.visible" style="width: 100%;height: 100%">
      <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules">
        <el-form-item label="名称:" prop="name" required>
          <el-input v-model="form.name" />
        </el-form-item>
        <el-form-item label="排序:" prop="itemOrder" required>
          <el-input v-model="form.itemOrder" type="number" />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm">提交</el-button>
          <el-button @click="resetForm">重置</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>
<script>
// 引入彈出窗口組件
import subjectApi from '@/api/subject'
import Pagination from '@/components/Pagination'
export default {
  // 注册
  components: {
    Pagination
  },
  data() {
    return {
      listLoading: true,
      queryParam: {
        name: '',
        pageIndex: 1,
        pageSize: 10
      },
      formLoading: false,
      total: 0,
      tableData: [],
      form: {
        id: '',
        name: '',
        itemOrder: '',
        visible: false
      },
      rules: {
        name: [
          { required: true, message: '请输入名称', trigger: 'blur' }
        ],
        itemOrder: [
          { required: true, message: '请输入排序', trigger: 'blur', type: 'number' }
        ]
      },
    };
  },
  created() {
    this.search()
  },
  methods: {
    // 获取排序
    getItemOrder() {
      subjectApi.getItemOrder.then(re => {
        this.form.itemOrder = re.data
      })
    },
    // 获取列表
    search() {
      this.listLoading = true
      subjectApi.pageList(this.queryParam).then(re => {
        this.tableData = re.data.list
        this.total = re.data.total
        this.queryParam.pageSize = re.data.pageSize
        this.queryParam.pageIndex = re.data.pageNum
        this.listLoading = false
      })
    },
    // 修改表单头部的颜色
    getRowClass() {
      return "background:#d2d3d6";
    },
    edit(row) {
      if (row) {
        subjectApi.select(row.id).then(re => {
          if (re.code === 1) {
            this.form.visible = true;
            this.form = re.data;
          } else {
            this.$message.error(re.message)
          }
        })
      } else {
        this.form.visible = true;
      }
    },
    status(row) {
      let question = {
        id: row.id,
        status: row.status === '禁用' ? '启用' : '禁用'
      }
      subjectApi.updateStatus(question).then(re => {
        if (re.code === 1) {
          this.$message.success(re.message)
          this.search()
        } else {
          this.$message.error(re.message)
        }
      })
    },
    deleteSubject(row) {
      let _this = this
      subjectApi.deleteSubject(row.id).then(re => {
        if (re.code === 1) {
          _this.search()
          _this.$message.success(re.message)
        } else {
          _this.$message.error(re.message)
        }
      })
    },
    submitForm() {
      let _this = this
      this.$refs.form.validate((valid) => {
        if (valid) {
          this.formLoading = true
          subjectApi.edit(this.form).then(re => {
            if (re.code === 1) {
              _this.$message.success(re.message)
              _this.search()
            } else {
              _this.$message.error(re.message)
              this.formLoading = false
            }
          })
        }
      })
    },
    resetForm() {
      let lastId = this.form.id
      this.$refs['form'].resetFields()
      this.form.id = lastId
    },
  }
};
</script>
<style scoped lang="scss">
.flex {
  display: flex;
}
// 内容
.content {
  width: 1262px;
  margin-bottom: 80px;
  background-color: #fff;
  padding: 20px 40px;
  border-radius: 10px;
}
</style>