# StudentManage **Repository Path**: alpha-cat/StudentManage ## Basic Information - **Project Name**: StudentManage - **Description**: 学生信息管理系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2020-03-25 - **Last Updated**: 2022-06-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 学生信息管理系统 [TOC] 功能如下 |身份 |功能 |操作 |操作对象| | --- | --- | --- | --- | |管理员 |登录、修改密码| 查询、修改 |管理员表| ||学生基本信息管理| 增加、删除、修改、查询| 学生表| ||教师基本信息管理| 增加、删除、修改、查询| 教师表| ||课程基本信息管理| 增加、删除、修改、查询| 课程表| |学生| 登陆| 查询| 学生表| ||选课| 查询、增加、删除| 课程表,选课表| ||个人信息管理| 查询、修改| 学生表| ||查询课程成绩| 查询| 成绩表| ||修改密码| 修改| 学生表| |教师| 登陆| 查询| 教师表| ||个人信息管理| 修改、查询| 教师表| ||录入课程成绩| 增加、修改、查询、删除| 课程表,成绩表| ||修改密码| 修改| 教师表| ||查询选课学生信息| 查询| 选课表| 系统前台用户的功能包括: * 学生注册、学生修改密码、学生登陆、查询以及修改个人信息、查询个人成绩; * 教师登陆、教师修改密码、教师注册、查询以及修改个人信息、录入学生课程成绩、查询选课学生信息。学生初始密码为学号后六位,学生可以修改密码。 * 教师初始密码为工号的后六位,教师同样可以进行修改。学生教师根据学号/工号和密码即可登陆进行操作。 * 系统后台的管理员可以查询、增加、修改、删除学生、教师以及课程信息,如修改密码。 技术路线: 后端: java + servlet等开发技术 前端: vue+elementui 采用最新的前后端分离技术开发 ## 一、数据库设计 1. user(登录表) |字段名|类型|注释| | ---- | ---- | ---- | |id|int|主键,自增长| |username|text|登录名| |password|text|密码| |usertype|text|用户类型,第一次选定,默认不让变更| |profile_id|int|用户信息,对应profile| 2. student_profile(学生信息表) |字段名|类型|注释| | ---- | ---- | ---- | |id|int|主键,自增长| |user_id|int|对应用户id,与用户id唯一关联(外键)| |name|text|姓名| |sex|text|性别| |phone|text|联系电话| |number|text|学号| 3. teacher_profile(教师信息表) |字段名|类型|注释| | ---- | ---- | ---- | |id|int|主键,自增长| |user_id|int|对应用户id,与用户id唯一关联(外键)| |name|text|姓名| |sex|text|性别| |phone|text|联系电话| |rank|text|职称| |number|text|工号| 4. admin_profile(管理员信息表) |字段名|类型|注释| | ---- | ---- | ---- | |id|int|主键,自增长| |user_id|int|对应用户id,与用户id唯一关联(外键)| |name|text|姓名| |phone|text|联系电话| 5. course(课程表) |字段名|类型|说明| | ---- | ---- | ---- | |id|int|自增长| |name|text|课程名| |intro|text|课程介绍| |teacher_id|int|主讲老师| 6. select_course(选课) |字段名|类型|说明| | ---- | ---- | ---- | |id|int|自增长| |student_id|int|学生| |course_id|int|课程| |grade|text|成绩| |message|text|教师评价| ## 二、用户注册 分为三种类型: * administrator : 管理员 * teacher : 教师 * student : 学生 用户名必须唯一: ```java // 检查用户名是否唯一 UserDao userDao = new UserDao(); ArrayList users = userDao.queryByUsername(user.getUsername()); if(users.size() != 0){ response.put("MSG", "失败"); response.put("INFO", "用户名已存在"); return response; } ``` ## 三、用户登录 根据用户名和密码登录,系统根据用户类型自动跳转到对应的用户界面 ```javascript sessionStorage.setItem("user", JSON.stringify(userList[i])); // 跳转到首页 this.$message.success("登录成功"); // 跳转到对应用户的默认首页 var permission = new Permission(); var list = permission.permission[userList[i].usertype]; // 假定用户类型不在列表里面,那么清除此用户,并跳转到无权限首页 if(typeof list == "undefined"){ sessionStorage.setItem("user", null); // 接下来进入到无用户模式 this.$router.replace(permission.noPermission[0]) } else { // 类型存在 // 如果目的地址不在该用户的默认列表里面,跳转到默认列表首页 this.$router.replace(list[0]) } ``` ## 四、管理员模块 ### 4.1 个人信息管理 个人信息管理,包括修改密码,以及其他的个人信息 * 密码管理 * 个人数据管理 ### 4.2 登录账户管理 管理登录账户数据 1. 用户列表 2. 添加用户 添加用户时注意用户名唯一,并且默认给用户创建一个`profile`,后面可进一步完善`profile`信息 ```java // 添加一个 User public JSONObject addUser(JSONObject request){ // 用户名必须唯一 JSONObject response = new JSONObject(); User user = new User(request); // 检查用户名是否唯一 UserDao userDao = new UserDao(); ArrayList users = userDao.queryByUsername(user.getUsername()); if(users.size() != 0){ response.put("MSG", "失败"); response.put("INFO", "用户名已存在"); return response; } // 用户名不存在就添加 boolean result = userDao.insert(user); // 添加完用户,获取这个用户,添加一个user_profile users = userDao.queryByUsername(user.getUsername()); user.setId(users.get(0).getId()); // 添加一个profile if(user.getUsertype().equals("administrator")){ Admin_profile admin_profile = new Admin_profile(); admin_profile.setUser_id(user.getId()); // 插入用户信息 Admin_profileDao admin_profileDao = new Admin_profileDao(); admin_profileDao.insert(admin_profile); // 获取user——profile admin_profile.setId(admin_profileDao.queryByUser_id(user.getId()).get(0).getId()); //跟新user user.setProfile_id(admin_profile.getId()); userDao.updateById(user.getId(), user); }else if(user.getUsertype().equals("teacher")){ Teacher_profile teacher_profile = new Teacher_profile(); teacher_profile.setUser_id(user.getId()); Teacher_profileDao teacher_profileDao = new Teacher_profileDao(); teacher_profileDao.insert(teacher_profile); teacher_profile.setId(teacher_profileDao.queryByUser_id(user.getId()).get(0).getId()); user.setProfile_id(teacher_profile.getId()); userDao.updateById(user.getId(), user); }else if(user.getUsertype().equals("student")){ Student_profile student_profile = new Student_profile(); student_profile.setUser_id(user.getId()); Student_profileDao student_profileDao = new Student_profileDao(); student_profileDao.insert(student_profile); student_profile.setId(student_profileDao.queryByUser_id(user.getId()).get(0).getId()); user.setProfile_id(student_profile.getId()); userDao.updateById(user.getId(), user); } if(result){ response.put("MSG", "成功"); }else{ response.put("MSG", "失败"); } return response; } ``` 3. 编辑用户 可以对用户名及密码进行修改,暂不支持用户类型修改 修改时保证用户名不冲突: ```java // 检查用户名是否一致,不一致的话检查新用户名是否重复 if(!oldUser.getUsername().equals(updateUser.getUsername())){ if(userDao.queryByUsername(updateUser.getUsername()).size() != 0){ response.put("MSG", "失败"); response.put("INFO", "用户名冲突"); return response; } } ``` 4. 用户查询 支持根据`用户名`和`用户类型`查询 ```javascript dataFilter(model){ // model为对象, 加入条件, 默认为返回此model // 条件是search,关键字 if(model.username.toLowerCase().includes(this.search.toLowerCase())){ return model; }else if(this.options_dict[model.usertype].toLowerCase().includes(this.search.toLowerCase())){ return model; }else{ return null; } // return model; }, ``` 5. 删除用户 删除一个用户,将对应的 `user_profile` 一并删除 ```java public JSONObject deleteUserById(JSONObject request){ JSONObject response = new JSONObject(); UserDao userDao = new UserDao(); // 根据id获取即将删除的用户 User user = userDao.queryById(request.getInt("id")).get(0); // 删除用户数据 if(user.getUsertype().equals("administrator")){ new Admin_profileDao().deleteById(user.getProfile_id()); }else if(user.getUsertype().equals("teacher")){ // 删除教师时需要考虑与之关联的课程是否存在,后期再考虑,当前之间删除 new Teacher_profileDao().deleteById(user.getProfile_id()); }else if(user.getUsertype().equals("student")){ // 删除学生时,需要进一步考虑与之相关课程的相关数据删除 new Student_profileDao().deleteById(user.getProfile_id()); } // 删除用户 userDao.deleteById(user.getId()); response.put("MSG", "成功"); return response; } ``` ### 4.3 管理员用户管理 包含管理员用户信息增删改查 1. 列表 查询profile时将user登录信息一并查询出来 ```java for(Admin_profile admin_profile: admin_profiles){ JSONObject object = admin_profile.toJSONObject(); User user = userDao.queryById(admin_profile.getUser_id()).get(0); object.put("user_account", user.toJSONObject()); response.append("ADMIN_PROFILELIST", object); } ``` 同时在列表显示的时候显示出登录信息: ```html

登录名: {{ scope.row.user_account.username }}

密码: {{ scope.row.user_account.password }}

{{ scope.row.name }}
``` 2. 添加, 添加一个管理员,用户名默认使用手机号进行添加+6位随机串进行添加,密码默认为`123456` ```java User user = new User(); user.setProfile_id(admin_profile.getId()); user.setUsername(new UserService().genAUsername(admin_profile.getPhone())); user.setPassword("123456"); user.setUsertype("administrator"); new UserDao().insert(user); ``` 3. 编辑 可以编辑除id,user_id以外的所有参数 4. 搜索 可根据姓名,电话号码进行查找 5. 删除 删除时删除对应账户的登录信息 ```java // 根据 id 删除 Admin_profile public JSONObject deleteAdmin_profileById(JSONObject request){ JSONObject response = new JSONObject(); Admin_profileDao admin_profileDao = new Admin_profileDao(); //根据id获取profile Admin_profile admin_profile = admin_profileDao.queryById(request.getInt("id")).get(0); //删除对应的用户 new UserDao().deleteById(admin_profile.getUser_id()); //删除profile admin_profileDao.deleteById(request.getInt("id")); response.put("MSG", "成功"); return response; } ``` ### 4.4 教师信息管理 包含教师用户信息增删改查 1. 列表 与管理员类似 2. 添加 添加时将工号后六位作为密码,其余与管理员类似 3. 修改 与管理员类似 4. 搜索 可根据用户名和电话进行搜索 5. 删除 删除时将用户登录信息一并删除, 注意: 如果教师有课程,不能删除,先删除课程再删除教师 ```java // 根据 id 删除 Teacher_profile public JSONObject deleteTeacher_profileById(JSONObject request){ JSONObject response = new JSONObject(); Teacher_profileDao teacher_profileDao = new Teacher_profileDao(); Teacher_profile teacher_profile = teacher_profileDao.queryById(request.getInt("id")).get(0); // 如果教师有课程时无法删除 if(new CourseDao().queryByTeacher_id(teacher_profile.getUser_id()).size() !=0){ response.put("MSG", "失败"); response.put("INFO", "这位教师目前还有课程"); return response; } // 删除登录 new UserDao().deleteById(teacher_profile.getUser_id()); // 删除用户 teacher_profileDao.deleteById(teacher_profile.getId()); response.put("MSG", "成功"); return response; } ``` ### 4.5 学生信息管理 1. 列表 与教师用户类似,在查询结果加上用户登录信息 ```java // search 最后处理,尾巴上加上profile private JSONObject searchEnd(ArrayList student_profiles){ JSONObject response = new JSONObject(); Student_profileDao student_profileDao = new Student_profileDao(); UserDao userDao = new UserDao(); for(Student_profile student_profile: student_profiles){ JSONObject object = student_profile.toJSONObject(); User user = userDao.queryById(student_profile.getUser_id()).get(0); object.put("user_account", user.toJSONObject()); response.append("STUDENT_PROFILELIST", object); } return response; } ``` 2.添加 添加时应确保学号大于6位,加入用户的同时,加入登录信息 ```java // 添加一个 Student_profile public JSONObject addStudent_profile(JSONObject request){ JSONObject response = new JSONObject(); Student_profile student_profile = new Student_profile(request); // 检查是否符合要求 // 工号长度大于6位 if (student_profile.getNumber().length() < 6){ response.put("MSG", "失败"); response.put("INFO", "学号格式有误"); return response; } Student_profileDao student_profileDao = new Student_profileDao(); boolean result = student_profileDao.insert(student_profile); // 获取刚才创建的profile ArrayList student_profiles = student_profileDao.queryAll(); // 新插入的哪一个是id最大的那一个 int id = -1; for(Student_profile student_profile1 : student_profiles){ if(student_profile1.getId() > id){ student_profile = student_profile1; id = student_profile.getId(); } } // 创建一个登录账户 User user = new User(); user.setProfile_id(student_profile.getId()); user.setUsername(new UserService().genAUsername(student_profile.getPhone())); user.setPassword(student_profile.getNumber().substring(student_profile.getNumber().length()-6));//教师密码默认为工号后6位 user.setUsertype("student"); new UserDao().insert(user); // 获取这个用户 user.setId(new UserDao().queryByUsername(user.getUsername()).get(0).getId()); // 设置profile里面的userid student_profile.setUser_id(user.getId()); student_profileDao.updateById(student_profile.getId(), student_profile); if(result){ response.put("MSG", "成功"); }else{ response.put("MSG", "失败"); } return response; } ``` 3. 编辑 除了id和user_id均可以编辑 ```java // 根据 id 修改 Student_profile public JSONObject updateStudent_profileById(JSONObject request){ JSONObject response = new JSONObject(); int id = request.getInt("id"); Student_profile updateStudent_profile = new Student_profile(request.getJSONObject("UPDATE_STUDENT_PROFILE")); Student_profileDao student_profileDao = new Student_profileDao(); student_profileDao.updateById(id, updateStudent_profile); response.put("MSG", "成功"); return response; } ``` 4. 查询 可根据名字和电话查询 ```javascript dataFilter(model){ // model为对象, 加入条件, 默认为返回此model // return model; if(model.name.toLowerCase().includes(this.search.toLowerCase())){ return model; }else if(model.phone.toLowerCase().includes(this.search.toLowerCase())){ return model; }else{ return null; } }, ``` 5. 删除 删除时同时删除user, 如果学生有选课信息,不能删除 ```java // 根据 id 删除 Student_profile public JSONObject deleteStudent_profileById(JSONObject request){ JSONObject response = new JSONObject(); Student_profileDao student_profileDao = new Student_profileDao(); // 根据id获取profile Student_profile student_profile = student_profileDao.queryById(request.getInt("id")).get(0); // 根据id删除user new UserDao().deleteById(student_profile.getUser_id()); // 删除profile student_profileDao.deleteById(request.getInt("id")); response.put("MSG", "成功"); return response; } ``` ### 4.6 课程表管理 一个课程表关联一个教师 1. 列表 老师一栏显示老师信息 2. 添加课程 添加课程,前端需要列出主讲老师列表 3. 删除课程 删除课程时应注意如果有学生选的时候,不能删除, ```java // 根据 id 删除 Course public JSONObject deleteCourseById(JSONObject request){ JSONObject response = new JSONObject(); CourseDao courseDao = new CourseDao(); // 获取这一门课程 Course course = courseDao.queryById(request.getInt("id")).get(0); // 如果课程下面还有学生选课的话,不能删除 if(new Select_courseDao().queryByCourse_id(course.getId()).size() != 0){ response.put("MSG", "失败"); response.put("INFO", "还有学生选修此门课程"); return response; } courseDao.deleteById(request.getInt("id")); response.put("MSG", "成功"); return response; } ``` 4. 查询 根据课程名和课程内容查询, 返回结果中将老师信息带出来 5. 编辑 正常编辑 ### 4.7 选课管理 选课管理本应有学生完成,管理员理论上不能选课,但是本系统超越了理论。 1. 添加 需要同时将课程信息和学生信息拉出来 2. 列表 3. 查询 按课程查询,学生名查询 ```javascript // 默认搜索方法,需要时重写 dataFilter(model){ // model为对象, 加入条件, 默认为返回此model // 获取学生 let student = this.getStudent(model.student_id); // 获取课程 let course = this.getCourseById(model.course_id); if(student.user_profile_object.name.toLowerCase().includes(this.search.toLowerCase())){ return model; }else if(course.name.toLowerCase().includes(this.search.toLowerCase())){ return model; }else{ return null; } }, ``` ## 五、学生模块 ### 5.1 注册 见注册模块 ### 5.2 登录 见登录模块 ### 5.3 修改个人信息 ### 5.4 选课 ### 5.5 我的课程 ## 六、教师模块 ### 6.1 注册 ### 6.2 登录 ### 6.3 修改个人信息 ### 6.4 我的课程 (1)列表 (2)搜索 (3)添加 (4)删除 (5)修改 ### 6.5 录入成绩