Merge branch 'codex/shiyan' into master

# Conflicts:
#	web/package-lock.json
This commit is contained in:
biss committed 2026-08-09 14:51:24 +08:00
commit bb2b43b0d9
25 files changed
+21324 -1196

No files matched your search

+1069 -1123
View File
File diff suppressed because it is too large. Load diff
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+68 -5
View File
@@ -90,6 +90,34 @@ const filteredRows = computed(() => {
.filter(Boolean).some((value) => String(value).toLowerCase().includes(q)),
)
})
const currentPage = ref(1)
const pageSize = ref(20)
const pagedRows = computed(() => filteredRows.value.slice(
(currentPage.value - 1) * pageSize.value,
currentPage.value * pageSize.value,
))
const venueNatureOptions = [
{ value: 1, label: '普通教室' },
{ value: 2, label: '实验室' },
{ value: 4, label: '实训室' },
{ value: 8, label: '计算机机房' },
{ value: 16, label: '语音室' },
{ value: 32, label: '体育场地' },
{ value: 64, label: '艺术场地' },
]
const venueNatureValue = (value: unknown) => {
if (typeof value === 'number') return value
if (typeof value !== 'string') return 0
const names: Record<string, number> = {
GeneralClassroom: 1, Laboratory: 2, TrainingRoom: 4, ComputerLab: 8,
LanguageLab: 16, SportsVenue: 32, ArtsVenue: 64,
}
return value.split(',').reduce((sum, name) => sum | (names[name.trim()] ?? 0), 0)
}
const venueNatureLabel = (value: unknown) => venueNatureOptions
.filter((item) => (venueNatureValue(value) & item.value) !== 0)
.map((item) => item.label)
.join('、') || '未设置'
function resetForm(row?: Row) {
Object.keys(form).forEach((key) => delete form[key])
@@ -100,12 +128,19 @@ function resetForm(row?: Row) {
grade: new Date().getFullYear(), counselorUserId: undefined,
academicYear: `${new Date().getFullYear()}-${new Date().getFullYear() + 1}`,
season: 'Autumn', startDate: '', endDate: '', isCurrent: false,
capacity: 60, roomType: '普通教室', equipment: '',
capacity: 60, roomType: '普通教室', teachingVenueNatures: [1], equipment: '',
}, row ?? {})
if (active.value === 'classrooms') {
const value = venueNatureValue((row as any)?.teachingVenueNature ?? 1)
form.teachingVenueNatures = venueNatureOptions
.filter((item) => (value & item.value) !== 0)
.map((item) => item.value)
}
}
async function load() {
loading.value = true
currentPage.value = 1
try {
rows.value = (await http.get(`/base-data/${active.value}`)).data
} catch (error) {
@@ -192,10 +227,16 @@ async function save() {
return
}
try {
const payload = active.value === 'classrooms'
? {
...form,
teachingVenueNature: form.teachingVenueNatures.reduce((value: number, item: number) => value | item, 0),
}
: form
if (editingId.value) {
await http.put(`/base-data/${active.value}/${editingId.value}`, form)
await http.put(`/base-data/${active.value}/${editingId.value}`, payload)
} else {
await http.post(`/base-data/${active.value}`, form)
await http.post(`/base-data/${active.value}`, payload)
}
ElMessage.success(editingId.value ? '已保存修改' : `已新增${title.value}`)
dialogVisible.value = false
@@ -265,6 +306,11 @@ onMounted(async () => {
await Promise.all([load(), loadReferences()])
})
watch(
() => keyword.value,
() => { currentPage.value = 1 },
)
watch(
() => route.meta.baseGroup,
async () => {
@@ -338,7 +384,7 @@ watch(
<div v-if="active === 'terms'" class="term-mobile-list">
<article
v-for="row in filteredRows"
v-for="row in pagedRows"
:key="row.id"
:class="academicTermRowClass(row)"
>
@@ -381,7 +427,7 @@ watch(
<el-table
v-loading="loading"
:data="filteredRows"
:data="pagedRows"
:row-class-name="termTableRowClass"
class="data-table"
:class="{ 'term-desktop-table': active === 'terms' }"
@@ -407,6 +453,9 @@ watch(
<el-table-column v-if="active === 'buildings'" prop="campusName" label="所属校区" min-width="140" />
<el-table-column v-if="active === 'classrooms'" prop="buildingName" label="教学楼" min-width="130" />
<el-table-column v-if="active === 'classrooms'" prop="capacity" label="容量" width="90" />
<el-table-column v-if="active === 'classrooms'" label="场地性质" min-width="180">
<template #default="{ row }">{{ venueNatureLabel(row.teachingVenueNature) }}</template>
</el-table-column>
<el-table-column label="状态" width="90">
<template #default="{ row }">
<span class="table-status" :class="{ off: !row.isEnabled }">{{ row.isEnabled ? '启用' : '停用' }}</span>
@@ -444,6 +493,15 @@ watch(
</el-table-column>
<template #empty><el-empty description="暂无数据,点击右上角开始新增" /></template>
</el-table>
<el-pagination
v-if="filteredRows.length > pageSize"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
class="table-pagination"
layout="total, sizes, prev, pager, next"
:page-sizes="[20, 50, 100]"
:total="filteredRows.length"
/>
</section>
<el-dialog v-model="dialogVisible" :title="`${editingId ? '编辑' : '新增'}${title}`" width="560px">
@@ -519,6 +577,11 @@ watch(
<el-form-item label="容量"><el-input-number v-model="form.capacity" :min="1" :max="1000" /></el-form-item>
<el-form-item label="教室类型"><el-input v-model="form.roomType" /></el-form-item>
</div>
<el-form-item v-if="active === 'classrooms'" label="教学场地性质" required>
<el-checkbox-group v-model="form.teachingVenueNatures">
<el-checkbox v-for="item in venueNatureOptions" :key="item.value" :value="item.value">{{ item.label }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item v-if="active === 'classrooms'" label="设备"><el-input v-model="form.equipment" /></el-form-item>
<div class="form-grid compact">
<el-form-item label="排序"><el-input-number v-model="form.sortOrder" :min="0" /></el-form-item>
Loaded 3 of 25 files, more files were not shown because too many files have changed in this diff. Show more