lvxudong fce14ea749 up
2023-11-22 18:21:56 +08:00

324 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter"
:leave-active-class="proxy?.animate.searchAnimate.leave">
<div class="search" v-show="showSearch">
<el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item label="标题" prop="question">
<el-input v-model="queryParams.question" placeholder="请输入标题" clearable style="width: 240px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="标签" prop="labelId">
<el-select v-model="queryParams.labelId" placeholder="请选择标签" clearable>
<el-option v-for="dict in labelList" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['question:title:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
v-hasPermi="['question:title:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
v-hasPermi="['question:title:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['question:title:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="titleList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="id" v-if="true" />
<el-table-column label="标题" align="center" prop="question" />
<el-table-column label="标签" align="center" prop="labelName">
<template #default="scope">
<dict-tag :options="labelList" :value="scope.row.labelName" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['question:title:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['question:title:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改题目对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="titleFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="标题" prop="question">
<el-input v-model="form.question" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="标签" prop="labelId">
<el-select v-model="form.labelId" @change="handleLabelChange" placeholder="请选择标签">
<el-option v-for="dict in labelList" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-table-column :label="`选项${index + 1}`" v-for="(item, index) in posNum" :key="item" class="m-t-20"
:prop="`gearValue[${index}]`" :rules="ruleValidate" align="center" prop="options">
<el-input :min="0" :formatter="value => `${value}`.replace(/([0-9]+\.[0-9]{2})[0-9]*/, '$1')" placeholder="请填写"
:disabled="isSee" class="w-200" v-model="form.value.options[index]" />
<v-image v-if="!isSee && posNum < maxPosLen" :src="addImg" class="img-btn" @click="changePos(index, 'add')" />
<v-image v-if="!isSee && posNum > 1" :src="delImg" @click="changePos(index, 'del')" class="img-btn" />
</el-table-column>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Title" lang="ts">
import { queryAllLabel } from '@/api/question/label';
import { listTitle, getTitle, delTitle, addTitle, updateTitle } from '@/api/question/title';
import { TitleVO, TitleQuery, TitleForm } from '@/api/question/title/types';
import { func } from 'vue-types';
import addImg from '@/assets/images/add-icon.png'
import delImg from '@/assets/images/del-icon.png'
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const titleList = ref<TitleVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const labelList = ref<DictDataOption[]>([]); let posNum = 20
const queryFormRef = ref<ElFormInstance>();
const titleFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: TitleForm = {
id: undefined,
question: undefined,
labelId: undefined,
labelName: "",
optionVoList: [],
}
const data = reactive<PageData<TitleForm, TitleQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
question: undefined,
labelId: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "不能为空", trigger: "blur" }
],
question: [
{ required: true, message: "标题不能为空", trigger: "blur" }
],
labelId: [
{ required: true, message: "标签不能为空", trigger: "change" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询题目列表 */
const getList = async () => {
loading.value = true;
const res = await listTitle(queryParams.value);
titleList.value = res.rows;
total.value = res.total;
loading.value = false;
}
const getLabelList = async () => {
loading.value = true;
queryAllLabel().then((resp) => {
labelList.value = resp.data.map((p: any): DictDataOption => ({ label: p.label, value: p.value, elTagType: "", elTagClass: "" }));
});
loading.value = false;
}
function handleLabelChange(val: string) {
const selectedLabel = labelList.value.find(item => item.value === val);
if (selectedLabel) {
form.value.labelName = selectedLabel.label;
}
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
titleFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: TitleVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加题目";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: TitleVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getTitle(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改题目";
}
/** 提交按钮 */
const submitForm = () => {
titleFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateTitle(form.value).finally(() => buttonLoading.value = false);
} else {
await addTitle(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("修改成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: TitleVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除题目编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delTitle(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('question/title/export', {
...queryParams.value
}, `title_${new Date().getTime()}.xlsx`)
}
/**
* 增删档位
* @param idx
* @param actType
*/
const changePos = (idx: number, actType: string) => {
if (actType === 'add') {
if (form.value.optionVoList.length < 20) {
posNum++;
form.value.optionVoList.splice(idx + 1, 0);
}
} else {
form.value.optionVoList.splice(idx, 1);
posNum--;
}
}
/**
* 提交的校验
*/
const handleValidate = () =>{
return new Promise((resolve, reject) => {
$refs.formPosition.validate((valid) => {
if (valid) {
// 数据转换为接口所需要的形式
let obj = {};
if (form.value.optionVoList) {
if (form.value.optionVoList.length[0] === null) {
obj.optionVoList = null;
} else {
obj.optionVoList = form.value.optionVoList.join();
}
} else {
obj.optionVoList = null;
}
resolve(obj)
}
})
})
}
onMounted(() => {
getList();
getLabelList();
});
</script>
<style scoped>
.img-btn {
display: inline-block;
vertical-align: middle;
margin-left: 10px;
width: 20px;
cursor: pointer;
}
</style>