不用写代码的开源开发平台(开源快速开发平台)
不用写代码的开源开发平台(开源快速开发平台) 集成了validate-springboot-starter,在兼容hibernate Validator和javax validation的同时,支持了更多自定义玩法。 内置常用验证规则:比如手机号验证,正则验证,ip 邮箱,长度,范围,数字,小数,中国车牌号,身份证,长度, url 图书ISBN编号 文件后缀 文件大小 等常用验证规则 传统微服务玩法是第一我定义一个fegin api接口,然后写一个controller ,在写一个service实现 需要三个步骤,fhs 集成了easy cloud,只需要在service层给对应的方法上加@CloudMethod 即可完成接口暴露,哪个微服务用到直接 Autowired service接口即可。基于Springboot Springcloud Mybatis Plus sa-token vue
一、开源项目简介fhs-Framework是一个基于Springboot Springcloud Mybatis Plus sa-token vue elementui 的快速开发平台(低代码开发平台),本框架永远免费,永久全开源。
FHS-Framwork是一个集成了国内外诸多优秀开源项目的快速开发平台,除了在常规快速开发平台提供 用户,角色,权限,菜单,字典,审计日志,代码生成器 还拥有可以让您更少写SQL和前端代码的翻译服务以及PAGEX服务。
二、开源协议使用Apache-2.0开源协议
三、界面展示



系统管理
- 部门管理
 - 用户管理
 - 角色管理
 - 字典管理
 - 菜单管理
 - 代码生成
 - 登录日志
 
基于Springboot Springcloud Mybatis Plus sa-token vue elementui。
用到的国产组件集- Mybatis Plus
 - Sa-Token
 - Validate-Springboot-Starter
 - SpringCloud Alibaba
 - ip2region
 - knife4j
 
翻译组件可以只通过注解把你表里的id转换为名称,把你的字典码转换为字典注释(比如0转换为男1转换为女)。
- All in One模式 开发 微服务模式部署微服务开发对于电脑内存要求比较高,调试个东西要启动好多个微服务还要启动网关,调用链路复杂的点一下不知道调用到谁那里去了,要解决还要自己机器跑nacos,fhs 首创,all in one 模式开发,微服务模式部署,在开发环境直接把所有的模块集成到一个springBoot项目启动,部署的时候又使用微服务 网关模式部署 参考:fhs_app/fhs_app_all_in_one 和 fhs_app/fhs_app_basics的做法 即可实现。
- 更简单的微服务调用传统微服务玩法是第一我定义一个fegin api接口,然后写一个controller ,在写一个service实现 需要三个步骤,fhs 集成了easy cloud,只需要在service层给对应的方法上加@CloudMethod 即可完成接口暴露,哪个微服务用到直接 Autowired service接口即可。
- 更好用的校验框架集成了validate-springboot-starter,在兼容hibernate Validator和javax validation的同时,支持了更多自定义玩法。 内置常用验证规则:比如手机号验证,正则验证,ip 邮箱,长度,范围,数字,小数,中国车牌号,身份证,长度, url 图书ISBN编号 文件后缀 文件大小 等常用验证规则


avue今年又获得了GVP,证明了越来越多的前端程序员开始接受JSON驱动来写VUE 页面,fhs 也将组件封装为JSON驱动的组件,比如简单的CRUD,就可以这么写:
<template>
    <pagex-crudForm :namespace="namespace" :title="title" :crudSett="crudSett" :formSett="formSett" :idFieldName="idFieldName" >
    </pagex-crudForm>
</template>
<script>
export default {
  name: "Dict" 
  data() {
    return {
      namespace:'dictGroup' 
      title:'字典分组' 
      idFieldName:'groupId' //主键
      crudSett:{ // 列表配置
        api: '/basic/ms/dictGroup/pagerAdvance'  //列表接口
        sortSett: [{//排序
          "direction": "DESC" 
          "property": "updateTime"
        }] 
        buttons: [//列表上的按钮
          {
            title: '新增' 
            name: 'add' 
            code: "add" 
            type: 'primary' 
            size: 'mini' 
            icon: 'el-icon-plus'  // 支持写click 自定义点击事件,新增组件会自带事件
          }
        ] 
        columns: [
          {label: '分组名称'  name: 'groupName'} //列 分组名称
          {//分组编码列,点击之后跳转到字典项列表
            label: '分组编码'  name: 'groupCode'  type: 'formart' 
            formart: "<label style='cursor:pointer'>${groupCode}</label>" //格式化显示效果
            click: function (_row) {
              this.$router.push({path: '/dict/type/data/' query:{groupCode: _row.groupCode}});
            }
          } 
          {
            label: '操作' //操作列
            name: 'operation' 
            type: 'textBtn' 
            textBtn: [
              {
                title: "编辑" 
                type: "bottom" 
                size: 'mini'
              } 
              {
                title: "详情" 
                type: "success" 
                size: 'mini'
              } 
              {
                title: "删除" 
                type: "danger" 
                size: 'mini' 
                api: '/basic/ms/dictGroup/'
              }
            ] 
          }
        ] 
        filters: [//过滤条件
          {label: '分组名称:'  name: 'groupName'  placeholder: "分组名称"  type: 'text'  operation: 'like'} //like 是后台过滤规则,模糊匹配 支持> < != between like 等等
          {label: '分组编码:'  name: 'groupCode'  placeholder: "分组编码"  type: 'text'  operation: 'like'}
        ] 
      } 
      formSett:{// 表单
        addApi: '/basic/ms/dictGroup/' //新增表单的url,默认的post 
        updateApi: '/basic/ms/dictGroup/' //修改表单的url 默认是post
        data:{
           //这里写默认值,比如groupName:'默认编码'
        } 
        controls:[//表单字段
          {
            type: 'text' 
            name: 'groupName' 
            label: '分组名称' 
            rule: 'required' 
            placeholder: '请输入分组名称'
          }  {
            type: 'text' 
            name: 'groupCode' 
            label: '分组编码' 
            rule: 'required' 
            placeholder: '请输入分组编码'
          }
        ]
      } 
    }
  } 
  methods: {
     //自定义方法
  }
};
</script>
-     Mybatis Plus查询增强
    
Mybatis的wrapper是我见过特别好的查询api设计,但是条件稍微多一点就写的很长,我们通过APT技术(类似lombok对po进行编译时增强),对PO进行增强,使用PO来替代原生Wrapper构造,和activeRecord配合起来简直不要太美。上demo:
//有po定义如下:
@Data
@Wrapperable //增强注解 类似lombok的@data 注解
@TableName("user")
public class User {
    @TableId("user_id")
    private Integer userId;
    @TableField("name")
    private String name;
    @TableField("age")
    private Integer age;
    @TableField("sex")
    private String sex;
}
 @GetMapping("/one")
    public User one() {
        return User.newOBJ().nameLike("小").one();
    }
    @GetMapping("/oneField")
    public User oneField() {
        //这里只查id和name2个字段
        return User.newOBJ().nameLike("小").one(new String[]{User.USERID  User.NAME});
    }
    @GetMapping("/list")
    public List<User> list() {
        return User.newOBJ().ageBetween(10  25).list();
    }
    @GetMapping("/listField")
    public List<User> listField() {
        return User.newOBJ().ageBetween(10  20).list(new String[]{User.USERID  User.NAME});
    }
    @GetMapping("/delete")
    public int delete() {
        return User.newOBJ().ageBetween(50  80).delete();
    }
    @GetMapping("/count")
    public Long count() {
        return  User.newOBJ().ageBetween(10 26).count();
    }
    
    @GetMapping("/update")
    public int update() {
        User user = User.newOBJ();
        user.setAge(19);
		//把小明的年龄改为19
        return user.nameEQ("小明").update();
    }class和提示已经支持自动生成的方法有:
    
bean2Wrapper list list(String[] fields) one one(String[] fileds) count delete update newOBJ
已经支持的wrapper相关操作方法有:eq neq ge gt le lt like notLike likeLeft likeRight in notIn between orderByAsc orderByDesc isNull notNull
千万注意:本功能和lombok一样需要搭配idea插件使用,不然class虽然增强了但是idea 无法识别这些方法报错,但是不影响运行,我们提供了配套的idea插件。
要求idea版本为 2021.2.2 以及 以上。 并且idea加入以下配置:setting-Build Execution Deployment-Compiler Shared build process VM 的value设置为 option -Djps.track.ap.dependencies=false

私信回复:低代码开发平台
或访问一飞开源:https://code.exmay.com/




