基于Java+SpringBoot+Vue前后端分离书店购书系统设计与实现(有视频教程)

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用ChatGPT,微信支付,扫码加群

点击这里预览

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》

https://blog.csdn.net/qq_57756904/category_12199600.html

有需求代码永远写不完,而方法才是破解之道,抖音有实战视频课程,某马某千等培训都是2万左右,甚至广东有本科院校单单一年就得3万4年就12万学费,而且还没有包括吃饭的钱。所以很划算了。另外博客左侧有源码阅读专栏,对于求职有很大帮助,当然对于工作也是有指导意义等。在大城市求职,你面试来回一趟多多少少都在12块左右,而且一般不会一次性就通过,还得面试几家。而如果你对源码以及微服务等有深度认识,这无疑给你的面试添砖加瓦更上一层楼。

最后再送一句:最好是学会了,而不是学废了!!!

目录

一、前言

二、系统设计

1、系统运行环境

2、系统架构设计​编辑

3、管理员维护订单时序图设计:

三、功能性分析 

2、功能模块

四、非功能性与可行性分析 

五、功能截图

1、注册登录

2、图书

2.1、图书列表 

2.2、添加图书

2.3、图书分类

2.4、出版社

2.5、书单专题

3、订单

3.1、订单列表

3.2、订单详情

4、权限

5、首页

6、点击书籍进来

6.1、需要登录,才能加入购物车成功

6.2、 去购买

6.3、立即下单展示订单信息 

六、实现代码 

1、角色控制器

2、服务接口

3、实现类

七、参考论文

八、获取源码


一、前言

    本系统是基于SpringBoot+MyBatis+Vue+Uniapp的前后端完全分离的书店管理系统。值得一提的是前端使用了目前市场上较流行的组件elementui,在本系统里面对其进行了二次封装,使得页面更加的简洁与优雅,也提高了系统的可维护性。同时探究前端与后端是如何建立数据交互的,以及它为系统提供的服务和已经建好的多张表之间的关系。故课题研究的是这些技术的关联以及如何实现本系统,同时探究系统如何在Linux系统进行Docker容器化部署。
 

二、系统设计

1、系统运行环境

开发系统:Windows10

架构模式:MVC/前后端分离

JDK版本:Java JDK1.8

开发工具:IDEA

数据库版本: mysql5.7

数据库可视化工具: SQL yog或Navicat for MySQL

服务器:SpringBoot自带 apache tomcat

主要技术:Java、SpringBoot、MyBatis、SpringSecurity、MySQL、Redis、Html、Vue、Elementui等

2、系统架构设计

3、管理员维护订单时序图设计:

三、功能性分析 

2、功能模块

这个项目总共分为两类人员,管理员和普通用户。下面对这两类人员的使用的功能进行介绍。

2.1管理员

  • 图书管理

    • 添加图书
    • 删除图书(可批量删除)
    • 修改图书
    • 查看图书(分页查看)
    • 图书上下架(可批量处理)
    • 图书推荐(新品推荐、精品推荐,可批量处理)
  • 出版社管理

    • 新增出版社
    • 删除出版社
    • 修改出版社(基本信息、排序、启用状态,可分开处理)
    • 查看出版社(分页查看)
  • 图书分类管理(两级分类)

    • 添加分类(两级分类,可自行添加一级分类和二级分类)
    • 删除分类(删除一级分类的话所有二级分类也都会删除)
    • 修改分类(基本信息和排序)
    • 查看分类(分页查看一级分类,以及查看某个一级分类下的二级分类)
  • 书单管理

    • 添加一个书单专题
    • 添加指定图书到书单专题中(可批量处理)
    • 删除书单
    • 移除书单中的指定图书
    • 修改书单(基本信息、权重、上下架状态,可分开处理)
    • 查看书单(分页查看)
    • 查看指定书单的图书信息(分页查看)
  • 订单管理

    • 查看订单(分页查看)
    • 查看指定订单详细信息(订单商品明细、费用详情、收货地址详情)
    • 订单发货(手工填写订单号和快递公司之后确认发货)
    • 删除订单
  • 用户管理

    • 查看注册用户(分页查看)
    • 修改用户禁用状态
  • 数据统计

    • 根据选取时间段查看订单统计(图标显示)
    • 其他各类数据的统计

2.2用户

  • 页面浏览

    • 首页图书的各级分类
    • 首页书单的轮播图
    • 点击轮播图可查看书单详情页
    • 首页图书的各类展示(最新出版、精品推荐、新品推荐、以及图书的分类展示)
    • 点击某个分类可查看对应的图书数据(分页展示)
    • 图书详情页数据的展示
  • 购物车

    • 添加商品到购物车
    • 删除购物车中指定商品
    • 在购物车中修改商品数量
    • 查看购物车商品
  • 下单模块

    • 在商品详情页下单
    • 在图书分类展示和书单页面下单
    • 在购物车中下单
    • 点击下单后会跳转至购买页面进行地址选择,最后再下单确认
  • 地址管理

    • 添加收货地址信息
    • 删除收货地址信息
    • 修改收货地址信息
    • 查看收货地址地址信息
  • 订单管理

    • 查看自己所下订单(可分类查看,已付款、未收货、订单回收站)
    • 删除订单
    • 确认收货
  • 个人信息管理

    • 个人信息查看
    • 个人信息修改
    • 密码修改

四、非功能性与可行性分析 

2.5非功能性需求分析

非功能性需求:用户对软件质量属性、运行环境、资源约束、外部接口等方面的要求或期望,包括:

2.5.1性能需求:

用户在软件响应速度、结果精度、运行时资源消耗量等方面的要求。

2.5.2可行性需求:

用户在软件失效的频率、严重程度、易恢复性,以及故障可预测性等方面的要求。

2.5.3易用性需求:

用户在界面的易用性、美观性,以及对面向用户的文档和培训资料等方面的要求。

2.5.4安全性需求:

用户在身份证、授权控制、私密性等方面的要求。

2.5.5运行环境约束:

用户对软件系统运行环境的要求。

2.5.6外部接口:

用户对待开发软件系统与其它软件系统或设备之间的接口要求

2.6可行性分析

可行性分析是从不同的角度,对可能影响系统的各方面因素进行分析,确认系统在实际生活上是可行的。本系统只是单纯地从经济、法律、技术、操作可行性四个方面来分析说明。

2.6.1技术可行性

技术上的可行性分析主要分析技术条件能否顺利完成开发工作,软、硬件能否满足需要。本系统采用Vue+Elementui开发出友好美观的人机界面,便于用户理解、操作。数据库管理系统采用MySQL,它能够处理大量数据,同时保持数据的完整性、安全性和持久性。后端技术使用SpringBoot、MyBatis,这些技术在许多公司已经被商用了,因此本系统的开发平台已成熟可行。硬件方面,在科技飞速发展的今天,硬件更新速度越来越快,容量越来越大,可靠性越来越高,价格越来越便宜,因此硬件平台也能够满足本系统所需。

2.6.2经济可行性

  项目放在阿里学生服务器或者本地虚拟机的linux环境,故可行。

2.6.3法律可行性

  可行,自己写的项目,目的明确,没有违法违规。

2.6.4操作可行性
操作较为简单,而且当下信息科技发达,界面的设计也着实考虑到用户的体验,系统也是为用户而生。故操作是可行的,不存在难度大的操作。
 

五、功能截图

管理员登录:admin 123456

1、注册登录

首页

2、图书

2.1、图书列表 

2.2、添加图书

1)填写书籍信息

2)上传图片等

2.3、图书分类

1)列表

2)查看下级

2.4、出版社

2.5、书单专题

3、订单

3.1、订单列表

3.2、订单详情

4、权限

 点击管理系统右上角的首页退出到用户页面

用户登录: 123@qq.com 123456    还可以自己注册

5、首页

6、点击书籍进来

6.1、需要登录,才能加入购物车成功

点击加入购物车,然后到购物车查看

6.2、 去购买

6.3、立即下单展示订单信息 

还有一些功能就不一一截图了。 

六、实现代码 

1、角色控制器

/**
 * <p>
 * 角色表 服务类
 * </p>
 *
 * @author CeaM
 * @since 2023-01-28
 */
public interface ICeamSysRoleService extends IService<CeamSysRole> {
 
    IPage<CeaMSysRoleVO> pageCeaMSysRoleVO(PageableDTO pageable);
 
    /**
     * 获取用户权限信息
     * @param userId 用户信息
     * @return 权限信息
     */
    Collection<SimpleGrantedAuthority> grantedAuthorities(Long userId);
 
    /**
     *
     * @param userId 用户ID
     * @return RoleItemVOs
     */
    List<RoleDTO> listByUserId(Long userId);
 
    void updateMenu(CeaMSysRoleDTO roleDTO, CeamSysRole role);
}

2、服务接口

/**
 * <p>
 * 角色表 服务实现类
 * </p>
 *
 * @author CeaM
 * @since 2023-01-28
 */
@Slf4j
@Service
@AllArgsConstructor
public class CeamSysRoleServiceImpl extends ServiceImpl<CeamSysRoleMapper, CeamSysRole> implements ICeamSysRoleService {
 
    private ICeamSysMenuService ceamSysMenuService;
    private ICeamRoleMenuService ceamRoleMenuService;
 
    @Override
    public IPage<CeaMSysRoleVO> pageCeaMSysRoleVO(PageableDTO pageable) {
        LambdaQueryWrapper<CeamSysRole> queryWrapper = Wrappers.<CeamSysRole>lambdaQuery()
                .eq(CeamSysRole::getDeleted, GlobalConstants.FALSE);
        Page<CeamSysRole> page = new Page<>(pageable.getPage(), pageable.getSize());
        // 手动设置当前页,不然分页失效
        page.setCurrent((long)pageable.getPage() + GlobalConstants.ONE);
        Page<CeamSysRole> ceamSysRolePage = page(page, queryWrapper);
        IPage<CeaMSysRoleVO> ceaMSysRoleVOIPage = PageVOUtil.copyToPageVO(ceamSysRolePage, CeaMSysRoleVO.class);
 
        for (CeaMSysRoleVO role : ceaMSysRoleVOIPage.getRecords()) {
 
            List<MenuDTO> menuDTOS = ceamSysMenuService.findByRoleId(role.getId(), GlobalConstants.ZERO);
            role.setMenus(menuDTOS);
        }
 
        return ceaMSysRoleVOIPage;
    }
 
    @Override
    public Collection<SimpleGrantedAuthority> grantedAuthorities(Long userId) {
        List<RoleDTO> roleItemDTOS = this.baseMapper.listByUserId(userId);
        if (CollectionUtils.isEmpty(roleItemDTOS)) {
            throw new ServiceException("没有分配角色");
        }
 
        List<MenuDTO> menuDTOS = ceamSysMenuService.findByRoles(roleItemDTOS, GlobalConstants.ZERO);
 
        // 角色
        Set<String> permissions = roleItemDTOS.stream()
                .filter(role -> StringUtils.isNotBlank(role.getName()))
                .map(RoleDTO::getName).collect(Collectors.toSet());
        permissions.addAll(
                menuDTOS.stream()
                        .filter(menu -> StringUtils.isNotBlank(menu.getPermission()))
                        .map(MenuDTO::getPermission).collect(Collectors.toSet())
        );
 
        return permissions.stream().map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());
    }
 
    @Override
    public List<RoleDTO> listByUserId(Long userId) {
        return this.baseMapper.listByUserId(userId);
    }
 
    @Override
    public void updateMenu(CeaMSysRoleDTO roleDTO, CeamSysRole role) {
        if (roleDTO.getMenus().size() > 0) {
            List<CeamRoleMenu> rolesMenusList = roleDTO.getMenus().stream().map(i -> {
                CeamRoleMenu rolesMenus = new CeamRoleMenu();
                rolesMenus.setRoleId(roleDTO.getId());
                rolesMenus.setMenuId(i.getId());
                return rolesMenus;
            }).collect(Collectors.toList());
            ceamRoleMenuService.remove(new LambdaQueryWrapper<CeamRoleMenu>()
                    .eq(CeamRoleMenu::getRoleId, roleDTO.getId()));
            ceamRoleMenuService.saveBatch(rolesMenusList);
        }
    }
}

3、实现类

/**
 * <p>
 * 角色表 服务实现类
 * </p>
 *
 * @author CeaM
 * @since 2023-01-28
 */
@Slf4j
@Service
@AllArgsConstructor
public class CeamSysRoleServiceImpl extends ServiceImpl<CeamSysRoleMapper, CeamSysRole> implements ICeamSysRoleService {
 
    private ICeamSysMenuService ceamSysMenuService;
    private ICeamRoleMenuService ceamRoleMenuService;
 
    @Override
    public IPage<CeaMSysRoleVO> pageCeaMSysRoleVO(PageableDTO pageable) {
        LambdaQueryWrapper<CeamSysRole> queryWrapper = Wrappers.<CeamSysRole>lambdaQuery()
                .eq(CeamSysRole::getDeleted, GlobalConstants.FALSE);
        Page<CeamSysRole> page = new Page<>(pageable.getPage(), pageable.getSize());
        // 手动设置当前页,不然分页失效
        page.setCurrent((long)pageable.getPage() + GlobalConstants.ONE);
        Page<CeamSysRole> ceamSysRolePage = page(page, queryWrapper);
        IPage<CeaMSysRoleVO> ceaMSysRoleVOIPage = PageVOUtil.copyToPageVO(ceamSysRolePage, CeaMSysRoleVO.class);
 
        for (CeaMSysRoleVO role : ceaMSysRoleVOIPage.getRecords()) {
 
            List<MenuDTO> menuDTOS = ceamSysMenuService.findByRoleId(role.getId(), GlobalConstants.ZERO);
            role.setMenus(menuDTOS);
        }
 
        return ceaMSysRoleVOIPage;
    }
 
    @Override
    public Collection<SimpleGrantedAuthority> grantedAuthorities(Long userId) {
        List<RoleDTO> roleItemDTOS = this.baseMapper.listByUserId(userId);
        if (CollectionUtils.isEmpty(roleItemDTOS)) {
            throw new ServiceException("没有分配角色");
        }
 
        List<MenuDTO> menuDTOS = ceamSysMenuService.findByRoles(roleItemDTOS, GlobalConstants.ZERO);
 
        // 角色
        Set<String> permissions = roleItemDTOS.stream()
                .filter(role -> StringUtils.isNotBlank(role.getName()))
                .map(RoleDTO::getName).collect(Collectors.toSet());
        permissions.addAll(
                menuDTOS.stream()
                        .filter(menu -> StringUtils.isNotBlank(menu.getPermission()))
                        .map(MenuDTO::getPermission).collect(Collectors.toSet())
        );
 
        return permissions.stream().map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());
    }
 
    @Override
    public List<RoleDTO> listByUserId(Long userId) {
        return this.baseMapper.listByUserId(userId);
    }
 
    @Override
    public void updateMenu(CeaMSysRoleDTO roleDTO, CeamSysRole role) {
        if (roleDTO.getMenus().size() > 0) {
            List<CeamRoleMenu> rolesMenusList = roleDTO.getMenus().stream().map(i -> {
                CeamRoleMenu rolesMenus = new CeamRoleMenu();
                rolesMenus.setRoleId(roleDTO.getId());
                rolesMenus.setMenuId(i.getId());
                return rolesMenus;
            }).collect(Collectors.toList());
            ceamRoleMenuService.remove(new LambdaQueryWrapper<CeamRoleMenu>()
                    .eq(CeamRoleMenu::getRoleId, roleDTO.getId()));
            ceamRoleMenuService.saveBatch(rolesMenusList);
        }
    }
}

七、参考论文

八、获取源码

 大家点赞、收藏、关注、评论啦 、关注下方公众号获取联系方式👇🏻👇🏻

🍅开源项目免费下载🍅商业使用需授权:点击这里下载

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对于图管理系统的前端界面设计,以下是一些建议和步骤: 1. 确定需求:首先,明确图管理系统的需求和功能,包括登录、图列表、图详情、借阅、归还等功能。 2. 界面布局:根据需求,设计主要的界面布局,可以考虑使用侧边栏导航和顶部导航栏来组织不同的功能模块。 3. 颜色和风格:选择适合图管理系统的颜色和风格,可以考虑使用柔和的色调和简洁的风格,以突出图信息的清晰度和易读性。 4. 图标和按钮:使用合适的图标和按钮来增加界面的交互性和美观度,例如使用适合图管理的图标,如借和还的图标。 5. 响应式设计:考虑到不同设备上的使用,确保界面能够在不同屏幕尺寸下自适应,并保持良好的用户体验。 6. 功能模块设计:根据需求,将不同的功能模块进行设计,如登录页面、图列表页面、图详情页面等,确保界面的一致性和易用性。 7. 表单设计:如果有需要用户输入信息的表单,设计合适的表单样式和验证机制,以提供良好的用户体验。 8. 可访问性:确保界面的可访问性,包括使用合适的HTML标签、添加适当的alt属性和标签,以及提供键盘导航等功能。 9. 用户反馈和提示:在适当的地方提供用户反馈和提示,例如操作成功或失败的提示信息,以及加载状态等。 10. 测试和优化:最后,在设计完成后进行测试和优化,确保界面的稳定性和用户体验。 以上是一些关于图管理系统前端界面设计的建议和步骤,希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡布奇诺-海晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值