jhipster使用

只读字段

1、在field增加readonly注解

一般配合expression注解,或者自动生成的数据使用

@translate(zh-cn="回款")
@cascade
@paginate(infinite-scroll)
entity Collection {
    ...
    @translate(zh-cn="小组可分配额")
    @readonly
    teamAllocation Long
}

2、显示效果

加密字段

1、配置feature支持

在jdl得application的features增加crypto

application {
  config {
    applicationType monolith
    title "瀚海工作平台"
    footer ""
    baseName LimsMonolith
   ......
    features [crypto]
  }
  entities *
}

2、配置字段加密

再在entity的field字段上添加注解crypto,目前加密类型有sm2,sm3,sm4。

若1.feature没有配置,则此配置不生效。

/**
 * 客户
 */
@paginate(pagination)
@ChangelogDate(20220808080808)
entity Customer {
    name String
    @crypto("sm4")
    phone String
}

3、列表界面显示效果

4、编辑界面显示效果

此处可以更改

分页方式

在Entity上使用paginate注解,支持分页和无限滚动注释,

@paginate(pagination)

@paginate(infinite-scroll)

/**
 * 分期付款方式
 */
@paginate(infinite-scroll)
@translate(zh-cn="付款分期项")
entity PaymentItem {
  ...
}

输入数据联动

在Field上使用expression注解

entity PurchaseOrder {
  ...
  @expression("model.amountPrice" = "'model.purchaseItems.reduce((sum, current) => sum + (current.amountPrice) ? current.amountPrice : 0, 0)'")
  amountPrice Float
  ...
}

定制列表界面

  1. 支持过滤区定制,
  2. 支持关联子表字段过滤
  3. 支持表格字段定制
  4. 支持关联子表字段表格字段定制
  5. 支持多语言翻译
  6. 支持定制操作栏
page list @translate(zh-cn="采购订单管理") list to PurchaseOrder {
    flts {
       field code
       field memo
       field payPrice
       field paid
       field purchaseItem.productDef.name
       field @translate(zh-cn="单位") purchaseItem.productDef.unit.name
       field owner.firstName
    }
    cols {
        field code
        field purchaseItem.productDef.name
        field memo
        field payPrice
        field paid
        operates operates
    }
}

@cascade
@tree

编辑界面增加“增加”按钮

通过在relationship上增加注释showAdd,可以在编辑界面显示“增加”按钮,如图。

@paginate(pagination)
@translate(zh-cn="消息")
entity Notification {
  ...
}
relationship ManyToOne {
    Notification{@translate(zh-cn="类型")type(name)} to NotificationType,
    @showAdd
    Notification{@translate(zh-cn="子类型")subtype(name)} to NotificationSubType,
}

生成报告界面

在Entity上使用report注解

@paginate(pagination)
@report
@translate(zh-cn="菜单", en="Menu")
entity MenuItem {
  ...
}

定制报告界面

page report @translate(zh-cn="采购订单报告") report to PurchaseOrder {
    flts {
       field code
       field memo
       field payPrice
       field paid
       field owner.firstName
    }
    cols {
        field code
        field memo
        field payPrice
        field paid
        operates operates
    }
}

支持字段(包括关联)自动生成

在字段Field上使用注解readonly 或者在relationship上使用readonly关键字,支持在生成、更新、显示时自动生成,并只读。

readonly(/update/)

readonly(/create/)

readonly(/apply/)

@readonly(createOnShow="'SP' + moment().format('YYMMDDHHmmss')")

/**
 * 供应商
 */
@paginate(pagination)
@translate(zh-cn="供应商")
entity Supplier {
  @translate(zh-cn="供应商编码")
  @placeholder(zh-cn="请输入SP+6位数字,如SP123456")
  @readonly(createOnShow="'SP' + moment().format('YYMMDDHHmmss')")
  code String required unique pattern(/^SP\d{12}$/)
}

/*
 * 审计
 */
relationship ManyToOne {
  ...
  EnquiryOrder{@translate(zh-cn="创建者")createdBy(@translate(zh-cn="姓名")firstName) readonly(/create/)} to User
  EnquiryOrder{@translate(zh-cn="修改者")changedBy(@translate(zh-cn="姓名")firstName) readonly(/update/)} to User
}

/**
 * 单个询价
 */
@paginate(pagination)
@translate(zh-cn="询价单")
entity Enquiry {
  ...
  @translate(zh-cn="询价时间")
  enquiryTime Instant readonly(/create/)
}


/**
 * 采购订单
 */
@paginate(pagination)
@cascade
@translate(zh-cn="采购订单")
entity PurchaseOrder {
  ...
  @translate(zh-cn="接收时间")
  trueReceiveTime Instant readonly(/apply/)
}

支持默认值设定

在字段上使用default注解

/**
 * 采购订单
 */
@paginate(pagination)
@cascade
@translate(zh-cn="采购订单")
entity PurchaseOrder {
  ...
  @default(0)
  offPrice Float
  ...
}

支持默认数据集

针对entity使用dataset块,具体数据用/*#开始,*/结束。

支持以下特性

1、以//开始的注释

2、空白行

3、同一个entity支持多个dataset,可以有不同数据列明,方便分组管理默认数据集

4、表头的多个词的field,可以和entity中field命名一致,系统会自动转换为下划线分割的数据库表字段,如sample中的tabIndex和parentCode,可以是tab_index, parent_code。

dataset Department {
/*#
code;label;tabIndex;parentCode
dep00;XXX研究院;0;null
  
dep01;院领导;1;dep00
  // 测试
dep02;院办;2;dep00
dep03;档案室;3;dep00
dep04;总值班;4;dep00
dep05;党办;5;dep01
dep06;人事处;6;dep01
dep07;工会;7;dep02
dep08;离退办;8;dep03
**/
}

dataset Department {
/*#
code;label;tabIndex
dep06;人事处;6
dep07;工会;7
dep08;离退办;8
**/
}

支持多语言翻译

在entity、field、relationship上使用translate注解

1、entity的多语言支持

2、字段field的多语言支持

3、字段relationship的多语言支持

4、自定义页面的多语言支持

/**
 * 菜单(模块)
 */
@paginate(pagination)
@tree
@translate(zh-cn="菜单", en="Menu")
entity MenuItem {
    @translate(zh-cn="菜单名",en="MENU")
    label	String required unique minlength(2),
    ...
}
relationship OneToMany {
    MenuItem{
        @translate(zh-cn="子菜单") child(
            @translate(zh-cn="子菜单") label
        )
    }
    to
    MenuItem{
        @translate(zh-cn="父菜单") parent(
            @translate(zh-cn="父菜单") label
        )
    }
}
relationship ManyToOne {
    MenuItem{@translate(zh-cn="页面")router(@translate(zh-cn="页面")name, @translate(zh-cn="URL")link)}
     to RouterItem
}

支持模式化输入

使用pattern关键字,开始和结束需使用/字符。

/**
 * 供应商
 */
@paginate(pagination)
@translate(zh-cn="供应商")
entity Supplier {
  @translate(zh-cn="供应商编码")
  @placeholder(zh-cn="请输入SP+6位数字,如SP123456")
  @readonly(createOnShow="'SP' + moment().format('YYMMDDHHmmss')")
  code String required unique pattern(/^SP\d{12}$/)
  ...
}

编辑、详情界面支持内嵌表格

在OneToMany的relationship中使用cascade注解

/**
 * 询价单
 */
@paginate(pagination)
@cascade
@translate(zh-cn="询价单")
entity EnquiryOrder {
  @translate(zh-cn="订单号")
  @placeholder(zh-cn="请输入EO+6位数字,如EO123456")
  @readonly(createOnShow="'EO' + moment().format('YYMMDDHHmmss')")
  code String required unique pattern(/^EO\d{6}$/)
  ...
}
/**
 * 询价项
 */
@paginate(infinite-scroll)
@translate(zh-cn="询价项")
@cascade
entity EnquiryItem {
   ...
}

relationship OneToMany {
  @cascade
  EnquiryOrder {@translate(zh-cn="询价项")enquiryItem(@translate(zh-cn="产品")productDef.name,unitPrice,@translate(zh-cn="单位")productDef.unit.name,@translate(zh-cn="供应商")productDef.supplier.name)}
   to EnquiryItem {@translate(zh-cn="询价单")enquiryOrder(code)}
}

编辑界面和详情界面支持分页tab

在自定义页面page定义中添加tab关键字


page update @translate(zh-cn="采购订单更新/创建") update to PurchaseOrder {
    tab @translate(zh-cn="采购信息", en="Purchase Info") purchaseInfo {
        field code
        field
            amountPrice
        field offPrice
        field
            payPrice
        grid purchaseItem{
          field productDef.name
          field unitPrice
          field quantity
          field
            @expression("model.amountPrice" = "'model.unitPrice * model.quantity'")
            amountPrice
          field productDef.unit.name
          field productDef.supplier.name
          operates operates {
            receive @translate(zh-cn="收货") {
                icon pencil-alt
                action /*#(params: any): void => {
                    this.modal.confirm({
                        nzTitle: '<i>确认</i>',
                        nzContent: '<b>请确认已收货</b>',
                        nzOnOk: () => {
                        }
                    });
                }*/
            }
            delete @translate(zh-cn="删除", en="delete") {
                icon times
                action /*#(params: any): void => {
                        const removeData: any[] = [params.node.data];
                        params.api.applyTransaction({ remove: removeData });
                }*/
            }
          }
        }
    }
    tab @translate(zh-cn="下单信息", en="Purchase Info") orderInfo {
        field memo
        field orderTime
        field planReceiveTime
        field trueReceiveTime
    }
    tab @translate(zh-cn="发票管理", en="Invoice Info") invoice {
        grid @translate(zh-cn="发票") invoice {
            field fileName
            field image
        }
    }
    tab @translate(zh-cn="支付信息", en="Purchase Info") payinfo {
        field payTimes
        field
            paid
        field
            unpaid
        grid paymentItem {
          field amountPrice
          field planPayTime
          field truePayTime
        }
    }
    tab @translate(zh-cn="历史信息", en="Purchase Info") history {
        field owner.firstName
    }
}

page detail @translate(zh-cn="采购订单") detail ref update to PurchaseOrder

自定义操作按钮

在列表界面,编辑、详情界面中子表格中使用operates配置,目前支持已添加的图标,和操作函数

view、edit、delete

page update @translate(zh-cn="采购订单更新/创建") update to PurchaseOrder {
    tab @translate(zh-cn="采购信息", en="Purchase Info") purchaseInfo {
        ...
        grid purchaseItem{
          field productDef.name
          field unitPrice
          field quantity
          field
            @expression("model.amountPrice" = "'model.unitPrice * model.quantity'")
            amountPrice
          field productDef.unit.name
          field productDef.supplier.name
          operates operates {
            view
            edit
            receive @translate(zh-cn="收货") {
                icon pencil-alt
                action /*#(params: any): void => {
                    this.modal.confirm({
                        nzTitle: '<i>确认</i>',
                        nzContent: '<b>请确认已收货</b>',
                        nzOnOk: () => {
                        }
                    });
                }*/
            }
            delete @translate(zh-cn="删除", en="delete") {
                icon times
                action /*#(params: any): void => {
                        const removeData: any[] = [params.node.data];
                        params.api.applyTransaction({ remove: removeData });
                }*/
            }
          }
        }
    }
    tab @translate(zh-cn="下单信息", en="Purchase Info") orderInfo {
        field memo
        field orderTime
        field planReceiveTime
        field trueReceiveTime
    }
}

自定义代码片段的添加

json PurchaseOrder javaRest pay {
/*#
    @PostMapping("/purchases/{id}/pay/{payId}")
    public ResponseEntity<PurchaseOrderDTO> pay(@PathVariable Long id, @PathVariable Integer payId) throws URISyntaxException {
        log.debug("REST request to pay Purchase : {}", id);
        Optional<PurchaseOrderDTO> purchaseOrderDTO = purchaseOrderService.findOne(id);
        PurchaseOrderDTO purchaseOrder = purchaseOrderDTO.get();
        purchaseOrder.getPaymentItems().get(payId).setTruePayTime(Instant.now());
        PurchaseOrderDTO result = purchaseOrderService.save(purchaseOrder);
        return ResponseEntity.ok()
            .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
            .body(result);
    }
*/
}
json PurchaseOrder tsService pay {
/*#
  pay(id: number, index: number, item: any): Observable<EntityResponseType> {
    return this.http
      .post<IPurchaseOrderSbd>(`${this.resourceUrl}/${id}/pay/${index}`, null, { observe: 'response' })
      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
  }

  amountValueGetter(params: any): any {
    return params.data.unitPrice * params.data.quantity;
  }
*/
}

json PurchaseOrder types service {
/*#
    @PostMapping("/purchases/{id}/pay/{payId}")
    public ResponseEntity<PurchaseOrderDTO> pay(@PathVariable Long id, @PathVariable Integer payId) throws URISyntaxException {
        log.debug("REST request to pay Purchase : {}", id);
        Optional<PurchaseOrderDTO> purchaseOrderDTO = purchaseOrderService.findOne(id);
        PurchaseOrderDTO purchaseOrder = purchaseOrderDTO.get();
        purchaseOrder.getPaymentItems().get(payId).setTruePayTime(Instant.now());
        PurchaseOrderDTO result = purchaseOrderService.save(purchaseOrder);
        return ResponseEntity.ok()
            .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
            .body(result);
    }
*/
}

自定义源文件的添加

生成的代码并不能满足完全开发的需求,因此需要定制化各种类型的文件。

在jdl文件中添加files配置块,示例中generator为应用名,每一行为源文件和目标文件,再在jdl文件的目录下建立相关源文件。

files generator {
    "jdl/pom.xml" to "pom.xml"
    "jdl/src/main/docker/.dockerignore" to "src/main/docker/.dockerignore"
    "jdl/src/main/docker/Dockerfile" to "src/main/docker/Dockerfile"
    "jdl/src/main/docker/entrypoint.sh" to "src/main/docker/entrypoint.sh"
    "jdl/src/main/java/com/eyun/service/GeneratorService.java" to "src/main/java/com/eyun/service/GeneratorService.java"
    "jdl/src/main/java/com/eyun/service/JHipsterService.java" to "src/main/java/com/eyun/service/JHipsterService.java"
    "jdl/src/main/java/com/eyun/service/LogsService.java" to "src/main/java/com/eyun/service/LogsService.java"
    "jdl/src/main/java/com/eyun/config/ApplicationProperties.java" to "src/main/java/com/eyun/config/ApplicationProperties.java"
}

微服务关联设置

不同服务间调用,在entity上使用depends注解,系统自动生成feign相关代码。目前不能做到通过UML的entity关系自动检测服务间依赖。


/**
 * 模块资源信息,为Router,从程序中遍历
 */
@paginate(pagination)
@translate(zh-cn="用户")
@depends("verify.Verify")
entity User {
    @translate(zh-cn="测试")
    test String required unique minlength(2),
}

entity Verify {
      test String required unique minlength(2),
}

开发数据库的配置

可以在应用配置application中设置开发数据库连接

如下配置的应用的默认开发数据库为dev_com_ctg_admin,格式为dev_包名(.替换为_)_应用名(baseName)

application {
  config {
    applicationType gateway
    baseName admin
    packageName com.ctg
    serverPort 9000
    ...
    devDatabasePassword "zgp30RKxVmurmnGe"
    devDatabaseUrl "dev.eyun.online:3306"
  }
  entities * except User
}

数据权限使用

1、在JDL的application配置中添加feature:dataScope

application {
  config {
    applicationType monolith
    title "瀚海工作平台"
    footer ""
    baseName LimsMonolith
    packageName com.eyun
    appVersion "0.0.1"
    serverPort 8891
    authenticationType jwt
    cacheProvider no
    databaseType sql
    devDatabaseType mysql
    prodDatabaseType mysql
    searchEngine false
    serviceDiscoveryType false
    buildTool maven
    enableSwaggerCodegen true
    embeddableLaunchScript false
    clientPackageManager npm
    clientFramework angularX
    clientTheme none
    reactive false
    jhiPrefix jhi
    dtoSuffix DTO
    otherModules []
    websocket spring-websocket
    enableTranslation true
    languages [zh-cn,en]
    nativeLanguage zh-cn
    devDatabasePassword "zgp30RKxVmurmnGe"
    devDatabaseUrl "www.eyun.online:3306"
    prodDatabasePassword "YVrcuPQihPLk7Mpv"
    prodDatabaseUrl "192.168.8.100:3306"
    testFrameworks []
    licenseManager "license4j"
    features [superadmin,crypto,importPreview,dataScope,tenancy,oplog]
    jwtSecretKey "TGltc01vbm9saXRoMjAyMuWunumqjOS/oeaBr+euoeeQhuezu+e7n2NvbS5leXVuODg5MUxpbXNNb25vbGl0aDIwMjLlrp7pqozkv6Hmga/nrqHnkIbns7vnu59jb20u"
  }
  entities *
}

2、自定义Entity:User,并添加@role("USER")

/**
 * 用户
 */
@paginate(pagination)
@system
@ChangelogDate(20220808080808)
@role("USER")
entity User {
	@system
	email String
	@system
	lastName String
	@id
	@system
	login String maxlength(50)
}
relationship ManyToMany {
    User{@translate(zh-cn="部门")department(label,*)} to Department{@translate(zh-cn="职工")user(login,firstName)},
}

3、在需要添加数据权限的Entity前添加注释@dataScope

/**
 * 职工
 */
@paginate(pagination)
@translate(zh-cn="职工")
@ChangelogDate(20220809080808)
@dataScope
entity Employee {
    @translate(zh-cn="姓名")
    name String required minlength(2),
    @translate(zh-cn="工号")
    @id empno String unique,
    @translate(zh-cn="手机号")
    @crypto(SM2="???*****???")
    mobile String unique minlength(2),
    @translate(zh-cn="身份证号码")
    @crypto(SM2="????*****????")
    idcard String required unique minlength(2),
    @translate(zh-cn="微信openid")
    @crypto(SM2="????*****????")
    openid String unique,
    @translate(zh-cn="微信昵称")
    nickname String,
    @translate(zh-cn="头像地址")
    avatarUrl String,
}

4、在管理界面新建用户

系统在创建用户的时候会创建对应的用户唯一的权限,如用户test对应权限ROLE_USER_test。

5、在entity对应的自定义界面添加dataScope字段

因为有@dataScope的entity会自动添加dataScope的关系,所以在自定义page时,可以添加其引用,如带@dataScope的Customer,可以添加     

field dataScope

page update update to Customer {
  group @editable(static) @translate(zh-cn="账户信息") @attr(fieldGroupClassName = "'row flex_column section-label'") accountInfo
  {
      field @suffix("测试") @attr(className = "'ant-col ant-col-sm-4 ant-col-md-4'") label
      field @attr(className = "'ant-col ant-col-sm-4 ant-col-md-4'") @showAdd parent
      field @attr(className = "'ant-col ant-col-sm-4 ant-col-md-4'") owner
      field @attr(className = "'ant-col ant-col-sm-4 ant-col-md-4'") customerType
      field @attr(className = "'ant-col ant-col-sm-4 ant-col-md-4'") telephone
  }
  tabs {
    tab @translate(zh-cn="发货地址") deliveryAddressInfo
    {
        group @attr(fieldGroupClassName = "'row'") {
        field @attr(className = "'ant-col ant-col-sm-12 ant-col-md-12'") deliveryCountry
        field @attr(className = "'ant-col ant-col-sm-12 ant-col-md-12'") deliveryProvince
        }
        group @attr(fieldGroupClassName = "'row'") {
        field @attr(className = "'ant-col ant-col-sm-12 ant-col-md-12'") deliveryCity
        field @attr(className = "'ant-col ant-col-sm-12 ant-col-md-12'") deliveryPostcode
        }
        field deliveryAddress
    }
    tab @translate(zh-cn="系统信息") deliveryAddressInfo
    {
        group @attr(fieldGroupClassName = "'row'") {
        field @attr(className = "'ant-col ant-col-sm-12 ant-col-md-12'") creator
        field @attr(className = "'ant-col ant-col-sm-12 ant-col-md-12'") modifier
        field dataScope
        }
    }

  }
}

6、在entity对应的编辑界面选择数据权限

数据x

6、在entity对应的列表界面查看数据

用户只能看到在步骤四中设置对应的权限的用户能看到其数据。

调试技术

1. windows下node调试

2. ejs调试

在要调试ejs文件中增加

<%_

debugEjs(entityInstance, 'entity-management-detail.html');

const countOfShowFields = getShowedFieldsCount(fields, relationships);

_%>

然后用vscode运行调试

在输出的console中找到debugEjs的输出堆栈,ctrl+click打开debugEjs对应的文件,设置断点,再运行一次。即可进入ejs调试

Trace: debugEjs entity: contract type: entity-management-detail.html
    at module.exports.debugEjs (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\generators\generator-base.js:2470:17)
    at eval (eval at compile (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\node_modules\ejs\lib\ejs.js:618:12), <anonymous>:78:9)
    at returnedFn (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\node_modules\ejs\lib\ejs.js:653:17)
    at tryHandleCache (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\node_modules\ejs\lib\ejs.js:251:36)
    at Object.exports.renderFile (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\node_modules\ejs\lib\ejs.js:482:10)
    at Object.renderContent (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\generators\utils.js:247:9)
    at module.exports.template (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\generators\generator-base-private.js:774:23)
    at Object.copyWebResource (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\generators\utils.js:212:19)
    at module.exports.copyTemplate (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\generators\generator-base.js:998:31)
    at module.exports.processHtml (C:\Users\yingmingbo\AppData\Roaming\npm\node_modules\generator-jhipster\generators\generator-base.js:1049:14)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值