From 6f08381705f1f7ef6c7753e2d57da897e354a8ec Mon Sep 17 00:00:00 2001 From: lizhengwei <171332584@qq.com> Date: Wed, 18 Feb 2026 18:06:13 +0800 Subject: [PATCH] =?UTF-8?q?h5=20=E5=8A=A8=E6=80=81=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E6=8A=98=E8=85=BE=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-site/ruoyi-h5/doc/http/form.http | 40 ++- .../java/com/luban/api/MallH5Application.java | 2 +- .../luban/api/controller/FormController.java | 126 --------- .../api/controller/H5FormController.java | 256 ++++++++++++++++++ .../api/controller/H5ProjectController.java | 35 +++ .../luban/api/controller/WorkController.java | 43 ++- .../api/convert/FormSubmissionConvert.java | 15 +- .../luban/api/dto/H5FormSubmissionDTO.java | 2 +- .../java/com/luban/api/dto/PageDtoBase.java | 8 +- .../java/com/luban/api/dto/WorkQueryDTO.java | 17 +- .../api/dto/query/H5ProjectQueryDTO.java | 13 +- .../java/com/luban/api/entity/H5Project.java | 2 +- .../com/luban/api/service/FormService.java | 55 ---- .../com/luban/api/service/H5FormService.java | 57 ++++ .../com/luban/api/service/WorkService.java | 11 + .../api/service/impl/FormServiceImpl.java | 61 ----- .../api/service/impl/H5FormServiceImpl.java | 174 ++++++++++++ .../service/impl/H5ProjectServiceImpl.java | 9 +- .../api/service/impl/WorkServiceImpl.java | 24 ++ .../src/main/resources/application.yml | 4 +- .../mapper/ruoyi-h5/H5ProjectMapper.xml | 3 + 21 files changed, 646 insertions(+), 311 deletions(-) delete mode 100644 ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/FormController.java create mode 100644 ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5FormController.java delete mode 100644 ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/FormService.java create mode 100644 ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5FormService.java delete mode 100644 ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/FormServiceImpl.java create mode 100644 ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5FormServiceImpl.java diff --git a/ruoyi-site/ruoyi-h5/doc/http/form.http b/ruoyi-site/ruoyi-h5/doc/http/form.http index 6727cdd43..6ac2571f4 100644 --- a/ruoyi-site/ruoyi-h5/doc/http/form.http +++ b/ruoyi-site/ruoyi-h5/doc/http/form.http @@ -1,26 +1,48 @@ ### 提交表单数据 -POST {{host}}/h5/form/submit +POST http://localhost:8080/form/submit Content-Type: application/json { "projectId": 1, + "formId": 461709, + "templateFormId": 450055, "formData": { - "name": "张三", - "age": 18, - "email": "zhangsan@example.com" + "19fef684-b6ef-4bfb-8d68-603c99444ac5": "文本内容", + "6cbf9138-a20d-428c-b635-291246da3926": "13255556645", + "14154ccc-c2b3-4d27-8eb2-e3e422af294f": "1713322582323@qq.com" } } -### 根据项目ID分页查询表单提交记录(带过滤条件) -POST {{host}}/h5/form/page/project/1?pageNum=1&pageSize=10 +### save表单版本+1 +POST http://localhost:8080/form/saveForm Content-Type: application/json { - "name": "张三1" + "projectId": 1, + "formId": 461709, + "templateFormId": 450055, + "formData": { + "19fef684-b6ef-4bfb-8d68-603c99444ac5": "测试版本+1", + "6cbf9138-a20d-428c-b635-291246da3926": "12345678901" + } +} + +### 根据项目ID分页查询表单提交记录 +POST http://localhost:8080/form/page/project/1?pageNum=1&pageSize=10 +Content-Type: application/json + +{ + "field1": "value1" } ### 根据提交记录ID获取表单数据详情 -GET {{host}}/h5/form/detail/1 +GET http://localhost:8080/form/detail/1 ### 根据项目ID获取所有表单数据 -GET {{host}}/h5/form/list/project/1 +GET http://localhost:8080/form/list/project/1 + +### 获取所有表单信息 +GET http://localhost:8080/form/editor/forms?templateId=450055&hasDeleted=true + +### 获取所有表单相关字段 +GET http://localhost:8080/form/editor/templateForms?templateFormId=450055 \ No newline at end of file diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/MallH5Application.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/MallH5Application.java index 9a424b279..9a1d9cfc8 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/MallH5Application.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/MallH5Application.java @@ -10,7 +10,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @author WeiHongBin */ @EnableDubbo -@SpringBootApplication +@SpringBootApplication(scanBasePackages = {"com.luban","com.dromara.md.form"}) public class MallH5Application { public static void main(String[] args) { diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/FormController.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/FormController.java deleted file mode 100644 index 1e1cc3f15..000000000 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/FormController.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.luban.api.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.luban.api.dto.H5FormSubmissionDTO; -import com.luban.api.entity.FormSubmission; -import com.luban.api.service.FormService; -import com.luban.api.util.JSON; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletRequest; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.ServletUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - *

- * 表单控制器 - *

- * - * @author your-name - */ -@RestController -@RequestMapping("/form") -@Tag(name = "表单管理", description = "表单提交与查询") -@Slf4j -public class FormController { - - @Autowired - private FormService formService; - - @Autowired - private JSON json; - - - /** - * save表单版本+1 - */ - @Operation(summary = "save表单版本+1") - @PostMapping("/saveForm") - public Boolean saveForm(@RequestBody SubmitFormRequest request, HttpServletRequest httpRequest) { - //TODO待完成 - return null; - } - - - /** - * 提交表单数据 - * - * @param request 请求体包含表单数据 - * @return 是否提交成功 - */ - @Operation(summary = "提交表单数据") - @PostMapping("/submit") - public Boolean submitForm(@RequestBody SubmitFormRequest request, HttpServletRequest httpRequest) { - // 获取客户端IP地址 - String ipAddress = ServletUtils.getClientIP(); - // 获取User-Agent - String userAgent = httpRequest.getHeader("User-Agent"); - - H5FormSubmissionDTO dto = new H5FormSubmissionDTO(); - dto.setProjectId(request.getProjectId()); - //TODO TODO待完成 formId - dto.setFormId(null); - dto.setTempletFormId(null); - dto.setFormData(request.getFormData()); - dto.setIpAddress(ipAddress); - dto.setUserAgent(userAgent); - return formService.submitFormData(dto); - } - - /** - * 根据项目ID分页查询表单提交记录 - * - * @param projectId 项目ID - * @param fieldFilters 字段过滤条件 - * @param pageNum 页码 - * @param pageSize 每页大小 - * @return 表单提交记录分页数据 - */ - @Operation(summary = "根据项目ID分页查询表单提交记录") - @PostMapping("/page/project/{projectId}") - public IPage pageByProjectId( - @PathVariable Long projectId, - @RequestBody(required = false) Map fieldFilters, - @RequestParam(defaultValue = "1") Integer pageNum, - @RequestParam(defaultValue = "10") Integer pageSize) { - return formService.pageFormSubmissionsByProjectId(projectId, fieldFilters, pageNum, pageSize); - } - - /** - * 根据提交记录ID获取表单数据详情 - * - * @param submissionId 提交记录ID - * @return 表单数据详情 - */ - @Operation(summary = "根据提交记录ID获取表单数据详情") - @GetMapping("/detail/{submissionId}") - public H5FormSubmissionDTO getFormDataDetail(@PathVariable Long submissionId) { - return formService.getFormDataDetail(submissionId); - } - - /** - * 根据项目ID获取所有表单数据 - * - * @param projectId 项目ID - * @return 表单数据列表 - */ - @Operation(summary = "根据项目ID获取所有表单数据") - @GetMapping("/list/project/{projectId}") - public List listByProjectId(@PathVariable Long projectId) { - return formService.listFormDataByProjectId(projectId); - } - - @Getter - @Setter - public static class SubmitFormRequest { - private Long projectId; - private Map formData; - } -} diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5FormController.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5FormController.java new file mode 100644 index 000000000..d3a93fae7 --- /dev/null +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5FormController.java @@ -0,0 +1,256 @@ +package com.luban.api.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.luban.api.dto.H5FormSubmissionDTO; +import com.luban.api.service.H5FormService; +import com.luban.api.util.JSON; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.ServletUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 表单控制器 + *

+ * + * @author your-name + */ +@RestController +@RequestMapping("/form") +@Tag(name = "表单管理", description = "表单提交与查询") +@Slf4j +public class H5FormController { + + @Autowired + private H5FormService formService; + + @Autowired + private JSON json; + + + /** + * save表单版本+1 + */ + @Operation(summary = "save表单版本+1") + @PostMapping("/saveForm") + public Boolean saveForm(@RequestBody SubmitFormRequest request, HttpServletRequest httpRequest) { + // 获取客户端IP地址 + String ipAddress = ServletUtils.getClientIP(); + // 获取User-Agent + String userAgent = httpRequest.getHeader("User-Agent"); + + H5FormSubmissionDTO dto = new H5FormSubmissionDTO(); + // 从请求中获取formId和templetFormId + dto.setFormId(request.getFormId()); + dto.setTempletFormId(request.getTemplateFormId()); + + // 如果formData为空,初始化为Map + Map formData = request.getFormData(); + if (formData == null) { + formData = new HashMap<>(); + } + + // 添加版本信息到formData + // 版本号可以基于当前时间戳或自增计数器 + long version = System.currentTimeMillis() / 1000; // 使用时间戳作为版本号 + formData.put("version", version); + formData.put("saveTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + + dto.setFormData(formData); + dto.setIpAddress(ipAddress); + dto.setUserAgent(userAgent); + + return formService.submitFormData(dto); + } + + + /** + * 提交表单数据 + * + * @param request 请求体包含表单数据 + * @return 是否提交成功 + */ + @Operation(summary = "提交表单数据") + @PostMapping("/submit") + public Boolean submitForm(@RequestBody SubmitFormRequest request, HttpServletRequest httpRequest) { + // 获取客户端IP地址 + String ipAddress = ServletUtils.getClientIP(); + // 获取User-Agent + String userAgent = httpRequest.getHeader("User-Agent"); + + H5FormSubmissionDTO dto = new H5FormSubmissionDTO(); + dto.setFormId(request.getFormId()); + dto.setTempletFormId(request.getTemplateFormId()); + dto.setFormData(request.getFormData()); + dto.setIpAddress(ipAddress); + dto.setUserAgent(userAgent); + var 提交参数例子 = """ + { + "templet_form_id": 450055, + "form_id": "461709", + "form_data": { + "19fef684-b6ef-4bfb-8d68-603c99444ac5": "文本内容", + "6cbf9138-a20d-428c-b635-291246da3926": "13255556645", + "14154ccc-c2b3-4d27-8eb2-e3e422af294f": "1713322582323@qq.com" + } + } + + """; + return formService.submitFormData(dto); + } + + /** + * 根据templateFormId获取所有表单数据 + * + * @param templateFormId templateFormId + * @return 表单数据列表 + */ + @Operation(summary = "分页查询提交数据") + @GetMapping("/list/detail/page") + public IPage listDetailPage(@RequestParam Long templateFormId, + @RequestParam String orderBy, + @RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "10") Integer pageSize) { + + String getEditorTemplateFormResp返回结构 = """ + { + "page": "1", + "page_size": "20", + "total": 2, + "data": [ + { + "id": 26964584, + "form_id": 461709, + "data": "{\\"19fef684-b6ef-4bfb-8d68-603c99444ac5\\":\\"1\\",\\"14154ccc-c2b3-4d27-8eb2-e3e422af294f\\":\\"1212@134.com\\",\\"b8256478-4f71-4484-a859-f71628c6107a\\":\\"5656456456\\"}", + "ip": "27.17.43.218, 110.75.191.49", + "deleted_at": null, + "created_at": "2025-11-14 17:25:52", + "updated_at": "2025-11-14 17:25:52", + "platform_user_id": 0 + }, + { + "id": 26963271, + "form_id": 461709, + "data": "{\\"19fef684-b6ef-4bfb-8d68-603c99444ac5\\":\\"文本内容\\",\\"6cbf9138-a20d-428c-b635-291246da3926\\":\\"13255556645\\",\\"14154ccc-c2b3-4d27-8eb2-e3e422af294f\\":\\"1713322582323@qq.com\\"}", + "ip": "27.17.43.218, 110.75.191.24", + "deleted_at": null, + "created_at": "2025-11-14 14:17:44", + "updated_at": "2025-11-14 14:17:44", + "platform_user_id": 0 + } + ] + } + """; + return formService.listDetailPage(templateFormId, + orderBy, + pageNum, + pageSize); + } + + @Operation(summary = "获取所有表单") + @GetMapping("editor/forms") + public List editorForms(@RequestParam Long templateId, + @RequestParam(required = false, defaultValue = "true") Boolean hasDeleted) { + return formService.getEditorForms(templateId, hasDeleted); + } + + String getEditorForms返回结构 = """ + { + "current_page": 1, + "data": [ + { + "id": 450055, + "name": "表单1", + "templet_id": 7512497, + "content_form_id": "c8a6b97e-f5ab-48c8-8e29-ce1b139c3488", + "form_id": "461709", + "deleted_at": null, + "created_at": "2025-11-14 14:17:10", + "updated_at": "2025-11-14 14:17:10" + } + ], + "first_page_url": "\\/?page=1", + "from": 1, + "next_page_url": null, + "path": "\\/", + "per_page": 1000, + "prev_page_url": null, + "to": 1 + } + + """; + + + @Operation(summary = "获取所有表单相关字段") + @GetMapping("editor/templateForms") + public List editorTemplateForms(@RequestParam Long templateFormId) { + return formService.getEditorTemplateForms(templateFormId); + } + + String editorTemplateForms返回结构 = """ + { + "id": 450055, + "name": "表单1", + "templet_id": 7512497, + "content_form_id": "c8a6b97e-f5ab-48c8-8e29-ce1b139c3488", + "form_id": "461709", + "deleted_at": null, + "created_at": "2025-11-14 14:17:10", + "updated_at": "2025-11-14 17:25:18", + "auth": { + "wechat": 0, + "max_count": "", + "wechat_limit": { + "type": "wechat", + "count": "", + "value": false, + "label": "微信限制", + "limit": "max" + }, + "ip_limit": { + "type": "ip", + "count": "", + "value": false, + "label": "IP限制", + "limit": "max" + }, + "equipment_limit": { + "type": "equipment", + "count": "", + "value": false, + "label": "设备限制", + "limit": "max" + } + }, + "extends": { + "questions": [] + }, + "fields": { + "19fef684-b6ef-4bfb-8d68-603c99444ac5": "您的姓名修改", + "14154ccc-c2b3-4d27-8eb2-e3e422af294f": "您的电子邮箱地址", + "b8256478-4f71-4484-a859-f71628c6107a": "测试新加文本" + } + } + """; + + + @Getter + @Setter + public static class SubmitFormRequest { + private Long templateFormId; + private Long formId; + private Map formData; + } +} diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5ProjectController.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5ProjectController.java index 427430e9e..1fd70b7d9 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5ProjectController.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/H5ProjectController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.luban.api.dto.H5ProjectContentDTO; import com.luban.api.dto.query.H5ProjectQueryDTO; import com.luban.api.entity.H5Project; +import com.luban.api.service.H5FormService; import com.luban.api.service.H5ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -31,6 +32,8 @@ public class H5ProjectController { @Autowired private H5ProjectService h5ProjectService; + @Autowired + private H5FormService h5FormService; /** * 查询所有H5项目 @@ -123,6 +126,38 @@ public class H5ProjectController { return h5ProjectService.updateH5ProjectWithContent(h5Project, request.getContent(), request.getGroupIds()); } + + /** + * 更新H5项目 + * + * @param id H5项目ID + * @param request 包含H5项目信息和内容的请求 + * @return 是否更新成功 + */ + @Operation(summary = "更新状态") + @PutMapping("updateStatus") + public Boolean 更新状态H5Project(@RequestParam Long id, @RequestBody CreateH5ProjectRequest request) { + H5Project h5Project = h5ProjectService.getById(id); + if (h5Project == null) { + throw new RuntimeException("项目不存在"); + } + + h5Project.setType(request.getType()); + h5Project.setTitle(request.getTitle()); + h5Project.setContentUpdatedAt(request.getContentUpdatedAt()); + h5Project.setDescription(request.getDescription()); + h5Project.setPreviewUrl(request.getPreviewUrl()); + h5Project.setPreviewUrlWatermark(request.getPreviewUrlWatermark()); + h5Project.setPreviewWidth(request.getPreviewWidth()); + h5Project.setPreviewHeight(request.getPreviewHeight()); + h5Project.setStatus(request.getStatus());//TODO 改成发布状态 + + //获取表单并保存 + h5FormService.saveForm(request.getContent()); + + return h5ProjectService.updateH5ProjectWithContent(h5Project, request.getContent(), request.getGroupIds()); + } + /** * 删除H5项目 * diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/WorkController.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/WorkController.java index d23546051..4f1c9da86 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/WorkController.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/controller/WorkController.java @@ -2,15 +2,17 @@ package com.luban.api.controller; import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dromara.md.form.api.constant.BaseConstant; +import com.dromara.md.form.utils.TenantHelper; import com.luban.api.convert.WorkConvert; import com.luban.api.dto.WorkCreateDTO; import com.luban.api.dto.WorkQueryDTO; import com.luban.api.dto.WorkUpdateDTO; +import com.luban.api.dto.query.H5ProjectQueryDTO; +import com.luban.api.entity.H5Project; import com.luban.api.entity.Work; +import com.luban.api.service.H5ProjectService; import com.luban.api.service.WorkService; import com.luban.api.vo.WorkVO; import io.swagger.v3.oas.annotations.Operation; @@ -18,6 +20,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; @@ -42,12 +45,11 @@ import java.util.stream.Collectors; @Slf4j public class WorkController { + @Autowired + private H5ProjectService h5ProjectService; - private final WorkService workService; - - public WorkController(WorkService workService) { - this.workService = workService; - } + @Autowired + private WorkService workService; @Operation(summary = "根据workId查询") @@ -62,25 +64,14 @@ public class WorkController { return WorkConvert.toVO(workService.getById(id)); } - @Operation(summary = "查询所有work") - @GetMapping - public List listAllWorks(@Valid WorkQueryDTO dto) { - WorkVO vo = new WorkVO(); - vo.setTemplate(Boolean.parseBoolean(dto.getIs_template())); - BeanUtils.copyProperties(dto, vo); - return workService.list(new QueryWrapper<>(WorkConvert.toEntity(vo))).stream().map(WorkConvert::toVO).collect(Collectors.toList()); - } - - @Operation(summary = "分页查询works") - @GetMapping("/pageable") - public IPage listWorks(@Valid WorkQueryDTO dto) { - WorkVO vo = new WorkVO(); - vo.setTemplate(Boolean.parseBoolean(dto.getIs_template())); - BeanUtils.copyProperties(dto, vo); - IPage page = workService.page(new Page<>(dto.getCurrent(), dto.getSize()), new LambdaQueryWrapper<>(WorkConvert.toEntity(vo)).orderByDesc(Work::getCreateTime)); - List voList = page.getRecords().stream().map(WorkConvert::toVO).collect(Collectors.toList()); - return new Page(page.getCurrent(), page.getSize(), page.getTotal()).setPages(page.getPages()).setRecords(voList); + @GetMapping("/page") + public IPage listWorks(@Valid H5ProjectQueryDTO dto) { + if (dto.getIsTemplate()) { + return TenantHelper.dynamic(BaseConstant.TplTenantId, () -> h5ProjectService.pageH5Projects(dto)); + } else { + return h5ProjectService.pageH5Projects(dto); + } } @Operation(summary = "创建work") diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/convert/FormSubmissionConvert.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/convert/FormSubmissionConvert.java index 573cf4396..c541d615d 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/convert/FormSubmissionConvert.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/convert/FormSubmissionConvert.java @@ -1,6 +1,8 @@ package com.luban.api.convert; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.luban.api.dto.H5FormSubmissionDTO; import com.luban.api.entity.FormSubmission; import org.springframework.beans.BeanUtils; @@ -55,6 +57,17 @@ public class FormSubmissionConvert { return dtoList; } + + public static IPage toPageDTO(IPage page) { + IPage newPage = new Page<>(); + newPage.setPages(page.getPages()); + newPage.setRecords(toDTO(page.getRecords())); + newPage.setTotal(page.getTotal()); + newPage.setSize(page.getSize()); + newPage.setCurrent(page.getCurrent()); + return newPage; + } + /** * 将H5FormSubmissionDTO转换为FormSubmission实体 * @@ -73,4 +86,4 @@ public class FormSubmissionConvert { } return entity; } -} \ No newline at end of file +} diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/H5FormSubmissionDTO.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/H5FormSubmissionDTO.java index 3df01320b..b5e000544 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/H5FormSubmissionDTO.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/H5FormSubmissionDTO.java @@ -28,7 +28,7 @@ public class H5FormSubmissionDTO { * 表单ID */ @Schema(title = "表单ID") - private String formId; + private Long formId; /** * 表单数据 diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/PageDtoBase.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/PageDtoBase.java index 099caa0e4..976a41df1 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/PageDtoBase.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/PageDtoBase.java @@ -22,7 +22,7 @@ public class PageDtoBase { * 页码 */ @Schema(title = "页码") - protected Integer current = 1; + protected Integer page = 1; public void setSize(Integer size) { @@ -31,9 +31,9 @@ public class PageDtoBase { } } - public void setCurrent(Integer current) { - if (current != null) { - this.current = current; + public void setPage(Integer page) { + if (page != null) { + this.page = page; } } } diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/WorkQueryDTO.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/WorkQueryDTO.java index ce6be983c..7661fa014 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/WorkQueryDTO.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/WorkQueryDTO.java @@ -5,9 +5,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import java.time.LocalDateTime; -import java.util.List; - /** * @author WeiHongBin */ @@ -19,17 +16,7 @@ public class WorkQueryDTO extends PageDtoBase { private String title; - private String description; + private Boolean isPublish; - private String coverImageUrl; - - private List pages; - - private LocalDateTime createTime; - - private LocalDateTime updateTime; - - private String is_publish; - - private String is_template; + private Boolean isTemplate; } diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/query/H5ProjectQueryDTO.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/query/H5ProjectQueryDTO.java index 9782361b3..5bfc22f07 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/query/H5ProjectQueryDTO.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/dto/query/H5ProjectQueryDTO.java @@ -17,15 +17,16 @@ import java.util.List; @Schema(title = "H5项目查询对象") public class H5ProjectQueryDTO extends PageDtoBase { - /** - * 分组ID列表 - */ @Schema(description = "分组ID列表") private List groupIds; - /** - * 项目标题 - */ @Schema(description = "项目标题") private String title; + + @Schema(description = "是否发布") + private Integer status; + + @Schema(description = "是否模板") + private Boolean isTemplate = false; + } diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Project.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Project.java index 3790f6b83..d49e6925f 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Project.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/entity/H5Project.java @@ -57,7 +57,7 @@ public class H5Project implements Serializable { private String description; /** - * 预览图URL + * 预览图URL TODO 后续合并成一个属性 */ private String previewUrl; diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/FormService.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/FormService.java deleted file mode 100644 index a78062103..000000000 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/FormService.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.luban.api.service; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.luban.api.dto.H5FormSubmissionDTO; -import com.luban.api.entity.FormSubmission; - -import java.util.List; -import java.util.Map; - -/** - *

- * 表单服务类 - *

- * - * @author lizhw - */ -public interface FormService extends IService { - - /** - * 提交表单数据 - * - * @param dto 表单数据传输对象 - * @return 是否提交成功 - */ - boolean submitFormData(H5FormSubmissionDTO dto); - - /** - * 根据项目ID分页查询表单提交记录,支持字段过滤 - * - * @param projectId 项目ID - * @param fieldFilters 字段过滤条件 - * @param pageNum 页码 - * @param pageSize 每页大小 - * @return 表单提交记录分页数据 - */ - IPage pageFormSubmissionsByProjectId(Long projectId, Map fieldFilters, Integer pageNum, Integer pageSize); - - /** - * 根据提交记录ID获取表单数据详情 - * - * @param submissionId 提交记录ID - * @return 表单数据详情 - */ - H5FormSubmissionDTO getFormDataDetail(Long submissionId); - - /** - * 根据项目ID获取所有表单数据 - * - * @param projectId 项目ID - * @return 表单数据列表 - */ - List listFormDataByProjectId(Long projectId); - -} \ No newline at end of file diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5FormService.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5FormService.java new file mode 100644 index 000000000..796d76c33 --- /dev/null +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/H5FormService.java @@ -0,0 +1,57 @@ +package com.luban.api.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.luban.api.dto.H5FormSubmissionDTO; +import com.luban.api.dto.H5ProjectContentDTO; +import com.luban.api.entity.FormSubmission; + +import java.util.List; + +/** + *

+ * 表单服务类 + *

+ * + * @author lizhw + */ +public interface H5FormService extends IService { + + /** + * 提交表单数据 + * + * @param dto 表单数据传输对象 + * @return 是否提交成功 + */ + boolean submitFormData(H5FormSubmissionDTO dto); + + /** + * 获取所有表单信息 + * + * @param templateId 模板ID + * @param hasDeleted 是否包含已删除的表单 + * @return 表单信息列表 + */ + List getEditorForms(Long templateId, Boolean hasDeleted); + + /** + * 获取所有表单相关字段 + * + * @param templateFormId 模板表单ID + * @return 表单相关字段列表 + */ + List getEditorTemplateForms(Long templateFormId); + + /** + * 分页查询提交数据 + * + * @param templateFormId 模板表单ID + * @param orderBy 排序字段 + * @param pageNum 页码 + * @param pageSize 每页大小 + * @return 提交数据列表 + */ + IPage listDetailPage(Long templateFormId, String orderBy, Integer pageNum, Integer pageSize); + + long saveForm(H5ProjectContentDTO content); +} diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/WorkService.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/WorkService.java index e4cf7aa3c..511394918 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/WorkService.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/WorkService.java @@ -1,7 +1,10 @@ package com.luban.api.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.luban.api.dto.WorkQueryDTO; import com.luban.api.entity.Work; +import com.luban.api.vo.WorkVO; /** *

@@ -13,4 +16,12 @@ import com.luban.api.entity.Work; */ public interface WorkService extends IService { + /** + * 分页查询作品列表 + * + * @param dto 查询条件 + * @return 分页结果 + */ + IPage pageWorks(WorkQueryDTO dto); + } diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/FormServiceImpl.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/FormServiceImpl.java deleted file mode 100644 index 1ca5191c3..000000000 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/FormServiceImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.luban.api.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.luban.api.convert.FormSubmissionConvert; -import com.luban.api.dao.FormSubmissionDao; -import com.luban.api.dto.H5FormSubmissionDTO; -import com.luban.api.entity.FormSubmission; -import com.luban.api.service.FormService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; - -/** - *

- * 表单服务实现类 - *

- * - * @author lizhw - */ -@Service -public class FormServiceImpl extends ServiceImpl implements FormService { - - private final FormSubmissionDao formSubmissionDao; - - public FormServiceImpl(FormSubmissionDao formSubmissionDao) { - this.formSubmissionDao = formSubmissionDao; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean submitFormData(H5FormSubmissionDTO dto) { - FormSubmission entity = FormSubmissionConvert.toEntity(dto); - entity.setId(null); - return this.save(entity); - } - - @Override - public IPage pageFormSubmissionsByProjectId(Long projectId, Map fieldFilters, Integer pageNum, Integer pageSize) { - IPage page = new Page<>(pageNum, pageSize); - return formSubmissionDao.selectByProjectIdWithFieldFilters(page, projectId, fieldFilters); - } - - @Override - public H5FormSubmissionDTO getFormDataDetail(Long submissionId) { - FormSubmission formSubmission = this.getById(submissionId); - return FormSubmissionConvert.toDTO(formSubmission); - } - - @Override - public List listFormDataByProjectId(Long projectId) { - List formSubmissions = this.lambdaQuery() - .eq(FormSubmission::getProjectId, projectId) - .list(); - return FormSubmissionConvert.toDTO(formSubmissions); - } - -} diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5FormServiceImpl.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5FormServiceImpl.java new file mode 100644 index 000000000..a0548fbd0 --- /dev/null +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5FormServiceImpl.java @@ -0,0 +1,174 @@ +package com.luban.api.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dromara.md.form.service.FormService; +import com.luban.api.convert.FormSubmissionConvert; +import com.luban.api.dao.FormSubmissionDao; +import com.luban.api.dto.H5FormSubmissionDTO; +import com.luban.api.dto.H5ProjectContentDTO; +import com.luban.api.entity.FormSubmission; +import com.luban.api.service.H5FormService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * 表单服务实现类 + *

+ * + * @author lizhw + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class H5FormServiceImpl extends ServiceImpl implements H5FormService { + + private final FormSubmissionDao formSubmissionDao; + private final FormService formService; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean submitFormData(H5FormSubmissionDTO dto) { + FormSubmission entity = FormSubmissionConvert.toEntity(dto); + entity.setId(null); + return this.save(entity); + } + + + @Override + public IPage listDetailPage(Long templateFormId, String orderBy, Integer pageNum, Integer pageSize) { + Page page = this.lambdaQuery() + .eq(FormSubmission::getTempletFormId, templateFormId) + .orderByDesc(FormSubmission::getCreateTime) + .page(new Page<>(pageNum, pageSize)); + return FormSubmissionConvert.toPageDTO(page); + } + + @Override + public long saveForm(H5ProjectContentDTO content) { + // 步骤1: 获取所有form组件 + List formElements = extractFormElements(content); + + // 步骤2: 保存所有form组件 + saveFormElements(formElements); + + return formElements.size(); + } + + /** + * 步骤1: 从H5项目内容中提取所有表单组件 + * + * @param content H5项目内容 + * @return 表单组件列表 + */ + private List extractFormElements(H5ProjectContentDTO content) { + List formElements = new ArrayList<>(); + + if (content == null || content.getLayouts() == null) { + return formElements; + } + + // 遍历所有布局,提取表单元素 + for (H5ProjectContentDTO.Layout layout : content.getLayouts()) { + if (layout.getElements() != null) { + extractFormElementsFromList(layout.getElements(), formElements); + } + } + + return formElements; + } + + /** + * 从元素列表中递归提取表单组件 + * + * @param elements 元素列表 + * @param formElements 收集到的表单组件列表 + */ + private void extractFormElementsFromList(List elements, + List formElements) { + if (elements == null || elements.isEmpty()) { + return; + } + + for (H5ProjectContentDTO.Element element : elements) { + if (element == null) { + continue; + } + + // 如果是表单元素,添加到结果列表 + if (H5ProjectContentDTO.ElementType.FORM.equals(element.getType())) { + formElements.add((H5ProjectContentDTO.FormElement) element); + } + + // 递归处理组元素中的子元素 + if (element instanceof H5ProjectContentDTO.GroupElement) { + H5ProjectContentDTO.GroupElement groupElement = (H5ProjectContentDTO.GroupElement) element; + if (groupElement.getElements() != null) { + extractFormElementsFromList(groupElement.getElements(), formElements); + } + } + } + } + + /** + * 步骤2: 保存表单组件列表 + * + * @param formElements 表单组件列表 + */ + private void saveFormElements(List formElements) { + if (formElements == null || formElements.isEmpty()) { + return; + } + + for (H5ProjectContentDTO.FormElement formElement : formElements) { + saveSingleFormElement(formElement); + } + } + + /** + * 保存单个表单组件 + * + * @param formElement 表单组件 + */ + private void saveSingleFormElement(H5ProjectContentDTO.FormElement formElement) { + if (formElement == null) { + return; + } + + // 记录表单组件信息到日志 + log.info("发现表单组件: UUID={}, Title={}, FormSchema={}, FormData={}", + formElement.getUuid(), + formElement.getTitle(), + formElement.getFormSchema(), + formElement.getFormData()); + +// formService.create() + + // TODO: 这里可以根据实际需求决定是否需要保存到数据库 + // 如果需要保存到数据库,可以创建相应的实体类和服务 + } + + + @Override + public List getEditorForms(Long templateId, Boolean hasDeleted) { + // 由于当前模块没有表单定义表,返回空列表作为占位符 + // 实际实现应查询 ruoyi-form 模块中的表单数据 + return new ArrayList<>(); + } + + @Override + public List getEditorTemplateForms(Long templateFormId) { + // 由于当前模块没有表单定义表,返回空列表作为占位符 + // 实际实现应查询 ruoyi-form 模块中的表单数据 + return new ArrayList<>(); + } + + +} diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectServiceImpl.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectServiceImpl.java index e68172acd..8491f2f6d 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectServiceImpl.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/H5ProjectServiceImpl.java @@ -1,6 +1,7 @@ package com.luban.api.service.impl; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -65,7 +66,7 @@ public class H5ProjectServiceImpl extends ServiceImpl i // 更新项目与分组的关联关系 if (updated && groupIds != null) { - h5ProjectGroupDao.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + h5ProjectGroupDao.delete(new LambdaQueryWrapper() .eq(H5ProjectGroup::getProjectId, h5Project.getId())); if (!groupIds.isEmpty()) { @@ -95,7 +96,7 @@ public class H5ProjectServiceImpl extends ServiceImpl i public boolean removeH5ProjectWithContent(Long id) { H5Project h5Project = this.getById(id); if (h5Project != null) { - h5ProjectGroupDao.delete(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + h5ProjectGroupDao.delete(new LambdaQueryWrapper() .eq(H5ProjectGroup::getProjectId, id)); return this.removeById(id); @@ -120,7 +121,7 @@ public class H5ProjectServiceImpl extends ServiceImpl i @Override public List getProjectGroupIds(Long projectId) { - return h5ProjectGroupDao.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + return h5ProjectGroupDao.selectList(new LambdaQueryWrapper() .eq(H5ProjectGroup::getProjectId, projectId)) .stream() .map(H5ProjectGroup::getGroupId) @@ -130,7 +131,7 @@ public class H5ProjectServiceImpl extends ServiceImpl i @Override public IPage pageH5Projects(H5ProjectQueryDTO queryDTO) { // 创建分页对象 - IPage page = new Page<>(queryDTO.getCurrent(), queryDTO.getSize()); + IPage page = new Page<>(queryDTO.getPage(), queryDTO.getSize()); // 执行分页查询 return baseMapper.selectH5ProjectPage(page, queryDTO); diff --git a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/WorkServiceImpl.java b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/WorkServiceImpl.java index b447ff738..ec88f62fd 100644 --- a/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/WorkServiceImpl.java +++ b/ruoyi-site/ruoyi-h5/src/main/java/com/luban/api/service/impl/WorkServiceImpl.java @@ -1,11 +1,21 @@ package com.luban.api.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.luban.api.convert.WorkConvert; import com.luban.api.dao.WorkDao; +import com.luban.api.dto.WorkQueryDTO; import com.luban.api.entity.Work; import com.luban.api.service.WorkService; +import com.luban.api.vo.WorkVO; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.stream.Collectors; + /** *

* 服务实现类 @@ -17,5 +27,19 @@ import org.springframework.stereotype.Service; @Service public class WorkServiceImpl extends ServiceImpl implements WorkService { + @Override + public IPage pageWorks(WorkQueryDTO dto) { + WorkVO vo = new WorkVO(); + vo.setTemplate(dto.getIsTemplate()); + BeanUtils.copyProperties(dto, vo); + IPage page = this.page(new Page<>(dto.getPage(), dto.getSize()), + new LambdaQueryWrapper<>(WorkConvert.toEntity(vo)).orderByDesc(Work::getCreateTime)); + List voList = page.getRecords().stream() + .map(WorkConvert::toVO) + .collect(Collectors.toList()); + return new Page(page.getCurrent(), page.getSize(), page.getTotal()) + .setPages(page.getPages()) + .setRecords(voList); + } } diff --git a/ruoyi-site/ruoyi-h5/src/main/resources/application.yml b/ruoyi-site/ruoyi-h5/src/main/resources/application.yml index d2dc2652f..11c4d6d53 100644 --- a/ruoyi-site/ruoyi-h5/src/main/resources/application.yml +++ b/ruoyi-site/ruoyi-h5/src/main/resources/application.yml @@ -64,7 +64,7 @@ tenant: # https://baomidou.com/config/ mybatis-plus: # 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper - mapperPackage: com.luban.api.dao + mapperPackage: com.luban.api.dao,com.dromara.**.mapper # # 实体扫描,多个package用逗号或者分号分隔 # typeAliasesPackage: com.luban.api.entity global-config: @@ -87,3 +87,5 @@ minioplus: # 日志配置 logging: config: classpath:logback-plus.xml + level: + com.baomidou.mybatisplus: debug diff --git a/ruoyi-site/ruoyi-h5/src/main/resources/mapper/ruoyi-h5/H5ProjectMapper.xml b/ruoyi-site/ruoyi-h5/src/main/resources/mapper/ruoyi-h5/H5ProjectMapper.xml index d0e2681a6..e56b54c51 100644 --- a/ruoyi-site/ruoyi-h5/src/main/resources/mapper/ruoyi-h5/H5ProjectMapper.xml +++ b/ruoyi-site/ruoyi-h5/src/main/resources/mapper/ruoyi-h5/H5ProjectMapper.xml @@ -31,6 +31,9 @@ AND MATCH(title) AGAINST(#{queryDTO.title} IN NATURAL LANGUAGE MODE) + + AND status = #{queryDTO.status} + AND EXISTS ( SELECT 1