package com.test.system.curd;
import com.jfinal.aop.Before;
import com.jfinal.core.Const;
import com.jfinal.core.Controller;
import com.jfinal.ext.interceptor.SearchSql;
import com.jfinal.kit.JsonKit;
import com.jfinal.kit.StringKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.ehcache.CacheKit;
import com.xinan.utils.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* CommonController
*/
public class CurdController extends Controller {
private Logger log = LoggerFactory.getLogger(getClass());
public void index() {
String tbName = getPara( 0 );
String path = getPara( 1 );
String view = getPara( 2 );
if (buildView(tbName, "" )){
if (StringKit.notBlank(path) && StringKit.notBlank(view)) {
render(path + "/" + view + ".html" );
} else {
render( "/WEB-INF/views/common/curd.html" );
}
} else {
String msg = "该业务表还没有生成对应的增删改查配置,请先通知管理员进行配置!" ;
log.info(msg);
renderText(msg);
}
}
protected boolean buildView(String tbName, String fields){
CurdMeta curd = CurdMeta.dao.findByTableName(tbName);
if (curd != null ) {
List<TableBase> queryList = TableBase.dao.findByFields(tbName, curd.getQueryFields());
List<TableBase> listList = TableBase.dao.findByFields(tbName, curd.getListFields());
List<TableBase> cuList = TableBase.dao.findByFields(tbName, curd.getCuFields());
//根据编辑配置的外键关系,生成对应的下拉树组件url
List<Map<String, String>> fdsList = buildFieldsFk(cuList);
setAttr( "fdsList" , fdsList);
//根据查询配置的外键关系,生成对应的下拉树组件url
List<Map<String, String>> qFdsList = buildFieldsFk(queryList);
setAttr( "qFdsList" , qFdsList);
//如果字段关联有外键,则提取出其关联的外键集合,以便在前段进行翻译
for (TableBase t : listList) {
if (StringKit.notBlank(t.getFkTable()) && StringKit.notBlank(t.getFkId())
&& StringKit.notBlank(t.getFkName())) {
String sql = "select " ;
if (StringKit.notBlank(fields)){
sql += fields + "," ;
}
sql += t.getFkId() + " as id," + t.getFkName() + " as text from " + t.getFkTable();
if (StringKit.notBlank(t.getFkWhere())) {
sql += " where " + t.getFkWhere();
}
List<Record> recordList = Db.find(sql);
t.put( "data" , JsonKit.toJson(recordList));
}
}
//页面元素加载所需数据
setAttr( "query" , queryList);
setAttr( "list" , listList);
setAttr( "cu" , cuList);
setAttr( "tbName" , tbName);
return true ;
} else {
String msg = "该业务表还没有生成对应的增删改查配置,请先通知管理员进行配置!" ;
log.info(msg);
renderText(msg);
return false ;
}
}
/**
* 在增加了SearchSql拦截之后,就可以根据页面的配置信息
* 自动装配查询语句,并放入request中,可以通过getAttr(Const.SEARCH_SQL)函数获取到
* 根据实际需要自动组装到sql语句中
*/
@Before (SearchSql. class )
public void query() {
int pageNumber = getParaToInt( "page" );
int pageSize = getParaToInt( "rows" );
String tbName = getPara( 0 );
String sqlExp = "from " + tbName;
String where = getAttr(Const.SEARCH_SQL);
if (StringKit.notBlank(where)){
sqlExp += " where " + where;
}
//加入排序
String sort=getPara( "sort" );
String order= "" ;
if (StringKit.notBlank(sort)) {
order= " order by " +sort;
}
Page<Record> page = Db.paginate(pageNumber, pageSize, "select *" , sqlExp+order);
renderJson(page);
}
public void save() {
String tbName = getPara( 0 );
Record rcd = paraToRecord( "id" );
if (Db.save(tbName, rcd)) {
renderJson(Constants.SAVESUCCESS);
} else {
renderJson(Constants.SAVEFAILED);
}
}
public void update() {
String tbName = getPara( 0 );
Record rcd = paraToRecord( "" );
if (Db.update(tbName, rcd)) {
renderJson(Constants.EDITSUCCESS);
} else {
renderJson(Constants.EDITFAILED);
}
}
public void delete() {
String tbName = getPara( 0 );
int id = getParaToInt( 1 );
if (Db.deleteById(tbName, id)) {
renderJson(Constants.DELETESUCCESS);
} else {
renderJson(Constants.DELETEFAILED);
}
}
/**
* 临时解决方案,后续需要使用表结构处理
* @param excludeField
* @return
*/
protected Record paraToRecord(String excludeField) {
Map<String, String[]> map = getParaMap();
Record rcd = new Record();
for (Map.Entry<String, String[]> en : map.entrySet()) {
if (StringKit.isBlank(en.getKey()) || (excludeField.length() > 0 && excludeField.equalsIgnoreCase(en.getKey()))) {
continue ;
}
String[] paraValue = en.getValue();
Object value = StringKit.notBlank(paraValue[ 0 ])? paraValue[ 0 ] : null ; //如果数据为空,则直接赋值null
rcd.set(en.getKey(), value);
}
String userName = getAttr(Constants.USER_NAME);
rcd.set( "optname" ,userName);
return rcd;
}
/**
* 根据配置的外键关系,生成对应的下拉树组件url
*
* @param list
* @return
*/
protected List<Map<String, String>> buildFieldsFk(List<TableBase> list) {
List<Map<String, String>> fdsList = new ArrayList<Map<String, String>>();
for (TableBase t : list) {
if (StringKit.notBlank(t.getFkTable()) && StringKit.notBlank(t.getFkId())
&& StringKit.notBlank(t.getFkName())) {
t.put( "cmb" , true );
String fields = t.getFkId() + " as id," + t.getFkName() + " as text" ;
String url = "common/comboTree" ;
if (StringKit.notBlank(t.getFkWhere())) {
url += "/" + t.getFkWhere();
}
url += "?table=" + t.getFkTable() + "&fields=" + fields;
url += "&pid=" + t.getFkPid() + "&pidStart=0&id=id" ;
Map<String, String> map = new HashMap<String, String>();
map.put( "id" , t.getFieldName());
map.put( "url" , url);
fdsList.add(map);
} else {
t.put( "cmb" , false );
}
}
return fdsList;
}
}
|