@@ -4,14 +4,16 @@ import conf from "@/assets/config/host.config";
|
||||
import type {
|
||||
ClassTreeNode,
|
||||
EffectiveSettingVo,
|
||||
GradeSettingVo,
|
||||
ModNode,
|
||||
MyClassVo,
|
||||
MyClassesVo,
|
||||
MyTimetableVo,
|
||||
NowYearTermVo,
|
||||
SettingGetVo,
|
||||
SubjectVo,
|
||||
TemplateSaveRequest,
|
||||
TimeSettingVo,
|
||||
TimetableOverviewVo,
|
||||
TimetableSaveRequest,
|
||||
TimetableVo,
|
||||
UpFileResultVo,
|
||||
@@ -27,8 +29,6 @@ import type {
|
||||
*
|
||||
* 约定:
|
||||
* - postJSON 用于 @RequestBody 接口;postForm 用于 @RequestParam 接口(表单提交)。
|
||||
* - postForm 同时把参数拼到 URL query:后端 @RequestParam 都收得到,且本地
|
||||
* vite-plugin-mock 不解析 urlencoded body,靠 query 才能拿到参数(不影响线上)。
|
||||
*/
|
||||
|
||||
const BASE = "/api/base";
|
||||
@@ -56,13 +56,11 @@ function postJSON<T = any>(url: string, data?: Record<string, any> | any[]): Met
|
||||
function postForm<T = any>(url: string, data?: Record<string, any>): Method<T> {
|
||||
const pairs = data ? Object.entries(data).filter(([, v]) => v !== undefined && v !== null) : [];
|
||||
const form = pairs.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`).join("&");
|
||||
// B1 修复:mock 只解析 query,故仅 mock 模式把参数拼进 URL;真后端只发 body,
|
||||
// 否则 Spring @RequestParam 会把 query 与 body 同名值以逗号合并(单值变 "X,X"、数字变 "1,1" 直接 500)。
|
||||
const fullUrl = conf.isMock && form ? `${url}${url.includes("?") ? "&" : "?"}${form}` : url;
|
||||
// 只发 body,不拼 URL query:Spring @RequestParam 会把 query 与 body 同名值以逗号合并(单值变 "X,X" 直接 500)
|
||||
return new Method<T>(
|
||||
"POST",
|
||||
alovaInstance,
|
||||
fullUrl,
|
||||
url,
|
||||
{ headers: { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" } },
|
||||
form || undefined
|
||||
);
|
||||
@@ -83,6 +81,26 @@ export function fileUploadUrl(): string {
|
||||
return `${conf.serviceHost}${FILE}/Upload`;
|
||||
}
|
||||
|
||||
/** 年级照片课表打包下载地址(ZIP,条目按年级+班级名命名;前端 fetch 取 Blob 后落盘) */
|
||||
export function gradePhotoZipUrl(gradeName: string): string {
|
||||
return `${conf.serviceHost}${TIMETABLE}/DownloadGradePhotos?gradeName=${encodeURIComponent(gradeName)}`;
|
||||
}
|
||||
|
||||
/** 课表导入模板下载地址(按班级年级生效节次模板生成 xlsx) */
|
||||
export function timetableImportTemplateUrl(classId: number): string {
|
||||
return `${conf.serviceHost}${TIMETABLE}/ImportTemplate?classId=${classId}`;
|
||||
}
|
||||
|
||||
/** 班级电子课表导出地址(xlsx,当前学年学期) */
|
||||
export function timetableExportUrl(classId: number): string {
|
||||
return `${conf.serviceHost}${TIMETABLE}/Export?classId=${classId}`;
|
||||
}
|
||||
|
||||
/** 课表导入上传地址(FormData:classId + file,整表替换该班当前课表) */
|
||||
export function timetableImportUrl(): string {
|
||||
return `${conf.serviceHost}${TIMETABLE}/Import`;
|
||||
}
|
||||
|
||||
class BaseApi {
|
||||
// ========== 用户信息 & 模块权限 ==========
|
||||
/** 获取当前登录用户信息 */
|
||||
@@ -140,10 +158,16 @@ class SyllabusApi {
|
||||
return get<NowYearTermVo>(`${TIMETABLE}/NowYearTerm`);
|
||||
}
|
||||
|
||||
// ========== 排课情况 ==========
|
||||
/** 全校排课情况汇总(每班电子版 / 照片版编排状态,按年级→班级排序) */
|
||||
overview() {
|
||||
return get<TimetableOverviewVo[]>(`${TIMETABLE}/Overview`);
|
||||
}
|
||||
|
||||
// ========== 我的课表(按角色过滤的只读视图) ==========
|
||||
/** 可查看班级列表(管理员/校领导=全部;班主任=所带;任教=任教班级) */
|
||||
/** 可查看班级列表 + 身份标识(管理员/班主任/任教老师,前端按身份切换视图) */
|
||||
myClasses() {
|
||||
return get<MyClassVo[]>(`${TIMETABLE}/MyClasses`);
|
||||
return get<MyClassesVo>(`${TIMETABLE}/MyClasses`);
|
||||
}
|
||||
/** 班级课表(权限校验;任教老师只返回任教科目格) */
|
||||
myGet(classId: number) {
|
||||
@@ -171,10 +195,26 @@ class SyllabusApi {
|
||||
deleteTemplate(id: number) {
|
||||
return postForm<void>(`${SETTING}/DeleteTemplate`, { id });
|
||||
}
|
||||
/** 保存节次模板的「显示全部/只显示节次」偏好(绑定模板记忆,预览课表/我的课表同随此值) */
|
||||
saveTemplateShowBreakRows(id: number, showBreakRows: boolean) {
|
||||
return postForm<void>(`${SETTING}/SaveTemplateShowBreakRows`, { id, showBreakRows });
|
||||
}
|
||||
/** 保存节次模板的「节次名称 显示/隐藏」偏好(绑定模板记忆,预览课表/我的课表同随此值) */
|
||||
saveTemplateShowPeriodName(id: number, showPeriodName: boolean) {
|
||||
return postForm<void>(`${SETTING}/SaveTemplateShowPeriodName`, { id, showPeriodName });
|
||||
}
|
||||
/** 课表编辑页生效设置:时间边界 + 当前学期下指定年级启用模板的行(term 1=上学期 2=下学期) */
|
||||
effectiveForGrade(gradeName: string, term?: number) {
|
||||
return get<EffectiveSettingVo>(`${SETTING}/ForGrade`, { gradeName, term });
|
||||
}
|
||||
/** 年级设置列表(启用 + 使用电子版/照片版;未配置的年级默认全启用) */
|
||||
gradeSettings() {
|
||||
return get<GradeSettingVo[]>(`${SETTING}/Grades`);
|
||||
}
|
||||
/** 批量保存年级设置(按年级名 upsert;作用于「我的课表」电子/照片视图切换) */
|
||||
saveGradeSettings(data: GradeSettingVo[]) {
|
||||
return postJSON<void>(`${SETTING}/SaveGrades`, data);
|
||||
}
|
||||
|
||||
// ========== 附件 ==========
|
||||
fileDownUrl = fileDownUrl;
|
||||
|
||||
Reference in New Issue
Block a user