计算机毕业设计-基于SSM的网上书店管理系统

2023-11-17

项目背景

本网上系统是针对目前网上的实际需求,从实际工作出发,对过去的网上系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流行的B/S结构和java中流行的ssm框架和eclipse编辑器、MySQL 数据库设计并实现的 。本网上系统主要包括系统用户管理模块、图书信息管理模块、订单管理、新闻管理、登录模块、和退出模块等多个模块。它帮助网上实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了网上数据资源,有效的减少了网上的经济投入,大大提高了网上的效率。

功能设计

功能模块图

总体业务流程:以用户的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用系统,管理系统等功能操作,以管理员的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用系统,管理系统等功能操作。
系统的业务流程
在这里插入图片描述
数据流图的简称为DFD,是通过使用图形的方法对系统所具备的逻辑功能进行阐述,描述系统数据的流向和逻辑变换。由于该方法能将难以阐述的问题进行表述,因此被开发者广泛应用,是当前应用范围较为广泛的结构化系统分析方法。
零层数据流程是流程中最抽象的一层,它包括了用户注册与登录管理、用户功能管理和检索维护管理等功能模块,在登录注册模块使用到的数据存储有用户账户信息文档、用户信息文档,用户功能管理模块需要的存储是用户动态信息文档、图片信息文档,检索维护是通过以上这些文档信息通过关键词进行搜索。
系统的0层数据流图
在这里插入图片描述
1层数据流图中,数据实体包括普通用户和管理员,普通用户数据流程包括功能选择、图书信息管理、订单管理、;管理员用户数据流程包括图书信息管理、订单管理、系统管理;普通用户数据流包括操作信息、添加信息、浏览信息;管理员数据流包括添加信息、删除信息、修改信息、查询信息、浏览信息、提示信息等,数据表。
系统的1层数据流图
在这里插入图片描述
2层为管理员操作后台数据流图,管理员可以分别通过添加、修改和删除来对系统进行管理
系统的2层数据流图
在这里插入图片描述
系统主要是分为管理员端设计与用户端设计。用户端模块主要是系统中普通用户在注册、登录系统可以看到自己的基本信息,维护自己的信息;管理员端模块主要是管理员登录后对整个系统相关操作进行处理,可进行管理员的添加和删除,可对系统中的用户进行管理。
系统的功能结构图
在这里插入图片描述

功能截图

首页是网站的入口,主要包含了:图书信息、图书信息、用户注册、以及留言反馈等功能
在这里插入图片描述
为了确保系统安全性,系统操作员只有在后台登录界面输入正确的用户名、密码、权限以及验证码,单击“登录”按钮后才能够进入本系统的后台管理界面。
在这里插入图片描述
用户输入用户名、密码、电话、姓名等必填信息后,点击注册按钮完成用户的注册。
在这里插入图片描述
用户点击留言反馈进入留言反馈详细页,提交留言信息,成功发布留言,管理员管理用户的留言信息。
在这里插入图片描述
用户点击某个图书进入图书详细页,点击购买按钮进入购买页,提交订单信息,成功购买后,管理员管理用户的订单信息,审核订单信息。
在这里插入图片描述
系统用户管理主要是对新用户的添加和旧用户的删除。新用户的添加主要是指添加用户名称并确定其密码;旧用户的删除也是从下拉菜单中找到对应的用户名称将其删除。不论是新用户添加还是旧用户的删除,这个权限只有管理员具有。
在这里插入图片描述
图书信息添加功能主要指对其编号、名称等一些基本信息的添加、删除和修改。图书查询能根据编号、名称等多种条件对图书信息进行查询。
在这里插入图片描述

相关代码

数据库配置

# Tomcat
server:
    tomcat:
        uri-encoding: UTF-8
    port: 8080
    servlet:
        context-path: /springbootr1tjf

spring:
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springbootr1tjf?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
        username: root
        password: 123456

#        driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
#        url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=springbootr1tjf
#        username: sa
#        password: 123456

    servlet:
      multipart:
        max-file-size: 10MB
        max-request-size: 10MB
    resources:
      static-locations: classpath:static/,file:static/

#mybatis
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 1
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: true
    #刷新mapper 调试神器
    refresh-mapper: true
    #逻辑删除配置
    logic-delete-value: -1
    logic-not-delete-value: 0
    #自定义SQL注入器
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    #springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other)
    jdbc-type-for-null: 'null' 

控制层(controller)

package com.controller;


import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;

/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private TokenService tokenService;

	/**
	 * 登录
	 */
	@IgnoreAuth
	@PostMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
		if(user==null || !user.getPassword().equals(password)) {
			return R.error("账号或密码不正确");
		}
		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
		return R.ok().put("token", token);
	}
	
	/**
	 * 注册
	 */
	@IgnoreAuth
	@PostMapping(value = "/register")
	public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

	/**
	 * 退出
	 */
	@GetMapping(value = "logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
    	user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }
	
	/**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
      	ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }

    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
    	UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
    	if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
    		return R.error("用户名已存在。");
    	}
        userService.updateById(user);//全部更新
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

业务层(Service)


package com.service;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.IService;
import com.entity.UserEntity;
import com.utils.PageUtils;


/**
 * 系统用户
 */
public interface UserService extends IService<UserEntity> {
 	PageUtils queryPage(Map<String, Object> params);
    
   	List<UserEntity> selectListView(Wrapper<UserEntity> wrapper);
   	
   	PageUtils queryPage(Map<String, Object> params,Wrapper<UserEntity> wrapper);
	   	
}

数据访问层(Dao)

package com.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.entity.UserEntity;

/**
 * 用户
 */
public interface UserDao extends BaseMapper<UserEntity> {
	
	List<UserEntity> selectListView(@Param("ew") Wrapper<UserEntity> wrapper);

	List<UserEntity> selectListView(Pagination page,@Param("ew") Wrapper<UserEntity> wrapper);
	
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机毕业设计-基于SSM的网上书店管理系统 的相关文章

随机推荐

  • AcWing 1247. 后缀表达式

    老师的讲课网址 https www acwing com video 736 第二个图就已经告诉我们只要有一个减号 我们就可以组成至少含一个减号的所有组合 比如说一个减号三个加号我们可以组合成 1 2 3 4 所以代码如下 include
  • The 2022 ICPC Asia Xian Regional Contest--G. Perfect Word

    You are given nn strings and required to find the length of the longest perfect word A string t is called a perfect word
  • caffe: test code 执行出问题: Check failed: FLAGS_weights.size() > 0 (0 vs. 0) Need model weights to score...

    Check failed FLAGS weights size gt 0 0 vs 0 Need model weights to score 出现这个错误 但是我记得昨天还好好的 网上搜了也没有答案 后来仔细检查才发现 原来存放 caff
  • QT5.9.4 + opencv3.0.0编译配置

    QT5 9 4 opencv3 0 0编译配置 1 安装QT5 9 4 QT下载地址 http download qt io archive qt 安装完毕之后将以下目录加入到系统环境变量 E Qt Qt5 9 4 5 9 4 mingw5
  • windows系统pycharm安装,opencv安装,anaconda安装

    1 python IDE安装 3 9 https www python org getit 2 pycharm安装 社区版最新 https www jetbrains com pycharm 3 anaconda3安装 https www
  • Electron 自定义 Dock 图标

    转载自https cloud tencent com developer article 1650700 学透 Electron 自定义 Dock 图标 Mac OS 做为前端开发者的首选操作系统相信大家再熟悉不过了 在电脑主界面的底部可以
  • epoll在多线程中的应用-EPOLLEXCLUSIVE和REUSEPORT(一)

    以下均为对epoll在多线程中的使用的一些笔记 如果有不对的地方 烦请指出 主要对于我所遇到的问题进行讨论 不会讨论代码如何改写 探讨如何解决这个问题 一 引言 这些问题均是我在编写我的Web服务器遇到的 我在编写多线程Web服务器的时候
  • Docker 镜像库国内加速的几种方法

    概述 在国内 拉取 Docker 镜像速度慢 时不时断线 无账号导致限流等 比较痛苦 这里提供加速 优化的几种方法 梳理一下 会碰到以下情况 国内下载速度慢 时不时断线 是因为网络被限制了 没有公共镜像库账号导致限流 是因为 Docker
  • 「网页开发|前端开发|Vue」01 快速入门:快速写一个Vue的HelloWorld项目

    本文主要介绍如何用vue开发的标准化工具vue cli快速搭建一个符合实际业务项目结构的hello world网页项目并理解vue的代码文件结构以及页面渲染流程 文章目录 一 准备工作 安装node js 二 项目搭建 创建项目目录 全局安
  • 谁来教我渗透测试——黑客应该掌握的Windows基础

    今天我们看看作为一个黑客对于Windows应该掌握哪些基础知识 主要内容包含以下四个方面 系统目录 服务 端口和注册表 黑客常用的DOS命令及批处理文件的编写 黑客常用的快捷键 以及如何优化系统 登录密码破解 手动清除木马病毒 系统目录 服
  • 2014年总结

    总结的意义在于认清未来的方向 2014年工作 1 ETL Data Warehouse Data Mining 数据挖掘内容很多 如何与企业需求相结合是重点 2 简单的工作流系统开发 3 体会ArgGIS在物流运输企业中的应用 无论云计算以
  • 色彩空间与像素格式

    转载来自 https www cnblogs com leisure chn p 10290575 html 1 色彩空间基础 颜色是不同波长的光对人眼刺激产生的色彩感觉 色彩空间 Color Space 是颜色的数学表示 根据不同的表示方
  • PSO优化LSTM

    有两个py文件 PSO 1和LSTM 1 在资源那里下载 有数据 环境 python TF2 优化的参数有 神隐藏神经元个数 dropout比率 batch size 这个可以根据自己的意愿改 规定上限和下限 UP 64 0 14 32 D
  • java跨时区问题【相差8小时】

    情况一 后端传递给前端 前端展示到页面中的时间与系统时间相差8小时 解决方法 在该类的日期属性字段上加上注解 JsonFormat pattern yyyy MM dd HH mm ss timezone GMT 8 情况二 展示数据时间与
  • 解决Chrome, NET::ERR_CERT_AUTHORITY_INVALID

    文章目录 前言 解决方法一 解决方法二 总结 前言 解决方法一 首先清理一下缓存 三个点 gt 设置 gt 清除浏览数据 即可 如果还解决不了 因为Chrome是默认使用HSTS传输 严格的http传输方式 解决方法二 在Chrome浏览框
  • C++如何切割String对象

    C 如何切割String对象 C 相较于Java Python 并没有提供的字符串分割的函数split 因此需要自己进行编写 在实际的工作中这一功能会被经常使用 所以进行简单的记录一下 核心函数 代码实现的函数是调用String库中的fin
  • 数学:矩阵求导

    矩阵Y对标量x求导 Y y ij dY dx dy ji dx 求导后 Y变转置了 标量y对矩阵X求导 dy dX Dy Dx ij 求导后 不需要转置 重要结论 y U XV u i x ij v j 于是 dy dX u i v j U
  • ACM-子串(字符串处理)

    问题描述 有一些由英文字符组成的大小写敏感的字符串 请写一个程序 找到一个最长的字符串 x 使得 对于已经给出的字符串中的任意一个 y x 或者是 y 的子串 或者 x 中的字符反序之后得到的新字符串是 y 的子串 输入数据 输入 输入的第
  • vue使用高德地图导航路线失败,获取驾车数据失败:INVALID_USER_SCODE(解决方法)

    高德地图使用路线导航 最近做大屏项目 里面有地图定位 路线导航等方面的功能 在做路线定位是一直都是获取不到导航的路线 经过好长时间的百度看高德api文档终于找到解决方法 解决方法 添加高德地图安全密钥 添加高德安全密钥 安全密钥是和key一
  • 计算机毕业设计-基于SSM的网上书店管理系统

    项目背景 本网上系统是针对目前网上的实际需求 从实际工作出发 对过去的网上系统存在的问题进行分析 结合计算机系统的结构 概念 模型 原理 方法 在计算机各种优势的情况下 采用目前最流行的B S结构和java中流行的ssm框架和eclipse