SpringCloud微服务架构实战:商家权限体系设计及开发,springboot教程详解

private String name;private String email;private String phone;

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

private String address;private String linkman;

@DateTimeFormat(pattern = “yyyY-MM-dd HH:mm:ss”)

@column (name = “created”,columnDefinition = “timestamp defaultCurrent timestamp”)

@Temporal (TemporalType.TIMESTAMP)private Date created;

// 0neToMany (cascade ={ },mappedBy =“merchant”)// private List users;

public Merchant() {

}

}

用户实体主要由ID、名称、密码、邮箱、性别和创建日期等属性组成,实现代码如下所示:

@Entity

@Table(name = “tuser”)

public class User implements java.io.Serializable{

@Id

@GeneratedValue (strategy = GenerationType.IDENTITY)private Long id;

private String name;private String password;private String email;

eColumn (name = “sex”,length= 1,columnDefinition = “tinyint”)private Integer sex;

@DateTimeFormat (pattern= “YyyY-MM-dd HH:mm: ss”)

eColumn (name = “created”, columnDefinition = "timestamp defaultcurrent timestamp ")

@Temporal (TemporalType.TIMESTAMP)private Date created;

@ManyToMany (cascade = {,fetch = FetchType.EAGER)@JoinTable(name = “user role”,

joinColumns ={@JoinColumn (name = “user id”)],

inverseJoinColumns -{GJoinColumn (name = “role_id”)})

private List roles;

@ManyTo0ne

CJoinColumn(name = “merchant_id”)@JsonIgnore

private Merchant merchant;

public User() {

}

}

其中,@ManyToMany是一个多对多的正向关联关系,这里使用一个中间表user_role保存关联关系的数据。

@ManyToOne是一个反向关联设计,即使用mercnant_1a TFAh广oPIl Mo体建立关联关系。

角色实体由ID、名称和创建日期等属性组成,实现代码如下所示:

@Entity

@Table(name =“t role”)

public class Role implements java.io.Serializable{

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;

private String name;

@DateTimeFormat (pattern = “yyyy-MM-dd HH:mm:ss”)

eColumn(name = “created”,columnDefinition = "timestamp defaultcurrent timestamp ")

@Temporal (TemporalType.TIMESTAMP)private Date created;

@ManyToMany(cascade = {}, fetch = FetchType.EAGER)

@JoinTable(name = “role resource”,

joinColumns = {@JoinColumn (name - “role_id”)},

inverseJoinColumns = {@JoinColumn (name = “resource_id”)))

private List resources;

public Role() {

}

}

角色实体与资源实体是一个多对多的关联关系,因此使用@ManyToMany进行设置。通过这种关联关系,可以将权限管理模型与菜单管理模型组成一个完整的商家权限体系。

资源实体由ID、名称、统一资源定位和创建日期等属性组成,实现代码如下所示:

@Entity

@Table(name =“t resource”)

public class Resource implements java.io.Serializable {

@Id

@GeneratedValue (strategy =GenerationType.IDENTITY)private Long id;

private string name;private string url;

@DateTimeFormat (pattern = “yyyy-MM-dd HH:mm:ss”)

@Column (name = “created”, columnDefinition = “timestamp defaultcurrent timestamp”)

@Temporal(TemporalType.TIMESTAMP)private Date created;

@ManyToOne

@JoinColumn(name = “mid”)@JsonManagedReference

private Model model;

public Resource() {

}

}

资源实体与模块的关联关系同样使用@ManyToOne进行反向关联设计,这与用户与商家的关联关系的设计原理相同。

模块实体由ID、名称、主机、图标和创建日期等属性组成,实现代码如下所示:

@Entity

@Table(name =“tmodel”)

public class Model implements java.io.Serializable{

@Id

@Generatedvalue(strategy -GenerationType.IDENTITY)private Long id;

private String name;private String host;private String icon;

@DateTimeFormat (pattern = “yyyy-MM-dd HH:mm:ss”)

eColumn (name = “created”, columnDefinition = “timestamp defaultcurrent timestamp”)

@Temporal (TemporalType.TIMESTAMP)private Date created;

@ManyTo0ne

@JoinColumn (name = “kid”)@JsonIgnore

private Kind kind;

public Model() {}

}

模块实体的关联关系设计与资源实体的关联设计一样,也是使用@ManyToOne进行反向关联设计的。

分类实体由ID、名称、链接服务和创建日期等属性组成,实现代码如下所示:

@Entity

@Table(name = “t kind”)

public class Kind implements java.io. Serializable{

@Id

@Generatedvalue (strategy =GenerationType.IDENTITY)private Long id;

private String name;private String link;

@DateTimeFormat (pattern= “yyyy-MM-dd HH:mm:ss”)

cColumn (name = “created”, columnDefinition = “timestamp defaultcurrent timestamp”)

@Temporal (TemporalType.TIMESTAMP)private Date created;

public Kind() {}

}

分类实体在菜单模型结构中是一个顶级菜单,所以不需要进行关联设计。

单向关联设计可以提高数据的访问性能,但也有不足的地方。比如,在角色实体中,已经实现了角色实体与资源实体的单向关联设计,因此从角色实体中查询资源列表,则是非常容易的。但是反过来,从资源实体中查询角色列表就有些费力了。为了弥补这种不足,可以使用SQIL查询语句实现,具体会在后面的持久化设计中进行说明。

权限管理模型的持久化设计

在权限管理模型设计完成之后,为各个实体创建一个存储库接口,并与JPA的存储库接口进行绑定,就可以给实体赋予操作行为,实现实体的持久化设计。这一过程,其实就是存储库接口设计的工作。

例如,可以创建一个如下所示的存储库接口实现商家实体的持久化设计:

@Repository

public interface MerchantRepository extends JpaRepository<Merchant,Long>,JpaSpecificationExecutor {

}

在这个接口设计中,通过继承JpaRepository,可以让这个接口具有增删改查的操作功能。再通过继承.JpaSpecificationExecutor,就可以进行复杂的分页查询设计。如果不做其他特殊的查询设计,这样就已经完成了商家实体的持久化设计了。

如果对于一个实体,还需要实现一些复杂的查询设计,如对用户实体进行持久化设计,则使用如下所示的代码:

@Repository

public interface UserRepository extends JpaRepository<User, Long>,JpaSpecificationExecutor {

cQuery (“select distinct u from User u where u.name= :name”)User findByName (@Param (“name”) String name) ;

@Query(“select u from User u”+

" left join u.roles r"+

“where r.name= :name”)

User findByRoleName (@Param (“name”) String name) ;

@Query (“select distinct u from User u where u.id= :id”)User findById(@Param( “id”) Long id);

@Query ( “select u from User u”+

"left join u.roles r "+“where r.id = :id”)

List findByRoleId(@Param(“id”) Long id);

}

这里多了几个使用注解“@Query”进行自定义查询设计的声明方法。

其中,findByName和findByld主要使用distinct进行了去重查询,以避免在多对多的关联查询中,出现数据重复的情况。

另外,findByRoleName和 findByRoleld就是前面提到的,为弥补单向关联设计的不足而设计的查询。findByRoleName实现了从角色名称中查询用户列表的功能,而findByRoleld实现了从角色ID中查询用户列表的功能。

在角色实体存储库接口设计中,也需要增加一个查询设计,代码如下所示:

@Repository

public interface RoleRepository extends JpaRepository<Role,Long>,JpaSpecificationExecutor{

CQuery(“select o from Role o”+

“left join o.resources r”+“where r.id = :id”)

List findByResourceId(@Param(“id”) Long id);

}

在这个设计中,findByResourceld是一个反向关联查询,即使用资源ID查询角色列表。

其他实体的持久化设计与商家实体的持久化设计类似,只需为它们创建一个存储库接口就可以了。

权限管理模型的服务封装

在领域服务开发中,服务层的实现是对存储库接口调用的一种封装设计,这样,不但可以在存储库接口调用过程中实现统一的事务管理,还可以增加其他功能。

下面我们以用户服务层的开发为例进行说明,其他各个业务服务层的开发与此类似,不再赘述。

在用户服务层的设计中,增删改查各个操作的实现代码如下所示:@Service

@Transactional

public class UserService {

CAutowired

private UserRepository userRepository;

public String insert (User user){

try {

User old = findByName(user.getName());if(old == null) {

userRepository.save(user);

return user.getId() .toString();}else{

return "用户名’ "+ old.getName()+ “'已经存在!”;

}catch(Exception e){

e.printStackTrace();return e.getMessage();

public String update (User user){

try {

userRepository.save(user);

return user.getId() .toString();}catch(Exception e){

e.printStackTrace();return e.getMessage ();

}

}

public String delete (Long id){

try {

userRepository.deleteById(id);return id.toString ();

}catch (Exception e){

e.printStackTrace();

return e.getMessage();

}

}

public User find0ne (Long id){

return userRepository.findByUserId(id);

}

public List findA11(){

return userRepository.findAl1();

}

}

在这个设计中,注解@Transactional 实现了隐式的事务管理功能。由于登录用户必须以用户名为依据,所以在新增用户名时,做了同名检测。

用户领域服务的分页查询功能的实现代码如下所示:

@service

@Transactional

public class UserService {

CAutowired

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一个基于Spring Boot的微服务架构框架。它将Spring Boot开发的单个微服务整合并管理起来,为各个微服务之间提供了诸如配置管理、服务发现、断路器、路由、事件总线等集成服务的功能。与Spring Boot专注于快速方便地开发单个微服务个体相比,Spring Cloud关注的是全局的服务治理组件的集合。Spring Cloud通过整合其他公司中微服务架构常用的组件,并使用Spring Boot进行简化开发和配置,提供了一套完整的微服务架构解决方案。你可以通过访问Spring Cloud项目官方网址:https://spring.io/projects/spring-cloud 获取更多关于Spring Cloud的详细信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [04_SpringCloud](https://blog.csdn.net/weixin_45844810/article/details/110920028)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SpringCloud 微服务架构详解](https://blog.csdn.net/weixin_49137820/article/details/128218016)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值