JM-admin/src/view/orderManage/index.vue
2023-03-27 18:35:31 +08:00

447 lines
14 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.

<script setup>
// 引入依赖
import api from '@/api/order'
import capi from '@/api/course'
import custom from '@/utils/custom'
import {formatDate} from '@/utils/format'
// import { toSQLLine } from '@/utils/stringFun'
// import WarningBar from '@/components/warningBar/warningBar.vue'
// import coursePool from './components/coursePool.vue'
// import exercisesPool from '@/view/course/components/exercisesPool.vue'
import {ref,onMounted,provide } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
// store
import { useUserStore } from '@/pinia/modules/user'
const userStore = useUserStore()
// 变量
const path = ref(import.meta.env.VITE_BASE_API)
// const typeList = custom.getExercisesTypeList()
const queryParams = ref({
teacherId:0,
page:1,
pageSize:10,
orderType:0,
nickname:'',
status:0
})
const subjectParams = ref({
page:1,
pageSize:100,
})
const tableData = ref([])
const subjectList = ref([])
const current_subject = ref('')
const deleteVisible = ref(false)
const question_ids = ref([])
const total = ref(0)
const dialogFormVisible = ref(false)
const dialogTitle = ref('')
const form =ref({})
const rules = ref({
name: [{ required: true, message: '请输入课程名称', trigger: 'blur' }]
})
const question_id = ref(0)
const content = ref(null)
// const options = ref([]) // 答案选项数组
const exam_types = ref([])
const exam_ids = ref([])
// 生命周期
onMounted(() => {
getOrderList()
getSubject()
})
provide('subjectList', subjectList)
provide('current_subject', current_subject)
// 方法
async function getOrderList() {
const res = await api.getOrderList(queryParams.value)
if(res.code === 0) {
tableData.value = res.data.records
total.value = res.data.total
}
}
async function getSubject(){ // 获取课程分类
const res = await capi.getSubjectList(subjectParams.value)
if(res.code === 0) {
subjectList.value = custom.getStdSubject(res.data.records)
}
}
function onSubmit() {
getOrderList()
}
const onReset = () => {
queryParams.value = {
page:1,
pageSize:10,
name:'',
status:'',
subject:''
}
}
function openDialog(type) {
// let params = {}
switch (type){
case 'add':
dialogTitle.value = '新增试卷'
form.value = {}
break;
case 'edit':
// params.question_id = question_id.value
dialogTitle.value = '编辑试卷'
break;
}
dialogFormVisible.value = true
// router.push({name:'addCourse',params})
}
async function onDelete() {
const ids = exam_ids.value
const res = await api.delExamination({ exam_ids:ids })
if (res.code === 0) {
ElMessage({
type: 'success',
message: res.msg
})
// if (tableData.value.length === ids.length && page.value > 1) {
// page.value--
// }
deleteVisible.value = false
getOrderList()
}
}
const handleSelectionChange = (val) => {
exam_ids.value = val.map((item) => {
return item.exam_id
})
}
function editCourseFunc(row) {
row.course_ids = JSON.parse(row.course_ids)
row.question_ids = JSON.parse(row.question_ids)
form.value = row.exam
exam_types.value = row.exam_types.map((item) => {
return item.persons
})
current_subject.value = form.value.subject
openDialog('edit')
}
function deleteExamFunc(row) {
ElMessageBox.confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(async() => {
const res = await api.delExamination({
exam_ids:[row.exam_id]
})
if (res.code === 0) {
ElMessage({
type: 'success',
message: '删除成功!'
})
getOrderList()
}
},() => {
})
}
function handleCurrentChange(val) {
queryParams.value.page = val
getOrderList()
}
function handleSizeChange(val) {
queryParams.value.pageSize = val
getOrderList()
}
function closeDialog(){
dialogFormVisible.value = false
exam_types.value = []
form.value = {}
}
async function enterDialog() { // 提交
form.value.teacher_id = 0
form.value.exam_type = exam_types.value.map((item) => {
return item = parseInt(item)
})
form.value.duration = parseInt(form.value.duration)
// return
const params = {
...form.value
}
params.question_ids = JSON.stringify(form.value.question_ids)
params.course_ids = JSON.stringify(form.value.course_ids)
let func_name = 'addExamination'
if(form.value.exam_id) { // 编辑
func_name = 'editExamination'
}
const res = await api[func_name](params)
if(res.code === 0) {
ElMessage({
type: 'success',
message: res.msg
})
closeDialog()
getOrderList()
}
}
function viewOrderFunc(row) { // 查看订单
router.push({name:'viewOrder',params:{order_id:row.order_id}})
}
function getExercisesName(row) {
return JSON.parse(row.question).title
}
// const std_options_title = ref(['A','B','C','D','E','F'])
function addOptionFunc() {
exam_types.value.push('')
}
function delet_func() {
exam_types.value.pop()
}
function getStateName(state) {
let str = ''
switch (state){
case 1:
str = '未付款'
break;
case 2:
str = '已付款'
break;
case 3:
str = '已过期'
break;
}
return str
}
function handleAvatarSuccess(res) {
form.value.cover = res.data.file.url
// handlerChange()
}
function beforeAvatarUpload(file) {
const isLt05M = file.size / 1024 / 1024 < 20
const isJPG = file.type.indexOf('image/') === -1
if (isJPG) {
ElMessage.error('文件格式错误,请上传图片类型,如JPGPNG后缀的文件')
}
if (!isLt05M) {
ElMessage.error('上传头像图片大小不能超过 2M!')
}
return !isJPG && isLt05M
}
function changeSubjectFunc(e) {
current_subject.value = e
}
function addExercisesFunc(data) {
form.value.question_ids = data
}
function addCourseFunc(data) {
form.value.course_ids = data
}
function getTypeName(type) {
let name = ""
switch (type) {
case 1:
name = '课程';
break;
case 2:
name = '章节';
break;
case 3:
name = '子章节';
break;
case 4:
name = '试卷';
break;
}
return name
}
</script>
<template>
<div>
<!-- 搜索框-->
<div class="gva-search-box">
<el-form ref="searchForm" :inline="true" :model="queryParams">
<el-form-item label="订单名称">
<el-input v-model="queryParams.name" placeholder="根据订单名称进行查询" />
</el-form-item>
<!-- <el-form-item label="课程分类">-->
<!-- <el-select v-model="queryParams.subject" clearable placeholder="请选择">-->
<!-- <el-option-->
<!-- v-for="item in subjectList"-->
<!-- :key="item.id"-->
<!-- :label="item.name"-->
<!-- :value="item.name"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item>
<el-button size="small" type="primary" icon="search" @click="onSubmit">查询</el-button>
<el-button size="small" icon="refresh" @click="onReset">重置</el-button>
</el-form-item>
</el-form>
</div>
<!-- 表格数据-->
<div class="gva-table-box">
<!-- 批量操作-->
<div class="gva-btn-list">
<!-- <el-button size="small" type="primary" icon="plus" @click="openDialog('add')">新增</el-button>-->
<el-popover v-model="deleteVisible" placement="top" width="160">
<p>确定要删除吗?</p>
<div style="text-align: right; margin-top: 8px;">
<el-button size="small" type="primary" link @click="deleteVisible = false">取消</el-button>
<el-button size="small" type="primary" @click="onDelete">确定</el-button>
</div>
<!-- <template #reference>-->
<!-- <el-button icon="delete" size="small" type="danger" :disabled="!exam_ids.length" style="margin-left: 10px;" @click="deleteVisible = true">删除</el-button>-->
<!-- </template>-->
</el-popover>
</div>
<!-- 数据列表-->
<el-table :data="tableData" @selection-change="handleSelectionChange">
<!-- <el-table-column-->
<!-- type="selection"-->
<!-- width="55"-->
<!-- />-->
<el-table-column align="center" label="ID" prop="order_id" sortable="custom" />
<el-table-column align="center" label="用户昵称" min-width="150" prop="nickname" />
<el-table-column align="center" label="用户ID" prop="user_id" />
<el-table-column align="center" label="手机号" min-width="150" prop="phone" />
<el-table-column align="center" label="类型" min-width="150" prop="order_type">
<template #default="scope">
{{getTypeName(scope.row.order_type)}}
</template>
</el-table-column>
<el-table-column align="center" label="商品名称" min-width="150" prop="name" />
<el-table-column align="center" label="订单金额" min-width="150" prop="price" />
<el-table-column align="center" label="所属区域" min-width="150" prop="province" />
<el-table-column align="center" label="状态" >
<template #default="scope">
<div>{{getStateName(scope.row.status)}}</div>
</template>
</el-table-column>
<el-table-column align="center" label="提交时间" min-width="150" >
<template #default="scope">
{{formatDate(scope.row.CreatedAt)}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="200">
<template #default="scope">
<el-button
icon="edit"
size="small"
type="primary"
link
@click="viewOrderFunc(scope.row)"
>查看</el-button>
<!-- <el-button-->
<!-- icon="delete"-->
<!-- size="small"-->
<!-- type="danger"-->
<!-- link-->
<!-- @click="deleteExamFunc(scope.row)"-->
<!-- >删除</el-button>-->
</template>
</el-table-column>
</el-table>
<div class="gva-pagination">
<el-pagination
:current-page="queryParams.page"
:page-size="queryParams.pageSize"
:page-sizes="[10, 30, 50, 100]"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
/>
</div>
</div>
<el-dialog v-model="dialogFormVisible" :before-close="closeDialog" :title="dialogTitle">
<el-form ref="apiForm" :model="form" :rules="rules" label-width="80px">
<el-form-item label="试卷名称" >
<el-input v-model="form.name" placeholder="请输入试卷名称" />
</el-form-item>
<el-form-item label="科目" prop="subject">
<el-select v-model="form.subject" @change="changeSubjectFunc" clearable placeholder="请选择">
<el-option
v-for="item in subjectList"
:key="item.id"
:label="item.name"
:value="item.name"
/>
</el-select>
</el-form-item>
<el-form-item label="封面">
<el-upload
class="avatar-uploader"
:action="`${path}/fileUploadAndDownload/upload`"
:headers="{ 'x-token': userStore.token }"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<img v-if="form.cover" :src="form.cover" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
<el-form-item label="测试时长" >
<el-input type="number" v-model="form.duration" placeholder="请输入测试时长(分钟)" />
</el-form-item>
<el-form-item label="测试组别" >
<!-- <el-input v-model="form.score" placeholder="请输入分值" />-->
<view class="options-box">
<view class="option-item" v-if="exam_types.length>0" v-for="(item,i) in exam_types">
<view>{{i+1}}</view>
<el-input type="number" style="margin-left:5px" v-model="exam_types[i]" placeholder="请输入组别人数" />
<el-icon style="margin-left: 5px;cursor: pointer" v-if="(i+1) == exam_types.length" @click="delet_func(item)"><Delete /></el-icon>
</view>
<el-button @click="addOptionFunc">添加组别</el-button>
</view>
</el-form-item>
<!-- <el-form-item label="添加习题" >-->
<!-- <exercisesPool @addFunc="addExercisesFunc" :seleted_arr="form.question_ids" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="适用课程" >-->
<!-- <coursePool @addFunc="addCourseFunc" :seleted_arr="form.course_ids" />-->
<!-- </el-form-item>-->
<el-form-item label="受否上架" >
<el-switch
v-model="form.status"
active-text="上架"
inactive-text="下架"
:active-value="1"
:inactive-value="-1"
/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button size="small" @click="closeDialog">取 消</el-button>
<el-button size="small" type="primary" @click="enterDialog">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<style scoped lang="scss">
.e-img{
width: 150px;
height: 100px;
}
.option-item{
display: flex;
align-items: center;
margin-bottom: 10px;
}
.button-box {
padding: 10px 20px;
.el-button {
float: right;
}
}
.warning {
color: #dc143c;
}
</style>