# Learning-Assistant-JSP **Repository Path**: lovexiaoling/learning-assistant-jsp ## Basic Information - **Project Name**: Learning-Assistant-JSP - **Description**: Servlet+JSP 课程设计,大三期末大作业,个人学习辅助系统。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-05-17 - **Last Updated**: 2024-01-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 声明 > `2023年 12月 11日 星期一 12:09:52 CST` > 自从上了大一后,我就不怎么写代码了,全程凭感觉写,所以该项目坑很多,也有很多不足,**不过只是应付大作业,问题不大,哇哈哈哈**。 > 该项目用了阿里云OSS对象存储,不需要的话可以删了,使用 UploadServlet 即可。 ## 项目介绍 想法起源于学习文化课时错题,因为懒,因此老是不复习,以及文化课笔记较杂。由于本学期有 JSP+Servlet 课程,要完成大作业,因此借此机会实现我的想法。 借助 “Learning-Assistant” 来帮助自己定期规划复习时间。 在笔记方面,当你迷糊记得一定内容,可是不记得在那个笔记中时,“根据内容查找便成为有利的工具”,但无论是自己用 word 还是 typora 等笔记软件,几乎都缺少或不太完美完善(好吧,或许有的很完美但我没用过...)。 > 由于只教了 “Servlet+JSP”,只能用课本上的知识。因此该项目我尽量避免使用 JSON 和 Ajax 等(老师说教的不深,因此尽量别用),emmm....所以我也留了很多坑,例如文件上传的验证、CSRF 安全、异常处理、404处理等,现在该项目用的几乎都是同步(除了迫不得已)。`2023年 06月 13日 星期二 15:21:16 CST` ## 功能设计 - [ ] 注册:没有,暂时考虑辅助个人学习使用。 - [x] 登陆:每个账号都是独立的。 - [ ] 信息 icon:直接跳转到个人主页的信息箱。 - [x] 个人主页 - [x] 个人信息 - [x] 我的错题本 - [ ] 信息箱 - [ ] 收藏 - [x] 笔记本 - [x] 错题训练:复习错题。 - [ ] 错题世界。 - [x] 笔记:用富文本?还是便利贴?(那就富文本吧...) ### 个人主页 - 个人信息:个人信息修改。 - 我的错题本:保存和添加错题。 - 信息箱:接收评论的信息。 - 收藏:收藏错题。 - 笔记本:保存个人笔记。 #### 我的错题本 功能如下: - 显示所有错题。 - 添加错题。 - 错题可以设置为共享状态,或私有状态(默认)。 ### 错题训练(好像没做这个?emmmm...不知道,忘记了,随便吧...) - 根据算法选出要复习的错题。 - 每道题目提供三种选项: - 答对:可以按照一定规则降低权重。 - 答错:加权。 - 熟知:不再安排复习。 ### 错题世界 - 显示所有已共享的错题。 - 可以对错题进行评论。 - 可以对共享的错题进行收藏(但不安排复习)。 ## 开发环境 **笔记本:** - 系统:Linux - MySQL:5.7.41 - IDEA:2022.3.1 - Tomcat:9 **宿舍台式机:** - 系统:Window 10 - MySQL:5.7.41 - Eclipse:2019.12.x - Tomcat:9 ## 数据库设计 ### 用户表 user | 字段名 | 类型 | 备注 | | -------- | ------- | ------ | |u_id|int|用户唯一标识| | username | varchar | 用户名 | | password | varchar | 密码 | ```mysql CREATE TABLE users ( `id` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(255) NOT NULL, `password` VARCHAR(255) NOT NULL, `signature` VARCHAR(255), `image` VARCHAR(255) ); insert into users values(null, "admin", "admin", "哈哈", "default.jpeg"); ``` ### 概率(统计)表 statistics | 字段名 | 类型 | 备注 | | ------------- | ---- | ---------- | |id|int|唯一标识| | total | int | 答题总次数 | | mistake | int | 答错总次数 | | countdown_day | int | 倒数日 | | save_countdown | int | 保存 countdown_day | | u_id | int | 所属用户 | | m_id | int | 所属错题 | ```mysql CREATE TABLE statistics ( `id` INT PRIMARY KEY AUTO_INCREMENT, `total` INT NOT NULL, `mistake` INT NOT NULL, `countdown_day` INT NOT NULL, `save` INT NOT NULL, `u_id` INT NOT NULL, `m_id` INT NOT NULL ); insert into statistics values(null, 1, 1, 3, 1, 1, 1); #100% insert into statistics values(null, 4, 2, 3, 1, 1, 2); #50.00% insert into statistics values(null, 6, 2, 1, 1, 1, 3); #33.33% ``` **概率计算公式:** $$ P = \frac{mistake}{total} $$ **概率等级:** - $P \ge 70$:立即复习 - $P \ge 50$:提前倒数日 - $P \ge 20$:提前倒数日 - $P \lt 20$:正常倒数日 > 没学过概率统计,无法用更加科学准确的计算方法,因此只能用这种最简单的了... ### 错题表 mistake | 字段名 | 类型 | 备注 | | ----------- | ------- | ------------ | |id|int|错题唯一标识| | mistake | varchar | 错题图片路径 | | correct | varchar | 答案图片路径 | | comment | varchar | 错题备注信息 | | m_info_id | int | 关联到 mistake_info 表 | | u_id | int | 属于那个用户 | ```mysql CREATE TABLE mistakes ( `id` INT PRIMARY KEY AUTO_INCREMENT, `question` VARCHAR(255), `correct` VARCHAR(255), `comment` VARCHAR(255), `m_info_id` INT NOT NULL, `u_id` INT NOT NULL ); insert into mistakes values(null, 'question.png', 'correct.png', '测试1', 1, 1); insert into mistakes values(null, 'question.png', 'correct.png', '测试2', 2, 1); insert into mistakes values(null, 'default.png', 'default.png', '测试3', 3, 1); ``` ### 错题信息表 mistake_info | 字段名 | 类型 | 备注 | | ------ | ------- | ----------------------- | | id | int | 信息表唯一标识 | | date | date | 录入的时间,无法更改 | | tag_id | varchar | (多)标签,关联到 tag 表 | ```mysql CREATE TABLE mistake_info ( `id` INT PRIMARY KEY AUTO_INCREMENT, `date` DATE NOT NULL, `tag_id` VARCHAR(255) ); insert into mistake_info values(null, '2023-05-26', '1'); insert into mistake_info values(null, '2023-05-25', '2'); insert into mistake_info values(null, '2023-05-20', '1,2,3'); ``` ### 标签 tag | 字段名 | 类型 | 备注 | | ------ | ------- | ------------ | | t_id | int | Tag 唯一标识 | | name | varchar | Tag 名 | | u_id | int | 所属用户 | ```mysql CREATE TABLE tags ( `id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `u_id` INT NOT NULL ); insert into tags values(null, '数学', 1); insert into tags values(null, '英语', 1); insert into tags values(null, '计算机', 1); ``` ### 笔记 notebook | 字段名 | 类型 | 备注 | | -------- | -------- | ---------------------- | | id | int | 唯一标识 | | tittle | varchar | 笔记标题 | | date | date | 新建笔记日期 | | content | text | 文本内容 | | overview | varcharr | 文本摘要,不超过 50 字 | | u_id | int | 所属用户 | ```mysql CREATE TABLE notebook ( `id` INT PRIMARY KEY AUTO_INCREMENT, `tittle` VARCHAR(255), `date` DATE, `content` TEXT, `overview` VARCHAR(255), `u_id` INT ); ``` ## UI 界面(只展示 PC 端,移动端不展示) ### 旧版 —— 被舍友吐槽...(我改完之后,回过头来看,他说的没错 😭) ![image-20230613152614043](https://xiaolingimages.oss-cn-hangzhou.aliyuncs.com/typora-images/image-20230613152614043.png) ![image-20230613152820887](https://xiaolingimages.oss-cn-hangzhou.aliyuncs.com/typora-images/image-20230613152820887.png) ![image-20230613152850717](https://xiaolingimages.oss-cn-hangzhou.aliyuncs.com/typora-images/image-20230613152850717.png) ### 新版 —— 极简风格 ![image-20230613153337141](https://xiaolingimages.oss-cn-hangzhou.aliyuncs.com/typora-images/image-20230613153337141.png) ![image-20230613153353463](https://xiaolingimages.oss-cn-hangzhou.aliyuncs.com/typora-images/image-20230613153353463.png) ![image-20230613153421787](https://xiaolingimages.oss-cn-hangzhou.aliyuncs.com/typora-images/image-20230613153421787.png) ![image-20230613153457998](https://xiaolingimages.oss-cn-hangzhou.aliyuncs.com/typora-images/image-20230613153457998.png)