JDiy 入门指引

© 2020-2021 jdiy.club

JDiy后端低代码开发平台
在线演示:http://demo.jdiy.club/
登录帐号: jdiy  登录密码: jdiy888

1. 开始使用

  JDiy是一个java低代码开发平台,致力于解放后端程序员90%的重复劳动,让开发者更加专注于业务逻辑本身。

  用JDiy的目地是降低开发成本,提高生产力,高效产出交付。我们尽可能的减少您的学习门槛。相信您花个小半天甚至几十分钟,便可轻松上手使用。无需繁杂配置,只要会使用SpringBoot,下载我们的demo程序运行并登录开发者后台,鼠标拖拉拽,一个后端管理平台就这么轻易被您开发完成了~~

  JDiy项目100%开源,欢迎用于商业用途。源码被拆分成了两个子项:jdiy-corejdiy-admin,均被托管在gitee

  我们提供了一个快速上手的jdiy-demo,如果您不需要改造JDiy源代码本身,建议您直接下载这个jdiy-demo,在它的基础上做开发。

2. JDiyAdmin快速搭建

2.1. JDiy 5.0 环境要求

运行环境:

  • java环境:jdk/jre 1.8 +   推荐使用 jdk1.8或者jdk11(长期支持版本, Language Level 8)

  • 数据库: mysql 5.6+ 或者 mariadb 11.0+ 

  • 缓存:  memcached或者redis   (二选一)无特定版本要求。缓存不是必须的,但强列建议开启

开发工具:

  • IntelLiJ IDEA  推荐的java开发工具,主要是JDiy入门教程中,我们都是在IDEA下进行讲解的。

  • maven  包管理工具,无需多说。

面向人群:

  JDiy面向java程序员,要求对数据库的CRUD有一定了解(废话,哪个程序员不懂SQL)。
总之,要使用JDiy对您的技术要求并不高,但若您对java开发一窍不通,那建议您还是绕道去别家看看吧~~
用JDiy的目地是降低开发成本,提高生产力,高效产出交付。我们尽可能的减少您的学习门槛。相信您花个一两天甚至几个小时,便可轻松使用它。


2.2. 搭建开发环境(运行demo)

点击链接 https://gitee.com/jdiy/jdiy-demo  进入gitee代码仓库,下载或clone我们最新的demo代码至本地。


1.使用Intellij IDEA打开:
  使用IDEA直接打开jdiy-demo项目.首次打开后请调出IDEA右侧Maven面版, 并点击Maven面板的"刷新"按钮,让IDEA自动下载JDiy的相关pom依赖包.首次使用时,下载依赖包可能需要一定的时间,需要您耐心等待。

2.创建并还原数据库:
  demo项目根目录下的DB子目录内有一个jdiy-demo.sql,它是mysql数据库备份文件,请将其还原至mysql或MariaDB.

3.修改数据库连接及端口号:
  修改src/main/resource/目录中的 application-dev.ymlapplication-prod.yml配置文件中的mysql数据库连接信息(这两个配置文件都改,dev用于开发环境,prod用于生产环境。)

4.修改缓存配置
  JDiy需要缓存支持,目前允许使用memcached, redis, none三种,前两个为外部缓存,none表示内部缓存(即不使用外部缓存的意思);推荐使用memcached或者redis,三种配置参考如下(任选一):

#memcached方式:

jdiy:
   cache:
      type: memcached
      memcached:
          servers: 127.0.0.1:11211


#redis方式:

jdiy:
  cache:
     type: redis
     redis:
        servers: 127.0.0.1:6379
        password:   #若有密码则加此行,这儿填密码.没密码不要此行


#none方式(不推荐):

jdiy:
  cache:
     type: none


5.IDEA开发环境下启动运行:
  首先,调出IDEA右侧Maven面板,展开jdiy-demo > Lifecyce  双击里面的 compile 编译项目源码。然后,运行com.jdiy.business.MainApplication 即可启动项目.  
启动完成后,浏览器输入如下网址登录后台:
http://localhost:8886/mgmt/   
开发者帐号默认为: jdiy 密码: jdiy888

jdiy_login_page.png

特别提示:关于登录后台时,提示"会话过期,请刷新当前页面后再尝试登录!" 的问题解决方法: 
  这是由于您未正确配置缓存的原因(例如配置的memcached或者redis信息有误导致程序无法连接到缓存服务器),  请参见上面的第4点修改缓存配置。
  因JDiy改写了Session机制(支持分布式session),未正确配置缓存,从而session会话不可用。  缓存配置好后,刷新后台登录页,重新输入用户名/密码即可登录。

3. 开发流程概览

  我们暂且不去讨论架构与设计层面的东西,且抛开网上现有的其它快速开发框架的那一套代码生成之类的开发流程,以完全从零编码的角度去描述,常规的软件功能模块搭建过程:一般都是先创建数据表,建立对应的ORM数据库关系映射,诸如MyBatis的Mapping XML;JPA的Entity实体类,然后创建Repository/Dao层相关代码,编写Service业务处理类,编写Controller,API,还要写用户端view界面......

现在,我们以JDiy的方式开发,做同样的事情,流程大概是像下面这样子的:

3.1. 数据表/JPA实体 创建

对于数据表的创建,常规的做法是这三种方式:

  1. 开发者(或DBA)手工建表

    使用Navicat, MySQL Workbench等等随便什么数据库管理工具),根据业务需要手工创建数据表

  2. 使用一些快速开发框架,后台建表,然后代码生成

    这也是网上大多数快速开发框架常见的建表方式,弊端是后台建表功能可能很弱,无法达到开发者表制定预期,甚至有可能需要额外建立一些配置信息的表,来存放表的配置数据,还需要解决后期人工手动调整了表结构,导致系统配置的表结构与实际的表结构不一致时的表信息同步的问题,这反而变相的增加了开发者的工作量。

  3. 通过JPA/Entity实体自动生成数据表

    熟悉JPA的开发者,应该都了解这种方式,开发者只需要编写一个实体类,然后运行程序,程序会自动创建数据表。

  JDiy底层ORM基于JPA和jdiy-core实现,我们强列建议您使用第三种方法,通过实体类自动生成表,基本上是最省心最便捷的建表方式,当然,如果您不熟悉JPA,或者不想创建实体类也没有关系,那么您使用第一种方式,即传统的手工建表吧,表建立好后,JDiy开发平台能自动识别您的数据库表信息。

3.2. “在线开发”(鼠标拖拉拽)配置各类管理界面

以开发者身份登录,点击主界面顶部的在线开发并选择界面管理。在此页面中我们可以创建新的管理界面,开发者可以自由创建各类输入表单/列表管理/树形表/详情页等类型的用户UI界面。ui_list.png

您可以对目标界面进行在线设计,以鼠标拖拉拽的方式,快速配置界面内各种元素部件,以及业务表数据绑定、数据更新、动态查询、Ajax请求等行为操作。我们将在下面章节详细教大家配置各类型的用户界面。

3.3. 配置后台菜单绑定

当相应的管理界面创建好后,我们可以点击主界面顶部在线开发并选择菜单管理,进入系统菜单配置页面。

menu_list.png

  添加菜单,设置用户点击菜单时要打开的目标界面类型,然后选择目标界面(这些界面都是由您自己在线配置生成的噢~~)

menu_add.png

  菜单创建后,刷新整个后台界面,即可看到新添加的菜单;同时,菜单与用户角色权限有关,JDiy除可以在角色管理模块中设置菜单级别的权限控制,我们还可以针对界面内的管理按钮,设置细粒度的页面级权限,甚至结合界面增强器,还可以实现数据层面的权限控制。有关配置详情,请浏览本文档后续的权限管理章节。同时,我们还会在下面章节中,对菜单配置做更进一步的详细操作指引。

3.4. 使用各类界面增强器编程增强

  大多数基于MyBatis的传统开发平台都是固定模板的形式(动态生成Mapping.xml/Repository, Service,Controller一大堆文件,然后重新打包编译运行生效),且扩展调整需要开发者直接修改生成后的代码块,若需要再次使用该模块的在线开发功能,之前修改过后的代码,要么被覆盖,要么需要维护多个版本人工调整合并,且随着项目多次需求变更迭代,维护起来将越来越麻烦。
  而JDiy是基于JPA和jdiy-core的低代码平台,在线开发实时生效,不生成任何文件;扩展调整只需简单的创建增强器,并在相应的界面配置绑定,即可通过增强器干预界面内容显示或者操作行为。而且后期界面调整,不影响之前的增强业务逻辑。有关增强类的使用,我们将在下面章节详细说明。

3.5. 低代码功能之外的编程开发

  尽管JDiy在线开发出来的界面,已涵盖大多数通用的后台管理需求,但它不能解决所有的问题。
有些情况还是需要开发者自行编程处理。JDiy支持在线开发生成的界面与编程出的自定义页面混合调用。如:

  • 您可以将自定义页面地址绑定到系统菜单;

  • 您可以配置在线开发出的界面中某个按钮,点击打开(或者ajax执行)调用您自定义的页面地址;

  • 您还可以从您的自定义页面中,(如点某个按钮;或者某个局部DIV区域)动态加载由在线开发生成的管理界面。

 另外,后台管理可能只是您业务系统的一部分,除此之外还需要编程处理(如开发API接口等)。如何基于JDiy做快速编程,您可以了解一下jdiy-core的教程文章, 只要您会使用SpringBoot, 了解一些JPA的基础知识,您将很快掌握。

4. 配置表单界面

  一般情况下,信息的添加和修改可以共用同一个表单界面(也可以分开单独配置)。

  目前JDiy表单界面具有非常丰富的输入控件类型支持,如:单行文本框,多行文本框,密码框,日期时间输入框,单选按钮,复选按钮,开关按钮,下拉菜单,树型下拉菜单,查找带回,富文本编辑器,文件上传等;同时单行文本框又包含常用的如(整数,小数,电子邮箱,手机号,身份证号,网址等常用的验证格式输入)。

  输入界面数据保存提交支持常见的外部表级联更新,如:多对一外键,一对多反向外键;多对多中间表关联更新,以及文本框外键反查,树形节点表更新,Store(JDiy附件统一存储对象)等关联数据自动更新保存。

如前面的开发流程概览所述,后台管理需要先建立数据表,我们以如下建表语句手动创建数据表,来讲解表单控件的在线开发配置(本人习惯于将业务表以b_开头,也就是business的首字母 ):

create table b_products
(
   id int auto_increment comment '主键'
      primary key,
   name varchar(64) null comment '产品名称',
   sortIndex int default 100 null comment '排序索引(数字越小越靠前)',
   price decimal(16,2) null comment '零售价',
   content longtext null comment '产品介绍',
   buildTime date null comment '生产日期',
   createTime datetime null comment '添加时间',
   createUser_id int null comment '添加人ID'
)
comment '产品表';

创建表后,在JDiy在线开发-界面配置页面,点击页面左上方添加,如下图所示选择b_product表并创建表单界面。

form_add.png

点击弹窗下的保存,程序会弹出提示保存成功,并询问您是否打开设计,选择[是]

form_add_ok.png

若选择了取消,也可以再次从界面列表页双击进入表单的设计界面。
新建的表单,JDiy会自动将当前表的字段以文本框的形式列出,您可以在此基础上进行调整,以便快速更改为符合您要求的表单界面。

4.1. 表单控件配置

form_design.png

  打开表单设计界面,如上图所示。左边为表单设计区,鼠标单击可选中目标输入控件,选中的控件会出现红色虚框,并在下方出现添加add.png和删除del.png按钮,点击添加按钮,可在目标控件的后方添加一个新的输入控件;点击删除按钮,可将目标控件删除(提示:若操作失误,可点击设计界面上方的重置按钮,将表单界面配置还原)。鼠标再次按下选中的控件,并拖拽,可以调整控件的位置。

  设计界面右侧边栏为开发配置区域,分为三个tab:属性|全局配置|和其它.

  • 属性: 用于配置目标控件的相关属性,当输入控件被选中,右侧边栏会自动定位到属性tab标签;

  • 全局设置: 用于配置与当前整个表单界面相关的全局属性,如主键生成策略;表单隐藏更新以及表单增强器等,我们会在后面章节详细说明;

  • 其它: 表单的其它配置.

提示:您可以点击右侧配置选项后面的问号(?)图标,查看该配置项的简版帮助提示,有助于您快速完成配置。

4.1.1. 表单控件布局

  新创建的表单界面,系统默认使用栅格化(一行两列)布局,控件的宽度会随外部容器自动按相同比例弹性伸缩填满整行,非常适用于弹出窗口形式的表单界面使用.当然您也可以修改目标控件的布局样式,以达到您满意的效果,如将控件都设置成"栅格化(占1/3行)",就可以一行放置三个输入控件了,如图所示:

form_layout.png

特别注意:一般情况下,我们建议您1行最多放2个控件(即栅格化1/2行,或者整行显示), 因为大多数情况下,表单界面的调用,是由列表界面中某(添加/修改)按钮点击,并以弹窗方式打开显示的,弹窗界面宽度不宜设置太大,能更好适应不同用户电脑屏幕分辩率,此时若一行上面放置太多控件,会导致控件长度比例变小影响用户输入。另外,部分极少数输入控件,不支持与其它控件同行(只能独行显示),例如ueditor富文本编辑器等,这类控件本身需要占用较大空间,因此JDiy不对这些控件提供栅格化配置属性选项。

4.1.2. 文本/密码框/数字/时间等基础输入控件

  选中某个控件,右侧属性栏中的控件类型input 单行文本框;然后选择其下方的输入类型。可以设置目标控件的内容格式类型。我们把以下类型的输入,都归纳为单行文本,实际上这些输入控件在html代码中本身就是一个<input ..>控件。只不过我们对它进行了相关的数据格式有效性验证。

提示:有效性验证仅针对非空输入,未输入内容的控件不执行格式验证。如果要限制非空输入,请将控件的是否必填开关打开。

  • 普通文本框 普通的文本输入,这个没有什么好说明的

  • 密码框 可以设置加密方式(明码; md5, md5加盐),产生业务数据后,请不要随意更改加密方式。

  • 密码确认 系统会根据绑定的字段名,匹配表单中的其它同名密码框控件验证两次密码输入的正确性。

  • 整数 程序将在表单提交时,自动验证输入是否为整数

  • 整数或小数 程序将在表单提交时,自动验证输入是否为整数或小数

  • 日期和时间 用户点击此输入框时会自动弹出日期时间选择,数据格式为yyyy-MM-dd HH:mm:ss

  • 日期 用户点击此输入框时会自动弹出日期选择,数据格式为yyyy-MM-dd

  • 时间 用户点击此输入框时会自动弹出时间选择,数据格式为HH:mm:ss

  • 手机号 程序将在表单提交时,自动验证输入是否为手机号码格式

  • 邮件地址 程序将在表单提交时,自动验证输入是否为邮件地址格式

  • 网址 程序将在表单提交时,自动验证输入是否为网址格式

  • 身份证号 程序将在表单提交时,自动验证输入是否为一个身份证号码(会使用身份证号码校验规则)

  • 外键反查 这是一个特殊的输入控件,与下拉菜单或者查找带回控件有一定的相似之处。例如当前表单为工单输入,在录入工单信息的时候,要为此工单分配一个业务员(当前数据表中一个外键字段记录业务员的ID),我们可以用下拉菜单来选择业务员,也可以直接定义一个外键反查的输入框,让用户输入业务员姓名,由系统自动根据姓名去业务员表中匹配业务员ID, 并将目标业务员ID存入当前表的外键字段。此种配置方式,当前控件绑定的字段为业务员ID外键字段名,配置外键表为业务员表,查询字段为业务员姓名字段。
      form_outfk.png

特别注意:
  请尽可能的配置目标控件与所绑定的字段类型一致。不一致的数据类型保存可能会导致程序SQL异常。例如控件绑定的目标字段是一个datetime(日期时间)类型的,而您用一个普通文本框让用户随便输入,这样在表单提交时就会导致用户输入的内容不是一个有效的datetime格式而报错。

4.1.3. 开关控件

开关控件适用于逻辑值(true|false)或者bit(1|0)等等只表示开/关,是/否,启用/停用等两种状态的字段。

选中目标控件,将控件类型设置为swithch开关

form-switch.png

开关文字:设置要显示给用户看到的文字,用竖线分隔,分别表示开和关两个状态下,控件上显示的文字内容。
 开关值:设置表单提交时存入绑定字段的数据值,同样,开和关的值用竖线分隔,见上图。通常mysql的bit(1)类型,用1|0表示。

4.1.4. 下拉菜单/单选框/复选框

下拉菜单,单选框,复选框三种控件,都是提供一些可选的条目供用户选择。各控件的使用场景建议如下:

单选框:适用于少量静态选择项(2~3个),例如性别选择(男|女);又如审核状态(待审核|通过|不通过)。因为过多的条目可能会导致显示区域被撑大影响布局体验)。

复选框:适用需要多选,但条目又不是太多的情况。通常情况下,在数据库设计层面,当前表单绑定的主表与选项条目数据的来源表是一种一对多或多对多的映射关联关系。

下拉菜单:一般情况下均适用,但当条目项非常之多时,建议改用查找带回控件

4.1.4.1. 控件选择条目项配置

  在选项条目配置方面,三种类型的控件的配置方式基本差不多,我们以下拉菜单配置为例。选项的条目数据,支持配置为静态条目,和动态条目。

配置静态条目:静态条目一般用于状态选择(例如:审核状态:未审|审核通过|不通过),是由您定义的固定的静态条目选项。  
 在静态条目属性框中配置条目列表,一行一个,书写格式为:条目值:条目名称 其中值可以为空字符串(例如下拉菜单第一项为“=请选择=”,它本身就是一个选择条目,只不过其值为空字符串) 如下图所示:

form_select1.png

对于下拉菜单,“选择方式”属性开关打开(即“带搜索下拉”),则下拉菜单点击后,弹出下拉选项的同时,允许用户直接输入关键字搜索,以快速定位目标选择项,适用于选项条目较多的情况下使用。

动态条目:动态条目可以来自数据字典;数据表或JPA实体;或者直接来自于自定义的SQL/JPQL查询语句。    同时它可以与静态条目混合配置,如下图:

form_select2.png


4.1.4.2. 复选框的“关联更新”配置

复选框的配置,需要注意的地方,主要是“关联更新”配置。我们假定一个业务场景来说明:

  假设现在后台要对班级(banji)和班主任老师(teacher)进行管理,一个班级只能有一个班主任老师,而一个老师可以同时成为多个班的班主任。很显然,这是一个最基本的一对多/多对一的关联关系。数据库的表设计,我们通常是在班级(banji)表中创建一个(如teacher_id)外键字段,记录班主任老师的id。这两个表的主要字段DDL建表就像下面这样子:

create table b_teacher
(
    id   int auto_increment comment '老师ID' primary key,
    name varchar(50) null comment '老师名称'
    -- 其它字段略
) comment '老师表(演示一对多)';

create table b_banji
(
    id         int auto_increment comment '班级ID' primary key,
    name       varchar(50) null comment '班级名称',
    teacher_id int         null comment '班主任ID',
    -- 其它字段略
    constraint b_banji_b_teacher_id_fk
        foreign key (teacher_id) references b_teacher (id)
) comment '班级表(演示多对一关系)';

后台管理时,我们可以在添加/修改班级的表单上创建一个下拉菜单(或者单选框)来让用户选择班主任。
  现在我们还可以有另一种管理方式,那就是在添加/修改老师的表单里面,创建复选框,列出所有的班级,让用户打钩选择当前老师在哪些班当班主任。
  好了,这时我们需要设置复选框的更新方式为“一对多外键反向更新”,也就是说,在teacher表单提交时,用户打钩选班级,JDiy实际上是在修改banji这个表的teacher_id外键字段值:当班级被钩选,则更新该班级的teacher_id值为当前老师的id, 当班级被取消钩选,则设置目标班级的teacher_id值为null, 当班级原本就没有打钩(现在仍处于未钩选状态),则本次更新不修改该班级的teacher_id字段,因为这种情况,可能是该班级的班主任是其它老师)。

提示:在一对多外键反向更新模式下,复选框控件无需配置绑定字段。

多对多中间表更新:

  现在,再来变化一下需求,我们不需要管班主任了,只想记录每个班级有哪些老师在带课,同时也想知道每个老师会带哪些班。也就是说,新的需求变成了一个班可以有多个老师带课,而一个老师也可以给多个班级带课(这是一个典型的多对多关联关系)。

  我们在上面的表设计上做一下调整,从banji表中去掉teacher_id字段,并额外创建第三张表(来维护多对多的映射关系),三张表的DDL建表看起来像是这样子的:

create table b_teacher
(
    id   int auto_increment comment '老师ID' primary key,
    name varchar(50) null comment '老师名称'
    -- 其它字段略
) comment '老师表(演示多对多)';

create table b_banji
(
    id         int auto_increment comment '班级ID' primary key,
    name       varchar(50) null comment '班级名称'
    -- 其它字段略
) comment '班级表(演示多对多)';

create table ref_teacher_banji
(
       teacher_id int not null,
       banji_id int not null,
       constraint banji___fk foreign key (banji_id) references b_banji (id),
       constraint teacher_fk foreign key (teacher_id) references b_teacher (id)
) comment '老师与班级的多对多中间关系表';

提示:本人习惯将这种多对多的中间关系表以ref_开头,后面跟两个表的业务名称.

如上,当我们已知某个老师(id=1),要查询他带哪些班时,一个内联的SQL语句就像这样:

select b.* form b_banji b, ref_teacher_banji rf where rf.banji_id=b.id and rf.teacher_id=1

SQL查询我们不再做过多解释,这种设计模式,我们可以像下图所示这样配置复选框的多对多关系表更新:

form-chkbox-manyToMany.png

本表字段直存
 这种就比较好理解了,但比较少用,因为从数据库设计层面讲,它并不优雅.此种更新方式,不关联外部表,直接将用户钩选的那些复选框选项条目值,以单引号加逗号分隔(如:'id1','id2','id3'),存入当前复选框所绑定的字段.配置参考下图:

form-chkbox-none.png

4.1.5. 树型下拉菜单

树型下拉菜单需要您先创建并配置树形界面,然后才能在右侧属性栏的数据来源中选择目标树型。

form-selectTree0.png

我们以所在地区为例(它是一个省/市/地区的三级树状结构)。树形下拉菜单的配置参考下图:

form-treeSelect1.png

显示样式:用于定义选中节点后,控件呈现的节点层级文字;

叶子限制: 当开启(只能选择叶子节点)时,用户只能选择没有子级的最末层节点;否则用户可以选择任意层级。

配置好后最终的表单中控件点开显示效果如下:

form-treeSelect11.png


4.1.6. 查找带回控件

查找带回控件,在页面上显示为一个带选择按钮的框,点击按钮后弹出一个新的列表界面,让用户选择一个或多个目标项,然后将选中项带回到当前表单界面,表单提交时将带回的条目id值存入当前控件绑定字段。

它是下拉菜单/单选框/多选框之类的控件的一个替代,适用于当选择条目项非常多的时候使用。
它在表单中的显示效果:

form-lookup0.png

查找带回控件的属性配置参考如下图:

form-lookup-2.png

(见上图右侧属性栏)其中的查找界面里面会列出已有的分页列表界面,若无,需要您预先配置列表管理界面,同一个列表管理界面既可以用于数据的列表管理,又可以用于表单的查找带回。也就是说系统会自动判断该列表界面是用于数据管理,还是查找带回(若是后者,系统会去除列表界面中多余的数据管理按钮,以便它用适于查找带回选择),当然,您也可以单独配置专门用于查找带回使用的列表界面。

查找带回的多选模式:

当配置为可多选时,需要您配置多选的关联更新方式,它与复选框的“关联更新”配置是一样的,此处不再赘述。

form-lookup-muti.png

4.1.7. 文件上传控件

  常规的表单文件/图片等附件的上传相对来说比较麻烦,特别是在多图/多文件的处理上。以及有些时候,上传文件的保存,除直接保存到服务器的文件系统上外,也可能是存于其它位置,如七牛(Kodo), 阿里(OSS)对象存储等,JDiy简化了这类附件上传保存与读取处理。我们抽象了一个统一的Store类,目前它支持将附件存储于以上三种方式之一,而无论附件存于何地,对开发者读写访问都是统一(无差别)的调用方式。您只需要修改application.yml文件,预先配置附件的存储方式即可。

  文件上传在JDiy系统中都被定义为“文件字段”,文件字段无需在当前数据表中分配实际的字段来存储它。一个文件字段,支持单文件上传和多文件上传两种方式。

  • 单文件上传:如产品列表页缩略图,一个产品一个图片

  • 多文件上传:如产品内页的多角度图片展示,它可以是一些图片的集合,这些图片共存于同一个文件字段。

4.1.7.1. JDiy Store统一附件存储

  在使用附件上传功能前,我们先要在application.yml(或者application-dev.yml和application-prod.yml)中配置附件的存储方式,建议您在一开始就配置好它,以避免后期修改,会影响之前已上传好的附件文件的读写。以下三种方式可以任选其一:

方式一:配置文件存储于服务器本地

jdiy:
  store:
    type: file #使用服务器端本地文件存储

 

方式二:配置文件存储于七牛(Kodo):
注:此配置方式,需要您先申请好七牛云存储(目前是10G以下免费,超出计算流量费)

jdiy:
  store:
    type: kodo  #使用七牛存储
    kodo:
      domain: http://static.xxx.com/   #修改为您在七牛里面绑定的资源访问域名 
      access-key: vSqLRnrhTZdsvvp2QDrxzQd8E #修改为七牛的accessKey
      secret-key: KKEca7UTsMIFusKGgY7FWoIaOa #修改为七牛的secretKey
      bucket: jdiy #修改为您在七牛里面创建的bucket
      region: huanan #修改为您在七牛里面申请的存储区域

 

方式三:配置文件存储于阿里(OSS):
注:此配置方式,需要您先申请好阿里OSS云存储帐号

jdiy:
  store:
    type: oss  #使用阿里OSS
    oss:
      access-key: LTAI4FzSLtAzRGExhZNjd67A #修改为您申请的阿里的accessKey
      secret-key: KnfvYRSBREfkTr9s2ea323aRabK #修改为您申请的阿里的secretKey
      domain: http://static.xxx.com #修改为您在阿里OSS里面配置的访问域名
      bucket: jdiy  #修改为您在阿里OSS里面创建的bucket
      endpoint: http://oss-cn-shanghai.aliyuncs.com #阿里OSS的endpoint


在JDiy的相关Controller/Service/Dao层,均可以通过context.getStore(String,String)方法,取得对应表数据记录的Store对象,如(获取b_goods表,id=3这条记录的store对象)然后进行相应编程处理:

Store store  = context.getStore("b_goods","3");
String listPicUrl = store.get("listPic").getUrl();//获取文件字段listPic的访问地址.
String[] pics = store.get("pics").getUrls();//获取多图(pics文字字段)
store.set("listPic", new File("/xxx/xxx/xxx.jpg");//设置文件字段

有关更多Store的用法,请参见我们jdiy-core相关教程(由于此文主要讲解jdiyAdmin低代码平台后台上传控件的使用,此处不再过多说明) 。

4.1.7.2. 配置上传控件

配置图片上传控件,用户只能上传图片格式的文件(如jpg,png, gif等);且可以配置对图片进行自动缩放处理。如下图:

form-file.png

上面我们说过,附件上传若使JDiy的Store对象,您不必在数据表中创建字段存储它,所以此处“绑定字段”我们选择“其它自定义”,然后自己随便取一个字段名“listPic”即可(自定义字段名可以由a-z,0-9以及下划线等字符组成,不要用中文和特殊符号)。

若文件类型选为图片文件,还可以设置缩放操作,根据业务需要进行设置。


4.1.7.3. 附件字段的持久化配置

  如上所述,我们建议开发者直接使用JDiy的Store统一附件存储,它不需要在数据表中建立专门的字段来存储上传的附件路径。

  这里还有一个小技巧,我们仍然可以通过常规的方式,比如在当前数据表中建立一个类型为text的字段(如picUrl),然后将当前上控件绑定到这个picUrl字段,并设置持久化类型为JDiyStore存储(如下图):

form-file-persist.png

  这样配置的话,JDiy将在表单提交保存的时候,使用Store存储的同时,将已上传的附件访问路径,自动写入到picUrl字段中去(若控件上传模式配置的是多文件上传,则多个文件上传后的路径以“|”分隔一并存入到picUrl),这样做的好处是,我们既可以使用JDiy的Store对象去读取已上传的附件信息,也可以用我们常规的从当前数据表的picUrl字段来读取上传的附件信息。

  另外还有一种直接使用常规的存库的方式(即不使用JDiy Store),我们将持久化开关设置为“仅存url到绑定字段”(如下图)这种配置方式,表单提交后,JDiy直接将已上传的附件url访问路径存入到绑定的字段(所以此配置方式要求绑定字段必须是表中存在的字段)。

form-file-persist1.png


4.1.8. 配置富文本编辑器

富文本编辑器用于文章类的正文内容编辑,我们使用常用的百度UEditor作为富文本编辑器,如下图所示,右侧属性栏“控件类型”选择“ueditor 富文本编辑器” 。

form_ueditor.png

富文本编辑器占用位置较大,它在表单界面中需独行显示(它没有布局样式更改选项)。

4.2. 表单界面全局设置

在表单设计界面,点击右侧边栏顶部的“全局设置”选项卡进入,如下图:

form-base.png

4.2.1. 主键生成策略

  主键生成策略只针对添加表单,用于指定数据添加时,主键id的生成方式,大多数情况下,我们都是使用的自增主键,但您仍可以适当配置它,比如相应的业务单据,以自己的业务规则生成特定的单号作为数据的主键。若您配置的表单界面仅用于数据修改,则可以随意选择一项配置(修改表单,此项配置无意义)。系统目前支持的主键生成策略有如下几种:

  • 数据库自增主键 使用情况最多的一种主键生成方式,一般在数据库中定义id字段为int 或bigint的auto_increment自动递增,它能保证单表唯一。

  • JDiy10位字符串定长 由JDiy生成,保证整库唯一且长度固定为10个字符(由字母和数字组成),可定义id字段为 char(10)类型。

  • 不重复毫秒值 将当前毫秒值作为主键,我们将毫秒值的获取放在同步延时方法中,并保证同一台服务器上每次获取的值都不会重复,主键字段建议定义为bigint或者varchar(20)。

  • YYYYmmddHHmmss+3位数字 即取当前的年月日时分秒后面加3位随机数字。

  • YYYYmmdd+顺序号 取当前年月日后面跟顺序号,可配置顺序号的长度(0-6),0表示不限长度,从1开始编号(顺序号长度不固定),若设置长度为3,则每日可产生999个号(001-999),根据业务场景需要设置。

  • 自定义前缀+顺序号 可自定义前缀加上顺序号,前缀支持EL/FTL表达式。

  • 32位UUID 直接生成32位UUID作为主键值。

当然,若还有更复杂的主键生成方式,您也可以直接在表单界面增强器中自行处理。


4.2.2. 隐藏更新与字段默认值

隐藏更新与字段默认值,用于处理那些不需要在页面上让用户输入,却又需要在表单提交时做初始值写入,或者更新的字段。隐藏更新字段不会出现在表单前台html代码中,它由JDiy在服务端直接更新。

填写格式:
name:value 或者: @name:value
name为字段名,value为字段值
当name前面加一个@符号时,表示强制更新,即无论是添加还是修改数据都更新字段的值;否则,仅在数据添加(insert)时更新。

其中value值内容支持FTL表达式,常用的表达式变量如下:

  1. user 表示当前登录用户.如获取当前用户id:  ${user.id}  又如取登录帐号: ${user.uid}

  2. qo 表示当前表单界面打开时的URL地址入参.如: ${qo.foobar} 就类似于java中的 request.getParameter("foobar")

  3. date 表示当前日期(返回yyyy-MM-dd格式的字符串):  如: ${date}

  4. datetime 表示当前日期时间(返回yyyy-MM-dd HH:mm:ss格式的字符串):  如: ${datetime}

  5. ctx 表示当前应用程序上下文根路径.

配置示例:

createTime:${datetime}
@updateTime:${datetime}
createUser_id:${user.id}
state:0
shop_id:${qo.shopId}

form-hidden.png

此配置示例,将在表单提交(添加和修改)时都更新updateTime为当前时间; 在信息添加时设置createTime为当前时间,设置createUser_id字段的值为当前登录用户的id,设置状态字段state=0, 设置shop_id字段为当前表单界面的URL入参shopId值。

4.2.3. 表单增强器(编程支持)

  表单增强器作为在线开发的功能补充,用于处理低代码配置无法满足业务需要时的功能扩展。让开发者以编程的方式对表单界面进行拦截干预处理。如在数据保存的同时,做一些其它的业务逻辑操作。 有关表单增强器的使用,请见本文档后续章节:使用JDiy各类界面增强器

5. 配置列表管理界面

  数据的管理列表,信息统计,日志记录查询等等均可通过列表界面呈现给后台用户,且列表界面可以配置字段的动态查询条件搜索,配置相关的操作按钮如:添加,修改,删除,批量操作,执行ajax请求,状态变更,链接到其它界面等。

  通常情况下,我们将列表界面创建好后,将其绑定到系统菜单即可。同时列表界面还可以用于表单界面的查找带回(弹窗列表选择)、详情页的子表关联数据列表展示,以及自定义的页面局部DIV内嵌等多种场合。

  开发者从“在线开发”-“界面配置”页面顶部的“新建界面”按钮点开,界面类型选择“分页列表 list”并选择此界面关联的主表名,输入界面名称,点保存按钮,来创建列表管理界面(见下图)。

list-add.png

界面创建好后,JDiy会提示您是否打开界面设计,点击确定打开设计界面。
(备注:新创建的界面,我们会自动获取数据表的前几个字段放到列表显示区.并随意创建两个搜索框控件,需要您在设计界面进行调整配置,让界面满足实际业务需要)

list-init.png(上图)调整前,(下图)调整后:

list-design.png

我们先看一下最终的列表界面效果:

list-demo.png

5.1. 列表全局搜索条件与分页配置

在列表界面设计中,点击右侧栏顶上的“全局设置”TAB进入此配置。

list-prop0.png

相关配置说明如下:

  • 分页大小 设置列表界面每页显示的记录条数,默认为15条,根据实际需要设置。

  • 默认排序 设置列表界面的默认排序方式,o表示当前的表别名(建议都加上,避免动态查询时,联表查询字段名冲突),如上图配置默认按sortIndex升序,再按id降序。

  • 全局SQL条件过滤 针对当前列表界面,全局的过滤查询条件,用o表示当前主表(或实体)
       例如: o.user_id='${user.id}' and o.removed=0
    查询条件支持内嵌EL或FTL表达式(见如下内置变量或示例)
       user 表示当前登录用户.如获取当前用户id: ${user.id} 又如取登录帐号: ${user.username}
       qo 表示界面请求入参.如: ${qo.foobar} 就类似于java中的 request.getParameter("foobar")  qo通常适用于其它界面引用当前界面时(如按钮点击打开,详情页的子表tab,自定义页局部DIV加载等情况,由其它界面调用此界面时,附加URL请求参数传递,再在当前界面通过qo接收参数值,并附加关联的查询条件时使用。)
       date 表示当前日期(返回yyyy-MM-dd格式的字符串): 如: ${date}
       datetime 表示当前日期时间(返回yyyy-MM-dd HH:mm:ss格式的字符串): 如: ${datetime}
       其它任意freemarker内置表达式甚至标签语句
        例如: o.foobar<='${.now?string('yyyy-MM')}'
        又如: 1=1<#if qo.pid??> and o.pid='${qo.pid}'</#if>

  • 行管理 配置是否显示列表数据行最右边的管理列。若不需要对列表数据进行管理(如日志记录列表),可将其关闭。

  • 管理栏宽 配置数据行最右边管理栏的显示宽度,根据里面的按钮多少,对宽度进行微调。

  • 行号 配置数据列表最左侧是否显示行号

  • 数据导出 是否开启数据导出按钮,若启用,将在顶部搜索区“检索”按钮的右边,多出一个导出按钮,用户点击该按钮,可将当前列表数据导出(提示:若要自定义导出哪些字段,可为当前界面配置列表增强器(ListHandler),在增强器中通过MetaSet[] customExport()方法设置导出头部元数据即可,详情请见列表界面增强器章节)

  • 列表增强  列表增强器作为在线开发的功能补充,用于处理低代码配置无法满足业务需要时的功能扩展。让开发者以编程的方式对列表界面进行拦截干预处理。如附加查询条件,数据列字段显示自定义数据,自定义导出格式,自定义ajax执行等一些其它的业务逻辑操作。 有关列表增强器的使用,请见本文档后续章节:列表界面增强器


5.2. 表格列字段显示配置

在列表设计界面,单击表格列使其出现红色虚框,表示目标列被选中(如下图选中了“品名”),再次按下该列并拖拽该列,可以调整其前后位置;同时选中的列下面会出现添加add.png和删除del.png按钮,点击添加按钮,可在该列前面创建一个新的列,然后可配置新列要显示的字段内容;点击删除,可以将选中列删除。(提示:若操作失误,可点击设计界面上方的重置按钮,将表单界面配置还原)。

list-field0.png

选中目标列后,右侧边栏会自动定位到选中元素的“属性”TAB,开发者可配置选中项的相关属性。

5.2.1. 常规显示

  配置列的常规显示,就是将该列字段直接显示出来(如下图,显示方式选直接显示),适用于普通文本直接显示;同时还可以显示为日期时间;保留两位小数等用格式(此处不再赘述)

list-base.png

  若表格列数较多,在实际显示的时候,可能部分列显示不全,若我们需要微调目标列的列宽,让其宽度显示分配更加合理,可以指定目标列的“列宽”,建议您只对一部分列的宽度进行设置(如状态列,时间列),而让另外一些列由系统自动分配宽度(特别是那些内容长度未知的,比如文章标题),反而能达到更好的显示效果。

  对齐方式默认为居中显示,适用于大多数情况;我们可以配置列的内容在单元格中的对齐方式,例如文章管理列表界面,文章标题可以考虑居左,又如价格金额,可以考虑居右,根据业务情况适当调整。

  若允许用户点击目标列的标题行,按该列排序,可以将可排序开关打开,打开后列的标题文字右边会出现上下箭头(如下图),点击列标题,可以对该列进行升序/降序/取消列排序 三种方式切换。注意目标列绑定的字段名必须是数据库中存在的字段,且有排序意义(如:审核状态,发布时间,姓名等)才建议开启它;比如目标列是一个图片附件显示,没有排序意义,不建议开启。list-sortable.png

5.2.2. K/V键值转键名映射显示

  此配置方式,将列字段的值以“K/V键值对”的方式进行转换后显示,如商品管理中,我们用一个saleFlag字段记录商品的上架状态,saleFlag字段被定义为tinyint(1)类型, 我们用0表示未上架,用1表示已上架,用2表示已下架,此时数据表中saleFlag字段存储的是0,1,2这样的数字值,但在列表管理中我们要将数字值转换为文字显示,此时我们就需要将数值转换成对应的文字了。

list-kv.png

其中”键值:键名列表“属性配置框,我们将要转换的条目配置进去,一行一个条目,格式为:  键值:键名[:颜色]
其中颜色为可选配置项(不指定颜色则默认为黑色);
颜色可以使用颜色名称,也可以使用颜色值,如:  1:已上架:red1:已上架:#ff0000是等效的。

5.2.3. 数据字典转换显示

数据字典转换显示与K/V类似,只不过我们把条目项放到了字典中,这样可以让后台管理员动态添加字典条目。有关数据字典的配置,请参见系统字典与用户字典

list-dict.png

提示:若字典中无匹配条目项,将以该字段的原值直接显示。

5.2.4. 外联表引用字段显示

(多对一)外联字段显示: 
这是最常用的一种外联表显示方式。示例业务场景:

我们有一个产品表(sc_goods), 里面存放产品基本信息;还有一个产品分类表(sc_goods_type)存储产品类别;每一种产品都归属到某一个类别下,在数据库设计中,我们是在sc_goods这个产品表中定义一个goodsType_id的外键,记录此产品所属分类ID。

现在我们要做一个产品列表管理界面,里面要显示该产品的所属分类名称,此时我们需要将sc_goods表的goodsType_id值,转换为类别名称显示。

list-manyToOne.png


)外联字段显示

还是以上面的场景为例,数据表的结构保持不变,我们反过来,假设现在要做一个产品分类管理的列表界面,在列出分类的同时,还想直接显示此分类下相关的产品,此时我们就可以使用一对多的显示方式。多个产品名称之间,以分号隔开。


(多对多)外联字段显示:

我们还是以“表单界面”-“复选框关联更新”里的例子进行说明。假设现在有一个老师表,一个班级表。一个老师可以带多个班级,一个班级也会有多个老师来任教,那么这种多对多的关系,我们引入第三张表,专门来记录他们的关系,表结构主要字段就像下面这个样子:

create table b_teacher
(
    id   int auto_increment comment '老师ID' primary key,
    name varchar(50) null comment '老师名称'
    -- 其它字段略
) comment '老师表(演示多对多)';

create table b_banji
(
    id         int auto_increment comment '班级ID' primary key,
    name       varchar(50) null comment '班级名称'
    -- 其它字段略
) comment '班级表(演示多对多)';

create table ref_teacher_banji
(
       teacher_id int not null,
       banji_id int not null,
       constraint banji___fk foreign key (banji_id) references b_banji (id),
       constraint teacher_fk foreign key (teacher_id) references b_teacher (id)
) comment '老师与班级的多对多中间关系表';

现在我们要做一个老师管理的列表界面,列表里除了显示常规的老师名称等字段外,还要显示此老师带课的班级(多个班级逗号分隔),那么这个列配置如下:

list-manyToMany.png

5.2.5. 树型节点路径层级显示

此教程内容正在完善中......

5.2.6. 附件与图片字段显示

显示为缩图:

例如我们要做一个产品管理的列表界面,需要在列表中显示产品的图片,此时我们需要配置“附件(缩略图显示)

list-pic.png

需要注意的是,若我们在表单界面配置的是Store附件存储(您可以参考表单界面的文件上传控件中的JDiy Store统一附件存储说明,以及表单界面配置中的配置上传控件),此时绑定字段需与表单配置中填写的文件字段名一致。


显示为附件链接:

我们将显示方式配置为附件(文件名链接),则列表中显示已上传的文件附件链接,如下图:

list-filelnk.png

5.2.7. 自定义模板显示

此教程内容正在完善中......

5.3. 数字列启用底部汇总

此教程内容正在完善中......

5.4. 列表管理按钮配置

此教程内容正在完善中......

5.4.1. 数据行管理按钮配置

此教程内容正在完善中......

5.4.2. 表格头部按钮配置

此教程内容正在完善中......

5.4.3. 按钮权限控制与显示条件

此教程内容正在完善中......

5.4.4. 数据行双击事件绑定

此教程内容正在完善中......

5.5. 动态搜索与条件查询输入控件配置

此教程内容正在完善中......

5.5.1. 单字段匹配搜索

此教程内容正在完善中......

5.5.2. 范围搜索

此教程内容正在完善中......

5.5.3. 配置搜索区下拉菜单

此教程内容正在完善中......

5.5.4. 外键关联搜索

此教程内容正在完善中......

5.6. 列表查询结果导出配置

此教程内容正在完善中......

6. 配置树形界面

此教程内容正在完善中......

6.1. 树形表基础属性说明及字段绑定

此教程内容正在完善中......

6.2. 树形显示字段配置

此教程内容正在完善中......

6.3. 节点管理按钮配置

此教程内容正在完善中......

7. 配置详情界面

此教程内容正在完善中......

7.1. 常规单表详情界面配置

此教程内容正在完善中......

7.2. 详情页操作按钮配置

此教程内容正在完善中......

7.3. 详情页子表Tab关联数据配置

此教程内容正在完善中......

8. 管理菜单配置

此教程内容正在完善中......

8.1. 系统界面绑定

此教程内容正在完善中......

8.2. 权限与系统角色

此教程内容正在完善中......

9. 系统字典与用户字典

此教程内容正在完善中......

10. 定时任务与调度

此教程内容正在完善中......

11. 使用JDiy各类界面增强器

此教程内容正在完善中......

11.1. 表单界面增强器

此教程内容正在完善中......

11.2. 列表界面增强器

此教程内容正在完善中......

11.3. 树型界面增强器

此教程内容正在完善中......

11.4. 详情界面增强器

此教程内容正在完善中......

12. JDiyCore极速编程开发

此教程内容正在完善中......

JDiy首页