Browse Source

1、权限校验

2、oss替换
master
Aug 1 month ago
parent
commit
4c8e90aa67
64 changed files with 3267 additions and 110 deletions
  1. +2
    -1
      admin-hanhai-vue/.env.development
  2. +2
    -1
      admin-hanhai-vue/.env.production
  3. +171
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/controller/ExhibitDepartmentPermissionController.java
  4. +60
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/entity/ExhibitDepartmentPermission.java
  5. +17
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/mapper/ExhibitDepartmentPermissionMapper.java
  6. +5
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/mapper/xml/ExhibitDepartmentPermissionMapper.xml
  7. +14
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/service/IExhibitDepartmentPermissionService.java
  8. +19
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/service/impl/ExhibitDepartmentPermissionServiceImpl.java
  9. +178
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/ExhibitDepartmentPermissionList.vue
  10. +109
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/modules/ExhibitDepartmentPermissionForm.vue
  11. +84
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/modules/ExhibitDepartmentPermissionModal.Style#Drawer.vue
  12. +60
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/modules/ExhibitDepartmentPermissionModal.vue
  13. +61
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/ExhibitDepartmentPermission.api.ts
  14. +39
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/ExhibitDepartmentPermission.data.ts
  15. +162
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/ExhibitDepartmentPermissionList.vue
  16. +58
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/components/ExhibitDepartmentPermissionModal.vue
  17. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/controller/ExhibitMaintenanceController.java
  18. +1
    -2
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/entity/ExhibitMaintenance.java
  19. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/entity/ExhibitMaintenanceExpense.java
  20. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/mapper/ExhibitMaintenanceExpenseMapper.java
  21. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/mapper/ExhibitMaintenanceMapper.java
  22. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/IExhibitMaintenanceExpenseService.java
  23. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/IExhibitMaintenanceService.java
  24. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/impl/ExhibitMaintenanceExpenseServiceImpl.java
  25. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/impl/ExhibitMaintenanceServiceImpl.java
  26. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vo/ExhibitMaintenancePage.java
  27. +12
    -12
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue/ExhibitMaintenanceList.vue
  28. +30
    -25
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue/modules/ExhibitMaintenanceForm.vue
  29. +68
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/ExhibitMaintenance.api.ts
  30. +180
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/ExhibitMaintenance.data.ts
  31. +162
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/ExhibitMaintenanceList.vue
  32. +103
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/components/ExhibitMaintenanceModal.vue
  33. +171
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/controller/ExhibitPermissionController.java
  34. +58
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/entity/ExhibitPermission.java
  35. +17
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/mapper/ExhibitPermissionMapper.java
  36. +5
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/mapper/xml/ExhibitPermissionMapper.xml
  37. +14
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/service/IExhibitPermissionService.java
  38. +19
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/service/impl/ExhibitPermissionServiceImpl.java
  39. +177
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/ExhibitPermissionList.vue
  40. +109
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/modules/ExhibitPermissionForm.vue
  41. +84
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/modules/ExhibitPermissionModal.Style#Drawer.vue
  42. +60
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/modules/ExhibitPermissionModal.vue
  43. +61
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/ExhibitPermission.api.ts
  44. +33
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/ExhibitPermission.data.ts
  45. +162
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/ExhibitPermissionList.vue
  46. +58
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/components/ExhibitPermissionModal.vue
  47. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/controller/ExhibitRepairController.java
  48. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/entity/ExhibitRepair.java
  49. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/entity/ExhibitRepairExpense.java
  50. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/mapper/ExhibitRepairExpenseMapper.java
  51. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/mapper/ExhibitRepairMapper.java
  52. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/IExhibitRepairExpenseService.java
  53. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/IExhibitRepairService.java
  54. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/impl/ExhibitRepairExpenseServiceImpl.java
  55. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/impl/ExhibitRepairServiceImpl.java
  56. +1
    -1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vo/ExhibitRepairPage.java
  57. +10
    -10
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue/ExhibitRepairList.vue
  58. +30
    -25
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue/modules/ExhibitRepairForm.vue
  59. +68
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/ExhibitRepair.api.ts
  60. +163
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/ExhibitRepair.data.ts
  61. +162
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/ExhibitRepairList.vue
  62. +103
    -0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/components/ExhibitRepairModal.vue
  63. +82
    -10
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ShowpieceServiceImpl.java
  64. +5
    -5
      jeecg-boot-module-system/src/main/resources/application-dev.yml

+ 2
- 1
admin-hanhai-vue/.env.development View File

@ -1,5 +1,6 @@
NODE_ENV=development
VUE_APP_API_BASE_URL=http://localhost:8000/exhibit-admin/
VUE_APP_API_BASE_URL=https://exhibit.augcl.com/exhibit-admin/
//VUE_APP_API_BASE_URL=http://localhost:8000/exhibit-admin/
VUE_APP_CAS_BASE_URL=http://cas.example.org:8443/cas
VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview


+ 2
- 1
admin-hanhai-vue/.env.production View File

@ -1,4 +1,5 @@
NODE_ENV=production
VUE_APP_API_BASE_URL=http://localhost:8000/exhibit-admin/
VUE_APP_API_BASE_URL=https://exhibit.augcl.com/exhibit-admin/
//VUE_APP_API_BASE_URL=http://localhost:8000/exhibit-admin/
VUE_APP_CAS_BASE_URL=http://localhost:8888/cas
VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview

+ 171
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/controller/ExhibitDepartmentPermissionController.java View File

@ -0,0 +1,171 @@
package org.jeecg.modules.exhibitDepartmentPermission.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.exhibitDepartmentPermission.entity.ExhibitDepartmentPermission;
import org.jeecg.modules.exhibitDepartmentPermission.service.IExhibitDepartmentPermissionService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 部门权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
@Api(tags="部门权限信息表")
@RestController
@RequestMapping("/exhibitDepartmentPermission/exhibitDepartmentPermission")
@Slf4j
public class ExhibitDepartmentPermissionController extends JeecgController<ExhibitDepartmentPermission, IExhibitDepartmentPermissionService> {
@Autowired
private IExhibitDepartmentPermissionService exhibitDepartmentPermissionService;
/**
* 分页列表查询
*
* @param exhibitDepartmentPermission
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "部门权限信息表-分页列表查询")
@ApiOperation(value="部门权限信息表-分页列表查询", notes="部门权限信息表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<ExhibitDepartmentPermission>> queryPageList(ExhibitDepartmentPermission exhibitDepartmentPermission,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<ExhibitDepartmentPermission> queryWrapper = QueryGenerator.initQueryWrapper(exhibitDepartmentPermission, req.getParameterMap());
Page<ExhibitDepartmentPermission> page = new Page<ExhibitDepartmentPermission>(pageNo, pageSize);
IPage<ExhibitDepartmentPermission> pageList = exhibitDepartmentPermissionService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param exhibitDepartmentPermission
* @return
*/
@AutoLog(value = "部门权限信息表-添加")
@ApiOperation(value="部门权限信息表-添加", notes="部门权限信息表-添加")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody ExhibitDepartmentPermission exhibitDepartmentPermission) {
exhibitDepartmentPermissionService.save(exhibitDepartmentPermission);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param exhibitDepartmentPermission
* @return
*/
@AutoLog(value = "部门权限信息表-编辑")
@ApiOperation(value="部门权限信息表-编辑", notes="部门权限信息表-编辑")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody ExhibitDepartmentPermission exhibitDepartmentPermission) {
exhibitDepartmentPermissionService.updateById(exhibitDepartmentPermission);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "部门权限信息表-通过id删除")
@ApiOperation(value="部门权限信息表-通过id删除", notes="部门权限信息表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
exhibitDepartmentPermissionService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "部门权限信息表-批量删除")
@ApiOperation(value="部门权限信息表-批量删除", notes="部门权限信息表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.exhibitDepartmentPermissionService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "部门权限信息表-通过id查询")
@ApiOperation(value="部门权限信息表-通过id查询", notes="部门权限信息表-通过id查询")
@GetMapping(value = "/queryById")
public Result<ExhibitDepartmentPermission> queryById(@RequestParam(name="id",required=true) String id) {
ExhibitDepartmentPermission exhibitDepartmentPermission = exhibitDepartmentPermissionService.getById(id);
if(exhibitDepartmentPermission==null) {
return Result.error("未找到对应数据");
}
return Result.OK(exhibitDepartmentPermission);
}
/**
* 导出excel
*
* @param request
* @param exhibitDepartmentPermission
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, ExhibitDepartmentPermission exhibitDepartmentPermission) {
return super.exportXls(request, exhibitDepartmentPermission, ExhibitDepartmentPermission.class, "部门权限信息表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, ExhibitDepartmentPermission.class);
}
}

+ 60
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/entity/ExhibitDepartmentPermission.java View File

@ -0,0 +1,60 @@
package org.jeecg.modules.exhibitDepartmentPermission.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 部门权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
@Data
@TableName("exhibit_department_permission")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="exhibit_department_permission对象", description="部门权限信息表")
public class ExhibitDepartmentPermission implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
/**创建日期*/
@ApiModelProperty(value = "创建日期")
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@ApiModelProperty(value = "更新日期")
private java.util.Date updateTime;
/**关联部门*/
@Excel(name = "关联部门", width = 15, dictTable = "exhibit_department", dicText = "title", dicCode = "id")
@Dict(dictTable = "exhibit_department", dicText = "title", dicCode = "id")
@ApiModelProperty(value = "关联部门")
private java.lang.String departmentId;
/**关联权限*/
@Excel(name = "关联权限", width = 15, dictTable = "exhibit_permission", dicText = "title", dicCode = "id")
@Dict(dictTable = "exhibit_permission", dicText = "title", dicCode = "id")
@ApiModelProperty(value = "关联权限")
private java.lang.String permissionId;
}

+ 17
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/mapper/ExhibitDepartmentPermissionMapper.java View File

@ -0,0 +1,17 @@
package org.jeecg.modules.exhibitDepartmentPermission.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.exhibitDepartmentPermission.entity.ExhibitDepartmentPermission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 部门权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface ExhibitDepartmentPermissionMapper extends BaseMapper<ExhibitDepartmentPermission> {
}

+ 5
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/mapper/xml/ExhibitDepartmentPermissionMapper.xml View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.exhibitDepartmentPermission.mapper.ExhibitDepartmentPermissionMapper">
</mapper>

+ 14
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/service/IExhibitDepartmentPermissionService.java View File

@ -0,0 +1,14 @@
package org.jeecg.modules.exhibitDepartmentPermission.service;
import org.jeecg.modules.exhibitDepartmentPermission.entity.ExhibitDepartmentPermission;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 部门权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface IExhibitDepartmentPermissionService extends IService<ExhibitDepartmentPermission> {
}

+ 19
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/service/impl/ExhibitDepartmentPermissionServiceImpl.java View File

@ -0,0 +1,19 @@
package org.jeecg.modules.exhibitDepartmentPermission.service.impl;
import org.jeecg.modules.exhibitDepartmentPermission.entity.ExhibitDepartmentPermission;
import org.jeecg.modules.exhibitDepartmentPermission.mapper.ExhibitDepartmentPermissionMapper;
import org.jeecg.modules.exhibitDepartmentPermission.service.IExhibitDepartmentPermissionService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 部门权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
@Service
public class ExhibitDepartmentPermissionServiceImpl extends ServiceImpl<ExhibitDepartmentPermissionMapper, ExhibitDepartmentPermission> implements IExhibitDepartmentPermissionService {
}

+ 178
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/ExhibitDepartmentPermissionList.vue View File

@ -0,0 +1,178 @@
<template>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
</a-row>
</a-form>
</div>
<!-- 查询区域-END -->
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
<a-button type="primary" icon="download" @click="handleExportXls('部门权限信息表')">导出</a-button>
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
<a-button type="primary" icon="import">导入</a-button>
</a-upload>
<!-- 高级查询区域 -->
<j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
<a-dropdown v-if="selectedRowKeys.length > 0">
<a-menu slot="overlay">
<a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
</a-menu>
<a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
</a-dropdown>
</div>
<!-- table区域-begin -->
<div>
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
<i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
</div>
<a-table
ref="table"
size="middle"
:scroll="{x:true}"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
class="j-table-force-nowrap"
@change="handleTableChange">
<template slot="htmlSlot" slot-scope="text">
<div v-html="text"></div>
</template>
<template slot="imgSlot" slot-scope="text,record">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
<img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
</template>
<template slot="fileSlot" slot-scope="text">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button
v-else
:ghost="true"
type="primary"
icon="download"
size="small"
@click="downloadFile(text)">
下载
</a-button>
</template>
<span slot="action" slot-scope="text, record">
<a @click="handleEdit(record)">编辑</a>
<a-divider type="vertical" />
<a-dropdown>
<a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
<a-menu slot="overlay">
<a-menu-item>
<a @click="handleDetail(record)">详情</a>
</a-menu-item>
<a-menu-item>
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
<a>删除</a>
</a-popconfirm>
</a-menu-item>
</a-menu>
</a-dropdown>
</span>
</a-table>
</div>
<exhibit-department-permission-modal ref="modalForm" @ok="modalFormOk"></exhibit-department-permission-modal>
</a-card>
</template>
<script>
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import ExhibitDepartmentPermissionModal from './modules/ExhibitDepartmentPermissionModal'
import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'
export default {
name: 'ExhibitDepartmentPermissionList',
mixins:[JeecgListMixin, mixinDevice],
components: {
ExhibitDepartmentPermissionModal
},
data () {
return {
description: '部门权限信息表管理页面',
//
columns: [
{
title: '#',
dataIndex: '',
key:'rowIndex',
width:60,
align:"center",
customRender:function (t,r,index) {
return parseInt(index)+1;
}
},
{
title:'关联部门',
align:"center",
dataIndex: 'departmentId_dictText'
},
{
title:'关联权限',
align:"center",
dataIndex: 'permissionId_dictText'
},
{
title: '操作',
dataIndex: 'action',
align:"center",
fixed:"right",
width:147,
scopedSlots: { customRender: 'action' }
}
],
url: {
list: "/exhibitDepartmentPermission/exhibitDepartmentPermission/list",
delete: "/exhibitDepartmentPermission/exhibitDepartmentPermission/delete",
deleteBatch: "/exhibitDepartmentPermission/exhibitDepartmentPermission/deleteBatch",
exportXlsUrl: "/exhibitDepartmentPermission/exhibitDepartmentPermission/exportXls",
importExcelUrl: "exhibitDepartmentPermission/exhibitDepartmentPermission/importExcel",
},
dictOptions:{},
superFieldList:[],
}
},
created() {
this.getSuperFieldList();
},
computed: {
importExcelUrl: function(){
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
},
},
methods: {
initDictConfig(){
},
getSuperFieldList(){
let fieldList=[];
fieldList.push({type:'string',value:'departmentId',text:'关联部门',dictCode:"exhibit_department,title,id"})
fieldList.push({type:'list_multi',value:'permissionId',text:'关联权限',dictTable:"exhibit_permission", dictText:'title', dictCode:'id'})
this.superFieldList = fieldList
}
}
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>

+ 109
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/modules/ExhibitDepartmentPermissionForm.vue View File

@ -0,0 +1,109 @@
<template>
<a-spin :spinning="confirmLoading">
<j-form-container :disabled="formDisabled">
<a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
<a-row>
<a-col :span="24">
<a-form-model-item label="关联部门" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="departmentId">
<j-dict-select-tag type="list" v-model="model.departmentId" dictCode="exhibit_department,title,id" placeholder="请选择关联部门" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="关联权限" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="permissionId">
<j-multi-select-tag type="list_multi" v-model="model.permissionId" dictCode="exhibit_permission,title,id" placeholder="请选择关联权限" />
</a-form-model-item>
</a-col>
</a-row>
</a-form-model>
</j-form-container>
</a-spin>
</template>
<script>
import { httpAction, getAction } from '@/api/manage'
import { validateDuplicateValue } from '@/utils/util'
export default {
name: 'ExhibitDepartmentPermissionForm',
components: {
},
props: {
//
disabled: {
type: Boolean,
default: false,
required: false
}
},
data () {
return {
model:{
},
labelCol: {
xs: { span: 24 },
sm: { span: 5 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
},
confirmLoading: false,
validatorRules: {
},
url: {
add: "/exhibitDepartmentPermission/exhibitDepartmentPermission/add",
edit: "/exhibitDepartmentPermission/exhibitDepartmentPermission/edit",
queryById: "/exhibitDepartmentPermission/exhibitDepartmentPermission/queryById"
}
}
},
computed: {
formDisabled(){
return this.disabled
},
},
created () {
//model
this.modelDefault = JSON.parse(JSON.stringify(this.model));
},
methods: {
add () {
this.edit(this.modelDefault);
},
edit (record) {
this.model = Object.assign({}, record);
this.visible = true;
},
submitForm () {
const that = this;
//
this.$refs.form.validate(valid => {
if (valid) {
that.confirmLoading = true;
let httpurl = '';
let method = '';
if(!this.model.id){
httpurl+=this.url.add;
method = 'post';
}else{
httpurl+=this.url.edit;
method = 'put';
}
httpAction(httpurl,this.model,method).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.$emit('ok');
}else{
that.$message.warning(res.message);
}
}).finally(() => {
that.confirmLoading = false;
})
}
})
},
}
}
</script>

+ 84
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/modules/ExhibitDepartmentPermissionModal.Style#Drawer.vue View File

@ -0,0 +1,84 @@
<template>
<a-drawer
:title="title"
:width="width"
placement="right"
:closable="false"
@close="close"
destroyOnClose
:visible="visible">
<exhibit-department-permission-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></exhibit-department-permission-form>
<div class="drawer-footer">
<a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
<a-button v-if="!disableSubmit" @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
</div>
</a-drawer>
</template>
<script>
import ExhibitDepartmentPermissionForm from './ExhibitDepartmentPermissionForm'
export default {
name: 'ExhibitDepartmentPermissionModal',
components: {
ExhibitDepartmentPermissionForm
},
data () {
return {
title:"操作",
width:800,
visible: false,
disableSubmit: false
}
},
methods: {
add () {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.add();
})
},
edit (record) {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.edit(record);
});
},
close () {
this.$emit('close');
this.visible = false;
},
submitCallback(){
this.$emit('ok');
this.visible = false;
},
handleOk () {
this.$refs.realForm.submitForm();
},
handleCancel () {
this.close()
}
}
}
</script>
<style lang="less" scoped>
/** Button按钮间距 */
.ant-btn {
margin-left: 30px;
margin-bottom: 30px;
float: right;
}
.drawer-footer{
position: absolute;
bottom: -8px;
width: 100%;
border-top: 1px solid #e8e8e8;
padding: 10px 16px;
text-align: right;
left: 0;
background: #fff;
border-radius: 0 0 2px 2px;
}
</style>

+ 60
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue/modules/ExhibitDepartmentPermissionModal.vue View File

@ -0,0 +1,60 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
switchFullscreen
@ok="handleOk"
:okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
@cancel="handleCancel"
cancelText="关闭">
<exhibit-department-permission-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></exhibit-department-permission-form>
</j-modal>
</template>
<script>
import ExhibitDepartmentPermissionForm from './ExhibitDepartmentPermissionForm'
export default {
name: 'ExhibitDepartmentPermissionModal',
components: {
ExhibitDepartmentPermissionForm
},
data () {
return {
title:'',
width:800,
visible: false,
disableSubmit: false
}
},
methods: {
add () {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.add();
})
},
edit (record) {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.edit(record);
})
},
close () {
this.$emit('close');
this.visible = false;
},
handleOk () {
this.$refs.realForm.submitForm();
},
submitCallback(){
this.$emit('ok');
this.visible = false;
},
handleCancel () {
this.close()
}
}
}
</script>

+ 61
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/ExhibitDepartmentPermission.api.ts View File

@ -0,0 +1,61 @@
import {defHttp} from '/@/utils/http/axios';
import {Modal} from 'ant-design-vue';
enum Api {
list = '/exhibitDepartmentPermission/exhibitDepartmentPermission/list',
save='/exhibitDepartmentPermission/exhibitDepartmentPermission/add',
edit='/exhibitDepartmentPermission/exhibitDepartmentPermission/edit',
deleteOne = '/exhibitDepartmentPermission/exhibitDepartmentPermission/delete',
deleteBatch = '/exhibitDepartmentPermission/exhibitDepartmentPermission/deleteBatch',
importExcel = '/exhibitDepartmentPermission/exhibitDepartmentPermission/importExcel',
exportXls = '/exhibitDepartmentPermission/exhibitDepartmentPermission/exportXls',
}
/**
* api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* api
*/
export const getImportUrl = Api.importExcel;
/**
*
* @param params
*/
export const list = (params) =>
defHttp.get({url: Api.list, params});
/**
*
*/
export const deleteOne = (params,handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
*
* @param params
*/
export const batchDelete = (params, handleSuccess) => {
Modal.confirm({
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
*
* @param params
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({url: url, params});
}

+ 39
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/ExhibitDepartmentPermission.data.ts View File

@ -0,0 +1,39 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
import { render } from '/@/utils/common/renderUtils';
//列表数据
export const columns: BasicColumn[] = [
{
title: '关联部门',
align:"center",
dataIndex: 'departmentId_dictText'
},
{
title: '关联权限',
align:"center",
dataIndex: 'permissionId_dictText'
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
];
//表单数据
export const formSchema: FormSchema[] = [
{
label: '关联部门',
field: 'departmentId',
component: 'JDictSelectTag',
componentProps:{
dictCode:"exhibit_department,title,id"
},
},
{
label: '关联权限',
field: 'permissionId',
component: 'JMultiSelectTag',//TODO 暂无该组件
componentProps:{
dictCode:"exhibit_permission,title,id"
},
},
];

+ 162
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/ExhibitDepartmentPermissionList.vue View File

@ -0,0 +1,162 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="checkedKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined"></Icon>
删除
</a-menu-item>
</a-menu>
</template>
<a-button>批量操作
<Icon icon="mdi:chevron-down"></Icon>
</a-button>
</a-dropdown>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
</template>
<!--字段回显插槽-->
<template #htmlSlot="{text}">
<div v-html="text"></div>
</template>
<template #fileSlot="{text}">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
</template>
</BasicTable>
<!-- 表单区域 -->
<ExhibitDepartmentPermissionModal @register="registerModal" @success="handleSuccess"></ExhibitDepartmentPermissionModal>
</div>
</template>
<script lang="ts" name="exhibitDepartmentPermission-exhibitDepartmentPermission" setup>
import {ref, computed, unref} from 'vue';
import {BasicTable, useTable, TableAction} from '/@/components/Table';
import {useModal} from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'
import ExhibitDepartmentPermissionModal from './components/ExhibitDepartmentPermissionModal.vue'
import {columns, searchFormSchema} from './exhibitDepartmentPermission.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './exhibitDepartmentPermission.api';
const checkedKeys = ref<Array<string | number>>([]);
//model
const [registerModal, {openModal}] = useModal();
//table
const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
tableProps:{
title: '部门权限信息表',
api: list,
columns,
canResize:false,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
fieldMapToTime: [
],
},
actionColumn: {
width: 120,
},
},
exportConfig: {
name:"部门权限信息表",
url: getExportUrl,
},
importConfig: {
url: getImportUrl
},
})
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, reload);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: checkedKeys.value}, reload);
}
/**
* 成功回调
*/
function handleSuccess() {
reload();
}
/**
* 操作栏
*/
function getTableAction(record){
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
}
]
}
/**
* 下拉操作栏
*/
function getDropDownAction(record){
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
}, {
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
}
}
]
}
</script>
<style scoped>
</style>

+ 58
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitDepartmentPermission/vue3/components/ExhibitDepartmentPermissionModal.vue View File

@ -0,0 +1,58 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit">
<BasicForm @register="registerForm"/>
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {BasicForm, useForm} from '/@/components/Form/index';
import {formSchema} from '../exhibitDepartmentPermission.data';
import {saveOrUpdate} from '../exhibitDepartmentPermission.api';
// Emits
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
//
const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
});
//
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
//
await resetFields();
setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
//
await setFieldsValue({
...data.record,
});
}
//
setProps({ disabled: !data?.showFooter })
});
//
const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
//
async function handleSubmit(v) {
try {
let values = await validate();
setModalProps({confirmLoading: true});
//
await saveOrUpdate(values, isUpdate.value);
//
closeModal();
//
emit('success');
} finally {
setModalProps({confirmLoading: false});
}
}
</script>
<style lang="less" scoped>
</style>

+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/controller/ExhibitMaintenanceController.java View File

@ -45,7 +45,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 保养信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Api(tags="保养信息记录表")


+ 1
- 2
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/entity/ExhibitMaintenance.java View File

@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecg.modules.exhibitRepair.entity.ExhibitRepairExpense;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
@ -21,7 +20,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 保养信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@ApiModel(value="exhibit_maintenance对象", description="保养信息记录表")


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/entity/ExhibitMaintenanceExpense.java View File

@ -16,7 +16,7 @@ import java.io.UnsupportedEncodingException;
/**
* @Description: 保养费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@ApiModel(value="exhibit_maintenance_expense对象", description="保养费用明细记录表")


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/mapper/ExhibitMaintenanceExpenseMapper.java View File

@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param;
/**
* @Description: 保养费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface ExhibitMaintenanceExpenseMapper extends BaseMapper<ExhibitMaintenanceExpense> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/mapper/ExhibitMaintenanceMapper.java View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 保养信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface ExhibitMaintenanceMapper extends BaseMapper<ExhibitMaintenance> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/IExhibitMaintenanceExpenseService.java View File

@ -7,7 +7,7 @@ import java.util.List;
/**
* @Description: 保养费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface IExhibitMaintenanceExpenseService extends IService<ExhibitMaintenanceExpense> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/IExhibitMaintenanceService.java View File

@ -10,7 +10,7 @@ import java.util.List;
/**
* @Description: 保养信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface IExhibitMaintenanceService extends IService<ExhibitMaintenance> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/impl/ExhibitMaintenanceExpenseServiceImpl.java View File

@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 保养费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Service


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/service/impl/ExhibitMaintenanceServiceImpl.java View File

@ -16,7 +16,7 @@ import java.util.Collection;
/**
* @Description: 保养信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Service


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vo/ExhibitMaintenancePage.java View File

@ -17,7 +17,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 保养信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Data


+ 12
- 12
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue/ExhibitMaintenanceList.vue View File

@ -221,18 +221,18 @@
},
getSuperFieldList(){
let fieldList=[];
fieldList.push({type:'date',value:'maintenanceDate',text:'保养日期'})
fieldList.push({type:'string',value:'maintenanceName',text:'保养人',dictCode:''})
fieldList.push({type:'Text',value:'stateFrontText',text:'保养前状态_文字',dictCode:''})
fieldList.push({type:'Text',value:'stateFrontImage',text:'保养前状态_图片',dictCode:''})
fieldList.push({type:'Text',value:'stateBackText',text:'保养后状态_文字',dictCode:''})
fieldList.push({type:'Text',value:'stateBackImage',text:'保养后状态_图片',dictCode:''})
fieldList.push({type:'string',value:'isExpend',text:'是否产生费用',dictCode:'is_true'})
fieldList.push({type:'BigDecimal',value:'amount',text:'费用金额',dictCode:''})
fieldList.push({type:'Text',value:'remarkText',text:'保养备注_文字',dictCode:''})
fieldList.push({type:'Text',value:'remarkImage',text:'保养备注_图片',dictCode:''})
fieldList.push({type:'Text',value:'remark',text:'备注',dictCode:''})
fieldList.push({type:'sel_search',value:'showpieceId',text:'关联展品id',dictTable:"exhibit_showpiece", dictText:'title', dictCode:'id'})
fieldList.push({type:'date',value:'maintenanceDate',text:'保养日期'})
fieldList.push({type:'string',value:'maintenanceName',text:'保养人',dictCode:''})
fieldList.push({type:'Text',value:'stateFrontText',text:'保养前状态_文字',dictCode:''})
fieldList.push({type:'Text',value:'stateFrontImage',text:'保养前状态_图片',dictCode:''})
fieldList.push({type:'Text',value:'stateBackText',text:'保养后状态_文字',dictCode:''})
fieldList.push({type:'Text',value:'stateBackImage',text:'保养后状态_图片',dictCode:''})
fieldList.push({type:'string',value:'isExpend',text:'是否产生费用',dictCode:'is_true'})
fieldList.push({type:'BigDecimal',value:'amount',text:'费用金额',dictCode:''})
fieldList.push({type:'Text',value:'remarkText',text:'保养备注_文字',dictCode:''})
fieldList.push({type:'Text',value:'remarkImage',text:'保养备注_图片',dictCode:''})
fieldList.push({type:'Text',value:'remark',text:'备注',dictCode:''})
fieldList.push({type:'sel_search',value:'showpieceId',text:'关联展品id',dictTable:"exhibit_showpiece", dictText:'title', dictCode:'id'})
this.superFieldList = fieldList
}
}


+ 30
- 25
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue/modules/ExhibitMaintenanceForm.vue View File

@ -61,7 +61,7 @@
</a-col>
<a-col :span="24" >
<a-form-model-item label="关联展品id" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="showpieceId">
<j-search-select-tag v-model="model.showpieceId" dict="exhibit_showpiece,title,id" />
<j-search-select-tag v-model="model.showpieceId" dict="exhibit_showpiece,title,id" />
</a-form-model-item>
</a-col>
</a-row>
@ -70,7 +70,8 @@
<!-- 子表单区域 -->
<a-tabs v-model="activeKey" @change="handleChangeTabs">
<a-tab-pane tab="保养费用明细记录表" :key="refKeys[0]" :forceRender="true">
<j-editable-table
<j-vxe-table
keep-source
:ref="refKeys[0]"
:loading="exhibitMaintenanceExpenseTable.loading"
:columns="exhibitMaintenanceExpenseTable.columns"
@ -79,7 +80,8 @@
:disabled="formDisabled"
:rowNumber="true"
:rowSelection="true"
:actionButton="true"/>
:toolbar="true"
/>
</a-tab-pane>
</a-tabs>
</a-spin>
@ -88,14 +90,17 @@
<script>
import { getAction } from '@/api/manage'
import { FormTypes,getRefPromise,VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'
import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'
import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
import { JVXETypes } from '@/components/jeecg/JVxeTable'
import { getRefPromise,VALIDATE_FAILED} from '@/components/jeecg/JVxeTable/utils/vxeUtils.js'
import { validateDuplicateValue } from '@/utils/util'
import JFormContainer from '@/components/jeecg/JFormContainer'
export default {
name: 'ExhibitMaintenanceForm',
mixins: [JEditableTableModelMixin],
mixins: [JVxeTableModelMixin],
components: {
JFormContainer,
},
data() {
return {
@ -108,7 +113,7 @@
sm: { span: 16 },
},
model:{
},
},
//
addDefaultRowNum: 1,
validatorRules: {
@ -124,7 +129,7 @@
{
title: '费用名称',
key: 'title',
type: FormTypes.input,
type: JVXETypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
@ -132,7 +137,7 @@
{
title: '数量',
key: 'num',
type: FormTypes.inputNumber,
type: JVXETypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
@ -140,7 +145,7 @@
{
title: '金额',
key: 'amount',
type: FormTypes.inputNumber,
type: JVXETypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
@ -191,27 +196,27 @@
}
},
//
validateSubForm(allValues){
return new Promise((resolve,reject)=>{
Promise.all([
]).then(() => {
resolve(allValues)
}).catch(e => {
if (e.error === VALIDATE_NO_PASSED) {
// tab
this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
} else {
console.error(e)
}
validateSubForm(allValues){
return new Promise((resolve,reject)=>{
Promise.all([
]).then(() => {
resolve(allValues)
}).catch(e => {
if (e.error === VALIDATE_FAILED) {
// tab
this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
} else {
console.error(e)
}
})
})
})
},
},
/** 整理成formData */
classifyIntoFormData(allValues) {
let main = Object.assign(this.model, allValues.formValue)
return {
...main, //
exhibitMaintenanceExpenseList: allValues.tablesValue[0].values,
exhibitMaintenanceExpenseList: allValues.tablesValue[0].tableData,
}
},
validateError(msg){


+ 68
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/ExhibitMaintenance.api.ts View File

@ -0,0 +1,68 @@
import {defHttp} from '/@/utils/http/axios';
import {Modal} from 'ant-design-vue';
enum Api {
list = '/exhibitMaintenance/exhibitMaintenance/list',
save='/exhibitMaintenance/exhibitMaintenance/add',
edit='/exhibitMaintenance/exhibitMaintenance/edit',
deleteOne = '/exhibitMaintenance/exhibitMaintenance/delete',
deleteBatch = '/exhibitMaintenance/exhibitMaintenance/deleteBatch',
importExcel = '/exhibitMaintenance/exhibitMaintenance/importExcel',
exportXls = '/exhibitMaintenance/exhibitMaintenance/exportXls',
exhibitMaintenanceExpenseList = '/exhibitMaintenance/exhibitMaintenance/queryExhibitMaintenanceExpenseByMainId',
}
/**
* api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* api
*/
export const getImportUrl = Api.importExcel;
/**
*
* @param params
*/
export const exhibitMaintenanceExpenseList = Api.exhibitMaintenanceExpenseList;
/**
*
* @param params
*/
export const list = (params) =>
defHttp.get({url: Api.list, params});
/**
*
*/
export const deleteOne = (params,handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
*
* @param params
*/
export const batchDelete = (params, handleSuccess) => {
Modal.confirm({
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
*
* @param params
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({url: url, params});
}

+ 180
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/ExhibitMaintenance.data.ts View File

@ -0,0 +1,180 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
import { render } from '/@/utils/common/renderUtils';
import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
//列表数据
export const columns: BasicColumn[] = [
{
title: '保养日期',
align:"center",
dataIndex: 'maintenanceDate',
customRender:({text}) =>{
return !text?"":(text.length>10?text.substr(0,10):text)
},
},
{
title: '保养人',
align:"center",
dataIndex: 'maintenanceName'
},
{
title: '保养前状态_文字',
align:"center",
dataIndex: 'stateFrontText'
},
{
title: '保养前状态_图片',
align:"center",
dataIndex: 'stateFrontImage',
customRender:render.renderAvatar,
},
{
title: '保养后状态_文字',
align:"center",
dataIndex: 'stateBackText'
},
{
title: '保养后状态_图片',
align:"center",
dataIndex: 'stateBackImage',
customRender:render.renderAvatar,
},
{
title: '是否产生费用',
align:"center",
dataIndex: 'isExpend_dictText'
},
{
title: '费用金额',
align:"center",
dataIndex: 'amount'
},
{
title: '保养备注_文字',
align:"center",
dataIndex: 'remarkText'
},
{
title: '保养备注_图片',
align:"center",
dataIndex: 'remarkImage',
customRender:render.renderAvatar,
},
{
title: '备注',
align:"center",
dataIndex: 'remark'
},
{
title: '关联展品id',
align:"center",
dataIndex: 'showpieceId_dictText'
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
];
//表单数据
export const formSchema: FormSchema[] = [
{
label: '保养日期',
field: 'maintenanceDate',
component: 'DatePicker',
},
{
label: '保养人',
field: 'maintenanceName',
component: 'Input',
},
{
label: '保养前状态_文字',
field: 'stateFrontText',
component: 'InputTextArea',//TODO 注意string转换问题
},
{
label: '保养前状态_图片',
field: 'stateFrontImage',
component: 'JImageUpload',
componentProps:{
},
},
{
label: '保养后状态_文字',
field: 'stateBackText',
component: 'InputTextArea',//TODO 注意string转换问题
},
{
label: '保养后状态_图片',
field: 'stateBackImage',
component: 'JImageUpload',
componentProps:{
},
},
{
label: '是否产生费用',
field: 'isExpend',
component: 'JDictSelectTag',
componentProps:{
dictCode:"is_true"
},
},
{
label: '费用金额',
field: 'amount',
component: 'InputNumber',
},
{
label: '保养备注_文字',
field: 'remarkText',
component: 'InputTextArea',//TODO 注意string转换问题
},
{
label: '保养备注_图片',
field: 'remarkImage',
component: 'JImageUpload',
componentProps:{
},
},
{
label: '备注',
field: 'remark',
component: 'InputTextArea',//TODO 注意string转换问题
},
{
label: '关联展品id',
field: 'showpieceId',
component: 'JSearchSelect',
componentProps:{
dict:"exhibit_showpiece,title,id"
},
},
];
//子表单数据
//子表表格配置
export const exhibitMaintenanceExpenseColumns: JVxeColumn[] = [
{
title: '费用名称',
key: 'title',
type: JVxeTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '数量',
key: 'num',
type: JVxeTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '金额',
key: 'amount',
type: JVxeTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
]

+ 162
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/ExhibitMaintenanceList.vue View File

@ -0,0 +1,162 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="checkedKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined"></Icon>
删除
</a-menu-item>
</a-menu>
</template>
<a-button>批量操作
<Icon icon="mdi:chevron-down"></Icon>
</a-button>
</a-dropdown>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
</template>
<!--字段回显插槽-->
<template #htmlSlot="{text}">
<div v-html="text"></div>
</template>
<template #fileSlot="{text}">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
</template>
</BasicTable>
<!-- 表单区域 -->
<ExhibitMaintenanceModal @register="registerModal" @success="handleSuccess"></ExhibitMaintenanceModal>
</div>
</template>
<script lang="ts" name="exhibitMaintenance-exhibitMaintenance" setup>
import {ref, computed, unref} from 'vue';
import {BasicTable, useTable, TableAction} from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage'
import {useModal} from '/@/components/Modal';
import ExhibitMaintenanceModal from './components/ExhibitMaintenanceModal.vue'
import {columns, searchFormSchema} from './exhibitMaintenance.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './exhibitMaintenance.api';
const checkedKeys = ref<Array<string | number>>([]);
//model
const [registerModal, {openModal}] = useModal();
//table
const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
tableProps:{
title: '保养信息记录表',
api: list,
columns,
canResize:false,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
fieldMapToTime: [
],
},
actionColumn: {
width: 120,
},
},
exportConfig: {
name:"保养信息记录表",
url: getExportUrl,
},
importConfig: {
url: getImportUrl
},
})
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, reload);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: checkedKeys.value}, reload);
}
/**
* 成功回调
*/
function handleSuccess() {
reload();
}
/**
* 操作栏
*/
function getTableAction(record){
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
}
]
}
/**
* 下拉操作栏
*/
function getDropDownAction(record){
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
}, {
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
}
}
]
}
</script>
<style scoped>
</style>

+ 103
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitMaintenance/vue3/components/ExhibitMaintenanceModal.vue View File

@ -0,0 +1,103 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit">
<BasicForm @register="registerForm" ref="formRef"/>
<!-- 子表单区域 -->
<a-tabs v-model:activeKey="activeKey" @change="handleChangeTabs">
<a-tab-pane tab="保养费用明细记录表" :key="refKeys[0]" :forceRender="true">
<JVxeTable
keep-source
resizable
:ref="refKeys[0]"
:loading="exhibitMaintenanceExpenseTable.loading"
:columns="exhibitMaintenanceExpenseTable.columns"
:dataSource="exhibitMaintenanceExpenseTable.dataSource"
:maxHeight="300"
:rowNumber="true"
:rowSelection="true"
:toolbar="true"
/>
</a-tab-pane>
</a-tabs>
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref,reactive} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {BasicForm, useForm} from '/@/components/Form/index';
import { JVxeTable } from '/@/components/jeecg/JVxeTable'
import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'
import {formSchema,exhibitMaintenanceExpenseColumns} from '../exhibitMaintenance.data';
import {saveOrUpdate,exhibitMaintenanceExpenseList} from '../exhibitMaintenance.api';
import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'
// Emits
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
const refKeys = ref(['exhibitMaintenanceExpense', ]);
const activeKey = ref('exhibitMaintenanceExpense');
const exhibitMaintenanceExpense = ref();
const tableRefs = {exhibitMaintenanceExpense, };
const exhibitMaintenanceExpenseTable = reactive({
loading: false,
dataSource: [],
columns:exhibitMaintenanceExpenseColumns
})
//
const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
});
//
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
//
await reset();
setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
//
await setFieldsValue({
...data.record,
});
requestSubTableData(exhibitMaintenanceExpenseList, {id:data?.record?.id}, exhibitMaintenanceExpenseTable)
}
//
setProps({ disabled: !data?.showFooter })
});
//
const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys);
//
const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
async function reset(){
await resetFields();
activeKey.value = 'exhibitMaintenanceExpense';
exhibitMaintenanceExpenseTable.dataSource = [];
}
function classifyIntoFormData(allValues) {
let main = Object.assign({}, allValues.formValue)
return {
...main, //
exhibitMaintenanceExpenseList: allValues.tablesValue[0].tableData,
}
}
//
async function requestAddOrEdit(values) {
try {
setModalProps({confirmLoading: true});
//
await saveOrUpdate(values, isUpdate.value);
//
closeModal();
//
emit('success');
} finally {
setModalProps({confirmLoading: false});
}
}
</script>
<style lang="less" scoped>
</style>

+ 171
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/controller/ExhibitPermissionController.java View File

@ -0,0 +1,171 @@
package org.jeecg.modules.exhibitPermission.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.exhibitPermission.entity.ExhibitPermission;
import org.jeecg.modules.exhibitPermission.service.IExhibitPermissionService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
@Api(tags="权限信息表")
@RestController
@RequestMapping("/exhibitPermission/exhibitPermission")
@Slf4j
public class ExhibitPermissionController extends JeecgController<ExhibitPermission, IExhibitPermissionService> {
@Autowired
private IExhibitPermissionService exhibitPermissionService;
/**
* 分页列表查询
*
* @param exhibitPermission
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "权限信息表-分页列表查询")
@ApiOperation(value="权限信息表-分页列表查询", notes="权限信息表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<ExhibitPermission>> queryPageList(ExhibitPermission exhibitPermission,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<ExhibitPermission> queryWrapper = QueryGenerator.initQueryWrapper(exhibitPermission, req.getParameterMap());
Page<ExhibitPermission> page = new Page<ExhibitPermission>(pageNo, pageSize);
IPage<ExhibitPermission> pageList = exhibitPermissionService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param exhibitPermission
* @return
*/
@AutoLog(value = "权限信息表-添加")
@ApiOperation(value="权限信息表-添加", notes="权限信息表-添加")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody ExhibitPermission exhibitPermission) {
exhibitPermissionService.save(exhibitPermission);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param exhibitPermission
* @return
*/
@AutoLog(value = "权限信息表-编辑")
@ApiOperation(value="权限信息表-编辑", notes="权限信息表-编辑")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody ExhibitPermission exhibitPermission) {
exhibitPermissionService.updateById(exhibitPermission);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "权限信息表-通过id删除")
@ApiOperation(value="权限信息表-通过id删除", notes="权限信息表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
exhibitPermissionService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "权限信息表-批量删除")
@ApiOperation(value="权限信息表-批量删除", notes="权限信息表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.exhibitPermissionService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "权限信息表-通过id查询")
@ApiOperation(value="权限信息表-通过id查询", notes="权限信息表-通过id查询")
@GetMapping(value = "/queryById")
public Result<ExhibitPermission> queryById(@RequestParam(name="id",required=true) String id) {
ExhibitPermission exhibitPermission = exhibitPermissionService.getById(id);
if(exhibitPermission==null) {
return Result.error("未找到对应数据");
}
return Result.OK(exhibitPermission);
}
/**
* 导出excel
*
* @param request
* @param exhibitPermission
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, ExhibitPermission exhibitPermission) {
return super.exportXls(request, exhibitPermission, ExhibitPermission.class, "权限信息表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, ExhibitPermission.class);
}
}

+ 58
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/entity/ExhibitPermission.java View File

@ -0,0 +1,58 @@
package org.jeecg.modules.exhibitPermission.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
@Data
@TableName("exhibit_permission")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="exhibit_permission对象", description="权限信息表")
public class ExhibitPermission implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
/**创建日期*/
@ApiModelProperty(value = "创建日期")
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@ApiModelProperty(value = "更新日期")
private java.util.Date updateTime;
/**权限名称*/
@Excel(name = "权限名称", width = 15)
@ApiModelProperty(value = "权限名称")
private java.lang.String title;
/**权限编码*/
@Excel(name = "权限编码", width = 15)
@ApiModelProperty(value = "权限编码")
private java.lang.Integer code;
}

+ 17
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/mapper/ExhibitPermissionMapper.java View File

@ -0,0 +1,17 @@
package org.jeecg.modules.exhibitPermission.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.exhibitPermission.entity.ExhibitPermission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface ExhibitPermissionMapper extends BaseMapper<ExhibitPermission> {
}

+ 5
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/mapper/xml/ExhibitPermissionMapper.xml View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.exhibitPermission.mapper.ExhibitPermissionMapper">
</mapper>

+ 14
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/service/IExhibitPermissionService.java View File

@ -0,0 +1,14 @@
package org.jeecg.modules.exhibitPermission.service;
import org.jeecg.modules.exhibitPermission.entity.ExhibitPermission;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface IExhibitPermissionService extends IService<ExhibitPermission> {
}

+ 19
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/service/impl/ExhibitPermissionServiceImpl.java View File

@ -0,0 +1,19 @@
package org.jeecg.modules.exhibitPermission.service.impl;
import org.jeecg.modules.exhibitPermission.entity.ExhibitPermission;
import org.jeecg.modules.exhibitPermission.mapper.ExhibitPermissionMapper;
import org.jeecg.modules.exhibitPermission.service.IExhibitPermissionService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 权限信息表
* @Author: jeecg-boot
* @Date: 2025-09-15
* @Version: V1.0
*/
@Service
public class ExhibitPermissionServiceImpl extends ServiceImpl<ExhibitPermissionMapper, ExhibitPermission> implements IExhibitPermissionService {
}

+ 177
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/ExhibitPermissionList.vue View File

@ -0,0 +1,177 @@
<template>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
</a-row>
</a-form>
</div>
<!-- 查询区域-END -->
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
<a-button type="primary" icon="download" @click="handleExportXls('权限信息表')">导出</a-button>
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
<a-button type="primary" icon="import">导入</a-button>
</a-upload>
<!-- 高级查询区域 -->
<j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
<a-dropdown v-if="selectedRowKeys.length > 0">
<a-menu slot="overlay">
<a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
</a-menu>
<a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
</a-dropdown>
</div>
<!-- table区域-begin -->
<div>
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
<i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
</div>
<a-table
ref="table"
size="middle"
:scroll="{x:true}"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
class="j-table-force-nowrap"
@change="handleTableChange">
<template slot="htmlSlot" slot-scope="text">
<div v-html="text"></div>
</template>
<template slot="imgSlot" slot-scope="text,record">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
<img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
</template>
<template slot="fileSlot" slot-scope="text">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button
v-else
:ghost="true"
type="primary"
icon="download"
size="small"
@click="downloadFile(text)">
下载
</a-button>
</template>
<span slot="action" slot-scope="text, record">
<a @click="handleEdit(record)">编辑</a>
<a-divider type="vertical" />
<a-dropdown>
<a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
<a-menu slot="overlay">
<a-menu-item>
<a @click="handleDetail(record)">详情</a>
</a-menu-item>
<a-menu-item>
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
<a>删除</a>
</a-popconfirm>
</a-menu-item>
</a-menu>
</a-dropdown>
</span>
</a-table>
</div>
<exhibit-permission-modal ref="modalForm" @ok="modalFormOk"></exhibit-permission-modal>
</a-card>
</template>
<script>
import '@/assets/less/TableExpand.less'
import { mixinDevice } from '@/utils/mixin'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import ExhibitPermissionModal from './modules/ExhibitPermissionModal'
export default {
name: 'ExhibitPermissionList',
mixins:[JeecgListMixin, mixinDevice],
components: {
ExhibitPermissionModal
},
data () {
return {
description: '权限信息表管理页面',
//
columns: [
{
title: '#',
dataIndex: '',
key:'rowIndex',
width:60,
align:"center",
customRender:function (t,r,index) {
return parseInt(index)+1;
}
},
{
title:'权限名称',
align:"center",
dataIndex: 'title'
},
{
title:'权限编码',
align:"center",
dataIndex: 'code'
},
{
title: '操作',
dataIndex: 'action',
align:"center",
fixed:"right",
width:147,
scopedSlots: { customRender: 'action' }
}
],
url: {
list: "/exhibitPermission/exhibitPermission/list",
delete: "/exhibitPermission/exhibitPermission/delete",
deleteBatch: "/exhibitPermission/exhibitPermission/deleteBatch",
exportXlsUrl: "/exhibitPermission/exhibitPermission/exportXls",
importExcelUrl: "exhibitPermission/exhibitPermission/importExcel",
},
dictOptions:{},
superFieldList:[],
}
},
created() {
this.getSuperFieldList();
},
computed: {
importExcelUrl: function(){
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
},
},
methods: {
initDictConfig(){
},
getSuperFieldList(){
let fieldList=[];
fieldList.push({type:'string',value:'title',text:'权限名称',dictCode:''})
fieldList.push({type:'int',value:'code',text:'权限编码',dictCode:''})
this.superFieldList = fieldList
}
}
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>

+ 109
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/modules/ExhibitPermissionForm.vue View File

@ -0,0 +1,109 @@
<template>
<a-spin :spinning="confirmLoading">
<j-form-container :disabled="formDisabled">
<a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
<a-row>
<a-col :span="24">
<a-form-model-item label="权限名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="title">
<a-input v-model="model.title" placeholder="请输入权限名称" ></a-input>
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-form-model-item label="权限编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="code">
<a-input-number v-model="model.code" placeholder="请输入权限编码" style="width: 100%" />
</a-form-model-item>
</a-col>
</a-row>
</a-form-model>
</j-form-container>
</a-spin>
</template>
<script>
import { httpAction, getAction } from '@/api/manage'
import { validateDuplicateValue } from '@/utils/util'
export default {
name: 'ExhibitPermissionForm',
components: {
},
props: {
//
disabled: {
type: Boolean,
default: false,
required: false
}
},
data () {
return {
model:{
},
labelCol: {
xs: { span: 24 },
sm: { span: 5 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
},
confirmLoading: false,
validatorRules: {
},
url: {
add: "/exhibitPermission/exhibitPermission/add",
edit: "/exhibitPermission/exhibitPermission/edit",
queryById: "/exhibitPermission/exhibitPermission/queryById"
}
}
},
computed: {
formDisabled(){
return this.disabled
},
},
created () {
//model
this.modelDefault = JSON.parse(JSON.stringify(this.model));
},
methods: {
add () {
this.edit(this.modelDefault);
},
edit (record) {
this.model = Object.assign({}, record);
this.visible = true;
},
submitForm () {
const that = this;
//
this.$refs.form.validate(valid => {
if (valid) {
that.confirmLoading = true;
let httpurl = '';
let method = '';
if(!this.model.id){
httpurl+=this.url.add;
method = 'post';
}else{
httpurl+=this.url.edit;
method = 'put';
}
httpAction(httpurl,this.model,method).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.$emit('ok');
}else{
that.$message.warning(res.message);
}
}).finally(() => {
that.confirmLoading = false;
})
}
})
},
}
}
</script>

+ 84
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/modules/ExhibitPermissionModal.Style#Drawer.vue View File

@ -0,0 +1,84 @@
<template>
<a-drawer
:title="title"
:width="width"
placement="right"
:closable="false"
@close="close"
destroyOnClose
:visible="visible">
<exhibit-permission-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></exhibit-permission-form>
<div class="drawer-footer">
<a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
<a-button v-if="!disableSubmit" @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
</div>
</a-drawer>
</template>
<script>
import ExhibitPermissionForm from './ExhibitPermissionForm'
export default {
name: 'ExhibitPermissionModal',
components: {
ExhibitPermissionForm
},
data () {
return {
title:"操作",
width:800,
visible: false,
disableSubmit: false
}
},
methods: {
add () {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.add();
})
},
edit (record) {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.edit(record);
});
},
close () {
this.$emit('close');
this.visible = false;
},
submitCallback(){
this.$emit('ok');
this.visible = false;
},
handleOk () {
this.$refs.realForm.submitForm();
},
handleCancel () {
this.close()
}
}
}
</script>
<style lang="less" scoped>
/** Button按钮间距 */
.ant-btn {
margin-left: 30px;
margin-bottom: 30px;
float: right;
}
.drawer-footer{
position: absolute;
bottom: -8px;
width: 100%;
border-top: 1px solid #e8e8e8;
padding: 10px 16px;
text-align: right;
left: 0;
background: #fff;
border-radius: 0 0 2px 2px;
}
</style>

+ 60
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue/modules/ExhibitPermissionModal.vue View File

@ -0,0 +1,60 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
switchFullscreen
@ok="handleOk"
:okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
@cancel="handleCancel"
cancelText="关闭">
<exhibit-permission-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></exhibit-permission-form>
</j-modal>
</template>
<script>
import ExhibitPermissionForm from './ExhibitPermissionForm'
export default {
name: 'ExhibitPermissionModal',
components: {
ExhibitPermissionForm
},
data () {
return {
title:'',
width:800,
visible: false,
disableSubmit: false
}
},
methods: {
add () {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.add();
})
},
edit (record) {
this.visible=true
this.$nextTick(()=>{
this.$refs.realForm.edit(record);
})
},
close () {
this.$emit('close');
this.visible = false;
},
handleOk () {
this.$refs.realForm.submitForm();
},
submitCallback(){
this.$emit('ok');
this.visible = false;
},
handleCancel () {
this.close()
}
}
}
</script>

+ 61
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/ExhibitPermission.api.ts View File

@ -0,0 +1,61 @@
import {defHttp} from '/@/utils/http/axios';
import {Modal} from 'ant-design-vue';
enum Api {
list = '/exhibitPermission/exhibitPermission/list',
save='/exhibitPermission/exhibitPermission/add',
edit='/exhibitPermission/exhibitPermission/edit',
deleteOne = '/exhibitPermission/exhibitPermission/delete',
deleteBatch = '/exhibitPermission/exhibitPermission/deleteBatch',
importExcel = '/exhibitPermission/exhibitPermission/importExcel',
exportXls = '/exhibitPermission/exhibitPermission/exportXls',
}
/**
* api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* api
*/
export const getImportUrl = Api.importExcel;
/**
*
* @param params
*/
export const list = (params) =>
defHttp.get({url: Api.list, params});
/**
*
*/
export const deleteOne = (params,handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
*
* @param params
*/
export const batchDelete = (params, handleSuccess) => {
Modal.confirm({
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
*
* @param params
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({url: url, params});
}

+ 33
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/ExhibitPermission.data.ts View File

@ -0,0 +1,33 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
import { render } from '/@/utils/common/renderUtils';
//列表数据
export const columns: BasicColumn[] = [
{
title: '权限名称',
align:"center",
dataIndex: 'title'
},
{
title: '权限编码',
align:"center",
dataIndex: 'code'
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
];
//表单数据
export const formSchema: FormSchema[] = [
{
label: '权限名称',
field: 'title',
component: 'Input',
},
{
label: '权限编码',
field: 'code',
component: 'InputNumber',
},
];

+ 162
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/ExhibitPermissionList.vue View File

@ -0,0 +1,162 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="checkedKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined"></Icon>
删除
</a-menu-item>
</a-menu>
</template>
<a-button>批量操作
<Icon icon="mdi:chevron-down"></Icon>
</a-button>
</a-dropdown>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
</template>
<!--字段回显插槽-->
<template #htmlSlot="{text}">
<div v-html="text"></div>
</template>
<template #fileSlot="{text}">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
</template>
</BasicTable>
<!-- 表单区域 -->
<ExhibitPermissionModal @register="registerModal" @success="handleSuccess"></ExhibitPermissionModal>
</div>
</template>
<script lang="ts" name="exhibitPermission-exhibitPermission" setup>
import {ref, computed, unref} from 'vue';
import {BasicTable, useTable, TableAction} from '/@/components/Table';
import {useModal} from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'
import ExhibitPermissionModal from './components/ExhibitPermissionModal.vue'
import {columns, searchFormSchema} from './exhibitPermission.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './exhibitPermission.api';
const checkedKeys = ref<Array<string | number>>([]);
//model
const [registerModal, {openModal}] = useModal();
//table
const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
tableProps:{
title: '权限信息表',
api: list,
columns,
canResize:false,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
fieldMapToTime: [
],
},
actionColumn: {
width: 120,
},
},
exportConfig: {
name:"权限信息表",
url: getExportUrl,
},
importConfig: {
url: getImportUrl
},
})
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, reload);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: checkedKeys.value}, reload);
}
/**
* 成功回调
*/
function handleSuccess() {
reload();
}
/**
* 操作栏
*/
function getTableAction(record){
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
}
]
}
/**
* 下拉操作栏
*/
function getDropDownAction(record){
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
}, {
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
}
}
]
}
</script>
<style scoped>
</style>

+ 58
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitPermission/vue3/components/ExhibitPermissionModal.vue View File

@ -0,0 +1,58 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit">
<BasicForm @register="registerForm"/>
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {BasicForm, useForm} from '/@/components/Form/index';
import {formSchema} from '../exhibitPermission.data';
import {saveOrUpdate} from '../exhibitPermission.api';
// Emits
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
//
const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
});
//
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
//
await resetFields();
setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
//
await setFieldsValue({
...data.record,
});
}
//
setProps({ disabled: !data?.showFooter })
});
//
const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
//
async function handleSubmit(v) {
try {
let values = await validate();
setModalProps({confirmLoading: true});
//
await saveOrUpdate(values, isUpdate.value);
//
closeModal();
//
emit('success');
} finally {
setModalProps({confirmLoading: false});
}
}
</script>
<style lang="less" scoped>
</style>

+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/controller/ExhibitRepairController.java View File

@ -45,7 +45,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 维修信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Api(tags="维修信息记录表")


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/entity/ExhibitRepair.java View File

@ -20,7 +20,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 维修信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@ApiModel(value="exhibit_repair对象", description="维修信息记录表")


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/entity/ExhibitRepairExpense.java View File

@ -16,7 +16,7 @@ import java.io.UnsupportedEncodingException;
/**
* @Description: 维修费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@ApiModel(value="exhibit_repair_expense对象", description="维修费用明细记录表")


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/mapper/ExhibitRepairExpenseMapper.java View File

@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param;
/**
* @Description: 维修费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface ExhibitRepairExpenseMapper extends BaseMapper<ExhibitRepairExpense> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/mapper/ExhibitRepairMapper.java View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 维修信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface ExhibitRepairMapper extends BaseMapper<ExhibitRepair> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/IExhibitRepairExpenseService.java View File

@ -7,7 +7,7 @@ import java.util.List;
/**
* @Description: 维修费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface IExhibitRepairExpenseService extends IService<ExhibitRepairExpense> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/IExhibitRepairService.java View File

@ -10,7 +10,7 @@ import java.util.List;
/**
* @Description: 维修信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
public interface IExhibitRepairService extends IService<ExhibitRepair> {


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/impl/ExhibitRepairExpenseServiceImpl.java View File

@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 维修费用明细记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Service


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/service/impl/ExhibitRepairServiceImpl.java View File

@ -16,7 +16,7 @@ import java.util.Collection;
/**
* @Description: 维修信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Service


+ 1
- 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vo/ExhibitRepairPage.java View File

@ -17,7 +17,7 @@ import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 维修信息记录表
* @Author: jeecg-boot
* @Date: 2025-08-28
* @Date: 2025-09-15
* @Version: V1.0
*/
@Data


+ 10
- 10
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue/ExhibitRepairList.vue View File

@ -209,16 +209,16 @@
},
getSuperFieldList(){
let fieldList=[];
fieldList.push({type:'date',value:'repairDate',text:'维修日期'})
fieldList.push({type:'string',value:'repairName',text:'维修人',dictCode:''})
fieldList.push({type:'string',value:'phone',text:'联系方式',dictCode:''})
fieldList.push({type:'Text',value:'content',text:'处理内容',dictCode:''})
fieldList.push({type:'Text',value:'image',text:'图片',dictCode:''})
fieldList.push({type:'string',value:'isExpend',text:'是否产生费用',dictCode:'is_true'})
fieldList.push({type:'BigDecimal',value:'amount',text:'费用金额',dictCode:''})
fieldList.push({type:'string',value:'isFix',text:'问题是否解决',dictCode:'is_true'})
fieldList.push({type:'Text',value:'remark',text:'备注',dictCode:''})
fieldList.push({type:'sel_search',value:'showpieceId',text:'关联展品id',dictTable:"exhibit_showpiece", dictText:'title', dictCode:'id'})
fieldList.push({type:'date',value:'repairDate',text:'维修日期'})
fieldList.push({type:'string',value:'repairName',text:'维修人',dictCode:''})
fieldList.push({type:'string',value:'phone',text:'联系方式',dictCode:''})
fieldList.push({type:'Text',value:'content',text:'处理内容',dictCode:''})
fieldList.push({type:'Text',value:'image',text:'图片',dictCode:''})
fieldList.push({type:'string',value:'isExpend',text:'是否产生费用',dictCode:'is_true'})
fieldList.push({type:'BigDecimal',value:'amount',text:'费用金额',dictCode:''})
fieldList.push({type:'string',value:'isFix',text:'问题是否解决',dictCode:'is_true'})
fieldList.push({type:'Text',value:'remark',text:'备注',dictCode:''})
fieldList.push({type:'sel_search',value:'showpieceId',text:'关联展品id',dictTable:"exhibit_showpiece", dictText:'title', dictCode:'id'})
this.superFieldList = fieldList
}
}


+ 30
- 25
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue/modules/ExhibitRepairForm.vue View File

@ -51,7 +51,7 @@
</a-col>
<a-col :span="24" >
<a-form-model-item label="关联展品id" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="showpieceId">
<j-search-select-tag v-model="model.showpieceId" dict="exhibit_showpiece,title,id" />
<j-search-select-tag v-model="model.showpieceId" dict="exhibit_showpiece,title,id" />
</a-form-model-item>
</a-col>
</a-row>
@ -60,7 +60,8 @@
<!-- 子表单区域 -->
<a-tabs v-model="activeKey" @change="handleChangeTabs">
<a-tab-pane tab="维修费用明细记录表" :key="refKeys[0]" :forceRender="true">
<j-editable-table
<j-vxe-table
keep-source
:ref="refKeys[0]"
:loading="exhibitRepairExpenseTable.loading"
:columns="exhibitRepairExpenseTable.columns"
@ -69,7 +70,8 @@
:disabled="formDisabled"
:rowNumber="true"
:rowSelection="true"
:actionButton="true"/>
:toolbar="true"
/>
</a-tab-pane>
</a-tabs>
</a-spin>
@ -78,14 +80,17 @@
<script>
import { getAction } from '@/api/manage'
import { FormTypes,getRefPromise,VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'
import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'
import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
import { JVXETypes } from '@/components/jeecg/JVxeTable'
import { getRefPromise,VALIDATE_FAILED} from '@/components/jeecg/JVxeTable/utils/vxeUtils.js'
import { validateDuplicateValue } from '@/utils/util'
import JFormContainer from '@/components/jeecg/JFormContainer'
export default {
name: 'ExhibitRepairForm',
mixins: [JEditableTableModelMixin],
mixins: [JVxeTableModelMixin],
components: {
JFormContainer,
},
data() {
return {
@ -98,7 +103,7 @@
sm: { span: 16 },
},
model:{
},
},
//
addDefaultRowNum: 1,
validatorRules: {
@ -118,7 +123,7 @@
{
title: '费用名称',
key: 'title',
type: FormTypes.input,
type: JVXETypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
@ -126,7 +131,7 @@
{
title: '数量',
key: 'num',
type: FormTypes.inputNumber,
type: JVXETypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
@ -134,7 +139,7 @@
{
title: '金额',
key: 'amount',
type: FormTypes.inputNumber,
type: JVXETypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
@ -185,27 +190,27 @@
}
},
//
validateSubForm(allValues){
return new Promise((resolve,reject)=>{
Promise.all([
]).then(() => {
resolve(allValues)
}).catch(e => {
if (e.error === VALIDATE_NO_PASSED) {
// tab
this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
} else {
console.error(e)
}
validateSubForm(allValues){
return new Promise((resolve,reject)=>{
Promise.all([
]).then(() => {
resolve(allValues)
}).catch(e => {
if (e.error === VALIDATE_FAILED) {
// tab
this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
} else {
console.error(e)
}
})
})
})
},
},
/** 整理成formData */
classifyIntoFormData(allValues) {
let main = Object.assign(this.model, allValues.formValue)
return {
...main, //
exhibitRepairExpenseList: allValues.tablesValue[0].values,
exhibitRepairExpenseList: allValues.tablesValue[0].tableData,
}
},
validateError(msg){


+ 68
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/ExhibitRepair.api.ts View File

@ -0,0 +1,68 @@
import {defHttp} from '/@/utils/http/axios';
import {Modal} from 'ant-design-vue';
enum Api {
list = '/exhibitRepair/exhibitRepair/list',
save='/exhibitRepair/exhibitRepair/add',
edit='/exhibitRepair/exhibitRepair/edit',
deleteOne = '/exhibitRepair/exhibitRepair/delete',
deleteBatch = '/exhibitRepair/exhibitRepair/deleteBatch',
importExcel = '/exhibitRepair/exhibitRepair/importExcel',
exportXls = '/exhibitRepair/exhibitRepair/exportXls',
exhibitRepairExpenseList = '/exhibitRepair/exhibitRepair/queryExhibitRepairExpenseByMainId',
}
/**
* api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* api
*/
export const getImportUrl = Api.importExcel;
/**
*
* @param params
*/
export const exhibitRepairExpenseList = Api.exhibitRepairExpenseList;
/**
*
* @param params
*/
export const list = (params) =>
defHttp.get({url: Api.list, params});
/**
*
*/
export const deleteOne = (params,handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
*
* @param params
*/
export const batchDelete = (params, handleSuccess) => {
Modal.confirm({
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
*
* @param params
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({url: url, params});
}

+ 163
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/ExhibitRepair.data.ts View File

@ -0,0 +1,163 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
import { render } from '/@/utils/common/renderUtils';
import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
//列表数据
export const columns: BasicColumn[] = [
{
title: '维修日期',
align:"center",
dataIndex: 'repairDate',
customRender:({text}) =>{
return !text?"":(text.length>10?text.substr(0,10):text)
},
},
{
title: '维修人',
align:"center",
dataIndex: 'repairName'
},
{
title: '联系方式',
align:"center",
dataIndex: 'phone'
},
{
title: '处理内容',
align:"center",
dataIndex: 'content'
},
{
title: '图片',
align:"center",
dataIndex: 'image',
customRender:render.renderAvatar,
},
{
title: '是否产生费用',
align:"center",
dataIndex: 'isExpend_dictText'
},
{
title: '费用金额',
align:"center",
dataIndex: 'amount'
},
{
title: '问题是否解决',
align:"center",
dataIndex: 'isFix_dictText'
},
{
title: '备注',
align:"center",
dataIndex: 'remark'
},
{
title: '关联展品id',
align:"center",
dataIndex: 'showpieceId_dictText'
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
];
//表单数据
export const formSchema: FormSchema[] = [
{
label: '维修日期',
field: 'repairDate',
component: 'DatePicker',
},
{
label: '维修人',
field: 'repairName',
component: 'Input',
},
{
label: '联系方式',
field: 'phone',
component: 'Input',
dynamicRules: ({model,schema}) => {
return [
{ required: false},
{ pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},
];
},
},
{
label: '处理内容',
field: 'content',
component: 'InputTextArea',//TODO 注意string转换问题
},
{
label: '图片',
field: 'image',
component: 'JImageUpload',
componentProps:{
},
},
{
label: '是否产生费用',
field: 'isExpend',
component: 'JDictSelectTag',
componentProps:{
dictCode:"is_true"
},
},
{
label: '费用金额',
field: 'amount',
component: 'InputNumber',
},
{
label: '问题是否解决',
field: 'isFix',
component: 'JDictSelectTag',
componentProps:{
dictCode:"is_true"
},
},
{
label: '备注',
field: 'remark',
component: 'InputTextArea',//TODO 注意string转换问题
},
{
label: '关联展品id',
field: 'showpieceId',
component: 'JSearchSelect',
componentProps:{
dict:"exhibit_showpiece,title,id"
},
},
];
//子表单数据
//子表表格配置
export const exhibitRepairExpenseColumns: JVxeColumn[] = [
{
title: '费用名称',
key: 'title',
type: JVxeTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '数量',
key: 'num',
type: JVxeTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
{
title: '金额',
key: 'amount',
type: JVxeTypes.input,
width:"200px",
placeholder: '请输入${title}',
defaultValue:'',
},
]

+ 162
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/ExhibitRepairList.vue View File

@ -0,0 +1,162 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="checkedKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined"></Icon>
删除
</a-menu-item>
</a-menu>
</template>
<a-button>批量操作
<Icon icon="mdi:chevron-down"></Icon>
</a-button>
</a-dropdown>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
</template>
<!--字段回显插槽-->
<template #htmlSlot="{text}">
<div v-html="text"></div>
</template>
<template #fileSlot="{text}">
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
</template>
</BasicTable>
<!-- 表单区域 -->
<ExhibitRepairModal @register="registerModal" @success="handleSuccess"></ExhibitRepairModal>
</div>
</template>
<script lang="ts" name="exhibitRepair-exhibitRepair" setup>
import {ref, computed, unref} from 'vue';
import {BasicTable, useTable, TableAction} from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage'
import {useModal} from '/@/components/Modal';
import ExhibitRepairModal from './components/ExhibitRepairModal.vue'
import {columns, searchFormSchema} from './exhibitRepair.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './exhibitRepair.api';
const checkedKeys = ref<Array<string | number>>([]);
//model
const [registerModal, {openModal}] = useModal();
//table
const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({
tableProps:{
title: '维修信息记录表',
api: list,
columns,
canResize:false,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
fieldMapToTime: [
],
},
actionColumn: {
width: 120,
},
},
exportConfig: {
name:"维修信息记录表",
url: getExportUrl,
},
importConfig: {
url: getImportUrl
},
})
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({id: record.id}, reload);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ids: checkedKeys.value}, reload);
}
/**
* 成功回调
*/
function handleSuccess() {
reload();
}
/**
* 操作栏
*/
function getTableAction(record){
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
}
]
}
/**
* 下拉操作栏
*/
function getDropDownAction(record){
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
}, {
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
}
}
]
}
</script>
<style scoped>
</style>

+ 103
- 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/modules/exhibitRepair/vue3/components/ExhibitRepairModal.vue View File

@ -0,0 +1,103 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit">
<BasicForm @register="registerForm" ref="formRef"/>
<!-- 子表单区域 -->
<a-tabs v-model:activeKey="activeKey" @change="handleChangeTabs">
<a-tab-pane tab="维修费用明细记录表" :key="refKeys[0]" :forceRender="true">
<JVxeTable
keep-source
resizable
:ref="refKeys[0]"
:loading="exhibitRepairExpenseTable.loading"
:columns="exhibitRepairExpenseTable.columns"
:dataSource="exhibitRepairExpenseTable.dataSource"
:maxHeight="300"
:rowNumber="true"
:rowSelection="true"
:toolbar="true"
/>
</a-tab-pane>
</a-tabs>
</BasicModal>
</template>
<script lang="ts" setup>
import {ref, computed, unref,reactive} from 'vue';
import {BasicModal, useModalInner} from '/@/components/Modal';
import {BasicForm, useForm} from '/@/components/Form/index';
import { JVxeTable } from '/@/components/jeecg/JVxeTable'
import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'
import {formSchema,exhibitRepairExpenseColumns} from '../exhibitRepair.data';
import {saveOrUpdate,exhibitRepairExpenseList} from '../exhibitRepair.api';
import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'
// Emits
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
const refKeys = ref(['exhibitRepairExpense', ]);
const activeKey = ref('exhibitRepairExpense');
const exhibitRepairExpense = ref();
const tableRefs = {exhibitRepairExpense, };
const exhibitRepairExpenseTable = reactive({
loading: false,
dataSource: [],
columns:exhibitRepairExpenseColumns
})
//
const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
});
//
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
//
await reset();
setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
//
await setFieldsValue({
...data.record,
});
requestSubTableData(exhibitRepairExpenseList, {id:data?.record?.id}, exhibitRepairExpenseTable)
}
//
setProps({ disabled: !data?.showFooter })
});
//
const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys);
//
const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
async function reset(){
await resetFields();
activeKey.value = 'exhibitRepairExpense';
exhibitRepairExpenseTable.dataSource = [];
}
function classifyIntoFormData(allValues) {
let main = Object.assign({}, allValues.formValue)
return {
...main, //
exhibitRepairExpenseList: allValues.tablesValue[0].tableData,
}
}
//
async function requestAddOrEdit(values) {
try {
setModalProps({confirmLoading: true});
//
await saveOrUpdate(values, isUpdate.value);
//
closeModal();
//
emit('success');
} finally {
setModalProps({confirmLoading: false});
}
}
</script>
<style lang="less" scoped>
</style>

+ 82
- 10
jeecg-boot-module-system/src/main/java/org/jeecg/modules/api/service/impl/ShowpieceServiceImpl.java View File

@ -9,6 +9,8 @@ import org.jeecg.common.api.vo.Result;
import org.jeecg.config.shiro.ShiroRealm;
import org.jeecg.modules.api.bean.PageBean;
import org.jeecg.modules.api.service.ShowpieceService;
import org.jeecg.modules.exhibitDepartmentPermission.entity.ExhibitDepartmentPermission;
import org.jeecg.modules.exhibitDepartmentPermission.service.IExhibitDepartmentPermissionService;
import org.jeecg.modules.exhibitMaintenance.entity.ExhibitMaintenance;
import org.jeecg.modules.exhibitMaintenance.entity.ExhibitMaintenanceExpense;
import org.jeecg.modules.exhibitMaintenance.service.IExhibitMaintenanceExpenseService;
@ -58,6 +60,9 @@ public class ShowpieceServiceImpl implements ShowpieceService {
//保养记录费用信息
@Resource
private IExhibitMaintenanceExpenseService exhibitMaintenanceExpenseService;
//部门权限信息
@Resource
private IExhibitDepartmentPermissionService exhibitDepartmentPermissionService;
/******************************************************************************************************************/
//展品-查看展品信息列表
@ -200,7 +205,17 @@ public class ShowpieceServiceImpl implements ShowpieceService {
return Result.error("用户审核未通过");
}
//2新增报修单
//2校验权限信息
String departmentId = hanHaiMember.getDepartment();
ExhibitDepartmentPermission permission = exhibitDepartmentPermissionService
.lambdaQuery()
.eq(ExhibitDepartmentPermission::getDepartmentId, departmentId)
.one();
if(!permission.getPermissionId().contains("1")){
return Result.error("用户没有操作权限");
}
//3新增报修单
exhibitMalfunction.setMalfunctionName(hanHaiMember.getId());
boolean result = exhibitMalfunctionService.save(exhibitMalfunction);
@ -237,7 +252,23 @@ public class ShowpieceServiceImpl implements ShowpieceService {
return Result.error("用户审核未通过");
}
//2修改报修单
//2校验权限信息
String departmentId = hanHaiMember.getDepartment();
ExhibitDepartmentPermission permission = exhibitDepartmentPermissionService
.lambdaQuery()
.eq(ExhibitDepartmentPermission::getDepartmentId, departmentId)
.one();
if(!permission.getPermissionId().contains("1")){
return Result.error("用户没有操作权限");
}
//3修改报修单
ExhibitMalfunction malfunction = exhibitMalfunctionService.getById(exhibitMalfunction.getId());
if(!permission.getPermissionId().contains("0")){
if(!hanHaiMember.getId().equals(malfunction.getMalfunctionName())){
return Result.error("该记录不属于用户,不能修改");
}
}
boolean result = exhibitMalfunctionService.updateById(exhibitMalfunction);
if(result){
@ -358,12 +389,22 @@ public class ShowpieceServiceImpl implements ShowpieceService {
return Result.error("用户审核未通过");
}
//2新增维修记录
//2校验权限信息
String departmentId = hanHaiMember.getDepartment();
ExhibitDepartmentPermission permission = exhibitDepartmentPermissionService
.lambdaQuery()
.eq(ExhibitDepartmentPermission::getDepartmentId, departmentId)
.one();
if(!permission.getPermissionId().contains("3")){
return Result.error("用户没有操作权限");
}
//3新增维修记录
String id = IdWorker.getIdStr();//生成维修单id
exhibitRepair.setId(id);
boolean result1 = exhibitRepairService.save(exhibitRepair);
//3新增费用明细
//4新增费用明细
List<ExhibitRepairExpense> list = new ArrayList<>();
boolean result2 = true;
if(StringUtils.isNotEmpty(exhibitRepair.getExpenseList())){
@ -385,7 +426,7 @@ public class ShowpieceServiceImpl implements ShowpieceService {
result2 = exhibitRepairExpenseService.saveBatch(list);
}
//4判断维修记录是否新增成功
//5判断维修记录是否新增成功
if(result1 && result2){
log.info("维修记录新增成功");
return Result.OK("维修记录新增成功");
@ -419,20 +460,31 @@ public class ShowpieceServiceImpl implements ShowpieceService {
return Result.error("用户审核未通过");
}
//2修改维修记录
//2校验权限信息
String departmentId = hanHaiMember.getDepartment();
ExhibitDepartmentPermission permission = exhibitDepartmentPermissionService
.lambdaQuery()
.eq(ExhibitDepartmentPermission::getDepartmentId, departmentId)
.one();
if(!permission.getPermissionId().contains("3")){
return Result.error("用户没有操作权限");
}
//3修改维修记录
boolean result1 = false;
String id = exhibitRepair.getId();
if(StringUtils.isEmpty(id)){
return Result.error("维修记录id为空,请传入维修记录id");
}
ExhibitRepair repair = exhibitRepairService.getById(id);
if(null != repair){
result1 = exhibitRepairService.updateById(exhibitRepair);
}
//3新增费用明细
//4新增费用明细
//3.1删除原有的费用明细
//4.1删除原有的费用明细
List<ExhibitRepairExpense> remove = exhibitRepairExpenseService.lambdaQuery().eq(ExhibitRepairExpense::getRepairId, id).list();
List<String> removeIds = new ArrayList<>();
for (ExhibitRepairExpense exhibitRepairExpense : remove) {
@ -440,7 +492,7 @@ public class ShowpieceServiceImpl implements ShowpieceService {
}
exhibitRepairExpenseService.removeByIds(removeIds);
//3.2 新增新的费用明细
//4.2 新增新的费用明细
List<ExhibitRepairExpense> list = new ArrayList<>();
boolean result2 = false;
if(StringUtils.isNotEmpty(exhibitRepair.getExpenseList())){
@ -464,7 +516,7 @@ public class ShowpieceServiceImpl implements ShowpieceService {
result2 = true;
}
//4判断维修记录是否修改成功
//5判断维修记录是否修改成功
if(result1 && result2){
log.info("维修记录修改成功");
return Result.OK("维修记录修改成功");
@ -583,6 +635,16 @@ public class ShowpieceServiceImpl implements ShowpieceService {
return Result.error("用户审核未通过");
}
//2校验权限信息
String departmentId = hanHaiMember.getDepartment();
ExhibitDepartmentPermission permission = exhibitDepartmentPermissionService
.lambdaQuery()
.eq(ExhibitDepartmentPermission::getDepartmentId, departmentId)
.one();
if(!permission.getPermissionId().contains("2")){
return Result.error("用户没有操作权限");
}
//2新增维修记录
String id = IdWorker.getIdStr();//生成保养单id
exhibitMaintenance.setId(id);
@ -655,6 +717,16 @@ public class ShowpieceServiceImpl implements ShowpieceService {
return Result.error("用户审核未通过");
}
//2校验权限信息
String departmentId = hanHaiMember.getDepartment();
ExhibitDepartmentPermission permission = exhibitDepartmentPermissionService
.lambdaQuery()
.eq(ExhibitDepartmentPermission::getDepartmentId, departmentId)
.one();
if(!permission.getPermissionId().contains("2")){
return Result.error("用户没有操作权限");
}
//2修改维修记录
boolean result1 = false;
String id = exhibitMaintenance.getId();


+ 5
- 5
jeecg-boot-module-system/src/main/resources/application-dev.yml View File

@ -192,11 +192,11 @@ jeecg :
excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**
#阿里云oss存储和大鱼短信秘钥配置
oss:
accessKey: LTAI5tPfZo39q2r9Sr5mW84u
secretKey: XxExGallsV4O9nERHpVsQg2XtPCU7r
endpoint: oss-cn-guangzhou.aliyuncs.com
bucketName: augcl
staticDomain: https://img.augcl.com
accessKey: LTAI5tQSs47izVy8DLVdwUU9
secretKey: qHI7C3PaXYZySr84HTToviC71AYlFq
endpoint: oss-cn-shenzhen.aliyuncs.com
bucketName: hanhaiimage
staticDomain: https://image.hhlm1688.com/
# ElasticSearch 6设置
elasticsearch:
cluster-name: jeecg-ES


Loading…
Cancel
Save