完善表单功能

This commit is contained in:
wanggeng 2022-04-16 09:26:12 +08:00
parent b81b09432f
commit cd7a73a445
39 changed files with 1606 additions and 585 deletions

View File

@ -46,6 +46,17 @@ public class FormController extends DefaultBaseController {
return new SuccessResult();
}
@ApiOperation(value = "表单删除(物理删除)", notes = "通过id删除物理删除表单接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "表单ID列表用下划线分隔", paramType = "path", example = "1_2_3")
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@DeleteMapping("delete/{id}")
public SuccessResult delete(@PathVariable("id") String id) {
formService.delete(Arrays.asList(id));
return new SuccessResult();
}
@ApiOperation(value = "修改表单状态", notes = "修改表单状态接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "formId", value = "表单ID", paramType = "path"),

View File

@ -1,6 +1,7 @@
package ink.wgink.module.form.controller.api.design;
import ink.wgink.annotation.CheckRequestBodyAnnotation;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.module.form.pojo.vos.design.FormDesignVO;
@ -30,6 +31,7 @@ public class FormDesignController extends DefaultBaseController {
@ApiOperation(value = "保存表单", notes = "保存表单接口")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("save")
@CheckRequestBodyAnnotation
public SuccessResult save(@RequestBody FormDesignVO formDesignVO) throws IOException {
formDesignService.save(formDesignVO);
return new SuccessResult();

View File

@ -68,6 +68,11 @@ public class FormReportController extends DefaultBaseController {
return formReportService.listPage(formCode, formVersion, page);
}
@GetMapping("list-show-field/code/{formCode}/version/{formVersion}")
public List<String> listShowField(@PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion) {
return formReportService.listShowField(formCode, formVersion);
}
private void checkParams(Map<String, Object> body) {
if (body.isEmpty()) {
throw new ParamsException("提交内容不能为空");

View File

@ -0,0 +1,85 @@
package ink.wgink.module.form.controller.app.api.report;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.exceptions.ParamsException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.module.form.service.report.IFormReportService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.result.SuccessResult;
import ink.wgink.pojo.result.SuccessResultList;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @ClassName: FormReportAppController
* @Description: 表单上报
* @Author: wanggeng
* @Date: 2022/3/10 7:29 PM
* @Version: 1.0
*/
@Api(tags = ISystemConstant.API_TAGS_APP_PREFIX + "表单")
@RestController
@RequestMapping(ISystemConstant.APP_PREFIX + "/form-report")
public class FormReportAppController extends DefaultBaseController {
@Autowired
private IFormReportService formReportService;
@PostMapping("save/code/{formCode}/version/{formVersion}")
public SuccessResult save(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @RequestBody Map<String, Object> params) {
checkParams(params);
formReportService.saveByToken(token, formCode, formVersion, params);
return new SuccessResult();
}
@DeleteMapping("remove/code/{formCode}/version/{formVersion}/uids/{uids}")
public SuccessResult remove(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @PathVariable("uids") String uids) {
formReportService.remove(formCode, formVersion, Arrays.asList(uids.split("\\_")));
return new SuccessResult();
}
@PutMapping("update/code/{formCode}/version/{formVersion}/uid/{uid}")
public SuccessResult update(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @PathVariable("uid") String uid, @RequestBody Map<String, Object> params) {
checkParams(params);
formReportService.updateByToken(token, formCode, formVersion, uid, params);
return new SuccessResult();
}
@GetMapping("get/code/{formCode}/version/{formVersion}/uid/{uid}")
public Map<String, Object> get(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, @PathVariable("uid") String uid) {
return formReportService.get(formCode, formVersion, uid);
}
@GetMapping("list/code/{formCode}/version/{formVersion}")
public List<Map<String, Object>> list(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion) {
Map<String, Object> params = requestParams();
return formReportService.list(formCode, formVersion, params);
}
@GetMapping("listpage/code/{formCode}/version/{formVersion}")
public SuccessResultList<List<Map<String, Object>>> listPage(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion, ListPage page) {
Map<String, Object> params = requestParams();
page.setParams(params);
return formReportService.listPage(formCode, formVersion, page);
}
@GetMapping("list-show-field/code/{formCode}/version/{formVersion}")
public List<String> listShowField(@RequestHeader("token") String token, @PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion) {
return formReportService.listShowField(formCode, formVersion);
}
private void checkParams(Map<String, Object> body) {
if (body.isEmpty()) {
throw new ParamsException("提交内容不能为空");
}
for (Map.Entry<String, Object> kv : body.entrySet()) {
String key = kv.getKey();
}
}
}

View File

@ -17,6 +17,12 @@ public interface IFormDao extends IInitBaseTable {
void createDynamicForm(String createTableSQL) throws SaveException;
void deleteDynamicForm(String deleteTableSQL) throws RemoveException;
void updateDynamicFormField(String alterFieldSQL) throws UpdateException;
void deleteDynamicFormField(String alterFieldSQL) throws RemoveException;
void save(Map<String, Object> params) throws SaveException;
void delete(Map<String, Object> params) throws RemoveException;
@ -46,4 +52,5 @@ public interface IFormDao extends IInitBaseTable {
String getAppUpdatePageCodeByCodeAndVersion(Map<String, Object> params) throws SearchException;
String getAppShowPageCodeByCodeAndVersion(Map<String, Object> params) throws SearchException;
}

View File

@ -31,4 +31,5 @@ public interface IFormReportDao {
List<Map<String, Object>> list(Map<String, Object> queryParams) throws SearchException;
Integer countByTableName(String tableName) throws SearchException;
}

View File

@ -8,7 +8,8 @@ package ink.wgink.module.form.enums.design;
* @Version: 1.0
*/
public enum FormTypeEnum {
DEFAULT("default", "默认");
DEFAULT("default", "默认"),
OA("oa", "OA");
private String value;
private String text;

View File

@ -2,6 +2,10 @@ package ink.wgink.module.form.pojo.vos.design;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import ink.wgink.annotation.CheckEmptyAnnotation;
import ink.wgink.annotation.CheckListAnnotation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.ArrayList;
import java.util.List;
@ -12,13 +16,26 @@ import java.util.List;
* @Date: 2022/3/8 20:21
* @Version: 1.0
**/
@ApiModel
public class FormDesignVO {
@ApiModelProperty(name = "formCode", value = "表单编码")
private String formCode;
@ApiModelProperty(name = "formName", value = "表单名称")
@CheckEmptyAnnotation(name = "表单名称")
private String formName;
@ApiModelProperty(name = "formSummary", value = "表单描述")
@CheckEmptyAnnotation(name = "表单描述")
private String formSummary;
@ApiModelProperty(name = "formVersion", value = "表单版本")
private Integer formVersion;
@ApiModelProperty(name = "mainTitleTpl", value = "主标题模板")
private String mainTitleTpl;
@ApiModelProperty(name = "formType", value = "表单类型")
@CheckEmptyAnnotation(name = "表单类型")
private String formType;
private JSONArray data;
@CheckListAnnotation(name = "fields", value = "字段列表")
private List<Field> fields;
public String getFormCode() {
@ -53,6 +70,22 @@ public class FormDesignVO {
this.formVersion = formVersion;
}
public String getMainTitleTpl() {
return mainTitleTpl == null ? "" : mainTitleTpl.trim();
}
public void setMainTitleTpl(String mainTitleTpl) {
this.mainTitleTpl = mainTitleTpl;
}
public String getFormType() {
return formType == null ? "" : formType.trim();
}
public void setFormType(String formType) {
this.formType = formType;
}
public JSONArray getData() {
return data;
}

View File

@ -12,6 +12,25 @@ import java.io.IOException;
**/
public interface IFormDesignService {
String FIELD_MAIN_TITLE = "MAIN_TITLE";
String FIELD_ID = "id";
String FIELD_UID = "uid";
String FIELD_UIDS = "uids";
String PROCESS_INSTANCE_ID = "process_instance_id";
String FIELD_GMT_CREATE = "gmt_create";
String FIELD_CREATOR = "creator";
String FIELD_GMT_MODIFIED = "gmt_modified";
String FIELD_MODIFIER = "modifier";
String FIELD_IS_DELETE = "is_delete";
String PARAM_FORM_CODE = "formCode";
String PARAM_FORM_VERSION = "formVersion";
String PARAM_QUERY_LIST = "queryList";
String PARAM_LIST_SHOW_FIELD = "listShowField";
String PARAM_PROCESS_INSTANCE_ID = "processInstanceId";
String PARAM_INSERTS = "inserts";
String PARAM_VALUES = "values";
String PARAM_KV_LIST = "kvList";
/**
* 保存表单
*

View File

@ -126,8 +126,9 @@ public interface IFormFieldService {
/**
* 字段名列表
*
* @param formId 表单ID
* @param listShow 列表显示状态
* @return
*/
List<String> listFieldNameByListShow(String listShow);
List<String> listFieldNameByFormIdAndListShow(String formId, String listShow);
}

View File

@ -18,6 +18,18 @@ public interface IFormService {
*/
void createDynamicForm(String createTableSQL);
void deleteTable(String tableName);
void deleteDynamicForm(String deleteTableSQL);
void updateTableField(String tableName, String oldField, String newField, String newFieldType);
void updateDynamicFormField(String alterFieldSQL);
void deleteTableField(String tableName, String field);
void deleteDynamicFormField(String alterFieldSQL);
/**
* 新增
*

View File

@ -32,6 +32,7 @@ import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -87,7 +88,7 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe
formVO.setFormCode(formCode);
formVO.setFormSummary(formDesignVO.getFormSummary());
formVO.setFormTableName(tableName);
formVO.setFormType(FormTypeEnum.DEFAULT.getValue());
formVO.setFormType(formDesignVO.getFormType());
formVO.setFormStatus(FormStatusEnum.ACTIVE.getValue());
formVO.setFormVersion(version);
formVO.setFormSourceData(JSON.toJSONString(formDesignVO.getData()));
@ -101,13 +102,13 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe
Map<String, Object> model = getHashMap(4);
model.put("fields", formDesignVO.getFields());
String savePageCode = getTemplateCode("/page/web/form-save.ftl", model);
formVO.setSavePageCode(savePageCode);
// formVO.setUpdatePageCode(formDesignVO.getUpdatePageCode());
// formVO.setShowPageCode(formDesignVO.getShowPageCode());
// formVO.setAppSavePageCode(formDesignVO.getAppSavePageCode());
// formVO.setAppUpdatePageCode(formDesignVO.getAppUpdatePageCode());
// formVO.setAppShowPageCode(formDesignVO.getAppShowPageCode());
formVO.setSavePageCode(getSavePageCode(model, formDesignVO.getFormType()));
formVO.setUpdatePageCode(getUpdatePageCode(model, formDesignVO.getFormType()));
formVO.setShowPageCode(getShowPageCode(model, formDesignVO.getFormType()));
formVO.setAppSavePageCode(getAppSavePageCode(model, formDesignVO.getFormType()));
formVO.setAppUpdatePageCode(getAppUpdatePageCode(model, formDesignVO.getFormType()));
formVO.setAppShowPageCode(getAppShowPageCode(model, formDesignVO.getFormType()));
String formId = formService.saveReturnId(formVO);
LOG.debug("保存表单字段");
@ -121,6 +122,150 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe
formService.createDynamicForm(createTableSQL);
}
/**
* 新增页面模板
*
* @param model
* @return
* @throws IOException
*/
private String getSavePageCode(Map<String, Object> model, String formType) throws IOException {
if (StringUtils.equals(FormTypeEnum.DEFAULT.getValue(), formType)) {
model.put(ISystemConstant.FORM_COMMIT_URL, "api/form-report/save/code/{formCode}/version/{formVersion}");
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) {
model.put(ISystemConstant.FORM_COMMIT_URL, "api/oa-form-report/save/definition-id/{processDefinitionId}/code/{formCode}/version/{formVersion}");
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"}));
} else {
throw new ParamsException("表单类型错误");
}
return getTemplateCode("/page/web/form-save.ftl", model);
}
/**
* 更新页面模板
*
* @param model
* @param formType
* @return
* @throws IOException
*/
private String getUpdatePageCode(Map<String, Object> model, String formType) throws IOException {
if (StringUtils.equals(FormTypeEnum.DEFAULT.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_INIT_URL, "api/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_URL, "api/form-report/save/code/{formCode}/version/{formVersion}");
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"}));
model.put(ISystemConstant.FORM_INIT_URL, "api/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_URL, "api/oa-form-report/update/task-id/{taskId}/code/{formCode}/version/{formVersion}/is-need-claim/{isNeedClaim}/uid/{uid}");
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"}));
} else {
throw new ParamsException("表单类型错误");
}
return getTemplateCode("/page/web/form-update.ftl", model);
}
/**
* 展示页面模板
*
* @param model
* @param formType
* @return
* @throws IOException
*/
private String getShowPageCode(Map<String, Object> model, String formType) throws IOException {
if (StringUtils.equals(FormTypeEnum.DEFAULT.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_INIT_URL, "api/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_INIT_URL, "api/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else {
throw new ParamsException("表单类型错误");
}
return getTemplateCode("/page/web/form-show.ftl", model);
}
/**
* app新增页面模板
*
* @param model
* @return
* @throws IOException
*/
private String getAppSavePageCode(Map<String, Object> model, String formType) throws IOException {
if (StringUtils.equals(FormTypeEnum.DEFAULT.getValue(), formType)) {
model.put(ISystemConstant.FORM_COMMIT_URL, "app/form-report/save/code/{formCode}/version/{formVersion}");
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) {
model.put(ISystemConstant.FORM_COMMIT_URL, "app/oa-form-report/save/definition-id/{processDefinitionId}/code/{formCode}/version/{formVersion}");
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"}));
} else {
throw new ParamsException("表单类型错误");
}
return getTemplateCode("/page/app/app-form-save.ftl", model);
}
/**
* app更新页面模板
*
* @param model
* @param formType
* @return
* @throws IOException
*/
private String getAppUpdatePageCode(Map<String, Object> model, String formType) throws IOException {
if (StringUtils.equals(FormTypeEnum.DEFAULT.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_INIT_URL, "app/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_URL, "app/form-report/save/code/{formCode}/version/{formVersion}");
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"}));
model.put(ISystemConstant.FORM_INIT_URL, "app/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_COMMIT_URL, "app/oa-form-report/update/task-id/{taskId}/code/{formCode}/version/{formVersion}/is-need-claim/{isNeedClaim}/uid/{uid}");
model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"}));
} else {
throw new ParamsException("表单类型错误");
}
return getTemplateCode("/page/app/app-form-update.ftl", model);
}
/**
* app展示页面模板
*
* @param model
* @param formType
* @return
* @throws IOException
*/
private String getAppShowPageCode(Map<String, Object> model, String formType) throws IOException {
if (StringUtils.equals(FormTypeEnum.DEFAULT.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_INIT_URL, "app/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) {
model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
model.put(ISystemConstant.FORM_INIT_URL, "app/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}");
model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"}));
} else {
throw new ParamsException("表单类型错误");
}
return getTemplateCode("/page/app/app-form-show.ftl", model);
}
/**
* 建表SQL
*
@ -130,18 +275,19 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe
*/
private String getCreateTableSQL(String tableName, String formName, List<FormFieldVO> formFieldVOs) {
StringBuffer createTableSB = new StringBuffer("CREATE TABLE `").append(tableName).append("`(");
createTableSB.append("`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,");
createTableSB.append("`uid` char(36) NOT NULL,");
createTableSB.append("`process_instance_id` char(36) DEFAULT NULL,");
createTableSB.append("`" + IFormDesignService.FIELD_ID + "` bigint(20) unsigned NOT NULL AUTO_INCREMENT,");
createTableSB.append("`" + IFormDesignService.FIELD_UID + "` char(36) NOT NULL,");
createTableSB.append("`" + IFormDesignService.PROCESS_INSTANCE_ID + "` char(36) DEFAULT NULL,");
createTableSB.append("`" + IFormDesignService.FIELD_MAIN_TITLE + "` varchar(500),");
for (FormFieldVO formFieldVO : formFieldVOs) {
createTableSB.append("`").append(formFieldVO.getFieldName()).append("` ").append(formFieldVO.getFieldType()).append(" NOT NULL COMMENT '").append(formFieldVO.getFieldExplain()).append("',");
}
createTableSB.append("`creator` char(36) DEFAULT NULL,");
createTableSB.append("`gmt_create` datetime DEFAULT NULL,");
createTableSB.append("`modifier` char(36) DEFAULT NULL,");
createTableSB.append("`gmt_modified` datetime DEFAULT NULL,");
createTableSB.append("`is_delete` int(2) DEFAULT '0',");
createTableSB.append("PRIMARY KEY (`id`)");
createTableSB.append("`" + IFormDesignService.FIELD_CREATOR + "` char(36) DEFAULT NULL,");
createTableSB.append("`" + IFormDesignService.FIELD_GMT_CREATE + "` datetime DEFAULT NULL,");
createTableSB.append("`" + IFormDesignService.FIELD_MODIFIER + "` char(36) DEFAULT NULL,");
createTableSB.append("`" + IFormDesignService.FIELD_GMT_MODIFIED + "` datetime DEFAULT NULL,");
createTableSB.append("`" + IFormDesignService.FIELD_IS_DELETE + "` int(2) DEFAULT '0',");
createTableSB.append("PRIMARY KEY (`" + IFormDesignService.FIELD_ID + "`)");
createTableSB.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='").append(formName).append("';");
return createTableSB.toString();
}

View File

@ -121,8 +121,9 @@ public class FormFieldServiceImpl extends DefaultBaseService implements IFormFie
}
@Override
public List<String> listFieldNameByListShow(String listShow) {
public List<String> listFieldNameByFormIdAndListShow(String formId, String listShow) {
Map<String, Object> params = getHashMap(2);
params.put("formId", formId);
params.put("listShow", listShow);
return listFieldName(params);
}

View File

@ -4,11 +4,13 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.ParamsException;
import ink.wgink.exceptions.RemoveException;
import ink.wgink.module.form.dao.design.IFormDao;
import ink.wgink.module.form.pojo.dtos.design.FormDTO;
import ink.wgink.module.form.pojo.pos.design.FormPO;
import ink.wgink.module.form.pojo.vos.design.FormVO;
import ink.wgink.module.form.service.design.IFormService;
import ink.wgink.module.form.service.report.IFormReportService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.util.UUIDUtil;
@ -24,12 +26,55 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService
@Autowired
private IFormDao formDao;
@Autowired
private IFormReportService formReportService;
@Override
public void createDynamicForm(String createTableSQL) {
formDao.createDynamicForm(createTableSQL);
}
@Override
public void deleteTable(String tableName) {
StringBuffer sqlSB = new StringBuffer("DROP TABLE `").append(tableName).append("`;");
deleteDynamicForm(sqlSB.toString());
}
@Override
public void deleteDynamicForm(String deleteTableSQL) {
formDao.deleteDynamicForm(deleteTableSQL);
}
@Override
public void updateTableField(String tableName, String oldField, String newField, String newFieldType) {
StringBuffer sqlSB = new StringBuffer("ALTER TABLE");
sqlSB.append(" `").append(tableName).append("`");
sqlSB.append(" CHANGE");
sqlSB.append(" `").append(oldField).append("`");
sqlSB.append(" `").append(newField).append("`");
sqlSB.append(newFieldType).append(";");
updateDynamicFormField(sqlSB.toString());
}
@Override
public void updateDynamicFormField(String alterFieldSQL) {
formDao.updateDynamicFormField(alterFieldSQL);
}
@Override
public void deleteTableField(String tableName, String field) {
StringBuffer sqlSB = new StringBuffer("ALTER TABLE");
sqlSB.append(" `").append(tableName).append("`");
sqlSB.append(" DROP");
sqlSB.append(" `").append(field).append("`");
deleteDynamicFormField(sqlSB.toString());
}
@Override
public void deleteDynamicFormField(String alterFieldSQL) {
formDao.deleteDynamicFormField(alterFieldSQL);
}
@Override
public void save(FormVO formVO) {
saveReturnId(formVO);
@ -51,6 +96,8 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService
@Override
public void delete(List<String> ids) {
// 判断表单是否有数据有数据不能删除
deleteTable(ids);
Map<String, Object> params = getHashMap(2);
params.put("formIds", ids);
formDao.delete(params);
@ -58,11 +105,23 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService
@Override
public void remove(List<String> ids) {
// 逻辑删除不删除表
Map<String, Object> params = getHashMap(2);
params.put("formIds", ids);
formDao.remove(params);
}
private void deleteTable(List<String> ids) {
List<FormDTO> formDTOs = listByIds(ids);
for (FormDTO formDTO : formDTOs) {
Integer count = formReportService.count(formDTO.getFormTableName());
if (count > 0) {
throw new RemoveException(formDTO.getFormTableName() + "表中存在数据,不能删除");
}
deleteTable(formDTO.getFormTableName());
}
}
@Override
public void update(String formId, FormVO formVO) {
Map<String, Object> params = HashMapUtil.beanToMap(formVO);

View File

@ -27,14 +27,14 @@ public interface IFormReportRouteService {
/**
* 新增页面
*
* @param formCode
* @param formVersion
* @param httpSession
* @param httpServletRequest
* @param httpServletResponse
* @param model
*/
void save(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> modal);
void save(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> model);
/**
* 修改页面
@ -44,7 +44,7 @@ public interface IFormReportRouteService {
* @param httpSession
* @param httpServletRequest
* @param httpServletResponse
* @param modal
* @param model
*/
void update(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse);
@ -56,9 +56,9 @@ public interface IFormReportRouteService {
* @param httpSession
* @param httpServletRequest
* @param httpServletResponse
* @param modal
* @param model
*/
void update(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> modal);
void update(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> model);
/**
* 详情页面
@ -79,9 +79,9 @@ public interface IFormReportRouteService {
* @param httpSession
* @param httpServletRequest
* @param httpServletResponse
* @param modal
* @param model
*/
void show(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> modal);
void show(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> model);
/**
* APP新增页面
@ -102,9 +102,9 @@ public interface IFormReportRouteService {
* @param httpSession
* @param httpServletRequest
* @param httpServletResponse
* @param modal
* @param model
*/
void appSave(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> modal);
void appSave(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> model);
/**
* APP修改页面
@ -125,9 +125,9 @@ public interface IFormReportRouteService {
* @param httpSession
* @param httpServletRequest
* @param httpServletResponse
* @param modal
* @param model
*/
void appUpdate(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> modal);
void appUpdate(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> model);
/**
* APP详情页面
@ -148,7 +148,7 @@ public interface IFormReportRouteService {
* @param httpSession
* @param httpServletRequest
* @param httpServletResponse
* @param modal
* @param model
*/
void appShow(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> modal);
void appShow(String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Map<String, Object> model);
}

View File

@ -17,12 +17,24 @@ public interface IFormReportService {
void save(String formCode, Integer formVersion, Map<String, Object> params);
void saveByToken(String token, String formCode, Integer formVersion, Map<String, Object> params);
void saveByUserId(String userId, String formCode, Integer formVersion, Map<String, Object> params);
String saveAndReturnId(String formCode, Integer formVersion, Map<String, Object> params);
String saveByTokenAndReturnId(String token, String formCode, Integer formVersion, Map<String, Object> params);
String saveByUserIdAndReturnId(String userId, String formCode, Integer formVersion, Map<String, Object> params);
void remove(String formCode, Integer formVersion, List<String> uids);
void update(String formCode, Integer formVersion, String uid, Map<String, Object> params);
void updateByToken(String token, String formCode, Integer formVersion, String uid, Map<String, Object> params);
void updateByUserId(String userId, String formCode, Integer formVersion, String uid, Map<String, Object> params);
void updateProcessInstanceId(String formCode, Integer formVersion, String uid, String processInstanceId);
Map<String, Object> get(String formCode, Integer formVersion, String uid);
@ -31,5 +43,7 @@ public interface IFormReportService {
SuccessResultList<List<Map<String, Object>>> listPage(String formCode, Integer formVersion, ListPage page);
List<String> listShowField(String formCode, Integer formVersion);
Integer count(String tableName);
}

View File

@ -6,7 +6,9 @@ import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.module.form.dao.formreport.IFormReportDao;
import ink.wgink.module.form.enums.design.FormStatusEnum;
import ink.wgink.module.form.pojo.pos.design.FormPO;
import ink.wgink.module.form.service.design.IFormDesignService;
import ink.wgink.module.form.service.design.IFormFieldService;
import ink.wgink.module.form.service.design.IFormService;
import ink.wgink.module.form.service.report.IFormReportService;
@ -48,45 +50,72 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe
saveAndReturnId(formCode, formVersion, params);
}
@Override
public void saveByToken(String token, String formCode, Integer formVersion, Map<String, Object> params) {
saveByTokenAndReturnId(token, formCode, formVersion, params);
}
@Override
public void saveByUserId(String userId, String formCode, Integer formVersion, Map<String, Object> params) {
saveByUserIdAndReturnId(userId, formCode, formVersion, params);
}
@Override
public String saveAndReturnId(String formCode, Integer formVersion, Map<String, Object> params) {
return saveByUserIdAndReturnId(securityComponent.getCurrentUser().getUserId(), formCode, formVersion, params);
}
@Override
public String saveByTokenAndReturnId(String token, String formCode, Integer formVersion, Map<String, Object> params) {
String userId = getAppTokenUser(token).getId();
return saveByUserIdAndReturnId(userId, formCode, formVersion, params);
}
@Override
public String saveByUserIdAndReturnId(String userId, String formCode, Integer formVersion, Map<String, Object> params) {
FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion);
checkForm(formPO);
String uid = UUIDUtil.getUUID();
List<String> inserts = new ArrayList<>();
List<Object> values = new ArrayList<>();
inserts.add("uid");
inserts.add(IFormDesignService.FIELD_UID);
inserts.add(IFormDesignService.FIELD_MAIN_TITLE);
values.add(uid);
values.add(getMainTitleCode(formPO.getMainTitleTpl(), params));
for (Map.Entry<String, Object> kv : params.entrySet()) {
inserts.add(kv.getKey());
values.add(kv.getValue());
}
String datetime = DateUtil.getTime();
String userId = securityComponent.getCurrentUser().getUserId();
inserts.add("gmt_create");
inserts.add(IFormDesignService.FIELD_GMT_CREATE);
values.add(datetime);
inserts.add("creator");
inserts.add(IFormDesignService.FIELD_CREATOR);
values.add(userId);
inserts.add("gmt_modified");
inserts.add(IFormDesignService.FIELD_GMT_MODIFIED);
values.add(datetime);
inserts.add("modifier");
inserts.add(IFormDesignService.FIELD_MODIFIER);
values.add(userId);
inserts.add("is_delete");
inserts.add(IFormDesignService.FIELD_IS_DELETE);
values.add(0);
Map<String, Object> insertParams = getHashMap((params.size() + 5) * 2);
insertParams.put("formCode", formCode);
insertParams.put("formVersion", formVersion);
insertParams.put("inserts", inserts);
insertParams.put("values", values);
insertParams.put(IFormDesignService.PARAM_FORM_CODE, formCode);
insertParams.put(IFormDesignService.PARAM_FORM_VERSION, formVersion);
insertParams.put(IFormDesignService.PARAM_INSERTS, inserts);
insertParams.put(IFormDesignService.PARAM_VALUES, values);
formReportDao.save(insertParams);
return uid;
}
@Override
public void remove(String formCode, Integer formVersion, List<String> uids) {
FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion);
checkForm(formPO);
Map<String, Object> params = getHashMap(10);
params.put("formCode", formCode);
params.put("formVersion", formVersion);
params.put("uids", uids);
params.put(IFormDesignService.PARAM_FORM_CODE, formCode);
params.put(IFormDesignService.PARAM_FORM_VERSION, formVersion);
params.put(IFormDesignService.FIELD_UIDS, uids);
setUpdateInfo(params);
formReportDao.remove(params);
@ -94,6 +123,21 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe
@Override
public void update(String formCode, Integer formVersion, String uid, Map<String, Object> params) {
String userId = securityComponent.getCurrentUser().getUserId();
updateByUserId(userId, formCode, formVersion, uid, params);
}
@Override
public void updateByToken(String token, String formCode, Integer formVersion, String uid, Map<String, Object> params) {
String userId = getAppTokenUser(token).getId();
updateByUserId(userId, formCode, formVersion, uid, params);
}
@Override
public void updateByUserId(String userId, String formCode, Integer formVersion, String uid, Map<String, Object> params) {
FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion);
checkForm(formPO);
List<List<String>> kvList = new ArrayList<>();
for (Map.Entry<String, Object> kv : params.entrySet()) {
if (kv.getValue() == null) {
@ -101,25 +145,30 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe
}
kvList.add(Arrays.asList(new String[]{kv.getKey(), "" + kv.getValue()}));
}
kvList.add(Arrays.asList(new String[]{"gmt_modified", DateUtil.getTime()}));
kvList.add(Arrays.asList(new String[]{"modifier", securityComponent.getCurrentUser().getUserId()}));
kvList.add(Arrays.asList(new String[]{IFormDesignService.FIELD_GMT_MODIFIED, DateUtil.getTime()}));
kvList.add(Arrays.asList(new String[]{IFormDesignService.FIELD_MODIFIER, userId}));
Map<String, Object> updateParams = getHashMap((params.size() + 3) * 2);
updateParams.put("uid", uid);
updateParams.put("kvList", kvList);
updateParams.put("formCode", formCode);
updateParams.put("formVersion", formVersion);
updateParams.put(IFormDesignService.FIELD_UID, uid);
updateParams.put(IFormDesignService.PARAM_KV_LIST, kvList);
updateParams.put(IFormDesignService.PARAM_FORM_CODE, formCode);
updateParams.put(IFormDesignService.PARAM_FORM_VERSION, formVersion);
formReportDao.update(updateParams);
// 更新mainTitle
Map<String, Object> dataMap = get(formCode, formVersion, uid);
kvList.clear();
kvList.add(Arrays.asList(new String[]{IFormDesignService.FIELD_MAIN_TITLE, getMainTitleCode(formPO.getMainTitleTpl(), dataMap)}));
formReportDao.update(updateParams);
}
@Override
public void updateProcessInstanceId(String formCode, Integer formVersion, String uid, String processInstanceId) {
Map<String, Object> params = getHashMap(8);
params.put("formCode", formCode);
params.put("formVersion", formVersion);
params.put("uid", uid);
params.put("processInstanceId", processInstanceId);
params.put(IFormDesignService.PARAM_FORM_CODE, formCode);
params.put(IFormDesignService.PARAM_FORM_VERSION, formVersion);
params.put(IFormDesignService.FIELD_UID, uid);
params.put(IFormDesignService.PARAM_PROCESS_INSTANCE_ID, processInstanceId);
formReportDao.updateProcessInstanceId(params);
}
@ -127,52 +176,73 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe
@Override
public Map<String, Object> get(String formCode, Integer formVersion, String uid) {
Map<String, Object> params = getHashMap(2);
params.put("uid", uid);
params.put("formCode", formCode);
params.put("formVersion", formVersion);
params.put(IFormDesignService.FIELD_UID, uid);
params.put(IFormDesignService.PARAM_FORM_CODE, formCode);
params.put(IFormDesignService.PARAM_FORM_VERSION, formVersion);
return formReportDao.get(params);
}
@Override
public List<Map<String, Object>> list(String formCode, Integer formVersion, Map<String, Object> params) {
FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion);
if (formPO == null) {
throw new SearchException("表单不存在");
}
checkForm(formPO);
List<String> queryList = conditionList(params);
Map<String, Object> queryParams = getHashMap(6);
queryParams.put("formCode", formCode);
queryParams.put("formVersion", formVersion);
queryParams.put("queryList", queryList);
queryParams.put("listShowField", listShowField(formPO));
queryParams.put(IFormDesignService.PARAM_FORM_CODE, formCode);
queryParams.put(IFormDesignService.PARAM_FORM_VERSION, formVersion);
queryParams.put(IFormDesignService.PARAM_QUERY_LIST, queryList);
queryParams.put(IFormDesignService.PARAM_LIST_SHOW_FIELD, listShowField(formPO));
List<Map<String, Object>> mapList = formReportDao.list(queryParams);
setMainTitle(formPO, mapList);
return mapList;
}
@Override
public SuccessResultList<List<Map<String, Object>>> listPage(String formCode, Integer formVersion, ListPage page) {
FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion);
if (formPO == null) {
throw new SearchException("表单不存在");
}
checkForm(formPO);
List<String> queryList = conditionList(page.getParams());
Map<String, Object> queryParams = getHashMap(6);
queryParams.put("formCode", formCode);
queryParams.put("formVersion", formVersion);
queryParams.put("queryList", queryList);
queryParams.put("listShowField", listShowField(formPO));
queryParams.put(IFormDesignService.PARAM_FORM_CODE, formCode);
queryParams.put(IFormDesignService.PARAM_FORM_VERSION, formVersion);
queryParams.put(IFormDesignService.PARAM_QUERY_LIST, queryList);
queryParams.put(IFormDesignService.PARAM_LIST_SHOW_FIELD, listShowField(formPO));
PageHelper.startPage(page.getPage(), page.getRows());
List<Map<String, Object>> mapList = formReportDao.list(queryParams);
setMainTitle(formPO, mapList);
PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(mapList);
return new SuccessResultList<>(mapList, pageInfo.getPageNum(), pageInfo.getTotal());
}
@Override
public List<String> listShowField(String formCode, Integer formVersion) {
FormPO formPO = formService.getPOByCodeAndVersion(formCode, formVersion);
checkForm(formPO);
return listShowField(formPO);
}
@Override
public Integer count(String tableName) {
Integer count = formReportDao.countByTableName(tableName);
return count == null ? 0 : count;
}
/**
* 校验表单
*
* @param formPO
*/
private void checkForm(FormPO formPO) {
if (formPO == null) {
throw new SearchException("表单不存在");
}
if (!StringUtils.equals(FormStatusEnum.ACTIVE.getValue(), formPO.getFormStatus())) {
throw new SearchException("表单未激活");
}
}
/**
* 显示字段
*
@ -180,41 +250,32 @@ public class FormReportServiceImpl extends DefaultBaseService implements IFormRe
* @return
*/
private List<String> listShowField(FormPO formPO) {
return formFieldService.listFieldNameByListShow(ISystemConstant.IS_TRUE);
return formFieldService.listFieldNameByFormIdAndListShow(formPO.getFormId(), ISystemConstant.IS_TRUE);
}
/**
* 设置主标题
*
* @param formPO
* @param mapList
* @param mainTitleTpl
* @param map
*/
private void setMainTitle(FormPO formPO, List<Map<String, Object>> mapList) {
if (mapList.isEmpty()) {
return;
private String getMainTitleCode(String mainTitleTpl, Map<String, Object> map) {
if (StringUtils.isBlank(mainTitleTpl)) {
return "";
}
if (StringUtils.isBlank(formPO.getMainTitleTpl())) {
return;
}
List<String> tpls = new ArrayList<>();
Matcher matcher = MAIN_TITLE_CODE.matcher(formPO.getMainTitleTpl());
String mainTitle = mainTitleTpl;
Matcher matcher = MAIN_TITLE_CODE.matcher(mainTitle);
while (matcher.find()) {
tpls.add(matcher.group());
}
for (Map<String, Object> map : mapList) {
String mainTitle = null;
for (String tpl : tpls) {
Object tplObj = map.get(tpl);
if (tplObj != null) {
mainTitle = formPO.getMainTitleTpl().replaceAll(tpl, tplObj.toString());
} else {
mainTitle = formPO.getMainTitleTpl().replaceAll(tpl, "");
}
}
if (StringUtils.isBlank(mainTitle)) {
map.put("MAIN_TITLE", mainTitle);
String tpl = matcher.group();
String key = tpl.substring(2, tpl.length() - 1);
Object valueObj = map.get(key);
if (valueObj == null) {
mainTitle = mainTitle.replaceAll(tpl, "");
} else {
mainTitle = mainTitle.replaceAll(tpl, valueObj.toString());
}
}
return mainTitle;
}
/**

View File

@ -184,7 +184,11 @@
FROM
form_field
<where>
<if test="formId != null and formId != ''">
form_id = #{formId}
</if>
<if test="listShow != null and listShow != ''">
AND
list_show = #{listShow}
</if>
</where>

View File

@ -66,7 +66,7 @@
`app_show_page_code` longtext COMMENT 'APP展示页面代码',
`form_table_name` varchar(255) DEFAULT NULL COMMENT '表单表名',
`form_version` int(11) DEFAULT NULL COMMENT '表单版本',
`main_title_tpl` varchar(255) DEFAULT NULL COMMENT '主标题模板'
`main_title_tpl` varchar(255) DEFAULT NULL COMMENT '主标题模板',
`creator` char(36) DEFAULT NULL COMMENT '创建人',
`gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
`modifier` char(36) DEFAULT NULL COMMENT '修改人',
@ -81,6 +81,21 @@
${_parameter}
</update>
<!-- 建表 -->
<update id="deleteDynamicForm" parameterType="java.lang.String">
${_parameter}
</update>
<!-- 建表 -->
<update id="updateDynamicFormField" parameterType="java.lang.String">
${_parameter}
</update>
<!-- 建表 -->
<update id="deleteDynamicFormField" parameterType="java.lang.String">
${_parameter}
</update>
<!-- 新增表单 -->
<insert id="save" parameterType="map" flushCache="true">
INSERT INTO form_form(

View File

@ -81,4 +81,12 @@
</trim>
</select>
<!-- 统计 -->
<select id="countByTableName" parameterType="java.lang.String" resultType="java.lang.Integer">
SELECT
COUNT(*)
FROM
${_parameter}
</select>
</mapper>

View File

@ -116,6 +116,15 @@ layui.config({
' </div>',
' </div>',
' <div class="layui-form-item">',
' <label class="layui-form-label">表单类型</label>',
' <div class="layui-input-block">',
' <select id="formType" name="formType" lay-verify="required">',
' <option value="default">默认</option>',
' <option value="oa">OA表单</option>',
' </select>',
' </div>',
' </div>',
' <div class="layui-form-item">',
' <label class="layui-form-label">主标题模板</label>',
' <div class="layui-input-block">',
' <input type="text" id="mainTitleTpl" name="mainTitleTpl" placeholder="请输入主标题模板" class="layui-input">',
@ -259,6 +268,7 @@ layui.config({
formName: "表单设计器",
Author: "WenG",
formId: "id",
mainTitleTpl: '',
generateId: 0,
field: [],
data: [],
@ -1293,6 +1303,12 @@ layui.config({
top.dialog.msg('请输入表单描述');
return;
}
var formType = $('#formType').val();
if(!formType) {
top.dialog.msg('请选择表单类型');
return;
}
var mainTitleTpl = $('#mainTitleTpl').val();
var fieldHtmlArray = listField(fieldData);
var fields = [];
$.each(fieldHtmlArray, function (index, item) {
@ -1301,8 +1317,6 @@ layui.config({
html: item.elem.prop('outerHTML')
})
});
console.log(options)
return;
top.dialog.confirm(top.dataMessage.commit, function (index) {
top.dialog.close(index);
var loadLayerIndex;
@ -1310,6 +1324,8 @@ layui.config({
formCode: options.formCode,
formName: formName,
formSummary: formSummary,
formType: formType,
mainTitleTpl: mainTitleTpl,
data: fieldData,
fields: fields,
}, null, function (code, data) {
@ -1442,7 +1458,6 @@ layui.config({
that.addClick();
/* 向 拷贝 删除 按钮添加 click 动作 */
that.addCopyDeleteClick();
form.render();
if (options.data.length != 0) {
for (var i = 0; i < options.data.length; i++) {
if (options.data[i].tag === 'grid') {
@ -1467,6 +1482,9 @@ layui.config({
// 表单属性
$('#formName').val(options.formName);
$('#formSummary').val(options.formSummary);
$('#formType').val(options.formType);
$('#mainTitleTpl').val(options.mainTitleTpl);
form.render();
};
Class.prototype.reload = function (id, options) {
var that = this;

View File

@ -3,6 +3,7 @@ function FormUtil(layui, viewer) {
var layer = layui.layer;
var upload = layui.upload;
var laydate = layui.laydate;
var form = layui.form;
var Viewer = viewer;
var restAjax = layui.restajax;
var viewerObj = {};
@ -449,7 +450,7 @@ function FormUtil(layui, viewer) {
* @param checkedData
* @param id
*/
this.initCheckboxData = function (form, formName, checkedData, id) {
this.initCheckboxData = function (formName, checkedData, id) {
var dataArray = checkedData.split(',');
var obj = {};
for (var i = 0, data; data = dataArray[i++];) {
@ -476,4 +477,18 @@ function FormUtil(layui, viewer) {
formData.field[id] = formData.field[id] ? 1 : 0;
}
/**
* 清空上传字段
* @param formData
*/
this.clearUploadField = function (formData) {
var fileInputs = $(formData.form).find('input[type="file"]');
if(fileInputs.length == 0) {
return;
}
$.each(fileInputs, function(index, item) {
delete formData.field[item.name];
});
}
}

View File

@ -41,6 +41,8 @@
version: data.formVersion,
formName: data.formName,
formSummary: data.formSummary,
mainTitleTpl: data.mainTitleTpl,
formType: data.formType
});
}, function(code, data) {
top.dialog.msg(data.msg);

View File

@ -0,0 +1,185 @@
<!doctype html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<base th:href="${#request.getContextPath() + '/'} ">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
</head>
<body>
<div class="layui-fluid layui-anim layui-anim-fadein">
<div class="layui-row">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<div class="test-table-reload-btn" style="margin-bottom: 10px;">
<div class="layui-inline">
<input type="text" id="keywords" class="layui-input search-item" placeholder="输入关键字">
</div>
<button type="button" id="search" class="layui-btn layui-btn-sm">
<i class="fa fa-lg fa-search"></i> 搜索
</button>
</div>
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
<!-- 表头按钮字典 -->
<script type="text/html" id="headerToolBar">
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-sm" lay-event="save">
<i class="fa fa-lg fa-plus"></i> 新增
</button>
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" lay-event="update">
<i class="fa fa-lg fa-edit"></i> 编辑
</button>
<button type="button" class="layui-btn layui-btn-danger layui-btn-sm" lay-event="remove">
<i class="fa fa-lg fa-trash"></i> 删除
</button>
</div>
</script>
</div>
</div>
</div>
</div>
</div>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script type="text/javascript">
layui.config({
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'table', 'laydate', 'ztree'], function() {
var $ = layui.$;
var $win = $(window);
var form = layui.form;
var table = layui.table;
var admin = layui.admin;
var laydate = layui.laydate;
// 初始化表格
function initTable() {
table.render({
elem: '#dataTable',
id: 'dataTable',
url: top.restAjax.path('api/form/listpage', []),
width: admin.screen() > 1 ? '100%' : '',
height: $win.height() - 90,
limit: 20,
limits: [20, 40, 60, 80, 100, 200],
toolbar: '#headerToolBar',
request: {
pageName: 'page',
limitName: 'rows'
},
cols: [
[
{type:'checkbox', fixed: 'left'},
{field:'rowNum', width:80, title: '序号', fixed: 'left', align:'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
]
],
page: true,
parseData: function(data) {
return {
'code': 0,
'msg': '',
'count': data.total,
'data': data.rows
};
}
});
}
// 重载表格
function reloadTable() {
table.reload('dataTable', {
where: {
keywords: $('#keywords').val(),
},
});
}
// 初始化日期
function initDate() {}
// 删除
function removeData(ids) {
top.dialog.msg(top.dataMessage.delete, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function (index) {
top.dialog.close(index);
var layIndex;
top.restAjax.delete(top.restAjax.path('api/form/remove/{ids}', [ids]), {}, null, function (code, data) {
top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000});
reloadTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
}
});
}
initTable();
initDate();
// 事件 - 页面变化
$win.on('resize', function() {
reloadTable();
});
// 事件 - 搜索
$(document).on('click', '#search', function() {
reloadTable();
});
// 事件 - 增删改
table.on('toolbar(dataTable)', function(obj) {
var layEvent = obj.event;
var checkStatus = table.checkStatus('dataTable');
var checkDatas = checkStatus.data;
if(layEvent === 'save') {
top.dialog.open({
title: '表单设计器',
url: top.restAjax.path('route/form-design/save', []),
width: '99%',
height: '99%',
onClose: function () {
reloadTable();
}
})
} else if(layEvent === 'update') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectEdit);
} else if(checkDatas.length > 1) {
top.dialog.msg(top.dataMessage.table.selectOneEdit);
} else {
top.dialog.open({
title: '表单设计器',
url: top.restAjax.path('route/form-design/update?formId={formId}', [checkDatas[0].formId]),
width: '99%',
height: '99%',
onClose: function () {
reloadTable();
}
})
}
} else if(layEvent === 'remove') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectDelete);
} else {
var ids = '';
for(var i = 0, item; item = checkDatas[i++];) {
if(i > 1) {
ids += '_';
}
ids += item.formId;
}
removeData(ids);
}
}
});
});
</script>
</body>
</html>

View File

@ -16,17 +16,21 @@
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<div class="layui-card-body" style="padding: 0px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-row">
<div class="layui-col-md12 layui-col-xs12">
<div id="codeBox" class="layui-col-md12 layui-col-xs12">
<textarea id="appSavePageCode" name="appSavePageCode" style="display: none"></textarea>
</div>
<div id="previewBox" class="layui-col-md4 layui-col-xs4" style="display: none;">
<iframe id="previewCode" frameborder="0" style="width: 100%;"></iframe>
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
<button type="button" id="previewBtn" class="layui-btn layui-btn-normal">预览</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
@ -54,6 +58,8 @@
var formId = params.formId;
var formCode = params.formCode;
var formVersion = params.formVersion;
var previewTimeout;
var isPreview = false;
var codeMirrorConfig = {
lineNumbers: true,
theme: 'dracula',
@ -76,13 +82,27 @@
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
function initPreview(code) {
if(!isPreview) {
return;
}
$('#previewCode').attr('srcdoc', code);
}
function initFormHtml(value) {
var editor = CodeMirror.fromTextArea(document.getElementById('appSavePageCode'), codeMirrorConfig);
editor.setValue(value);
editor.setSize('100%', win.height() - 90);
editor.setSize('100%', win.height() - 65);
editor.on('change', function (self, changeValue) {
$('#appSavePageCode').val(self.getValue());
})
if(previewTimeout) {
clearTimeout(previewTimeout);
}
previewTimeout = setTimeout(function() {
initPreview(self.getValue());
}, 1000);
});
$('#previewCode').height(win.height() - 65);
}
// 初始化
@ -138,6 +158,19 @@
$('.close').on('click', function () {
closeBox();
});
$('#previewBtn').on('click', function() {
if(isPreview) {
$('#codeBox').attr('class', 'layui-col-md12 layui-col-xs12');
$('#previewBox').hide();
} else {
$('#codeBox').attr('class', 'layui-col-md8 layui-col-xs8');
$('#previewBox').attr('class', 'layui-col-md4 layui-col-xs4');
$('#previewBox').show();
}
isPreview = !isPreview;
initPreview($('#appSavePageCode').val());
});
});
</script>
</body>

View File

@ -15,17 +15,21 @@
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<div class="layui-card-body" style="padding: 0px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-row">
<div class="layui-col-md12 layui-col-xs12">
<div id="codeBox" class="layui-col-md12 layui-col-xs12">
<textarea id="appShowPageCode" name="appShowPageCode" style="display: none"></textarea>
</div>
<div id="previewBox" class="layui-col-md4 layui-col-xs4" style="display: none;">
<iframe id="previewCode" frameborder="0" style="width: 100%;"></iframe>
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
<button type="button" id="previewBtn" class="layui-btn layui-btn-normal">预览</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
@ -53,6 +57,8 @@
var formId = params.formId;
var formCode = params.formCode;
var formVersion = params.formVersion;
var previewTimeout;
var isPreview = false;
var codeMirrorConfig = {
lineNumbers: true,
theme: 'dracula',
@ -75,13 +81,27 @@
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
function initPreview(code) {
if(!isPreview) {
return;
}
$('#previewCode').attr('srcdoc', code);
}
function initFormHtml(value) {
var editor = CodeMirror.fromTextArea(document.getElementById('appShowPageCode'), codeMirrorConfig);
editor.setValue(value);
editor.setSize('100%', win.height() - 90);
editor.setSize('100%', win.height() - 65);
editor.on('change', function(self, changeValue) {
$('#appShowPageCode').val(self.getValue());
})
if(previewTimeout) {
clearTimeout(previewTimeout);
}
previewTimeout = setTimeout(function() {
initPreview(self.getValue());
}, 1000);
});
$('#previewCode').height(win.height() - 65);
}
// 初始化
@ -136,6 +156,19 @@
$('.close').on('click', function() {
closeBox();
});
$('#previewBtn').on('click', function() {
if(isPreview) {
$('#codeBox').attr('class', 'layui-col-md12 layui-col-xs12');
$('#previewBox').hide();
} else {
$('#codeBox').attr('class', 'layui-col-md8 layui-col-xs8');
$('#previewBox').attr('class', 'layui-col-md4 layui-col-xs4');
$('#previewBox').show();
}
isPreview = !isPreview;
initPreview($('#appShowPageCode').val());
});
});
</script>
</body>

View File

@ -15,17 +15,21 @@
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<div class="layui-card-body" style="padding: 0px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-row">
<div class="layui-col-md12 layui-col-xs12">
<div id="codeBox" class="layui-col-md12 layui-col-xs12">
<textarea id="appUpdatePageCode" name="appUpdatePageCode" style="display: none"></textarea>
</div>
<div id="previewBox" class="layui-col-md4 layui-col-xs4" style="display: none;">
<iframe id="previewCode" frameborder="0" style="width: 100%;"></iframe>
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
<button type="button" id="previewBtn" class="layui-btn layui-btn-normal">预览</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
@ -53,6 +57,8 @@
var formId = params.formId;
var formCode = params.formCode;
var formVersion = params.formVersion;
var previewTimeout;
var isPreview = false;
var codeMirrorConfig = {
lineNumbers: true,
theme: 'dracula',
@ -75,13 +81,27 @@
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
function initPreview(code) {
if(!isPreview) {
return;
}
$('#previewCode').attr('srcdoc', code);
}
function initFormHtml(value) {
var editor = CodeMirror.fromTextArea(document.getElementById('appUpdatePageCode'), codeMirrorConfig);
editor.setValue(value);
editor.setSize('100%', win.height() - 90);
editor.setSize('100%', win.height() - 65);
editor.on('change', function(self, changeValue) {
$('#appUpdatePageCode').val(self.getValue());
})
if(previewTimeout) {
clearTimeout(previewTimeout);
}
previewTimeout = setTimeout(function() {
initPreview(self.getValue());
}, 1000);
});
$('#previewCode').height(win.height() - 65);
}
// 初始化
@ -136,6 +156,19 @@
$('.close').on('click', function() {
closeBox();
});
$('#previewBtn').on('click', function() {
if(isPreview) {
$('#codeBox').attr('class', 'layui-col-md12 layui-col-xs12');
$('#previewBox').hide();
} else {
$('#codeBox').attr('class', 'layui-col-md8 layui-col-xs8');
$('#previewBox').attr('class', 'layui-col-md4 layui-col-xs4');
$('#previewBox').show();
}
isPreview = !isPreview;
initPreview($('#appUpdatePageCode').val());
});
});
</script>
</body>

View File

@ -15,7 +15,7 @@
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<div class="layui-card-body" style="padding: 0px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-row">
<div class="layui-col-md12 layui-col-xs12">
@ -69,7 +69,7 @@
function initJson(value) {
var editor = CodeMirror.fromTextArea(document.getElementById('formSourceData'), codeMirrorConfig);
editor.setValue(value);
editor.setSize('100%', win.height() - 30);
editor.setSize('100%', win.height() - 0);
editor.on('change', function(self, changeValue) {
$('#formSourceData').val(self.getValue());
})

View File

@ -18,14 +18,18 @@
<div class="layui-card-body" style="padding: 0px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-row">
<div class="layui-col-md12 layui-col-xs12">
<div id="codeBox" class="layui-col-md12 layui-col-xs12">
<textarea id="savePageCode" name="savePageCode" style="display: none"></textarea>
</div>
<div id="previewBox" class="layui-col-md4 layui-col-xs4" style="display: none;">
<iframe id="previewCode" frameborder="0" style="width: 100%;"></iframe>
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
<button type="button" id="previewBtn" class="layui-btn layui-btn-normal">预览</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
@ -53,6 +57,8 @@
var formId = params.formId;
var formCode = params.formCode;
var formVersion = params.formVersion;
var previewTimeout;
var isPreview = false;
var codeMirrorConfig = {
lineNumbers: true,
theme: 'dracula',
@ -75,13 +81,27 @@
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
function initPreview(code) {
if(!isPreview) {
return;
}
$('#previewCode').attr('srcdoc', code);
}
function initFormHtml(value) {
var editor = CodeMirror.fromTextArea(document.getElementById('savePageCode'), codeMirrorConfig);
editor.setValue(value);
editor.setSize('100%', win.height() - 65);
editor.on('change', function(self, changeValue) {
$('#savePageCode').val(self.getValue());
})
if(previewTimeout) {
clearTimeout(previewTimeout);
}
previewTimeout = setTimeout(function() {
initPreview(self.getValue());
}, 1000);
});
$('#previewCode').height(win.height() - 65);
}
// 初始化
@ -136,6 +156,19 @@
$('.close').on('click', function() {
closeBox();
});
$('#previewBtn').on('click', function() {
if(isPreview) {
$('#codeBox').attr('class', 'layui-col-md12 layui-col-xs12');
$('#previewBox').hide();
} else {
$('#codeBox').attr('class', 'layui-col-md8 layui-col-xs8');
$('#previewBox').attr('class', 'layui-col-md4 layui-col-xs4');
$('#previewBox').show();
}
isPreview = !isPreview;
initPreview($('#savePageCode').val());
});
});
</script>
</body>

View File

@ -15,17 +15,21 @@
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<div class="layui-card-body" style="padding: 0px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-row">
<div class="layui-col-md12 layui-col-xs12">
<div id="codeBox" class="layui-col-md12 layui-col-xs12">
<textarea id="showPageCode" name="showPageCode" style="display: none"></textarea>
</div>
<div id="previewBox" class="layui-col-md4 layui-col-xs4" style="display: none;">
<iframe id="previewCode" frameborder="0" style="width: 100%;"></iframe>
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
<button type="button" id="previewBtn" class="layui-btn layui-btn-normal">预览</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
@ -53,6 +57,8 @@
var formId = params.formId;
var formCode = params.formCode;
var formVersion = params.formVersion;
var previewTimeout;
var isPreview = false;
var codeMirrorConfig = {
lineNumbers: true,
theme: 'dracula',
@ -75,13 +81,27 @@
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
function initPreview(code) {
if(!isPreview) {
return;
}
$('#previewCode').attr('srcdoc', code);
}
function initFormHtml(value) {
var editor = CodeMirror.fromTextArea(document.getElementById('showPageCode'), codeMirrorConfig);
editor.setValue(value);
editor.setSize('100%', win.height() - 90);
editor.setSize('100%', win.height() - 65);
editor.on('change', function(self, changeValue) {
$('#showPageCode').val(self.getValue());
})
if(previewTimeout) {
clearTimeout(previewTimeout);
}
previewTimeout = setTimeout(function() {
initPreview(self.getValue());
}, 1000);
});
$('#previewCode').height(win.height() - 65);
}
// 初始化
@ -136,6 +156,19 @@
$('.close').on('click', function() {
closeBox();
});
$('#previewBtn').on('click', function() {
if(isPreview) {
$('#codeBox').attr('class', 'layui-col-md12 layui-col-xs12');
$('#previewBox').hide();
} else {
$('#codeBox').attr('class', 'layui-col-md8 layui-col-xs8');
$('#previewBox').attr('class', 'layui-col-md4 layui-col-xs4');
$('#previewBox').show();
}
isPreview = !isPreview;
initPreview($('#showPageCode').val());
});
});
</script>
</body>

View File

@ -15,17 +15,21 @@
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<div class="layui-card-body" style="padding: 0px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-row">
<div class="layui-col-md12 layui-col-xs12">
<div id="codeBox" class="layui-col-md12 layui-col-xs12">
<textarea id="updatePageCode" name="updatePageCode" style="display: none"></textarea>
</div>
<div id="previewBox" class="layui-col-md4 layui-col-xs4" style="display: none;">
<iframe id="previewCode" frameborder="0" style="width: 100%;"></iframe>
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
<button type="button" id="previewBtn" class="layui-btn layui-btn-normal">预览</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
@ -53,6 +57,8 @@
var formId = params.formId;
var formCode = params.formCode;
var formVersion = params.formVersion;
var previewTimeout;
var isPreview = false;
var codeMirrorConfig = {
lineNumbers: true,
theme: 'dracula',
@ -75,13 +81,27 @@
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
function initPreview(code) {
if(!isPreview) {
return;
}
$('#previewCode').attr('srcdoc', code);
}
function initFormHtml(value) {
var editor = CodeMirror.fromTextArea(document.getElementById('updatePageCode'), codeMirrorConfig);
editor.setValue(value);
editor.setSize('100%', win.height() - 90);
editor.setSize('100%', win.height() - 65);
editor.on('change', function(self, changeValue) {
$('#updatePageCode').val(self.getValue());
})
if(previewTimeout) {
clearTimeout(previewTimeout);
}
previewTimeout = setTimeout(function() {
initPreview(self.getValue());
}, 1000);
});
$('#previewCode').height(win.height() - 65);
}
// 初始化
@ -136,6 +156,19 @@
$('.close').on('click', function() {
closeBox();
});
$('#previewBtn').on('click', function() {
if(isPreview) {
$('#codeBox').attr('class', 'layui-col-md12 layui-col-xs12');
$('#previewBox').hide();
} else {
$('#codeBox').attr('class', 'layui-col-md8 layui-col-xs8');
$('#previewBox').attr('class', 'layui-col-md4 layui-col-xs4');
$('#previewBox').show();
}
isPreview = !isPreview;
initPreview($('#updatePageCode').val());
});
});
</script>
</body>

View File

@ -96,6 +96,9 @@
if(row.formType == 'default') {
return '<span class="layui-badge layui-bg-green">默认</span>';
}
if(row.formType == 'oa') {
return '<span class="layui-badge layui-bg-blue">OA表单</span>';
}
return '<span class="layui-badge">错误</span>';
}
}

View File

@ -44,7 +44,6 @@
</div>
</div>
</div>
<input type="hidden" id="parentId" th:value="${parentId}">
<script src="assets/layuiadmin/layui/layui.js"></script>
<script type="text/javascript">
layui.config({
@ -98,6 +97,9 @@
if(row.formType == 'default') {
return '<span class="layui-badge layui-bg-green">默认</span>';
}
if(row.formType == 'oa') {
return '<span class="layui-badge layui-bg-blue">OA表单</span>';
}
return '<span class="layui-badge">错误</span>';
}
},
@ -138,10 +140,12 @@
return '<button class="layui-btn layui-btn-xs" lay-event="showDataEvent">查看数据</button>';
}
},
{field:'opition', width:120, title: '操作', fixed:'right', align:'center',
{field:'opition', width:210, title: '操作', fixed:'right', align:'center',
templet: function(item) {
return '<div class="layui-btn-group">' +
'<button type="button" class="layui-btn layui-btn-xs" lay-event="showFormEvent">上报列表</button>'+
'<button type="button" class="layui-btn layui-btn-xs layui-btn-normal" lay-event="formFieldEvent">字段列表</button>'+
'<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" lay-event="deleteEvent" title="该操作将连同物理表(无数据)一并删除">物理删除</button>'+
'</div>';
}
}
@ -255,8 +259,8 @@
top.dialog.open({
title: '新增页面模板',
url: top.restAjax.path('route/form/get-save-page-code?formId={formId}&formCode={formCode}&formVersion={formVersion}', [data.formId, data.formCode, data.formVersion]),
width: '80%',
height: '90%',
width: '99%',
height: '99%',
onClose: function () {
}
})
@ -264,8 +268,8 @@
top.dialog.open({
title: '修改页面模板',
url: top.restAjax.path('route/form/get-update-page-code?formId={formId}&formCode={formCode}&formVersion={formVersion}', [data.formId, data.formCode, data.formVersion]),
width: '80%',
height: '90%',
width: '99%',
height: '99%',
onClose: function () {
}
})
@ -273,8 +277,8 @@
top.dialog.open({
title: '详情页面模板',
url: top.restAjax.path('route/form/get-show-page-code?formId={formId}&formCode={formCode}&formVersion={formVersion}', [data.formId, data.formCode, data.formVersion]),
width: '80%',
height: '90%',
width: '99%',
height: '99%',
onClose: function () {
}
})
@ -282,8 +286,8 @@
top.dialog.open({
title: 'APP新增页面模板',
url: top.restAjax.path('route/form/get-app-save-page-code?formId={formId}&formCode={formCode}&formVersion={formVersion}', [data.formId, data.formCode, data.formVersion]),
width: '80%',
height: '90%',
width: '99%',
height: '99%',
onClose: function () {
}
})
@ -291,8 +295,8 @@
top.dialog.open({
title: 'APP修改页面模板',
url: top.restAjax.path('route/form/get-app-update-page-code?formId={formId}&formCode={formCode}&formVersion={formVersion}', [data.formId, data.formCode, data.formVersion]),
width: '80%',
height: '90%',
width: '99%',
height: '99%',
onClose: function () {
}
})
@ -300,16 +304,16 @@
top.dialog.open({
title: 'APP详情页面模板',
url: top.restAjax.path('route/form/get-app-show-page-code?formId={formId}&formCode={formCode}&formVersion={formVersion}', [data.formId, data.formCode, data.formVersion]),
width: '80%',
height: '90%',
width: '99%',
height: '99%',
onClose: function () {
}
})
} else if(event === 'showDataEvent') {
top.dialog.open({
title: '表单设计器',
title: '表单数据',
url: top.restAjax.path('route/form/get-form-source-data?formId={formId}', [data.formId]),
width: '50%',
width: '500px',
height: '90%',
onClose: function () {
}
@ -325,13 +329,30 @@
})
} else if(event === 'reportListEvent') {
top.dialog.open({
title: '预览',
url: top.restAjax.path('route/form-report/save/code/{formCode}/version/{formVersion}', [data.formCode, data.formVersion]),
title: '上报列表',
url: top.restAjax.path('route/form-report?formCode={formCode}&version={formVersion}', [data.formCode, data.formVersion]),
width: '50%',
height: '80%',
onClose: function () {
}
})
} else if(event === 'formFieldEvent') {
} else if(event === 'deleteEvent') {
top.dialog.confirm('该操作将连同物理表(无数据)一并删除,确定吗?', function(index) {
top.dialog.close(index);
var layIndex;
top.restAjax.delete(top.restAjax.path('api/form/delete/{id}', [data.formId]), {}, null, function (code, data) {
top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000});
reloadTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
});
}
})

View File

@ -1,29 +1,31 @@
<!DOCTYPE html>
<html>
<head>',
<base href="${contextPath}"/>
<head>
<base href="${r'${contextPath}'}"/>
<meta charset="utf-8">
<title>${formName}</title>
<title>${r'${formName}'}</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" type="text/css" href="assets/js/vendor/viewer/viewer.min.css">
<link rel="stylesheet" type="text/css" href="static/form/css/form.css">
</head>
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">',
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
${formFieldHtml}
<#list fields as field>
${field.html}
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit
lay-filter="submitForm">提交
</button>
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</div>
@ -31,9 +33,11 @@
</form>
</div>
</div>
<input type="hidden" id="formCode" value="${formCode}">,
<input type="hidden" id="formVersion" value="${formVersion}">,
<#list hiddenInputs as hiddenInput>
<input type="hidden" id="${hiddenInput}" value="${r'${'}${hiddenInput}${r'}'}">
</#list>
</div>
<script src="static/form/js/form-util.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
@ -41,170 +45,81 @@
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'form', 'laydate', 'laytpl', 'upload', 'restajax', 'datamessage', 'dialog'], function () {
}).use(['index', 'form', 'layer', 'laydate', 'laytpl', 'upload', 'restajax'], function () {
var $ = layui.$;
var form = layui.form;
var laytpl = layui.laytpl;
var layer = layui.layer;
var laydate = layui.laydate;
var upload = layui.upload;
var dialog = layui.dialog;
var restAjax = layui.restajax;
var dataMessage = layui.datamessage;
var viewerObj = {};
var queryParams = restAjax.params(window.location.href);
var token = queryParams.token;
var formUtil = new FormUtil(layui, Viewer);
// 初始化图片方法
function initUploadImage(fileName, fileExplain, maxCount) {
maxCount = maxCount ? parseInt(maxCount) : 9
maxCount = maxCount < 0 ? 9 : maxCount;
var id = '#' + fileName;
var boxId = '#' + fileName + 'FileBox';
var uploadClass = '.' + fileName + '-upload';
var removeClass = '.' + fileName + '-remove';
function initImage(callback) {
var fileIds = $(id).val();
var fileIdArray = fileIds.split(',');
var html = '';
for (var i = 0, fileId; fileId = fileIdArray[i++];) {
var img = [
'<div class="upload-image-box">',
' <span class="upload-image-span">',
' <img src="route/file/download/false/' + fileId + '" align="加载失败">',
' </span>',
' <a class="layui-btn layui-btn-xs layui-btn-danger text-danger remove-image ' + fileName + '-remove" href="javascript:void(0);" data-id="' + fileId + '" data-name="' + fileName + '">',
' <i class="fa fa-trash-o"></i>',
' </a>',
'</div>'
].join('\n');
html += img;
}
if (fileIdArray.length < maxCount) {
var upload = [
'<div class="upload-image-box" style="width: auto; height: auto; padding: 5px;">',
' <a href="javascript:void(0);" class="' + fileName + '-upload" data-explain="' + fileExplain + '" data-name="' + fileName + '">',
' <i class="fa fa-plus-square-o" style="font-size: 70px;"></i>',
' </a>',
'</div>'
].join('\n');
html += upload;
}
$(boxId).empty();
$(boxId).append(html);
callback ? callback() : '';
};
// 添加点击时间
function addClick() {
$(document).on('click', uploadClass, function () {
var name = this.dataset.name;
var explain = this.dataset.explain;
top.dialog.file({
type: 'image',
title: '【' + explain + '】图片上传',
width: '400px',
height: '420px',
maxFileCount: '1',
onClose: function () {
var uploadFileArray = top.dialog.dialogData.uploadFileArray;
if (typeof (uploadFileArray) != 'undefined' && uploadFileArray.length > 0) {
var files = $('#' + name).val();
for (var j = 0, file = uploadFileArray[j]; file = uploadFileArray[j++];) {
if (files.length > 0) {
files += ',';
}
files += file.data;
}
$('#'+ name).val(files);
initImage(function () {
viewerObj[name].update();
});
}
}
});
})
$(document).on('click', removeClass, function () {
var name = this.dataset.name;
var id = this.dataset.id;
var files = $('#' + name).val().replace(id, '');
files = files.replace(/\,+/g, ',');
if (files.charAt(0) == ',') {
files = files.substring(1);
}
if (files.charAt(files.length - 1) == ',') {
files = files.substring(0, files.length - 1);
}
$('#' + name).val(files);
initImage(function () {
viewerObj[name].update();
});
});
}
// 初始化
initImage(function () {
viewerObj[fileName] = new Viewer(document.getElementById(fileName + 'FileBox'), {navbar: false});
});
addClick();
}
// 初始化文件列表',
function initFileList(fileName, ids, callback) {
var dataForm = {};
dataForm[fileName] = ids;
form.val('dataForm', dataForm);
if (!ids) {
refreshDownloadTemplet(fileName, []);
if (callback) {
callback(fileName, []);
}
return;
}
restAjax.get(restAjax.path('app/file/list-release', []), {
ids: ids
}, null, function (code, data) {
refreshDownloadTemplet(fileName, data);
if (callback) {
callback(fileName, data);
}
}, function (code, data) {
dialog.msg(data.msg);
});
}
${initSaveFunctions}
// 初始化内容
// 初始化
function initData() {
${initSaveScript}
<#list fields as field>
<#if field.data.tag == 'uploadImage'>
formUtil.initUploadImage('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadFile'>
formUtil.initUploadFile('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadVideo'>
formUtil.initUploadVideo('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadAudio'>
formUtil.initUploadAudio('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'date'>
formUtil.initDate({
id: '${field.data.id}',
datetype: '${field.data.datetype}',
dateformat: '${field.data.dateformat}',
dateDefaultValue: '${field.data.dateDefaultValue}',
dataMinValue: '${field.data.dataMinValue}',
dataMaxValue: '${field.data.dataMaxValue}',
});
</#if>
</#list>
}
initData();
// 关闭页面',
// 关闭页面
$('.close').on('click', function () {
// 这里写返回按钮的逻辑,默认是关闭',
parent.layer.close(parent.layer.getFrameIndex(window.name));
});
// 提交表单',
// 提交表单
form.on('submit(submitForm)', function (formData) {
dialog.confirm('确定提交吗?', function (index) {
dialog.close(index);
layer.confirm('确定提交吗?', function(confirmLayerIndex) {
layer.close(confirmLayerIndex);
// 提交前处理
formUtil.clearUploadField(formData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.setCheckboxValue(formData, '${field.data.id}');
<#elseif field.data.tag == 'switch'>
formUtil.setSwitchValue(formData, '${field.data.id}');
</#if>
</#list>
var loadLayerIndex;
${submitSaveScript}
restAjax.post(restAjax.path('api/form-report/save/code/{formCode}/version/{formVersion}', [$('#formCode').val(), $('#formVersion').val()]), formData.field, null, function (code, data) {
restAjax.post(restAjax.path('${commitUrl}', [
<#list commitParams as commitParam>
$('#${commitParam}').val(),
</#list>
]), formData.field, {
headers: {
token: token
}
}, function (code, data) {
// 这里手动添加操作成功后的操作',
}, function (code, data) {
$('#submitFormBtn').show();
dialog.msg(data.msg);
layer.msg(data.msg);
}, function () {
$('#submitFormBtn').hide();
loadLayerIndex = dialog.msg(dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3});
}, function () {
dialog.close(loadLayerIndex);
layer.close(loadLayerIndex);
});
});
return false;

View File

@ -0,0 +1,120 @@
<!DOCTYPE html>
<html>
<head>
<base href="${r'${contextPath}'}"/>
<meta charset="utf-8">
<title>${r'${formName}'}</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" type="text/css" href="assets/js/vendor/viewer/viewer.min.css">
<link rel="stylesheet" type="text/css" href="static/form/css/form.css">
</head>
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<#list fields as field>
${field.html}
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</div>
</div>
</form>
</div>
</div>
<#list hiddenInputs as hiddenInput>
<input type="hidden" id="${hiddenInput}" value="${r'${'}${hiddenInput}${r'}'}">
</#list>
</div>
<script src="static/form/js/form-util.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'form', 'layer', 'laydate', 'laytpl', 'upload', 'restajax'], function () {
var $ = layui.$;
var form = layui.form;
var layer = layui.layer;
var laydate = layui.laydate;
var restAjax = layui.restajax;
var queryParams = restAjax.params(window.location.href);
var token = queryParams.token;
var uid = queryParams.uid;
var formUtil = new FormUtil(layui, Viewer);
// 初始化
function initData() {
var self = this;
var loadLayerIndex;
top.restAjax.get(restAjax.path('${initUrl}', [
<#list initParams as initParam>
$('#${initParam}').val(),
</#list>
uid
]), {}, {
headers: {
token: token
}
}, function(code, data) {
var dataFormData = {};
for(var i in data) {
dataFormData[i] = data[i] +'';
}
form.val('dataForm', dataFormData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.initCheckboxData('dataForm', dataFormData['${field.data.id}'], '${field.data.id}');
<#elseif field.data.tag == 'uploadImage'>
formUtil.initUploadImage('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadFile'>
formUtil.initUploadFile('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadVideo'>
formUtil.initUploadVideo('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadAudio'>
formUtil.initUploadAudio('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'date'>
formUtil.initDate({
id: '${field.data.id}',
datetype: '${field.data.datetype}',
dateformat: '${field.data.dateformat}',
dateDefaultValue: '${field.data.dateDefaultValue}',
dataMinValue: '${field.data.dataMinValue}',
dataMaxValue: '${field.data.dataMaxValue}',
});
</#if>
</#list>
form.render(null, 'dataForm');
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
}
initData();
// 关闭页面
$('.close').on('click', function () {
// 这里写返回按钮的逻辑,默认是关闭',
parent.layer.close(parent.layer.getFrameIndex(window.name));
});
});
</script>
</body>
</html>

View File

@ -1,29 +1,31 @@
<!DOCTYPE html>
<html>
<head>',
<base href="${contextPath}"/>
<head>
<base href="${r'${contextPath}'}"/>
<meta charset="utf-8">
<title>${formName}</title>
<title>${r'${formName}'}</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" type="text/css" href="assets/js/vendor/viewer/viewer.min.css">
<link rel="stylesheet" type="text/css" href="static/form/css/form.css">
</head>
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">',
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
${formFieldHtml}
<#list fields as field>
${field.html}
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit
lay-filter="submitForm">提交
</button>
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</div>
@ -31,9 +33,11 @@
</form>
</div>
</div>
<input type="hidden" id="formCode" value="${formCode}">,
<input type="hidden" id="formVersion" value="${formVersion}">,
<#list hiddenInputs as hiddenInput>
<input type="hidden" id="${hiddenInput}" value="${r'${'}${hiddenInput}${r'}'}">
</#list>
</div>
<script src="static/form/js/form-util.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
@ -41,81 +45,111 @@
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'form', 'laydate', 'laytpl', 'upload', 'restajax', 'datamessage', 'dialog'], function () {
}).use(['index', 'form', 'layer', 'laydate', 'laytpl', 'upload', 'restajax'], function () {
var $ = layui.$;
var form = layui.form;
var laytpl = layui.laytpl;
var layer = layui.layer;
var laydate = layui.laydate;
var upload = layui.upload;
var dialog = layui.dialog;
var restAjax = layui.restajax;
var dataMessage = layui.datamessage;
var viewerObj = {};
var queryParams = restAjax.params(window.location.href);
var token = queryParams.token;
var uid = queryParams.uid;
var formUtil = new FormUtil(layui, Viewer);
// 刷新下载模板',
function refreshDownloadTemplet(fileName, file) {
var dataRander = {};
dataRander[fileName] = file;
laytpl(document.getElementById(fileName + 'FileDownload').innerHTML).render(dataRander, function (html) {
document.getElementById(fileName + 'FileBox').innerHTML = html;
});
}
// 初始化文件列表',
function initFileList(fileName, ids, callback) {
var dataForm = {};
dataForm[fileName] = ids;
form.val('dataForm', dataForm);
if (!ids) {
refreshDownloadTemplet(fileName, []);
if (callback) {
callback(fileName, []);
}
return;
}
restAjax.get(restAjax.path('app/file/list-release', []), {
ids: ids
}, null, function (code, data) {
refreshDownloadTemplet(fileName, data);
if (callback) {
callback(fileName, data);
}
}, function (code, data) {
dialog.msg(data.msg);
});
}
${initSaveFunctions}
// 初始化内容
// 初始化
function initData() {
${initSaveScript}
}
var self = this;
var loadLayerIndex;
top.restAjax.get(restAjax.path('${initUrl}', [
<#list initParams as initParam>
$('#${initParam}').val(),
</#list>
uid
]), {}, {
headers: {
token: token
}
}, function(code, data) {
var dataFormData = {};
for(var i in data) {
dataFormData[i] = data[i] +'';
}
form.val('dataForm', dataFormData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.initCheckboxData('dataForm', dataFormData['${field.data.id}'], '${field.data.id}');
<#elseif field.data.tag == 'uploadImage'>
formUtil.initUploadImage('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadFile'>
formUtil.initUploadFile('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadVideo'>
formUtil.initUploadVideo('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadAudio'>
formUtil.initUploadAudio('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'date'>
formUtil.initDate({
id: '${field.data.id}',
datetype: '${field.data.datetype}',
dateformat: '${field.data.dateformat}',
dateDefaultValue: '${field.data.dateDefaultValue}',
dataMinValue: '${field.data.dataMinValue}',
dataMaxValue: '${field.data.dataMaxValue}',
});
</#if>
</#list>
form.render(null, 'dataForm');
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
}
initData();
// 关闭页面',
// 关闭页面
$('.close').on('click', function () {
// 这里写返回按钮的逻辑,默认是关闭',
parent.layer.close(parent.layer.getFrameIndex(window.name));
});
// 提交表单',
// 提交表单
form.on('submit(submitForm)', function (formData) {
dialog.confirm('确定提交吗?', function (index) {
dialog.close(index);
layer.confirm('确定提交吗?', function(confirmLayerIndex) {
layer.close(confirmLayerIndex);
// 提交前赋值
formUtil.clearUploadField(formData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.setCheckboxValue(formData, '${field.data.id}');
<#elseif field.data.tag == 'switch'>
formUtil.setSwitchValue(formData, '${field.data.id}');
</#if>
</#list>
var loadLayerIndex;
${submitSaveScript}
restAjax.post(restAjax.path('api/form-report/save/code/{formCode}/version/{formVersion}', [$('#formCode').val(), $('#formVersion').val()]), formData.field, null, function (code, data) {
restAjax.put(restAjax.path('${commitUrl}', [
<#list commitParams as commitParam>
$('#${commitParam}').val(),
</#list>
]), formData.field, {
headers: {
token: token
}
}, function (code, data) {
// 这里手动添加操作成功后的操作',
}, function (code, data) {
$('#submitFormBtn').show();
dialog.msg(data.msg);
layer.msg(data.msg);
}, function () {
$('#submitFormBtn').hide();
loadLayerIndex = dialog.msg(dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3});
}, function () {
dialog.close(loadLayerIndex);
layer.close(loadLayerIndex);
});
});
return false;

View File

@ -19,14 +19,13 @@
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<#list fields as field>
<#list fields as field>
${field.html}
</#list>
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交
</button>
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</div>
@ -34,8 +33,9 @@
</form>
</div>
</div>
<input type="hidden" id="formCode" value="${r'${formCode}'}">
<input type="hidden" id="formVersion" value="${r'${formVersion}'}">
<#list hiddenInputs as hiddenInput>
<input type="hidden" id="${hiddenInput}" value="${r'${'}${hiddenInput}${r'}'}">
</#list>
</div>
<script src="static/form/js/form-util.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
@ -53,52 +53,28 @@
var restAjax = layui.restajax;
var formUtil = new FormUtil(layui, Viewer);
// 初始化文件列表',
function initFileList(fileName, ids, callback) {
var dataForm = {};
dataForm[fileName] = ids;
form.val('dataForm', dataForm);
if (!ids) {
refreshDownloadTemplet(fileName, []);
if (callback) {
callback(fileName, []);
}
return;
}
restAjax.get(restAjax.path('app/file/list-release', []), {
ids: ids
}, null, function (code, data) {
refreshDownloadTemplet(fileName, data);
if (callback) {
callback(fileName, data);
}
}, function (code, data) {
dialog.msg(data.msg);
});
}
// 初始化
function initData() {
<#list fields as field>
<#if field.tag == 'uploadImage'>
formUtil.initUploadImage('${field.id}', ${field.count});
<#elseif field.tag == 'uploadFile'>
formUtil.initUploadFile('${field.id}', ${field.count});
<#elseif field.tag == 'uploadVideo'>
formUtil.initUploadVideo('${field.id}', ${field.count});
<#elseif field.tag == 'uploadAudio'>
formUtil.initUploadAudio('${field.id}', ${field.count});
<#elseif field.tag == 'date'>
<#list fields as field>
<#if field.data.tag == 'uploadImage'>
formUtil.initUploadImage('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadFile'>
formUtil.initUploadFile('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadVideo'>
formUtil.initUploadVideo('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadAudio'>
formUtil.initUploadAudio('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'date'>
formUtil.initDate({
id: '${field.id}',
datetype: '${field.datetype}',
dateformat: '${field.dateformat}',
dateDefaultValue: '${field.dateDefaultValue}',
dataMinValue: '${field.dataMinValue}',
dataMaxValue: '${field.dataMaxValue}',
id: '${field.data.id}',
datetype: '${field.data.datetype}',
dateformat: '${field.data.dateformat}',
dateDefaultValue: '${field.data.dateDefaultValue}',
dataMinValue: '${field.data.dataMinValue}',
dataMaxValue: '${field.data.dataMaxValue}',
});
</#if>
</#list>
</#if>
</#list>
}
initData();
@ -113,17 +89,22 @@
layer.confirm('确定提交吗?', function(confirmLayerIndex) {
layer.close(confirmLayerIndex);
// 提交前赋值
<#list fields as field>
<#if field.tag == 'checkbox'>
formUtil.setCheckboxValue(formData, '${field.id}');
<#elseif field.tag == 'switch'>
formUtil.setSwitchValue(formData, '${field.id}');
</#if>
</#list>
// 提交前处理
formUtil.clearUploadField(formData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.setCheckboxValue(formData, '${field.data.id}');
<#elseif field.data.tag == 'switch'>
formUtil.setSwitchValue(formData, '${field.data.id}');
</#if>
</#list>
var loadLayerIndex;
restAjax.post(restAjax.path('api/form-report/save/code/{formCode}/version/{formVersion}', [$('#formCode').val(), $('#formVersion').val()]), formData.field, null, function (code, data) {
restAjax.post(restAjax.path('${commitUrl}', [
<#list commitParams as commitParam>
$('#${commitParam}').val(),
</#list>
]), formData.field, null, function (code, data) {
// 这里手动添加操作成功后的操作',
}, function (code, data) {
$('#submitFormBtn').show();

View File

@ -0,0 +1,115 @@
<!DOCTYPE html>
<html>
<head>
<base href="${r'${contextPath}'}"/>
<meta charset="utf-8">
<title>${r'${formName}'}</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" type="text/css" href="assets/js/vendor/viewer/viewer.min.css">
<link rel="stylesheet" type="text/css" href="static/form/css/form.css">
</head>
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<#list fields as field>
${field.html}
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</div>
</div>
</form>
</div>
</div>
<#list hiddenInputs as hiddenInput>
<input type="hidden" id="${hiddenInput}" value="${r'${'}${hiddenInput}${r'}'}">
</#list>
</div>
<script src="static/form/js/form-util.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'form', 'layer', 'laydate', 'laytpl', 'upload', 'restajax'], function () {
var $ = layui.$;
var form = layui.form;
var layer = layui.layer;
var laydate = layui.laydate;
var restAjax = layui.restajax;
var queryParams = restAjax.params(window.location.href);
var uid = queryParams.uid;
var formUtil = new FormUtil(layui, Viewer);
// 初始化
function initData() {
var self = this;
var loadLayerIndex;
top.restAjax.get(restAjax.path('${initUrl}', [
<#list initParams as initParam>
$('#${initParam}').val(),
</#list>
uid
]), {}, null, function(code, data) {
var dataFormData = {};
for(var i in data) {
dataFormData[i] = data[i] +'';
}
form.val('dataForm', dataFormData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.initCheckboxData('dataForm', dataFormData['${field.data.id}'], '${field.data.id}');
<#elseif field.data.tag == 'uploadImage'>
formUtil.initUploadImage('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadFile'>
formUtil.initUploadFile('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadVideo'>
formUtil.initUploadVideo('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadAudio'>
formUtil.initUploadAudio('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'date'>
formUtil.initDate({
id: '${field.data.id}',
datetype: '${field.data.datetype}',
dateformat: '${field.data.dateformat}',
dateDefaultValue: '${field.data.dateDefaultValue}',
dataMinValue: '${field.data.dataMinValue}',
dataMaxValue: '${field.data.dataMaxValue}',
});
</#if>
</#list>
form.render(null, 'dataForm');
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
}
initData();
// 关闭页面
$('.close').on('click', function () {
// 这里写返回按钮的逻辑,默认是关闭',
parent.layer.close(parent.layer.getFrameIndex(window.name));
});
});
</script>
</body>
</html>

View File

@ -1,29 +1,31 @@
<!DOCTYPE html>
<html>
<head>',
<base href="${contextPath}"/>
<head>
<base href="${r'${contextPath}'}"/>
<meta charset="utf-8">
<title>${formName}</title>
<title>${r'${formName}'}</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" type="text/css" href="assets/js/vendor/viewer/viewer.min.css">
<link rel="stylesheet" type="text/css" href="static/form/css/form.css">
</head>
<body>
<div class="layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">',
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
${formFieldHtml}
<#list fields as field>
${field.html}
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit
lay-filter="submitForm">提交
</button>
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</div>
@ -31,9 +33,11 @@
</form>
</div>
</div>
<input type="hidden" id="formCode" value="${formCode}">,
<input type="hidden" id="formVersion" value="${formVersion}">,
<#list hiddenInputs as hiddenInput>
<input type="hidden" id="${hiddenInput}" value="${r'${'}${hiddenInput}${r'}'}">
</#list>
</div>
<script src="static/form/js/form-util.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
@ -41,177 +45,102 @@
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'form', 'laydate', 'laytpl', 'upload', 'restajax', 'datamessage', 'dialog'], function () {
}).use(['index', 'form', 'layer', 'laydate', 'laytpl', 'upload', 'restajax'], function () {
var $ = layui.$;
var form = layui.form;
var laytpl = layui.laytpl;
var layer = layui.layer;
var laydate = layui.laydate;
var upload = layui.upload;
var dialog = layui.dialog;
var restAjax = layui.restajax;
var dataMessage = layui.datamessage;
var viewerObj = {};
var queryParams = restAjax.params(window.location.href);
var uid = queryParams.uid;
var formUtil = new FormUtil(layui, Viewer);
// 初始化图片方法
function initUploadImage(fileName, fileExplain, maxCount) {
maxCount = maxCount ? parseInt(maxCount) : 9
maxCount = maxCount < 0 ? 9 : maxCount;
var id = '#' + fileName;
var boxId = '#' + fileName + 'FileBox';
var uploadClass = '.' + fileName + '-upload';
var removeClass = '.' + fileName + '-remove';
function initImage(callback) {
var fileIds = $(id).val();
var fileIdArray = fileIds.split(',');
var html = '';
for (var i = 0, fileId; fileId = fileIdArray[i++];) {
var img = [
'<div class="upload-image-box">',
' <span class="upload-image-span">',
' <img src="route/file/download/false/' + fileId + '" align="加载失败">',
' </span>',
' <a class="layui-btn layui-btn-xs layui-btn-danger text-danger remove-image ' + fileName + '-remove" href="javascript:void(0);" data-id="' + fileId + '" data-name="' + fileName + '">',
' <i class="fa fa-trash-o"></i>',
' </a>',
'</div>'
].join('\n');
html += img;
}
if (fileIdArray.length < maxCount) {
var upload = [
'<div class="upload-image-box" style="width: auto; height: auto; padding: 5px;">',
' <a href="javascript:void(0);" class="' + fileName + '-upload" data-explain="' + fileExplain + '" data-name="' + fileName + '">',
' <i class="fa fa-plus-square-o" style="font-size: 70px;"></i>',
' </a>',
'</div>'
].join('\n');
html += upload;
}
$(boxId).empty();
$(boxId).append(html);
callback ? callback() : '';
};
// 添加点击时间
function addClick() {
$(document).on('click', uploadClass, function () {
var name = this.dataset.name;
var explain = this.dataset.explain;
top.dialog.file({
type: 'image',
title: '【' + explain + '】图片上传',
width: '400px',
height: '420px',
maxFileCount: '1',
onClose: function () {
var uploadFileArray = top.dialog.dialogData.uploadFileArray;
if (typeof (uploadFileArray) != 'undefined' && uploadFileArray.length > 0) {
var files = $('#' + name).val();
for (var j = 0, file = uploadFileArray[j]; file = uploadFileArray[j++];) {
if (files.length > 0) {
files += ',';
}
files += file.data;
}
$('#'+ name).val(files);
initImage(function () {
viewerObj[name].update();
});
}
}
});
})
$(document).on('click', removeClass, function () {
var name = this.dataset.name;
var id = this.dataset.id;
var files = $('#' + name).val().replace(id, '');
files = files.replace(/\,+/g, ',');
if (files.charAt(0) == ',') {
files = files.substring(1);
}
if (files.charAt(files.length - 1) == ',') {
files = files.substring(0, files.length - 1);
}
$('#' + name).val(files);
initImage(function () {
viewerObj[name].update();
});
});
}
// 初始化
initImage(function () {
viewerObj[fileName] = new Viewer(document.getElementById(fileName + 'FileBox'), {navbar: false});
});
addClick();
}
// 刷新下载模板',
function refreshDownloadTemplet(fileName, file) {
var dataRander = {};
dataRander[fileName] = file;
laytpl(document.getElementById(fileName + 'FileDownload').innerHTML).render(dataRander, function (html) {
document.getElementById(fileName + 'FileBox').innerHTML = html;
});
}
// 初始化文件列表',
function initFileList(fileName, ids, callback) {
var dataForm = {};
dataForm[fileName] = ids;
form.val('dataForm', dataForm);
if (!ids) {
refreshDownloadTemplet(fileName, []);
if (callback) {
callback(fileName, []);
}
return;
}
restAjax.get(restAjax.path('app/file/list-release', []), {
ids: ids
}, null, function (code, data) {
refreshDownloadTemplet(fileName, data);
if (callback) {
callback(fileName, data);
}
}, function (code, data) {
dialog.msg(data.msg);
});
}
${initSaveFunctions}
// 初始化内容
// 初始化
function initData() {
${initSaveScript}
}
var self = this;
var loadLayerIndex;
top.restAjax.get(restAjax.path('${initUrl}', [
<#list initParams as initParam>
$('#${initParam}').val(),
</#list>
uid
]), {}, null, function(code, data) {
var dataFormData = {};
for(var i in data) {
dataFormData[i] = data[i] +'';
}
form.val('dataForm', dataFormData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.initCheckboxData('dataForm', dataFormData['${field.data.id}'], '${field.data.id}');
<#elseif field.data.tag == 'uploadImage'>
formUtil.initUploadImage('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadFile'>
formUtil.initUploadFile('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadVideo'>
formUtil.initUploadVideo('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'uploadAudio'>
formUtil.initUploadAudio('${field.data.id}', ${field.data.count});
<#elseif field.data.tag == 'date'>
formUtil.initDate({
id: '${field.data.id}',
datetype: '${field.data.datetype}',
dateformat: '${field.data.dateformat}',
dateDefaultValue: '${field.data.dateDefaultValue}',
dataMinValue: '${field.data.dataMinValue}',
dataMaxValue: '${field.data.dataMaxValue}',
});
</#if>
</#list>
form.render(null, 'dataForm');
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
}
initData();
// 关闭页面',
// 关闭页面
$('.close').on('click', function () {
// 这里写返回按钮的逻辑,默认是关闭',
parent.layer.close(parent.layer.getFrameIndex(window.name));
});
// 提交表单',
// 提交表单
form.on('submit(submitForm)', function (formData) {
dialog.confirm('确定提交吗?', function (index) {
dialog.close(index);
layer.confirm('确定提交吗?', function(confirmLayerIndex) {
layer.close(confirmLayerIndex);
// 提交前赋值
formUtil.clearUploadField(formData);
<#list fields as field>
<#if field.data.tag == 'checkbox'>
formUtil.setCheckboxValue(formData, '${field.data.id}');
<#elseif field.data.tag == 'switch'>
formUtil.setSwitchValue(formData, '${field.data.id}');
</#if>
</#list>
var loadLayerIndex;
${submitSaveScript}
restAjax.post(restAjax.path('api/form-report/save/code/{formCode}/version/{formVersion}', [$('#formCode').val(), $('#formVersion').val()]), formData.field, null, function (code, data) {
restAjax.put(restAjax.path('${commitUrl}', [
<#list commitParams as commitParam>
$('#${commitParam}').val(),
</#list>
]), formData.field, null, function (code, data) {
// 这里手动添加操作成功后的操作',
}, function (code, data) {
$('#submitFormBtn').show();
dialog.msg(data.msg);
layer.msg(data.msg);
}, function () {
$('#submitFormBtn').hide();
loadLayerIndex = dialog.msg(dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3});
}, function () {
dialog.close(loadLayerIndex);
layer.close(loadLayerIndex);
});
});
return false;