feat(user): 支持修改当前用户资料接口并更新个人中心调用

- 新增 updateSelfUser 方法,用于修改当前登录用户的个人资料
- 个人中心调用接口由原 updateUser 切换为 updateSelfUser,避免学生账号权限不足导致的保存失败
- 更新了头像保存、个人信息保存等相关调用代码,添加异常捕获和提示
- 修正环境变量 .env.development 中 API URL 配置为生产地址
- 优化审核记录排序逻辑,新增获取最新审核记录和编辑入口显示判断函数
- 调整审核状态标签使用统一排序规则,防止显示和编辑状态不一致
- 新增社团活动、社团编辑、志愿时长录入、学分记录编辑、社会实践学分申报、青马学员编辑等多个新增组件及表单功能
- 各新增功能支持表单验证、操作反馈和数据加载优化
This commit is contained in:
2026-11-05 19:03:40 +08:00
parent 1c3ea8ec77
commit 567e4aabdb
56 changed files with 8941 additions and 20 deletions
+392
View File
@@ -0,0 +1,392 @@
import type { PageParam, PageResult } from '@/api';
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 社团 */
export interface Club {
id?: number;
clubCode?: string;
clubName?: string;
category?: string;
collegeId?: number;
organizationId?: number;
advisorUserId?: number;
advisorName?: string;
presidentUserId?: number;
presidentName?: string;
presidentPhone?: string;
memberCount?: number;
level?: string;
foundedDate?: string;
intro?: string;
cover?: string;
status?: number;
sortNumber?: number;
collegeName?: string;
members?: ClubMember[];
}
/** 社团成员 */
export interface ClubMember {
id?: number;
clubId?: number;
userId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
classId?: number;
roleName?: string;
joinTime?: string;
quitTime?: string;
status?: number;
}
/** 社团活动 */
export interface ClubActivity {
id?: number;
clubId?: number;
clubName?: string;
title?: string;
category?: string;
startTime?: string;
endTime?: string;
place?: string;
scale?: number;
budget?: number;
content?: string;
attachments?: string;
ocrStatus?: number;
ocrOrg?: string;
status?: number;
userId?: number;
createTime?: string;
}
export interface ClubParam extends PageParam {
clubName?: string;
category?: string;
collegeId?: number;
advisorUserId?: number;
status?: number;
}
export interface ClubActivityParam extends PageParam {
clubId?: number;
title?: string;
category?: string;
status?: number;
userId?: number;
startTimeStart?: string;
startTimeEnd?: string;
}
/** 场地 */
export interface Venue {
id?: number;
venueName?: string;
building?: string;
roomNo?: string;
capacity?: number;
facilities?: string;
openStartTime?: string;
openEndTime?: string;
openWeekdays?: string;
managerUserId?: number;
managerName?: string;
adminOrgId?: number;
status?: number;
remark?: string;
cover?: string;
sortNumber?: number;
}
/** 场地预约 */
export interface VenueBooking {
id?: number;
venueId?: number;
venueName?: string;
userId?: number;
applicantName?: string;
applicantPhone?: string;
clubId?: number;
clubName?: string;
bookingDate?: string;
startTime?: string;
endTime?: string;
purpose?: string;
attendeeCount?: number;
status?: number;
reviewRemark?: string;
createTime?: string;
}
export interface VenueBookingParam extends PageParam {
venueId?: number;
userId?: number;
clubId?: number;
status?: number;
bookingDate?: string;
bookingDateStart?: string;
bookingDateEnd?: string;
}
// ---------------- 社团 ----------------
export async function pageClubs(params: ClubParam) {
const res = await request.get<ApiResult<PageResult<Club>>>(
MODULES_API_URL + '/gxmu/club/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function listClubs(params?: ClubParam) {
const res = await request.get<ApiResult<Club[]>>(
MODULES_API_URL + '/gxmu/club',
{ params }
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function getClub(id: number) {
const res = await request.get<ApiResult<Club>>(
MODULES_API_URL + '/gxmu/club/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function addClub(data: Club) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function updateClub(data: Club) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removeClub(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function listClubMembers(clubId: number, status?: number) {
const res = await request.get<ApiResult<ClubMember[]>>(
MODULES_API_URL + `/gxmu/club/${clubId}/member`,
{ params: { status } }
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function addClubMember(data: ClubMember) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club/member',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removeClubMember(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club/member/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function pageClubActivities(params: ClubActivityParam) {
const res = await request.get<ApiResult<PageResult<ClubActivity>>>(
MODULES_API_URL + '/gxmu/club/activity/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function submitClubActivity(data: ClubActivity) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club/activity',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function reviewClubActivity(data: ClubActivity) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club/activity/review',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removeClubActivity(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/club/activity/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function listMyClubs() {
const res = await request.get<ApiResult<Club[]>>(
MODULES_API_URL + '/gxmu/club/my'
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
// ---------------- 场地 ----------------
export async function pageVenues(params: { page?: number; limit?: number; venueName?: string; building?: string; status?: number }) {
const res = await request.get<ApiResult<PageResult<Venue>>>(
MODULES_API_URL + '/gxmu/venue/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function listVenues() {
const res = await request.get<ApiResult<Venue[]>>(
MODULES_API_URL + '/gxmu/venue'
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function addVenue(data: Venue) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/venue',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function updateVenue(data: Venue) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/venue',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removeVenue(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/venue/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function pageVenueBookings(params: VenueBookingParam) {
const res = await request.get<ApiResult<PageResult<VenueBooking>>>(
MODULES_API_URL + '/gxmu/venue/booking/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function createVenueBooking(data: VenueBooking) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/venue/booking',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function reviewVenueBooking(data: VenueBooking) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/venue/booking/review',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function cancelVenueBooking(id: number) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/venue/booking/cancel/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function getVenueSchedule(venueId: number, date: string) {
const res = await request.get<ApiResult<Record<string, any>[]>>(
MODULES_API_URL + '/gxmu/venue/booking/schedule',
{ params: { venueId, date } }
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
+224
View File
@@ -0,0 +1,224 @@
import type { PageParam, PageResult } from '@/api';
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 学分分类汇总 */
export interface CategorySummary {
category: string;
earned: number;
required: number;
gap: number;
rate: number;
count: number;
}
/** 学分汇总 */
export interface CreditSummary {
userId: number;
studentName?: string;
studentNo?: string;
totalEarned: number;
totalRequired: number;
totalGap: number;
completionRate: number;
categories: CategorySummary[];
}
/** 学分记录 */
export interface CreditRecord {
id?: number;
userId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
classId?: number;
category?: string;
itemName?: string;
score?: number;
acquireTime?: string;
source?: string;
externalId?: string;
evidence?: string;
status?: number;
remark?: string;
createTime?: string;
updateTime?: string;
}
export interface CreditRecordParam extends PageParam {
userId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
classId?: number;
category?: string;
source?: string;
status?: number;
acquireTimeStart?: string;
acquireTimeEnd?: string;
backendAccess?: boolean;
}
/** 学分规则 */
export interface CreditRule {
id?: number;
category?: string;
itemName?: string;
score?: number;
source?: string;
gradeScope?: string;
collegeScope?: string;
status?: number;
remark?: string;
}
/** 毕业学分要求 */
export interface GraduateRequirement {
id?: number;
year?: number;
collegeId?: number;
major?: string;
category?: string;
requiredScore?: number;
sortNumber?: number;
remark?: string;
}
/** 分页查询学分记录 */
export async function pageCreditRecords(params: CreditRecordParam) {
const res = await request.get<ApiResult<PageResult<CreditRecord>>>(
MODULES_API_URL + '/gxmu/credit/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 新增学分记录 */
export async function addCreditRecord(data: CreditRecord) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 修改学分记录 */
export async function updateCreditRecord(data: CreditRecord) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 删除学分记录 */
export async function removeCreditRecord(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 导入一条学分记录 */
export async function importCreditRecord(data: CreditRecord) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit/import',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 我的学分汇总 */
export async function getMyCreditSummary() {
const res = await request.get<ApiResult<CreditSummary>>(
MODULES_API_URL + '/gxmu/credit/my/summary'
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 我的应修学分要求 */
export async function getMyCreditRequirements() {
const res = await request.get<ApiResult<Record<string, number>>>(
MODULES_API_URL + '/gxmu/credit/my/requirements'
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 学分规则列表 */
export async function listCreditRules() {
const res = await request.get<ApiResult<CreditRule[]>>(
MODULES_API_URL + '/gxmu/credit/rule'
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 毕业要求列表 */
export async function listGraduateRequirements() {
const res = await request.get<ApiResult<GraduateRequirement[]>>(
MODULES_API_URL + '/gxmu/credit/requirement'
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 新增毕业要求 */
export async function addGraduateRequirement(data: GraduateRequirement) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit/requirement',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 修改毕业要求 */
export async function updateGraduateRequirement(data: GraduateRequirement) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit/requirement',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 删除毕业要求 */
export async function removeGraduateRequirement(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit/requirement/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
+65
View File
@@ -0,0 +1,65 @@
import type { PageParam, PageResult } from '@/api';
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 学生成长主页 */
export interface GrowthHome {
basic?: {
userId?: number;
name?: string;
studentNo?: string;
avatar?: string;
gender?: string;
collegeName?: string;
className?: string;
major?: string;
grade?: string;
phone?: string;
leaguePosition?: string;
joinMonth?: string;
politics?: string;
profileCompletion?: number;
};
credit?: {
totalEarned?: number;
totalRequired?: number;
totalGap?: number;
completionRate?: number;
categories?: {
category: string;
earned: number;
required: number;
gap: number;
rate: number;
count: number;
}[];
};
volunteer?: Record<string, any>;
activity?: Record<string, any>;
declarations?: Record<string, any>[];
qmgc?: Record<string, any> | null;
}
/** 我的成长主页 */
export async function getMyGrowthHome() {
const res = await request.get<ApiResult<GrowthHome>>(
MODULES_API_URL + '/gxmu/growth/my'
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 指定学生的成长主页 */
export async function getGrowthHome(userId: number) {
const res = await request.get<ApiResult<GrowthHome>>(
MODULES_API_URL + '/gxmu/growth/home',
{ params: { userId } }
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
+132
View File
@@ -0,0 +1,132 @@
import type { PageParam, PageResult } from '@/api';
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 社会实践学分申报 */
export interface PracticeCreditApply {
id?: number;
userId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
classId?: number;
schoolYear?: string;
activityName?: string;
activityType?: string;
startDate?: string;
endDate?: string;
roleName?: string;
content?: string;
score?: number;
approvedScore?: number;
attachments?: string;
status?: number;
remark?: string;
createTime?: string;
updateTime?: string;
}
export interface PracticeCreditParam extends PageParam {
userId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
classId?: number;
schoolYear?: string;
activityType?: string;
status?: number;
backendAccess?: boolean;
}
export const PRACTICE_STATUS_OPTIONS = [
{ label: '草稿', value: 0 },
{ label: '待审核', value: 1 },
{ label: '通过', value: 2 },
{ label: '驳回', value: 3 },
{ label: '作废', value: 4 }
];
export const PRACTICE_TYPE_OPTIONS = [
{ label: '寒暑假社会实践', value: '寒暑假社会实践' },
{ label: '志愿服务', value: '志愿服务' },
{ label: '社会调研', value: '社会调研' },
{ label: '实习实训', value: '实习实训' },
{ label: '其他', value: '其他' }
];
export async function pagePracticeCredits(params: PracticeCreditParam) {
const res = await request.get<ApiResult<PageResult<PracticeCreditApply>>>(
MODULES_API_URL + '/gxmu/practice-credit/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function submitPracticeCredit(data: PracticeCreditApply) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/practice-credit/my',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function withdrawPracticeCredit(id: number) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + `/gxmu/practice-credit/${id}/withdraw`
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function voidPracticeCredit(id: number, reason?: string) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + `/gxmu/practice-credit/${id}/void`,
null,
{ params: { reason } }
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removePracticeCredit(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/practice-credit/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function getMyPracticeSummary() {
const res = await request.get<ApiResult<Record<string, any>>>(
MODULES_API_URL + '/gxmu/practice-credit/my/summary'
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 导出教务处模板数据表 */
export async function exportPracticeCredit(params: PracticeCreditParam) {
const res = await request.post<ApiResult<Record<string, any>>>(
MODULES_API_URL + '/gxmu/practice-credit/export',
params
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
+289
View File
@@ -0,0 +1,289 @@
import type { PageParam, PageResult } from '@/api';
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 青马学员 */
export interface QmgcStudent {
id?: number;
userId?: number;
formId?: number;
studentNo?: string;
studentName?: string;
gender?: string;
phone?: string;
collegeId?: number;
collegeName?: string;
classId?: number;
className?: string;
batch?: string;
year?: number;
candidateNo?: string;
stage?: string;
stageName?: string;
result?: string;
totalScore?: number;
remark?: string;
status?: number;
createTime?: string;
}
/** 青马培养材料 */
export interface QmgcMaterial {
id?: number;
studentId?: number;
stage?: string;
type?: string;
title?: string;
content?: string;
fileId?: number;
fileUrl?: string;
submitTime?: string;
score?: number;
scorerId?: number;
scoreComment?: string;
status?: number;
}
/** 青马培养任务 */
export interface QmgcTask {
id?: number;
batch?: string;
stage?: string;
title?: string;
type?: string;
linkPath?: string;
content?: string;
mustDo?: number;
score?: number;
deadline?: string;
sortNumber?: number;
status?: number;
}
/** 青马考核评分 */
export interface QmgcScore {
id?: number;
studentId?: number;
dimension?: string;
item?: string;
score?: number;
maxScore?: number;
scorerId?: number;
scorerName?: string;
comment?: string;
scoredTime?: string;
}
export interface QmgcStudentParam extends PageParam {
userId?: number;
formId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
batch?: string;
year?: number;
stage?: string;
status?: number;
}
export interface QmgcTaskParam extends PageParam {
batch?: string;
stage?: string;
type?: string;
status?: number;
}
export async function pageQmgcStudents(params: QmgcStudentParam) {
const res = await request.get<ApiResult<PageResult<QmgcStudent>>>(
MODULES_API_URL + '/gxmu/qmgc-student/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function getQmgcStudentDetail(id: number) {
const res = await request.get<ApiResult<Record<string, any>>>(
MODULES_API_URL + '/gxmu/qmgc-student/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function addQmgcStudent(data: QmgcStudent) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/qmgc-student',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function updateQmgcStudent(data: QmgcStudent) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/qmgc-student',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removeQmgcStudent(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/qmgc-student/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function getMyQmgc() {
const res = await request.get<ApiResult<Record<string, any> | null>>(
MODULES_API_URL + '/gxmu/qmgc-student/my'
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function listQmgcMaterials(studentId: number) {
const res = await request.get<ApiResult<QmgcMaterial[]>>(
MODULES_API_URL + `/gxmu/qmgc-student/${studentId}/material`
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function submitQmgcMaterial(data: QmgcMaterial) {
const res = await request.post<ApiResult<QmgcMaterial>>(
MODULES_API_URL + '/gxmu/qmgc-student/material',
data
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function scoreQmgcMaterial(id: number, score: number, comment?: string) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + `/gxmu/qmgc-student/material/${id}/score`,
null,
{ params: { score, comment } }
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function listQmgcStudentTasks(studentId: number) {
const res = await request.get<ApiResult<Record<string, any>[]>>(
MODULES_API_URL + `/gxmu/qmgc-student/${studentId}/task`
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function completeQmgcTask(studentId: number, taskId: number, proofFiles?: string) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + `/gxmu/qmgc-student/${studentId}/task/${taskId}/complete`,
null,
{ params: { proofFiles } }
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function assignQmgcTasks(studentId: number, batch?: string) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + `/gxmu/qmgc-student/${studentId}/task/assign`,
null,
{ params: { batch } }
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function pageQmgcTasks(params: QmgcTaskParam) {
const res = await request.get<ApiResult<PageResult<QmgcTask>>>(
MODULES_API_URL + '/gxmu/qmgc-student/task/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function addQmgcTask(data: QmgcTask) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/qmgc-student/task',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function updateQmgcTask(data: QmgcTask) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/qmgc-student/task',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removeQmgcTask(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/qmgc-student/task/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function listQmgcScores(studentId: number) {
const res = await request.get<ApiResult<QmgcScore[]>>(
MODULES_API_URL + `/gxmu/qmgc-student/${studentId}/score`
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function saveQmgcScore(data: QmgcScore) {
const res = await request.post<ApiResult<QmgcScore>>(
MODULES_API_URL + '/gxmu/qmgc-student/score',
data
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
+102
View File
@@ -0,0 +1,102 @@
import type { PageParam, PageResult } from '@/api';
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 主题团课资源 */
export interface ThematicCourse {
id?: number;
title?: string;
type?: string;
sourceSite?: string;
sourceUrl?: string;
sourceKey?: string;
cover?: string;
summary?: string;
content?: string;
fileId?: number;
fileUrl?: string;
tags?: string;
heat?: number;
publishTime?: string;
status?: number;
lastSyncTime?: string;
createTime?: string;
}
export interface ThematicCourseParam extends PageParam {
type?: string;
tags?: string;
status?: number;
}
export const THEMATIC_TYPE_OPTIONS = [
{ label: '课件', value: 'courseware' },
{ label: '讲稿', value: 'script' },
{ label: '视频', value: 'video' },
{ label: '案例', value: 'case' },
{ label: '活动方案', value: 'activity' }
];
export async function pageThematicCourses(params: ThematicCourseParam) {
const res = await request.get<ApiResult<PageResult<ThematicCourse>>>(
MODULES_API_URL + '/gxmu/thematic-course/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function getThematicCourse(id: number) {
const res = await request.get<ApiResult<ThematicCourse>>(
MODULES_API_URL + '/gxmu/thematic-course/' + id
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
export async function addThematicCourse(data: ThematicCourse) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/thematic-course',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function updateThematicCourse(data: ThematicCourse) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/thematic-course',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function removeThematicCourse(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/thematic-course/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
export async function syncThematicCourses() {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/thematic-course/sync'
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
+136
View File
@@ -0,0 +1,136 @@
import type { PageParam, PageResult } from '@/api';
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 志愿服务时长记录 */
export interface VolunteerRecord {
id?: number;
userId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
classId?: number;
source?: string;
externalId?: string;
projectName?: string;
orgName?: string;
hours?: number;
serviceDate?: string;
serviceEndDate?: string;
content?: string;
proofFiles?: string;
status?: number;
reviewRemark?: string;
reviewerId?: number;
reviewTime?: string;
createTime?: string;
updateTime?: string;
}
export interface VolunteerRecordParam extends PageParam {
userId?: number;
studentNo?: string;
studentName?: string;
collegeId?: number;
classId?: number;
source?: string;
status?: number;
serviceDateStart?: string;
serviceDateEnd?: string;
backendAccess?: boolean;
}
/** 分页查询志愿时长 */
export async function pageVolunteerRecords(params: VolunteerRecordParam) {
const res = await request.get<ApiResult<PageResult<VolunteerRecord>>>(
MODULES_API_URL + '/gxmu/volunteer/page',
{ params }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 个人录入志愿时长 */
export async function submitVolunteerRecord(data: VolunteerRecord) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/volunteer/my',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 导入志愿时长 */
export async function importVolunteerRecord(data: VolunteerRecord) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/volunteer/import',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 审核志愿时长 */
export async function reviewVolunteerRecord(data: VolunteerRecord) {
const res = await request.put<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/volunteer/review',
data
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 删除志愿时长 */
export async function removeVolunteerRecord(id: number) {
const res = await request.delete<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/volunteer/' + id
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 我的累计志愿时长 */
export async function getMyVolunteerTotal(year?: number) {
const res = await request.get<ApiResult<number>>(
MODULES_API_URL + '/gxmu/volunteer/my/total',
{ params: { year } }
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 我的志愿时长年度汇总 */
export async function getMyVolunteerSummary() {
const res = await request.get<ApiResult<Record<string, any>>>(
MODULES_API_URL + '/gxmu/volunteer/my/summary'
);
if (res.data.code === 0) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 我的志愿项目分组统计 */
export async function getMyVolunteerProjectStats(year?: number) {
const res = await request.get<ApiResult<Record<string, any>[]>>(
MODULES_API_URL + '/gxmu/volunteer/my/project',
{ params: { year } }
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
+91
View File
@@ -0,0 +1,91 @@
import request from '@/utils/request';
import type { ApiResult } from '@/api';
import { MODULES_API_URL } from '@/config/setting';
/** 学分类警 */
export interface CreditWarning {
id?: number;
userId?: number;
category?: string;
requiredScore?: number;
earnedScore?: number;
gap?: number;
level?: string;
hitTime?: string;
notified?: number;
notifyMonth?: string;
studentName?: string;
studentNo?: string;
}
export interface CreditWarningParam {
userId?: number;
category?: string;
level?: string;
notified?: number;
backendAccess?: boolean;
}
export const WARNING_LEVEL_OPTIONS = [
{ label: '正常', value: 'normal' },
{ label: '注意', value: 'warn' },
{ label: '严重', value: 'danger' }
];
/** 查询预警列表 */
export async function listCreditWarnings(params: CreditWarningParam) {
const res = await request.get<ApiResult<CreditWarning[]>>(
MODULES_API_URL + '/gxmu/credit-warning',
{ params }
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 预警汇总 */
export async function getCreditWarningSummary() {
const res = await request.get<ApiResult<Record<string, any>>>(
MODULES_API_URL + '/gxmu/credit-warning/summary'
);
if (res.data.code === 0 && res.data.data) {
return res.data.data;
}
return Promise.reject(new Error(res.data.message));
}
/** 重算我的预警 */
export async function recalcMyWarnings() {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit-warning/my/recalculate'
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 全量重算 */
export async function recalcAllWarnings() {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit-warning/recalculate'
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}
/** 发送预警提醒 */
export async function notifyCreditWarning(userId?: number) {
const res = await request.post<ApiResult<unknown>>(
MODULES_API_URL + '/gxmu/credit-warning/notify',
null,
{ params: { userId } }
);
if (res.data.code === 0) {
return res.data.message;
}
return Promise.reject(new Error(res.data.message));
}