# database-project **Repository Path**: wang_xi_long/database-project ## Basic Information - **Project Name**: database-project - **Description**: 学籍管理系统 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-11-03 - **Last Updated**: 2022-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 一、需要电脑安装 node 环境 ## 二、安装依赖 ### 服务端 1. 进入`serve`文件: `cd serve` 2. 安装依赖: `yarn install` 或 `npm run install` ### web 端 1. 进入`web`文件: `cd web` 2. 安装依赖: `yarn install` 或 `npm run install` ## 三、运行项目 ### 服务端 1. 进入`serve`文件: `cd serve` 2. 运行: `yarn start` 或 `npm run start` ### web 端 1. 进入`web`文件: `cd web` 2. 运行: `yarn serve` 或 `npm run serve` ## 预览 1. web 端: `http://localhost:8080/` 2. 服务端: `http://localhost:3000/` ## 登录 ### 进入场景 1. 通过学号/职工号进行登录 2. 首先会验证学号/职工号是否存在? 不存在返回错误, web 端进行提示`用户不存在` 3. 存在再验证密码是否正确? 不正确返回错误, web 端进行提示`密码不正确` 4. 学号/职工号和密码全部正确,返回用户 token 和用户详情信息并提示`登录成功` 5. web 端登录成功后将 token 进行 Cookie 缓存,并将 token 添加 http 请求 header 里 6. web 端根据用户详情信息返回的 role 角色,选择对应角色进入的首页,加载角色对应的 路由页面 ### 权限验证 1. web 登录后跳转路由,路由守卫会根据 token 验证是否登录 2. 要跳转的页面是否需要权限 3. 没有登录,跳转页面不需要权限允许跳转, 需要权限的话重定向到登录页面进行用户登录 4. 已经登录的用户,并没有 web 端路由菜单列表,然后获取用户详情信息, 5. 已经登录的用户,并且有路由菜单列表,可以在自己有权限的页面正常操作了, ### 用户详情接口 1. serve 端提供两种查询用户详情接口, - 一种是根据自身 token 查询自身用户详情信息,应用场景为学生登录个人修改信息 - 另一种是根据用户 id 查询用户详情信息,应用场景为教师登录修改学生信息 ## 新增用户信息 1. 需要 `user_id,user_name,user_sex,user_age,user_phone,dept_id,role,password,`字段 2. 会判断根据 user_id 判断用户是否已存在,已存在返回错误, web 端进行提示`用户已存在` 3. 注册成功或失败会返回相应状态,web 端进行提示`注册成功`或`注册失败` ## 修改用户信息 1. 仅可更改`user_name,user_sex,user_phone,user_age,dept_id,` 字段,role 不可修改, 密码需要通过修改密码进行修改 2. 修改成功或失败会返回相应状态,web 端进行提示`修改成功`或`修改失败` ## 修改用户密码 1. 首先对原密码与数据库密码进行验证,不一致返回错误,web 端进行提示`原密码错误` 2. 再对原密码与新密码进行验证,如果一致返回错误, web 端进行提示`新密码不能与原密码相同` 3. 再对新密码与确认密码进行二次键入验证, 不一致返回错误, web 端进行提示`新密码与确认密码不一致` (这一步 web 会进行验证,后端也需要验证) ## 删除用户信息 1. web 端会进行删除二次确认,减少误操作次数 2. 根据 user_id 进行数据库删除 ## 逻辑删除方案 ### 一、增加删除字段方式 #### 单一主键适用 1. 字段中设置一个字段 deleted:0 表示未删除,1 表示已删除。 id | name | deleted ---|---|---- 1 | 张三 | 0 2 | 李四 | 1 2. 如果一些表中 id 和 name 是联合主键, 这种情况下能够满足删除, 但也无法新增,没有完全符合逻辑删除 #### 多主键适用 1. 字段中设置一个字段 deleted:0 表示未删除,其他值表示已删除。 id | name | deleted ---|---|---- 1 | 张三 | 0 1 | 张三 | 1 1 | 张三 | 2 2. 需要保证 deleted 递增 #### 时间戳实现 1. 字段中设置一个字段 deleted:0 表示未删除,其他值表示已删除。 | id | name | deleted | | --- | ---- | ---------- | | 1 | 张三 | 0 | | 1 | 张三 | 1573631978 | | 1 | 张三 | 1573631993 | 2. 便于某些时候的记录查找和追溯 ### 二、采用备用表方式 每次删除的时候,都把数据写入到备份表,并且原始记录使用 JSON 格式完整保存,然后再删除 优点: 原始表不会包含删除的数据,有利于查询效率 缺点:实现比较麻烦,每一张需要逻辑删除的表都需要备份表 ## SQL 语句 ### 插入 ```js const USERADD_SQL = `insert into user set ?`; const queryData = { user_id, user_name, user_sex, user_age, user_phone, dept_id, role, }; const res = await query(USERADD_SQL, queryData); ``` ### 查询 ```js // 联表查询部分字段-内连接 const USERLIST_SQL = `select user_id, user_name, user_sex, user_phone, user_age, user.dept_id, dept_name, role from user join dept on user.dept_id=dept.dept_id`; const res = JSON.parse(JSON.stringify(await query(USERLIST_SQL))); // 联表查询全部字段-交叉连接 const USERALL_SQL = `select * from user cross join dept on user.dept_id=dept.dept_id`; // on user.dept_id=dept.dept_id 根据dept_id查找 const res = JSON.parse(JSON.stringify(await query(USERALL_SQL))); // 根据user_id联表查询全部字段-交叉连接 const USERINFO_SQL = `select * from user cross join dept on user.dept_id=dept.dept_id where user_id=?`; const res = JSON.parse(JSON.stringify(await query(USERINFO_SQL, [user_id]))); ``` ### 修改 ```js const USERUPDATE_SQL = `update user set user_name=?, user_sex=?, user_phone=?, user_age=?, dept_id=? where user_id=?`; const queryData = [user_name, user_sex, user_phone, user_age, dept_id, user_id]; const res = await query(USERUPDATE_SQL, queryData); ``` ### 删除 ```js const PASSWORDUPDATE_SQL = `update user set password=? where user_id=?`; const queryData = [user_id]; const res = await query(USERDELETE_SQL, queryData); ``` ## 系别管理 1. 进入场景: 教师权限仅有 2. 列表: 系别全部数据 3. 添加: 字段(系别 ID,系别名称) - 会根据系别 ID 判断是否已存在,保证唯一性 4. 修改: 仅可以修改系别名称字段 5. 删除: 一次仅可删除一条数据 ## 课程管理 1. 进入场景: 教师权限/学生权限 2. 对应操作: - 公有: 课程号查询/重置/列表数据 - 教师独有: 添加课程/修改/删除 - 学生独有: 选课(根据学生 token,提供 isElective 字段) 3. 添加课程: (课程 ID,课程名,学分,课余量) - 会根据课程 ID 判断是否已存在,保证唯一性 4. 列表: - 根据课程 ID 查询一条课程数据 - 查询课程全部数据 - 通过用户 token 查询带用户选课标识的全部课程数据 - 通过用户 token+课程 ID 查询带用户标识的一条课程数据 5. 修改: 仅可修改课程名,学分 - 课程 ID,课余量是不可修改的,会影响数据的准确性 6. 删除: 一次仅可删除一条数据 ## 选课管理 1. 进入场景: 学生在课程管理中进行选课, 2. 对应操作: 公有: #### 选课管理功能测试 编号 | 测试内容 | 测试结果 ---|---|---- 1 | 学生选课,应提示"选课成功" | 通过 2 | 录入选课成绩,应提示"录入成功" | 通过 3 | 修改选课成绩,应提示"修改成功" | 通过 4 | 删除选课,应提示"删除成功" | 通过 5 | 选择课程,结果为对应选课数据 | 通过