zhaosongshan 7 місяців тому
батько
коміт
7931cedad9

+ 27 - 0
src/api/question/tQuestionApi.js

@@ -0,0 +1,27 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/api/webapp/` + url, ...arg)
+
+/**
+ * t_questionApi接口管理器
+ *
+ * @author zss
+ * @date  2025/07/08 16:24
+ **/
+export default {
+	// 获取t_question分页
+	tQuestionPage(data) {
+		return request('api/admin/question/page', data, 'post')
+	},
+	// 提交t_question表单 edit为true时为编辑,默认为新增
+	tQuestionSubmitForm(data, edit = false) {
+		return request('api/admin/question/edit', data)
+	},
+	// 删除t_question
+	tQuestionDelete(data) {
+		return request('delete', data)
+	},
+	// 获取t_question详情
+	tQuestionDetail(data) {
+		return request('detail', data, 'get')
+	}}

+ 0 - 62
src/views/exm/exampaper/Show.vue

@@ -1,62 +0,0 @@
-<template>
-  <div style="line-height:1.8">
-    <div v-if="qType==1" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-      <div class="q-content">
-          <span :key="item.id" v-for="item in question.items" class="q-item-contain">
-            <span class="q-item-prefix">{{item.prefix}}</span>
-            <span v-html="item.content" class="q-item-content"></span>
-          </span>
-      </div>
-    </div>
-    <div v-else-if="qType==2" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-      <div class="q-content">
-          <span :key="item.id" v-for="item in question.items" class="q-item-contain">
-            <span class="q-item-prefix">{{item.prefix}}</span>
-            <span v-html="item.content" class="q-item-content"></span>
-          </span>
-      </div>
-    </div>
-    <div v-else-if="qType==3" v-loading="qLoading">
-      <div class="q-title" v-html="question.title" style="display: inline;margin-right: 10px"/>
-      <span>(</span>
-      <span :key="item.id" v-for="item in question.items">
-        <span v-html="item.content" class="q-item-content"></span>
-       </span>
-      <span>)</span>
-    </div>
-    <div v-else-if="qType==4" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-    </div>
-    <div v-else-if="qType==5" v-loading="qLoading">
-      <div class="q-title" v-html="question.title"/>
-    </div>
-    <div v-else>
-    </div>
-  </div>
-
-</template>
-
-<script>
-export default {
-  name: 'QuestionShow',
-  props: {
-    question: {
-      type: Object,
-      default: function () {
-        return {}
-      }
-    },
-    qLoading: {
-      type: Boolean,
-      default: false
-    },
-    qType: {
-      type: Number,
-      default: 0
-    }
-  },
-  methods: {}
-}
-</script>

+ 94 - 0
src/views/exm/question/form.vue

@@ -0,0 +1,94 @@
+<template>
+    <xn-form-container
+        :title="formData.id ? '编辑t_question' : '增加t_question'"
+        :width="700"
+        :visible="visible"
+        :destroy-on-close="true"
+        @close="onClose"
+    >
+        <a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+            <a-form-item label="QUESTION_TYPE:" name="questionType">
+                <a-input v-model:value="formData.questionType" placeholder="请输入QUESTION_TYPE" allow-clear />
+            </a-form-item>
+            <a-form-item label="SUBJECT_ID:" name="subjectId">
+                <a-input v-model:value="formData.subjectId" placeholder="请输入SUBJECT_ID" allow-clear />
+            </a-form-item>
+            <a-form-item label="SCORE:" name="score">
+                <a-input v-model:value="formData.score" placeholder="请输入SCORE" allow-clear />
+            </a-form-item>
+            <a-form-item label="GRADE_LEVEL:" name="gradeLevel">
+                <a-input v-model:value="formData.gradeLevel" placeholder="请输入GRADE_LEVEL" allow-clear />
+            </a-form-item>
+            <a-form-item label="DIFFICULT:" name="difficult">
+                <a-input v-model:value="formData.difficult" placeholder="请输入DIFFICULT" allow-clear />
+            </a-form-item>
+            <a-form-item label="CORRECT:" name="correct">
+                <a-input v-model:value="formData.correct" placeholder="请输入CORRECT" allow-clear />
+            </a-form-item>
+            <a-form-item label="INFO_TEXT_CONTENT_ID:" name="infoTextContentId">
+                <a-input v-model:value="formData.infoTextContentId" placeholder="请输入INFO_TEXT_CONTENT_ID" allow-clear />
+            </a-form-item>
+            <a-form-item label="STATUS:" name="status">
+                <a-input v-model:value="formData.status" placeholder="请输入STATUS" allow-clear />
+            </a-form-item>
+            <a-form-item label="DELETED:" name="deleted">
+                <a-input v-model:value="formData.deleted" placeholder="请输入DELETED" allow-clear />
+            </a-form-item>
+        </a-form>
+        <template #footer>
+            <a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+            <a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
+        </template>
+    </xn-form-container>
+</template>
+
+<script setup name="tQuestionForm">
+    import { cloneDeep } from 'lodash-es'
+    import { required } from '@/utils/formRules'
+    import tQuestionApi from '@/api/question/tQuestionApi'
+    // 抽屉状态
+    const visible = ref(false)
+    const emit = defineEmits({ successful: null })
+    const formRef = ref()
+    // 表单数据
+    const formData = ref({})
+    const submitLoading = ref(false)
+
+    // 打开抽屉
+    const onOpen = (record) => {
+        visible.value = true
+        if (record) {
+            let recordData = cloneDeep(record)
+            formData.value = Object.assign({}, recordData)
+        }
+    }
+    // 关闭抽屉
+    const onClose = () => {
+        formRef.value.resetFields()
+        formData.value = {}
+        visible.value = false
+    }
+    // 默认要校验的
+    const formRules = {
+    }
+    // 验证并提交数据
+    const onSubmit = () => {
+        formRef.value.validate().then(() => {
+            submitLoading.value = true
+            const formDataParam = cloneDeep(formData.value)
+            tQuestionApi
+                .tQuestionSubmitForm(formDataParam, formDataParam.id)
+                .then(() => {
+                    onClose()
+                    emit('successful')
+                })
+                .finally(() => {
+                    submitLoading.value = false
+                })
+        })
+    }
+    // 抛出函数
+    defineExpose({
+        onOpen
+    })
+</script>

+ 164 - 0
src/views/exm/question/index.vue

@@ -0,0 +1,164 @@
+<template>
+    <a-card :bordered="false">
+        <a-form ref="searchFormRef" name="advanced_search" :model="searchFormState" class="ant-advanced-search-form">
+            <a-row :gutter="24">
+                <a-col :span="6">
+                    <a-form-item label="QUESTION_TYPE" name="questionType">
+                        <a-input v-model:value="searchFormState.questionType" placeholder="请输入QUESTION_TYPE" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="SUBJECT_ID" name="subjectId">
+                        <a-input v-model:value="searchFormState.subjectId" placeholder="请输入SUBJECT_ID" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-form-item label="GRADE_LEVEL" name="gradeLevel">
+                        <a-input v-model:value="searchFormState.gradeLevel" placeholder="请输入GRADE_LEVEL" />
+                    </a-form-item>
+                </a-col>
+                <a-col :span="6">
+                    <a-button type="primary" @click="table.refresh(true)">查询</a-button>
+                    <a-button style="margin: 0 8px" @click="reset">重置</a-button>
+                </a-col>
+            </a-row>
+        </a-form>
+        <s-table
+            ref="table"
+            :columns="columns"
+            :data="loadData"
+            :alert="options.alert.show"
+            bordered
+            :row-key="(record) => record.id"
+            :tool-config="toolConfig"
+            :row-selection="options.rowSelection"
+        >
+            <template #operator class="table-operator">
+                <a-space>
+                    <a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('tQuestionAdd')">
+                        <template #icon><plus-outlined /></template>
+                        新增
+                    </a-button>
+                    <xn-batch-delete
+                        v-if="hasPerm('tQuestionBatchDelete')"
+                        :selectedRowKeys="selectedRowKeys"
+                        @batchDelete="deleteBatchTQuestion"
+                    />
+                </a-space>
+            </template>
+            <template #bodyCell="{ column, record }">
+                <template v-if="column.dataIndex === 'action'">
+                    <a-space>
+                        <a @click="formRef.onOpen(record)" v-if="hasPerm('tQuestionEdit')">编辑</a>
+                        <a-divider type="vertical" v-if="hasPerm(['tQuestionEdit', 'tQuestionDelete'], 'and')" />
+                        <a-popconfirm title="确定要删除吗?" @confirm="deleteTQuestion(record)">
+                            <a-button type="link" danger size="small" v-if="hasPerm('tQuestionDelete')">删除</a-button>
+                        </a-popconfirm>
+                    </a-space>
+                </template>
+            </template>
+        </s-table>
+    </a-card>
+    <Form ref="formRef" @successful="table.refresh(true)" />
+</template>
+
+<script setup name="question">
+    import Form from './form.vue'
+    import tQuestionApi from '@/api/question/tQuestionApi'
+    let searchFormState = reactive({})
+    const searchFormRef = ref()
+    const table = ref()
+    const formRef = ref()
+    const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
+    const columns = [
+        {
+            title: 'QUESTION_TYPE',
+            dataIndex: 'questionType'
+        },
+        {
+            title: 'SUBJECT_ID',
+            dataIndex: 'subjectId'
+        },
+        {
+            title: 'SCORE',
+            dataIndex: 'score'
+        },
+        {
+            title: 'GRADE_LEVEL',
+            dataIndex: 'gradeLevel'
+        },
+        {
+            title: 'DIFFICULT',
+            dataIndex: 'difficult'
+        },
+        {
+            title: 'CORRECT',
+            dataIndex: 'correct'
+        },
+        {
+            title: 'INFO_TEXT_CONTENT_ID',
+            dataIndex: 'infoTextContentId'
+        },
+        {
+            title: 'STATUS',
+            dataIndex: 'status'
+        },
+        {
+            title: 'DELETED',
+            dataIndex: 'deleted'
+        },
+    ]
+    // 操作栏通过权限判断是否显示
+    if (hasPerm(['tQuestionEdit', 'tQuestionDelete'])) {
+        columns.push({
+            title: '操作',
+            dataIndex: 'action',
+            align: 'center',
+            width: '150px'
+        })
+    }
+    const selectedRowKeys = ref([])
+    // 列表选择配置
+    const options = {
+        // columns数字类型字段加入 needTotal: true 可以勾选自动算账
+        alert: {
+            show: true,
+            clear: () => {
+                selectedRowKeys.value = ref([])
+            }
+        },
+        rowSelection: {
+            onChange: (selectedRowKey, selectedRows) => {
+                selectedRowKeys.value = selectedRowKey
+            }
+        }
+    }
+    const loadData = (parameter) => {
+        const searchFormParam = JSON.parse(JSON.stringify(searchFormState))
+        return tQuestionApi.tQuestionPage(Object.assign(parameter, searchFormParam)).then((data) => {
+            return data
+        })
+    }
+    // 重置
+    const reset = () => {
+        searchFormRef.value.resetFields()
+        table.value.refresh(true)
+    }
+    // 删除
+    const deleteTQuestion = (record) => {
+        let params = [
+            {
+                id: record.id
+            }
+        ]
+        tQuestionApi.tQuestionDelete(params).then(() => {
+            table.value.refresh(true)
+        })
+    }
+    // 批量删除
+    const deleteBatchTQuestion = (params) => {
+        tQuestionApi.tQuestionDelete(params).then(() => {
+            table.value.clearRefreshSelected()
+        })
+    }
+</script>