Compare commits

...

2 Commits

Author SHA1 Message Date
ltx
19b35fc9b9 add:添加学校预约列表显示 2025-06-20 10:42:13 +08:00
ltx
2a7b305a2a update:修改测试服务器接口&删除创建班级验证 2025-06-19 13:33:42 +08:00
5 changed files with 339 additions and 20 deletions

View File

@ -1,3 +1,4 @@
import { status } from 'nprogress'
import http from './http.js'
// export function GetGradeName() {
// return http.get(`/api/Grade/GetGradeName`)
@ -320,8 +321,15 @@ export function StudentClassReportDetails(a) {
return http.get(`/api/TrainingData/GetStudentClassReportDetails?`+a)
}
//学校账号开通预约列表
export function getSchoolReservationList(pageIndex, status) {
return http.get(`/api/School/GetSchoolAccountApplicationPageList?PageIndex=${pageIndex}&PageSize=20&Status=${status ? status : 0}`)
}
//更新预约状态
export function changeSchoolReservationStatus(id, status) {
return http.post(`/api/School/UpdateSchoolAccountApplicationStatus?id=${id}0&Status=${status ? status : 0}`)
}

View File

@ -12,7 +12,7 @@ import {
let loadingInstance;
let loadingStatus = false;
if (process.env.NODE_ENV == 'development') {
axios.defaults.baseWeChatURL = 'https://wechatapi.yuedongsports.com/';
axios.defaults.baseWeChatURL = 'https://wechatapi-qa.yuedongsports.com/';
} else if (process.env.NODE_ENV == 'debug') {

View File

@ -574,6 +574,11 @@ const routes = [{
path: '/sportsHallClass', //运动馆/班级管理
name: 'sportsHallClass',
component: () => import('@/views/sportsHall/classManage/index.vue'),
},
{
path: '/openReservation', //学校管理/开放预约
name: 'openReservation',
component: () => import('@/views/openReservation/index.vue'),
}
]
},

View File

@ -0,0 +1,302 @@
<script setup>
import { ref, onMounted } from 'vue'
import { Table, Tag, Divider, ConfigProvider, Input, Button, Modal, Select, Pagination, message ,Popconfirm} from 'ant-design-vue';
import zhCN from 'ant-design-vue/es/locale/zh_CN';
import { getSchoolReservationList } from '@/api/grade';
// Component logic goes here
onMounted(() => {
// Initialization code
getSchoolList()
})
const getSchoolList = async () => {
const res = await getSchoolReservationList(pageIndex.value, searchSchoolStatus.value);
schoolList.value = res.data.datas
total.value = res.data.total;
}
const schoolList = ref([]);
const total = ref(0);
const pageIndex = ref(1);
const columns = [
{
title: '序号',
key: 'index',
// width: 80,
customRender: ({ index }) => index + 1
},
{
title: '学校名称',
dataIndex: 'schoolName',
key: 'schoolName',
},
{
title: '学校地址',
dataIndex: 'schoolAddress',
key: 'schoolAddress',
},
{
title: '联系人',
dataIndex: 'userName',
key: 'userName',
},
{
title: '联系电话',
dataIndex: 'phoneNo',
key: 'phoneNo',
},
{
title: '申请时间',
dataIndex: 'visitingTime',
key: 'visitingTime',
},
{
title: '状态',
dataIndex: 'set',
key: 'set',
},
]
const statusList = [
{ label: '全部', value: 0 },
{ label: '未联系', value: 1 },
{ label: '已联系', value: 2 },
]
const searchSchoolStatus = ref(0);
const handleChange = (value) => {
searchSchoolStatus.value = value;
getSchoolList();
}
</script>
<template>
<div class="class-manage">
<div class="select-box">
学校状态
<!-- <Input type="text" placeholder="请输入学校名称" v-model:value="searchSchoolName" class="inputt" /> -->
<Select
v-model:value="searchSchoolStatus"
placeholder="请选择状态"
class="select"
@change="handleChange"
>
<Select.Option v-for="item in statusList" :key="item.value" :value="item.value">
{{ item.label }}
</Select.Option>
</Select>
<Button class="btn" type="primary" @click="handleChange(0)"> 重置</Button>
</div>
<ConfigProvider :locale="zhCN">
<Table :columns="columns" :data-source="schoolList" :locale="zhCN" :pagination="{ pageSize: 20 ,total: total, current: pageIndex, onChange: (page) => { pageIndex = page; getSchoolList() } }">
<template #bodyCell="{ column, record, index }">
<template v-if="column.key === 'index'">
{{ index + 1 }}
</template>
<!-- <template v-if="column.key === 'studentCount' && record.id == allStudentClass.id">
{{ studentslist.length }}
</template> -->
<template v-if="column.key == 'set'">
<Popconfirm
title="是否变更联系状态状态?"
ok-text="是"
cancel-text="否"
@confirm="changeStutus(record.id)"
@cancel="cancel"
v-if="record.status == 1"
>
<a >未联系</a>
</Popconfirm>
<view v-if="record.status == 2">已联系</view>
<!-- <a @click="setCilck" class="settingg">删除</a> -->
</template>
</template>
</Table>
</ConfigProvider>
</div>
</template>
<style lang="scss" scoped>
.ever {
display: flex;
align-items: center;
margin-top: 30px;
}
.inputtt {
width: 600px;
}
.posi {
position: absolute;
top: 4px;
left: 20px;
color: #999;
}
.student-box {
display: flex;
flex-wrap: wrap;
margin-top: 16px;
justify-content: flex-start;
padding: 0 30px 30px;
}
.action {
margin-left: 94px;
margin-top: 20px;
margin-bottom: -10px;
color: #999;
}
.student-item {
display: flex;
align-items: center;
justify-content: space-around;
min-width: 100px;
height: 40px;
border-radius: 10px;
background-color: #fff;
margin-right: 20px;
margin-bottom: 10px;
box-sizing: border-box;
padding: 0 16px;
font-size: 14px;
position: relative;
border: 1px solid #1890ff;
.sex {
width: 20px;
height: 20px;
background-color: #fff;
border-radius: 50%;
margin-left: 4px;
margin-right: 4px;
}
.index {
position: absolute;
top: 0;
left: 0;
background-color: #1890ff;
color: #fff;
min-width: 20px;
border-radius: 5px 0 5px 0;
display: flex;
align-items: center;
justify-content: center;
}
}
.click {
background-color: #1890ff;
color: #fff;
animation: selectAnimation 0.3s ease;
}
.noClick {
// animation: noSelectAnimation 0.3s ease;
}
@keyframes noSelectAnimation {
0% {
background-color: #1890ff;
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
background-color: #f0f0f0;
transform: scale(1);
}
}
@keyframes selectAnimation {
0% {
background-color: #f0f0f0;
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
background-color: #1890ff;
transform: scale(1);
}
}
.click-box {
margin-left: 86px;
margin-right: 66px;
box-sizing: border-box;
border: 1px solid #d9d9d9;
border-radius: 10px;
padding: 10px;
padding-top: 20px;
}
.class-manage {
padding: 24px;
background: #fff;
margin: 12px;
border-radius: 10px;
min-height: 90vh;
.select-box {
display: flex;
align-items: center;
/* justify-content: space-between; */
margin-bottom: 16px;
font-size: 14px;
}
.select-name {
font-size: 14px;
font-weight: 500;
color: #333;
margin-right: 16px;
}
.btn {
margin-right: 16px;
margin-left: 30px;
}
.new-class-btn {
margin-bottom: 16px;
display: flex;
justify-content: flex-end;
}
.inputt {
width: 250px;
height: 36px;
border-radius: 5px;
padding-left: 5px;
margin-right: 16px;
}
.settingg {
margin-right: 12px;
}
}
</style>

View File

@ -135,7 +135,7 @@ const columns = [
title: '班级人数',
dataIndex: 'studentCount',
key: 'studentCount',
sorter: (a, b) => a - b,
sorter: (a, b) => a.studentCount - b.studentCount ,
},
{
title: '操作',
@ -174,20 +174,23 @@ const handleOk = () => {
message.error('班级名称不能为空');
return;
}
if (!classFrom.value.teacherDetail) {
message.error('所属教练不能为空');
return;
}
if (classFrom.value.studentIds.length == 0) {
message.error('学生列表不能为空');
return;
}
// if (!classFrom.value.teacherDetail) {
// message.error('');
// return;
// }
// if (classFrom.value.studentIds.length == 0) {
// message.error('');
// return;
// }
let teacherDetail = {}
if(classFrom.value.teacherDetail) {
teacherDetail = teacherList.value.find(item => item.teacherName === classFrom.value.teacherDetail);
}
let teacherDetail = teacherList.value.find(item => item.teacherName === classFrom.value.teacherDetail);
if (!teacherDetail) {
message.error('请选择有效的教练');
return;
}
// if (!teacherDetail) {
// message.error('');
// return;
// }
let studentIds = [];
classFrom.value.studentIds.map(item => {
@ -195,7 +198,7 @@ const handleOk = () => {
})
let params = {
className: classFrom.value.className,
teacherIds: [teacherDetail.id],
teacherIds: teacherDetail.id ? [teacherDetail.id] : [],
studentNoList: studentIds // ID
};
@ -347,7 +350,7 @@ const handleSearch = () => {
:maxlength="32" />
</div>
<div class="ever"><text style="color: red;">*&nbsp;</text>学生列表&nbsp;&nbsp;
<div class="ever">学生列表&nbsp;&nbsp;
<Button @click="showStudent" type="primary">分配学生</Button>
</div>
<div class="action">
@ -370,7 +373,8 @@ const handleSearch = () => {
</transition-group>
</vue-draggable-next>
<div class="ever"><text style="color: red;">*&nbsp;</text>所属教练&nbsp;&nbsp;
<!-- <text style="color: red;">*&nbsp;</text> -->
<div class="ever">所属教练&nbsp;&nbsp;
<Select v-model:value="classFrom.teacherDetail" style="width: 200px"
:options="teacherList.map(item => ({ value: item.teacherName }))"></Select>
</div>