关于后端开发:每天5分钟行为型模式三

状态模式状态模式的益处是将与特定状态相干的行为部分化,并且将不同状态的行为宰割开来。 将特定相干的行为都放入一个对象中,因为所有与状态相干的代码都存在于某个ConcreteState 中,所以通过定义新的子类能够很容易地减少新的状态和转换。 Context: 上下文,定义了客户程序须要的接口并保护一个状态类。 State: 状态类,定义一个接口以封装上下文环境的一个特定状态相干的行为,与状态相干的操作委托给具体的state对象进行解决。 Concrete State: 具体状态类 状态模式UML 采纳的例子是王者外面的,要么在打团要么在打团的路上,这就波及到了状态的转换。 状态模式State public interface State { void handle(Context context);}Concrete State 回城状态 public class ConcreteStateBack implements State{ @Override public void handle(Context context) { System.out.println("没状态了,回城补个状态先"); context.setState(new ConcreteStateWalk()); }}打团状态 public class ConcreteStateFight implements State{ @Override public void handle(Context context) { System.out.println("大招一按,天穹一开,双手一放,要么黑屏,要么五杀"); context.setState(new ConcreteStateBack()); }}打团的路上状态 public class ConcreteStateWalk implements State{ @Override public void handle(Context context) { System.out.println("状态已满,等我汇合打团"); context.setState(new ConcreteStateFight()); }}失败状态 public class ConcreteStateDefeated implements State{ @Override public void handle(Context context) { System.out.println("Defeated!!!"); }}Context ...

May 1, 2021 · 5 min · jiezi

关于后端开发:Worktile-权限设计与实现

作者:Worktile 后端开发工程师霍世杰 Worktile是国内最优良的企业级我的项目合作与指标管理工具之一,这个我的项目曾经继续了9年之久,书写了研发团队的历史长卷,我作为“后来者”有幸地参加其中。在过来研发的一年里,做的事件大多数是对原有性能的加强和重构,也学习和总结了 一点点Worktile核心技术和常识,本文就是其中之一—— 权限零碎。 Worktile的权限异样简单,在开发中,从纳闷到深刻,再到起初的望之止步,直至最终的克服,这其中屡次与共事的交换,又屡次的总结,逐步地清晰,到当初对它进行了我认为比拟全面的总结,上面就跟大家一起 揭秘(分享) 这块简单而精彩的内容。 一、Worktile 帐户体系 首先总览一下Worktile的帐户体系。在此之前,先介绍一下该零碎:它是多租户零碎的一种,在我接触过的多租户零碎中,有两种类型,一种是像企业微信,飞书,它们的租户类型有用户和团队/组织/企业,那么这类利用的帐户体系 就有两个用户概念,一个是零碎用户,一个是团队成员;而另一种就是 Worktile,租户类型 是 企业/团队/组织的,它是不含集体租户,所有业务的根底条件是 团队(team) ,所以权限这块也是基于 团队成员来管制的。 目前比拟支流的权限设计模型,一种是ACL(Access Control List),是次要是基于用户来管制权限,而另一种是RBAC模型(Role-Based Access Control )基于角色的访问控制,而这两种在Worktile中都有波及,在绝大部分是RBAC模型,大量的权限是基于用户设计和管制的。 上图中,能够看到Worktile权限是由性能权限和数据权限两局部组成,上面对这性能权限和数据权限两局部 具体解说。 二、设计与实现性能权限和数据权限都是基于利用的维度来划分的,Worktile 现有的利用有我的项目、工作、指标(OKR)、音讯、日历、审批、网盘、考勤...... (更多理解点 这里)。 性能权限设计性能权限是齐全依照 RBAC 模型 设计的,关系为: 由两局部组成:操作权限和可见权限,是依照利用模块的维度划分的,每个利用模块下散布多个权限点和可见范畴。 给用户出现的模式是在利用的后盾—>角色治理中(见下图),其中企业角色蕴含两局部: 1. 零碎默认角色(所有者、管理员、成员、部门主管) 2.自定义角色,权限列表(下图右侧)中,打对勾的代表该角色已领有的权限,数据范畴 代表 该角色 在 利用内的可见维度。 可操作权限 可见权限 实现在传统关系型数据库的设计,根本都是三张表:角色表,权限表,角色权限关联表,如果校验一个或一组权限,是须要三表关联查问的。 而在Worktile中则不然,采纳的贮存形式是:非关系型数据库Mongodb + 零碎配置文件, 由一张表来体现,权限列表由零碎配置文件存储。 Mongodb,人造反对数组和JSON类型的数据贮存,在角色和权限的关联配置中更为灵便,这一环在此设计中,不可或缺! 配置文件次要存储的是权限列表,零碎内置,前端也须要一份配置是因为列表展现地位匹配。 为何这么设计? 数据库是因为整个产品的主库就是 Mongodb,这也是最大的起因;权限列表之抉择配置文件贮存,我猜测 是因为权限是零碎内置,并且是固定的,改变频率较低,所以没有必要每次都要再交互一次数据库,不仅是性能权限如此,上面谈到的数据权限亦是如此。 零碎的权限列表 配置的数据结构大抵如下(以下只是阐明构造,并非理论数据): 一级节点的key代表的是利用模块,二级节点的key代表权限点,value为权限的形容,具体如下: 角色与权限的关联配置 ...

April 28, 2021 · 2 min · jiezi

关于后端开发:postgreSQL数据库导入与导出

Windows中PostgreSQL数据库的备份和还原1、备份:         通过cmd命令窗口进入到PostgreSQL装置目录下的bin目录下:而后,输出以下命令: 2、还原 也是通过cmd命令窗口进入到PostgreSQL装置目录下的bin目录下,而后输出以下命令即可。但在还原数据库之前,须要提前建设一个空白的同名数据库。 3、单表备份: 单表复原的办法同上。

December 21, 2020 · 1 min · jiezi

关于后端开发:提高生产力最全-MyBatisPlus-讲解

大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚! 死鬼~看完记得给我来个三连哦! 本文次要介绍 MybatisPlus的应用如有须要,能够参考 如有帮忙,不忘 点赞 ❥ 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 如果你每天还在反复写 CRUD 的 SQL,如果你对这些 SQL 曾经不耐烦了,那么你何不破费一些工夫来浏览这篇文章,而后对已有的老我的项目进行革新,必有播种! 一、MP 是什么MP 全称 Mybatis-Plus ,套用官网的解释便是成为 MyBatis 最好的搭档,简称基友。它是在 MyBatis 的根底上只做加强不做扭转,为简化开发、提高效率而生。 1. 三大个性1)润物无声只做加强不做扭转,引入它不会对现有工程产生影响,如丝般顺滑。 2)效率至上只需简略配置,即可疾速进行单表 CRUD 操作,从而节俭大量工夫。 3)丰盛性能代码生成、物理分页、性能剖析等性能一应俱全。 2. 反对数据库mysql 、mariadb 、oracle 、db2 、h2 、hsql 、sqlite 、postgresql 、sqlserver 、presto 、Gauss 、FirebirdPhoenix 、clickhouse 、Sybase ASE 、 OceanBase 、达梦数据库 、虚谷数据库 、人大金仓数据库 、南大通用数据库3. 框架结构 瞎话说,以上这些内容只有你关上官网也能看到,那么咱们接下来就先来实际操作一番! 二、MP实战1. 手摸手式我的项目练习1)数据库及表筹备sql 语句:  use test; CREATE TABLE `student` (  `id` int(0) NOT NULL AUTO_INCREMENT,  `dept_id` int(0) NULL DEFAULT NULL,  `name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,  `remark` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (1, 1, '小菜', '关注小菜不迷路!'); INSERT INTO `student` VALUES (2, 2, '小明', '好好学习,天天向上!');2)pom 依赖 <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--lombok--> <dependency>  <groupId>org.projectlombok</groupId>  <artifactId>lombok</artifactId>  <version>1.16.16</version> </dependency> <!--MP插件--> <dependency>  <groupId>com.baomidou</groupId>  <artifactId>mybatis-plus-boot-starter</artifactId>  <version>3.2.0</version> </dependency> <!--Mysql--> <dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>8.0.21</version> </dependency> <!-- 连接池 --> <dependency>  <groupId>com.alibaba</groupId>  <artifactId>druid</artifactId>  <version>1.2.1</version> </dependency> <!--JUNIT--> <dependency>  <groupId>junit</groupId>  <artifactId>junit</artifactId>  <version>4.13.1</version> </dependency>3)配置文件 spring:  datasource:  url: jdbc:mysql://localhost:3306/test  username: root  password: 123456  driver-class-name: com.mysql.cj.jdbc.Driver4)实体类 @Data @Builder @TableName("student") public class User {   @TableId(type = IdType.AUTO)  private Integer id;   private Integer deptId;   private String name;   private String remark; }5)Mapper public interface UserMapper extends BaseMapper<User> {}6)测试类 @RunWith(SpringRunner.class) @SpringBootTest public class MapperTest {   @Autowired  private UserMapper userMapper;   @Test  public void getAll() {  List<User> users = userMapper.selectList(null);  users.forEach(System.out::println);  } } /** OUTPUT: User(id=1, deptId=1, name=小菜, remark=关注小菜不迷路!) User(id=2, deptId=1, name=小明, remark=好好学习,天天向上!) **/小菜结: ...

December 6, 2020 · 8 min · jiezi

关于后端开发:低代码开发平台的敏捷之力

随着互联网的深刻倒退,很多企业逐渐降级了本人的信息系统,然而在对现有IT架构进行降级革新的过程中,通常面临着诸多的压力与挑战。随着先进技术的一直引入,将企业的信息化倒退置于新旧迭代的循环之下,为了更加无效地应答这些挑战,企业须要思考新技术是否为业务发明更多的机会。 值得注意的是,企业本来依靠的开发架构在很多方面曾经不能满足业务倒退的需要,并逐步被当今所风行的麻利了解和低代码开发所取代,并呈现出更多拓展的可能性。 作为生产力进步的延长,麻利开发和低代码开发相辅相成,但具体实施起来又不是那么容易,明天咱们就看看这两者在理论应用过程中是如何进行交融的。 当初很多行业都会提到麻利的概念,比方建设、学习、业务以及制作等,不过它最后的提出却是针对软件行业的,因为其良好的适用性,以至于在其余行业也发光发热。狭义上讲,麻利模式依赖于迭代和增量的倒退,特地是效率晋升和广大的适应性,使其被越来越多的团队所关注。  麻利的个性: 疾速适应外部和内部变动; 疾速响应业务或客户的需要; 在不升高产品交付品质的前提下,以经济高效的形式带动技术改革; 为企业放弃强劲的竞争劣势; 采纳麻利模式须要高度的组织化。麻利团队无论基于传统模式开发还是应用低代码开发,首先要抉择一位经验丰富的技术负责人,他将参加、受权并及时对我的项目进行响应。例如,在团队习惯每周或每次集中突击开发时,则须要其把控节奏,保障我的项目进度合乎预期,并达到质量标准,技术团队的负责人需每天关注并疾速决策需要的优先级,对交付产品进行验收。 在我的项目验收的体系下,所有IT团队成员都应该依据对立的规范来进行产品对接,包含最终交付物的验收规范。在开发过程中,麻利团队成员往往须要合作,并提出如何改良产品的优化倡议。 得益于简化开发、缩短测试周期等能力,低代码将有助于放弃高效的开发进度,并保障产品可能如期甚至提前交付。 另外,谈到麻利,咱们须要介绍一种当今广泛应用的实际办法“Scrum”。 麻利Scrum方法论能够帮忙业务晋升产品质量与价值,并加强团队合作的透明度,在很多跨行业的工作流程中,他们都遵循麻利Scrum的办法来进行,而低代码的呈现将有助于Scrum进一步演变成为更具麻利能力的办法。 规模化麻利规模化麻利或“规模麻利”是促成大型麻利施行的零碎框架。目标是为肯定数量技术团队提供IT结构设计和治理,以便于大型团队从事简单我的项目。大规模的技术团队能力会更加全面,但也会升高麻利的效率劣势。 面对不同的IT环境,存在着多样的麻利框架,它们的范畴从轻到重,且各有优劣。包含Nexus、大型Scrum(LeSS)、Scrum @ Scale(S@S)、SAFe等,这些大都须要装备数集体的Scrum团队。值得关注的是,通过应用低代码开发平台能够进一步扩大规模化麻利,从而实现麻利开发中的多种成果。除了提高效率外,低代码还提供了自动化以及对DevOps的弱小撑持,低代码和规模化麻利一起加强了企业的IT能力。 麻利模式的最佳实际都是从抉择一个经验丰富的团队进行绝对较小范畴的利用开始的。优良的办法要可能解决企业本身的问题,并确保办法的适用性,从而取得企业决策层的反对,随着办法在IT团队中一直利用与优化,麻利开发模式更容易进行复制和延长。此外,在麻利项目管理工具中应建设规范化的规范,在我的项目文档中,这样的操作能够缩小开发阶段因发现缺失规范而延误的开发排期。 最初,对于曾经可能纯熟应用低代码开发平台的麻利团队,应该思考如何缩短集中开发的持续时间,毕竟麻利开发与低代码开发的最终目标都是为了比传统平台更快地向用户交付有价值的软件。 北风.

November 4, 2020 · 1 min · jiezi

关于后端开发:RabbitMQ-基础概念进阶

上一篇 RabbitMQ 入门之根底概念 介绍了 RabbitMQ 的一些根底概念,本文再来介绍其中的一些细节和其它的进阶的概念。 一、音讯生产者发送的音讯不可达时如何解决RabbitMQ 提供了音讯在传递过程中无奈发送到一个队列(比方依据本人的类型和路由键没有找到匹配的队列)时将音讯回传给音讯发送方的性能,应用 RabbitMQ 的客户端提供 channel.basicPublish 办法的两个参数 mandatory 和 immediate (RabbitMQ 3.0 以下版本),除此之外还提供了一个备份交换器能够将无奈发送的音讯存储起来解决,不必从新传回给发送方。 1.1 mandatory 参数mandatory 被定义在 RabbitMQ 提供的客户端的 channel.basicPublish 办法中,如下所示: 当把办法的 mandatory 参数设置为 true 时,那么会在交换器无奈依据本身的类型和路由键找到一个符合要求的队列时,RabbitMQ 会主动调用 Basic.Return 把该音讯回传给发送方也就是咱们的音讯生产者。反之,如果设置为 false 的话,音讯就会被间接抛弃掉。那么问题来了,咱们要如何去获取这些没有被发送进来的音讯呢?RabbitMQ 给咱们提供了事件监听机制来获取这种音讯,能够通过 addReturnListener 办法增加一个 ReturnListener 来获取这种未发送到队列的音讯,如下所示: 通过查看 ReturnListener 接口的源码能够看到,该接口只有一个办法,如果是 JDK8+ 的版本的话能够应用 Lambda 表达式来简化一些代码。 能够看出,当设置了 mandatory 参数时,还必须为生产者同时增加 ReturnListener 监听器的编程逻辑,这样就会使得生产者的代码变得更加简单了,为了解决这种状况,RabbitMQ 提供了 `备份交换器` 来将没有胜利路由进来的音讯存储起来,当咱们须要的时候再去解决即可。 1.2 immediate 参数该的参数同样也是在channel.basicPublish 办法中定义的,其官网形容如下: This flag tells the server how to react if the message cannot be routed to a queue consumer immediately. If this flag is set, the server will return an undeliverable message with a Return method. If this flag is zero, the server will queue the message, but with no guarantee that it will ever be consumed.当把 immediate 参数设置为 true 时,如果交换器依据其类型和路由键找到符合要求的队列时,发现所有队列上没有任何消费者,则该音讯并不会存入到队列中,会通过 Basic.Return 命令把音讯回传给生产者。简而言之也就是说,当设置了 immediate 参数时,该音讯关联的队列上存在消费者时,会立刻发送音讯到该队列中,反之如果匹配的队列上不存在任何消费者,则间接把音讯回传给生产者。这里有一点须要留神的是:从 RabbitMQ 3.0 + 曾经去除了该参数。 ...

August 9, 2020 · 2 min · jiezi