jeesite框架分析理解

2023-11-02

前文《jeesite代码生成器的使用(实例:报销表)》地址:http://blog.csdn.net/m0_38021128/article/details/68490920

前文中使用了jeesite框架的代码生成功能实现了一个小实例,但是实际上我对jeesite框架的了解还完全不够。
本文将从框架源码的角度对其进行分析理解。

首页源代码在哪里?

路径:jeesite根目录\src\main\webapp\WEB-INF\views\modules\sys\sysindex.jsp
在eclipse中打开就可以看到首页的源代码了。

代码生成

实体类entity

生成的实体类:com.thinkgem.jeesite.modules.sys.entity.Expenseclaimrecords

/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.modules.sys.entity;

import org.hibernate.validator.constraints.Length;
import java.util.List;
import com.google.common.collect.Lists;

import com.thinkgem.jeesite.common.persistence.DataEntity;

/**
 * 报销记录Entity
 * @author seven
 * @version 2017-04-07
 */
public class Expenseclaimrecords extends DataEntity<Expenseclaimrecords> {

    private static final long serialVersionUID = 1L;
    private String name;        // 项目名称
    private List<Expenseclaimdetails> expenseclaimdetailsList = Lists.newArrayList();       // 子表列表

    public Expenseclaimrecords() {
        super();
    }

    public Expenseclaimrecords(String id){
        super(id);
    }

    @Length(min=1, max=30, message="项目名称长度必须介于 1 和 30 之间")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Expenseclaimdetails> getExpenseclaimdetailsList() {
        return expenseclaimdetailsList;
    }

    public void setExpenseclaimdetailsList(List<Expenseclaimdetails> expenseclaimdetailsList) {
        this.expenseclaimdetailsList = expenseclaimdetailsList;
    }
}

根据它的导入,找到它的父类:com.thinkgem.jeesite.common.persistence.DataEntity
可以看到该方法中写了我们导入数据表中必须包含的备注等类,但还缺少id类,继续找到DataEntity的父类。

/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.common.persistence;

import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.constraints.Length;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.thinkgem.jeesite.common.utils.IdGen;
import com.thinkgem.jeesite.modules.sys.entity.User;
import com.thinkgem.jeesite.modules.sys.utils.UserUtils;

/**
 * 数据Entity类
 * @author ThinkGem
 * @version 2014-05-16
 */
public abstract class DataEntity<T> extends BaseEntity<T> {

    private static final long serialVersionUID = 1L;

    protected String remarks;   // 备注
    protected User createBy;    // 创建者
    protected Date createDate;  // 创建日期
    protected User updateBy;    // 更新者
    protected Date updateDate;  // 更新日期
    protected String delFlag;   // 删除标记(0:正常;1:删除;2:审核)

    public DataEntity() {
        super();
        this.delFlag = DEL_FLAG_NORMAL;
    }

    public DataEntity(String id) {
        super(id);
    }

    /**
     * 插入之前执行方法,需要手动调用
     */
    @Override
    public void preInsert(){
        // 不限制ID为UUID,调用setIsNewRecord()使用自定义ID
        if (!this.isNewRecord){
            setId(IdGen.uuid());
        }
        User user = UserUtils.getUser();
        if (StringUtils.isNotBlank(user.getId())){
            this.updateBy = user;
            this.createBy = user;
        }
        this.updateDate = new Date();
        this.createDate = this.updateDate;
    }

    /**
     * 更新之前执行方法,需要手动调用
     */
    @Override
    public void preUpdate(){
        User user = UserUtils.getUser();
        if (StringUtils.isNotBlank(user.getId())){
            this.updateBy = user;
        }
        this.updateDate = new Date();
    }

    @Length(min=0, max=255)
    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    @JsonIgnore
    public User getCreateBy() {
        return createBy;
    }

    public void setCreateBy(User createBy) {
        this.createBy = createBy;
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    @JsonIgnore
    public User getUpdateBy() {
        return updateBy;
    }

    public void setUpdateBy(User updateBy) {
        this.updateBy = updateBy;
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

    @JsonIgnore
    @Length(min=1, max=1)
    public String getDelFlag() {
        return delFlag;
    }

    public void setDelFlag(String delFlag) {
        this.delFlag = delFlag;
    }

}

com.thinkgem.jeesite.common.persistence.BaseEntity
终于找到了id类,至此我们明白导入数据表的必须项了。

/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.common.persistence;

import java.io.Serializable;
import java.util.Map;

import javax.xml.bind.annotation.XmlTransient;

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Maps;
import com.thinkgem.jeesite.common.config.Global;
import com.thinkgem.jeesite.common.supcan.annotation.treelist.SupTreeList;
import com.thinkgem.jeesite.common.supcan.annotation.treelist.cols.SupCol;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.sys.entity.User;
import com.thinkgem.jeesite.modules.sys.utils.UserUtils;

/**
 * Entity支持类
 * @author ThinkGem
 * @version 2014-05-16
 */
@SupTreeList
public abstract class BaseEntity<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 实体编号(唯一标识)
     */
    protected String id;

    /**
     * 当前用户
     */
    protected User currentUser;

    /**
     * 当前实体分页对象
     */
    protected Page<T> page;

    /**
     * 自定义SQL(SQL标识,SQL内容)
     */
    protected Map<String, String> sqlMap;

    /**
     * 是否是新记录(默认:false),调用setIsNewRecord()设置新记录,使用自定义ID。
     * 设置为true后强制执行插入语句,ID不会自动生成,需从手动传入。
     */
    protected boolean isNewRecord = false;

    public BaseEntity() {

    }

    public BaseEntity(String id) {
        this();
        this.id = id;
    }

    @SupCol(isUnique="true", isHide="true")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @JsonIgnore
    @XmlTransient
    public User getCurrentUser() {
        if(currentUser == null){
            currentUser = UserUtils.getUser();
        }
        return currentUser;
    }

    public void setCurrentUser(User currentUser) {
        this.currentUser = currentUser;
    }

    @JsonIgnore
    @XmlTransient
    public Page<T> getPage() {
        if (page == null){
            page = new Page<T>();
        }
        return page;
    }

    public Page<T> setPage(Page<T> page) {
        this.page = page;
        return page;
    }

    @JsonIgnore
    @XmlTransient
    public Map<String, String> getSqlMap() {
        if (sqlMap == null){
            sqlMap = Maps.newHashMap();
        }
        return sqlMap;
    }

    public void setSqlMap(Map<String, String> sqlMap) {
        this.sqlMap = sqlMap;
    }

    /**
     * 插入之前执行方法,子类实现
     */
    public abstract void preInsert();

    /**
     * 更新之前执行方法,子类实现
     */
    public abstract void preUpdate();

    /**
     * 是否是新记录(默认:false),调用setIsNewRecord()设置新记录,使用自定义ID。
     * 设置为true后强制执行插入语句,ID不会自动生成,需从手动传入。
     * @return
     */
    public boolean getIsNewRecord() {
        return isNewRecord || StringUtils.isBlank(getId());
    }

    /**
     * 是否是新记录(默认:false),调用setIsNewRecord()设置新记录,使用自定义ID。
     * 设置为true后强制执行插入语句,ID不会自动生成,需从手动传入。
     */
    public void setIsNewRecord(boolean isNewRecord) {
        this.isNewRecord = isNewRecord;
    }

    /**
     * 全局变量对象
     */
    @JsonIgnore
    public Global getGlobal() {
        return Global.getInstance();
    }

    /**
     * 获取数据库名称
     */
    @JsonIgnore
    public String getDbName(){
        return Global.getConfig("jdbc.type");
    }

    @Override
    public boolean equals(Object obj) {
        if (null == obj) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!getClass().equals(obj.getClass())) {
            return false;
        }
        BaseEntity<?> that = (BaseEntity<?>) obj;
        return null == this.getId() ? false : this.getId().equals(that.getId());
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }

    /**
     * 删除标记(0:正常;1:删除;2:审核;)
     */
    public static final String DEL_FLAG_NORMAL = "0";
    public static final String DEL_FLAG_DELETE = "1";
    public static final String DEL_FLAG_AUDIT = "2";

}

视图相关文档

因为我没学过jsp,只能勉强看一看文档。

这里写图片描述

上图对应jsp文件:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>
    <title>报销记录管理</title>
    <meta name="decorator" content="default"/>
    <script type="text/javascript">
        $(document).ready(function() {

        });
        function page(n,s){
            $("#pageNo").val(n);
            $("#pageSize").val(s);
            $("#searchForm").submit();
            return false;
        }
    </script>
</head>
<body>
    <ul class="nav nav-tabs">
        <li class="active"><a href="${ctx}/sys/expenseclaimrecords/">报销记录列表</a></li>
        <shiro:hasPermission name="sys:expenseclaimrecords:edit"><li><a href="${ctx}/sys/expenseclaimrecords/form">报销记录添加</a></li></shiro:hasPermission>
    </ul>
    <form:form id="searchForm" modelAttribute="expenseclaimrecords" action="${ctx}/sys/expenseclaimrecords/" method="post" class="breadcrumb form-search">
        <input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
        <input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
        <ul class="ul-form">
            <li class="btns"><input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/></li>
            <li class="clearfix"></li>
        </ul>
    </form:form>
    <sys:message content="${message}"/>
    <table id="contentTable" class="table table-striped table-bordered table-condensed">
        <thead>
            <tr>
                <th>项目名称</th>
                <th>创建者</th>
                <th>更新日期</th>
                <th>备注</th>
                <shiro:hasPermission name="sys:expenseclaimrecords:edit"><th>操作</th></shiro:hasPermission>
            </tr>
        </thead>
        <tbody>
        <c:forEach items="${page.list}" var="expenseclaimrecords">
            <tr>
                <td><a href="${ctx}/sys/expenseclaimrecords/form?id=${expenseclaimrecords.id}">
                    ${expenseclaimrecords.name}
                </a></td>
                <td>
                    ${expenseclaimrecords.createBy.id}
                </td>
                <td>
                    <fmt:formatDate value="${expenseclaimrecords.updateDate}" pattern="yyyy-MM-dd HH:mm:ss"/>
                </td>
                <td>
                    ${expenseclaimrecords.remarks}
                </td>
                <shiro:hasPermission name="sys:expenseclaimrecords:edit"><td>
                    <a href="${ctx}/sys/expenseclaimrecords/form?id=${expenseclaimrecords.id}">修改</a>
                    <a href="${ctx}/sys/expenseclaimrecords/delete?id=${expenseclaimrecords.id}" onclick="return confirmx('确认要删除该报销记录吗?', this.href)">删除</a>
                </td></shiro:hasPermission>
            </tr>
        </c:forEach>
        </tbody>
    </table>
    <div class="pagination">${page}</div>
</body>
</html>

这里写图片描述

上图对应jsp文件:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>
    <title>报销记录管理</title>
    <meta name="decorator" content="default"/>
    <script type="text/javascript">
        $(document).ready(function() {
            //$("#name").focus();
            $("#inputForm").validate({
                submitHandler: function(form){
                    loading('正在提交,请稍等...');
                    form.submit();
                },
                errorContainer: "#messageBox",
                errorPlacement: function(error, element) {
                    $("#messageBox").text("输入有误,请先更正。");
                    if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
                        error.appendTo(element.parent().parent());
                    } else {
                        error.insertAfter(element);
                    }
                }
            });
        });
        function addRow(list, idx, tpl, row){
            $(list).append(Mustache.render(tpl, {
                idx: idx, delBtn: true, row: row
            }));
            $(list+idx).find("select").each(function(){
                $(this).val($(this).attr("data-value"));
            });
            $(list+idx).find("input[type='checkbox'], input[type='radio']").each(function(){
                var ss = $(this).attr("data-value").split(',');
                for (var i=0; i<ss.length; i++){
                    if($(this).val() == ss[i]){
                        $(this).attr("checked","checked");
                    }
                }
            });
        }
        function delRow(obj, prefix){
            var id = $(prefix+"_id");
            var delFlag = $(prefix+"_delFlag");
            if (id.val() == ""){
                $(obj).parent().parent().remove();
            }else if(delFlag.val() == "0"){
                delFlag.val("1");
                $(obj).html("&divide;").attr("title", "撤销删除");
                $(obj).parent().parent().addClass("error");
            }else if(delFlag.val() == "1"){
                delFlag.val("0");
                $(obj).html("&times;").attr("title", "删除");
                $(obj).parent().parent().removeClass("error");
            }
        }
    </script>
</head>
<body>
    <ul class="nav nav-tabs">
        <li><a href="${ctx}/sys/expenseclaimrecords/">报销记录列表</a></li>
        <li class="active"><a href="${ctx}/sys/expenseclaimrecords/form?id=${expenseclaimrecords.id}">报销记录<shiro:hasPermission name="sys:expenseclaimrecords:edit">${not empty expenseclaimrecords.id?'修改':'添加'}</shiro:hasPermission><shiro:lacksPermission name="sys:expenseclaimrecords:edit">查看</shiro:lacksPermission></a></li>
    </ul><br/>
    <form:form id="inputForm" modelAttribute="expenseclaimrecords" action="${ctx}/sys/expenseclaimrecords/save" method="post" class="form-horizontal">
        <form:hidden path="id"/>
        <sys:message content="${message}"/>        
        <div class="control-group">
            <label class="control-label">项目名称:</label>
            <div class="controls">
                <form:input path="name" htmlEscape="false" maxlength="30" class="input-xlarge required"/>
                <span class="help-inline"><font color="red">*</font> </span>
            </div>
        </div>
        <div class="control-group">
            <label class="control-label">备注:</label>
            <div class="controls">
                <form:textarea path="remarks" htmlEscape="false" rows="4" maxlength="255" class="input-xxlarge "/>
            </div>
        </div>
            <div class="control-group">
                <label class="control-label">报销项记录表:</label>
                <div class="controls">
                    <table id="contentTable" class="table table-striped table-bordered table-condensed">
                        <thead>
                            <tr>
                                <th class="hide"></th>
                                <th>报销项</th>
                                <th>报销金额</th>
                                <th>备用</th>
                                <shiro:hasPermission name="sys:expenseclaimrecords:edit"><th width="10">&nbsp;</th></shiro:hasPermission>
                            </tr>
                        </thead>
                        <tbody id="expenseclaimdetailsList">
                        </tbody>
                        <shiro:hasPermission name="sys:expenseclaimrecords:edit"><tfoot>
                            <tr><td colspan="5"><a href="javascript:" onclick="addRow('#expenseclaimdetailsList', expenseclaimdetailsRowIdx, expenseclaimdetailsTpl);expenseclaimdetailsRowIdx = expenseclaimdetailsRowIdx + 1;" class="btn">新增</a></td></tr>
                        </tfoot></shiro:hasPermission>
                    </table>
                    <script type="text/template" id="expenseclaimdetailsTpl">//<!--
                        <tr id="expenseclaimdetailsList{{idx}}">
                            <td class="hide">
                                <input id="expenseclaimdetailsList{{idx}}_id" name="expenseclaimdetailsList[{{idx}}].id" type="hidden" value="{{row.id}}"/>
                                <input id="expenseclaimdetailsList{{idx}}_delFlag" name="expenseclaimdetailsList[{{idx}}].delFlag" type="hidden" value="0"/>
                            </td>
                            <td>
                                <select id="expenseclaimdetailsList{{idx}}_classes" name="expenseclaimdetailsList[{{idx}}].classes" data-value="{{row.classes}}" class="input-small required">
                                    <option value=""></option>
                                    <c:forEach items="${fns:getDictList('classes')}" var="dict">
                                        <option value="${dict.value}">${dict.label}</option>
                                    </c:forEach>
                                </select>
                            </td>
                            <td>
                                <input id="expenseclaimdetailsList{{idx}}_total" name="expenseclaimdetailsList[{{idx}}].total" type="text" value="{{row.total}}" class="input-small required"/>
                            </td>
                            <td>
                                <textarea id="expenseclaimdetailsList{{idx}}_remarks" name="expenseclaimdetailsList[{{idx}}].remarks" rows="4" maxlength="255" class="input-small ">{{row.remarks}}</textarea>
                            </td>
                            <shiro:hasPermission name="sys:expenseclaimrecords:edit"><td class="text-center" width="10">
                                {{#delBtn}}<span class="close" onclick="delRow(this, '#expenseclaimdetailsList{{idx}}')" title="删除">&times;</span>{{/delBtn}}
                            </td></shiro:hasPermission>
                        </tr>//-->
                    </script>
                    <script type="text/javascript">
                        var expenseclaimdetailsRowIdx = 0, expenseclaimdetailsTpl = $("#expenseclaimdetailsTpl").html().replace(/(\/\/\<!\-\-)|(\/\/\-\->)/g,"");
                        $(document).ready(function() {
                            var data = ${fns:toJson(expenseclaimrecords.expenseclaimdetailsList)};
                            for (var i=0; i<data.length; i++){
                                addRow('#expenseclaimdetailsList', expenseclaimdetailsRowIdx, expenseclaimdetailsTpl, data[i]);
                                expenseclaimdetailsRowIdx = expenseclaimdetailsRowIdx + 1;
                            }
                        });
                    </script>
                </div>
            </div>
        <div class="form-actions">
            <shiro:hasPermission name="sys:expenseclaimrecords:edit"><input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;</shiro:hasPermission>
            <input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
        </div>
    </form:form>
</body>
</html>

代码生成

通过jsp找到了服务层代码,过程略。

/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.modules.gen.service;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.thinkgem.jeesite.common.persistence.Page;
import com.thinkgem.jeesite.common.service.BaseService;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.gen.dao.GenSchemeDao;
import com.thinkgem.jeesite.modules.gen.dao.GenTableColumnDao;
import com.thinkgem.jeesite.modules.gen.dao.GenTableDao;
import com.thinkgem.jeesite.modules.gen.entity.GenConfig;
import com.thinkgem.jeesite.modules.gen.entity.GenScheme;
import com.thinkgem.jeesite.modules.gen.entity.GenTable;
import com.thinkgem.jeesite.modules.gen.entity.GenTableColumn;
import com.thinkgem.jeesite.modules.gen.entity.GenTemplate;
import com.thinkgem.jeesite.modules.gen.util.GenUtils;

/**
 * 生成方案Service
 * @author ThinkGem
 * @version 2013-10-15
 */
@Service
@Transactional(readOnly = true)
public class GenSchemeService extends BaseService {

    @Autowired
    private GenSchemeDao genSchemeDao;
//  @Autowired
//  private GenTemplateDao genTemplateDao;
    @Autowired
    private GenTableDao genTableDao;
    @Autowired
    private GenTableColumnDao genTableColumnDao;

    public GenScheme get(String id) {
        return genSchemeDao.get(id);
    }

    public Page<GenScheme> find(Page<GenScheme> page, GenScheme genScheme) {
        GenUtils.getTemplatePath();
        genScheme.setPage(page);
        page.setList(genSchemeDao.findList(genScheme));
        return page;
    }

    @Transactional(readOnly = false)
    public String save(GenScheme genScheme) {
        if (StringUtils.isBlank(genScheme.getId())){
            genScheme.preInsert();
            genSchemeDao.insert(genScheme);
        }else{
            genScheme.preUpdate();
            genSchemeDao.update(genScheme);
        }
        // 生成代码
        if ("1".equals(genScheme.getFlag())){
            return generateCode(genScheme);
        }
        return "";
    }

    @Transactional(readOnly = false)
    public void delete(GenScheme genScheme) {
        genSchemeDao.delete(genScheme);
    }

    private String generateCode(GenScheme genScheme){

        StringBuilder result = new StringBuilder();

        // 查询主表及字段列
        GenTable genTable = genTableDao.get(genScheme.getGenTable().getId());
        genTable.setColumnList(genTableColumnDao.findList(new GenTableColumn(new GenTable(genTable.getId()))));

        // 获取所有代码模板
        GenConfig config = GenUtils.getConfig();

        // 获取模板列表
        List<GenTemplate> templateList = GenUtils.getTemplateList(config, genScheme.getCategory(), false);
        List<GenTemplate> childTableTemplateList = GenUtils.getTemplateList(config, genScheme.getCategory(), true);

        // 如果有子表模板,则需要获取子表列表
        if (childTableTemplateList.size() > 0){
            GenTable parentTable = new GenTable();
            parentTable.setParentTable(genTable.getName());
            genTable.setChildList(genTableDao.findList(parentTable));
        }

        // 生成子表模板代码
        for (GenTable childTable : genTable.getChildList()){
            childTable.setParent(genTable);
            childTable.setColumnList(genTableColumnDao.findList(new GenTableColumn(new GenTable(childTable.getId()))));
            genScheme.setGenTable(childTable);
            Map<String, Object> childTableModel = GenUtils.getDataModel(genScheme);
            for (GenTemplate tpl : childTableTemplateList){
                result.append(GenUtils.generateToFile(tpl, childTableModel, genScheme.getReplaceFile()));
            }
        }

        // 生成主表模板代码
        genScheme.setGenTable(genTable);
        Map<String, Object> model = GenUtils.getDataModel(genScheme);
        for (GenTemplate tpl : templateList){
            result.append(GenUtils.generateToFile(tpl, model, genScheme.getReplaceFile()));
        }
        return result.toString();
    }
}

生成表的类。验证了备注等信息。
重点在于导入依赖字符串。

/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.thinkgem.jeesite.modules.gen.entity;

import java.util.List;

import org.hibernate.validator.constraints.Length;

import com.google.common.collect.Lists;
import com.thinkgem.jeesite.common.persistence.DataEntity;
import com.thinkgem.jeesite.common.utils.StringUtils;

/**
 * 业务表Entity
 * @author ThinkGem
 * @version 2013-10-15
 */
public class GenTable extends DataEntity<GenTable> {

    private static final long serialVersionUID = 1L;
    private String name;    // 名称
    private String comments;        // 描述
    private String className;       // 实体类名称
    private String parentTable;     // 关联父表
    private String parentTableFk;       // 关联父表外键

    private List<GenTableColumn> columnList = Lists.newArrayList(); // 表列

    private String nameLike;    // 按名称模糊查询

    private List<String> pkList; // 当前表主键列表

    private GenTable parent;    // 父表对象
    private List<GenTable> childList = Lists.newArrayList();    // 子表列表

    public GenTable() {
        super();
    }

    public GenTable(String id){
        super(id);
    }

    @Length(min=1, max=200)
    public String getName() {
        return StringUtils.lowerCase(name);
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getComments() {
        return comments;
    }

    public void setComments(String comments) {
        this.comments = comments;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getParentTable() {
        return StringUtils.lowerCase(parentTable);
    }

    public void setParentTable(String parentTable) {
        this.parentTable = parentTable;
    }

    public String getParentTableFk() {
        return StringUtils.lowerCase(parentTableFk);
    }

    public void setParentTableFk(String parentTableFk) {
        this.parentTableFk = parentTableFk;
    }

    public List<String> getPkList() {
        return pkList;
    }

    public void setPkList(List<String> pkList) {
        this.pkList = pkList;
    }

    public String getNameLike() {
        return nameLike;
    }

    public void setNameLike(String nameLike) {
        this.nameLike = nameLike;
    }

    public GenTable getParent() {
        return parent;
    }

    public void setParent(GenTable parent) {
        this.parent = parent;
    }

    public List<GenTableColumn> getColumnList() {
        return columnList;
    }

    public void setColumnList(List<GenTableColumn> columnList) {
        this.columnList = columnList;
    }

    public List<GenTable> getChildList() {
        return childList;
    }

    public void setChildList(List<GenTable> childList) {
        this.childList = childList;
    }

    /**
     * 获取列名和说明
     * @return
     */
    public String getNameAndComments() {
        return getName() + (comments == null ? "" : "  :  " + comments);
    }

    /**
     * 获取导入依赖包字符串
     * @return
     */
    public List<String> getImportList(){
        List<String> importList = Lists.newArrayList(); // 引用列表
        for (GenTableColumn column : getColumnList()){
            if (column.getIsNotBaseField() || ("1".equals(column.getIsQuery()) && "between".equals(column.getQueryType())
                            && ("createDate".equals(column.getSimpleJavaField()) || "updateDate".equals(column.getSimpleJavaField())))){
                // 导入类型依赖包, 如果类型中包含“.”,则需要导入引用。
                if (StringUtils.indexOf(column.getJavaType(), ".") != -1 && !importList.contains(column.getJavaType())){
                    importList.add(column.getJavaType());
                }
            }
            if (column.getIsNotBaseField()){
                // 导入JSR303、Json等依赖包
                for (String ann : column.getAnnotationList()){
                    if (!importList.contains(StringUtils.substringBeforeLast(ann, "("))){
                        importList.add(StringUtils.substringBeforeLast(ann, "("));
                    }
                }
            }
        }
        // 如果有子表,则需要导入List相关引用
        if (getChildList() != null && getChildList().size() > 0){
            if (!importList.contains("java.util.List")){
                importList.add("java.util.List");
            }
            if (!importList.contains("com.google.common.collect.Lists")){
                importList.add("com.google.common.collect.Lists");
            }
        }
        return importList;
    }

    /**
     * 是否存在父类
     * @return
     */
    public Boolean getParentExists(){
        return parent != null && StringUtils.isNotBlank(parentTable) && StringUtils.isNotBlank(parentTableFk);
    }

    /**
     * 是否存在create_date列
     * @return
     */
    public Boolean getCreateDateExists(){
        for (GenTableColumn c : columnList){
            if ("create_date".equals(c.getName())){
                return true;
            }
        }
        return false;
    }

    /**
     * 是否存在update_date列
     * @return
     */
    public Boolean getUpdateDateExists(){
        for (GenTableColumn c : columnList){
            if ("update_date".equals(c.getName())){
                return true;
            }
        }
        return false;
    }

    /**
     * 是否存在del_flag列
     * @return
     */
    public Boolean getDelFlagExists(){
        for (GenTableColumn c : columnList){
            if ("del_flag".equals(c.getName())){
                return true;
            }
        }
        return false;
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jeesite框架分析理解 的相关文章

  • jeesite mysql_Jeesite框架mysql数据库初始报错

    INFO Scanning for projects WARNING WARNING Some problems were encountered while building the effective model for com thi
  • jeesite中的ztree应用

    话不多说 xff0c 直接开始一二三 jeesite页面上通过以自定义jstl lt sys treeselect gt 方式引入树形选择 1 lt sys treeselect id 61 34 company 34 name 61 34
  • jeesite框架介绍

    1 jeesite框架介绍 http wenku baidu com view 7e543c24e45c3b3567ec8baf html 2 jeesite开发环境搭建及部署 http wenku baidu com link url L
  • Sqli-labs 查看源代码 1-20

    Less 1 indexphp sqli connectphp db credsinc GET 基于错误 单引号 字符型 Less 2 GET 基于错误 整型 Less 3 基于错误 单引号变形 字符型 Less 4 基于错误 双引号 字符
  • 根据权重随机选取指定条数记录的简单算法实现(C#)【含源代码】

    原文地址 http www cnblogs com foolin archive 2012 03 22 2412632 html 一 应用场景 有时我们需要从一些列数据中根据权重随机选取指定条数记录出来 这里需要权重 随机 我们根据权重越大
  • 909422229_Jeesite 列表数据自定义排序规则

    技术交流群 958923746 有学习视频 文档等 1 列表排序 假排序哦 非数据库排序 page是查询到的列表数据 Collections sort page getList new Comparator
  • CSDN CODE 初体验

    写在前头 自从在2012年初写了一篇 一个人的Scrum之准备工作 两年过去了 how time flies 在文中我费劲千辛万苦搭好了工作环境 自己乐在其中 这是一种痛并快乐着的感觉 本以为自己就开始的一段时间熟悉环境费心些 没想到后来的
  • c/c++编程日记:用C语言实现消消乐游戏(附源码)

    描述 给定一个矩阵 判断移动哪一个格子 可以实现消除 定义连续三个即可消除 分析 先写一个函数 判断包含 i j 的格子是否可能实现消除 然后就是向右向下交换 然后调用上面写好的函数判断 被交换的两个格子是否实现消除 重点 1 只需要向右向
  • Junit源码与设计模式欣赏

    先介绍下这篇博文的由来 之前已经对JUnit的使用经行了深入的介绍和演示 参考JUnit学习 一 JUnit学习 二 其中的部分功能是通过分析JUnit源代码找到的 得益于这个过程有幸完整的拜读了JUnit的源码十分赞叹作者代码的精美 一直
  • Java socket通信实例,简单入门socket实例代码

    是不是看了许多socket入门知识 却还是不能实际运用呢 这篇文章通过利用简单实例程序讲解通过socket实现客户端与服务器之间的通讯 这篇文章可以让你不需要了解socket原理也能利用 便于应急 但建议之后要好好补补关于soket的基础知
  • 89个android学习样例源码

    源码下载链接 https pan baidu com s 1uT hsZQac7Hz3pOxX466Cw pwd 8888 提取码 8888 Android 仿京东金融首页头像效果 Android 实现Conquer应用源码 Android
  • jeesite上传文件

    RequestMapping value saveFile public String saveFile Document document Model model RedirectAttributes redirectAttributes
  • PHP发送邮件详细说明

    这两天琢磨了php得原生发送邮件 发现自带得mail方法不太好用 于是上网查询了好多方法 亲测以下方法能用 源代码都在 我的github 到github上下载 https github com PHPMailer PHPMailer htt
  • STM32学习笔记:adc采样得到的电压值用485发送给pc

    采用adc1的通道10 将采集到的电压值用485发送给PC显示 先上原理图 源代码见附件 这里想说的是几个要注意的问题 1 ad输入的电压经过了R42和R44进行分压 所以pc显示的电压值将会减半 2 采用这个函数进行发送数据的时候 每次都
  • lapack++与sba的编译问题

    最近在研究老外写的sba的程序 从http users ics forth gr lourakis sba 下载的sba程序是源代码 并没有编译 按照http blog csdn net royalvane article details
  • Jeesite开发平台限制用户多点登录

    Jeesite开发平台限制用户多点登录 授权查询回调函数 进行鉴权但缓存中无用户的授权信息时调用 Override protected AuthorizationInfo doGetAuthorizationInfo PrincipalCo
  • Python实现快乐的数字

    题目要求 编写一个算法来确定一个数字是否 快乐 快乐的数字按照如下方式确定 从一个正整数开始 用其每位数的平方之和取代该数 并重复这个过程 直到最后数字要么收敛等于1且一直等于1 要么将无休止地循环下去且最终不会收敛等于1 能够最终收敛等于
  • 更改jar包里的代码

    1 将class文件改成java文件 如果你的jar包中是包含源代码的 即包含java文件 请跳过此步 先将jar包通过winrar或者快压等解压缩软件将jar包解压缩 再通过一些专门的Java反编译工具将class文件转换为java文件
  • jeesite快速开发平台(一)----简介

    以下内容来自官网 一 平台简介 JeeSite是基于多个优秀的开源项目 高度整合封装而成的高效 高性能 强安全性的开源Java EE快速开发平台 JeeSite是您快速完成项目的最佳基础平台解决方案 JeeSite是您想学习Java平台的最
  • 5分钟带你看懂Jeesite10大功能要点

    jeesite内容丰富 集成了大量优秀的组件 是一个值得研究的框架 它有 1 shiro安全权限控制 2 mybatis查询缓存接口扩展 3 ecache分布式缓存整合 4 页面资源缓存优化 5 多数据源灵活切换 6 mybatismapp

随机推荐

  • 数组截取--slice()

    待补充
  • 结构体的定义以及初始化

    一 结构体定义类型 变量的定义 struct是关键字 是结构体类型的标志 在结构体里可以定义相应的成员信息 同时 结构体同样要以分号结尾 struct person char name 20 char sex 20 int age int
  • eclipse 找不到 tomcat 的解决方案

    前言 查了很多教程上配置tomcat时都是直接 File gt gt New gt gt Other gt gt Server gt gt Server gt gt Apache gt gt tomcat 然而我发现在这两个eclipse中
  • 日志大文件拆分

    前言 生产环境没设置好日志文件大小的最大值 导致日志文件过大 普通编辑器根本没法打开 要排查日志改怎么办 拆分日志大文件 如何拆分 split命令专门用来将一个大文件分割成很多个小文件 我把split命令的选项做一个简要说明 选项 含义 b
  • Python opencv库 tkinter 设计屏幕录制工具

    有时 我们在电脑上需要录屏 或制作gif动画 用于演示电脑操作等 如何使用Python来实现 目录 1 使用cv2库生成视频 2 使用tkinter选择录制区域 3 再次实现 4 最终的程序 5 拓展 创建gif动画 1 使用cv2库生成视
  • Docker日志日期时间精确查询

    docker logs since 2020 07 30T10 14 00 until 2020 07 30T10 15 00 tomcat80 这条代码可以通过2个时间来查询指定范围的时间日志 since起始时间 你要从什么时候开始查询
  • 【数据结构】UnionFind 并查集-2

    数据结构源码 UnionFind1 接口 public interface UnionFind int getSize boolean isConnected int p int q void unionElements int p int
  • 华大HC32L176与三相四线计量模块JSY_333通讯例程以及对三相三线认识误区

    在某宝购买这个产品后 需要编写程序读取数据 这款产品可以使用TTL和RS485进行通讯 我用的是用华大单片机HC32L176 首先对串口进行初始化 程序可以自行下载 链接 https pan baidu com s 1FD2VecV64ZH
  • 从端到端打通模型端侧部署流程(NCNN)

    文章目录 背景介绍 为什么要做端侧推理 端侧深度学习部署流程 一条主要技术路线 ONNX NCNN框架 NCNN的官方介绍 NCNN问题解决 NCNN使用样例 快速在NCNN框架下验证自己的模型 一般流程 YOLOv5的demo测试 全新部
  • CGSS中国综合社会调查

    数据详情 1 包含数据库和问卷 2 数据包含的年份为2003 2005 2006 2008 2010 2011 2012 2013 2015 2017 3 2017年数据为SPSS和STATA 14版 CSV EXCEL 编码表 4 15年
  • 8.14 ARM

    1 练习一 text 文本段 global start 声明一个 start函数入口 start start标签 相当于C语言中函数 mov r0 0x2 mov r1 0x3 cmp r0 r1 beq stop subhi r0 r0
  • python的类写法_python类写法

    广告关闭 腾讯云11 11云上盛惠 精选热门产品助力上云 云服务器首年88元起 买的越多返的越多 最高返5000元 在python中这一点仍然成立 in class fatboy object pass in fb fatboy in pr
  • 刷脸发甚至改变整个支付行业和零售行业

    在今年4月17日 蚂蚁金服在北京发布新一代刷脸支付产品 蜻蜓2 0 并宣称未来将会投入30亿让刷脸支付全国普及 助力商家数字化 让商家快速结付 提高商家运营效率 为顾客便利服务 为商家引流 支付宝蜻蜓二代接入刷脸即会员等数字化经营能力 试点
  • vue el-option只回显数字问题

    1 value前面没有加冒号说明是字符串 加个冒号即可回显label名称 2 后端返回的值可能已经将id类型返回为String 此时转换为number即可回显 3 也可用v for循环渲染选项 回显时肯定能回显label名称
  • 机器人避障路径规划--基于人工势场算法

    机器人避障路径规划 基于人工势场算法 机器人避障路径规划是机器人导航和控制中的一个基本问题 它的目标是在给定环境中找到一条安全可行的路径 使得机器人能够从起点到达目标点 并尽可能地避免与环境发生碰撞 人工势场算法是一种常用的机器人避障路径规
  • error: could not delete '/usr/local/lib/python3.6/site-packages/pip/_internal/configuration.py': Per

    brew install python 报错 error could not delete usr local lib python3 6 site packages pip internal configuration py Permis
  • 黑马程序员Javaweb学习笔记02【request和response】

    该博客主要记录在学习黑马程序员Javaweb过程的一些笔记 方便复习以及加强记忆 系列文章 JavaWeb学习笔记01 BS架构 Maven Tomcat Servlet JavaWeb学习笔记02 request和response Jav
  • 【三维语义分割】PointNet++ (二):模型结构详解

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 本节主要介绍Poin
  • 电机的堵转检测及处理

    基于L298N控制的电机的堵转检测及其处理 一 L298N原理 二 电机堵转检测 三 电机堵转处理 一 L298N原理 1 L298N datasheet 2 使用须知 工作电压高 最高工作电压可达46V 输出电流大 瞬间峰值电流可达3A
  • jeesite框架分析理解

    前文 jeesite代码生成器的使用 实例 报销表 地址 http blog csdn net m0 38021128 article details 68490920 前文中使用了jeesite框架的代码生成功能实现了一个小实例 但是实际