源代码+数据库+LW文档(1万字以上)+开题报告+答辩稿ppt+部署教程+代码讲解+代码时间修改工具

技术实现

  1. 开发语言:后端:Java 前端:vue
  2. 框架:springboot
  3. 数据库:mysql

开发工具
JDK版本:JDK1.8
数据库:mysql 数据库工具:Navicat
开发软件:idea

主要角色及功能介绍
按照教材订购系统的角色,我划分为了教师管理模块、发行人员管理模块、采购人员管理模块和管理员管理模块这四大部分。
采购人员管理模块:
(1)采购人员注册登录:采购人员注册为采购人员并登录教材订购系统;采购人员对个人信息的增删改查,比如个人资料,密码修改。
(2)查看教材订购系统的首页信息:教材订购系统的首页信息包含了首页、公告消息、教材信息、我的(我的账户、个人中心)等。
(3)公告栏:用户在公告这一菜单下对用户提交的查看、同时也可以发布、评论。
(4)教材信息:在首页导航栏上我们会看到“教材信息”这一菜单,我们点击进入进去以后,会看到所有管理员在后台发布的教材信息,我们选择想要了解教材的购买,查看教材信息,可以购买+评论;
(5)个人中心:当用户点击右上角“我的”这个按钮,就会进入到对应的后台进行信息的管理了;
(6)我的账户:当用户点击右上角“我的”这个按钮,会出现子菜单,点击“我的账户”可以对个人的资料以及登录系统的密码进行设置;
教师管理模块:
(1)更多管理:在“更多管理”这一菜单下,可以对教师操作的教材信息+购书单+领书单等增删改查。
管理员管理模块:
(1)登录:管理员的账号是在数据表表中直接设置生成的,不需要进行注册;
(2)用户管理:当点击“用户管理”这一菜单的时候,会出现管理员+发行人员+教师+采购人员四个子菜单,可以对这四个模块进行增删改查操作;
(3)更多管理:当点击“更多”这一菜单的时候,会出现教材信息+教材类型+进书单+购书单+领书单这五个子菜单,能够对教材信息进行增删改查操作,对发行人员和教师提交的购书单+领书单进行管控,以及实现对采购人员提交的领书单进行审核管理;
(4)站点管理:管理员可以对教材订购系统中首页显示的轮播图以及系统中的一些公告发布到系统当中,让用户及时的查看到系统信息,进行合理安排。
采购人员角色用例如图2-3所示。
在这里插入图片描述
图2-3 教材订购系统采购人员角色用例图
web后台管理上的管理员是维护整个教材订购系统中所有数据信息的。管理员角色用例如图2-4所示。
在这里插入图片描述
图2-4教材订购系统管理员角色用例图
在上一章节中主要对系统的功能性需求和非功能性需求进行分析,并且根据需求分析了本教材订购系统中的用例。那么接下来就要开始对本教材订购系统的架构、主要功能和数据库开始进行设计。教材订购系统根据前面章节的需求分析得出,其总体设计模块图如图3-2所示。
在这里插入图片描述
图3-2 教材订购系统功能模块图
用户模块设计
后台管理者能够实现对前台注册的用户增删改查操作,用户模块结构图如下图:
在这里插入图片描述
图3-3用户用户模块结构图
3.2.3评论管理模块设计
教材订购系统是一个交流性质的公开平台,用户用户和管理人员用户可以对平台上信息进行评论,增加用户之间的互动性。但是同时也为了更好的规范评论的内容,给予管理员删除不合适的言论的功能,所以需要专门设计一个评论管理模块,具体的结构图如下:
在这里插入图片描述
图3-4评论模块结构图
数据库
下面是整个教材订购系统中主要的数据库表总E-R实体关系图。
在这里插入图片描述
图3-6 教材订购系统 总E-R关系图
下面根据教材订购系统的数据库总E-R关系图可以得出教材订购系统需要很多E-R图,在此罗列出来一些主要的数据库E-R模型图。
在这里插入图片描述
图3-7教师信息E-R关系图
在这里插入图片描述
图3-8 教材信息E-R关系图
在这里插入图片描述
图3-9进书单E-R关系图
在这里插入图片描述
图3-10购书单E-R关系图
系统功能实现及截图
教材订购系统的详细设计与实现主要是根据前面的教材订购系统的需求分析和教材订购系统的总体设计来设计页面并实现业务逻辑。主要从教材订购系统界面实现、业务逻辑实现这两部分进行介绍。
4.1用户功能模块
4.1.1 前台首页界面
当进入教材订购系统的时候,首先映入眼帘的是系统的导航栏,下面是轮播图以及系统内容,其主界面展示如下图4-1所示。
在这里插入图片描述
图4-1 前台首页界面图
4.1.2采购人员登录界面
教材订购系统中的前台上注册后的采购人员是可以通过自己的账户名和密码进行登录的,当用户输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到教材订购系统的首页中;否则将会提示相应错误信息,采购人员登录界面如下图4-2所示。
在这里插入图片描述
图4-2采购人员登录界面图
登录关键代码如下所示。
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping(“login”)
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info(“[执行登录接口]”);

    String username = data.get("username");
    String email = data.get("email");
    String phone = data.get("phone");
    String password = data.get("password");

    List resultList = null;
    Map<String, String> map = new HashMap<>();
    if(username != null && "".equals(username) == false){
        map.put("username", username);
        resultList = service.select(map, new HashMap<>()).getResultList();
    }
    else if(email != null && "".equals(email) == false){
        map.put("email", email);
        resultList = service.select(map, new HashMap<>()).getResultList();
    }
    else if(phone != null && "".equals(phone) == false){
        map.put("phone", phone);
        resultList = service.select(map, new HashMap<>()).getResultList();
    }else{
        return error(30000, "账号或密码不能为空");
    }
    if (resultList == null || password == null) {
        return error(30000, "账号或密码不能为空");
    }
    //判断是否有这个用户
    if (resultList.size()<=0){
        return error(30000,"用户不存在");
    }

    User byUsername = (User) resultList.get(0);


    Map<String, String> groupMap = new HashMap<>();
    groupMap.put("name",byUsername.getUserGroup());
    List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
    if (groupList.size()<1){
        return error(30000,"用户组不存在");
    }

    UserGroup userGroup = (UserGroup) groupList.get(0);

    //查询用户审核状态
    if (!StringUtils.isEmpty(userGroup.getSourceTable())){
        String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
        String res = String.valueOf(service.runCountSql(sql).getSingleResult());
        if (res==null){
            return error(30000,"用户不存在");
        }
        if (!res.equals("已通过")){
            return error(30000,"该用户审核未通过");
        }
    }

    //查询用户状态
    if (byUsername.getState()!=1){
        return error(30000,"用户非可用状态,不能登录");
    }

    String md5password = service.encryption(password);
    if (byUsername.getPassword().equals(md5password)) {
        // 存储Token到数据库
        AccessToken accessToken = new AccessToken();
        accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
        accessToken.setUser_id(byUsername.getUserId());
        tokenService.save(accessToken);

        // 返回用户信息
        JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
        user.put("token", accessToken.getToken());
        JSONObject ret = new JSONObject();
        ret.put("obj",user);
        return success(ret);
    } else {
        return error(30000, "账号或密码不正确");
    }

}
4.1.3采购人员注册界面
不是教材订购系统中正式采购人员的是可以在线进行注册的,如果你没有本教材订购系统的账号的话,添加“注册”,当填写上自己的账号+密码+确认密码+昵称+邮箱+手机号等后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可采购人员注册成功。其用采购人员注册界面展示如下图4-3所示。
在这里插入图片描述
图4-2采购人员注册界面图
注册关键代码如下所示。
/**
* 注册
* @param user
* @return
*/
@PostMapping(“register”)
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
query.put(“username”,user.getUsername());
List list = service.select(query, new HashMap<>()).getResultList();
if (list.size()>0){
return error(30000, “用户已存在”);
}
user.setUserId(null);
user.setPassword(service.encryption(user.getPassword()));
service.save(user);
return success(1);
}

/**
* 用户ID:[0,8388607]用户获取其他与用户相关的数据
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = “user_id”)
private Integer userId;

/**
 * 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)
 */

@Basic
@Column(name = "state")
private Integer state;

/**
 * 所在用户组:[0,32767]决定用户身份和权限
 */

@Basic
@Column(name = "user_group")
private String userGroup;

/**
 * 上次登录时间:
 */

@Basic
@Column(name = "login_time")
private Timestamp loginTime;

/**
 * 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时
 */

@Basic
@Column(name = "phone")
private String phone;

/**
 * 手机认证:[0,1](0未认证|1审核中|2已认证)
 */

@Basic
@Column(name = "phone_state")
private Integer phoneState;

/**
 * 用户名:[0,16]用户登录时所用的账户名称
 */

@Basic
@Column(name = "username")
private String username;

/**
 * 昵称:[0,16]
 */

@Basic
@Column(name = "nickname")
private String nickname;

/**
 * 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成
 */

@Basic
@Column(name = "password")
private String password;

/**
 * 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时
 */

@Basic
@Column(name = "email")
private String email;

/**
 * 邮箱认证:[0,1](0未认证|1审核中|2已认证)
 */

@Basic
@Column(name = "email_state")
private Integer emailState;

/**
 * 头像地址:[0,255]
 */

@Basic
@Column(name = "avatar")
private String avatar;

/**
 * 创建时间:
 */

@Basic
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Timestamp createTime;

@Basic
@Transient
private String code;

}
4.1.4公告栏界面
当点击导航栏上的“公告栏”的时候,就会进入对应的界面查看公告信息,公告栏界面如下图4-4所示。
在这里插入图片描述
图4-3公告栏界面图
4.1.5教材详情界面
当访客点击了任意教材后将会进入该教材的详情界面,可以了解到该教材的书籍名称、书籍编号、教材类型、书籍库存、书籍价格、发行人员、发行人姓名等,同时可以对该教材进行购买,教材详情展示页面如图4-5所示。
在这里插入图片描述
图4-5教材详情界面图
4.2管理员功能模块
4.2.1 用户管理界面
教材订购系统中的管理人员是可以对前台注册的采购人员、教师、发行人员进行管理的,也可以对管理员进行管控。界面如下图4-6所示。
在这里插入图片描述
图4-6用户管理界面图
用户管理关键代码如下所示。
public String encryption(String plainText) {
String re_md5 = new String();
try {
MessageDigest md = MessageDigest.getInstance(“MD5”);
md.update(plainText.getBytes());
byte b[] = md.digest();

        int i;

        StringBuffer buf = new StringBuffer("");
        for (int offset = 0; offset < b.length; offset++) {
            i = b[offset];
            if (i < 0)
                i += 256;
            if (i < 16)
                buf.append("0");
            buf.append(Integer.toHexString(i));
        }

        re_md5 = buf.toString();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return re_md5;
}

4.2.2站点管理界面
教材订购系统中的管理人员在“站点管理”这一菜单中是可以对前台显示的轮播图以及公告栏进行管控。界面如下图4-7所示。
在这里插入图片描述
图4-7站点管理界面图
站点管理关键代码如下所示。
@PostMapping(“/add”)
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}

@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
    service.insert(map);
    return success(1);

}

public Map<String,Object> readBody(BufferedReader reader){
    BufferedReader br = null;
    StringBuilder sb = new StringBuilder("");
    try{
        br = reader;
        String str;
        while ((str = br.readLine()) != null){
            sb.append(str);
        }
        br.close();
        String json = sb.toString();
        return JSONObject.parseObject(json, Map.class);
    }catch (IOException e){
        e.printStackTrace();
    }finally{
        if (null != br){
            try{
                br.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    return null;

}

public void insert(Map<String,Object> body){
    StringBuffer sql = new StringBuffer("INSERT INTO ");
    sql.append("`").append(table).append("`").append(" (");
    for (Map.Entry<String,Object> entry:body.entrySet()){
        sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
    }
    sql.deleteCharAt(sql.length()-1);
    sql.append(") VALUES (");
    for (Map.Entry<String,Object> entry:body.entrySet()){
        Object value = entry.getValue();
        if (value instanceof String){
            sql.append("'").append(entry.getValue()).append("'").append(",");
        }else {
            sql.append(entry.getValue()).append(",");
        }
    }
    sql.deleteCharAt(sql.length() - 1);
    sql.append(")");
    log.info("[{}] - 插入操作:{}",table,sql);
    Query query = runCountSql(sql.toString());
    query.executeUpdate();
}

4.2.3更多管理界面
教材订购系统中的管理人员在“更多管理”这一菜单下是可以对教材订购系统内的教材信息、教材类型、进书单、领书单、购书单计进行管控的,其管理界面如下图4-8所示。
在这里插入图片描述
图4-8更多管理界面图
更多管理关键代码如下所示。
@RequestMapping(value = “/del”)
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}

@Transactional
public void delete(Map<String,String> query,Map<String,String> config){
    StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
    sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
    log.info("[{}] - 删除操作:{}",table,sql);
    Query query1 = runCountSql(sql.toString());
    query1.executeUpdate();
}

更多推荐