Переглянути джерело

小程序兼容做题页面

shmily1213 1 місяць тому
батько
коміт
2c776dc64e
64 змінених файлів з 691 додано та 3546 видалено
  1. 11 1
      src/App.vue
  2. 0 61
      src/api/dict/data.js
  3. 0 69
      src/api/dict/type.js
  4. 0 177
      src/api/login.js
  5. 0 186
      src/api/system/user.js
  6. 0 266
      src/api/webApi/career-course.js
  7. 0 83
      src/api/webApi/career-news.js
  8. 0 171
      src/api/webApi/career-other.js
  9. 0 291
      src/api/webApi/collegemajor.js
  10. 0 284
      src/api/webApi/front.js
  11. 0 81
      src/api/webApi/ie-voluntary.js
  12. 0 10
      src/api/webApi/knowledge.js
  13. 0 34
      src/api/webApi/mental-health.js
  14. 0 61
      src/api/webApi/paper.js
  15. 0 81
      src/api/webApi/resources.js
  16. 0 99
      src/api/webApi/studentEvaluating.js
  17. 0 58
      src/api/webApi/subject.js
  18. 0 146
      src/api/webApi/volunteer.js
  19. 0 749
      src/api/webApi/webQue.js
  20. 0 156
      src/api/webApi/webVideo.js
  21. 19 0
      src/components/ie-empty/ie-empty.vue
  22. 18 2
      src/components/ie-navbar/ie-navbar.vue
  23. 8 1
      src/components/ie-page/ie-page.vue
  24. 1 1
      src/components/ie-popup/ie-popup.vue
  25. 6 1
      src/components/ie-safe-toolbar/ie-safe-toolbar.vue
  26. 4 3
      src/components/ie-table/ie-table.vue
  27. 0 3
      src/composables/useCalendar.ts
  28. 71 10
      src/composables/useExam.ts
  29. 1 1
      src/main.ts
  30. 2 1
      src/pages.json
  31. 1 1
      src/pagesStudy/components/knowledge-table.vue
  32. 3 8
      src/pagesStudy/components/knowledge-tree-node.vue
  33. 2 6
      src/pagesStudy/components/knowledge-tree.vue
  34. 72 68
      src/pagesStudy/components/practice-table.vue
  35. 1 1
      src/pagesStudy/components/video-table.vue
  36. 2 2
      src/pagesStudy/pages/exam-start/components/exam-navbar.vue
  37. 10 1
      src/pagesStudy/pages/exam-start/components/exam-swiper.vue
  38. 7 1
      src/pagesStudy/pages/exam-start/components/exam-toolbar.vue
  39. 27 41
      src/pagesStudy/pages/exam-start/components/question-correct-popup.vue
  40. 2 2
      src/pagesStudy/pages/exam-start/components/question-swiper-tip.vue
  41. 17 6
      src/pagesStudy/pages/exam-start/exam-start.vue
  42. 53 51
      src/pagesStudy/pages/index/index.vue
  43. 3 3
      src/pagesStudy/pages/knowledge-practice-detail/knowledge-practice-detail.vue
  44. 3 2
      src/pagesStudy/pages/knowledge-practice-history/knowledge-practice-history.vue
  45. 1 1
      src/pagesStudy/pages/knowledge-practice/knowledge-practice.vue
  46. 6 3
      src/pagesStudy/pages/simulation-analysis/simulation-analysis.vue
  47. 28 20
      src/pagesStudy/pages/study-history/components/exam-history-student.vue
  48. 6 1
      src/pagesStudy/pages/study-history/components/exam-history.vue
  49. 1 3
      src/pagesStudy/pages/study-history/components/knowledge-history-student.vue
  50. 5 0
      src/pagesStudy/pages/study-history/components/knowledge-history.vue
  51. 5 0
      src/pagesStudy/pages/study-history/components/practice-history.vue
  52. 5 0
      src/pagesStudy/pages/study-history/components/video-history.vue
  53. 2 2
      src/pagesStudy/pages/study-history/study-history.vue
  54. BIN
      src/pagesStudy/static/image/icon-drag.png
  55. BIN
      src/pagesStudy/static/image/icon-more.png
  56. BIN
      src/pagesStudy/static/image/icon-setting.png
  57. 8 3
      src/pagesSystem/pages/login/login.vue
  58. BIN
      src/static/image/icon-empty.png
  59. 61 48
      src/static/theme/theme.module.scss
  60. 1 74
      src/static/theme/var.scss
  61. 35 1
      src/uni.scss
  62. 94 30
      src/uni_modules/fast-guide/components/fast-guide/fast-guide.vue
  63. 13 0
      src/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue
  64. 76 80
      tailwind.config.js

+ 11 - 1
src/App.vue

@@ -17,6 +17,16 @@ export default {
 
 <style lang="scss">
 /*每个页面公共css */
-/* @import "@/uni_modules/uv-ui-tools/index.scss"; */
 @import '@/static/theme/theme.module.scss';
+
+::-webkit-scrollbar {
+  width: 0 !important;
+  height: 0 !important;
+  color: transparent !important;
+  display: none !important;
+}
+
+image {
+  will-change: transform, width, height;
+}
 </style>

+ 0 - 61
src/api/dict/data.js

@@ -1,61 +0,0 @@
-import request from '@/utils/request'
-
-// 查询字典数据列表
-export function listData(query) {
-  return request({
-    url: '/system/dict/data/list',
-    method: 'get',
-    params: query
-  })
-}
-
-// 查询字典数据详细
-export function getData(dictCode) {
-  return request({
-    url: '/system/dict/data/' + dictCode,
-    method: 'get'
-  })
-}
-
-// 根据字典类型查询字典数据信息
-export function getDicts(dictType) {
-  return request({
-    url: '/system/dict/data/type/' + dictType,
-    method: 'get'
-  })
-}
-
-// 新增字典数据
-export function addData(data) {
-  return request({
-    url: '/system/dict/data',
-    method: 'post',
-    data: data
-  })
-}
-
-// 修改字典数据
-export function updateData(data) {
-  return request({
-    url: '/system/dict/data',
-    method: 'put',
-    data: data
-  })
-}
-
-// 删除字典数据
-export function delData(dictCode) {
-  return request({
-    url: '/system/dict/data/' + dictCode,
-    method: 'delete'
-  })
-}
-
-// 导出字典数据
-export function exportData(query) {
-  return request({
-    url: '/system/dict/data/export',
-    method: 'get',
-    params: query
-  })
-}

+ 0 - 69
src/api/dict/type.js

@@ -1,69 +0,0 @@
-import request from '@/utils/request'
-
-// 查询字典类型列表
-export function listType(query) {
-  return request({
-    url: '/system/dict/type/list',
-    method: 'get',
-    params: query
-  })
-}
-
-// 查询字典类型详细
-export function getType(dictId) {
-  return request({
-    url: '/system/dict/type/' + dictId,
-    method: 'get'
-  })
-}
-
-// 新增字典类型
-export function addType(data) {
-  return request({
-    url: '/system/dict/type',
-    method: 'post',
-    data: data
-  })
-}
-
-// 修改字典类型
-export function updateType(data) {
-  return request({
-    url: '/system/dict/type',
-    method: 'put',
-    data: data
-  })
-}
-
-// 删除字典类型
-export function delType(dictId) {
-  return request({
-    url: '/system/dict/type/' + dictId,
-    method: 'delete'
-  })
-}
-
-// 清理参数缓存
-export function clearCache() {
-  return request({
-    url: '/system/dict/type/clearCache',
-    method: 'delete'
-  })
-}
-
-// 导出字典类型
-export function exportType(query) {
-  return request({
-    url: '/system/dict/type/export',
-    method: 'get',
-    params: query
-  })
-}
-
-// 获取字典选择框列表
-export function optionselect() {
-  return request({
-    url: '/system/dict/type/optionselect',
-    method: 'get'
-  })
-}

+ 0 - 177
src/api/login.js

@@ -1,177 +0,0 @@
-import request from '@/utils/request'
-
-// 登录方法
-export function login(data) {
-    return request({
-        url: '/login?type=frontApp',
-        method: 'post',
-        data: data
-    })
-}
-
-// 获取用户详细信息
-export function getInfo() {
-    return request({
-        url: '/getInfo',
-        method: 'get'
-    })
-}
-
-// 退出方法
-export function logout() {
-    return request({
-        url: '/logout',
-        method: 'post'
-    })
-}
-
-export function logoutPhysical() {
-    return request({
-        url: '/logoutPhysical',
-        method: 'post'
-    })
-}
-
-// 获取验证码
-export function getCodeImg(params) {
-    return request({
-        url: '/captchaImage',
-        method: 'get',
-        params: params
-    })
-}
-
-// 短信验证码
-export function sendSms(params) {
-    return request({
-        url: '/common/shortMessage/sendSms',
-        method: 'post',
-        params: params,
-        custom: {autoFitNoToken: true}
-    })
-}
-
-// 验证码校验
-export function validateSms(params) {
-    return request({
-        url: '/common/shortMessage/validateSms',
-        method: 'post',
-        params: params,
-        custom: {withoutToken: true}
-    })
-}
-
-// 验证码校验
-export function improveUserInfo(params) {
-    return request({
-        url: '/improve',
-        method: 'post',
-        data: params
-    })
-}
-
-export function getAreaAndSchool(params) {
-    return request({
-        url: '/getAreaAndSchool',
-        method: 'get',
-        params
-    })
-}
-
-export function getAreaSchoolTree(params) {
-    return request({
-        url: '/getAreaSchoolTree',
-        method: 'get',
-        params
-    })
-}
-
-export function getRegisterGaokaoYears(params) {
-    return request({
-        url: '/getRegisterGaokaoYears',
-        method: 'get',
-        params
-    })
-}
-
-export function sendSmsNoValidation(params) {
-    return request({
-        url: '/common/shortMessage/sendSmsNoValidation',
-        method: 'get',
-        data: params,
-        custom: {autoFitNoToken: true}
-    })
-}
-
-export function sendSmsNoValidationNoToken(params) {
-    return request({
-        url: '/common/shortMessage/sendSmsNoValidationNoToken',
-        method: 'get',
-        params,
-        custom: {withoutToken: true}
-    })
-}
-
-export function resetCardPassword(params) {
-    return request({
-        url: '/resetCardPassword',
-        method: 'post',
-        params: params
-    })
-}
-
-// 切换角色 changeRole?newRoleId=12
-export function changeRole(roleId) {
-    return request({
-        url: '/changeRole?newRoleId=' + roleId,
-        method: 'post'
-    })
-}
-
-// 注册
-export function register(data) {
-    return request({
-        url: '/register',
-        method: 'post',
-        data
-    })
-}
-
-// 绑卡
-export function bindCard(data) {
-    return request({
-        url: '/bindCard',
-        method: 'post',
-        data
-    })
-}
-
-// 绑手机
-export function bindPhone(data) {
-    return request({
-        url: '/bindPhone',
-        method: 'post',
-        data
-    })
-}
-
-/// 考生类别
-export function getExamTypes(params) {
-    return request({
-        // url: '/getExamTypes',
-        url: '/front/comm/dict/exam_type',
-        method: 'get',
-        params,
-        custom: {autoFitNoToken: true}
-    })
-}
-
-/// 考生专业 - 职高对口
-export function getExamMajors(params) {
-    return request({
-        url: '/getExamMajors',
-        method: 'get',
-        params,
-        custom: {autoFitNoToken: true}
-    })
-}

+ 0 - 186
src/api/system/user.js

@@ -1,186 +0,0 @@
-import request from '@/utils/request'
-
-// 查询用户列表
-export function listUser(query) {
-    return request({
-        url: '/system/user/list',
-        method: 'get',
-        params: query
-    })
-}
-
-// 查询用户详细
-export function getUser(userId) {
-    let safeId = userId || ''
-    return request({
-        url: '/system/user/' + safeId,
-        method: 'get'
-    })
-}
-
-// 新增用户
-export function addUser(data) {
-    return request({
-        url: '/system/user',
-        method: 'post',
-        data: data
-    })
-}
-
-// 修改用户
-export function updateUser(data) {
-    return request({
-        url: '/system/user',
-        method: 'put',
-        data: data
-    })
-}
-
-// 删除用户
-export function delUser(userId) {
-    return request({
-        url: '/system/user/' + userId,
-        method: 'delete'
-    })
-}
-
-// 导出用户
-export function exportUser(query) {
-    return request({
-        url: '/system/user/export',
-        method: 'get',
-        params: query
-    })
-}
-
-// 用户密码重置
-export function resetUserPwd(userId, password) {
-    const data = {
-        userId,
-        password
-    }
-    return request({
-        url: '/system/user/resetPwd',
-        method: 'put',
-        data: data
-    })
-}
-
-// 用户状态修改
-export function changeUserStatus(userId, status) {
-    const data = {
-        userId,
-        status
-    }
-    return request({
-        url: '/system/user/changeStatus',
-        method: 'put',
-        data: data
-    })
-}
-
-// 查询用户个人信息
-// http://localhost/dev-api/back/busiSchools/list?agentcode=456dcef18ce3f2903e22412f0d1f9725&pageNum=1&pageSize=100
-export function getUserInfoByAgentcode(params) {
-    return request({
-        url: '/front/busiSchools/list',
-        method: 'get',
-        params: params
-    })
-}
-
-// 查询用户个人信息
-export function getUserProfile() {
-    return request({
-        url: '/system/user/profile',
-        method: 'get'
-    })
-}
-
-// 修改用户个人信息
-export function updateUserProfile(data) {
-    return request({
-        url: '/system/user/profile',
-        method: 'put',
-        data: data
-    })
-}
-
-// 手机号变更
-export function updatePhonenumber(params) {
-    return request({
-        url: '/system/user/profile/updatePhonenumber',
-        method: 'get',
-        params
-    })
-}
-
-// 用户密码重置
-export function updateUserPwd(data) {
-    return request({
-        url: '/system/user/profile/updatePwd',
-        method: 'put',
-        params: data
-    })
-}
-
-// 用户头像上传
-export function uploadAvatar(data) {
-    return request({
-        url: '/system/user/profile/avatar',
-        method: 'post',
-        data: data
-    })
-}
-
-// 下载用户导入模板
-export function importTemplate() {
-    return request({
-        url: '/system/user/importTemplate',
-        method: 'get'
-    })
-}
-
-//
-export function getFrontInitialRouters() {
-    return request({
-        url: '/getFrontInitialRouters',
-        method: 'get'
-    })
-}
-
-export function getRouters() {
-    return request({
-        url: '/getRouters',
-        method: 'get'
-    })
-}
-
-export function createOrder(data) {
-    return request({
-        url: '/front/ecard/createOrder',
-        method: 'post',
-        data,
-        header: {
-            'Content-Type': 'application/x-www-form-urlencoded'
-        }
-    });
-}
-
-export function getCardPrice(data) {
-    return request({
-        url: '/front/ecard/getEcardPrices',
-        method: 'get',
-        params: data
-    });
-}
-
-// 查询支付结果
-export function queryOrder(data) {
-    return request({
-        url: '/front/ecard/queryOrder',
-        method: 'get',
-        params: data,
-        custom: {toast: false}
-    });
-}

+ 0 - 266
src/api/webApi/career-course.js

@@ -1,266 +0,0 @@
-import request from '@/utils/request'
-
-// 00 生涯课程类型
-export function getCareerVideoTypes(params) {
-    return request({
-        url: '/front/sykc/types',
-        autoFitNoToken: true,
-        method: 'get',
-        params: params
-    })
-}
-
-// 01 生涯课程列表
-export function getCareerVideoList(params) {
-    return request({
-        url: '/front/sykc/list',
-        autoFitNoToken: true,
-        method: 'get',
-        params: params
-    })
-}
-
-// 02 生涯课程详情
-export function info(params) {
-    return request({
-        url: '/front/sykc/info',
-        method: 'get',
-        params: params
-    })
-}
-
-/**
- * 查询院校列表数据筛选项
- */
-export function selectUniversity() {
-    return request({
-        url: `/front/university/filters`,
-        method: 'get'
-    })
-}
-
-/**
- * 查询院校列表数据筛选项
- */
-export function universityFilters() {
-    return request({
-        url: `/front/university/filters`,
-        method: 'get'
-    })
-}
-
-/**
- * 点击详情增加点击量
- */
-export function saveUniversitiesHits(params) {
-    return request({
-        url: `/front/university/saveUniversitiesHits`,
-        method: 'post',
-        params: params
-    })
-}
-
-/**
- * 院校列表
- */
-export function selectUniversityList(params) {
-    return request({
-        url: `/front/university/list`,
-        method: 'get',
-        autoFitNoToken: true,
-        params: params
-    })
-}
-
-/**
- * 查询院校详情
- */
-export function selectUniversityDetail(params) {
-    return request({
-        url: `/front/university/detail`,
-        method: 'get',
-        params: params
-    })
-}
-
-//  是否为新高考
-export function isNewCollegeExam(params) {
-    return request({
-        url: '/front/syzy/zytb/getUserIsUseNewCollegeEntranceExam',
-        method: 'get',
-        params: params
-    })
-}
-
-// 招生简章
-export function enrollBrochure(params) {
-    return request({
-        url: '/front/university/getUniversitiesEnrollBrochure',
-        method: 'get',
-        params: params
-    })
-}
-
-// 院校风采
-export function universitiesStyle(params) {
-    return request({
-        url: '/front/university/getUniversitiesStyle',
-        method: 'get',
-        params: params
-    })
-}
-
-// 保存招生简章热度/点击
-export function saveEnrollBrochureHits(params) {
-    return request({
-        url: '/front/university/saveUniversitiesEnrollBrochureHits',
-        method: 'post',
-        params: params
-    })
-}
-
-// 获取学科评估类型
-export function evaluateType(params) {
-    return request({
-        url: '/system/dict/data/type/subject_evaluate_type',
-        method: 'get',
-        params: params
-    })
-}
-
-// 排名筛选
-export function rankingFilter(params) {
-    return request({
-        url: '/front/university/getUniversitiesRankingFilter',
-        method: 'get',
-        params: params
-    })
-}
-
-// 排名列表
-export function universitiesRanking(params) {
-    return request({
-        url: '/front/university/getUniversitiesRanking',
-        autoFitNoToken: true,
-        method: 'get',
-        params: params
-    })
-}
-
-// 专业开设院校
-export function getUniversityByCode(params) {
-    return request({
-        url: '/front/major/getUniversityByCode',
-        method: 'get',
-        params: params
-    })
-}
-
-// 根据分数和科类获取位次
-export function getRankByScore(params) {
-    return request({
-        url: '/front/syzy/yfyd/getRankByScore',
-        method: 'get',
-        params: params
-    })
-}
-
-
-//  职业兴趣测评 01 测试步骤
-export function hollSteps(params) {
-    return request({
-        url: '/front/syzy/holland/steps',
-        method: 'get',
-        params: params
-    })
-}
-
-//  职业兴趣测评 02 步骤题目
-export function hollStepsQuestions(params) {
-    return request({
-        url: '/front/syzy/holland/questions',
-        method: 'get',
-        params: params
-    })
-}
-
-//  职业兴趣测评 03 保存测试
-export function hollSaveHolland(params) {
-    return request({
-        url: '/front/syzy/holland/save',
-        method: 'post',
-        data: params
-    })
-}
-
-//  职业兴趣测评 04 测评记录
-export function hollRecord(params) {
-    return request({
-        url: '/front/syzy/holland/record',
-        method: 'get',
-        params: params
-    })
-}
-
-//  职业兴趣测评 05 测评详情
-export function hollDetail(params) {
-    return request({
-        url: '/front/syzy/holland/record/detail',
-        method: 'get',
-        params: params
-    })
-}
-
-//  职业性格测评 01 测试步骤
-export function mbtiSteps(params) {
-    return request({
-        url: '/front/syzy/mbti/steps',
-        method: 'get',
-        params: params
-    })
-}
-
-//  职业性格测评 02 步骤题目
-export function mbtiStepsQuestions(params) {
-    return request({
-        url: '/front/syzy/mbti/questions',
-        method: 'get',
-        params: params
-    })
-}
-
-//  职业性格测评 03 保存测试
-export function mbtiSave(query) {
-    return request({
-        url: '/front/syzy/mbti/save',
-        method: 'post',
-        data: query
-    })
-}
-
-//  职业性格测评 04 测评记录
-export function mbtiRecord(params) {
-    return request({
-        url: '/front/syzy/mbti/record',
-        method: 'get',
-        params: params
-    })
-}
-
-//  职业性格测评 05 测评详情
-export function mbtiDetail(params) {
-    return request({
-        url: '/front/syzy/mbti/record/detail',
-        method: 'get',
-        params: params
-    })
-}
-
-// 推荐专业
-export function mbtiRecommendMajors(params) {
-    return request({
-        url: '/front/syzy/mbti/majors',
-        method: 'get',
-        params
-    })
-}

+ 0 - 83
src/api/webApi/career-news.js

@@ -1,83 +0,0 @@
-import request from '@/utils/request'
-
-// 00 生涯课程类型
-export function getNewsTypes(params) {
-  return request({
-    url: '/front/news/types',
-    method: 'get',
-    params: params,
-    custom: {autoFitNoToken: true}
-  })
-}
-
-// 单招-资讯分组-通关指南
-export function getMainList() {
-  return request({
-    url: '/front/news/getMainList',
-    method: 'get',
-    custom: {autoFitNoToken: true}
-  })
-}
-
-export function getNewsList(params) {
-  return request({
-    url: '/front/news/list',
-    method: 'get',
-    params: params,
-    custom: {autoFitNoToken: true}
-  })
-}
-
-// 02 生涯课程详情
-export function info(params) {
-  return request({
-    url: '/front/news/info',
-    method: 'get',
-    params: params
-  })
-}
-
-// 01 热门院校榜单
-export function universitiesTop(params) {
-  return request({
-    url: '/front/syzy/home/universities/top',
-    method: 'get',
-    params: params
-  })
-}
-
-// 02 热门专业榜单
-export function marjorsTop(params) {
-  return request({
-    url: '/front/syzy/home/marjors/top',
-    method: 'get',
-    params: params
-  })
-}
-
-// 高考视频
-export function gkVideo(params) {
-  return request({
-    url: '/front/newsVideo/list',
-    method: 'get',
-    params: params,
-    custom: {autoFitNoToken: true}
-  })
-}
-
-//  保存点击数
-export function saveClicked(params) {
-  return request({
-    url: '/front/newsVideo/saveClicked',
-    method: 'get',
-    params: params
-  })
-}
-
-export function getMainCourseDate(params) {
-  return request({
-    url: '/front/news/getMainCourseDate',
-    method: 'get',
-    params: params
-  })
-}

+ 0 - 171
src/api/webApi/career-other.js

@@ -1,171 +0,0 @@
-import request from '@/utils/request'
-
-// GET
-// /prod-api/front/customer/university/add
-// 03 关注院校
-export function concernUniversity(params) {
-  return request({
-    url: '/front/customer/university/add',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET
-// /prod-api/front/customer/university/list
-// 01 关注院校列表
-export function concernedUniversities(params) {
-  return request({
-    url: '/front/customer/university/list',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET
-// /prod-api/front/customer/university/remove
-// 02 移除关注院校
-export function removeConcernedUniversity(params) {
-  return request({
-    url: '/front/customer/university/remove',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET
-// /prod-api/front/customer/majors/add
-// 03 关注专业
-export function addConcernMajor(params) {
-  return request({
-    url: '/front/customer/marjors/add',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET
-// /prod-api/front/customer/majors/list
-// 01 关注专业列表
-export function concernedMajors(params) {
-  return request({
-    url: '/front/customer/marjors/list',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET
-// /prod-api/front/customer/majors/remove
-// 02 移除关注专业
-export function removeConcernedMajor(params) {
-  return request({
-    url: '/front/customer/marjors/remove',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  04 holland测评记录
-export function hollandRecord(params) {
-  return request({
-    url: '/front/syzy/holland/record',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  04 Mbti测评记录
-export function mbtiRecord(params) {
-  return request({
-    url: '/front/syzy/mbti/record',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  04 志愿表
-export function zytbRecord(params) {
-  return request({
-    url: '/front/syzy/zytb/record',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  04 高考名词
-export function list(params) {
-  return request({
-    url: '/front/syzy/gkmc/list',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  04 高考名词
-export function detail(params) {
-  return request({
-    url: '/front/syzy/gkmc/detail',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  批次控制线 地域
-export function locations(params) {
-  return request({
-    url: '/front/syzy/pckzx/locations',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  批次控制线 录取年份
-export function years(params) {
-  return request({
-    url: '/front/syzy/pckzx/years',
-    method: 'get',
-    params: params
-  })
-}
-
-// GET  批次控制线 列表
-export function pckzxList(params) {
-  return request({
-    url: '/front/syzy/pckzx/list',
-    method: 'get',
-    params: params
-  })
-}
-
-/**
- * 查询我的志愿表
- */
-export function selectZytbRecord(params) {
-  return request({
-    url: `/front/syzy/zytb/record`,
-    method: 'get',
-    params
-  })
-}
-
-/**
- * 删除我的志愿表
- * @param params
- */
-export function delZytbRecord(params) {
-  return request({
-    url: `/front/syzy/zytb/record/del`,
-    method: 'get',
-    params
-  })
-}
-
-export function downloadRecommendReport(params) {
-  return request({
-    url: `/front/syzy/zytb/export`,
-    method: 'get',
-    responseType: 'blob',
-    params
-  })
-}

+ 0 - 291
src/api/webApi/collegemajor.js

@@ -1,291 +0,0 @@
-import request from '@/utils/request'
-
-// 院校库 00 院校列表数据筛选项
-export function filters(params) {
-    return request({
-        url: '/front/university/filters',
-        method: 'get',
-        params: params
-    })
-}
-
-// 院校库 00 院校列表数据筛选项
-export function features(params) {
-    return request({
-        url: '/front/university/features',
-        method: 'get',
-        params: params
-    })
-}
-
-// 院校库 01 院校列表
-export function universityList(params) {
-    return request({
-        url: '/front/university/list',
-        method: 'get',
-        params: params
-    })
-}
-
-// 院校库 02 院校详情
-export function universityDetail(params) {
-    return request({
-        url: '/front/university/detail',
-        method: 'get',
-        params: params
-    })
-}
-
-export function getUniversitiesEnrollBrochureDetail(params) {
-    return request({
-        url: '/front/university/getUniversitiesEnrollBrochureDetail',
-        method: 'get',
-        params: params
-    })
-}
-
-
-// 专业库 01 专业分类列表
-export function majorList(params) {
-    return request({
-        url: '/front/marjors/list',
-        method: 'get',
-        params: params
-    })
-}
-
-// 专业库 02 专业详情
-export function majorDetail(params) {
-    return request({
-        url: '/front/marjors/detail',
-        method: 'get',
-        params: params
-    })
-}
-
-// 职业库 01 职业列表
-export function getAllVocation(params) {
-    return request({
-        url: '/front/vocational/getAllVocation',
-        method: 'get',
-        params: params
-    })
-}
-
-
-/**
- * 获取职业就业详情
- * @param params
- */
-export function vocationalPostsDetail(params) {
-    return request({
-        url: '/front/vocational/getVocationalPostDetailByPostName',
-        method: 'get',
-        params: params
-    })
-}
-
-/**
- * 获取就业岗位
- * @param params
- */
-export function vocationalPosts(params) {
-    return request({
-        url: `/front/vocational/getVocationalPosts`,
-        method: 'get',
-        params
-    })
-}
-
-// 职业概况
-export function vocationalOverview(params) {
-    return request({
-        url: `/front/vocational/getVocationalOverview`,
-        method: 'get',
-        params
-    })
-}
-
-// 00 院校列表数据筛选项-院校类型
-export function universityTypes(params) {
-    return request({
-        url: '/front/university/types',
-        method: 'get',
-        params: params
-    })
-}
-
-// 00 院校列表数据筛选项-地域
-export function universityLocations(params) {
-    return request({
-        url: '/front/university/locations',
-        method: 'get',
-        params: params
-    })
-}
-
-// 00 院校列表数据筛选项-学历层次
-export function universityLevels(params) {
-    return request({
-        url: '/front/university/levels',
-        method: 'get',
-        params: params
-    })
-}
-
-
-// 01 查询列表
-export function xkcxList(params) {
-    return request({
-        url: '/front/syzy/xkcx/list',
-        method: 'get',
-        params: params
-    })
-}
-
-
-// 专业库 00 专业类型
-export function majorTypes(params) {
-    return request({
-        url: '/front/marjors/types',
-        method: 'get',
-        params: params
-    })
-}
-
-// 专业库 01 所有专业
-export function getAllMajor(params) {
-    return request({
-        url: '/front/major/getAllMajor',
-        method: 'get',
-        params: params
-    })
-}
-
-
-// 专业库 02 搜索
-export function getMajorByName(params) {
-    return request({
-        url: '/front/major/getMajorByName',
-        method: 'get',
-        params: params
-    })
-}
-
-// 专业库 03 详情 概况
-export function majorOverview(params) {
-    return request({
-        url: '/front/major/getMajorOverviewByCode',
-        method: 'get',
-        params: params
-    })
-}
-
-// 专业库 04 详情 就业前景
-export function careerProspects(params) {
-    return request({
-        url: '/front/major/getMajorCareerProspectsByCode',
-        method: 'get',
-        params: params
-    })
-}
-
-// 专业库 05 详情  开设院校
-export function getUniversityByCode(params) {
-    return request({
-        url: '/front/major/getUniversityByCode',
-        method: 'get',
-        params: params
-    })
-}
-
-// 院校风采
-export function universitiesStyle(params) {
-    return request({
-        url: '/front/university/getUniversitiesStyle',
-        method: 'get',
-        params: params
-    })
-}
-
-// 获取学科评估类型
-export function evaluateType(params) {
-    return request({
-        url: '/system/dict/data/type/subject_evaluate_type',
-        method: 'get',
-        params: params
-    })
-}
-
-// 招生简章
-export function enrollBrochure(params) {
-    return request({
-        url: '/front/university/getUniversitiesEnrollBrochure',
-        method: 'get',
-        params: params
-    })
-}
-
-// 保存招生简章热度/点击
-export function saveEnrollBrochureHits(params) {
-    return request({
-        url: '/front/university/saveUniversitiesEnrollBrochureHits',
-        method: 'post',
-        params: params
-    })
-}
-
-// 排名筛选
-export function rankingFilter(params) {
-    return request({
-        url: '/front/university/getUniversitiesRankingFilter',
-        method: 'get',
-        params: params
-    })
-}
-
-
-// 根据type获取排名
-export function getUniversitiesRankingByTypes(params) {
-    return request({
-        url: '/front/university/getUniversitiesRankingByTypes',
-        method: 'get',
-        params: params
-    })
-}
-
-// 收藏 移除
-export function collectRemove(params) {
-    return request({
-        url: '/front/syzy/xkcx/collect/remove',
-        method: 'get',
-        params: params
-    })
-}
-
-// 收藏 添加
-export function collectAdd(params) {
-    return request({
-        url: '/front/syzy/xkcx/collect/add',
-        method: 'get',
-        params: params
-    })
-}
-
-// 选科收藏 添加移除
-export function saveSelectCourse(params) {
-    return request({
-        url: '/front/syzy/xkcx/saveSelectCourse',
-        method: 'get',
-        params: params
-    })
-}
-
-// 选科年份
-export function selectYears(params) {
-    return request({
-        url: '/front/syzy/xkcx/years',
-        method: 'get',
-        params: params
-    })
-}

+ 0 - 284
src/api/webApi/front.js

@@ -1,284 +0,0 @@
-import request from '@/utils/request'
-
-// 08 学生单次测评排名-按班级排名学生
-export function getClassExaminees(params) {
-  return request({
-    url: '/front/evaluation/getClassExaminees',
-    method: 'get',
-    params: params
-  })
-}
-// 04 学生测试列表
-export function getEvaluationForStudent(params) {
-  return request({
-    url: '/front/evaluation/getEvaluationForStudent',
-    method: 'get',
-    params: params
-  })
-}
-// 09 班级测评历史
-export function getClassHistory(params) {
-  return request({
-    url: '/front/evaluation/getClassHistory',
-    method: 'get',
-    params: params
-  })
-}
-// 05 测评班级统计
-export function getClassStat(params) {
-  return request({
-    url: '/front/evaluation/getClassStat',
-    method: 'get',
-    params: params
-  })
-}
-// 05.0 测评题目分类
-export function getEvaluationQuestionTypes(evaluationClassId) {
-  return request({
-    url: '/front/evaluation/getEvaluationQuestionTypes',
-    method: 'get',
-    params: {evaluationClassId: evaluationClassId}
-  })
-}
-//02 测评班级列表
-export function getEvaluationClassForStat(params) {
-  return request({
-    url: '/front/evaluation/getEvaluationClassForStat',
-    method: 'get',
-    params: params
-  })
-}
-// 03 统计测评列表
-export function getEvaluationForStat(params) {
-  return request({
-    url: '/front/evaluation/getEvaluationForStat',
-    method: 'get',
-    params: params
-  })
-}
-export function getEvaluationListForStat(params) {
-  return request({
-    url: '/front/evaluation/getEvaluationListForStat',
-    method: 'get',
-    params: params
-  })
-}
-// 03 测试测评列表
-export function getEvaluationForTest(params) {
-  return request({
-    url: '/front/evaluation/getEvaluationForTest',
-    method: 'get',
-    params: params
-  })
-}
-// 06 学生考卷详情
-export function getExamineeQuestions(params) {
-  return request({
-    url: '/front/evaluation/getExamineeQuestions',
-    method: 'get',
-    params: params
-  })
-}
-// 06 考卷学生详情
-export function getExaminee(params) {
-  return request({
-    url: '/front/evaluation/getExaminee',
-    method: 'get',
-    params: params
-  })
-}
-// 01 统计热门测评列表
-export function getHotEvaluationForStat(params) {
-  return request({
-    url: '/front/evaluation/getHotEvaluationForStat',
-    method: 'get',
-    params: params
-  })
-}
-//01 测试热门测评列表
-export function getHotEvaluationForTest(params) {
-  return request({
-    url: '/front/evaluation/getHotEvaluationForTest',
-    method: 'get',
-    params: params
-  })
-}
-// 07 学生测评历史
-export function getStudentHistory(params) {
-  return request({
-    url: '/front/evaluation/getStudentHistory',
-    method: 'get',
-    params: params
-  })
-}
-// 20 错题管理-班级知识点统计
-export function getClassKnownledgeStats(params) {
-  return request({
-    url: '/front/wrong/getClassKnownledgeStats',
-    method: 'get',
-    params: params
-  })
-}
-// 21 错题管理-班级学生统计
-export function getClassStudentStats(params) {
-  return request({
-    url: '/front/wrong/getClassStudentStats',
-    method: 'get',
-    params: params
-  })
-}
-// 22 错题管理-班级错题列表
-export function getClassStudentQuestions(params) {
-  return request({
-    url: '/front/wrong/getClassStudentQuestions',
-    method: 'get',
-    params: params
-  })
-}
-// 10 错题管理-学生知识点统计 front/wrong/getStudentKnownledgeStats
-export function getStudentKnownledgeStats(params) {
-  return request({
-    url: '/front/wrong/getStudentKnownledgeStats',
-    method: 'get',
-    params: params
-  })
-}
-// 11 错题管理-学生错题列表 front/wrong/getStudentDetails
-export function getStudentDetails(params) {
-  return request({
-    url: '/front/wrong/getStudentDetails',
-    method: 'get',
-    params: params
-  })
-}
-//  预览试卷
-export function previewEvaluationForTeacher(params) {
-  return request({
-    url: '/front/teacher/previewEvaluationForTeacher',
-    method: 'get',
-    params: params
-  })
-}
-//  01 查找测评
-export function getEvaluationsForOpen(params) {
-  return request({
-    url: '/front/teacher/getEvaluationsForOpen',
-    method: 'get',
-    params: params
-  })
-}
-//  02 开启测评
-export function open(data) {
-  return request({
-    url: '/front/teacher/open',
-    method: 'post',
-    data: data
-  })
-}
-//30 打开错题
-export function openWrongQuestion(params) {
-  return request({
-    url: '/front/wrong/openWrongQuestion',
-    method: 'get',
-    params: params
-  })
-}
-export function openQuestion(params) {
-  return request({
-    url: '/front/examination/openQuestion',
-    method: 'get',
-    params: params
-  })
-}
-// 30 举一反三取新题
-export function openWrongSimilarQuestion(params) {
-  return request({
-    url: '/front/wrong/openWrongSimilarQuestion',
-    method: 'get',
-    params: params
-  })
-}
-//31 提交错题答案
-export function commitWrongQuestion(params) {
-  return request({
-    url: '/front/wrong/commitWrongQuestion',
-    method: 'post',
-    data: params
-  })
-}
-//32 scoreWrongQuestion 阅卷打分
-export function scoreWrongQuestion(params) {
-  return request({
-    url: '/front/wrong/scoreWrongQuestion',
-    method: 'post',
-    data: params
-  })
-}
-// 收藏
-export function uploadGeneratePicAndBindQuestion(params) {
-  return request({
-    url: '/front/questionCollection/uploadGeneratePicAndBindQuestion',
-    method: 'post',
-    data: params
-  })
-}
-// 取消收藏
-export function cancelQuestionCollection(params) {
-  return request({
-    url: '/front/questionCollection/cancelQuestionCollection',
-    method: 'DELETE',
-    params: params
-  })
-}
-// 纠错
-export function correctQuestion(params) {
-  return request({
-    url: '/front/adjustWrong/correctQuestion',
-    method: 'post',
-    data: params
-  })
-}
-// 开启测评
-export function openExamination(params) {
-  return request({
-    url: '/front/teacher/openExamination',
-    method: 'post',
-    data: params
-  })
-}
-
-// 测评班级人员
-export  function getEvaluationStudents(params) {
-  return request({
-    url: '/front/teacher/getEvaluationStudents',
-    method: 'get',
-    params: params
-  })
-}
-
-// 发布成绩
-export function publishScores(params) {
-  return request({
-    url: '/front/teacher/publishScores',
-    method: 'post',
-    params: params
-  })
-}
-
-//01 测评单次排名(统计)
-export function getEvaluationKnownledge(params) {
-  return request({
-    url: '/front/wrong/getEvaluationKnownledge',
-    method: 'get',
-    params: params
-  })
-}
-
-//02 测评单次排名(明细)
-export function getEvaluationStudent(params) {
-  return request({
-    url: '/front/wrong/getEvaluationStudent',
-    method: 'get',
-    params: params
-  })
-}

+ 0 - 81
src/api/webApi/ie-voluntary.js

@@ -1,81 +0,0 @@
-import request from '@/utils/request'
-
-
-export function getAIRenderRules(data) {
-    return request({
-        url: '/getAIRenderRules',
-        method: 'post',
-        data
-    })
-}
-
-export function getVoluntaryConfig(params) {
-    return request({
-        url: '/getVoluntaryConfig',
-        method: 'get',
-        params
-    })
-}
-
-export function getVoluntary(params) {
-    return request({
-        url: '/getVoluntary',
-        method: 'get',
-        params
-    })
-}
-
-export function getVoluntaryList(params) {
-    return request({
-        url: '/getVoluntaryList',
-        method: 'get',
-        params
-    })
-}
-
-export function postAIResult(data) {
-    return request({
-        url: '/postAIResult',
-        method: 'post',
-        data
-    })
-}
-
-export function postMultipleResult(data) {
-    return request({
-        url: '/postMultipleResult',
-        method: 'post',
-        data
-    })
-}
-
-export function postSingleResult(data) {
-    return request({
-        url: '/postSingleResult',
-        method: 'post',
-        data
-    })
-}
-
-export function postCalculateResult(data) {
-    return request({
-        url: '/postCalculateResult',
-        method: 'post',
-        data
-    })
-}
-
-export function submitVoluntary(data) {
-    return request({
-        url: '/submitVoluntary',
-        method: 'post',
-        data
-    })
-}
-
-export function removeVoluntary(id) {
-    return request({
-        url: '/removeVoluntary/' + id,
-        method: 'delete'
-    })
-}

+ 0 - 10
src/api/webApi/knowledge.js

@@ -1,10 +0,0 @@
-import request from '@/utils/request'
-
-// 列表
-export function list(params) {
-    return request({
-        url: '/front/knowledgeTree/list',
-        method: 'get',
-        params: params
-    })
-}

+ 0 - 34
src/api/webApi/mental-health.js

@@ -1,34 +0,0 @@
-import request from '@/utils/request'
-
-export function getMentalHealthHistories(params) {
-  return request(({
-    url: '/front/mentalHealth/list',
-    method: 'get',
-    params
-  }))
-}
-
-export function getMentalHealthReport(params) {
-  return request(({
-    url: '/front/mentalHealth/report',
-    method: 'get',
-    params
-  }))
-}
-
-export function submitMentalHealthForm(data) {
-  return request(({
-    url: '/front/mentalHealth/submit',
-    method: 'post',
-    data
-  }))
-}
-
-export function exportMentalHealthReport(params) {
-  return request(({
-    url: '/front/mentalHealth/export',
-    method: 'get',
-    responseType: 'blob',
-    params
-  }))
-}

+ 0 - 61
src/api/webApi/paper.js

@@ -1,61 +0,0 @@
-import request from '@/utils/request'
-
-/**
- * 科目下试卷列表
-*/
-export function getPaperList(params) {
-  return request({
-    url: '/front/papers/list',
-    method: 'get',
-    params: params
-  })
-}
-
-/**
- * 考试记录
-*/
-export function getExamRecords(params) {
-  return request({
-    url: '/front/customer/records',
-    method: 'get',
-    params: params
-  })
-}
-
-/**
- * 考试记录详情
-*/
-export function getExamRecordsDetail(params) {
-  return request({
-    url: '/front/customer/recordDetail',
-    method: 'get',
-    params: params
-  })
-}
-
-/**
- * 错题本题目列表
-*/
-export function getWrongQuestions(params) {
-  return request({
-    url: '/front/v2/wrongBook/wrongQuestions',
-    method: 'get',
-    params: params
-  })
-}
-
-export function getWrongQuestionPaper(params) {
-  return request({
-    url: '/front/v2/wrongBook/wrongExaminees',
-    method: 'get',
-    params: params
-  })
-}
-export function getObjectivePaperStatistic(params) {
-  return request({
-    url: '/front/papers/getObjectivePaperStatistic',
-    method: 'get',
-    params: params
-  })
-}
-

+ 0 - 81
src/api/webApi/resources.js

@@ -1,81 +0,0 @@
-import request from '@/utils/request'
-
-
-// 查询位置编码
-/*
- * @description 获取可注册省份
- *  /prod-api/mingxue/SysLocations/getLocationsList?level=1 0 中国, 1 省、直辖市  2 市  3 区县
- *  pro
- *  city
- *  area
- *  address
- * */
-export function getLocationsList(params) {
-    return request({
-        url: '/mingxue/SysLocations/getLocationsList',
-        method: 'get',
-        params: params
-    })
-}
-
-/*
-* @description 获取当前用户可选省份,受卡分配影响
-* */
-export function getFrontLocationsList(params) {
-    return request({
-        url: '/mingxue/SysLocations/getFrontLocationsList',
-        method: 'get',
-        params: params
-    })
-}
-
-// 根据地区信息查询学校列表
-/*
- * /prod-api/mingxue/HighSchools/list 查询学校
- * pro
- * city
- * area
- * */
-//export function schoolList(params) {
-//return request({
-//  url: '/mingxue/HighSchools/list',
-//  method: 'get',
-//  params:params
-//})
-//}
-// export function schoolList(params) {
-//   return request({
-//     url: '/mingxue/HighSchools/GetSchoolsList',
-//     method: 'get',
-//     params:params
-//   })
-// }
-export function schoolList(params) {
-    return request({
-        url: '/back/busiSchools/list',
-        method: 'get',
-        params: params
-    })
-}
-
-// 列表
-export function list(params) {
-    return request({
-        url: '/web/cloud/resources/list',
-        method: 'get',
-        params: params
-    })
-}
-
-// /prod-api/web/person/resources/getPersonResourcesForAppHomepage
-// app首页默认个人资源库列表
-export function getPersonResourcesForAppHomepage() {
-    return request({
-        url: '/web/person/resources/getPersonResourcesForAppHomepage',
-        method: 'get',
-        params: {
-            pageNum: 1,
-            pageSize: 4
-        }
-    })
-}

+ 0 - 99
src/api/webApi/studentEvaluating.js

@@ -1,99 +0,0 @@
-import request from '@/utils/request'
-
-// 测评列表(学生)
-export function getEvaluationForTest(params) {
-  return request({
-    url: '/front/evaluation/getEvaluationForTest',
-    method: 'get',
-    params:params
-  })
-}
-// 测评列表(老师)
-export function getEvaluationForTeacher(params) {
-  return request({
-    url: '/front/teacher/getEvaluationForTeacher',
-    method: 'get',
-    params:params
-  })
-}
-//
-export function getEvaluationListForTeacher(params) {
-  return request({
-    url: '/front/teacher/getEvaluationListForTeacher',
-    method: 'get',
-    params:params
-  })
-}
-
-// 学生考卷详情
-export function openExamineePaper(params) {
-  return request({
-    url: '/front/examination/openExamineePaper',
-    method: 'get',
-    params:params
-  })
-}
-
-
-export function loadExamineePaper(params) {
-  return request({
-    url: '/front/teacher/loadExamineePaper',
-    method: 'get',
-    params:params
-  })
-}
-
-
-// 竞赛卷详情
-export function competitionQuestions(params) {
-  return request({
-    url: '/front/competition/openCompetitionPaper',
-    method: 'get',
-    params:params
-  })
-}
-
-
-// 保存当前题目的作答信息
-export function commitExamineeQuestion(data) {
-  return request({
-    url: '/front/examination/commitExamineeQuestion',
-    method: 'post',
-    data:data
-  })
-}
-
-
-// 学生考卷提交
-export function commitExamineePaper(data) {
-  return request({
-    url: '/front/examination/commitExamineePaper',
-    method: 'post',
-    data:data
-  })
-}
-// 学生阅卷
-export function scoreExamineeQuestion(data) {
-  return request({
-    url: '/front/examination/scoreExamineeQuestions',
-    method: 'post',
-    data:data
-  })
-}
-// 老师阅卷
-export function teacherScoreExamineeQuestions(data) {
-  return request({
-    url: '/front/teacher/scoreExamineeQuestions',
-    method: 'post',
-    data:data
-  })
-}
-
-// 结束阅卷
-export function scoreFinish(data) {
-  return request({
-    url: '/front/examination/scoreFinish',
-    method: 'post',
-    params:data
-  })
-}

+ 0 - 58
src/api/webApi/subject.js

@@ -1,58 +0,0 @@
-import request from '@/utils/request'
-//
-
-// 新增/编辑 
-export function add(data) {
-  return request({
-    url: '/web/subject',
-    method: 'post',
-    data: data
-  })
-}
-// 新增/编辑 
-export function update(data) {
-  return request({
-    url: '/web/subject',
-    method: 'put',
-    data: data
-  })
-}
-// 详情 
-export function getInfo(resourcesId) {
-  return request({
-    url: '/web/subject/'+resourcesId,
-    method: 'get', 
-  })
-}
-// 删除 
-export function remove(resourcesId) {
-  return request({
-    url: '/web/subject/'+resourcesId,
-    method: 'delete', 
-  })
-}
-// 导出
-export function exportList(params) {
-  return request({
-    url: '/web/subject/export',
-    method: 'get', 
-    params:params
-  })
-} 
-// 列表
-export function list(params) {
-  return request({
-    url: '/front/student/subject',
-    method: 'get', 
-    params:params
-  })
-} 
-
-// /web/subject/getUserSubjectsList
-export function userList(params) {
-  return request({
-    url: '/web/subject/getUserSubjectsList',
-    method: 'get', 
-    params:params
-  })
-}

+ 0 - 146
src/api/webApi/volunteer.js

@@ -1,146 +0,0 @@
-import request from '@/utils/request'
-import config from "@/config";
-
-
-// 
-export function get(params) {
-    return request({
-        url: '/front/syzy/xkbm/get',
-        method: 'get',
-        params: params
-    })
-}
-
-// 志愿填报  科目和分数要求
-export function getVoluntaryData(params) {
-    return request({
-        url: '/front/syzy/zytb/getVoluntaryData',
-        method: 'get',
-        params: params
-    })
-}
-
-
-// 志愿填报  位次
-export function getRankByScore(params) {
-    return request({
-        url: '/front/syzy/yfyd/getRankByScore',
-        method: 'get',
-        params: params
-    })
-}
-
-// 志愿填报  01.填报批次
-export function zytbBatches(params) {
-    return request({
-        url: '/front/syzy/zytb/batches',
-        method: 'get',
-        params: params
-    })
-}
-
-// 获取推荐志愿表头
-export function getVoluntaryHeaders(params) {
-    return request({
-        url: '/front/syzy/zytb/getVoluntaryHeaders',
-        method: 'get',
-        params: params
-    })
-}
-
-// 志愿填报  志愿组
-export function getRecommendVoluntary(data, params) {
-    return request({
-        url: '/front/syzy/zytb/getRecommendVoluntary',
-        method: 'post',
-        data: data,
-        params: params
-    })
-}
-
-// 志愿填报  专业
-export function getVoluntaryMarjors(data) {
-    return request({
-        url: '/front/syzy/zytb/getVoluntaryMarjors',
-        method: 'post',
-        data: data
-    })
-}
-
-
-// 志愿填报  04.志愿保存
-export function saveZhiyuan(params) {
-    return request({
-        url: '/front/syzy/zytb/save',
-        method: 'post',
-        data: params
-    })
-}
-
-// 获取志愿明细
-export function getZhiyuanDetail(wishResId) {
-    return request({
-        url: '/front/syzy/zytb/recordDetail',
-        method: 'get',
-        params: {wishResId}
-    })
-}
-
-// 填报批次  筛选条件
-export function universityFilters(params) {
-    return request({
-        url: '/front/syzy/zytb/university/filters',
-        method: 'get',
-        data: params
-    })
-}
-
-
-// 查询我的志愿表
-export function selectZytbRecord(params) {
-    return request({
-        url: `/front/syzy/zytb/record`,
-        method: 'get',
-        params
-    })
-}
-
-/**
- * 删除我的志愿表
- * @param params
- */
-export function delZytbRecord(params) {
-    return request({
-        url: `/front/syzy/zytb/record/del`,
-        method: 'get',
-        params
-    })
-}
-
-/* download voluntary simulated excel */
-export function downloadRecommendReport(params) {
-    return request({
-        url: `/front/syzy/zytb/export`,
-        method: 'get',
-        responseType: 'arrayBuffer',
-        params
-    })
-}
-
-export function getDownloadRecommendReportOptionsForWap2App(params) {
-    return {
-        url: config.serverBaseUrl + '/front/syzy/zytb/export',
-        params
-    }
-}
-
-export function getVoluntarySpecialProjectFilter(params) {
-    // params = { year } // 缺省年份返回当前年份的专项选项
-    // returns ['专项A', '专项B', '专项C', '不看专项']
-    // getRecommendVoluntary 新增参数specialProjects: Array // 原来的参数specialProjectNation,specialProjectLocal不动
-    return request({
-        url: `/front/syzy/zytb/specialProjectFilter`,
-        method: 'get',
-        params
-    })
-}

+ 0 - 749
src/api/webApi/webQue.js

@@ -1,749 +0,0 @@
-import request from '@/utils/request'
-
-
-//题库中心接口
-
-// 教学阶段列表
-export function pharseList() {
-	return request({
-		url: '/front/v2/pharse/list',
-		method: 'get',
-	})
-}
-// 课程列表
-export function subjectList() {
-	return request({
-		url: '/front/v2/subject/list',
-		method: 'get',
-	})
-}
-
-// 试卷--课程列表
-export function paperSubjectList() {
-	return request({
-		url: '/front/v2/papers/subjects',
-		method: 'get',
-	})
-}
-// 年级列表
-export function gradeList(query) {
-	return request({
-		url: '/front/v2/grade/list',
-		method: 'get',
-		params: query
-	})
-}
-
-// 版本列表
-export function editionList(query) {
-	return request({
-		url: '/front/v2/edition/list',
-		method: 'get',
-		params: query
-	})
-}
-
-// 排序后的--版本列表
-export function newEditionList(query) {
-	return request({
-		url: '/front/v2/edition/listOrdered',
-		method: 'get',
-		params: query
-	})
-}
-
-// 获得章节树
-export function treeList(query) {
-	return request({
-		url: '/front/v2/chapterTree/list',
-		method: 'get',
-		params: query
-	})
-}
-// 根据章节获取题库列表
-export function listByChapter(query) {
-	return request({
-		url: '/front/v2/questions/listByChapter',
-		method: 'get',
-		params: query
-	})
-}
-
-
-// 获取类型列表
-export function papersTypes(query) {
-	return request({
-		url: '/front/v2/papers/types',
-		method: 'get',
-		params: query
-	})
-}
-// 获取地区列表
-export function papersAreas(query) {
-	return request({
-		url: '/front/v2/papers/areas',
-		method: 'get',
-		params: query
-	})
-}
-// 获取试卷列表
-export function papersList(query) {
-	return request({
-		url: '/front/v2/papers/list',
-		method: 'get',
-		params: query
-	})
-}
-
-// 预览试卷
-export function preview(query) {
-	return request({
-		url: '/front/v2/papers/preview',
-		method: 'get',
-		params: query
-	})
-}
-// 收藏试卷
-export function papersCollect(query) {
-	let key = Object.keys(query)[0];
-	let value = query[key];
-	return request({
-		url: '/front/v2/papers/collect?' + key + '=' + value,
-		method: 'post',
-	})
-}
-// 取消收藏试卷
-export function papersCancelCollect(query) {
-	return request({
-		url: '/front/v2/papers/cancelCollect',
-		method: 'post',
-		params:query
-	})
-}
-
-// 年份列表
-export function papersYears(query) {
-	return request({
-		url: '/front/v2/papers/years',
-		method: 'get',
-		params: query
-	})
-}
-
-// 根据科目查找题型  /front/v2/questions/listQuestionTypesBySubject
-export function qtBySubject(query) {
-	return request({
-		url: '/front/v2/questions/listQuestionTypesBySubject',
-		method: 'get',
-		params: query
-	})
-}
-//  获取知识点分类树
-export function knowledgeTree(query) {
-	return request({
-		url: '/front/v2/knowledgeTree/list',
-		method: 'get',
-		params: query
-	})
-}
-
-// 根据知识点获取题库列表
-export function listByKnowledge(query) {
-	return request({
-		url: '/front/v2/questions/listByKnowledge',
-		method: 'get',
-		params: query
-	})
-}
-// 根据章节获取题库类型和数量
-export function countByChapter(query) {
-	return request({
-		url: '/front/v2/questions/countByChapter',
-		method: 'get',
-		params: query
-	})
-}
-
-// 根据知识点获取题型数量
-export function countByKnowledge(query) {
-	return request({
-		url: '/front/v2/questions/countByKnowledge',
-		method: 'get',
-		params: query
-	})
-}
-
-
-
-// 根据章节获取题目数量
-export function getQuestionsNumByChapter(query) {
-	return request({
-		url: '/front/v2/smartPractice/getQuestionsNumByChapter',
-		method: 'get',
-		params: query
-	})
-}
-// 根据知识点获取题目数量
-export function getQuestionsNumByKnowledge(query) {
-	return request({
-		url: '/front/v2/smartPractice/getQuestionsNumByKnowledge',
-		method: 'get',
-		params: query
-	})
-}
-
-
-// 根据章节获取题目用来练习
-export function getQuestionsByChapter(query) {
-	return request({
-		url: '/front/v2/smartPractice/getQuestionsByChapter',
-		method: 'get',
-		params: query
-	})
-}
-
-
-// 根据知识点获取题目用来练习
-export function getQuestionsByKnowledge(query) {
-	return request({
-		url: '/front/v2/smartPractice/getQuestionsByKnowledge',
-		method: 'get',
-		params: query
-	})
-}
-
-// 保存练习
-export function savePractice(query) {
-	return request({
-		url: '/front/v2/smartPractice/savePractice',
-		method: 'get',
-		data: query
-	})
-}
-
-
-// 取消收藏试题
-export function queCancelCollect(query) {
-	let key = Object.keys(query)[0];
-	let value = query[key];
-	return request({
-		url: '/front/v2/questions/cancelCollect?' + key + '=' + value,
-		method: 'post',
-	})
-}
-
-// 收藏试题
-export function queCollect(query) {
-	let key = Object.keys(query)[0];
-	let value = query[key];
-	return request({
-		url: '/front/v2/questions/collect?' + key + '=' + value,
-		method: 'post',
-	})
-}
-
-export function questionCollect(questionId) {
-	return request({
-		url: '/front/questions/collect',
-		method: 'post',
-		params: {questionId}
-	})
-}
-
-export function questionCancelCollect(questionId) {
-	return request({
-		url: '/front/questions/cancelCollect',
-		method: 'post',
-		params: {questionId}
-	})
-}
-
-
-
-export function paperCollect(paperId) {
-	return request({
-		url: '/front/papers/collect',
-		method: 'post',
-		params: {paperId}
-	})
-}
-
-export function paperCancelCollect(paperId) {
-	return request({
-		url: '/front/papers/cancelCollect',
-		method: 'post',
-		params: {paperId}
-	})
-}
-
-
-// 查询组卷记录
-export function paperRecords(query) {
-	return request({
-		url: '/front/v2/papers/paperRecords',
-		method: 'get',
-		params: query
-	})
-}
-
-// 获取试题蓝记录
-export function getQuestionCardList(query) {
-	return request({
-		url: '/front/v2/papers/getQuestionCardList',
-		method: 'get',
-		params: query
-	})
-}
-// 保存试题栏
-export function editQuestionCard(query) {
-	return request({
-		url: '/front/v2/papers/editQuestionCard',
-		method: 'post',
-		data: query,
-	})
-}
-// 清空试题栏
-export function deleteQuestionCard(query) {
-	return request({
-		url: '/front/v2/papers/deleteQuestionCard',
-		method: 'post',
-		data: query,
-	})
-}
-
-// 收藏涉及的学科, type: question/paper
-
-export function favSubjects(query) {
-	return request({
-		url: '/front/v2/favorites/subjects',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 收藏涉及的题型
-export function favQueTypes(query) {
-	return request({
-		url: '/front/v2/favorites/qtypes',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 收藏的问题列表
-export function favQuestions(query) {
-	return request({
-		url: '/front/favorites/questions',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 收藏的试卷列表
-export function favPapers(query) {
-	return request({
-		url: '/front/favorites/papers',
-		method: 'get',
-		params: query,
-	})
-}
-
-
-// 错题涉及的题型
-export function wrongTypes(query) {
-	return request({
-		url: '/front/v2/wrongBook/qtypes',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 错题涉及的学科
-export function wrongSubjects(query) {
-	return request({
-		url: '/front/v2/wrongBook/subjects',
-		method: 'get',
-		params: query,
-	})
-}
-
-
-// 错题列表
-export function wrongQuestions(query) {
-	return request({
-		url: '/front/v2/wrongBook/wrongQuestions',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 删除错题
-export function deleteWrongQuestion(query) {
-	return request({
-		url: '/front/v2/wrongBook/deleteWrongQuestion',
-		method: 'post',
-		params: query,
-	})
-}
-
-// 数据统计(总)
-export function summary(query) {
-	return request({
-		url: '/front/v2/studyRecord/summary',
-		method: 'get',
-		params: query,
-	})
-}
-
-
-// 数据统计-做题数量-按天
-export function questionStatsByDay(query) {
-	return request({
-		url: '/front/v2/studyRecord/questionStatsByDay',
-		method: 'get',
-		params: query,
-	})
-}
-
-//  数据统计-做题数量-按学科
-export function questionStatsBySubject(query) {
-	return request({
-		url: '/front/v2/studyRecord/questionStatsBySubject',
-		method: 'get',
-		params: query,
-	})
-}
-// 数据统计-视频观看时长 - 按天
-export function videoStatsByDay(query) {
-	return request({
-		url: '/front/v2/studyRecord/videoStatsByDay',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 数据统计-视频观看时长 - 按学科
-export function videoStatsBySubject(query) {
-	return request({
-		url: '/front/v2/studyRecord/videoStatsBySubject',
-		method: 'get',
-		params: query,
-	})
-}
-
-
-// 视频学习记录
-export function videoWatchRecords(query) {
-	return request({
-		url: '/front/v2/studyRecord/videoWatchRecords',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 知识点诊断记录
-export function knowRecords(query) {
-	return request({
-		url: '/front/v2/studyRecord/knowledgeDiagnoseRecords',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 试卷是否被收藏
-export function isCollected(query) {
-	return request({
-		url: '/front/v2/papers/isCollected',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 添加题目到试题栏
-export function addToQuestionCard(query) {
-	return request({
-		url: '/front/v2/papers/addToQuestionCard',
-		method: 'post',
-		params: query,
-	})
-}
-
-// 获取最底层的知识点
-export function listBottoms(query) {
-	return request({
-		url: '/front/v2/knowledgeTree/listBottoms',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 保存试卷
-export function savePaperInfo(query) {
-	return request({
-		url: '/front/v2/papers/savePaperInfo',
-		method: 'post',
-		data: query,
-	})
-}
-
-// 根据题目类型和数量获取题目
-export function getQuestionsByQTypeAndNum(data) {
-	return request({
-		url: '/front/v2/papers/getQuestionsByQTypeAndNum',
-		method: 'post',
-		data: data,
-	})
-}
-
-// 根据章节获取知识点
-export function knowByChapter(query) {
-	return request({
-		url: '/front/v2/knowledgeTree/listByChapter',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 举一反三
-export function drawInferences(query) {
-	return request({
-		url: '/front/v2/smartPractice/drawInferences',
-		method: 'get',
-		params: query,
-	})
-}
-export function listGrade(query) {
-	return request({
-		url: '/front/v2/papers/listGrade',
-		method: 'get',
-		params: query,
-	})
-}
-// 试卷--  年级列表
-export function paperListGrade(query) {
-	return request({
-		url: '/front/v2/papers/grades',
-		method: 'get',
-		params: query,
-	})
-}
-
-//  批次线--地域
-export function pckzxLocations(query) {
-	return request({
-		url: '/front/syzy/pckzx/locations',
-		method: 'get',
-		params: query,
-	})
-}
-
-//  批次线--录取年份
-export function pckzxYears(query) {
-	return request({
-		url: '/front/syzy/pckzx/years',
-		method: 'get',
-		params: query,
-	})
-}
-
-//  批次线--批次控制线列表
-export function pckzxList(query) {
-	return request({
-		url: '/front/syzy/pckzx/list',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 一分一段--地域
-export function yfydLocations(query) {
-	return request({
-		url: '/front/syzy/yfyd/locations',
-		method: 'get',
-		params: query,
-	})
-}
-// 一分一段--录取年份
-export function yfydYears(query) {
-	return request({
-		url: '/front/syzy/yfyd/years',
-		method: 'get',
-		params: query,
-	})
-}
-// 一分一段--科类
-export function yfydModes(query) {
-	return request({
-		url: '/front/syzy/yfyd/modes',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 一分一段--列表
-export function yfydList(query) {
-	return request({
-		url: '/front/syzy/yfyd/list',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 等效位次转化分
-export function getEquivalentScore(query) {
-	// query: { location: '湖南', year: 2024, mode: '物理', score: 580 }
-	// returns: { match: match item in `yfyd/list`, scores: [{year: 2023, seat: -, score}] 近3年等效位次和等效分},
-	// 注,如果当前year=2023年,应该返回 23 22 21 年的等效位次和等效分;
-	// 如果当前 24年,一分一段开放前应该返回 23 22 21,一分一段开放后应该返回 24 23 22。
-	return request({
-		url: '/front/syzy/yfyd/getEquivalentScore',
-		method: 'get',
-		params: query,
-	})
-}
-
-
-// 高考名词--详情
-export function gkmcDetail(query) {
-	return request({
-		url: '/front/syzy/gkmc/detail',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 高考名词--详情
-export function gkmc(query) {
-	return request({
-		url: '/front/syzy/gkmc/list',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 院校投档线--地域
-export function lineLocations(query) {
-	return request({
-		url: '/front/syzy/tdx/university/locations',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 院校投档线--层次
-export function lineLevels(query) {
-	return request({
-		url: '/front/syzy/tdx/university/levels',
-		method: 'get',
-		params: query,
-	})
-}
-// 院校投档线--科类
-export function lineTypes(query) {
-	return request({
-		url: '/front/syzy/tdx/university/types',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 院校投档线--录取年份
-export function lineYears(query) {
-	return request({
-		url: '/front/syzy/tdx/university/years',
-		method: 'get',
-		params: query,
-	})
-}
-
-export function universityList(query) {
-	return request({
-		url: '/front/syzy/tdx/university/list',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 专业投档线--录取年份
-export function majorLineYear(query) {
-	return request({
-		url: '/front/syzy/tdx/marjor/years',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 专业投档线--科类
-export function majorLineTypes(query) {
-	return request({
-		url: '/front/syzy/tdx/marjor/types',
-		method: 'get',
-		params: query,
-	})
-}
-
-// 专业投档线--层次
-export function majorLineLevels(query) {
-	return request({
-		url: '/front/syzy/tdx/marjor/levels',
-		method: 'get',
-		params: query,
-	})
-}
-
-// TODO: 不明确与WEB端整个webQue.js的差异在哪儿,先哪儿缺搬哪儿
-export function xkcxYears(query) {
-  return request({
-    url: '/front/syzy/xkcx/years',
-    method: 'get',
-    params: query,
-  })
-}
-
-export function getAiAdStudyVideoList(params) {
-  return request({
-    url: '/front/videoCourse/getAiAdStudyVideoList',
-    method: 'get',
-    params
-  })
-}
-
-export function getAiAdStudyQuestionList(params) {
-  return request({
-    url: '/front/v2/questions/getAiAdStudyQuestionList',
-    method: 'get',
-    params
-  })
-}
-
-export function smartSubjectList() {
-  return request({
-    url: '/front/v2/subject/list',
-    method: 'get',
-  })
-}
-
-
-export function getAiSubjectVideos(params) {
-  return request({
-    url: '/front/ai/getAiSubjectVideos',
-    method: 'get',
-    params
-  })
-}
-
-export function getAiSubjectPapers(params) {
-  return request({
-    url: '/front/ai/getAiSubjectPapers',
-    method: 'get',
-    params
-  })
-}
-
-export function xkcxlist(query) {
-	return request({
-		url: '/front/syzy/xkcx/list',
-		method: 'get',
-		params: query
-	})
-}

+ 0 - 156
src/api/webApi/webVideo.js

@@ -1,156 +0,0 @@
-import request from '@/utils/request'
-// 视频课程相关接口
-
-// IE 视频
-export function ieVideoSubjects(query) {
-    return request({
-        url: '/front/videoCourse/subjects',
-        method: 'get',
-        params: query
-    })
-}
-
-export function ieVideoKnowledge(query) {
-    return request({
-        url: '/front/videoCourse/knowledges',
-        method: 'get',
-        params: query
-    })
-}
-
-// 查询视频大类
-export function videoType() {
-    return request({
-        url: '/front/videoCourse/subjects',
-        method: 'get',
-    })
-}
-
-// 查询科目
-export function videoSubjects(query) {
-    return request({
-        url: '/front/videoCourse/courses',
-        method: 'get',
-        params: query
-    })
-}
-
-// 查询年级
-export function videoGrades(query) {
-    return request({
-        url: '/front/videoCourse/grades',
-        method: 'get',
-        params: query
-    })
-}
-
-// 查询版本
-export function videoVersions(query) {
-    return request({
-        url: '/front/videoCourse/versions',
-        method: 'get',
-        params: query
-    })
-}
-
-// 视频包列表
-export function packList(query) {
-    return request({
-        url: '/front/videoCourse/pack/list',
-        method: 'get',
-        params: query
-    })
-}
-
-// 视频列表 
-export function videoList(query) {
-    return request({
-        url: '/front/videoCourse/video/list',
-        method: 'get',
-        params: query
-    })
-}
-
-// 章节树
-export function getChapterTreeList(query) {
-    return request({
-        url: '/common/chapter/getChapterTreeList',
-        method: 'get',
-        params: query
-    })
-}
-
-// 视频详情 
-export function videoInfo(query) {
-    return request({
-        url: '/front/videoCourse/video/info/tree',
-        method: 'get',
-        params: query
-    })
-}
-
-// 视频详情 7.1
-export function videoInfoTree(query) {
-    return request({
-        url: '/front/videoCourse/video/info/tree',
-        method: 'get',
-        params: query
-    })
-}
-
-
-// 获取视频播放信息 
-export function getVideoPlayInfo(query) {
-    return request({
-        url: '/front/comm/vod/getVideoPlayInfo',
-        method: 'get',
-        params: query
-    })
-}
-
-// 视频点播
-export function getVideoPlayAuth(query) {
-    return request({
-        url: '/common/vod/getVideoPlayAuth',
-        method: 'get',
-        params: query
-    })
-}
-
-// /prod-api/front/videoCourse/listForHomepageLogined
-// 08.2 首页视频列表(已登陆时)
-export function listForHomepageLogined() {
-    return request({
-        url: '/front/videoCourse/listForHomepageLogined',
-        method: 'get',
-        params: {
-            pageNum: 1,
-            pageSize: 4
-        }
-    })
-}
-
-// /prod-api/front/videoCourse/saveWatchRecord
-export function saveWatchRecord(sectionId, duration, percent, aliType) {
-    if (aliType == 'undefined' || typeof aliType == 'undefined') aliType = '' // 容错处理
-    return request({
-        url: '/front/videoCourse/saveWatchRecord',
-        method: 'post',
-        params: {
-            sectionId,
-            duration: Math.floor(duration),
-            percent: percent.toFixed(3),
-            type: aliType
-        },
-        custom: {toast: false} // 保持静默行为,出错时无需让用户知道
-    })
-}
-
-// 老师收藏视频
-export function collectVideoCourse(params) {
-    return request({
-        url: '/front/videoCourse/video/collectVideoCourse',
-        method: 'post',
-        params
-    })
-}

+ 19 - 0
src/components/ie-empty/ie-empty.vue

@@ -0,0 +1,19 @@
+<template>
+  <view class="ie-empty">
+    <slot v-if="value"></slot>
+    <view v-else-if="!loading" class="w-full box-border flex flex-col gap-50 items-center justify-center p-40">
+      <z-paging-empty-view :emptyViewFixed="false" />
+    </view>
+  </view>
+</template>
+<script lang="ts" setup>
+type Props = {
+  value: boolean;
+  loading: boolean;
+}
+const props = withDefaults(defineProps<Props>(), {
+  value: false,
+  loading: false
+});
+</script>
+<style lang="scss" scoped></style>

+ 18 - 2
src/components/ie-navbar/ie-navbar.vue

@@ -4,7 +4,10 @@
       leftIcon="" :autoBack="false" @leftClick="leftClick" :clickHover="clickHover">
       <template #left>
         <slot name="headerLeft">
-          <uv-icon name="arrow-left" size="20px" :color="titleStyle.color"></uv-icon>
+          <view class="flex items-center">
+            <uv-icon v-if="!hideBack" name="arrow-left" size="20px" bold :color="titleStyle.color"></uv-icon>
+            <text v-if="leftText" class="text-[16px] text-fore-title font-semibold">{{ leftText }}</text>
+          </view>
         </slot>
       </template>
       <template #right>
@@ -15,6 +18,11 @@
 </template>
 
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import { useTransferPage } from "@/hooks/useTransferPage";
 import { useScroll } from '@/hooks/useScroll';
 import { useAppStore } from "@/store/appStore";
@@ -35,6 +43,7 @@ const appStore = useAppStore();
  * @property {Boolean} keepTitleColor 是否保持标题颜色
  * @property {Boolean} customBack 是否自定义返回
  * @property {Object} titleStyle 标题样式
+ * @property {Boolean} hideBack 是否隐藏返回按钮
  */
 
 type NavbarOptions = {
@@ -49,12 +58,16 @@ type NavbarOptions = {
   customBack?: boolean;
   clickHover?: boolean;
   titleStyle?: any;
+  hideBack?: boolean;
+  leftText?: string;
 }
 const props = withDefaults(defineProps<NavbarOptions>(), {
   fixed: true,
   placeholder: true,
   clickHover: true,
-  titleStyle: () => ({})
+  titleStyle: () => ({}),
+  hideBack: false,
+  leftText: ''
 });
 const navHeight = 60;
 const fixedBgColor = computed(() => {
@@ -110,6 +123,9 @@ const bgFixed = computed(() => {
 const emit = defineEmits(["leftClick"]);
 const leftClick = () => {
   emit("leftClick");
+  if (props.hideBack) {
+    return;
+  }
   if (!props.customBack) {
     handleBack();
   }

+ 8 - 1
src/components/ie-page/ie-page.vue

@@ -28,11 +28,18 @@ type PageProps = {
   safeAreaInsetBottom?: boolean;
   bgColor?: string;
   fixHeight?: boolean;
+  safeAreaInsetBottomColor?: string;
 }
 const props = withDefaults(defineProps<PageProps>(), {
   safeAreaInsetBottom: true,
   bgColor: '',
-  fixHeight: false
+  fixHeight: false,
+  safeAreaInsetBottomColor: ''
+});
+
+const safeAreaColor = computed(() => {
+  return props.safeAreaInsetBottom ? props.safeAreaInsetBottomColor : (props.bgColor ? props.bgColor
+    : '#FFFFFF');
 });
 // 为 ref 添加类型定义
 const vipPopupRef = ref<InstanceType<typeof VipPopup>>();

+ 1 - 1
src/components/ie-popup/ie-popup.vue

@@ -6,7 +6,7 @@
     <root-portal externalClass="theme-ie">
       <!-- #endif -->
       <uv-popup ref="popupRef" :mode="mode" :round="round" popup-class="theme-ie"
-        :close-on-click-overlay="closeOnClickOverlay" @close="handleClose">
+        :close-on-click-overlay="closeOnClickOverlay" :safeAreaInsetBottom="mode === 'bottom'" @close="handleClose">
         <template v-if="showToolbar">
           <ie-popup-toolbar :title="title" :cancelText="cancelText" :confirmText="confirmText" :showCancel="showCancel"
             :showConfirm="showConfirm" @cancel="handleCancel" @confirm="handleConfirm" />

+ 6 - 1
src/components/ie-safe-toolbar/ie-safe-toolbar.vue

@@ -7,6 +7,11 @@
   </view>
 </template>
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import { useAppStore } from '@/store/appStore';
 const appStore = useAppStore();
 const props = defineProps({
@@ -20,7 +25,7 @@ const props = defineProps({
   }
 });
 const minHeight = computed(() => {
-  return (appStore.systemInfo.safeAreaInsets?.bottom ?? 0) + props.height;
+  return (appStore.sysInfo.safeAreaInsets?.bottom ?? 0) + props.height;
 });
 </script>
 <style lang="scss" scoped>

+ 4 - 3
src/components/ie-table/ie-table.vue

@@ -13,9 +13,10 @@
             <view v-if="item.type === 'index'">
               {{ index + 1 }}
             </view>
-            <slot v-else :name="item.slot" :item="row" :index="index">
-              <text>{{ getCellValue(row, item.prop) }}</text>
-            </slot>
+            <template v-else-if="item.slot">
+              <slot :name="item.slot" :item="row" :index="index"></slot>
+            </template>
+            <text v-else>{{ getCellValue(row, item.prop) }}</text>
           </view>
         </view>
       </block>

+ 0 - 3
src/composables/useCalendar.ts

@@ -127,9 +127,6 @@ export function useCalendar() {
       displayMode.value = 'year';
       currentDate.value = new Date(year, month, 1);
     }
-    console.log(year, month)
-
-    console.log('currentDate', currentDate.value)
     loading.value = true;
     try {
       // 请求数据

+ 71 - 10
src/composables/useExam.ts

@@ -3,6 +3,66 @@ import { getPaper } from '@/api/modules/study';
 import { Study } from "@/types";
 import { Question } from "@/types/study";
 
+/**
+ * @description 兼容层:获取当前时间戳(毫秒)
+ * 优先使用 performance.now(),不支持则降级到 Date.now()
+ * 兼容微信小程序环境
+ */
+const getNow = (): number => {
+  // #ifdef MP-WEIXIN
+  return Date.now();
+  // #endif
+  
+  // #ifndef MP-WEIXIN
+  if (typeof performance !== 'undefined' && performance.now) {
+    return performance.now();
+  }
+  return Date.now();
+  // #endif
+};
+
+/**
+ * @description 兼容层:请求动画帧
+ * 微信小程序不支持 requestAnimationFrame,使用 setTimeout 模拟
+ */
+const requestAnimFrame = (() => {
+  // #ifdef MP-WEIXIN
+  return (callback: FrameRequestCallback): number => {
+    return setTimeout(() => callback(Date.now()), 1000 / 60) as unknown as number;
+  };
+  // #endif
+  
+  // #ifndef MP-WEIXIN
+  if (typeof requestAnimationFrame !== 'undefined') {
+    return requestAnimationFrame;
+  }
+  return (callback: FrameRequestCallback): number => {
+    return setTimeout(() => callback(Date.now()), 1000 / 60) as unknown as number;
+  };
+  // #endif
+})();
+
+/**
+ * @description 兼容层:取消动画帧
+ * 微信小程序不支持 cancelAnimationFrame,使用 clearTimeout 模拟
+ */
+const cancelAnimFrame = (() => {
+  // #ifdef MP-WEIXIN
+  return (id: number): void => {
+    clearTimeout(id as unknown as NodeJS.Timeout);
+  };
+  // #endif
+  
+  // #ifndef MP-WEIXIN
+  if (typeof cancelAnimationFrame !== 'undefined') {
+    return cancelAnimationFrame;
+  }
+  return (id: number): void => {
+    clearTimeout(id as unknown as NodeJS.Timeout);
+  };
+  // #endif
+})();
+
 /**
  * @description 解码 HTML 实体
  * 由于 uv-parse 的 decodeEntity 只支持有限的实体,需要手动解码音标等特殊实体
@@ -437,22 +497,23 @@ export const useExam = () => {
     
     // 记录开始时间戳(毫秒)
     if (practiceStartTime === 0) {
-      practiceStartTime = performance.now();
+      practiceStartTime = getNow();
     }
     
-    // 使用 requestAnimationFrame 更新显示,更流畅且性能更好
+    // 使用 requestAnimFrame 更新显示,更流畅且性能更好
+    // 兼容微信小程序环境
     const updatePracticeDuration = () => {
       if (practiceStartTime > 0) {
         // 计算实际经过的时间(秒)
-        const elapsed = (performance.now() - practiceStartTime) / 1000;
+        const elapsed = (getNow() - practiceStartTime) / 1000;
         practiceDuration.value = Math.floor(practiceAccumulatedTime + elapsed);
         // 继续下一帧更新
-        animationFrameId = requestAnimationFrame(updatePracticeDuration);
+        animationFrameId = requestAnimFrame(updatePracticeDuration);
       }
     };
     
     // 开始动画帧循环
-    animationFrameId = requestAnimationFrame(updatePracticeDuration);
+    animationFrameId = requestAnimFrame(updatePracticeDuration);
   }
   // 停止计时
   const stopTiming = () => {
@@ -460,13 +521,13 @@ export const useExam = () => {
     
     // 取消动画帧
     if (animationFrameId !== null) {
-      cancelAnimationFrame(animationFrameId);
+      cancelAnimFrame(animationFrameId);
       animationFrameId = null;
     }
     
     // 如果正在计时,累加经过的时间
     if (practiceStartTime > 0) {
-      const elapsed = (performance.now() - practiceStartTime) / 1000;
+      const elapsed = (getNow() - practiceStartTime) / 1000;
       practiceAccumulatedTime += elapsed;
       practiceDuration.value = Math.floor(practiceAccumulatedTime);
       practiceStartTime = 0;
@@ -474,7 +535,7 @@ export const useExam = () => {
   }
   const startCount = () => {
     if (countStart === 0) {
-      countStart = performance.now();
+      countStart = getNow();
     }
   }
   const stopCount = () => {
@@ -482,7 +543,7 @@ export const useExam = () => {
     if (countStart === 0) {
       return countTime;
     }
-    countTime += (performance.now() - countStart);
+    countTime += (getNow() - countStart);
     countStart = 0;
     return countTime;
   }
@@ -633,7 +694,7 @@ export const useExam = () => {
     interval && clearInterval(interval);
     interval = null;
     if (animationFrameId !== null) {
-      cancelAnimationFrame(animationFrameId);
+      cancelAnimFrame(animationFrameId);
       animationFrameId = null;
     }
   }

+ 1 - 1
src/main.ts

@@ -60,7 +60,7 @@ export function createApp() {
         actionStyle: { default: () => ({ color: 'var(--primary-color)' }) }
       },
       empty: {
-        icon: { default: '/static/mescroll-empty.png' },
+        icon: { default: '/static/icon-empty.png' },
         height: { default: 140 },
         width: { default: 140 },
         text: { default: '暂无相关数据' }

+ 2 - 1
src/pages.json

@@ -137,7 +137,8 @@
         {
           "path": "pages/exam-start/exam-start",
           "style": {
-            "navigationBarTitleText": ""
+            "navigationBarTitleText": "",
+            "disableScroll": true
           }
         },
         {

+ 1 - 1
src/pagesStudy/components/knowledge-table.vue

@@ -5,7 +5,7 @@
         <view class="">
           <text class="leading-38">{{ item.name }}</text>
           <text v-if="item.directed"
-            class="ml-10 bg-[#F0FDF4] text-[#22C55E] border border-solid border-[#22C55E] text-20 rounded-4 px-10 py-2">定向</text>
+            class="ml-10 bg-[#F0FDF4] text-[#22C55E] border border-solid border-[#22C55E] text-20 rounded-4 px-10 py-2 whitespace-nowrap">定向</text>
         </view>
       </template>
       <template #rate="{ item }">

+ 3 - 8
src/pagesStudy/components/knowledge-tree-node.vue

@@ -17,11 +17,9 @@
             </view>
           </view>
         </view>
-        <slot>
-          <view v-if="nodeData.isLeaf"
-            class="px-20 py-8 border border-solid border-primary rounded-full text-24 text-primary"
-            @click.stop="handleStartPractice">开始练习</view>
-        </slot>
+        <view v-if="nodeData.isLeaf"
+          class="px-20 py-8 border border-solid border-primary rounded-full text-24 text-primary"
+          @click.stop="handleStartPractice">开始练习</view>
       </view>
     </view>
 
@@ -32,9 +30,6 @@
       :style="{ height: measuredHeight + 'px' }">
       <knowledge-tree-node v-for="child in nodeData.children" :key="child.name" :node-data="child"
         :parent-data="nodeData" @start-practice="handleChildStartPractice">
-        <template #default>
-          <slot></slot>
-        </template>
       </knowledge-tree-node>
     </view>
   </view>

+ 2 - 6
src/pagesStudy/components/knowledge-tree.vue

@@ -1,11 +1,7 @@
 <template>
   <view class="knowledge-tree">
-    <knowledge-tree-node v-for="item in initializedData" :key="item.id" :node-data="item"
-      @node-click="handleNodeClick" @start-practice="handleStartPractice">
-      <template #default>
-        <slot></slot>
-      </template>
-    </knowledge-tree-node>
+    <knowledge-tree-node v-for="item in initializedData" :key="item.id" :node-data="item" @node-click="handleNodeClick"
+      @start-practice="handleStartPractice"></knowledge-tree-node>
   </view>
 </template>
 <script lang="ts" setup>

+ 72 - 68
src/pagesStudy/components/practice-table.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="px-30 py-38 bg-white">
+  <view class="px-30 py-30 bg-white">
     <view class="flex gap-x-20">
       <view class="flex items-center gap-x-20 flex-wrap">
         <view class="picker-wrap">
@@ -19,18 +19,27 @@
             </template>
           </ie-picker>
         </view>
-        <view :class="calendarButtonClass" @click="canOpenCalendar ? handleOpenCalendar() : null">
+        <view :class="['btn-wrap transition-all duration-200', calendarButtonClass]"
+          @click="canOpenCalendar ? handleOpenCalendar() : null">
           <text>刷题日历</text>
           <uv-icon name="search" size="16" :color="canOpenCalendar ? 'white' : '#CCCCCC'" />
         </view>
       </view>
     </view>
     <view class="mt-30 flex h-280 gap-x-20">
-      <view class="flex-1 h-full">
+      <view class="flex-1 h-full relative">
         <ie-echart :option="options1" />
+        <div class="absolute top-0 left-0 w-full h-full flex flex-col items-center justify-center">
+          <div class="text-40 text-fore-title font-bold">{{ statistics.total }}</div>
+          <div class="text-22 text-fore-light">刷题总量</div>
+        </div>
       </view>
-      <view class="flex-1 h-full">
+      <view class="flex-1 h-full relative">
         <ie-echart :option="options2" />
+        <div class="absolute top-0 left-0 w-full h-full flex flex-col items-center justify-center">
+          <div class="text-40 text-fore-title font-bold">{{ statistics.rate }}%</div>
+          <div class="text-22 text-fore-light">正确率</div>
+        </div>
       </view>
     </view>
     <view class="mt-30 flex items-center">
@@ -51,66 +60,54 @@
         </template>
       </ie-table>
     </view>
-    <!-- #ifdef H5 -->
-    <teleport to="body">
-      <!-- #endif -->
-      <!-- #ifdef MP-WEIXIN -->
-      <root-portal externalClass="theme-ie">
-        <!-- #endif -->
-        <uv-popup ref="calendarPopupRef" mode="bottom" :round="16" v-if="canOpenCalendar">
-          <view class="h-[480px]">
-            <view class="h-108 flex items-center justify-center border-0 border-b border-solid border-border">
-              <view :class="prevButtonClass" @click="canGoPrev && !loading ? handlePrev() : null">
-                <uv-icon name="arrow-left" size="10" :color="canGoPrev && !loading ? '#808080' : '#CCCCCC'" />
-              </view>
-              <view class="mx-40 text-30 text-fore-title font-bold">
-                <text>{{ calendarTitle }}</text>
-              </view>
-              <view :class="nextButtonClass" @click="canGoNext && !loading ? handleNext() : null">
-                <uv-icon name="arrow-right" size="10" :color="canGoNext && !loading ? '#808080' : '#CCCCCC'" />
-              </view>
+    <ie-popup ref="calendarPopupRef" :showToolbar="false" v-if="canOpenCalendar">
+      <view class="h-[480px]">
+        <view class="h-108 flex items-center justify-center border-0 border-b border-solid border-border">
+          <view :class="['w-38 h-38 rounded-full flex items-center justify-center transition-all duration-200', prevButtonClass]" @click="canGoPrev && !loading ? handlePrev() : null">
+            <uv-icon name="arrow-left" size="12" :color="canGoPrev && !loading ? '#808080' : '#CCCCCC'" />
+          </view>
+          <view class="mx-40 text-30 text-fore-title font-bold">
+            <text>{{ calendarTitle }}</text>
+          </view>
+          <view :class="['w-38 h-38 rounded-full flex items-center justify-center transition-all duration-200', nextButtonClass]" @click="canGoNext && !loading ? handleNext() : null">
+            <uv-icon name="arrow-right" size="12" :color="canGoNext && !loading ? '#808080' : '#CCCCCC'" />
+          </view>
+        </view>
+        <view class="relative">
+          <view class="px-40 py-20 flex items-center justify-between">
+            <view class=" text-28">
+              <text>{{ calendarSubTitle }}</text>
+              <text class="text-32 text-primary font-bold">{{ practiceDays }}</text>
+              <text>天~</text>
             </view>
-            <view class="relative">
-              <view class="px-40 py-20 flex items-center justify-between">
-                <view class=" text-28">
-                  <text>{{ calendarSubTitle }}</text>
-                  <text class="text-32 text-primary font-bold">{{ practiceDays }}</text>
-                  <text>天~</text>
-                </view>
-                <!-- <uv-icon name="question-circle" size="18" color="#31a0fc" /> -->
-              </view>
+            <!-- <uv-icon name="question-circle" size="18" color="#31a0fc" /> -->
+          </view>
 
-              <uni-calendar ref="calendarRef" :insert="true" :lunar="false" :readonly="true" :showMonth="false"
-                :sundayFirst="false" :highlightToday="false" :showToolbar="false" :displayMode="displayMode"
-                :selected="selected" :date="currentDate" @change-week="handleCalendarWeekChange"
-                @monthSwitch="handleCalendarMonthSwitch">
-                <template #calendar-item="{ weeks }">
-                  <view class="calendar-item" :class="{
-                    'calendar-item--week-mode-disabled': weeks.isWeekModeDisabled,
-                    'uni-calendar-item--disable': !weeks.isCurrentMonth,
-                    'calendar-item--valid': weeks.extraInfo && weeks.extraInfo.info >= 70,
-                    'calendar-item--invalid': weeks.extraInfo && weeks.extraInfo.info < 70
-                  }">
-                    <view class="date">{{ weeks.date }}</view>
-                    <view class="info">
-                      <text v-if="weeks.extraInfo && weeks.extraInfo.info">{{ weeks.extraInfo.info }}%</text>
-                    </view>
-                  </view>
-                </template>
-              </uni-calendar>
-              <!-- Loading 覆盖层 -->
-              <view v-if="loading" class="calendar-loading-overlay">
-                <uv-loading-icon mode="circle" size="32" color="#31a0fc" />
+          <uni-calendar ref="calendarRef" :insert="true" :lunar="false" :readonly="true" :showMonth="false"
+            :sundayFirst="false" :highlightToday="false" :showToolbar="false" :displayMode="displayMode"
+            :selected="selected" :date="currentDate" @change-week="handleCalendarWeekChange"
+            @monthSwitch="handleCalendarMonthSwitch">
+            <template #calendar-item="{ weeks }">
+              <view class="calendar-item" :class="{
+                'calendar-item--week-mode-disabled': weeks.isWeekModeDisabled,
+                'uni-calendar-item--disable': !weeks.isCurrentMonth,
+                'calendar-item--valid': weeks.extraInfo && weeks.extraInfo.info >= 70,
+                'calendar-item--invalid': weeks.extraInfo && weeks.extraInfo.info < 70
+              }">
+                <view class="date">{{ weeks.date }}</view>
+                <view class="info">
+                  <text v-if="weeks.extraInfo && weeks.extraInfo.info">{{ weeks.extraInfo.info }}%</text>
+                </view>
               </view>
-            </view>
+            </template>
+          </uni-calendar>
+          <!-- Loading 覆盖层 -->
+          <view v-if="loading" class="calendar-loading-overlay">
+            <uv-loading-icon mode="circle" size="32" color="#31a0fc" />
           </view>
-        </uv-popup>
-        <!-- #ifdef MP-WEIXIN -->
-      </root-portal>
-      <!-- #endif -->
-      <!-- #ifdef H5 -->
-    </teleport>
-    <!-- #endif -->
+        </view>
+      </view>
+    </ie-popup>
   </view>
 </template>
 <script lang="ts" setup>
@@ -186,25 +183,22 @@ const canOpenCalendar = computed(() => {
 // 导航按钮样式计算属性
 const prevButtonClass = computed(() => {
   return {
-    'w-34 h-34 rounded-full flex items-center justify-center transition-all duration-200': true,
-    'bg-[#EEF4FA] cursor-pointer': canGoPrev.value && !loading.value,
-    'bg-[#F5F5F5] cursor-not-allowed': !canGoPrev.value || loading.value,
+    'btn-enable': canGoPrev.value && !loading.value,
+    'btn-disabled': !canGoPrev.value || loading.value,
     'opacity-50': loading.value
   };
 });
 
 const nextButtonClass = computed(() => {
   return {
-    'w-34 h-34 rounded-full flex items-center justify-center transition-all duration-200': true,
-    'bg-[#EEF4FA] cursor-pointer': canGoNext.value && !loading.value,
-    'bg-[#F5F5F5] cursor-not-allowed': !canGoNext.value || loading.value,
+    'btn-enable': canGoNext.value && !loading.value,
+    'btn-disabled': !canGoNext.value || loading.value,
     'opacity-50': loading.value
   };
 });
 
 const calendarButtonClass = computed(() => {
   return {
-    'btn-wrap transition-all duration-200': true,
     'opacity-50 cursor-not-allowed': !canOpenCalendar.value,
     'cursor-pointer': canOpenCalendar.value
   };
@@ -214,6 +208,7 @@ const calendarButtonClass = computed(() => {
 const options1 = computed(() => {
   return {
     title: {
+      show: false,
       text: statistics.value.total.toString(),
       subtext: '{a|刷题总量}',
       left: 'center',
@@ -273,6 +268,7 @@ const options2 = computed(() => {
   const accuracy = statistics.value.rate;
   return {
     title: {
+      show: false,
       text: `${accuracy}%`,
       subtext: '{a|正确率}',
       left: 'center',
@@ -462,13 +458,21 @@ onMounted(async () => {
 </script>
 <style lang="scss" scoped>
 .picker-wrap {
-  @apply flex items-center px-12 w-fit border border-solid border-border rounded-4 h-56;
+  @apply flex items-center px-12 w-fit border border-solid border-border rounded-4 h-56 min-w-140;
 }
 
 .btn-wrap {
   @apply flex items-center gap-x-10 bg-primary text-white text-26 px-10 h-56 rounded-4;
 }
 
+.btn-enable {
+  @apply bg-[#EEF4FA] cursor-pointer;
+}
+
+.btn-disabled {
+  @apply bg-[#F5F5F5] cursor-not-allowed;
+}
+
 .calendar-item {
   @apply rounded-5 text-center w-64 h-56 mx-auto py-8;
 

+ 1 - 1
src/pagesStudy/components/video-table.vue

@@ -1,6 +1,6 @@
 <template>
   <view>
-    <view class="mx-30 mt-20 mb-40 grid grid-cols-2 gap-x-26 gap-y-26">
+    <view class="mx-30 pt-30 mb-40 grid grid-cols-2 gap-x-26 gap-y-26">
       <view v-for="item in stat" :key="item.value" class="relative p-30 rounded-10 bg-back">
         <ie-image :src="item.icon" custom-class="w-52 h-70 absolute top-20 right-25" />
         <view class="text-30 text-fore-light font-bold">{{ item.name }}</view>

+ 2 - 2
src/pagesStudy/pages/exam-start/components/exam-navbar.vue

@@ -1,5 +1,5 @@
 <template>
-  <ie-navbar :title="pageTitle" custom-back @left-click="handleLeftClick">
+  <ie-navbar :left-text="pageTitle" custom-back @left-click="handleLeftClick">
     <template #headerRight>
       <view v-if="!isReadOnly" class="flex items-center gap-x-40 h-full">
         <view class="text-28" :class="{ 'text-red-500': practiceDuration > totalExamTime }">
@@ -7,7 +7,7 @@
         </view>
         <!-- 练习模式才有背题模式 -->
         <view v-if="isPractice" class="px-10 h-full flex items-center" @click="handleMoreClick">
-          <ie-image src="/pagesStudy/static/image/icon-more.png" custom-class="w-38 h-auto" mode="widthFix" />
+          <ie-image src="/pagesStudy/static/image/icon-setting.png" custom-class="w-38 h-auto" mode="widthFix" />
         </view>
       </view>
       <view v-else class="text-28">用时:{{ formatPracticeDuration }}</view>

+ 10 - 1
src/pagesStudy/pages/exam-start/components/exam-swiper.vue

@@ -34,8 +34,17 @@
   </view>
 
 </template>
-
+<!-- <script lang="ts">
+export default {
+  name: 'ExamSwiper'
+}
+</script> -->
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import { Study, Transfer } from '@/types';
 import QuestionItem from './question-item.vue';
 import { useExam } from '@/composables/useExam';

+ 7 - 1
src/pagesStudy/pages/exam-start/components/exam-toolbar.vue

@@ -1,6 +1,7 @@
 <template>
   <ie-safe-toolbar :height="64" :shadow="false">
-    <view class="px-18 h-full flex items-center justify-around border-0 border-t border-solid border-[#EFEFEF]">
+    <view
+      class="px-18 h-full flex items-center justify-around bg-white border-0 border-t border-solid border-[#EFEFEF]">
       <view class="min-w-100 flex flex-col items-center" id="question-calendar-btn" @click="handleCalendar">
         <view class="w-48 h-48 flex items-center justify-center">
           <uv-icon name="calendar" size="26" />
@@ -34,6 +35,11 @@
   <question-correct-popup ref="questionCorrectPopupRef" @close="beforeClose" />
 </template>
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import ExamStatsCard from './exam-stats-card.vue';
 import QuestionCorrectPopup from './question-correct-popup.vue';
 import { Study, Transfer } from '@/types';

+ 27 - 41
src/pagesStudy/pages/exam-start/components/question-correct-popup.vue

@@ -1,48 +1,34 @@
 <template>
-  <!-- #ifdef H5 -->
-  <teleport to="body">
-    <!-- #endif -->
-    <!-- #ifdef MP-WEIXIN -->
-    <root-portal externalClass="theme-ie">
-      <!-- #endif -->
-      <uv-popup ref="popupRef" mode="center" :close-on-click-overlay="false" :closeable="false" :round="12">
-        <view class="theme-ie popup-content box-border bg-white">
-          <view class="popup-header">
-            <view class="popup-header-title">
-              <text>试题纠错</text>
-            </view>
-          </view>
-          <view class="px-30">
-            <view class="h-60 flex items-center justify-between border-0 border-b border-solid border-[#efefef]">
-              <view class="flex items-center gap-x-10">
-                <text>试题编号</text>
-                <ie-image src="/static/image/icon-lock.png" custom-class="w-26 h-26" mode="aspectFit" />
-              </view>
-              <text class="text-fore-light">{{ questionId }}</text>
-            </view>
-            <view class="mt-30">
-              <uv-textarea v-model="remark" placeholder="在这里填写问题描述" count :height="100" :maxlength="200" />
-            </view>
-          </view>
-          <view class="mt-50 mx-30 mb-30 flex items-center gap-x-30">
-            <view class="flex-1">
-              <uv-button type="error" plain shape="circle" @click="close">取消</uv-button>
-            </view>
-            <view class="flex-1">
-              <uv-button type="primary" shape="circle" :disabled="submitBtnDisabled"
-                @click="handleSubmit">提交</uv-button>
-            </view>
+  <ie-popup ref="popupRef" mode="center" :close-on-click-overlay="false" :showToolbar="false" :round="16">
+    <view class="popup-content">
+      <view class="popup-header">
+        <view class="popup-header-title">
+          <text>试题纠错</text>
+        </view>
+      </view>
+      <view class="px-30">
+        <view class="h-60 flex items-center justify-between border-0 border-b border-solid border-[#efefef]">
+          <view class="flex items-center gap-x-10">
+            <text>试题编号</text>
+            <ie-image src="/static/image/icon-lock.png" custom-class="w-26 h-26" mode="aspectFit" />
           </view>
+          <text class="text-fore-light">{{ questionId }}</text>
+        </view>
+        <view class="mt-30">
+          <uv-textarea v-model="remark" placeholder="在这里填写问题描述" count :height="100" :maxlength="200" />
         </view>
-      </uv-popup>
-      <!-- #ifdef MP-WEIXIN -->
-    </root-portal>
-    <!-- #endif -->
-    <!-- #ifdef H5 -->
-  </teleport>
-  <!-- #endif -->
+      </view>
+      <view class="mt-50 mx-30 mb-30 flex items-center gap-x-30">
+        <view class="flex-1">
+          <uv-button type="error" plain shape="circle" @click="close">取消</uv-button>
+        </view>
+        <view class="flex-1">
+          <uv-button type="primary" shape="circle" :disabled="submitBtnDisabled" @click="handleSubmit">提交</uv-button>
+        </view>
+      </view>
+    </view>
+  </ie-popup>
 </template>
-
 <script lang="ts" setup>
 import { correctQuestion } from '@/api/modules/study';
 const popupRef = ref();

+ 2 - 2
src/pagesStudy/pages/exam-start/components/question-swiper-tip.vue

@@ -1,6 +1,6 @@
 <template>
   <!-- 使用 class 动画实现渐入渐出,兼容微信小程序 -->
-  <view v-if="isShowing" class="swiper-tip-container" :class="{ 'is-fading-out': isFadingOut }">
+  <view v-if="isShowing" class="swiper-tip-container theme-ie" :class="{ 'is-fading-out': isFadingOut }">
     <!-- 半透明遮罩层(先显示)-->
     <view class="mask-overlay" :class="{ 'is-fading-out': isFadingOut }"></view>
     
@@ -33,7 +33,7 @@
 
         <!-- 下一步按钮(绝对定位在中间文字下方) -->
         <view v-if="showNextButton" class="next-button-wrapper">
-          <view class="next-button" @click="handleNext">
+          <view class="next-button bg-primary" @click="handleNext">
             <text class="button-text">下一步</text>
           </view>
         </view>

+ 17 - 6
src/pagesStudy/pages/exam-start/exam-start.vue

@@ -2,13 +2,13 @@
   <ie-page :fix-height="true" :safe-area-inset-bottom="false">
     <block v-if="isReady">
       <exam-navbar :total-exam-time="totalExamTime" @left-click="handleLeftClick" @right-click="handleRightClick" />
-      <exam-subtitle />
+      <exam-subtitle :total-exam-time="totalExamTime" />
       <exam-swiper @submit="beforeSubmit" />
-      <exam-toolbar @submit="beforeSubmit" />
+      <exam-toolbar ref="examToolbarRef" @submit="beforeSubmit" />
     </block>
   </ie-page>
-  <fast-guide v-model:show="guideShow" :list="guideList" v-model:index="guideIndex"
-    @close="handleGuideClose"></fast-guide>
+  <fast-guide v-model:show="guideShow" :list="guideList" v-model:index="guideIndex" @close="handleGuideClose"
+    @getQuery="getQuery"></fast-guide>
   <question-swiper-tip :visible="showSwiperTip" @next="handleSwiperTipNext" />
   <exam-mode ref="examModeRef" />
 </template>
@@ -46,21 +46,25 @@ const showSwiperTip = ref(false);
 const guideShow = ref(false);
 const guideList = ref([
   {
+    ref: 'examToolbarRef',
     target: '#question-calendar-btn',
     position: 'top',
     msg: '[答题卡]\n查看答题卡,掌握考试进度'
   },
   {
+    ref: 'examToolbarRef',
     target: '#question-favorite-btn',
     position: 'top',
     msg: '[题目收藏]\n收藏的题目可以在收藏夹查看'
   },
   {
+    ref: 'examToolbarRef',
     target: '#question-mark-btn',
     position: 'top',
     msg: '[题目标记]\n标记的题目可以在答题卡中快速找到'
   },
   {
+    ref: 'examToolbarRef',
     target: '#question-correct-btn',
     position: 'top',
     msg: '[试题纠错]\n点击试题纠错,帮助我们改进题目'
@@ -74,7 +78,7 @@ const totalExamTime = ref<number>(0);
 const hasShowSubmitConfirm = ref(false);
 const examineeId = ref<number | undefined>(undefined);
 const paperData = ref<Study.ExamPaper>({} as Study.ExamPaper);
-
+const examToolbarRef = ref();
 /**
  * 自动提交
  */
@@ -117,6 +121,11 @@ const handleRightClick = () => {
   examModeRef.value.open();
 }
 
+const instance = getCurrentInstance();
+const getQuery = (fn: () => void) => {
+  fn.call(instance?.proxy)
+}
+
 const beforeQuit = () => {
   const { paperType } = prevData.value;
   if (!isReady.value || isReadOnly.value) {
@@ -364,7 +373,9 @@ const handleSwiperTipNext = () => {
 }
 const handleGuideClose = () => {
   userStore.isExamGuideShow = true;
-  startTime();
+  if (!isReadOnly.value) {
+    startTime();
+  }
 }
 const loadData = async () => {
   uni.$ie.showLoading();

+ 53 - 51
src/pagesStudy/pages/index/index.vue

@@ -1,65 +1,67 @@
 <template>
-  <ie-page ref="iePageRef" bg-color="#f6f8fa">
-    <ie-navbar>
-      <template #headerLeft>
-        <view class="flex items-center">
-          <uv-icon name="arrow-left" size="20px" color="#333"></uv-icon>
-          <ie-image :is-oss="true" src="/study-title.png" custom-class="ml-8 w-148 h-36" mode="heightFix" />
-          <view class="w-6 h-6 rounded-2 bg-black mx-12"></view>
-          <view>
-            <ie-dict :dict-name="EnumDictName.EXAM_TYPE" :dict-value="userStore.getExamType || '--'" />
+  <ie-page ref="iePageRef" bg-color="#FFFFFF" safe-area-inset-bottom-color="#f2f3f7">
+    <view>
+      <ie-navbar>
+        <template #headerLeft>
+          <view class="flex items-center">
+            <uv-icon name="arrow-left" size="20px" color="#333" bold></uv-icon>
+            <ie-image :is-oss="true" src="/study-title.png" custom-class="ml-8 w-148 h-36" mode="heightFix" />
+            <view class="w-6 h-6 rounded-2 bg-black mx-12"></view>
+            <view>
+              <ie-dict :dict-name="EnumDictName.EXAM_TYPE" :dict-value="userStore.getExamType || '--'" />
+            </view>
+          </view>
+        </template>
+      </ie-navbar>
+      <view class="mx-30 mt-20 flex items-center bg-[#E3F4FA] rounded-8 py-16 px-16 gap-x-40">
+        <view class="text-24 text-[#34B0D7] flex-1">
+          <text v-if="!hasDirectedSchool">你还未开启定向学习,快来设置吧!</text>
+          <view v-else class="flex items-center">
+            <text class="flex-shrink-0">定向:</text>
+            <text class="min-w-1 ellipsis-1">{{ firstDirectedSchool.universityName }}</text>
+            <uv-icon name="arrow-right" size="14" color="#0DACF5"></uv-icon>
+            <text class="flex-shrink-0">{{ firstDirectedSchool.majorName }}</text>
           </view>
         </view>
-      </template>
-    </ie-navbar>
-    <view class="mx-30 mt-20 flex items-center bg-[#E3F4FA] rounded-8 py-16 px-16 gap-x-40">
-      <view class="text-24 text-[#34B0D7] flex-1">
-        <text v-if="!hasDirectedSchool">你还未开启定向学习,快来设置吧!</text>
-        <view v-else class="flex items-center">
-          <text class="flex-shrink-0">定向:</text>
-          <text class="min-w-1 ellipsis-1">{{ firstDirectedSchool.universityName }}</text>
-          <uv-icon name="arrow-right" size="14" color="#0DACF5"></uv-icon>
-          <text class="flex-shrink-0">{{ firstDirectedSchool.majorName }}</text>
-        </view>
+        <view class="text-24 text-white bg-gradient-to-r from-[#26C5F7] to-[#0DACF5] rounded-full px-18 py-6"
+          @click="handleSetting">{{ hasDirectedSchool ? '已开启' : '去开启' }}</view>
       </view>
-      <view class="text-24 text-white bg-gradient-to-r from-[#26C5F7] to-[#0DACF5] rounded-full px-18 py-6"
-        @click="handleSetting">{{ hasDirectedSchool ? '已开启' : '去开启' }}</view>
-    </view>
-    <view class="mx-30 mt-20">
-      <view class="flex items-center gap-x-28">
-        <view class="bg-gradient-to-r from-[#0088FE] to-[#31A0FC] flex-1 rounded-15 relative overflow-hidden">
-          <view class="mt-30 p-30 z-1 relative">
-            <view class="text-30 text-white font-bold">全量刷题</view>
-            <view class="mt-8 text-24 text-white">全面刷题,高效备考</view>
-            <view class="mt-32 w-200 h-56 flex items-center justify-center rounded-full text-26 text-primary bg-white"
-              @click="handlePracticeAll">
-              开始练习
+      <view class="mx-30 mt-20">
+        <view class="flex items-center gap-x-28">
+          <view class="bg-gradient-to-r from-[#0088FE] to-[#31A0FC] flex-1 rounded-15 relative overflow-hidden">
+            <view class="mt-30 p-30 z-1 relative">
+              <view class="text-30 text-white font-bold">全量刷题</view>
+              <view class="mt-8 text-24 text-white">全面刷题,高效备考</view>
+              <view class="mt-32 w-200 h-56 flex items-center justify-center rounded-full text-26 text-primary bg-white"
+                @click="handlePracticeAll">
+                开始练习
+              </view>
             </view>
+            <ie-image :is-oss="true" src="/study-bg13.png" custom-class="absolute bottom-0 left-0 w-full h-full z-0"
+              mode="aspectFill" />
           </view>
-          <ie-image :is-oss="true" src="/study-bg13.png" custom-class="absolute bottom-0 left-0 w-full h-full z-0"
-            mode="aspectFill" />
-        </view>
-        <view class="bg-gradient-to-r from-[#32B5FD] to-[#79DCFD] flex-1 rounded-15 relative overflow-hidden">
-          <view class="mt-30 p-30 z-1 relative">
-            <view class="text-30 text-white font-bold">定向刷题</view>
-            <view class="mt-8 text-24 text-white">紧扣考纲,精准练习</view>
-            <view class="mt-32 w-200 h-56 flex items-center justify-center rounded-full text-26 text-primary bg-white"
-              @click="handlePracticeDirected">
-              开始练习
+          <view class="bg-gradient-to-r from-[#32B5FD] to-[#79DCFD] flex-1 rounded-15 relative overflow-hidden">
+            <view class="mt-30 p-30 z-1 relative">
+              <view class="text-30 text-white font-bold">定向刷题</view>
+              <view class="mt-8 text-24 text-white">紧扣考纲,精准练习</view>
+              <view class="mt-32 w-200 h-56 flex items-center justify-center rounded-full text-26 text-primary bg-white"
+                @click="handlePracticeDirected">
+                开始练习
+              </view>
             </view>
+            <ie-image :is-oss="true" src="/study-bg13.png" custom-class="absolute bottom-0 left-0 w-full h-full z-0"
+              mode="aspectFill" />
           </view>
-          <ie-image :is-oss="true" src="/study-bg13.png" custom-class="absolute bottom-0 left-0 w-full h-full z-0"
-            mode="aspectFill" />
         </view>
       </view>
+      <index-menu />
+      <index-banner />
+      <block v-if="hasTestAndRecord">
+        <view class="h-16 bg-back my-32"></view>
+        <index-test :directed-school="firstDirectedSchool" />
+        <index-exam-record />
+      </block>
     </view>
-    <index-menu />
-    <index-banner />
-    <block v-if="hasTestAndRecord">
-      <view class="h-16 bg-back my-32"></view>
-      <index-test :directed-school="firstDirectedSchool" />
-      <index-exam-record />
-    </block>
   </ie-page>
 </template>
 

+ 3 - 3
src/pagesStudy/pages/knowledge-practice-detail/knowledge-practice-detail.vue

@@ -1,5 +1,5 @@
 <template>
-  <ie-page bg-color="#F6F8FA" :fix-height="true">
+  <ie-page bg-color="#F6F8FA" safe-area-inset-bottom-color="#FFFFFF" :fix-height="true">
     <ie-navbar :title="pageTitle" />
     <view v-if="examineeData" class="relative z-3 pt-30 pb-20 mx-30">
       <view class="bg-white rounded-15 px-20 pb-1">
@@ -27,10 +27,10 @@
     </view>
     <ie-safe-toolbar :height="84" :shadow="false">
       <view class="h-[84px] px-46 bg-white flex items-center justify-between gap-x-40">
-        <view class="text-30 text-primary bg-back flex-1 py-22 rounded-full text-center" @click="handleStartPractice">
+        <view class="text-30 text-primary bg-back flex-1 py-22 rounded-full text-center h-fit" @click="handleStartPractice">
           继续刷题
         </view>
-        <view class="text-30 text-white bg-primary flex-1 py-22 rounded-full text-center" @click="handleViewAnalysis">
+        <view class="text-30 text-white bg-primary flex-1 py-22 rounded-full text-center h-fit" @click="handleViewAnalysis">
           查看解析
         </view>
       </view>

+ 3 - 2
src/pagesStudy/pages/knowledge-practice-history/knowledge-practice-history.vue

@@ -1,10 +1,11 @@
 <template>
-  <ie-page bg-color="#F6F8FA" :fix-height="true">
+  <ie-page bg-color="#FFFFFF" :fix-height="true">
     <z-paging ref="pagingRef" v-model="historyList" :loading-more-enabled="false" @query="handleQuery">
       <template #top>
         <ie-navbar title="刷题记录" />
       </template>
-      <view class="mt-20">
+      <view class="h-20 bg-[#F6F8FA]"></view>
+      <view class="safe-area-inset-bottom">
         <view v-for="(item, index) in historyList" :key="index"
           class="bg-white px-40 py-30 flex items-center sibling-border-top">
           <view class="flex-1">

+ 1 - 1
src/pagesStudy/pages/knowledge-practice/knowledge-practice.vue

@@ -12,7 +12,7 @@
           </view>
         </view>
       </template>
-      <view class="px-40">
+      <view class="px-40 safe-area-inset-bottom">
         <knowledgeTree :tree-data="treeData" @start-practice="handleStartPractice" />
       </view>
     </z-paging>

+ 6 - 3
src/pagesStudy/pages/simulation-analysis/simulation-analysis.vue

@@ -3,9 +3,9 @@
     <ie-navbar title="考试分析" transparent bg-color="#FFFFFF" title-color="black" :keep-title-color="true" />
     <view class="relative">
       <ie-image :is-oss="true" src="/study-bg11.png" custom-class="w-full h-[545rpx] absolute top-0 left-0 z-0" />
-      <ie-image :is-oss="true" src="/study-bg12.png" custom-class="w-308 h-302 absolute top-57 right-14 z-1" />
-      <ie-image :is-oss="true" src="/study-title4.png" custom-class="w-282 h-64 absolute top-126 left-72 z-2" />
-      <view v-if="examineeData" class="relative z-3 pt-244 pb-20 mx-30">
+      <ie-image :is-oss="true" src="/study-bg12.png" :custom-class="`w-308 h-302 absolute right-14 z-1 ${appStore.isH5 ? 'top-57' : 'top-127'}`" />
+      <ie-image :is-oss="true" src="/study-title4.png" :custom-class="`w-282 h-64 absolute left-72 z-2 ${appStore.isH5 ? 'top-126' : 'top-196'}`" />
+      <view v-if="examineeData" :class="`relative z-3 pb-20 mx-30 ${appStore.isH5 ? 'pt-244' : 'pt-314'}`">
         <view class="bg-white rounded-15 px-20 pb-1">
           <rate-chart :value="rightRate" />
           <view class="h-1 bg-[#E6E6E6] my-20"></view>
@@ -40,8 +40,11 @@ import ExamStat from './components/exam-stat.vue';
 import ScoreStat from './components/score-stat.vue';
 import { getExamineeResult } from '@/api/modules/study';
 import { useTransferPage } from '@/hooks/useTransferPage';
+import { useAppStore } from '@/store/appStore';
 import { Study, Transfer } from '@/types';
 import { EnumPaperType, EnumQuestionType } from '@/common/enum';
+
+const appStore = useAppStore();
 const { prevData, transferTo } = useTransferPage<Transfer.SimulationAnalysisPageOptions, Transfer.ExamAnalysisPageOptions>();
 const examineeData = ref<Study.Examinee>();
   const titleMap = {

+ 28 - 20
src/pagesStudy/pages/study-history/components/exam-history-student.vue

@@ -1,15 +1,17 @@
 <template>
   <view class="pb-30">
-    <view v-if="examType === EnumExamRecordType.SIMULATED" class="px-30">
-      <view class="sibling-border-top px-20 py-30" v-for="(item, index) in simulatedRecordList" :key="index">
-        <exam-record-item :data="item" />
+    <ie-empty :value="simulatedRecordList.length !== 0 || paperWorkRecordList.length !== 0" :loading="loading">
+      <view v-if="examType === EnumExamRecordType.SIMULATED" class="px-30">
+        <view class="sibling-border-top px-20 py-30" v-for="(item, index) in simulatedRecordList" :key="index">
+          <exam-record-item :data="item" />
+        </view>
       </view>
-    </view>
-    <template v-else>
-      <view class="sibling-border-top" v-for="(item, index) in paperWorkRecordList" :key="index">
-        <paper-work-item :data="item" />
-      </view>
-    </template>
+      <template v-else>
+        <view class="sibling-border-top" v-for="(item, index) in paperWorkRecordList" :key="index">
+          <paper-work-item :data="item" />
+        </view>
+      </template>
+    </ie-empty>
   </view>
 </template>
 <script lang="ts" setup>
@@ -26,15 +28,23 @@ const props = defineProps({
 });
 const simulatedRecordList = ref<Study.SimulatedRecord[]>([]);
 const paperWorkRecordList = ref<Study.PaperWork[]>([]);
+const loading = ref(false);
 const loadData = async (type: string) => {
-  simulatedRecordList.value = [];
-  paperWorkRecordList.value = [];
-  if (type === EnumExamRecordType.SIMULATED) {
-    const { data } = await getSimulatedRecord();
-    simulatedRecordList.value = data;
-  } else {
-    const { rows } = await getPaperWorkList({ state: EnumPaperWorkState.COMPLETED });
-    paperWorkRecordList.value = rows;
+  loading.value = true;
+  try {
+    simulatedRecordList.value = [];
+    paperWorkRecordList.value = [];
+    if (type === EnumExamRecordType.SIMULATED) {
+      const { data } = await getSimulatedRecord();
+      simulatedRecordList.value = data;
+    } else {
+      const { rows } = await getPaperWorkList({ state: EnumPaperWorkState.COMPLETED });
+      paperWorkRecordList.value = rows;
+    }
+  } catch (error) {
+    console.error(error);
+  } finally {
+    loading.value = false;
   }
 }
 
@@ -43,8 +53,6 @@ watch(() => props.examType, (newVal) => {
 }, {
   immediate: false
 });
-onShow(() => {
-  loadData(props.examType);
-});
+loadData(props.examType);
 </script>
 <style lang="scss" scoped></style>

+ 6 - 1
src/pagesStudy/pages/study-history/components/exam-history.vue

@@ -1,6 +1,6 @@
 <template>
   <view class="flex-1 min-h-1 bg-white">
-    <view class="px-30 py-20 flex gap-x-20">
+    <view class="px-30 py-30 flex gap-x-20">
       <view class="exam-type-item" :class="{ 'is-active': examType === EnumExamRecordType.SIMULATED }"
         @click="handleChangeExamType(EnumExamRecordType.SIMULATED)">
         <ie-image src="/pagesStudy/static/image/icon-exam-test.png" custom-class="w-64 h-60" />
@@ -17,6 +17,11 @@
   </view>
 </template>
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import { EnumExamRecordType } from '@/common/enum';
 import examHistoryStudent from './exam-history-student.vue';
 import examHistoryTeacher from './exam-history-teacher.vue';

+ 1 - 3
src/pagesStudy/pages/study-history/components/knowledge-history-student.vue

@@ -22,8 +22,6 @@ const loadData = async () => {
     uni.$ie.hideLoading();
   }
 }
-onLoad(() => {
-  loadData();
-});
+loadData();
 </script>
 <style lang="scss" scoped></style>

+ 5 - 0
src/pagesStudy/pages/study-history/components/knowledge-history.vue

@@ -9,6 +9,11 @@
   </view>
 </template>
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import teacherClassView from '@/pagesStudy/components/teacher-class-view.vue';
 import knowledgeHistoryStudent from './knowledge-history-student.vue';
 import knowledgeHistoryTeacher from './knowledge-history-teacher.vue';

+ 5 - 0
src/pagesStudy/pages/study-history/components/practice-history.vue

@@ -19,6 +19,11 @@
   </view>
 </template>
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import practiceHistoryStudent from './practice-history-student.vue';
 import practiceHistoryTeacher from './practice-history-teacher.vue';
 import teacherClassView from '@/pagesStudy/components/teacher-class-view.vue';

+ 5 - 0
src/pagesStudy/pages/study-history/components/video-history.vue

@@ -12,6 +12,11 @@
   </view>
 </template>
 <script lang="ts" setup>
+defineOptions({
+  options: {
+    virtualHost: true
+  }
+});
 import videoHistoryStudent from './video-history-student.vue';
 import videoHistoryTeacher from './video-history-teacher.vue';
 import teacherClassView from '@/pagesStudy/components/teacher-class-view.vue';

+ 2 - 2
src/pagesStudy/pages/study-history/study-history.vue

@@ -1,11 +1,11 @@
 <template>
-  <ie-page bg-color="#F6F8FA" :fix-height="true">
+  <ie-page bg-color="#FFFFFF" :fix-height="true">
     <ie-navbar title="学习记录" />
     <view class="bg-white sticky z-1" :style="{ top: baseStickyTop + 'px' }">
       <uv-tabs :list="list" :current="current" :activeStyle="activeStyle" :inactiveStyle="inactiveStyle"
         :scrollable="false" @change="handleTabChange"></uv-tabs>
     </view>
-    <view class="h-20"></view>
+    <view class="h-20 bg-[#F6F8FA]"></view>
     <knowledge-history v-if="current === 0" />
     <exam-history v-if="current === 1" />
     <practice-history v-if="current === 2" />

BIN
src/pagesStudy/static/image/icon-drag.png


BIN
src/pagesStudy/static/image/icon-more.png


BIN
src/pagesStudy/static/image/icon-setting.png


+ 8 - 3
src/pagesSystem/pages/login/login.vue

@@ -1,8 +1,8 @@
 <template>
   <ie-page bgColor="white">
-    <ie-navbar title="" :placeholder="false" bgColor="transparent" />
+    <ie-navbar title="" :hide-back="hideBack" :placeholder="false" bgColor="transparent" />
     <ie-image :is-oss="true" src="/login-bg.png" custom-class="w-full min-h-350 absolute top-0 left-0 z-1" />
-    <ie-image :is-oss="true" src="/login-title.png" custom-class="w-auto h-96 mx-auto mt-240" mode="heightFix" />
+    <ie-image :is-oss="true" src="/login-title.png" custom-class="w-full h-96 mx-auto mt-240" mode="heightFix" />
     <view class="relative z-2 mx-46 mt-178">
       <view class="ml-18 flex items-center">
         <view class="text-32" :class="{ 'is-active': loginType === 'card' }" @click="changeLoginType('card')">
@@ -65,10 +65,11 @@ import { verifyCard } from '@/api/modules/user';
 import { EnumBindScene, EnumSmsApiType, EnumUserType } from '@/common/enum';
 import { login } from '@/api/modules/login';
 import { LoginRequestDTO, MobileLoginResponseDTO, UserInfo } from '@/types/user';
+
 const { transferBack, transferTo } = useTransferPage();
 const userStore = useUserStore();
 const { isSmsCaptchaEnable } = useAppConfig();
-
+const hideBack = ref(false);
 const loginType = ref('card');
 const phone = ref('');
 const password = ref('');
@@ -264,6 +265,10 @@ const handleValid = (data: { code: string; uuid: string }) => {
   submitLogin();
 }
 
+onShow(() => {
+  const pages = getCurrentPages();
+  hideBack.value = pages.length <= 1;
+});
 
 onLoad(() => {
   rememberPassword.value[0] = userStore.rememberPwd;

BIN
src/static/image/icon-empty.png


+ 61 - 48
src/static/theme/theme.module.scss

@@ -1,74 +1,87 @@
 // 生成颜色阶梯的函数
 @function generate-color-scale($color) {
-  $scale: (
+  $scale: ();
+  
+  // 50-950 的颜色阶梯
+  $steps: (
+    50: 0.95,  // 95% 白色
+    100: 0.9,  // 90% 白色
+    200: 0.8,  // 80% 白色
+    300: 0.7,  // 70% 白色
+    400: 0.6,  // 60% 白色
+    500: 0.5,  // 50% 白色
+    600: 0.4,  // 40% 白色
+    700: 0.3,  // 30% 白色
+    800: 0.2,  // 20% 白色
+    900: 0.1,  // 10% 白色
+    950: 0.05  // 5% 白色
   );
-
-// 50-950 的颜色阶梯
-$steps: (
-  50: 0.95,
-  // 95% 白色
-  100: 0.9,
-  // 90% 白色
-  200: 0.8,
-  // 80% 白色
-  300: 0.7,
-  // 70% 白色
-  400: 0.6,
-  // 60% 白色
-  500: 0.5,
-  // 50% 白色
-  600: 0.4,
-  // 40% 白色
-  700: 0.3,
-  // 30% 白色
-  800: 0.2,
-  // 20% 白色
-  900: 0.1,
-  // 10% 白色
-  950: 0.05 // 5% 白色
-);
-
-@each $step, $weight in $steps {
-  $mixed-color: mix(white, $color, $weight * 100%);
-  $scale: map-merge($scale, ($step: $mixed-color ));
-}
-
-@return $scale;
+  
+  @each $step, $weight in $steps {
+    $mixed-color: mix(white, $color, $weight * 100%);
+    $scale: map-merge($scale, (
+      $step: $mixed-color
+    ));
+  }
+  
+  @return $scale;
 }
 
 @each $name, $color in $themes {
   $color-scale: generate-color-scale($color);
-  $light-color: map-get($base, $name + '-light');
-
+  $light-color: map-get($themes, $name + '-light');
   .theme-#{$name} {
-
     // 生成所有颜色阶梯的CSS变量
     @each $step, $value in $color-scale {
       --primary-color-#{$step}: #{$value};
     }
-
+    
     // 保持原有的主色调
     --primary-color: #{$color};
     --primary-light-color: #{$light-color};
-
-    @each $name_base, $color_base in $base {
-      --#{$name_base}: #{$color_base};
-    }
   }
-
+  
   // 在同一个循环中导出JavaScript变量
   :export {
     #{$name}: $color;
-
+    
     @each $step, $value in $color-scale {
       #{$name}-#{$step}: $value;
     }
   }
 }
 
-// 导出所有基础颜色
-@each $name, $color in $base {
-  :export {
-    #{$name}: $color;
-  }
+page, .theme-ie {
+  --fore-title: #222;
+  --fore-subtitle: #333;
+  --fore-content: #555;
+  --fore-tip: #777;
+  --fore-light: #999;
+  --fore-disabled: #b9bcc5;
+  //
+  --back: #f2f3f7;
+  --back-light: #f7f8fa;
+  //
+  --border: #dadbde;
+  --border-light: #e5e6e9;
+  //
+  --warning: #f9ae3d;
+  --warning-dark: #f79824;
+  --warning-disabled: #f9d39b;
+  --warning-light: #fdf6ec;
+  //
+  --success: #5ac725;
+  --success-dark: #53c21d;
+  --success-disabled: #a9e08f;
+  --success-light: #f5fff0;
+  //
+  --danger: #f72620;
+  --danger-dark: #e45656;
+  --danger-disabled: #f7b2b2;
+  --danger-light: #fef0f0;
+  //
+  --info: #909399;
+  --info-dark: #767a82;
+  --info-disabled: #c4c6c9;
+  --info-light: #f4f4f5;
 }

+ 1 - 74
src/static/theme/var.scss

@@ -1,78 +1,5 @@
 $ie: #31A0FC;
 $ie-light: #E5F1ED;
 
-// 基础色,不随主题改变
-$fore-title: #222;
-$fore-subtitle: #333;
-$fore-content: #555;
-$fore-subcontent: #666;
-$fore-tip: #777;
-$fore-tip-light: #808080;
-$fore-light: #999;
-$fore-disabled: #b9bcc5;
-$fore-placeholder: #B3B3B3;
+$themes: map-merge((), ('ie': $ie));
 
-$border: #E6E6E6;
-
-$back: #F6F8FA;
-$back-light: #f7f8fa;
-
-$warning: #f9ae3d;
-$warning-dark: #f79824;
-$warning-disabled: #f9d39b;
-$warning-light: #fdf6ec;
-
-$success: #19a237;
-$success-dark: #14822e;
-$success-disabled: #a9e08f;
-$success-light: #f5fff0;
-
-$danger: #f72620;
-$danger-dark: #e45656;
-$danger-disabled: #f7b2b2;
-$danger-light: #fef0f0;
-
-$info: #909399;
-$info-dark: #767a82;
-$info-disabled: #c4c6c9;
-$info-light: #f4f4f5;
-
-$themes: map-merge((), ('ie': $ie,
-    ));
-
-$base: map-merge((), ('ie-light': $ie-light,
-
-      'fore-title': $fore-title,
-      'fore-subtitle': $fore-subtitle,
-      'fore-content': $fore-content,
-      'fore-subcontent': $fore-subcontent,
-      'fore-tip': $fore-tip,
-      'fore-light': $fore-light,
-      'fore-disabled': $fore-disabled,
-      'fore-placeholder': $fore-placeholder,
-
-      'border': $border,
-
-      'back': $back,
-      'back-light': $back-light,
-
-      'warning': $warning,
-      'warning-dark': $warning-dark,
-      'warning-disabled': $warning-disabled,
-      'warning-light': $warning-light,
-
-      'success': $success,
-      'success-dark': $success-dark,
-      'success-disabled': $success-disabled,
-      'success-light': $success-light,
-
-      'danger': $danger,
-      'danger-dark': $danger-dark,
-      'danger-disabled': $danger-disabled,
-      'danger-light': $danger-light,
-
-      'info': $info,
-      'info-dark': $info-dark,
-      'info-disabled': $info-disabled,
-      'info-light': $info-light,
-    ));

+ 35 - 1
src/uni.scss

@@ -13,7 +13,41 @@
  */
 @import '@/static/theme/var.scss';
 /* 颜色变量 */
-@import "@/uni_modules/uv-ui-tools/theme.scss";
+$safe-area: constant(safe-area-inset-bottom);
+$safe-area: env(safe-area-inset-bottom);
+
+$uv-main-color: var(--fore-subtitle);
+$uv-content-color: var(--fore-content);
+$uv-tips-color: var(--fore-tip);
+$uv-light-color: var(--fore-light);
+$uv-border-color: var(--border);
+$uv-bg-color: var(--back);
+$uv-disabled-color: var(--fore-disabled);
+
+$uv-primary: var(--primary-color);
+$uv-primary-dark: var(--primary-color);
+$uv-primary-disabled: var(--primary-color-500);
+$uv-primary-light: var(--primary-color-200);
+
+$uv-warning: var(--warning);
+$uv-warning-dark: var(--warning-dark);
+$uv-warning-disabled: var(--warning-disabled);
+$uv-warning-light: var(--warning-light);
+
+$uv-success: var(--success);
+$uv-success-dark: var(--success-dark);
+$uv-success-disabled: var(--success-disabled);
+$uv-success-light: var(--success-light);
+
+$uv-error: var(--danger);
+$uv-error-dark: var(--danger-dark);
+$uv-error-disabled: var(--danger-disabled);
+$uv-error-light: var(--danger-light);
+
+$uv-info: var(--info);
+$uv-info-dark: var(--info-dark);
+$uv-info-disabled: var(--info-disabled);
+$uv-info-light: var(--info-light);
 
 /* 行为相关颜色 */
 $uni-color-primary: var(--primary-color);

+ 94 - 30
src/uni_modules/fast-guide/components/fast-guide/fast-guide.vue

@@ -2,7 +2,7 @@
   <view v-if="show" @click="focusTap" @touchmove.stop.prevent :style="{ '--path': path, '--duration': duration + 'ms' }"
     class="clip-container">
     <view @click.stop="maskTap" class="clip-box"></view>
-    <view @click.stop class="guide-box animate__animated" :class="[contentVisible ? 'opacity-100' : 'opacity-0']"
+    <view @click.stop class="guide-box animate__animated"
       :style="[msgStyles]">
       <view v-if="$slots.message" class="">
         <slot name="message" :msg="list[index].msg"></slot>
@@ -78,8 +78,10 @@ export default {
   data() {
     return {
       path: path_default,
-      msgStyles: {},
-      contentVisible: false
+      msgStyles: {
+        opacity: '0' // 初始时隐藏,避免闪烁
+      },
+      isFirstShow: true // 标记是否是第一次显示
     }
   },
   props: {
@@ -116,6 +118,7 @@ export default {
     show: {
       handler(newVal) {
         if (newVal == true) {
+          this.isFirstShow = true; // 重置为第一次显示
           this.getCurrentPath()
           this.$emit('open', this.callBackData())
         }
@@ -334,21 +337,43 @@ export default {
       }
       left = target ? this.addUnit(left, 'px') : this.addUnit(left)
       right = target ? this.addUnit(right, 'px') : this.addUnit(right)
-      // 优化8: 明确指定需要过渡的属性
-      this.msgStyles = {
-        'top': top,
-        'left': this.addUnit(boxLeft, 'px'),
-        'right': this.addUnit(boxRight, 'px'),
-        'transition': `all ${this.duration}ms`,
-        'animation-name': animationName,
-        '-webkit-animation-name': animationName,
-
-        ...msgStyles
-      }
-      if (this.contentVisible === false) {
+      
+      // 优化8: 只在第一次显示时需要淡入动画,切换步骤时直接显示
+      if (this.isFirstShow) {
+        // 第一次显示:初始设置opacity为0,等待clip-box动画完成后再淡入
+        this.msgStyles = {
+          'top': top,
+          'left': this.addUnit(boxLeft, 'px'),
+          'right': this.addUnit(boxRight, 'px'),
+          'opacity': '0', // 初始时隐藏,等待clip-box动画完成
+          'transition': `top ${this.duration}ms, left ${this.duration}ms, right ${this.duration}ms, bottom ${this.duration}ms, opacity 200ms`,
+          // 不使用位移动画,避免从顶部/底部滑入的效果
+          'animation-name': 'none',
+          '-webkit-animation-name': 'none',
+
+          ...msgStyles
+        }
+        // 等待clip-box聚焦动画完成后,再淡入显示guide-box
         setTimeout(() => {
-          this.contentVisible = true;
-        }, 600);
+          this.msgStyles = {
+            ...this.msgStyles,
+            'opacity': '1'
+          };
+          this.isFirstShow = false; // 标记已经显示过
+        }, this.duration);
+      } else {
+        // 切换步骤:直接显示,只改变位置
+        this.msgStyles = {
+          'top': top,
+          'left': this.addUnit(boxLeft, 'px'),
+          'right': this.addUnit(boxRight, 'px'),
+          'opacity': '1', // 切换步骤时保持显示
+          'transition': `top ${this.duration}ms, left ${this.duration}ms, right ${this.duration}ms, bottom ${this.duration}ms, opacity 200ms`,
+          'animation-name': 'none',
+          '-webkit-animation-name': 'none',
+
+          ...msgStyles
+        }
       }
     },
     nextStep() {
@@ -356,12 +381,31 @@ export default {
         this.$emit('next', this.callBackData())
         this.$emit('update:index', this.index + 1)
       } else {
-        this.contentVisible = false;
-        this.pathInit()
-        setTimeout(() => {
-          this.$emit('finish', this.callBackData())
-          this.$emit('update:show', false)
-        }, this.duration)
+        // 最后一步,隐藏guide-box
+        this.msgStyles = {
+          ...this.msgStyles,
+          'animation-name': 'none',
+          '-webkit-animation-name': 'none'
+        };
+        // 等待浏览器重绘后,设置opacity为0触发过渡动画
+        this.$nextTick(() => {
+          // 在微信小程序中,需要额外的延迟确保视图更新
+          setTimeout(() => {
+            this.msgStyles = {
+              ...this.msgStyles,
+              'opacity': '0'
+            };
+            // 等待guide-box淡出完成(200ms)后再执行clip-box动画
+            setTimeout(() => {
+              this.pathInit()
+              setTimeout(() => {
+                this.isFirstShow = true; // 重置标志,下次打开时重新淡入
+                this.$emit('finish', this.callBackData())
+                this.$emit('update:show', false)
+              }, this.duration)
+            }, 200);
+          }, 20);
+        });
       }
     },
     lastStep() {
@@ -369,12 +413,31 @@ export default {
       this.$emit('last', this.callBackData())
     },
     skipStep() {
-      this.contentVisible = false;
-      this.pathInit()
-      setTimeout(() => {
-        this.$emit('update:show', false)
-        this.$emit('skip', this.callBackData())
-      }, this.duration)
+      // 跳过引导,隐藏guide-box
+      this.msgStyles = {
+        ...this.msgStyles,
+        'animation-name': 'none',
+        '-webkit-animation-name': 'none'
+      };
+      // 等待浏览器重绘后,设置opacity为0触发过渡动画
+      this.$nextTick(() => {
+        // 在微信小程序中,需要额外的延迟确保视图更新
+        setTimeout(() => {
+          this.msgStyles = {
+            ...this.msgStyles,
+            'opacity': '0'
+          };
+          // 等待guide-box淡出完成(200ms)后再执行clip-box动画
+          setTimeout(() => {
+            this.pathInit()
+            setTimeout(() => {
+              this.isFirstShow = true; // 重置标志,下次打开时重新淡入
+              this.$emit('update:show', false)
+              this.$emit('skip', this.callBackData())
+            }, this.duration)
+          }, 200);
+        }, 20);
+      });
     },
     focusTap() {
       this.$emit('focus', this.callBackData())
@@ -446,7 +509,8 @@ export default {
   width: fit-content;
   max-width: 80%;
   /* 优化4: 明确指定需要过渡的属性,避免all */
-  transition: left var(--duration), right var(--duration), top var(--duration), bottom var(--duration), opacity var(--duration);
+  /* opacity使用更短的过渡时间(200ms),确保在clip-box动画前快速隐藏 */
+  transition: left var(--duration), right var(--duration), top var(--duration), bottom var(--duration), opacity 200ms;
   position: absolute;
   color: var(--color);
   background-color: #fff;

+ 13 - 0
src/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue

@@ -54,6 +54,9 @@
 				</slot>
 				<view
 					class="uv-navbar__content__right"
+					:style="{
+						right: headerRight
+					}"
 					@tap="rightClick"
 				>
 					<slot name="right">
@@ -112,6 +115,16 @@
 			}
 		},
 		computed: {
+      headerRight() {
+        const screenWidth = uni.getSystemInfoSync().windowWidth;
+        // #ifdef MP-WEIXIN
+        const { left } = uni.getMenuButtonBoundingClientRect()
+        return screenWidth - left + 'px';
+        // #endif
+        // #ifndef MP-WEIXIN
+        return '0px';
+        // #endif
+      },
 			getBgColor(){
 				const style = {};
 				if(this.bgColor){

+ 76 - 80
tailwind.config.js

@@ -1,15 +1,5 @@
 /** @type {import('tailwindcss').Config} */
 
-function genSimilarColorsName(brandName) {
-  return {
-    lighter: `var(--${brandName}-lighter-color)`,
-    light: `var(--${brandName}-light-color)`,
-    DEFAULT: `var(--${brandName}-color)`,
-    deep: `var(--${brandName}-deep-color)`,
-    deeper: `var(--${brandName}-deeper-color)`
-  };
-}
-
 function generateSize(size, unit) {
   const result = {};
   for (let i = 0; i <= size; i++) {
@@ -18,74 +8,81 @@ function generateSize(size, unit) {
   return result;
 }
 
-function genSimpleColorsName(names) {
-  const colors = {};
-  names.forEach(name => {
-    colors[name] = `var(--${name}-color)`
-  });
-  return colors
-}
-
 module.exports = {
-  // separator: '__', // 如果是小程序项目需要设置这一项,将 : 选择器替换成 __,之后 hover:bg-red-500 将改为 hover__bg-red-500
+  plugins: [],
   corePlugins: {
-    // 预设样式
-    preflight: false, // 一般uniapp都有预设样式,所以不需要tailwindcss的预设
-
-    // 以下功能小程序不支持
-    // space: false, // > 子节点选择器
-    // divideWidth: false,
-    // divideColor: false,
-    // divideStyle: false,
-    // divideOpacity: false,
+    container: false,
+    preflight: false,
   },
-  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
-  safelist: [
-    { pattern: /grid-cols-[1-9]/ }
-  ],
+  content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
+  safelist: [{ pattern: /grid-cols-[1-9]/ }],
   theme: {
-    spacing(config) {
-      let result = { 0: '0', 'px': '0.5px' }
-      // 允许的数值大一些也无所谓,最后打包tailwindcss会摇树优化,未使用的样式并不会打包
-      for (let i = 1; i <= 400; i++) {
-        result[i] = `${i}rpx`
-      }
-      return result
+    // 间距
+    spacing: {
+      ...generateSize(400, "rpx"),
     },
     extend: {
       // 圆角
-      borderRadius: generateSize(50, 'px'),
+      borderRadius: generateSize(50, "px"),
       // 行高
-      lineHeight: generateSize(375, 'rpx'),
+      lineHeight: generateSize(375, "rpx"),
       // 字间距
-      letterSpacing: generateSize(20, 'rpx'),
+      letterSpacing: generateSize(20, "rpx"),
       // 旋转
-      rotate: generateSize(180, 'deg'),
-      zIndex: generateSize(100, ''),
+      rotate: generateSize(180, "deg"),
+      zIndex: generateSize(100, ""),
       fontSize: {
-        "base": '15px',
-        "sm": '14px',
-        "xs": '13px',
-        "2xs": '12px',
-        "3xs": '11px',
-        "4xs": '10px',
-        "lg": '16px',
-        'xl': '18px',
-        '2xl': '20px',
-        '3xl': '24px',
-        '4xl': '28px',
-        '5xl': '32px',
-        '6xl': '36px',
-        '7xl': '40px',
-        ...generateSize(70, 'rpx'),
+        base: "15px",
+        sm: "14px",
+        xs: "13px",
+        "2xs": "12px",
+        "3xs": "11px",
+        "4xs": "10px",
+        lg: "16px",
+        xl: "18px",
+        "2xl": "20px",
+        "3xl": "24px",
+        "4xl": "28px",
+        "5xl": "32px",
+        "6xl": "36px",
+        "7xl": "40px",
+        ...generateSize(70, "rpx"),
       },
       colors: {
-        primary: genSimilarColorsName('primary'),
-        success: genSimilarColorsName('success'),
-        warning: genSimilarColorsName('warning'),
-        error: genSimilarColorsName('error'),
-        info: genSimilarColorsName('info'),
-        ...genSimpleColorsName(['main', 'content', 'tips', 'light', 'bg', 'disabled']),
+        transparent: "transparent",
+        primary: {
+          DEFAULT: "var(--primary-color)",
+          50: "var(--primary-color-50)",
+          100: "var(--primary-color-100)",
+          200: "var(--primary-color-200)",
+          300: "var(--primary-color-300)",
+          400: "var(--primary-color-400)",
+          500: "var(--primary-color-500)",
+          600: "var(--primary-color-600)",
+          700: "var(--primary-color-700)",
+          800: "var(--primary-color-800)",
+          900: "var(--primary-color-900)",
+          950: "var(--primary-color-950)",
+          light: "var(--primary-light-color)",
+        },
+        warning: {
+          DEFAULT: "var(--warning)",
+          dark: "var(--warning-dark)",
+          disabled: "var(--warning-disabled)",
+          light: "var(--warning-light)",
+        },
+        success: {
+          DEFAULT: "var(--success)",
+          dark: "var(--success-dark)",
+          disabled: "var(--success-disabled)",
+          light: "var(--success-light)",
+        },
+        danger: {
+          DEFAULT: "var(--danger)",
+          dark: "var(--danger-dark)",
+          disabled: "var(--danger-disabled)",
+          light: "var(--danger-light)",
+        },
         // 只添加部分颜色,防止覆盖掉老颜色
         fore: {
           title: "var(--fore-title)",
@@ -93,7 +90,7 @@ module.exports = {
           content: "var(--fore-content)",
           subcontent: "var(--fore-subcontent)",
           tip: "var(--fore-tip)",
-          'tip-light': "var(--fore-tip-light)",
+          "tip-light": "var(--fore-tip-light)",
           light: "var(--fore-light)",
           disabled: "var(--fore-disabled)",
           placeholder: "var(--fore-placeholder)",
@@ -110,23 +107,22 @@ module.exports = {
           dark: "var(--danger-dark)",
           disabled: "var(--danger-disabled)",
           light: "var(--danger-light)",
-        }
+        },
       },
       boxShadow: {
-        'up': '0 -1px 3px 0 rgb(0 0 0 / 0.1), 0 -1px 2px -1px rgb(0 0 0 / 0.1)'
+        up: "0 -1px 3px 0 rgb(0 0 0 / 0.1), 0 -1px 2px -1px rgb(0 0 0 / 0.1)",
       },
       flex: {
-        2: '2',
-        3: '3',
-        4: '4',
-        5: '5',
-        6: '6',
-        7: '7',
-        8: '8',
-        9: '9',
-        10: '10'
-      }
+        2: "2",
+        3: "3",
+        4: "4",
+        5: "5",
+        6: "6",
+        7: "7",
+        8: "8",
+        9: "9",
+        10: "10",
+      },
     },
   },
-  plugins: [],
-}
+};