基于amis后端低代码平台

354 阅读9分钟

源码获取 gitee.com/Huiyun-Co/l…

  • 写这个平台是为了解决多年对于项目的困扰,不想碰到新项目就重新来,通过业务模块的积累,能进行模块化安装。
  • 新的项目只需要安装模块就能搭建一套完整的业务系统。
  • amis-api 的所有基础代码都以模块的形式组合在一起。这些模块可以随时从数据库中安装或卸载。
  • 这些模块有两大目的。要么你可以添加新应用/业务逻辑,要么你可以修改已有应用。
  • 简言之,amis-api 中的一切都始于模块也终于模块。amis-api 由不同规模的公司所使用,每个公司都有不同的业务流和要求。处理这一问题,amis-api 将应用的功能拆分到了不同的模块中。这些模块可按需在数据库中进行加载。基本上,用户可以在任何时间点启用/禁用这些功能。因此,相同的软件可以按不同的要求进行调整。

功能介绍

  1. 模组管理 安装模组,卸载模组

    1729260875350

    编辑

  2. 权限管理 用户管理,角色管理,部门管理 

    1729260898811

    编辑

  3. 开发管理 菜单管理,模型管理,视图管理 

    1729260908052

    编辑

  4. 系统管理

版权声明

ORM参照Jfinal 框架 独创Db + Record模式,灵活便利 ActiveRecord支持,使数据库开发极致快速 gitee.com/jfinal/jfin…

Odoo 是一个模块化系统,所有的业务功能都是由模块(module)提供的。

gitee.com/mirrors/odo…

版权信息

软件遵循MIT开源协议,意味着您无需支付任何费用,也无需授权,即可将 软件应用到您的产品中。 注意:这并不意味着您可以将软件应用到非法的领域,比如涉及赌博、色情、暴力、宗教等方面。 如因此产生纠纷等法律问题, 作者不承担任何责任。切勿以身试法!!! 网络不是法外之地 声明:软件仅供学习交流,严禁用于商业用途。

小白手册

目录介绍

amis-api

-apps 应用模块

--base 基础模块

--im 聊天模块

--net weboscket服务

-lowcode 引擎

-service 启动

-- resource 资源文件

-- templates 静态资源

前端工程是经过amis 打包成js SDK文件

amis 有两种使用方法:

  • JS SDK,可以用在任意页面中
  • React,可以用在 React 项目中

SDK 版本适合对前端或 React 不了解的开发者,它不依赖 npm 及 webpack,可以像 Vue/jQuery 那样外链代码就能使用。


```java
lambda-portal:
  #数据源配置
  db-datasource:
    name: lambda-portal
    url: jdbc:mysql://127.0.0.1:3306/lowcode?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useAffectedRows=true&useSSL=false
    username: 账号
    password: 密码
    driverClassName: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.xa.DruidXADataSource
    initialSize: 5
    minIdle: 5
    maxActive: 500
    maxWait: 60000
  

注解

基础注解

Java开发中,Java Persistence API (JPA) 是一个用于管理关系数据库的对象关系映射 (ORM) 框架,它简化了数据访问层的编写。JPA通过一系列注解来定义实体类与数据库表之间的映射关系, @Table@Id是最基础且常用的几个注解。本文将深入浅出地介绍这些注解的用法、常见问题、易错点及避免策略,并附上代码示例。

@APP

标记模块名称,每个JAR取名。

示例代码

@APP(displayName = "通讯服务", name = "im", depends = "net")

@Table

标记表名信息,以及Entity实体信息。

示例代码

@Table(name = "im_group", displayName = "群组")
public class Group extends Model<Group> {
    @Id
    private Long id;

    @Column(label = "群组名称")
    private String name;

    @File(label = "群组头像")
    private String avatarUrl;

}

@Id

标记属性为主键

@Id注解用于标记实体类中的哪个属性作为数据库表的主键。每个实体必须有一个主键。

易错点:未正确设置主键,或者在实体类中使用了复合主键但未正确配置。

避免策略:确保每个实体类至少有一个属性被@Id注解,并理解复合主键的正确配置方法。

@Column

标记表数据库表字段

@NotBlank

标记创建更新表的时候字段不能为空

@Service

标记方法公开

属性属性描述
displayName需要展示的中文描述
event模块加载后支持服务

示例代码

@Service
    public Map<String,Object> login(String login, String password){
        Map<String,Object> result = new HashMap<>();

        //TODO LOGIN
        User user =  this.selectOne(new LambdaQueryWrapper<User>().eq(User::getUserName,login));
        if(null == user){
            return Collections.EMPTY_MAP;
        }

        //TODO SIGN TOKEN
        String sign = JWTUtil.sign(login, String.valueOf(user.getId()), true, password);
        String token = PortalUtil.encryptToken(sign);
        result.put("token", token);

        return result;
    }

@ManyToOne

ManyToOne用于表示多对一的关系,其中“多”表示关系的拥有方,而“一”表示关系的维护方。在ManyToOne关系中,通常是多的一方持有对一的一方的引用,并在数据库中存储对应的外键值。

ManyToOne关系可以通过注解来表达,在Java实体类中使用@ManyToOne注解表示,同时还需要加上@JoinColumn注解,以指定外键列的名称和关联实体。

有两种级联操作:级联保存和级联删除。级联保存表示当保存多的一方时,同时保存对应的所有一的一方对象;级联删除表示当删除一的一方时,同时删除对应的所有多的一方对象。

在@ManyToOne注解中使用cascade属性即可实现级联操作:

示例代码

@ManyToOne
    @JoinColumn(name = "model_id")
    private IrModel irModel;

@ManyToMany

11

示例代码

@ManyToMany
    @JoinTable(name = "base_role_user",joinColumns = @JoinColumn(name = "role_id"),inverseJoinColumns = @JoinColumn(name = "user_id"))
    private List<User> userList;

@OneToMany

222

示例代码

@OneToMany
    private List<IrField> fieldList;

Validator参数校验常用注解

除了前四个 @Null,@ NotNull,@ NotBlank,@NotEmpty外,其他所有的注解,传 null 时都会被当作有效处理

注解常用参数值:message(校验不通过反馈信息)

JSR303定义的基础校验类型:

注解验证的数据类型备注
Null任意类型参数值必须是 Null
NotNull任意类型参数值必须不是 Null
NotBlank只能作用于字符串字符串不能为 null,而且字符串长度必须大于0,至少包含一个非空字符串
NotEmptyCharSequenceCollectionMapArray参数值不能为null,且不能为空(字符串长度必须大于0,空字符串(“ ”)可以通过校验)
Size(min,max )CharSequenceCollectionMapArray字符串:字符串长度必须在指定的范围内Collection:集合大小必须在指定的范围内Map:map的大小必须在指定的范围内Array:数组长度必须在指定的范围内
Pattern(regexp)字符串类型验证字符串是否符合正则表达式
Min(value)整型类型参数值必须大于等于 最小值
Max(value)整型类型参数值必须小于等于 最大值
DecimalMin(value)整型类型参数值必须大于等于 最小值
DecimalMax(value)整型类型参数值必须小于等于 最大值
Positive数字类型参数值为正数
PositiveOrZero数字类型参数值为正数或0
Negative数字类型参数值为负数
NegativeOrZero数字类型参数值为负数或0
Digits(integer,fraction)数字类型参数值为数字,且最大长度不超过integer位,整数部分最高位不超过fraction位
AssertTrue布尔类型参数值必须为 true
AssertFalse布尔类型参数值必须为 false
Past时间类型(Date)参数值为时间,且必须小于 当前时间
PastOrPresent时间类型(Date)参数值为时间,且必须小于或等于 当前时间
Future时间类型(Date)参数值为时间,且必须大于 当前时间
FutureOrPresent时间类型(Date)参数值为时间,且必须大于或等于 当前日期
Email字符串类型被注释的元素必须是电子邮箱地址

Validator 中附加的 constraint :

注解验证的数据类型备注
Length字符串类型字符串的长度在min 和 max 之间
Range数字类型字符串类型数值或者字符串的值必须在 min 和 max 指定的范围内

Pattern注解校验 常用正则表达式

@Pattern(regexp = "^[1-9]]\d*$", message = "XX参数值必须是正整数")

过滤条件

条件构造器

保留了 MyBatis-Plus 强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。

在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。以下是主要的 Wrapper 类及其功能:

  • AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
示例

普通 Wrapper (QueryWrapper)

Lambda Wrapper (LambdaQueryWrapper)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.allEq(Map.of("id", 1, "name", "老王", "age", null));

带过滤器的普通 Wrapper (QueryWrapper)

QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.allEq((field, value) -> field.contains("a"), Map.of("id", 1, "name", "老王", "age", null));

带过滤器的 Lambda Wrapper (LambdaQueryWrapper)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.allEq((field, value) -> field.contains("a"), Map.of("id", 1, "name", "老王", "age", null));

eq

eq 方法是框架中用于构建查询条件的基本方法之一,它用于设置单个字段的相等条件。

方法签名
// 设置指定字段的相等条件eq(R column, Object val)
// 根据条件设置指定字段的相等条件eq(boolean condition, R column, Object val)

参数说明
  • column:数据库字段名或使用 Lambda 表达式的字段名。
  • val:与字段名对应的值。
  • condition:一个布尔值,用于控制是否应用这个相等条件。
示例

Lambda Wrapper (LambdaQueryWrapper)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();l