All Projects → Zealon159 → book-ms-interface

Zealon159 / book-ms-interface

Licence: MIT License
⚡ 微图书后端接口工程,主要使用spring-boot2.x、shiro开发,前端采用 vue.js、element-ui

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to book-ms-interface

Ifarm
后台管理系统,前后端分离,后端SpringBoot+Shiro+MyBatis+Redis,前端Vue+ElementUI+Axios
Stars: ✭ 151 (+75.58%)
Mutual labels:  admin, springboot, shiro
Jeecg Boot
「企业级低代码平台」前后端分离架构SpringBoot 2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领新的开发模式OnlineCoding->代码生成->手工MERGE,帮助Java项目解决70%重复工作,让开发更关注业务,既能快速提高效率,帮助公司节省成本,同时又不失灵活性。
Stars: ✭ 26,432 (+30634.88%)
Mutual labels:  admin, springboot, shiro
Ruoyi Vue Fast
(RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统
Stars: ✭ 107 (+24.42%)
Mutual labels:  admin, springboot
Priest
dubbo mybatis springboot base soa rest api framework with customer code generator
Stars: ✭ 160 (+86.05%)
Mutual labels:  admin, springboot
mee-admin
admin、cms、console 等多用途开源后台系统
Stars: ✭ 117 (+36.05%)
Mutual labels:  admin, shiro
cc-project-vue
一个基于vue3.0+antd+less+spring boot +mybatis+mysql+maven基础权限管理平台
Stars: ✭ 20 (-76.74%)
Mutual labels:  admin, springboot
Admin
这个一个基本的后台框架,springboot + redis.
Stars: ✭ 100 (+16.28%)
Mutual labels:  admin, springboot
jxc-admin
一个前后端分离的简易进销存后台管理系统,基于SpringBoot和vue-element-admin实现,具备常见的后台管理功能,登录态使用session,使用基于资源url的简单权限控制。
Stars: ✭ 203 (+136.05%)
Mutual labels:  admin, springboot
Lamp Cloud
lamp-cloud 基于Jdk11 + SpringCloud + SpringBoot的微服务快速开发平台,其中的可配置的SaaS功能尤其闪耀, 具备RBAC功能、网关统一鉴权、Xss防跨站攻击、自动代码生成、多种存储系统、分布式事务、分布式定时任务等多个模块,支持多业务系统并行开发, 支持多服务并行开发,可以作为后端服务的开发脚手架。代码简洁,注释齐全,架构清晰,非常适合学习和企业作为基础框架使用。
Stars: ✭ 4,125 (+4696.51%)
Mutual labels:  admin, springboot
crowd-admin
crowd-admin是一个基于Spring,Shiro,Redis/ehcache,Mybatis的通用后台权限管理系统,这里推荐本人另一个基于sprinboot的单点登录系统
Stars: ✭ 51 (-40.7%)
Mutual labels:  admin, shiro
RuoYi-fast
🎉 (RuoYi)官方仓库 基于SpringBoot的权限管理系统 易读易懂、界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运行即可用
Stars: ✭ 117 (+36.05%)
Mutual labels:  springboot, shiro
SpringbootCRM
SpringbootCRM,后台管理模板,抽空持续完善(Github授权登录,微信测试号扫码登录)...
Stars: ✭ 37 (-56.98%)
Mutual labels:  springboot, shiro
Springboot v2
SpringBoot_v2项目是努力打造springboot框架的极致细腻的脚手架。包括一套漂亮的前台。无其他杂七杂八的功能,原生纯净。
Stars: ✭ 1,093 (+1170.93%)
Mutual labels:  admin, springboot
Ruoyi Vue
(RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统
Stars: ✭ 596 (+593.02%)
Mutual labels:  admin, springboot
permission
前后端分离的后台权限管理系统,基于Spring Boot, Shiro, Vue, Element实现,预览地址http://123.206.82.234/#/login
Stars: ✭ 44 (-48.84%)
Mutual labels:  springboot, shiro
blog-springboot
My blog with springboot framework
Stars: ✭ 14 (-83.72%)
Mutual labels:  springboot, shiro
Spring Boot Plus
🔥 Spring-Boot-Plus is a easy-to-use, high-speed, high-efficient,feature-rich, open source spring boot scaffolding. 🚀
Stars: ✭ 2,198 (+2455.81%)
Mutual labels:  springboot, shiro
Sureness
A simple and efficient open-source security framework that focus on protection of restful api.
Stars: ✭ 254 (+195.35%)
Mutual labels:  springboot, shiro
opsli-ui
OPSLI 快速开发平台基于springboot、vue、element-ui ,项目采用前后端分离架构,热插拔式业务模块与插件扩展性高 ,代码简洁,功能丰富,开箱即用
Stars: ✭ 76 (-11.63%)
Mutual labels:  admin, springboot
learn-java-demo
java学习demo
Stars: ✭ 17 (-80.23%)
Mutual labels:  springboot, shiro

微图书管理平台-API

spring-boot shiro license

演示地址:http://books.zealon.cn/

项目介绍

此项目为微图书的接口工程,基于Spring Boot & MyBatis & Shiro & Redis 等框架构建

  • 通用项目结构、配置文件、精简的POM
  • 统一响应结果封装,支持 Fluent Interface 风格
  • 统一异常处理
  • 基础CRUD抽象封装

前端采用 Vue.js 、Element-UI 开发:点击进入仓库

工程结构

主要分了4个包,业务应用包app,系统功能包system,公用包common,以及核心包core,明细如下:

- src/main/java
  - cn.zealon.book
    - app / 业务应用包
  	  - book / 图书
  	  - dictionary / 数据字典
  	  - index / 系统主页
  	  - user / 用户信息
    - common / 公共包
  	  - base / 抽象基类
  	  - config / 工程配置
  	  - domain / 公共域对象
  	  - result / 响应结果封装
  	  - utils / 工具类
    - core / 核心包 
      - cache / 缓存
      - datasource / 数据源
      - exception / 异常处理
      - log / 操作日志
      - schedule / 调度任务
    - system / 系统功能包
      - attachment / 附件
      - org / 组织、用户、角色、权限
      - security / 安全处理(shiro)
    - Application.java / 项目启动类
- src/main/resources
  - mappers / MyBatis映射文件
  - application.yml / 应用配置文件
  - application-dev.yml / 开发环境配置
  - application-prod.yml / 生产环境配置

快速开始

  1. 初始化数据库脚本

  2. 配置 application-dev.yml

    1. 配置MySQL数据库账户密码

    2. 配置Redis账户密码

    3. 配置系统属性文件

      system:
        properties:
          # 删除开关(上线演示,避免删除全部数据)
          delete-switch: false
          # 上传白名单
          upload-white: 127.0.0.1
          # 操作系统物理路径
          upload-path: /Users/admin/local/
          # 附件相对目录
          attachment-dir: attachment/
          # 访问URL映射
          attachment-access: /attachment/**
      

      由于线上演示一些功能做了开关限制,这里把 delete-switch 配置为false就取消了限制哈。

      同样的,上传白名单限制 upload-white ,配置为空就取消了限制了。

      再就是附件上传根目录 upload-path ,注意 windows 系统和 linux 系统路径区别就行了。

  3. 启动工程

    运行 Application 启动项目,默认端口 8002,可以在 application.yml 中修改端口,注意修改后,vue工程配置文件的代理部分也需要修改。

指南

身份认证

登录身份授权使用了 Shiro 安全框架实现,Shiro 核心组件说明:

核心组件说明:

组件 说明
SecurityManager 安全管理器,图中没有对此说明,但安全管理器又起到了最重要的作用,它对 所有组件起到统一管理的作用。可以理解为Shiro架构本身。
Realms 域,图中也没有对此说明,Shiro从Realm获取安全数据(如用户、角色、权限), 就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户 进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限 进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
Authentication 认证管理器,起到用户登录认证的作用。
Authorization 授权管理器,访问授权控制,相当于角色权限管理,即确定“谁”可以访问“什么”。
Session Management 会话管理。

其中我们的安全管理器在 common.config.ShiroConfig 类下配置,同时也配置了会话管理、资源拦截配置、Realm、等等。

如果修改用户登录验证部分,那么要改写 system.security.shiro.ShiroRealm 类的 doGetAuthenticationInfo 函数,登录成功后将用户信息存储至 principal 中,这样只要用户登录后持续保持会话,就可以在任何地方获取我们的用户信息啦。

角色权限部分,则在 doGetAuthorizationInfo 函数中处理,目前本项目没有实现shiro操作权限。可以通过声明式注解指定的接口,实现权限验证,详细使用请参阅官网。

应用开发

系统对实体、持久层、服务层、控制器层,都做了一定的抽象,其父类在 common.base 包中。

实体层

实体类继承 BaseEntity 即可,不需要有 id、创建时间等属性,都在父类中实现。

持久层

持久层接口,继承 BaseMapper,泛型参数填写实体类,实现方法写在 mapper.xml 中即可,如果没有特殊的函数,不需要在 mapper.java 中编写方法。如:

public interface OrgDeptMapper extends BaseMapper<OrgDept> {
    /** 获取部门数据源 */
    @Select("select id,name text from org_dept order by sort_number")
    List<SelectVO> getDeptSelect();
}

其中CRUD方法,不需要编写(父类中已实现),可直接应用。

服务层

服务层继承 AbstractBaseService ,泛型参数填写实体类,如没有特殊函数,同样的不需要写一行代码。如:

@Service
public class OrgDeptService extends AbstractBaseService<OrgDept> {

}

AbstractBaseService 默认实现了基本的 CRUD 函数,子类不用写这些基本的函数,如有业务逻辑,则可以重写这些方法或增加自定义方法即可。

如重写某一个函数,实现一定的业务逻辑:

@Override
public Result deleteById(Integer id) {
    Integer userCount = orgUserMapper.findCountByDept(id);
    if (userCount > 0) {
        return ResultUtil.verificationFailed().buildMessage("删除失败,该部门下还有" + userCount + "个用户,请先移动用户至其它部门!");
    }
    return super.deleteById(id);
}

控制器层

控制器层继承 BaseController ,声明 @RestController 标识Rest接口,引入对应的服务类,定义API接口映射即可:

@RestController
@RequestMapping("system/org/dept")
public class OrgDeptController extends BaseController {
    // your code ...
}

前后端分离项目涉及跨域问题,其中 BaseController 中使用了跨域注解支持,其它 controler 就不用单独声明了。

响应结果

响应结果结构,code 为状态码,msg 为通知消息,data 为响应数据。

如果普通的操作,只返回 msg 即可;如果请求查询,则返回 data 数据。

{
    "code":200,
    "msg":"操作成功",
    "data":null
}

系统对响应结果做了完善的封装,只需要一行代码即可实现各类操作的响应处理。如:

public Result create(){
    // 默认成功
    return ResultUtil.success();
    
    // 默认失败
    return ResultUtil.fail();
    
    // 默认成功不返回通知
    return ResultUtil.successAndNoMsg();
    
    // 默认成功自定义通知
    return ResultUtil.success().buildMessage("你好啊");
    
    // 默认成功自定义响应数据
    return ResultUtil.success("我是数据ヾ(◍°∇°◍)ノ゙");
    
    // 等等...
}

分页

分页响应结果封装到了了 PageVO 里,分页服务定义此类为返回值。

系统使用了分页插件实现分页,如下示例:

public PageVO<User> getPageList(Params params) {
   Integer page = params.getInt("page");
   Integer limit = params.getInt("limit");
   PageHelper.startPage(page, limit);
   Page<User> pageList = (Page<User>) this.mapper.selectAll();
   return new PageVO<>(pageList.getTotal(),200,"",pageList);
}

只要在DB读取的代码上面加上 PageHelper.startPage(page, limit); 即可实现分页SQL处理,SQL语句无需填写 limit {#start},{#limit} 的限制。

大数据量分页

这种普通的分页,在数据量不太多的情况下还可以,若数据量达到大几十万、或百万以上级别,性能就明显慢了,且随着数据量的增加越来越慢,所以建议不能再用这种普通的分页方式了。

普通的分页:

SELECT user_name,user_id FROM org_user where dept_id=2 
ORDER BY user_id asc LIMIT 5000000 ,100 

原因是limit 这种方式,会遍历前面无关的 5000000 行数据,再向后查询100条,所以当数据量越大就会越慢咯。那么我们跳过前面5000000 行无关的数据页遍历,可以直接通过索引定位到第5000001,第5000002行,这样操作是不是更快了可以优化为快速定位要访问的数据行,如:

SELECT a.user_name,a.user_id FROM org_user a, 
(select user_id from org_user where dept_id=2 ORDER BY user_id asc LIMIT 5000000 ,100 ) b 
where a.user_id = b.user_id;

这样数据库查询引擎会通过索引跳过无关数据行,然后查询相关数据行了,当然查询条件必须要命中索引才行。

抛砖引玉,如果海量数据分页,就不建议单存使用数据库实现了,可以考虑用使用缓存+数据库的、或缓存等的方式。

在我们生产环境,使用索引定位行的方式优化过大数据量分页查询,总数据量在8000W行左右,没优化前查询一次平均需要用200秒才能查完,优化后只要3秒左右。

线程池

目前系统没有用到线程池的业务,但是已经配置了一个公共线程池,在一些需要异步执行的业务上可以直接使用(如业务数据写入之后,异步发送通知、异步记录日志等)。配置位置:common.config.ThreadPoolConfig ,可以自定义线程数等参数、名称。使用的时候直接引用,如:

@Autowired
private ExecutorService messageQueueThreadPool;

private void sendMsg(){
    this.messageQueueThreadPool.execute(new Runnable() {
        @Override
        public void run() {
            System.out.println("推送消息");
        }
    });
}

License

MIT

Copyright (c) 2020 光彩盛年

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].