From 431f24418af0bea53aac2890a1e3f8d208f43514 Mon Sep 17 00:00:00 2001 From: Yu <3037769318@qq.com> Date: Tue, 31 Mar 2026 16:47:23 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E8=A7=92=E8=89=B2=E7=9A=84?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E5=92=8C=E4=BA=8C=E7=BB=B4=E7=A0=81=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TeacherServiceImpl.java | 2 +- .../mdd/common/service/EnrollmentService.java | 47 +++++--- .../enrollment/EnrollmentController.java | 8 +- .../front/service/impl/LoginServiceImpl.java | 23 ++++ .../front/service/impl/UserServiceImpl.java | 16 +++ .../com/mdd/front/vo/login/LoginTokenVo.java | 3 + .../com/mdd/front/vo/user/UserCenterVo.java | 2 + uniapp/src/api/app.ts | 8 +- uniapp/src/components/tabbar/tabbar.vue | 55 ++++----- uniapp/src/config/index.ts | 18 +-- uniapp/src/pages.json | 17 --- uniapp/src/pages/index/index.vue | 106 +++++++++++++++--- uniapp/src/pages/login/login.vue | 28 +++-- .../pages/my_recruitment/my_recruitment.vue | 2 +- uniapp/src/pages/payment/payment.vue | 8 -- .../pre_registration/pre_registration.vue | 34 +++++- uniapp/src/pages/user/user.vue | 14 ++- uniapp/src/stores/user.ts | 16 ++- uniapp/src/utils/tabbarUtils.ts | 49 -------- uniapp/src/utils/util.ts | 1 - uniapp/vite.config.ts | 33 +++--- 21 files changed, 299 insertions(+), 191 deletions(-) diff --git a/server/like-admin/src/main/java/com/mdd/admin/service/impl/TeacherServiceImpl.java b/server/like-admin/src/main/java/com/mdd/admin/service/impl/TeacherServiceImpl.java index 7d68cd8a..0b5e8158 100644 --- a/server/like-admin/src/main/java/com/mdd/admin/service/impl/TeacherServiceImpl.java +++ b/server/like-admin/src/main/java/com/mdd/admin/service/impl/TeacherServiceImpl.java @@ -418,7 +418,7 @@ public class TeacherServiceImpl implements ITeacherService { * @return 小程序页面路径 */ private String buildMiniProgramPagePath() { - return "pages/pre_registration/pre_registration"; + return "pages/index/index"; } /** diff --git a/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java b/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java index 9035979d..cbd23e3f 100644 --- a/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java +++ b/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java @@ -179,35 +179,44 @@ public class EnrollmentService { *

- 本周招生数量 *

- 本月招生数量 * 招生数量定义:student_status = 0 或 1 的学生数量 + * + * @param teacherId 招生老师 ID(为空则统计所有老师) */ - public Map buildEnrollmentStats() { + public Map buildEnrollmentStats(Integer teacherId) { Map stats = new LinkedHashMap<>(); // 当前时间 Date now = new Date(); stats.put("time", new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now)); - // 总招生数量(所有时间) - long totalCount = studentInfoMapper.selectCount( + // 构建查询条件 + com.baomidou.mybatisplus.core.conditions.query.QueryWrapper queryWrapper = new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper() .in("student_status", 0, 1) - .isNull("delete_time") - ); + .isNull("delete_time"); + + // 如果指定了老师 ID,则只统计该老师的数据 + if (teacherId != null) { + queryWrapper.eq("recruitment_teacher_id", teacherId); + } + + // 总招生数量(所有时间) + long totalCount = studentInfoMapper.selectCount(queryWrapper); // 今日、本周、本月时间范围 LocalDate today = LocalDate.now(); Date todayStart = toDate(today.atStartOfDay()); Date tomorrowStart = toDate(today.plusDays(1).atStartOfDay()); - LocalDate weekStartDate = today.minusDays(6); // 最近7天 + LocalDate weekStartDate = today.minusDays(6); // 最近 7 天 Date weekStart = toDate(weekStartDate.atStartOfDay()); - LocalDate monthStartDate = today.minusDays(29); // 最近30天 + LocalDate monthStartDate = today.minusDays(29); // 最近 30 天 Date monthStart = toDate(monthStartDate.atStartOfDay()); - long todayCount = countEnrollmentInRange(todayStart, tomorrowStart); - long weekCount = countEnrollmentInRange(weekStart, tomorrowStart); - long monthCount = countEnrollmentInRange(monthStart, tomorrowStart); + long todayCount = countEnrollmentInRange(teacherId, todayStart, tomorrowStart); + long weekCount = countEnrollmentInRange(teacherId, weekStart, tomorrowStart); + long monthCount = countEnrollmentInRange(teacherId, monthStart, tomorrowStart); stats.put("total_enroll_count", totalCount); stats.put("today_enroll_count", todayCount); @@ -340,16 +349,26 @@ public class EnrollmentService { /** * 计算时间区间内的招生数量(按 pre_registration_time 筛选) + * + * @param teacherId 招生老师 ID(为空则统计所有老师) + * @param startTime 开始时间 + * @param endTime 结束时间 */ - private long countEnrollmentInRange(Date startTime, Date endTime) { - return studentInfoMapper.selectCount( + private long countEnrollmentInRange(Integer teacherId, Date startTime, Date endTime) { + com.baomidou.mybatisplus.core.conditions.query.QueryWrapper queryWrapper = new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper() .in("student_status", 0, 1) .isNull("delete_time") .isNotNull("pre_registration_time") .ge("pre_registration_time", startTime) - .lt("pre_registration_time", endTime) - ); + .lt("pre_registration_time", endTime); + + // 如果指定了老师 ID,则只统计该老师的数据 + if (teacherId != null) { + queryWrapper.eq("recruitment_teacher_id", teacherId); + } + + return studentInfoMapper.selectCount(queryWrapper); } public Map getAliyunUrl() { diff --git a/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java b/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java index 0a3be381..e8c1a9a6 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java @@ -56,8 +56,12 @@ public class EnrollmentController { @PostMapping("/enrollmentStatistical") @ApiOperation(value = "招生统计数据") - public AjaxResult> buildEnrollmentStatistical() { - return AjaxResult.success(enrollmentService.buildEnrollmentStats()); + public AjaxResult> buildEnrollmentStatistical(@RequestBody(required = false) Map params) { + Integer teacherId = null; + if (params != null && params.get("teacherId") != null) { + teacherId = Integer.parseInt(params.get("teacherId").toString()); + } + return AjaxResult.success(enrollmentService.buildEnrollmentStats(teacherId)); } @GetMapping("/enrollmentTrend") diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java index 3d7c1aab..c9231d03 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java @@ -7,6 +7,7 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.mdd.common.entity.Teacher; import com.mdd.common.entity.user.User; import com.mdd.common.entity.user.UserAuth; import com.mdd.common.entity.user.UserSession; @@ -16,6 +17,7 @@ import com.mdd.common.exception.OperateException; import com.mdd.common.mapper.user.UserAuthMapper; import com.mdd.common.mapper.user.UserMapper; import com.mdd.common.mapper.user.UserSessionMapper; +import com.mdd.common.mapper.TeacherMapper; import com.mdd.common.plugin.notice.NoticeCheck; import com.mdd.common.plugin.wechat.WxMnpDriver; import com.mdd.common.service.RegisterService; @@ -56,6 +58,8 @@ public class LoginServiceImpl implements ILoginService { UserAuthMapper userAuthMapper; @Resource UserSessionMapper userSessionMapper; + @Resource + TeacherMapper teacherMapper; /** * 注册账号 @@ -458,6 +462,25 @@ public class LoginServiceImpl implements ILoginService { vo.setIsNew(isNew); vo.setMobile(mobile); + User currentUser = userMapper.selectOne(new QueryWrapper() + .select("id,account") + .eq("id", userId) + .isNull("delete_time") + .last("limit 1")); + if (currentUser != null && StringUtils.isNotEmpty(currentUser.getAccount())) { + Teacher teacher = teacherMapper.selectOne(new QueryWrapper() + .eq("teacher_code", currentUser.getAccount()) + .isNull("delete_time") + .last("limit 1")); + if (teacher != null) { + vo.setUserType(1); + } else { + vo.setUserType(0); + } + } else { + vo.setUserType(0); + } + //保存登录信息到session userSessionMapper.delete(new QueryWrapper().eq("user_id", userId).eq("terminal", terminal)); diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java index 6bdfb362..f47ac972 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java @@ -7,6 +7,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mdd.common.config.GlobalConfig; +import com.mdd.common.entity.Teacher; import com.mdd.common.entity.user.User; import com.mdd.common.entity.user.UserAuth; import com.mdd.common.enums.ClientEnum; @@ -15,6 +16,7 @@ import com.mdd.common.enums.UserEnum; import com.mdd.common.exception.OperateException; import com.mdd.common.mapper.user.UserAuthMapper; import com.mdd.common.mapper.user.UserMapper; +import com.mdd.common.mapper.TeacherMapper; import com.mdd.common.plugin.notice.NoticeCheck; import com.mdd.common.plugin.wechat.WxMnpDriver; import com.mdd.common.util.*; @@ -46,6 +48,9 @@ public class UserServiceImpl implements IUserService { @Resource UserAuthMapper userAuthMapper; + @Resource + TeacherMapper teacherMapper; + /** * 个人中心 * @@ -83,6 +88,17 @@ public class UserServiceImpl implements IUserService { vo.setHasPassword(StringUtils.isNotBlank(user.getPassword())); vo.setCreateTime(TimeUtils.timestampToDate(user.getCreateTime())); vo.setSex(UserEnum.getSexDesc(user.getSex())); + + if (StringUtils.isNotEmpty(user.getAccount())) { + Teacher teacher = teacherMapper.selectOne(new QueryWrapper() + .eq("teacher_code", user.getAccount()) + .isNull("delete_time") + .last("limit 1")); + vo.setUserType(teacher != null ? 1 : 0); + } else { + vo.setUserType(0); + } + return vo; } diff --git a/server/like-front/src/main/java/com/mdd/front/vo/login/LoginTokenVo.java b/server/like-front/src/main/java/com/mdd/front/vo/login/LoginTokenVo.java index 9a078b72..bfd84585 100644 --- a/server/like-front/src/main/java/com/mdd/front/vo/login/LoginTokenVo.java +++ b/server/like-front/src/main/java/com/mdd/front/vo/login/LoginTokenVo.java @@ -27,4 +27,7 @@ public class LoginTokenVo implements Serializable { @ApiModelProperty(value = "是否为新用户") private Integer isNew; + @ApiModelProperty(value = "用户类型: 0=学生, 1=招生老师") + private Integer userType; + } diff --git a/server/like-front/src/main/java/com/mdd/front/vo/user/UserCenterVo.java b/server/like-front/src/main/java/com/mdd/front/vo/user/UserCenterVo.java index 19362b08..ef164d19 100644 --- a/server/like-front/src/main/java/com/mdd/front/vo/user/UserCenterVo.java +++ b/server/like-front/src/main/java/com/mdd/front/vo/user/UserCenterVo.java @@ -51,5 +51,7 @@ public class UserCenterVo implements Serializable { @ApiModelProperty("是否绑定微信") private Boolean isAuth; + @ApiModelProperty(value = "用户类型: 0=学生, 1=招生老师") + private Integer userType; } diff --git a/uniapp/src/api/app.ts b/uniapp/src/api/app.ts index d0457841..77c55839 100644 --- a/uniapp/src/api/app.ts +++ b/uniapp/src/api/app.ts @@ -70,9 +70,13 @@ export function getRecruitmentList(data: any) { } // 获取招生统计数据(总招生人数、本日、本周、本月) -export function getEnrollmentStatistical() { +export function getEnrollmentStatistical(teacherId?: number) { + const data: any = {} + if (teacherId !== undefined && teacherId !== null) { + data.teacherId = teacherId + } return request.post( - { url: 'frontapi/enrollment/enrollmentStatistical' }, + { url: 'frontapi/enrollment/enrollmentStatistical', data }, { urlPrefix: '' } ) } diff --git a/uniapp/src/components/tabbar/tabbar.vue b/uniapp/src/components/tabbar/tabbar.vue index 118b143d..4e5eceb2 100644 --- a/uniapp/src/components/tabbar/tabbar.vue +++ b/uniapp/src/components/tabbar/tabbar.vue @@ -1,6 +1,5 @@ diff --git a/uniapp/src/pages/login/login.vue b/uniapp/src/pages/login/login.vue index ab08757c..db287565 100644 --- a/uniapp/src/pages/login/login.vue +++ b/uniapp/src/pages/login/login.vue @@ -376,13 +376,26 @@ const loginHandle = async (data: any) => { uni.hideLoading() return } - userStore.login(data.token) + console.log('登录返回数据:', data) + console.log('登录返回userType:', data.user_type) + userStore.login(data.token, data.user_type) console.log('登录后token:', userStore.token) + console.log('登录后userType:', userStore.userType) + console.log('登录后isTeacher:', userStore.isTeacher) await userStore.getUser() console.log('获取用户信息后userInfo:', userStore.userInfo) + console.log('获取用户信息后userType:', userStore.userType) + console.log('获取用户信息后isTeacher:', userStore.isTeacher) console.log('登录状态:', userStore.isLogin) uni.$u.toast('登录成功') uni.hideLoading() + const invitationCode = cache.get('INVITATION_CODE') + if (invitationCode) { + cache.remove('INVITATION_CODE') + router.reLaunch(`/pages/pre_registration/pre_registration?invitationCode=${invitationCode}`) + cache.remove(BACK_URL) + return + } const pages = getCurrentPages() if (pages.length > 1) { const prevPage = pages[pages.length - 2] @@ -393,16 +406,12 @@ const loginHandle = async (data: any) => { onLoad && onLoad(options) } else if (cache.get(BACK_URL)) { try { - router.switchTab(cache.get(BACK_URL)) + router.reLaunch(cache.get(BACK_URL)) } catch (error) { router.redirectTo(cache.get(BACK_URL)) } } else { - // try { - // router.reLaunch('/pages/index/index') - // } catch (error) { - router.switchTab('/pages/index/index') - //} + router.reLaunch('/pages/index/index') } cache.remove(BACK_URL) } @@ -496,7 +505,10 @@ const removeWxQuery = () => { } } -onLoad(async () => { +onLoad(async (pageOptions: any) => { + if (pageOptions.invitationCode) { + cache.set('INVITATION_CODE', pageOptions.invitationCode) + } //#ifdef H5 const options = wechatOa.getAuthData() try { diff --git a/uniapp/src/pages/my_recruitment/my_recruitment.vue b/uniapp/src/pages/my_recruitment/my_recruitment.vue index 2d32b6a1..fbccba9c 100644 --- a/uniapp/src/pages/my_recruitment/my_recruitment.vue +++ b/uniapp/src/pages/my_recruitment/my_recruitment.vue @@ -50,7 +50,7 @@ {{ item.name }} {{ item.gender === 1 ? '男' : item.gender === 2 ? '女' : '-' }} {{ item.highSchoolScore || '-' }} - {{ item.majorName || '-' }} + {{ item.major_name || '-' }} {{ item.studentStatus === 1 ? '已报名' : '预报名' }} diff --git a/uniapp/src/pages/payment/payment.vue b/uniapp/src/pages/payment/payment.vue index 2bb7b231..ec9fe93f 100644 --- a/uniapp/src/pages/payment/payment.vue +++ b/uniapp/src/pages/payment/payment.vue @@ -1,13 +1,5 @@ @@ -305,11 +306,12 @@ const getQrcode = async (teacherId?: number) => { console.log('=== getQrcode 执行结束 ===') } -const getStats = async () => { +const getStats = async (teacherId?: number) => { console.log('=== getStats 开始执行 ===') + console.log('传入的 teacherId:', teacherId) try { - console.log('正在调用 getEnrollmentStatistical...') - const res = await getEnrollmentStatistical() + console.log('正在调用 getEnrollmentStatistical, teacherId:', teacherId) + const res = await getEnrollmentStatistical(teacherId) console.log('接口返回结果:', res) // 接口直接返回数据对象,没有 code 包装 if (res && res.total_enroll_count !== undefined) { @@ -437,7 +439,7 @@ const logout = () => { success: (res) => { if (res.confirm) { userStore.logout() - uni.switchTab({ + uni.reLaunch({ url: '/pages/index/index' }) uni.$u.toast('已退出登录') @@ -495,9 +497,9 @@ onShow(async () => { console.log('开始调用 getQrcode 和 getStats, teacherIdForQrcode:', teacherIdForQrcode) console.log('userInfo 中的 teacherId:', userInfo.value?.teacherId) - // 使用本地变量传递teacherId,避免响应式延迟问题 + // 使用本地变量传递 teacherId,避免响应式延迟问题 await getQrcode(teacherIdForQrcode) - await getStats() + await getStats(teacherIdForQrcode) } else { console.log('条件不满足,跳过数据获取') console.log('isLogin:', isLogin.value) diff --git a/uniapp/src/stores/user.ts b/uniapp/src/stores/user.ts index 1d969391..dc8190f4 100644 --- a/uniapp/src/stores/user.ts +++ b/uniapp/src/stores/user.ts @@ -8,16 +8,19 @@ interface UserSate { userInfo: Record token: string | null temToken: string | null + userType: number } export const useUserStore = defineStore({ id: 'userStore', state: (): UserSate => ({ userInfo: {}, token: cache.get(TOKEN_KEY) || null, - temToken: null + temToken: null, + userType: 0 }), getters: { - isLogin: (state) => !!state.token + isLogin: (state) => !!state.token, + isTeacher: (state) => state.userType === 1 }, actions: { async getUser() { @@ -32,14 +35,20 @@ export const useUserStore = defineStore({ try { const data = await getUserCenter() this.userInfo = data + if (data.user_type !== undefined && data.user_type !== null) { + this.userType = data.user_type + } resetSession() } catch (error) { console.error('获取用户信息失败:', error) } }, - login(token: string) { + login(token: string, userType?: number) { console.log('保存token:', token) this.token = token + if (userType !== undefined && userType !== null) { + this.userType = userType + } cache.set(TOKEN_KEY, token) console.log('保存后从cache读取token:', cache.get(TOKEN_KEY)) resetSession() @@ -47,6 +56,7 @@ export const useUserStore = defineStore({ logout() { this.token = '' this.userInfo = {} + this.userType = 0 cache.remove(TOKEN_KEY) } } diff --git a/uniapp/src/utils/tabbarUtils.ts b/uniapp/src/utils/tabbarUtils.ts index d389af7b..1db54aec 100644 --- a/uniapp/src/utils/tabbarUtils.ts +++ b/uniapp/src/utils/tabbarUtils.ts @@ -6,54 +6,5 @@ import { getTabBarIconPath } from './configUtils' import { ensureStorageConfig } from './configUtils' -/** - * 动态设置tabbar图标 - * @param index tabbar索引 - * @param iconType 图标类型 - * @param isActive 是否为选中状态 - */ -export function setTabBarIcon(index: number, iconType: 'home' | 'user', isActive: boolean = false) { - try { - // 获取阿里云图标路径 - const iconPath = getTabBarIconPath(iconType, isActive) - - // 设置tabbar图标 - if (isActive) { - uni.setTabBarItem({ - index, - selectedIconPath: iconPath - }) - } else { - uni.setTabBarItem({ - index, - iconPath - }) - } - } catch (error) { - console.error(`设置tabbar图标失败:`, error) - } -} - -/** - * 更新所有tabbar图标 - */ -export function updateAllTabBarIcons() { - // 更新首页tabbar图标 (索引0) - setTabBarIcon(0, 'home', false) - setTabBarIcon(0, 'home', true) - - // 更新个人中心tabbar图标 (索引1) - setTabBarIcon(1, 'user', false) - setTabBarIcon(1, 'user', true) -} - -/** - * 初始化tabbar图标 - */ export function initTabBarIcons() { - // 延迟执行,确保配置已加载 - setTimeout(async () => { - await ensureStorageConfig() - updateAllTabBarIcons() - }, 1000) } diff --git a/uniapp/src/utils/util.ts b/uniapp/src/utils/util.ts index 10e51192..570def1a 100644 --- a/uniapp/src/utils/util.ts +++ b/uniapp/src/utils/util.ts @@ -66,7 +66,6 @@ export function navigateTo( const url = link?.query ? `${link.path}?${objectToQuery(link?.query)}` : link.path - ;(navigateType == 'switchTab' || link.canTab) && uni.switchTab({ url }) navigateType == 'navigateTo' && uni.navigateTo({ url }) navigateType == 'reLaunch' && uni.reLaunch({ url }) } diff --git a/uniapp/vite.config.ts b/uniapp/vite.config.ts index 13387a15..74bdf037 100644 --- a/uniapp/vite.config.ts +++ b/uniapp/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vite' +import { defineConfig, loadEnv } from 'vite' import uni from '@dcloudio/vite-plugin-uni' import tailwindcss from 'tailwindcss' import autoprefixer from 'autoprefixer' @@ -24,26 +24,19 @@ if (!weappTailwindcssDisabled) { } // https://vitejs.dev/config/ -export default defineConfig({ - plugins: [uni(), uniRouter(), weappTailwindcssDisabled ? undefined : vwt()], - css: { - postcss: { - plugins: postcssPlugin - } - }, - server: { - port: 8991, - proxy: { - '/frontapi': { - target: 'http://192.168.123.91:8084', - changeOrigin: true, - rewrite: (path) => path.replace(/^\/frontapi/, '/frontapi') - }, - '/adminapi': { - target: 'http://192.168.123.91:8084', - changeOrigin: true, - rewrite: (path) => path.replace(/^\/adminapi/, '/adminapi') +export default defineConfig(({ mode }) => { + // 加载环境变量,支持 .env, .env.local, .env.development, .env.production + const env = loadEnv(mode, process.cwd()) + + return { + plugins: [uni(), uniRouter(), weappTailwindcssDisabled ? undefined : vwt()], + css: { + postcss: { + plugins: postcssPlugin } + }, + server: { + port: 8991 } } })