博主主页:猫头鹰源码
博主简介:Java领域优质创作者、博客专家、阿里云专家博主、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作
主要内容:毕业设计(Javaweb项目|小程序|Python|HTML|数据可视化|SSM|SpringBoot|Vue|Jsp|PHP等)、简历模板、学习资料、面试题库、技术咨询

项目介绍: 

本系统为最新原创项目,采用前后端分离,项目代码工整,结构清晰,适合选题:快消品、商城、购物、前后端分离类其他商城等。系统采用springboot+vue整合开发,权限使用Spring Security ,前端主要使用了element-ui框架、项目后端主要使用了springboot,数据层采用mybatis。

部分功能:

系统主要分为管理员,用户角色,其他角色可以按照需求自定义添加。
前台:商城首页、商品详情、用户注册、用户登录、购物车、提交订单、个人中心等。
后台:用户信息管理、商品信息管理、图片资源管理、订单管理、销售额统计等。
  • 1.
  • 2.
  • 3.

系统包含技术:

后端:springboot,mybatis、 Spring Security
前端:element-ui、js、css等
开发工具:idea/vscode
数据库:mysql 5.7
JDK版本:jdk1.8

文档:

基于springboot+vue的快消品商城(前后端分离)_spring boot

部分截图说明:

首页

基于springboot+vue的快消品商城(前后端分离)_java_02

分类查看

基于springboot+vue的快消品商城(前后端分离)_vue.js_03

商品详情

基于springboot+vue的快消品商城(前后端分离)_spring boot_04

购物车

基于springboot+vue的快消品商城(前后端分离)_后端_05

下单

基于springboot+vue的快消品商城(前后端分离)_后端_06

登录

基于springboot+vue的快消品商城(前后端分离)_spring_07

首页

基于springboot+vue的快消品商城(前后端分离)_后端_08

菜单管理

基于springboot+vue的快消品商城(前后端分离)_spring_09

新增角色

基于springboot+vue的快消品商城(前后端分离)_spring_10

部分代码:

private final Object principal;
    private Object credentials;

    public JwtAuthenticationToken(Object principal, Object credentials) {
        super(null);
        this.principal = principal;
        this.credentials = credentials;
    }

    public JwtAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.principal = principal;
        this.credentials = credentials;
        super.setAuthenticated(true);// 注意:此处是一个坑,必须调用父级设置true,看源码 UsernamePasswordAuthenticationToken 处也有说明必须
    }

    @Override
    public Object getCredentials() {
        return credentials;
    }

    @Override
    public Object getPrincipal() {
        return principal;
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
@Autowired
    private IUserService userService;
    @Autowired
    private IPermissionService permissionService;
    @Autowired
    private CacheService cacheService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        String userKey = this.getEntryCacheKey(username);
        String permissionKey = this.getPermissionCacheKey(username);

        // 1.先查询缓存,没有再查询数据库是否存在该用户
        SysUser user = cacheService.getEntityCache(userKey, Constant.User.USER_KEY_EXPIRE, SysUser.class, () -> userService.getUserByUserName(username));
        Assert.assertNotNull(user,new UsernameNotFoundException(ResponseCode.SYSTEM_USERNAME_NOT_EXISTS.getMessage()));
        // 2.先查询缓存,没有在查询数据库,查询用户所有权限
        List<SysPermission> permissionList =  cacheService.getListCache(permissionKey, Constant.User.USER_KEY_EXPIRE, SysPermission.class, () -> permissionService.permissionListByUserId(user.getId()));
        return this.handleUserDetails(user,permissionList);
    }

    /**
     * 设置权限数据
     * @param user
     * @param permissionList
     * @return
     */
    public UserDetails handleUserDetails(SysUser user,List<SysPermission> permissionList){
        // 将权限过滤后的权限菜单结构数据设置到用户信息,用于在成功处理器里返回数据
        user.setMenus(permissionService.permissionTreeListMenuFilter(permissionList));
        // 获取前端按钮权限标识
        List<String> authBtnPerms = permissionList.stream().filter(item -> !Strings.isNullOrEmpty(item.getCode())).map(item -> item.getCode()).collect(Collectors.toList());
        user.setPermissions(authBtnPerms);

        // 3.将权限给security
        List<String> permsList = permissionList.stream().filter(item -> !Strings.isNullOrEmpty(item.getPerms())).map(item -> item.getPerms()).collect(Collectors.toList());
        String[] perms = permsList.toArray(new String[permsList.size()]);
        List<GrantedAuthority> authorityList = AuthorityUtils.createAuthorityList(perms);
        user.setAuthorities(authorityList);
        return user;
    }

    public String getEntryCacheKey(String username){
        if (username == null){
            username = "";
        }
        return Constant.User.USER_KEY + username;
    }

    public String getPermissionCacheKey(String username){
        if (username == null){
            username = "";
        }
        return Constant.User.PERMISSION_KEY + username;
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.

以上就是部分功能展示,从整体上来看,本系统功能是十分完整的,界面设计简洁大方,交互友好,数据库设计也很合理,规模适中,代码工整,清晰,适合学习使用。

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,下期见~