广州大学学生实验报告

开课学院及实验室:计算机科学与网络工程学院   2023年5月24日

学院 计算机学院 年级、专业、班级 计科213
姓名 edw-Snow 学号 321061000**
课程实验名称 数据库原理实验 成绩
实验项目名称 数据库系统设计综合实验 指导老师

1)实验目的

通过实验,使学生掌握数据库系统设计和开发的一般方法,能够设计并实现简单的数据库系统。

2)实验要求

熟悉实验室实验环境,掌握实验预备知识,了解实验中故障排除的基本方法。实验中根据实验要求完成相应的任务,并独立完成实验报告。

3)实验环境

操作系统:Windows11,数据库管理系统:MySQL8.0.28,Java版本:jdk1.8,Web服务器:tomcat,浏览器:谷歌浏览器,集成开发环境:Intellij IDEA,sqlyog,项目管理:maven

技术栈:vue,axios,servlet,mybatis,elementUI,filter,session,cookie

目录结构:

4)实验内容和步骤

假设有“教师”、“学生”、“课程”三个实体,教师的基本信息包括:工号、姓名、职称、工资,课程的基本信息包括:课程号、课程名、学分数,学生的基本信息包括:学号、姓名、性别、年龄。实体之间存在以下联系:

(1)一门课程至多有一个教师讲授,一个教师可以上多门课程;

(2)一个学生可以选修多门课程,一门课程可以由多个学生来选修,记录不同学生选修不同课程的成绩。

请根据以下步骤,完成数据库设计和应用系统的开发。

  1. 设计并画出E-R图,要求标注连通词(即联系类型);
  2. 将E-R图转化为关系模型,并指出各关系的主码和外码;
  3. 选择一个关系数据库管理系统(例如MySql、SQL Server、Oracle等),设计数据库的物理结构;
  4. 选择一门熟悉的面向对象程序设计语言,设计并开发一个应用管理系统,系统功能必须满足以下要求。

(1)系统包含两类用户,即管理员和学生,管理员登录系统后具有如下功能:

  • 维护(添加、删除和修改等基本任务)学生基本信息、教师基本信息和课程基本信息等;
  • 修改个人基本信息(包括密码)。
  • 能够统计不同职称的教师的数量、不同职称的教师的平均工资;可以统计每个教师所教的每门课程的平均成绩、最高分、最低分;统计每个学生选修课程的总学分以及已经完成的(即60分以上)选修课程的总学分;
  • 当学生选修了某门课程,课程成绩由管理员录入;
  • 可以为学生重置密码;

(2)学生利用学号和密码登录系统后具有如下功能:

  • 修改个人基本信息(包括密码);
  • 选修课程、退选课程;
  • 查询选修课程的成绩;
  • 统计个人的全部选修课程的总学分以及已经完成的(即60分以上)选修课程的总学分。

根据上述描述,解答下列问题:

注:实验报告最低要求必须包括以下内容:

(1)E-R图;

(2)把E-R模型转换为关系模型;

(3)相关表的SQL语句,包括创建表、视图、存储过程、函数、索引等的语句。

对于完成开发的同学,实验报告应该包括主要界面的功能测试(需要截图)以及相关的实现代码。

E-R图:


一、数据库设计

1.存放管理员和学生用户名密码的表administer,studentuser

2.学生表student

3.教师表teacher

4.课程表course

5.选修成绩表score

二、配置maven项目(导包)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>DatabaseExperiment</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>DatabaseExperiment Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build>
</project>

三、配置mybatis运行环境

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><package name="com.myproject.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///experiment?useSSL=false&amp;useServerPrepStmts=true"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!--扫描mapper--><package name="com.myproject.mapper"/></mappers>
</configuration>

 四、dao层代码实现

DatabaseMapper:

package com.myproject.mapper;import com.myproject.pojo.*;
import com.sun.scenario.effect.Crop;
import org.apache.ibatis.annotations.*;import javax.jws.soap.SOAPBinding;
import java.util.List;public interface DatabaseMapper {@Select("select * from experiment.administer where username=#{username} and password=#{password}")User loginAdministerTest(@Param("username") String username, @Param("password") String password);@Select("select * from experiment.studentuser where username=#{username} and password=#{password}")User loginStudentTest(@Param("username") String username, @Param("password") String password);//搜索总行数@Select("select count(*) from experiment.${tableName};")int selectTotalCount(@Param("tableName") String tableName);//分页查询学生表@Select("select * from experiment.student limit #{begin},#{size};")List<Student> selectStudentByPage(@Param("begin") int begin, @Param("size") int size);//分页查询教师表@Select("select * from experiment.teacher limit #{begin},#{size} ;")List<Teacher> selectTeacherByPage(@Param("begin") int begin, @Param("size") int size);//分页查询课程表@Select("select * from experiment.course limit #{begin},#{size} ;")List<Course> selectCrouseByPage(@Param("begin") int begin, @Param("size") int size);@Insert("insert into experiment.student values (#{sid},#{name},#{gender},#{age});")int addStudent(Student student);@Insert("insert into experiment.teacher values (#{tid},#{name},#{position},#{salary});")int addTeacher(Teacher teacher);@Insert("insert into experiment.course values (#{cid},#{name},#{credits},#{tid});")int addCourse(Course course);//修改学生登录信息@Update("update experiment.studentuser set password = #{password} where username =#{username};")void updataStudentMessage(@Param("username") String username, @Param("password") String password);//复选框选中批量删除表数据void deleteByIds(@Param("ids") int[] ids, @Param("tableName") String tableName, @Param("idName") String idName);//修改学生数据@Update("update experiment.student set name = #{name},gender=#{gender},age=#{age} where sid=#{sid};")void updateStudent(Student student);//删除一行学生数据@Delete("delete from experiment.student where sid = #{id};")void deleteStudentByRow(int id);//查询课程表信息@Select("select * from experiment.course;")List<Course> selectCourse();//统计不同职称的老师数量,薪资@Select("select count(*) as numberOfPosition,position,AVG(salary) AS AVGSalaryOfPosition from experiment.teacher group by position order by AVGSalaryOfPosition desc ;")List<PositionStat> selectPositionStat();//统计每个老师所教课程的平均成绩,最高分,最低分@Select("SELECT t.tid as tid, t.name as name, c.name as cname, AVG(s.score) AS avgScore, MAX(s.score) AS maxScore, " +"MIN(s.score) AS minScore FROM experiment.teacher t JOIN experiment.course c " +"ON t.tid = c.tid JOIN experiment.score s ON c.cid = s.cid GROUP BY t.tid, c.cid;")List<TeacherStat> selectTeacherStat();//学生查询课程选修成绩@Select("select student.sid ,student.name as sname,stuScore.cid,course.name as cname,stuScore.score from " +"experiment.student as student,experiment.score as stuScore," +"experiment.course as course where student.sid=stuScore.sid and stuScore.cid=" +"course.cid and student.name= #{stuName}")@ResultMap("StudentStatResultMap")List<StudentStat> selectStudentScore(@Param("stuName") String name);//管理员身份条件查询学生表List<Student> selectStudentByPageAndCondition(@Param("oneStudent") Student student, @Param("begin") int begin, @Param("size") int size);//管理身份条件查询数量int selectStudentTotalCountByCondition(@Param("oneStudent") Student student);//学生选修课程@Insert("INSERT INTO experiment.score (sid, cid)\n" +"SELECT sid, cid\n" +"FROM experiment.student,experiment.course WHERE course.name = #{courseName}\n" +"AND student.name = #{studentName};")int addSelectiveCourse(@Param("courseName") String courseName,@Param("studentName")String studentName);//退选课程@Delete("delete from experiment.score where sid=#{sid} and cid= #{cid};")void handleStudentDelete(@Param("sid")int sid,@Param("cid")int cid);//查询选修的总学分@Select("SELECT SUM(credits) FROM experiment.score,experiment.course,experiment.student WHERE student.sid=score.sid AND score.cid= course.cid AND\n" +"student.name =#{name}")Float getTotalScore(String name);
}

DatabaseMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.myproject.mapper.DatabaseMapper"><resultMap id="StudentStatResultMap" type="StudentStat"><result property="id" column="sid"/></resultMap><delete id="deleteByIds">deletefrom experiment.${tableName}where ${idName} in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete><select id="selectStudentByPageAndCondition" resultType="com.myproject.pojo.Student">select *from experiment.student<where><if test="oneStudent.sid !=null and oneStudent.sid !=''">sid like CONCAT('%',#{oneStudent.sid},'%')</if><if test="oneStudent.name != null and oneStudent.name != ''">`name` like CONCAT('%',#{oneStudent.name},'%')</if><if test="oneStudent.gender != null and oneStudent.gender != ''">gender like CONCAT('%',#{oneStudent.gender},'%')</if><if test="oneStudent.age != null and oneStudent.age != ''">age like CONCAT('%',#{oneStudent.age},'%')</if></where>limit #{begin},#{size}</select><select id="selectStudentTotalCountByCondition" resultType="java.lang.Integer">select count(*)from experiment.student<where><if test="oneStudent.sid !=null and oneStudent.sid !=''">sid like CONCAT('%',#{oneStudent.sid},'%')</if><if test="oneStudent.name != null and oneStudent.name != ''">name like CONCAT('%',#{oneStudent.name},'%')</if><if test="oneStudent.gender != null and oneStudent.gender != ''">gender like CONCAT('%',#{oneStudent.gender},'%')</if><if test="oneStudent.age != null and oneStudent.age != ''">age like CONCAT('%',#{oneStudent.age},'%')</if></where></select>
</mapper>

pojo类:

1.对应数据库的表

package com.myproject.pojo;public class Course {private Integer cid;private String name;private Float credits;private Integer tid;public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Float getCredits() {return credits;}public void setCredits(Float credits) {this.credits = credits;}public Integer getTid() {return tid;}public void setTid(Integer tid) {this.tid = tid;}@Overridepublic String toString() {return "Course{" +"cid=" + cid +", name='" + name + '\'' +", credits=" + credits +", tid=" + tid +'}';}
}
package com.myproject.pojo;public class Score {private Integer sid;private Integer cid;private Float score;public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public Float getScore() {return score;}public void setScore(Float score) {this.score = score;}@Overridepublic String toString() {return "Score{" +"sid=" + sid +", cid=" + cid +", score=" + score +'}';}
}
package com.myproject.pojo;public class Student {private Integer sid;private String name;private String gender;private Integer age;public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"sid=" + sid +", name='" + name + '\'' +", gender='" + gender + '\'' +", age=" + age +'}';}
}
package com.myproject.pojo;public class Teacher {private Integer tid;private String name;private String position;private Float salary;public Integer getTid() {return tid;}public void setTid(Integer tid) {this.tid = tid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}public Float getSalary() {return salary;}public void setSalary(Float salary) {this.salary = salary;}@Overridepublic String toString() {return "Teacher{" +"tid=" + tid +", name='" + name + '\'' +", position='" + position + '\'' +", salary=" + salary +'}';}
}

2.实现统计数据功能的pojo类

2.1 统计不同职称的教师的数量、不同职称的教师的平均工资:

package com.myproject.pojo;public class PositionStat {private String position;private Integer numberOfPosition;private Float avgSalaryOfPosition;public Integer getNumberOfPosition() {return numberOfPosition;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}public void setNumberOfPosition(Integer numberOfPosition) {this.numberOfPosition = numberOfPosition;}public Float getAvgSalaryOfPosition() {return avgSalaryOfPosition;}public void setAvgSalaryOfPosition(Float avgSalaryOfPosition) {this.avgSalaryOfPosition = avgSalaryOfPosition;}@Overridepublic String toString() {return "PositionStat{" +"position='" + position + '\'' +", numberOfPosition=" + numberOfPosition +", avgSalaryOfPosition=" + avgSalaryOfPosition +'}';}
}

2.2 统计每个学生选修课程的总学分以及已经完成的(即60分以上)选修课程的总学分

package com.myproject.pojo;public class StudentStat {private Integer id;private String sname;private Integer cid;private String cname;private Float score;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Float getScore() {return score;}public void setScore(Float score) {this.score = score;}@Overridepublic String toString() {return "StudentStat{" +"id=" + id +", sname='" + sname + '\'' +", cid=" + cid +", cname='" + cname + '\'' +", score=" + score +'}';}
}

2.3 统计每个教师所教的每门课程的平均成绩、最高分、最低分

package com.myproject.pojo;import java.text.DecimalFormat;public class TeacherStat {private Integer tid;private String name;private String cname;private Float avgScore;private Float maxScore;private Float minScore;static DecimalFormat df = new DecimalFormat("#0.00");public Integer getTid() {return tid;}public void setTid(Integer tid) {this.tid = tid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Float getAvgScore() {return avgScore;}public void setAvgScore(Float avgScore) {this.avgScore = Float.valueOf(df.format(avgScore));}public Float getMaxScore() {return maxScore;}public void setMaxScore(Float maxScore) {this.maxScore=Float.valueOf(df.format(maxScore));}public Float getMinScore() {return minScore;}public void setMinScore(Float minScore) {this.minScore=Float.valueOf(df.format(minScore));}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}@Overridepublic String toString() {return "TeacherStat{" +"tid=" + tid +", name='" + name + '\'' +", cname='" + cname + '\'' +", avgScore=" + avgScore +", maxScore=" + maxScore +", minScore=" + minScore +'}';}
}

 五、编写service层代码

OperateService:

package com.myproject.service;import com.myproject.pojo.PageBean;
import com.myproject.pojo.Student;public interface OperateService {}

AdministorServiceImpl:

package com.myproject.service.impl;import com.myproject.mapper.DatabaseMapper;
import com.myproject.pojo.*;
import com.myproject.service.OperateService;
import com.myproject.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;public class AdministorServiceImpl implements OperateService {SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();//分页查询学生信息public PageBean<Student> selectStudentByPage(int currentPage, int pageSize) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);int begin = (currentPage - 1) * pageSize;int size = pageSize;List<Student> rows = mapper.selectStudentByPage(begin, size);int totalCount = mapper.selectTotalCount("student");PageBean<Student> studentPageBean = new PageBean<Student>();studentPageBean.setRows(rows);studentPageBean.setTotalCount(totalCount);sqlSession.close();return studentPageBean;}public PageBean<Teacher> selectTeacherByPage(int currentPage, int pageSize) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);int begin = (currentPage - 1) * pageSize;int size = pageSize;List<Teacher> rows = mapper.selectTeacherByPage(begin, size);int totalCount = mapper.selectTotalCount("teacher");PageBean<Teacher> teacherPageBean = new PageBean<Teacher>();teacherPageBean.setRows(rows);teacherPageBean.setTotalCount(totalCount);sqlSession.close();return teacherPageBean;}public void updataStudentMessage(String username, String password) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);mapper.updataStudentMessage(username, password);sqlSession.commit();sqlSession.close();}//添加学生信息public int addStudent(Student student) {SqlSession sqlSession = null;try {sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);int sucess = mapper.addStudent(student);sqlSession.commit();return sucess;} catch (Exception e) {return -1;} finally {if (sqlSession != null) {sqlSession.close();}}}public int addTeacher(Teacher teacher) {SqlSession sqlSession = null;try {sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);int success = mapper.addTeacher(teacher);sqlSession.commit();sqlSession.close();return success;} catch (Exception e) {return -1;} finally {if (sqlSession != null) {sqlSession.close();}}}//批量删除学生信息public void deleteByIds(int[] ids, String tableName) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);if ("student".equals(tableName)) {mapper.deleteByIds(ids, tableName, "sid");} else if ("teacher".equals(tableName)) {mapper.deleteByIds(ids, tableName, "tid");} else if ("course".equals(tableName)) {mapper.deleteByIds(ids, tableName, "cid");}sqlSession.commit();sqlSession.close();}//修改学生信息public void updateStudent(Student student) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);mapper.updateStudent(student);sqlSession.commit();sqlSession.close();}public void deleteStudentByRow(int id) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);mapper.deleteStudentByRow(id);sqlSession.commit();sqlSession.close();}public List<PositionStat> selectPositionStat() {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);List<PositionStat> positionStats = mapper.selectPositionStat();sqlSession.close();return positionStats;}public List<TeacherStat> selectTeacherStat() {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);List<TeacherStat> teacherStats = mapper.selectTeacherStat();sqlSession.close();return teacherStats;}//管理员身份条件模糊查询学生表public PageBean<Student> selectStudentByPageAndCondition(int currentPage, int pageSize, Student student) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);int begin = (currentPage - 1) * pageSize;int size = pageSize;List<Student> rows = mapper.selectStudentByPageAndCondition(student, begin, size);int totalCount = mapper.selectStudentTotalCountByCondition(student);PageBean<Student> studentPageBean = new PageBean<Student>();studentPageBean.setRows(rows);studentPageBean.setTotalCount(totalCount);sqlSession.close();return studentPageBean;}}

CommonServiceImpl(课程表):

package com.myproject.service.impl;import com.myproject.mapper.DatabaseMapper;
import com.myproject.pojo.Course;
import com.myproject.service.OperateService;
import com.myproject.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;public class CommonServiceImpl implements OperateService {SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();public List<Course> selectCourse() {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);List<Course> courses = mapper.selectCourse();sqlSession.close();return courses;}
}

StudentServiceImpl:

package com.myproject.service.impl;import com.myproject.mapper.DatabaseMapper;
import com.myproject.pojo.PageBean;
import com.myproject.pojo.Student;
import com.myproject.pojo.StudentStat;
import com.myproject.service.OperateService;
import com.myproject.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;public class StudentServiceImpl implements OperateService {SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();public List<StudentStat> selectStudentScore(String name) {SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);List<StudentStat> studentStats = mapper.selectStudentScore(name);sqlSession.close();return studentStats;}//学生选修课程public int addSelectiveCourse(String courseName, String studentName) {SqlSession sqlSession = null;try {sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);int success = mapper.addSelectiveCourse(courseName, studentName);sqlSession.commit();return success;} catch (Exception e) {return -1;} finally {if (sqlSession != null)sqlSession.close();}}public void handleStudentDelete(int sid, int cid){SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);mapper.handleStudentDelete(sid,cid);sqlSession.commit();sqlSession.close();}public Float getTotalScore(String name){SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);Float totalScore = mapper.getTotalScore(name);sqlSession.close();return totalScore;}
}

 六、实现Web层代码

1.util.SqlSessionFactoryUtils(封装复用):

package com.myproject.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;}
}

2.servlet类实现

2.1 BaseServlet(实现方法映射):

package com.myproject.web;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String uri = req.getRequestURI();int index = uri.lastIndexOf('/');String methodName = uri.substring(index + 1);Class<? extends BaseServlet> cls = this.getClass();try {Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);method.invoke(this,req,resp);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}}
}

2.2 AdministerServlet:

package com.myproject.web;import com.alibaba.fastjson.JSON;
import com.myproject.pojo.*;
import com.myproject.service.OperateService;
import com.myproject.service.impl.AdministorServiceImpl;
import com.myproject.service.impl.StudentServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;@WebServlet("/administer/*")
public class AdministerServlet extends BaseServlet {private AdministorServiceImpl adminsterService = new AdministorServiceImpl();//分页查询学生表public void selectStudentByPage(HttpServletRequest request, HttpServletResponse response) throws IOException {String _currentPage = request.getParameter("currentPage");String _size = request.getParameter("pageSize");int currentPage = Integer.parseInt(_currentPage);int size = Integer.parseInt(_size);PageBean<Student> studentPageBean = adminsterService.selectStudentByPage(currentPage, size);String jsonString = JSON.toJSONString(studentPageBean);response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}public void selectTeacherByPage(HttpServletRequest request, HttpServletResponse response) throws IOException {String _currentPage = request.getParameter("currentPage");String _size = request.getParameter("pageSize");int currentPage = Integer.parseInt(_currentPage);int size = Integer.parseInt(_size);PageBean<Teacher> teacherPageBean = adminsterService.selectTeacherByPage(currentPage, size);String jsonString = JSON.toJSONString(teacherPageBean);response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}//添加学生public void addStudent(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedReader reader = request.getReader();String params = reader.readLine();Student student = JSON.parseObject(params, Student.class);int sucess = adminsterService.addStudent(student);response.getWriter().write(Integer.toString(sucess));}public void addTeacher(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedReader reader = request.getReader();String readLine = reader.readLine();Teacher teacher = JSON.parseObject(readLine, Teacher.class);int success = adminsterService.addTeacher(teacher);response.getWriter().write(Integer.toString(success));}//更新学生登录信息public void updataStudentMessage(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedReader reader = request.getReader();String readLine = reader.readLine();User user = JSON.parseObject(readLine, User.class);String username = user.getUsername();String password = user.getPassword();adminsterService.updataStudentMessage(username, password);response.getWriter().write("success");}//批量删除学生public void deleteByStudentIds(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedReader reader = request.getReader();String readLine = reader.readLine();int[] ids = JSON.parseObject(readLine, int[].class);adminsterService.deleteByIds(ids, "student");response.getWriter().write("success");}public void deleteByTeacherIds(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedReader reader = request.getReader();String readLine = reader.readLine();int[] ids = JSON.parseObject(readLine, int[].class);adminsterService.deleteByIds(ids, "teacher");response.getWriter().write("success");}public void updateStudent(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedReader reader = request.getReader();String readLine = reader.readLine();Student student = JSON.parseObject(readLine, Student.class);adminsterService.updateStudent(student);response.getWriter().write("success");}public void deleteStudentByRow(HttpServletRequest request, HttpServletResponse response) throws IOException {BufferedReader reader = request.getReader();String readLine = reader.readLine();Integer integer = JSON.parseObject(readLine, int.class);adminsterService.deleteStudentByRow(integer);response.getWriter().write("success");}public void selectPositionStat(HttpServletRequest request, HttpServletResponse response) throws IOException {List<PositionStat> positionStats = adminsterService.selectPositionStat();String jsonString = JSON.toJSONString(positionStats);response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}public void selectTeacherStat(HttpServletRequest request, HttpServletResponse response) throws IOException {List<TeacherStat> teacherStats = adminsterService.selectTeacherStat();String jsonString = JSON.toJSONString(teacherStats);response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}public void selectStudentByPageAndCondition(HttpServletRequest request, HttpServletResponse response) throws IOException {//url数据String _currentPage = request.getParameter("currentPage");String _size = request.getParameter("pageSize");int currentPage = Integer.parseInt(_currentPage);int size = Integer.parseInt(_size);//json数据BufferedReader reader = request.getReader();String readLine = reader.readLine();Student student = JSON.parseObject(readLine, Student.class);PageBean<Student> studentPageBean = adminsterService.selectStudentByPageAndCondition(currentPage, size, student);String jsonString = JSON.toJSONString(studentPageBean);response.setContentType("text/json;charset=utf-8");response.getWriter().write(jsonString);}
}

2.3 StudentServlet:

package com.myproject.web;import com.alibaba.fastjson.JSON;
import com.myproject.pojo.Student;
import com.myproject.pojo.StudentStat;
import com.myproject.pojo.User;
import com.myproject.service.impl.AdministorServiceImpl;
import com.myproject.service.impl.StudentServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sound.sampled.AudioFormat;
import java.io.IOException;
import java.util.List;@WebServlet("/student/*")
public class StudentServlet extends BaseServlet {private StudentServiceImpl studentServiceImpl = new StudentServiceImpl();public void selectStudentScore(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();User student = (User) session.getAttribute("student");List<StudentStat> studentStats = studentServiceImpl.selectStudentScore(student.getUsername());String jsonString = JSON.toJSONString(studentStats);resp.setContentType("text/json;charset=utf-8");resp.getWriter().write(jsonString);}public void addSelectiveCourse(HttpServletRequest request, HttpServletResponse response) throws IOException {HttpSession session = request.getSession();User student = (User) session.getAttribute("student");String username = student.getUsername();String str = request.getParameter("courseName");byte[] bytes = str.getBytes("ISO-8859-1");String courseName = new String(bytes, "utf-8");int flag = studentServiceImpl.addSelectiveCourse(courseName, username);response.getWriter().write(Integer.toString(flag));}public void handleStudentDelete(HttpServletRequest request, HttpServletResponse response) throws IOException {String _sid = request.getParameter("sid");String _cid = request.getParameter("cid");int sid = Integer.parseInt(_sid);int cid = Integer.parseInt(_cid);studentServiceImpl.handleStudentDelete(sid, cid);response.getWriter().write("success");}public void getTotalScore(HttpServletRequest request, HttpServletResponse response) throws IOException {HttpSession session = request.getSession();User student = (User) session.getAttribute("student");String name = student.getUsername();Float totalScore = studentServiceImpl.getTotalScore(name);response.getWriter().write(Float.toString(totalScore));}
}

CommonServlet:

package com.myproject.web;import com.alibaba.fastjson.JSON;
import com.myproject.pojo.Student;
import com.myproject.pojo.StudentStat;
import com.myproject.pojo.User;
import com.myproject.service.impl.AdministorServiceImpl;
import com.myproject.service.impl.StudentServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sound.sampled.AudioFormat;
import java.io.IOException;
import java.util.List;@WebServlet("/student/*")
public class StudentServlet extends BaseServlet {private StudentServiceImpl studentServiceImpl = new StudentServiceImpl();public void selectStudentScore(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();User student = (User) session.getAttribute("student");List<StudentStat> studentStats = studentServiceImpl.selectStudentScore(student.getUsername());String jsonString = JSON.toJSONString(studentStats);resp.setContentType("text/json;charset=utf-8");resp.getWriter().write(jsonString);}public void addSelectiveCourse(HttpServletRequest request, HttpServletResponse response) throws IOException {HttpSession session = request.getSession();User student = (User) session.getAttribute("student");String username = student.getUsername();String str = request.getParameter("courseName");byte[] bytes = str.getBytes("ISO-8859-1");String courseName = new String(bytes, "utf-8");int flag = studentServiceImpl.addSelectiveCourse(courseName, username);response.getWriter().write(Integer.toString(flag));}public void handleStudentDelete(HttpServletRequest request, HttpServletResponse response) throws IOException {String _sid = request.getParameter("sid");String _cid = request.getParameter("cid");int sid = Integer.parseInt(_sid);int cid = Integer.parseInt(_cid);studentServiceImpl.handleStudentDelete(sid, cid);response.getWriter().write("success");}public void getTotalScore(HttpServletRequest request, HttpServletResponse response) throws IOException {HttpSession session = request.getSession();User student = (User) session.getAttribute("student");String name = student.getUsername();Float totalScore = studentServiceImpl.getTotalScore(name);response.getWriter().write(Float.toString(totalScore));}
}

2.4 loginServlet:

package com.myproject.web;import com.alibaba.fastjson.JSON;
import com.myproject.mapper.DatabaseMapper;
import com.myproject.pojo.User;
import com.myproject.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;@WebServlet("/loginServlet/*")
public class loginServlet extends BaseServlet {public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();SqlSession sqlSession = factory.openSession();DatabaseMapper mapper = sqlSession.getMapper(DatabaseMapper.class);BufferedReader br = req.getReader();String params = br.readLine();User login = JSON.parseObject(params, User.class);String username = login.getUsername();String password = login.getPassword();User user = mapper.loginAdministerTest(username, password);HttpSession session = req.getSession();if (user != null) {//跳转页面,并显示成功登录管理员resp.getWriter().write("administer");session.setAttribute("administer",user);sqlSession.close();return;}User user1 = mapper.loginStudentTest(username, password);if (user1 != null) {//跳转页面,并显示成功登录学生resp.getWriter().write("student");session.setAttribute("student", user1);sqlSession.close();return;}//回复错误信息resp.getWriter().write("notFound");}//学生登录时的身份显示public void getUserName(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();User student = (User) session.getAttribute("student");resp.setContentType("text/json;charset=utf-8");resp.getWriter().write(student.getUsername());}//管理员cookiepublic void administerCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = "administer";name = URLEncoder.encode(name, "UTF-8");Cookie cookie = new Cookie("administer", name);resp.addCookie(cookie);}//学生cookiepublic void studentCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();User student =(User) session.getAttribute("student");String name = student.getUsername();name = URLEncoder.encode(name, "UTF-8");Cookie cookie = new Cookie("student", name);resp.addCookie(cookie);}//获取cookiepublic void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie[] cookies = req.getCookies();PrintWriter writer = resp.getWriter();for (Cookie cookie : cookies) {String name = cookie.getName();if ("student".equals(name)) {writer.write(name);return;}}writer.write("administer");}
}

3.filter拦截器

AdministerFilter:

package com.myproject.web.filter;import com.myproject.pojo.User;import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import javax.servlet.annotation.WebFilter;@WebFilter(value = {"/administer/*", "/administerStudent.html", "/administerTeacher.html"})
public class AdministerFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {HttpServletRequest req = (HttpServletRequest) request;HttpSession session = req.getSession();User administer = (User) session.getAttribute("administer");if (administer != null) {chain.doFilter(request, response);}}public void init(FilterConfig config) throws ServletException {}public void destroy() {}
}

CommonFilter:

package com.myproject.web.filter;import com.myproject.pojo.User;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;@javax.servlet.annotation.WebFilter(value = {"/administerCourse.html","/common/*"})
public class CommonFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {HttpServletRequest req = (HttpServletRequest) request;HttpSession session = req.getSession();User student = (User) session.getAttribute("student");User administer = (User) session.getAttribute("administer");if (student != null || administer!=null) {chain.doFilter(request, response);}}public void init(FilterConfig config) throws ServletException {}public void destroy() {}
}

LoginFilter:

package com.myproject.web.filter;import com.myproject.pojo.User;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;/*** 登录验证的过滤器* 每次登录成功存储随机cookie和session,每次登录界面加载成功遍历session,实现记住密码*///@javax.servlet.annotation.WebFilter(value = {"/loginServlet"})
public class LoginFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {}public void init(FilterConfig config) throws ServletException {}public void destroy() {}
}

StudentFilter:

package com.myproject.web.filter;import com.myproject.pojo.User;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;@javax.servlet.annotation.WebFilter(value = {"/student.html","/student/*"})
public class StudentFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {HttpServletRequest req = (HttpServletRequest) request;HttpSession session = req.getSession();User student = (User) session.getAttribute("student");if (student != null) {chain.doFilter(request, response);}}public void init(FilterConfig config) throws ServletException {}public void destroy() {}
}

 七、css样例实现

design.css(表格页面设计):

.center {display: flex;justify-content: center;align-items: center;color: #3a8ee6;
}.shift {display: flex;justify-content: center;align-items: center;
}.el-table .warning-row {background: oldlace;
}.el-table .success-row {background: #f0f9eb;
}.el-form-item.course-input {margin-right: 915px; /* 或其他间距值 */
}
.el-form-item.course-input1{margin-right: 840px;
}

login.css:

* {margin: 0;padding: 0;
}html {height: 100%;width: 100%;overflow: hidden;margin: 0;padding: 0;background: url(../imgs/background.jpg) no-repeat 0px 0px;background-repeat: no-repeat;background-size: 100% 100%;-moz-background-size: 100% 100%;
}body {display: flex;align-items: center;justify-content: center;height: 100%;
}#loginDiv {width: 37%;display: flex;justify-content: center;align-items: center;height: 380px;background-color: rgba(75, 81, 95, 0.3);box-shadow: 7px 7px 17px rgba(52, 56, 66, 0.5);border-radius: 5px;
}#name_trip {margin-left: 50px;color: red;
}p {margin-top: 30px;margin-left: 20px;color: azure;
}#remember{margin-left: 15px;border-radius: 5px;border-style: hidden;background-color: rgba(216, 191, 216, 0.5);outline: none;padding-left: 10px;height: 20px;width: 20px;
}
#username{width: 200px;margin-left: 15px;border-radius: 5px;border-style: hidden;height: 30px;background-color: rgba(216, 191, 216, 0.5);outline: none;color: #f0edf3;padding-left: 10px;
}
#password{width: 202px;margin-left: 15px;border-radius: 5px;border-style: hidden;height: 30px;background-color: rgba(216, 191, 216, 0.5);outline: none;color: #f0edf3;padding-left: 10px;
}
.button {border-color: cornsilk;background-color: rgba(100, 149, 237, .7);color: aliceblue;border-style: hidden;border-radius: 5px;width: 100px;height: 31px;font-size: 16px;
}#subDiv {text-align: center;margin-top: 30px;
}
#loginMsg{text-align: center;color: aliceblue;
}
#errorMsg{text-align: center;color:red;
}

 八、编写HTML页面代码

1.管理员界面

administerCourse.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>administer</title><script src="js/vue.js"></script><script src="element-ui/lib/index.js"></script><link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"><script src="js/axios-0.18.0.js"></script><link href="css/design.css" rel="stylesheet">
</head>
<body>
<div id="course"><h2 class="center">课程表</h2><el-row style="display:flex; align-items:center;"><div style="flex:1; display:flex; align-items:center;"><el-button type="danger" plain>批量删除</el-button><el-button type="primary" plain>新增</el-button></div><div style="display:flex; align-items:center; flex-shrink:0; text-align:right;"><el-button @click="toStudentHtml" id="returnBtn" type="primary" plain>返回</el-button></div></el-row><!--  课程表单--><template><el-table:data="courseData"style="width: 100%":row-class-name="tableRowClassName"@selection-change="handleSelectionChange"><el-table-columntype="selection"width="55"></el-table-column><el-table-columnprop="cid"label="课程号"align="center"></el-table-column><el-table-columnprop="name"label="课程名称"align="center"></el-table-column><el-table-columnprop="credits"align="center"label="课程学分"></el-table-column><el-table-columnprop="tid"align="center"label="课程教师工号"></el-table-column><el-table-columnalign="center"label="操作"><template slot-scope="scope"><el-row><el-button type="primary" @click="handleStudentEdit(scope.row);dialogVisible2=true">修改</el-button><el-button type="danger" @click="handleStudentDelete(scope.row)">删除</el-button></el-row></template></el-table-column></el-table></template><el-row class="shift"><el-button type="primary" @click="toStudentTable" round>学生表</el-button><span style="width: 50px;"></span><el-button type="primary" @click="toTeacherTable" round>教师表</el-button></el-row>
</div>
<script>new Vue({el: "#course",mounted() {this.selectCourse();this.toBackDisplay();},data() {return {courseData: [],//课程信息course: {cid: "",name: "",credits: "",tid: ""}}},methods: {//返回学生课程页面toStudentHtml() {window.location.href = "http://localhost:8080/DatabaseExperiment/student.html";},//返回按钮是否展示toBackDisplay() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/loginServlet/getCookie",}).then(resp => {if (resp.data == "administer") {document.getElementById('returnBtn').style.display = 'none';} else if (resp.data == "student") {document.getElementById('returnBtn').style.display = 'block';}})},handleStudentDelete(row) {},handleStudentEdit(row) {},handleSelectionChange(val) {},toStudentTable() {window.location.href = "http://localhost:8080/DatabaseExperiment/administerStudent.html";},toTeacherTable() {window.location.href = "http://localhost:8080/DatabaseExperiment/administerTeacher.html";},tableRowClassName({row, rowIndex}) {if (rowIndex % 4 == 2) {return 'warning-row';} else if (rowIndex % 4 == 0) {return 'success-row';}return '';},selectCourse() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/common/selectCourse",}).then(resp => {this.courseData = resp.data;})}}})
</script>
</body>
</html>

administerStudent.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>administer</title><script src="js/vue.js"></script><script src="element-ui/lib/index.js"></script><link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"><script src="js/axios-0.18.0.js"></script><link href="css/design.css" rel="stylesheet">
</head>
<body>
<div id="student"><h2 class="center">学生表</h2><div style="height: 10px"></div><el-form :inline="true"><el-button type="danger" plain @click="deleteByStudentIds">批量删除</el-button><el-button type="primary" plain @click="dialogVisible1 = true">新增</el-button><el-form-item class="course-input1"><el-button type="primary" plain @click="dialogVisible = true">修改学生登录信息</el-button></el-form-item><el-form-item><el-input placeholder="请输入学生姓名" v-model="studentInput.name"></el-input></el-form-item><el-button type="primary" @click="onSubmitMessage">查询</el-button></el-form><!--修改学生登录信息表单--><el-dialogtitle="修改学生信息":visible.sync="dialogVisible"width="30%"><el-form ref="form" :model="studentMessage" label-width="80px"><el-form-item label="学生用户名" style="white-space: nowrap;"><el-input v-model="studentMessage.username"></el-input></el-form-item><el-form-item label="学生密码"><el-input v-model="studentMessage.password"></el-input></el-form-item><el-form-item><el-button type="primary" @click="modifyStudent">提交</el-button><el-button @click="dialogVisible = false">取消</el-button></el-form-item></el-form></el-dialog><!--  新增学生表单  --><el-dialogtitle="添加学生":visible.sync="dialogVisible1"width="30%"><el-form ref="studentForm" :model="student" label-width="80px"><el-form-item label="学号" prop="sid" style="white-space: nowrap;"><el-input v-model="student.sid"></el-input></el-form-item><el-form-item label="姓名" prop="name"><el-input v-model="student.name"></el-input></el-form-item><el-form-item label="性别" prop="gender"><el-input v-model="student.gender"></el-input></el-form-item><el-form-item label="年龄" prop="age"><el-input v-model="student.age"></el-input></el-form-item><el-form-item><el-button type="primary" @click="addStudent">提交</el-button><el-button @click="dialogVisible1 = false">取消</el-button></el-form-item></el-form></el-dialog><!--    修改学生表单--><el-dialogtitle="修改学生":visible.sync="dialogVisible2"width="30%"><el-form ref="studentForm" :model="studentSelected" label-width="80px"><el-form-item label="姓名" prop="name"><el-input v-model="studentSelected.name"></el-input></el-form-item><el-form-item label="性别" prop="gender"><el-input v-model="studentSelected.gender"></el-input></el-form-item><el-form-item label="年龄" prop="age"><el-input v-model="studentSelected.age"></el-input></el-form-item><el-form-item><el-button type="primary" @click="modifyStudentData">提交</el-button><el-button @click="dialogVisible2 = false">取消</el-button></el-form-item></el-form></el-dialog><!--    学生表格--><template><el-table:data="studentData"style="width: 100%":row-class-name="tableRowClassName"@selection-change="handleSelectionChange"><el-table-columntype="selection"width="55"></el-table-column><!--            <el-table-column--><!--                    type="index"--><!--                    width="50">--><!--            </el-table-column>--><el-table-columnprop="sid"label="学生学号"align="center"></el-table-column><el-table-columnprop="name"label="学生姓名"align="center"></el-table-column><el-table-columnprop="gender"align="center"label="性别"></el-table-column><el-table-columnprop="age"align="center"label="年龄"></el-table-column><el-table-columnalign="center"label="操作"><template slot-scope="scope"><el-row><el-button type="primary" @click="handleStudentEdit(scope.row);dialogVisible2=true">修改</el-button><el-button type="danger" @click="handleStudentDelete(scope.row)">删除</el-button></el-row></template></el-table-column></el-table></template><!--    分页工具条--><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage":page-sizes="[5, 10, 15, 20]":page-size="5"layout="total, sizes, prev, pager, next, jumper":total="totalCount"></el-pagination><br><el-row class="shift"><el-button type="primary" @click="toTeacherTable" round>教师表</el-button><span style="width: 50px;"></span><el-button type="primary" @click="toCrouseTable" round>课程表</el-button></el-row>
</div>
<script>// import el from "./element-ui/src/locale/lang/el";new Vue({el: "#student",mounted() {this.selectStudent();this.open1();},data() {return {//条件查询输入的数据studentInput: {sid: "",name: "",gender: "",age: ""},text: "das",//批量删除时选中的元素selectedIds: [],//复选框选中的信息multipleSelection: [],//修改学生登录信息弹窗dialogVisible: false,//新增学生信息窗口dialogVisible1: false,//修改学生信息表单dialogVisible2: false,//表格数据studentData: [],//修改时展示行的学生信息studentSelected: {sid: "",name: "",gender: "",age: ""},studentData1: [{sid: "1",name: "mike",gender: "男",age: "18"}, {sid: "2",name: "mike",gender: "男",age: "18"}],teacherData: [],courseData: [],//学生用户名和密码studentMessage: {username: "",password: ""},//每页显示条数pageSize: 5,//总记录数:totalCount: 100,//当前页码currentPage: 1,//学生信息student: {sid: "",name: "",gender: "",age: ""},// //教师信息// teacher: {//     tid: "",//     name: "",//     position: "",//     salary: ""// },//课程信息course: {cid: "",name: "",credits: "",tid: ""}}},methods: {//条件查询数据获取onSubmitMessage() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/selectStudentByPageAndCondition?currentPage=" + this.currentPage + "&pageSize=" + this.pageSize,data: this.studentInput}).then(resp => {this.totalCount = resp.data.totalCount;this.studentData = resp.data.rows;})},//跳转教师表toTeacherTable() {window.location.href = "http://localhost:8080/DatabaseExperiment/administerTeacher.html";},//跳转课程表toCrouseTable() {window.location.href = "http://localhost:8080/DatabaseExperiment/administerCourse.html";},handleStudentEdit(row) {this.studentSelected.sid = row.sid;this.studentSelected.name = row.name;this.studentSelected.gender = row.gender;this.studentSelected.age = row.age;},handleStudentDelete(row) {this.$confirm('此操作将删除该数据, 是否继续?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/deleteStudentByRow",data: row.sid}).then(resp => {if (resp.data == "success") {this.selectStudent();this.$message({message: '删除成功',type: 'success'});}})})},//显示登录信息open1() {let flag = sessionStorage.getItem('flag');if (!flag) {this.$notify({title: '管理员身份登录成功',// message: '这是一条成功的提示消息',type: 'success'});sessionStorage.setItem('flag', true)}},deleteByStudentIds() {this.$confirm('此操作将删除该数据, 是否继续?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {for (let i = 0; i < this.multipleSelection.length; i++) {let selectElement = this.multipleSelection[i];this.selectedIds[i] = selectElement.sid;}axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/deleteByStudentIds",data: this.selectedIds}).then(resp => {if (resp.data == "success") {this.selectStudent();this.$message({message: '批量删除成功',type: 'success'});}})})},modifyStudent() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/updataStudentMessage",data: this.studentMessage}).then(resp => {if (resp.data == "success") {this.dialogVisible = false;this.$message({message: '修改成功',type: 'success'});}})},//修改学生modifyStudentData() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/updateStudent",data: this.studentSelected}).then(resp => {if (resp.data == "success") {this.dialogVisible2 = false;this.selectStudent();this.$message({message: '修改成功',type: 'success'});}})},//添加学生addStudent() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/addStudent",data: this.student}).then(resp => {if (resp.data == "1") {this.selectStudent();this.dialogVisible1 = false;this.$message({message: '添加成功',type: 'success'});} else {this.$message.error('主键重复,添加失败');}})},//表格展现每行变化tableRowClassName({row, rowIndex}) {if (rowIndex % 4 == 2) {return 'warning-row';} else if (rowIndex % 4 == 0) {return 'success-row';}return '';},// 复选框选中后执行的方法handleSelectionChange(val) {this.multipleSelection = val;// console.log(this.multipleSelection)},//查询所有selectStudent() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/selectStudentByPage?currentPage=" + this.currentPage + "&pageSize=" + this.pageSize,}).then(resp => {this.totalCount = resp.data.totalCount;this.studentData = resp.data.rows;})},//分页handleSizeChange(val) {// 重新设置每页显示的条数this.pageSize = val;this.selectStudent();},handleCurrentChange(val) {// 重新设置当前页码this.currentPage = val;this.selectStudent();},}})
</script>
</body>
</html>

administerTeacher.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>administer</title><script src="js/vue.js"></script><script src="element-ui/lib/index.js"></script><link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"><script src="js/axios-0.18.0.js"></script><link href="css/design.css" rel="stylesheet">
</head>
<body>
<div id="teacher"><el-row><h2 class="center">教师表</h2><el-button type="danger" plain @click="deleteByTeacherIds">批量删除</el-button><el-button type="primary" plain @click="dialogVisible1 = true">新增</el-button><el-button type="primary" plain @click="selectPositionStat();dialogVisible3 = true">统计职称信息</el-button><el-button type="primary" plain @click="selectTeacherStat();dialogVisible4 = true">统计教师信息</el-button></el-row><!--    职称信息--><el-dialog title="职称信息" :visible.sync="dialogVisible3" width="30%"><div v-for="instance in positionStat"><p>职称: {{ instance.position }} 人数: {{ instance.numberOfPosition }} 平均薪资:{{ instance.avgSalaryOfPosition}}</p></div></el-dialog><!--  新增教师按钮--><el-dialogtitle="添加学生":visible.sync="dialogVisible1"width="30%"><el-form ref="studentForm" :model="teacher" label-width="80px"><el-form-item label="学号" prop="tid" style="white-space: nowrap;"><el-input v-model="teacher.tid"></el-input></el-form-item><el-form-item label="姓名" prop="name"><el-input v-model="teacher.name"></el-input></el-form-item><el-form-item label="性别" prop="position"><el-input v-model="teacher.position"></el-input></el-form-item><el-form-item label="年龄" prop="salary"><el-input v-model="teacher.salary"></el-input></el-form-item><el-form-item><el-button type="primary" @click="addTeacher">提交</el-button><el-button @click="dialogVisible1 = false">取消</el-button></el-form-item></el-form></el-dialog><!--  教师表单--><template><el-table:data="teacherData"style="width: 100%":row-class-name="tableRowClassName"@selection-change="handleSelectionChange"><el-table-columntype="selection"width="55"></el-table-column><el-table-columnprop="tid"label="教师工号"align="center"></el-table-column><el-table-columnprop="name"label="教师姓名"align="center"></el-table-column><el-table-columnprop="position"align="center"label="职位"></el-table-column><el-table-columnprop="salary"align="center"label="薪水"></el-table-column><el-table-columnalign="center"label="操作"><template slot-scope="scope"><el-row><el-button type="primary" @click="handleStudentEdit(scope.row);dialogVisible2=true">修改</el-button><el-button type="danger" @click="handleStudentDelete(scope.row)">删除</el-button></el-row></template></el-table-column></el-table></template><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage":page-sizes="[5, 10, 15, 20]":page-size="5"layout="total, sizes, prev, pager, next, jumper":total="totalCount"></el-pagination><el-row class="shift"><el-button type="primary" @click="toStudentTable" round>学生表</el-button><span style="width: 50px;"></span><el-button type="primary" @click="toCrouseTable" round>课程表</el-button></el-row><!--    教师信息dialog--><el-dialog title="教师信息" :visible.sync="dialogVisible4" width="80%"><template><el-table:data="TeacherStat"style="width: 100%":row-class-name="tableRowClassName"><el-table-columnprop="tid"label="教师工号"align="center"></el-table-column><el-table-columnprop="name"label="教师姓名"align="center"></el-table-column><el-table-columnprop="cname"align="center"label="课程名称"></el-table-column><el-table-columnprop="avgScore"align="center"label="平均分"></el-table-column><el-table-columnprop="maxScore"align="center"label="最高分"></el-table-column><el-table-columnprop="minScore"align="center"label="最低分"></el-table-column></el-table></template></el-dialog>
</div>
<script>new Vue({el: "#teacher",mounted() {this.selectTeacher();},data() {return {//职称信息positionStat: [],//教师信息TeacherStat: [],selectedIds: [],//每页显示条数pageSize: 5,//总记录数:totalCount: 100,//当前页码currentPage: 1,dialogVisible2: false,//添加教师表单dialogVisible1: false,dialogVisible: false,//统计职称信息对话框dialogVisible3: false,//统计教师信息对话框dialogVisible4: false,//教师信息teacher: {tid: "",name: "",position: "",salary: ""},teacherData: [],teacherSelected: {tid: "",name: "",position: "",salary: ""},}},methods: {//教师信息selectTeacherStat() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/selectTeacherStat"}).then(resp => {this.TeacherStat = resp.data;})},//职称信息selectPositionStat() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/selectPositionStat"}).then(resp => {this.positionStat = resp.data;})},deleteByTeacherIds() {this.$confirm('此操作将删除该数据, 是否继续?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {for (let i = 0; i < this.multipleSelection.length; i++) {let selectElement = this.multipleSelection[i];this.selectedIds[i] = selectElement.tid;}axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/deleteByTeacherIds",data: this.selectedIds}).then(resp => {if (resp.data == "success") {this.selectTeacher();this.$message({message: "批量删除成功",type: "success"})}})})},handleSizeChange(val) {// 重新设置每页显示的条数this.pageSize = val;this.selectTeacher();},handleCurrentChange(val) {// 重新设置当前页码this.currentPage = val;this.selectTeacher();},toStudentTable() {window.location.href = "http://localhost:8080/DatabaseExperiment/administerStudent.html";},toCrouseTable() {window.location.href = "http://localhost:8080/DatabaseExperiment/administerCourse.html";},handleStudentEdit(row) {this.teacherSelected.tid = row.tid;this.teacherSelected.name = row.name;this.teacherSelected.position = row.position;this.teacherSelected.salary = row.salary;},addTeacher() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/addTeacher",data: this.teacher}).then(resp => {if (resp.data == "1") {this.dialogVisible1 = false;this.selectTeacher();this.$message({message: '添加成功',type: 'success'})} else {this.$message.error('主键重复,添加失败')}})},tableRowClassName({row, rowIndex}) {if (rowIndex % 4 == 2) {return 'warning-row';} else if (rowIndex % 4 == 0) {return 'success-row';}return '';},// 复选框选中后执行的方法handleSelectionChange(val) {this.multipleSelection = val;// console.log(this.multipleSelection)},handleStudentDelete(row) {},selectTeacher() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/administer/selectTeacherByPage?currentPage=" + this.currentPage + "&pageSize=" + this.pageSize,}).then(resp => {this.teacherData = resp.data.rows;this.totalCount = resp.data.totalCount;})}}})
</script>
</body>
</html>

2.学生界面

student.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>studentStat</title><script src="js/vue.js"></script><script src="element-ui/lib/index.js"></script><link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css"><script src="js/axios-0.18.0.js"></script><link href="css/design.css" rel="stylesheet">
</head>
<body>
<div id="student"><el-form :inline="true"><h2 class="center">学生选修信息</h2><div style="height: 10px"></div><el-button type="primary" plain @click="dialogVisible1 = true">选修课程</el-button><el-form-item class="course-input"><el-button type="primary" plain>修改用户登录信息</el-button></el-form-item><el-form-item><el-input placeholder="课程名称"></el-input></el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form><!--    学生选修表格--><template><el-table:data="studentStat"style="width: 100%":row-class-name="tableRowClassName"><el-table-columnprop="id"label="学号"align="center"></el-table-column><el-table-columnprop="sname"label="学生姓名"align="center"></el-table-column><el-table-columnprop="cid"align="center"label="课程号"></el-table-column><el-table-columnprop="cname"align="center"label="课程名"></el-table-column><el-table-columnprop="score"align="center"label="成绩"></el-table-column><el-table-columnalign="center"label="操作"><template slot-scope="scope"><el-row><el-button type="danger" @click="handleStudentDelete(scope.row)">退选</el-button></el-row></template></el-table-column></el-table></template><el-dialogtitle="选修课程":visible.sync="dialogVisible1"width="30%"@close="handleClose"><el-form ref="studentForm" label-width="100px"><el-form-item label="选修课程名称"><el-input v-model="courseName"></el-input></el-form-item><el-form-item><el-button type="primary" @click="addSelectiveCourse">提交</el-button><el-button @click="dialogVisible1 = false">取消</el-button></el-form-item></el-form></el-dialog><div style="height: 20px;"></div><div style="display: flex; justify-content: space-between;"><el-button type="primary" @click="toCrouseTable" round>跳转课程表</el-button><el-tag style="font-size: 20px;">已修总学分:{{ totalScore }}</el-tag></div></div>
<script>new Vue({el: "#student",data() {return {totalScore: "",studentStat: [],dialogVisible1: false,//选修课程名courseName: ""}},methods: {getTotalScore() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/student/getTotalScore",}).then(resp => {this.totalScore = resp.data;})},//退选课程handleStudentDelete(row) {this.$confirm('此操作将退选课程并成绩作废, 是否继续?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/student/handleStudentDelete?sid=" + row.id + "&cid=" + row.cid,}).then(resp => {if (resp.data == "success") {this.selectStudentScore();this.getTotalScore();this.$message({message: '退选成功',type: 'success'});}})})},//清除选修课程对话框内容handleClose() {this.courseName = '';},addSelectiveCourse() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/student/addSelectiveCourse?courseName=" + this.courseName,}).then(resp => {if (resp.data == "1") {this.dialogVisible1 = false;this.selectStudentScore();this.$message({message: '选修课程添加成功',type: 'success'});} else {//已选修课程this.$message.error('你已选修了此门课程或者课程名输入有误');}})},open() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/loginServlet/getUserName",}).then(resp => {let flag = sessionStorage.getItem('flag');if (!flag) {this.$notify({title: `学生${resp.data}登录成功`,type: 'success'});sessionStorage.setItem('flag', true)}})},toCrouseTable() {window.location.href = "http://localhost:8080/DatabaseExperiment/administerCourse.html";},selectStudentScore() {axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/student/selectStudentScore"}).then(resp => {this.studentStat = resp.data;this.getTotalScore();})}},mounted() {this.selectStudentScore();this.open();}})
</script>
</body>
</html>

3.登录界面

login.html:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>login</title><link href="css/login.css" rel="stylesheet"><script src="js/axios-0.18.0.js"></script>
</head><body>
<div id="loginDiv" style="height: 350px"><form action="" id="form" method="post"><h1 id="loginMsg">LOGIN IN</h1><div id="errorMsg" style="display: none">用户名或密码不正确,请重新输入</div><p>Username:<input id="username" name="username" type="text"></p><p>Password:<input id="password" name="password" type="password"></p><div id="subDiv"><!--            <input type="submit" class="button" value="login up">--><input type="button" id="btn" class="button" value="login up"><input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;</div></form>
</div>
<script>// import el from "./element-ui/src/locale/lang/el";document.getElementById("btn").onclick = () => {var info = {username: "",password: ""}info.username = document.getElementById("username").value;info.password = document.getElementById("password").value;axios({method: "post",url: "http://localhost:8080/DatabaseExperiment/loginServlet/login",data: info}).then(resp => {if (resp.data == "administer") {//跳转页面再显示消息提示axios.post("http://localhost:8080/DatabaseExperiment/loginServlet/administerCookie").then(() => {location.href = "http://localhost:8080/DatabaseExperiment/administerStudent.html";})} else if (resp.data == "student") {axios.post("http://localhost:8080/DatabaseExperiment/loginServlet/studentCookie").then(() => {location.href = "http://localhost:8080/DatabaseExperiment/student.html";})} else {document.getElementById("errorMsg").style.display = "block";}})}
</script>
</body>
</html>

 九、功能展示

1.登录界面

2.管理员视图

2.1 学生表

查询学生信息(模糊查询)

分页展示

学生表按钮展示

批量删除

新增学生 

新增学生登录信息

删除单行数据 

修改学生信息

2.2 教师表

统计职称信息

统计教师授课信息

 2.3 课程表

3.学生视图

选修课程

退选课程

跳转课程表(返回按钮仅学生可见)

 十、实验总结

经过有限的时间学一手Web技术,通过这次学习,提升了逻辑架构能力,动手实现简单的数据管理系统以提高理解和熟练度。其中经过也是遇到了很多坑,俗话说有bug不可怕,可怕bug不报错,深有体会。也发现一点提升性能的小技巧,通过看日志发现了mybatis不会自动开启预编译功能,需要手动开启,从mybatis的文件中知道了底层是如何防止sql注入等问题。积累和总结了经验。后面应该还会加深学习,如果需求大,还会转入其他方向。
       PS:我先编写了学生表的代码,课程表和教师表类似的功能按钮没有实现。

数据库实验三 数据库系统设计综合实验实验报告相关推荐

  1. 数据库原理实验三 数据库综合设计实验 实验报告

    实验三 数据库系统设计综合实验 1.实验目的通过实验,使学生掌握数据库系统设计和开发的一般方法,能够设计并实现简单的数据库系统. 2.实验要求熟悉实验室实验环境,掌握实验预备知识,了解实验中故障排除的 ...

  2. Matlab重建信号实验总结,实验三信号采样与重建(实验报告).doc

    实验三信号采样与重建(实验报告) <信号与系统>实验报告 学院 专业 班级 姓名 学号 时间 实验三 信号采样与重建 一.实验目的 1.进一步学习MATLAB的函数及其表示. 2.掌握及验 ...

  3. 实验三 16位机指令系统实验报告

    实验三 16位机指令系统实验报告 一.实验目的 1.学习和了解实验平台十六位机监控命令的用法: 2.学习和了解实验平台十六位机的指令系统: 3.学习简单的实验平台十六位机汇编程序设计 实验内容 1.使 ...

  4. 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验

    实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...

  5. 常熟理工php实验三_常熟理工Oracle实验三_高燕教授

    1 实验三 表空间与数据文件 一.实验目的 从逻辑上说数据库由多个表空间组成. DBA 通过创建表空间为数据库建立存储空 间, 并且把各种类型的应用数据存放在不同的表空间中. 在数据库运行过程中, D ...

  6. 计算机网络基础题解综合练习实验,计算机网络基础题解•综合练习•实验

    计算机网络基础题解•综合练习•实验 作 者:赵宇 编著 出版时间:2005年01月 定 价:23.00 I S B N :9787111137221 所属分类: 标 签: 本书是"计算机网络 ...

  7. 计算机基础和综合实验,计算机基础与综合编程实验报告.doc

    计算机基础与综合编程实验报告 学号 <计算机基础与综合编程实验>报告 学 院计算机科学与技术学院专 业计算机类班 级姓 名指导教师 日期 1 实验目的 通过迭代式开发,深入掌握C语言的文件 ...

  8. 大学计算机实验三,《大学计算机Ⅰ》实验报告实验三

    <大学计算机Ⅰ>实验报告实验三 (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 广东金融学院实验报告课程名称:大学计算机I实 ...

  9. python程序设计报告-20183215 实验三《Python程序设计》实验报告

    20183215 2019-2020-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 1832 姓名: 董振龙 学号: 20183215 实验教 ...

最新文章

  1. std::max,std::min错误:应输入标识符的解决方法
  2. DW Question Answer Pro 1.3.4 DWQA问答系统插件
  3. Python交换两个变量的三种方法
  4. BZOJ2005 NOI2010 能量采集 欧拉函数
  5. 2017甘肃省计算机二级考试,甘肃省2017年计算机二级考试网上报名须知及流程
  6. 使用动态优先权的进程调度算法的模拟_我爱OS第12讲:系统调度
  7. 11 个问题,帮你彻底搞懂工业互联网
  8. 人员梯度培养_人员管理 | 生产班组员工队伍管理及制度建立
  9. 小凡的Python之路——启航
  10. 计算机网络之A、B、C类网络地址
  11. Blastp/PSI-BLAST/PHI-BLAST
  12. 云计算的认识和看法_浅谈对云计算的认识
  13. 文件服务器磁盘配额管理,文件服务器磁盘配额的管理.doc
  14. 【移动通信】信号质量评估RSRP和SINR
  15. The bean 'llWebSocketHandler' could not be injected because it is a JDK dynamic proxy that implemen
  16. Windows事件查看器_ID一览表
  17. 30 爬虫 - 爬取内涵段子网站案例
  18. 毕业设计 单片机的手势识别系统 - 手势识别 单片机 物联网
  19. 基于HDP版本的YDB安装部署
  20. js给所有相同类名设置同样的样式

热门文章

  1. zzulioj:1093: 验证哥德巴赫猜想(函数专题)
  2. 最新世界大学自然指数排名:30所内地高校进入全球前 100 名!
  3. secureCRT,永久设置,保护眼睛,配色方案
  4. C11:Unity3D制作智能家居设计软件——实现一键智能设计
  5. 10_10_闪迪服务器芯片,【闪迪至尊极速固态硬盘试用】透过芯片看旗舰,拆解Extreme II看本质!...
  6. HBase如何实现模糊查询?
  7. 有理数集合是可数集合,无理数集合是不可数集合
  8. 将知网下载的CAJ文件转为PDF 踩坑详记
  9. 中兴面试2016 软件开发
  10. android图片格式