Collect from 网页模板

JEECG 快速开发

开源界真正的企业级快速开发平台,开发效率行业第一,2012年开源至今积粉无数,陆续荣获2013十大开源优秀项目,CSDN专家访谈,ITeye专家访谈、中国最火开源项目,在开源中国连续5年TOP10..

What is Jeecg?

JEECG是一款基于代码生成器的J2EE快速开发平台,开源界“小普元”超越传统商业企业级开发平台。引领新的开发模式(Online Coding模式(自定义表单) - > 代码生成器模式 - > 手工MERGE智能开发), 可以帮助解决Java项目80%的重复工作,让开发更多关注业务逻辑。既能快速提高开发效率,帮助公司节省人力成本,同时又不失灵活性。具备:表单配置能力(无需编码)、移动配置能力、工作流配置能力、报表配置能力(支持移动端)、插件开发能力(可插拔)

代码生成器

代码生成器的出现,让开发效率很高,支持单表模型和一对多、一对一、树数据模型,增删改查功能自动生成,不需要写任何代码,直接使用.

Online在线开发

Online Coding,通过在线配置实现一个表模型的增删改查功能,NO代码,支持单表、一对多、一对一、树等,支持用户自定义表单皮肤 .

在线报表设计

无需编码,通过在线配置方式,实现曲线图,柱状图,数据等报表,提供三种在线报表配置,数据报表、图表、移动报表(一次配置七种展示风格).

UI标签库

针对EasyUI采用JSP标签封装,实现数据列表,表单校验,Popup,Tab、树等各种控件,简化JS开发,方便维护开发高效.

查询过滤器

无需编码, 通过配置实现查询区域,平台SQL智能化生成,支持多种匹配方式|全匹配/模糊查询/包含查询/不匹配查询.

接口能力

专业接口对接机制,统一采用restful接口方式,集成swagger-ui在线接口文档,Jwt token安全验证,方便客户端对接.

自定义表单

支持自定义表单布局,支持单表、列表、Select\Radio\Checkbox\PopUP\Date等特殊控件.

插件式开发

Jeecg-p3 插件开发,业务功能组件以插件方式集成平台,可插拔也可以单独部署,官方提供插件下载.

Excel简易工具类

jeasypoi傻瓜版简易Excel导入导出,支持单表导出和一对多表模式导出,生成的代码自带导入导出功能.

强大的权限机制

强大的权限能力,菜单级,按钮级,表单级,数据行级(精细化权限控制,控制到行级,列级,表单字段级,实现不同人看不同数据,不同人对同一个页面操作不同字段).

工作流配置能力

在线流程定义,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂接,业务流转,流程监控,流程跟踪,流程委托等.

其他能力

另外平台支持多数据源、国际化、消息中间件、微服务、首页适配可切换、移动OA、二级管理员、常用共通封装等等。。

技术特点

Get Started

JSP

UI标签库: jeecg针对页面easyui的使用做了标签封装,简化页面JS的编写.

下面是一个数据列表页面的代码效果,如果采用原生态写法一个列表页面大概需要3000行代码,通过封装后从3000变成30行,极大降低代码量,提升了开发效率,同时便于维护.

  • 特点: 简洁可读性高,方便维护,可扩展
  • Languages: JSP标签、EasyUI

	 <t:datagrid name="jeecgDemoList" checkbox="true" sortName="birthday,name" pagination="true" fitColumns="false" title="jeecg_demo" 
  actionUrl="jeecgListDemoController.do?datagrid" idField="id" fit="true" queryMode="single" filter="true">
    <t:dgCol title="id" field="id" hidden="true" queryMode="group" width="120"></t:dgCol>
    <t:dgCol title="名称" field="name" query="true" autocomplete="true" width="120"></t:dgCol>
    <t:dgCol title="生日" hidden="true" field="birthday" formatter="yyyy-MM-dd" queryMode="group" width="120"></t:dgCol>
    <t:dgCol title="部门" field="depId" query="true" queryMode="single" dictionary="t_s_depart,id,departname" width="120"></t:dgCol>
    <t:dgCol title="性别" field="sex"  query="true" showMode="radio" dictionary="sex" width="120" extendParams="styler:fmtype"></t:dgCol>
    <t:dgCol title="电话" field="phone" queryMode="group" width="120"></t:dgCol>
    <t:dgCol title="工资" field="salary" query="true" queryMode="group" width="120"></t:dgCol>
   <t:dgDelOpt title="删除" url="jeecgListDemoController.do?doDel&id={id}" urlclass="ace_button" urlfont="fa-trash-o"/>
   <t:dgFunOpt exp="status#eq#N" title="审核" funname="szqm(id)" urlclass="ace_button" urlfont="fa-check" />
   <t:dgToolBar title="录入" icon="icon-add" url="jeecgListDemoController.do?goAdd" funname="add" width="770" height="500"></t:dgToolBar>
   <t:dgToolBar title="编辑" icon="icon-edit" url="jeecgListDemoController.do?goUpdate" funname="update" width="770"></t:dgToolBar>
   <t:dgToolBar title="查看" icon="icon-search" url="jeecgListDemoController.do?goUpdate" funname="detail" width="770"></t:dgToolBar>
   <t:dgToolBar title="导入" icon="icon-put" funname="ImportXls"></t:dgToolBar>
   <t:dgToolBar title="导出" icon="icon-putout" funname="ExportXls"></t:dgToolBar>
  </t:datagrid>
                     

JAVA

MVC层采用的是SpringMVC框架,采用面向声明的开发模式,基于泛型方式编写极少代码即可实现复杂的功能,再配合Online Coding在线开发与代码生成器,将J2EE的开发效率提高6倍以上,可以将代码减少80%以上,代码生成器的使用更让代码非常规范.

    
    /**   
 * @Title: Controller  
 * @Description: jeecg_demo
 * @author onlineGenerator
 * @date 2017-03-22 20:11:23
 * @version V1.0   
 *
 */
@Controller
@RequestMapping("/jeecgListDemoController")
public class JeecgListDemoController extends BaseController {

	@Autowired
	private JeecgDemoServiceI jeecgDemoService;
	
	/**
	 * jeecg_demo列表 页面跳转
	 * 
	 * @return
	 */
	@RequestMapping(params = "list")
	public ModelAndView list(HttpServletRequest request) {
		return new ModelAndView("com/jeecg/demo/jeecgDemoList");
	}
	
	/**
	 * 删除jeecg_demo
	 * 
	 * @return
	 */
	@RequestMapping(params = "doDel")
	@ResponseBody
	public AjaxJson doDel(JeecgDemoEntity jeecgDemo, HttpServletRequest request) {
		String message = null;
		AjaxJson j = new AjaxJson();
		jeecgDemo = systemService.getEntity(JeecgDemoEntity.class, jeecgDemo.getId());
		message = "删除成功";
		try{
			jeecgDemoService.delete(jeecgDemo);
			systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO);
		}catch(Exception e){
			e.printStackTrace();
			message = "删除失败";
			throw new BusinessException(e.getMessage());
		}
		j.setMsg(message);
		return j;
	}
	
	/**
	 * 批量删除jeecg_demo
	 * 
	 * @return
	 */
	 @RequestMapping(params = "doBatchDel")
	@ResponseBody
	public AjaxJson doBatchDel(String ids,HttpServletRequest request){
		String message = null;
		AjaxJson j = new AjaxJson();
		message = "删除成功";
		try{
			for(String id:ids.split(",")){
				JeecgDemoEntity jeecgDemo = systemService.getEntity(JeecgDemoEntity.class, 
				id
				);
				jeecgDemoService.delete(jeecgDemo);
				systemService.addLog(message, Globals.Log_Type_DEL, Globals.Log_Leavel_INFO);
			}
		}catch(Exception e){
			e.printStackTrace();
			message = "删除失败";
			throw new BusinessException(e.getMessage());
		}
		j.setMsg(message);
		return j;
	}


	/**
	 * 添加jeecg_demo
	 * 
	 * @param ids
	 * @return
	 */
	@RequestMapping(params = "doAdd")
	@ResponseBody
	public AjaxJson doAdd(JeecgDemoEntity jeecgDemo, HttpServletRequest request) {
		String message = null;
		AjaxJson j = new AjaxJson();
		message = "添加成功";
		try{
			jeecgDemoService.save(jeecgDemo);
			systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
		}catch(Exception e){
			e.printStackTrace();
			message = "添加失败";
			throw new BusinessException(e.getMessage());
		}
		j.setMsg(message);
		return j;
	}
	
	/**
	 * 更新jeecg_demo
	 * 
	 * @param ids
	 * @return
	 */
	@RequestMapping(params = "doUpdate")
	@ResponseBody
	public AjaxJson doUpdate(JeecgDemoEntity jeecgDemo, HttpServletRequest request) {
		String message = null;
		AjaxJson j = new AjaxJson();
		message = "更新成功";
		JeecgDemoEntity t = jeecgDemoService.get(JeecgDemoEntity.class, jeecgDemo.getId());
		try {
			MyBeanUtils.copyBeanNotNull2Bean(jeecgDemo, t);
			jeecgDemoService.saveOrUpdate(t);
			systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO);
		} catch (Exception e) {
			e.printStackTrace();
			message = "更新失败";
			throw new BusinessException(e.getMessage());
		}
		j.setMsg(message);
		return j;
	}
	

	/**
	 * jeecg_demo新增页面跳转
	 * 
	 * @return
	 */
	@RequestMapping(params = "goAdd")
	public ModelAndView goAdd(JeecgDemoEntity jeecgDemo, HttpServletRequest req) {
		if (StringUtil.isNotEmpty(jeecgDemo.getId())) {
			jeecgDemo = jeecgDemoService.getEntity(JeecgDemoEntity.class, jeecgDemo.getId());
			req.setAttribute("jeecgDemoPage", jeecgDemo);
		}
		return new ModelAndView("com/jeecg/demo/jeecgDemo-add");
	}
	/**
	 * jeecg_demo编辑页面跳转
	 * 
	 * @return
	 */
	@RequestMapping(params = "goUpdate")
	public ModelAndView goUpdate(JeecgDemoEntity jeecgDemo, HttpServletRequest req) {
		if (StringUtil.isNotEmpty(jeecgDemo.getId())) {
			jeecgDemo = jeecgDemoService.getEntity(JeecgDemoEntity.class, jeecgDemo.getId());
			req.setAttribute("jeecgDemoPage", jeecgDemo);
		}
		return new ModelAndView("com/jeecg/demo/jeecgDemo-update");
	}
    

SQL

JEECG的持久层采用的是Hibernate,建议大家单表操作采用Hibernate实现,复杂SQL采用minidao;Hibernate在复杂SQL情况执行效率不高,存在性能不足问题,所以我们自主研发轻量级持久层Minidao解决这个问题, minidao拥有mybatis一样的能力,同时比mybatis更灵活,性能更高.



/**
 * 描述:雇员
 * @author:www.jeecg.org
 * @version:1.0
 */
@Repository
public interface EmployeeDao {
	
	/**
	 * 查询返回Java对象
	 * @param id
	 * @return
	 */
	@Sql("select * from employee where id = :id")
	Employee get(@Param("id") String id);
	
	
	/**
	 * 修改数据
	 * @param employee
	 * @return
	 */
	int update(@Param("employee") Employee employee);
	
	/**
	 * 插入数据
	 * @param employee
	 */
	void insert(@Param("employee") Employee employee);
	

	/**
	 * 通用分页方法,支持(oracle、mysql、SqlServer、postgresql)
	 * @param employee
	 * @param page
	 * @param rows
	 * @return
	 */
	@ResultType(Employee.class)
	public MiniDaoPage getAll(@Param("employee") Employee employee,@Param("page")  int page,@Param("rows") int rows);
	
	/**
	 * 删除数据
	 * @param employee
	 */
	@Sql("delete from employee where id = :id")
	public void delete(@Param("id") String id);
	
	/**
	 * 返回List类型,全部数据
	 * @param employee
	 * @return
	 */
	@Arguments({ "employee"})
	@Sql("select * from employee")
	List> getAll(Employee employee);
	
	/**
	 * 返回Map类型,支持多个参数
	 * @param empno
	 * @param name
	 * @return
	 */
	@Sql("select * from employee where empno = :empno and  name = :name")
	Map getMap(@Param("empno") String empno,@Param("name")String name);
	
	/**
	 * 查询分页数量
	 * @return
	 */
	@Sql("select count(*) from employee")
	Integer getCount();
}
                    

SELECT * FROM employee e where 1=1
	<#if ( employee.empno )?? && employee.empno ?length gt 0>
	    /* 雇员编号 */
		and e.empno = :employee.empno
	
	<#if ( employee.name )?? && employee.name ?length gt 0>
	    /* 雇员名 模糊查询 */
		and e.NAME  like CONCAT('%', :employee.name ,'%') 
	
	<#if ( employee.age )?? && employee.age ?length gt 0>
	    /* 年龄 */
		and e.AGE = :employee.age
	
	<#if ( employee.birthday )??>
	    /* 生日 */
		and e.BIRTHDAY = :employee.birthday
	
	<#if ( employee.salary )?? && employee.salary ?length gt 0>
	    /* 工资 */
		and e.SALARY = :employee.salary
	
	<#if ( employee.createBy )?? && employee.createBy ?length gt 0>
	    /* create_by */
		and e.create_by = :employee.createBy
	
	<#if employee.createDate ?exists>
	    /* create_date */
		and e.create_date >= :employee.createDate
	
	<#if ( employee.updateBy )?? && employee.updateBy ?length gt 0>
	    /* update_by */
		and e.update_by = :employee.updateBy
	
	<#if ( employee.updateDate )??>
	    /* update_date */
		and e.update_date = :employee.updateDate
	

					 

Full Documentation

更详细的学习资料请进入JEECG GIT下载地址获取,同时官方博客也提供了很多技术资料视频教程等.

More on GitHub

License

JEECG 快速开发平台是由 张代浩 发起的开源项目。目前成立了公司组建了JEECG开源社区,有固定团队成员维护,JEECG开源版本源码发布在Github和开源中国上面,完全开源没有任何限制 采用 Creative Commons Attribution 3.0 License (CC BY 3.0)协议

[商业资讯]: JEECG 目前分开源版本和企业版本两套程序,企业版是针对企业用户提供,功能更多更强大,同时官方提供专业的技术支持。更多详细信息可以点击官网查看 北京国炬信息技术有限公司 如果你觉得jeecg好用,有项目需要采用jeecg外包,也可以联系我们,我们会帮助你用更短的时间交付项目,另外我们还有更多产品比如微信产品、H5活动产品等等 查看详情 .

如果你想加入我们,参与开源或者进入我们公司这个大家庭,请发送邮件到 hr@jeecg.org. )

联系我们

你在Jeecg使用过程中,遇到任何问题可以联系到我们,
请在论坛问题版块发帖,也可以加入我们官方QQ群参与交流互动.

官方技术支持联系方式?

官方QQ群: ⑤293658367、③289782002、②106838471(满)

商务 QQ: 3102411850、418799587

商务热线: 18611788525

客服电话: 010-64808099

官方邮箱: jeecg@sina.com

[Jeecg提供更多插件]: 目前jeecg已经陆续推出:我的邮箱、在线聊天插件,如果你需要更多插件,请在这里下载 JEECG云插件中心

JEECG 开源社区
北京国炬信息技术有限公司

联系我们