Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 58 additions & 56 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

这是一个基于Taro的微信小程序项目,为江西理工大学学生提供服务,欢迎各位开发者一起为小程序设计功能,贡献代码!

## 🚀 亮点 | V1.3.6
## 🚀 亮点 | V1.4.0

### 📚 核心功能

Expand All @@ -13,6 +13,7 @@
- **多周切换**:手势滑动切换周次,快速跳转到任意周
- **班级绑定**:一键绑定班级,自动同步课表数据
- **周末显示控制**:可选择显示/隐藏周末课程
- **多学期支持**:多学期切换、非当前学期提醒

#### 2. 资料库系统
- **分类浏览**:支持多级分类导航,面包屑路径清晰
Expand All @@ -33,50 +34,46 @@
- 评价内容展示
- 校区信息标注
- **智能搜索**:快速查找教师,查看历史评价
- **审核机制**:管理员审核确保评价质量

#### 4. 用户投稿系统
- **便捷投稿**:用户可投稿通知、资料等内容
- **审核流程**:
- 待审核/已通过/已拒绝状态管理
- 审核备注反馈
- 积分奖励机制
- **投稿统计**:
- 总投稿数
- 各状态投稿数量
- 累计获得积分
- **管理后台**:运营人员可高效审核投稿内容

#### 5. 积分激励系统
- **积分获取**:
- 投稿通过奖励积分
- 评价贡献获得积分
- **积分查询**:
- 当前积分余额
- 积分交易记录(分页)
- 积分统计信息
- **管理员功能**:手动赋予积分
- **校区必填校验**:评价需选择校区,确保信息准确

#### 4. 学业信息聚合
发现页聚合多个学业信息专区,帮助学生打破信息差:
- **转专业**:转专业通知与公告
- **竞赛**:学科竞赛信息汇总
- **考级考证**:考级考证相关资讯
- **交换生**:交换生项目信息
- **组织**:校园组织介绍(含详情页)

#### 5. 期末复习系统
- **错题本与跳题**:支持错题回顾与跳题作答
- **自动提交**:子题全部作答后自动提交父题
- **项目筛选**:按项目数据校验与筛选

#### 6. 通知公告系统
- **分类管理**:支持多种通知分类
- **发布流程**:
- 运营创建通知
- 管理员审核
- 发布到用户端
- **置顶功能**:重要通知可置顶显示
- **转换日程**:通知可转换为个人日程提醒

#### 7. 其他实用功能
- **番茄钟**:专注计时与排行榜(首页卡片)
- **绩点计算器**:快速计算 GPA,支持备份
- **挂科率查询**:搜索课程挂科率数据,辅助选课决策
- **绩点计算器**:快速计算GPA
- **倒数日**:首页倒数日卡片
- **学习清单**:待完成/已完成学习任务管理
- **今日课表**:首页当日课程提醒,同时段多门课程折叠展示
- **校历查询**:查看学期重要时间节点
- **英雄榜**:展示优秀学生/贡献者
- **期末复习**:期末复习资料专区
- **英雄榜**:展示贡献者
- **群聊推荐**:推荐相关学习群聊
- **主题模式**:跟随系统深色/浅色主题

### 🔧 技术亮点

#### 1. 请求幂等性保护
#### 1. 主题系统(跟随系统)
- **CSS 变量令牌**:通过 `--theme-*` 变量统一管理页面、表面、文字、边框、品牌色等语义色
- **原生主题联动**:同步设置导航栏、标签栏、页面背景色,原生窗口底色与内容层主题永远一致
- **防闪烁**:主题始终跟随系统,配合 `page-meta` 首帧定色,从根本上避免切换页面时闪烁上一套主题色

#### 2. 请求幂等性保护
- **自动UUID生成**:使用微信小程序加密级随机数生成器生成 UUID v4
- **智能幂等性Key**:
- 基于请求内容(method + url + data)生成唯一标识
Expand All @@ -85,26 +82,29 @@
- **请求追踪**:每个请求自动添加 `X-Request-ID` 用于日志追踪
- **详细文档**:完整的幂等性实现说明(见 `docs/idempotency_implementation.md`)

#### 2. RBAC权限管理
- **角色系统**:支持多角色管理(管理员、运营、普通用户等)
- **权限控制**:细粒度的权限管理
- **用户角色绑定**:管理员可为用户分配角色
#### 3. 双Token认证
- **双Token机制**:access token + refresh token,提升安全性
- **拦截器自动续期**:token 过期自动刷新,无感续期
- **重复调用防护**:`expireToken` 增加重复调用防护与异常捕获

#### 3. 状态管理
#### 4. 状态管理
- **Pinia Store**:
- `authStore`:用户认证状态
- `authStore`:用户认证状态(双Token)
- `scheduleStore`:课表数据管理
- `notificationStore`:通知数据管理
- `reviewsStore`:评价数据管理
- `studyTasksStore`:学习任务管理
- `countdownStore`:倒数日管理
- `themeStore`:主题(跟随系统)管理

#### 4. API设计
- **统一封装**:所有API调用统一封装在 `src/api/index.js`
#### 5. API设计
- **按功能模块拆分**:`src/api/` 下按功能拆分为独立模块(`auth`、`courseTable`、`material`、`notification`、`review`、`pomodoro`、`gpa`、`points`、`organization` 等),`index.js` 统一聚合导出
- **拦截器机制**:
- 请求拦截:自动添加 token、幂等性Key等
- 响应拦截:统一处理错误、token过期等
- **RESTful规范**:遵循RESTful API设计规范
- **统一错误处理**:请求错误统一以 modal 提示,子页面不再过多处理
- **静默模式**:支持 `silent` 静默请求、URL 校验、循环引用保护

### 🎨 用户体验优化

Expand All @@ -125,52 +125,54 @@

#### 4. 性能优化
- 分页加载,减少单次数据量
- 图片懒加载
- 请求缓存机制

## 🛠️ 技术栈

- **框架**: Taro 4.x
- **前端**: Vue 3 + Composition API
- **状态管理**: Pinia
- **样式**: Weapp-Tailwind CSS + DaisyUI
- **样式**: Tailwind CSS v4 + 自定义主题令牌系统(跟随系统深色/浅色)
- **平台**: 微信小程序

## 📱 页面结构

```
src/
├── pages/
│ ├── home/ # 首页
│ ├── home/ # 首页(今日课表、番茄钟、学习清单、倒数日、通知卡片)
│ ├── schedule/ # 课表功能
│ │ └── schedule-bind/ # 班级绑定
│ ├── discover/ # 发现页(学业信息聚合入口)
│ ├── materials/ # 资料库
│ │ └── detail/ # 资料详情
│ ├── final-review/ # 期末复习
│ │ └── detail/ # 复习详情
│ ├── points/ # 积分系统
│ ├── discover/ # 发现页
│ ├── profile/ # 个人中心
│ ├── notifications/ # 通知公告
── contributions/ # 投稿系统
│ └── detail/ # 通知详情
│ ├── teacher-reviews/ # 教师评价
│ ├── major-transfer/ # 转专业
│ ├── competition/ # 竞赛
│ ├── qualification/ # 考级考证
│ ├── exchange/ # 交换生
│ ├── organization/ # 组织
│ │ └── detail/ # 组织详情
│ ├── failrate/ # 挂科率查询
│ ├── gpa-calculator/ # 绩点计算器
│ ├── calendar/ # 校历查询
│ ├── map/ # 校区地图
│ ├── address/ # 校区地址
│ ├── calendar/ # 校历查询
│ ├── groupchat/ # 群聊推荐
│ ├── achieveprint/ # 成绩证明
│ ├── graduation/ # 毕业相关
│ ├── gotojw/ # 教务跳转
│ ├── hero/ # 英雄榜
│ ├── login/ # 登录页面
│ ├── webview/ # 网页浏览
│ ├── terms-of-service/ # 服务条款
│ ├── hero/ # 英雄榜
│ └── admin/ # 管理后台
│ ├── config/ # 配置管理
│ ├── heroes/ # 英雄榜管理
│ ├── teacher-reviews/ # 评价管理
│ ├── rbac/ # 权限管理
│ └── points/ # 积分管理
├── api/ # API接口封装
│ └── terms-of-service/ # 服务条款
├── api/ # API接口(按功能模块拆分)
├── stores/ # Pinia状态管理
├── utils/ # 工具函数
├── components/ # 通用组件
Expand Down Expand Up @@ -199,7 +201,7 @@ npm run build:weapp

### 环境配置
- 复制 `.env.example` 为 `.env.local`,并设置 `TARO_APP_API_BASE_URL`
- 调整 `src/utils/constants.js` 中的学期配置
- 学期配置由后端下发,本地经 `src/utils/semesterCache.js` 缓存,无需手动维护

## 贡献指南

Expand Down
35 changes: 16 additions & 19 deletions config/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { defineConfig } from '@tarojs/cli'
import { existsSync, readFileSync } from 'fs'
import { resolve } from 'path'
import { Plugin } from 'vite'
import tailwindcss from 'tailwindcss'
import { UnifiedViteWeappTailwindcssPlugin as uvtw } from 'weapp-tailwindcss/vite'
import { WeappTailwindcss } from 'weapp-tailwindcss/vite'
import devConfig from './dev'
import prodConfig from './prod'

Expand Down Expand Up @@ -57,6 +55,14 @@ export default defineConfig(async (merge, { command, mode }) => {
},
copy: {
patterns: [
{
from: resolve(process.cwd(), 'src/theme.json'),
to: resolve(process.cwd(), 'dist/theme.json')
},
{
from: resolve(process.cwd(), 'src/assets/icons'),
to: resolve(process.cwd(), 'dist/assets/icons')
}
],
options: {
}
Expand All @@ -65,25 +71,16 @@ export default defineConfig(async (merge, { command, mode }) => {
compiler: {
type: 'vite',
vitePlugins: [
{
// 通过 vite 插件加载 postcss,
name: 'postcss-config-loader-plugin',
config(config) {
// 加载 tailwindcss
if (typeof config.css?.postcss === 'object') {
config.css?.postcss.plugins?.unshift(tailwindcss())
}
},
},
uvtw({
WeappTailwindcss({
// rem转rpx
rem2rpx: true,
// 除了小程序这些,其他平台都 disable
disabled: process.env.TARO_ENV === 'h5' || process.env.TARO_ENV === 'harmony' || process.env.TARO_ENV === 'rn',
// 由于 taro vite 默认会移除所有的 tailwindcss css 变量,所以一定要开启这个配置,进行css 变量的重新注入
injectAdditionalCssVarScope: true,
// px转rpx,覆盖 Tailwind 任意值中的 px
px2rpx: true,
cssEntries: [
resolve(process.cwd(), 'src/app.css')
]
})
] as Plugin[] // 从 vite 引入 type, 为了智能提示
]
},
mini: {
postcss: {
Expand Down
47 changes: 21 additions & 26 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jxust-yqlx-weapp",
"version": "1.3.6",
"version": "1.4.0",
"private": true,
"description": "",
"templateInfo": {
Expand All @@ -25,8 +25,7 @@
"dev:h5": "npm run build:h5 -- --watch",
"dev:rn": "npm run build:rn -- --watch",
"dev:qq": "npm run build:qq -- --watch",
"dev:quickapp": "npm run build:quickapp -- --watch",
"postinstall": "weapp-tw patch"
"dev:quickapp": "npm run build:quickapp -- --watch"
},
"browserslist": [
"defaults and fully supports es6-module",
Expand All @@ -36,19 +35,19 @@
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.7.7",
"@tarojs/components": "4.1.9",
"@tarojs/helper": "4.1.9",
"@tarojs/plugin-framework-vue3": "4.1.9",
"@tarojs/plugin-platform-alipay": "4.1.9",
"@tarojs/plugin-platform-h5": "4.1.9",
"@tarojs/plugin-platform-jd": "4.1.9",
"@tarojs/plugin-platform-qq": "4.1.9",
"@tarojs/plugin-platform-swan": "4.1.9",
"@tarojs/plugin-platform-tt": "4.1.9",
"@tarojs/plugin-platform-weapp": "4.1.9",
"@tarojs/runtime": "4.1.9",
"@tarojs/shared": "4.1.9",
"@tarojs/taro": "4.1.9",
"@tarojs/components": "4.2.0",
"@tarojs/helper": "4.2.0",
"@tarojs/plugin-framework-vue3": "4.2.0",
"@tarojs/plugin-platform-alipay": "4.2.0",
"@tarojs/plugin-platform-h5": "4.2.0",
"@tarojs/plugin-platform-jd": "4.2.0",
"@tarojs/plugin-platform-qq": "4.2.0",
"@tarojs/plugin-platform-swan": "4.2.0",
"@tarojs/plugin-platform-tt": "4.2.0",
"@tarojs/plugin-platform-weapp": "4.2.0",
"@tarojs/runtime": "4.2.0",
"@tarojs/shared": "4.2.0",
"@tarojs/taro": "4.2.0",
"pinia": "^2.0.10",
"vue": "^3.5.21"
},
Expand All @@ -57,21 +56,17 @@
"@babel/plugin-proposal-class-properties": "7.18.6",
"@egoist/tailwindcss-icons": "^1.9.0",
"@iconify-json/lucide": "^1.2.66",
"@tarojs/cli": "4.1.9",
"@tarojs/vite-runner": "4.1.9",
"@tarojs/cli": "4.2.0",
"@tarojs/vite-runner": "4.2.0",
"@vitejs/plugin-vue": "^4.0.0",
"@vitejs/plugin-vue-jsx": "^3.0.0",
"babel-preset-taro": "4.1.9",
"daisyui": "^5.1.7",
"babel-preset-taro": "4.2.0",
"eslint": "^8.12.0",
"eslint-config-taro": "4.1.9",
"eslint-config-taro": "4.2.0",
"eslint-plugin-vue": "^8.0.0",
"postcss": "^8.4.18",
"sass": "^1.60.0",
"stylelint": "^14.4.0",
"tailwindcss": "^3.4.17",
"tailwindcss": "^4.3.1",
"terser": "^5.16.8",
"vite": "^4.2.0",
"weapp-tailwindcss": "^4.2.6"
"weapp-tailwindcss": "^5.1.0"
}
}
Loading