diff --git a/docs/app-policy-info-api.md b/docs/app-policy-info-api.md new file mode 100644 index 0000000..a2879f2 --- /dev/null +++ b/docs/app-policy-info-api.md @@ -0,0 +1,153 @@ +# 政策信息移动端接口文档 + +## 1. 获取政策列表 + +**接口地址:** `GET /app/policyInfo/portalList` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| pageNum | Number | 是 | 页码,默认 1 | +| pageSize | Number | 是 | 每页条数,默认 10 | +| searchValue | String | 否 | 政策名称搜索关键词 | + +**响应参数:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | +| total | Number | 总记录数 | +| rows | Array | 政策列表数据 | + +**rows 数组元素字段:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| id | Number | 政策ID | +| zcmc | String | 政策名称 | +| zclx | String | 政策类型 | +| zcLevel | String | 政策级别 | +| sourceUnit | String | 发文单位 | +| acceptUnit | String | 受理单位 | +| publishTime | String | 发文时间 | +| viewNum | Number | 浏览数 | +| createTime | String | 创建时间 | + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功", + "total": 100, + "rows": [ + { + "id": 1, + "zcmc": "就业见习补贴", + "zclx": "就业政策", + "zcLevel": "自治区级", + "sourceUnit": "新疆维吾尔自治区人力资源和社会保障厅", + "acceptUnit": "石河子市人社局", + "publishTime": "2021-09-24", + "viewNum": 1234, + "createTime": "2025-01-10" + } + ] +} +``` + +--- + +## 2. 获取政策详情 + +**接口地址:** `GET /app/policyInfo/detail/{id}` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Number | 是 | 政策ID(路径参数) | + +**响应参数:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | +| data | Object | 政策详情数据 | + +**data 字段:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| id | Number | 政策ID | +| zcmc | String | 政策名称 | +| zclx | String | 政策类型 | +| zcLevel | String | 政策级别 | +| sourceUnit | String | 发文单位 | +| acceptUnit | String | 受理单位 | +| publishTime | String | 发文时间 | +| zcContent | String | 政策内容 | +| subsidyStandard | String | 补贴标准 | +| handleChannel | String | 经办渠道 | +| applyCondition | String | 申报条件 | +| fileUrl | String | 政策文件URL | +| fileName | String | 政策文件名称 | +| viewNum | Number | 浏览数 | +| createTime | String | 创建时间 | + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "id": 1, + "zcmc": "就业见习补贴", + "zclx": "就业政策", + "zcLevel": "自治区级", + "sourceUnit": "新疆维吾尔自治区人力资源和社会保障厅", + "acceptUnit": "石河子市人社局", + "publishTime": "2021-09-24", + "zcContent": "支持高校毕业生和失业青年参加就业见习,提升就业能力。", + "subsidyStandard": "按当地最低工资标准给予见习补贴,见习单位按不低于当地最低工资标准的50%为见习人员发放岗位补助。", + "handleChannel": "石河子市人力资源和社会保障局就业服务窗口", + "applyCondition": "人社部门认定的见习单位,吸纳离校2年内未就业高校毕业生和16-24岁新疆籍失业青年参加就业见习。", + "fileUrl": "https://example.com/files/policy_001.pdf", + "fileName": "就业见习补贴政策文件.pdf", + "viewNum": 1234, + "createTime": "2025-01-10" + } +} +``` + +--- + +## 3. 浏览数加1 + +**接口地址:** `POST /app/policyInfo/addViewNum/{id}` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Number | 是 | 政策ID(路径参数) | + +**响应参数:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功" +} +``` diff --git a/docs/cms-policy-info-api.md b/docs/cms-policy-info-api.md new file mode 100644 index 0000000..f14311b --- /dev/null +++ b/docs/cms-policy-info-api.md @@ -0,0 +1,335 @@ +# 政策信息CMS管理接口文档 + +## 1. 查询政策列表 + +**接口地址:** `GET /cms/policyInfo/list` + +**权限标识:** `cms:policyInfo:list` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| pageNum | Number | 否 | 页码,默认 1 | +| pageSize | Number | 否 | 每页条数,默认 10 | +| searchValue | String | 否 | 政策名称搜索关键词 | + +**响应参数:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | +| total | Number | 总记录数 | +| rows | Array | 政策列表数据 | + +**rows 数组元素字段:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| id | Number | 政策ID | +| zcmc | String | 政策名称 | +| zclx | String | 政策类型 | +| zcLevel | String | 政策级别 | +| sourceUnit | String | 发文单位 | +| acceptUnit | String | 受理单位 | +| publishTime | String | 发文时间 | +| viewNum | Number | 浏览数 | +| createTime | String | 创建时间 | + +**响应示例:** + +```json +{ + "code": 200, + "msg": "查询成功", + "total": 100, + "rows": [ + { + "id": 1, + "zcmc": "就业见习补贴", + "zclx": "就业政策", + "zcLevel": "自治区级", + "sourceUnit": "新疆维吾尔自治区人力资源和社会保障厅", + "acceptUnit": "石河子市人社局", + "publishTime": "2021-09-24", + "viewNum": 1234, + "createTime": "2025-01-10 10:00:00" + } + ] +} +``` + +--- + +## 2. 获取政策详情 + +**接口地址:** `GET /cms/policyInfo/{id}` + +**权限标识:** `cms:policyInfo:query` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Number | 是 | 政策ID(路径参数) | + +**响应参数:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | +| data | Object | 政策详情数据 | + +**data 字段:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| id | Number | 政策ID | +| zcmc | String | 政策名称 | +| zclx | String | 政策类型 | +| zcLevel | String | 政策级别 | +| sourceUnit | String | 发文单位 | +| acceptUnit | String | 受理单位 | +| publishTime | String | 发文时间 | +| zcContent | String | 政策内容 | +| subsidyStandard | String | 补贴标准 | +| handleChannel | String | 经办渠道 | +| applyCondition | String | 申报条件 | +| fileUrl | String | 政策文件URL | +| fileName | String | 政策文件名称 | +| viewNum | Number | 浏览数 | +| createBy | String | 创建者 | +| createTime | String | 创建时间 | +| updateBy | String | 更新者 | +| updateTime | String | 更新时间 | +| remark | String | 备注 | + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "id": 1, + "zcmc": "就业见习补贴", + "zclx": "就业政策", + "zcLevel": "自治区级", + "sourceUnit": "新疆维吾尔自治区人力资源和社会保障厅", + "acceptUnit": "石河子市人社局", + "publishTime": "2021-09-24", + "zcContent": "支持高校毕业生和失业青年参加就业见习,提升就业能力。", + "subsidyStandard": "按当地最低工资标准给予见习补贴", + "handleChannel": "石河子市人力资源和社会保障局就业服务窗口", + "applyCondition": "人社部门认定的见习单位", + "fileUrl": "https://example.com/files/policy_001.pdf", + "fileName": "就业见习补贴政策文件.pdf", + "viewNum": 1234, + "createBy": "admin", + "createTime": "2025-01-10 10:00:00", + "updateBy": null, + "updateTime": null, + "remark": null + } +} +``` + +--- + +## 3. 新增政策 + +**接口地址:** `POST /cms/policyInfo` + +**权限标识:** `cms:policyInfo:add` + +**请求参数(Body JSON):** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| zcmc | String | 是 | 政策名称 | +| zclx | String | 否 | 政策类型 | +| zcLevel | String | 否 | 政策级别 | +| sourceUnit | String | 否 | 发文单位 | +| acceptUnit | String | 否 | 受理单位 | +| publishTime | String | 否 | 发文时间(yyyy-MM-dd) | +| zcContent | String | 否 | 政策内容 | +| subsidyStandard | String | 否 | 补贴标准 | +| handleChannel | String | 否 | 经办渠道 | +| applyCondition | String | 否 | 申报条件 | +| fileUrl | String | 否 | 政策文件URL | +| fileName | String | 否 | 政策文件名称 | +| remark | String | 否 | 备注 | + +**请求示例:** + +```json +{ + "zcmc": "就业见习补贴", + "zclx": "就业政策", + "zcLevel": "自治区级", + "sourceUnit": "新疆维吾尔自治区人力资源和社会保障厅", + "acceptUnit": "石河子市人社局", + "publishTime": "2021-09-24", + "zcContent": "支持高校毕业生和失业青年参加就业见习", + "subsidyStandard": "按当地最低工资标准给予见习补贴", + "handleChannel": "石河子市人力资源和社会保障局就业服务窗口", + "applyCondition": "人社部门认定的见习单位", + "fileUrl": "https://example.com/files/policy.pdf", + "fileName": "政策文件.pdf" +} +``` + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +--- + +## 4. 修改政策 + +**接口地址:** `PUT /cms/policyInfo` + +**权限标识:** `cms:policyInfo:edit` + +**请求参数(Body JSON):** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Number | 是 | 政策ID | +| zcmc | String | 否 | 政策名称 | +| zclx | String | 否 | 政策类型 | +| zcLevel | String | 否 | 政策级别 | +| sourceUnit | String | 否 | 发文单位 | +| acceptUnit | String | 否 | 受理单位 | +| publishTime | String | 否 | 发文时间(yyyy-MM-dd) | +| zcContent | String | 否 | 政策内容 | +| subsidyStandard | String | 否 | 补贴标准 | +| handleChannel | String | 否 | 经办渠道 | +| applyCondition | String | 否 | 申报条件 | +| fileUrl | String | 否 | 政策文件URL | +| fileName | String | 否 | 政策文件名称 | +| remark | String | 否 | 备注 | + +**请求示例:** + +```json +{ + "id": 1, + "zcmc": "就业见习补贴(修订版)", + "subsidyStandard": "按当地最低工资标准的120%给予见习补贴" +} +``` + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +--- + +## 5. 删除政策 + +**接口地址:** `DELETE /cms/policyInfo/{ids}` + +**权限标识:** `cms:policyInfo:remove` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| ids | String | 是 | 政策ID,多个用逗号分隔(路径参数) | + +**请求示例:** + +``` +DELETE /cms/policyInfo/1,2,3 +``` + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功" +} +``` + +**说明:** 删除为逻辑删除,将 del_flag 字段置为 '2'。 + +--- + +## 6. 上传政策文件 + +**接口地址:** `POST /cms/policyInfo/upload` + +**权限标识:** `cms:policyInfo:add` + +**Content-Type:** `multipart/form-data` + +**请求参数:** + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| file | File | 是 | 上传的文件 | + +**响应参数:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| code | Number | 状态码,200 表示成功 | +| msg | String | 提示信息 | +| data | Object | 文件信息 | + +**data 字段:** + +| 参数名 | 类型 | 说明 | +|--------|------|------| +| fileUrl | String | 文件访问URL(域名/file/+文件路径) | +| fileName | String | 原始文件名 | +| filePath | String | 文件相对路径 | + +**响应示例:** + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "fileUrl": "https://your-domain.com/file/2026/01/11/abc123def456.pdf", + "fileName": "就业见习补贴政策文件.pdf", + "filePath": "2026/01/11/abc123def456.pdf" + } +} +``` + +**配置说明:** + +在 `application.yml` 中配置上传目录和域名: + +```yaml +policy: + upload: + # 文件上传目录 + path: /data/policy/files + # 访问域名 + domain: https://your-domain.com +``` + +**Nginx配置示例:** + +```nginx +location /file/ { + alias /data/policy/files/; +} +``` diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 5d6ded1..19586f5 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -140,6 +140,14 @@ mybatis-plus: file: upload-dir: /data/file +# 政策文件上传配置 +policy: + upload: + # 文件上传目录 + path: /data/policy/files + # 访问域名(nginx配置的域名) + domain: https://your-domain.com + #微信小程序 wx: appid: wx99193c507b93d6db diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppPolicyInfoController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppPolicyInfoController.java new file mode 100644 index 0000000..8e58b08 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppPolicyInfoController.java @@ -0,0 +1,57 @@ +package com.ruoyi.cms.controller.app; + +import com.ruoyi.cms.domain.policy.PolicyInfo; +import com.ruoyi.cms.domain.policy.PolicyInfoQuery; +import com.ruoyi.cms.service.policy.IPolicyInfoService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 政策信息移动端Controller + * @author kiro + * @date 2026-01-11 + */ +@Slf4j +@RestController +@RequestMapping("/app/policyInfo") +@Api(tags = "移动端接口:政策信息") +public class AppPolicyInfoController extends BaseController { + + @Autowired + private IPolicyInfoService policyInfoService; + + /** + * 获取政策列表 + */ + @ApiOperation("获取政策列表") + @GetMapping("/portalList") + public TableDataInfo portalList(PolicyInfoQuery query) { + return policyInfoService.getPortalList(query); + } + + /** + * 获取政策详情 + */ + @ApiOperation("获取政策详情") + @GetMapping("/detail/{id}") + public AjaxResult detail(@ApiParam("政策ID") @PathVariable Long id) { + PolicyInfo policyInfo = policyInfoService.getDetail(id); + return success(policyInfo); + } + + /** + * 浏览数加1 + */ + @ApiOperation("浏览数加1") + @PostMapping("/addViewNum/{id}") + public AjaxResult addViewNum(@ApiParam("政策ID") @PathVariable Long id) { + return toAjax(policyInfoService.addViewNum(id)); + } +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsPolicyInfoController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsPolicyInfoController.java new file mode 100644 index 0000000..1e5a6d3 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsPolicyInfoController.java @@ -0,0 +1,150 @@ +package com.ruoyi.cms.controller.cms; + +import com.ruoyi.cms.domain.policy.PolicyInfo; +import com.ruoyi.cms.domain.policy.PolicyInfoQuery; +import com.ruoyi.cms.service.policy.IPolicyInfoService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.uuid.IdUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +/** + * 政策信息CMS管理Controller + * @author kiro + * @date 2026-01-11 + */ +@RestController +@RequestMapping("/cms/policyInfo") +@Api(tags = "CMS:政策信息管理") +public class CmsPolicyInfoController extends BaseController { + + @Autowired + private IPolicyInfoService policyInfoService; + + @Value("${policy.upload.path:/data/policy/files}") + private String uploadPath; + + @Value("${policy.upload.domain:}") + private String uploadDomain; + + /** + * 查询政策列表 + */ + @PreAuthorize("@ss.hasPermi('cms:policyInfo:list')") + @ApiOperation("查询政策列表") + @GetMapping("/list") + public TableDataInfo list(PolicyInfoQuery query) { + startPage(); + return getDataTable(policyInfoService.selectList(query)); + } + + /** + * 获取政策详情 + */ + @PreAuthorize("@ss.hasPermi('cms:policyInfo:query')") + @ApiOperation("获取政策详情") + @GetMapping("/{id}") + public AjaxResult getInfo(@PathVariable Long id) { + return success(policyInfoService.selectById(id)); + } + + /** + * 新增政策 + */ + @PreAuthorize("@ss.hasPermi('cms:policyInfo:add')") + @Log(title = "政策信息", businessType = BusinessType.INSERT) + @ApiOperation("新增政策") + @PostMapping + public AjaxResult add(@RequestBody PolicyInfo policyInfo) { + return toAjax(policyInfoService.insert(policyInfo)); + } + + /** + * 修改政策 + */ + @PreAuthorize("@ss.hasPermi('cms:policyInfo:edit')") + @Log(title = "政策信息", businessType = BusinessType.UPDATE) + @ApiOperation("修改政策") + @PutMapping + public AjaxResult edit(@RequestBody PolicyInfo policyInfo) { + return toAjax(policyInfoService.update(policyInfo)); + } + + /** + * 删除政策 + */ + @PreAuthorize("@ss.hasPermi('cms:policyInfo:remove')") + @Log(title = "政策信息", businessType = BusinessType.DELETE) + @ApiOperation("删除政策") + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(policyInfoService.deleteByIds(ids)); + } + + /** + * 上传政策文件 + */ + @PreAuthorize("@ss.hasPermi('cms:policyInfo:add')") + @Log(title = "政策文件上传", businessType = BusinessType.OTHER) + @ApiOperation("上传政策文件") + @PostMapping("/upload") + public AjaxResult uploadFile(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return error("上传文件不能为空"); + } + + try { + // 获取原始文件名 + String originalFilename = file.getOriginalFilename(); + // 获取文件后缀 + String suffix = ""; + if (originalFilename != null && originalFilename.contains(".")) { + suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); + } + + // 生成新文件名:日期目录 + UUID + 后缀 + String dateDir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")); + String newFileName = IdUtils.fastSimpleUUID() + suffix; + + // 创建目录 + File destDir = new File(uploadPath + File.separator + dateDir); + if (!destDir.exists()) { + destDir.mkdirs(); + } + + // 保存文件 + String filePath = dateDir + "/" + newFileName; + File destFile = new File(uploadPath + File.separator + dateDir + File.separator + newFileName); + file.transferTo(destFile); + + // 构建返回URL + String fileUrl = uploadDomain + "/file/" + filePath; + + Map result = new HashMap<>(); + result.put("fileUrl", fileUrl); + result.put("fileName", originalFilename); + result.put("filePath", filePath); + + return success(result); + } catch (IOException e) { + logger.error("文件上传失败", e); + return error("文件上传失败:" + e.getMessage()); + } + } +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/policy/PolicyInfo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/policy/PolicyInfo.java new file mode 100644 index 0000000..c032f67 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/policy/PolicyInfo.java @@ -0,0 +1,66 @@ +package com.ruoyi.cms.domain.policy; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 政策信息对象 + * @author kiro + * @date 2026-01-11 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("政策信息") +public class PolicyInfo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("政策ID") + private Long id; + + @ApiModelProperty("政策名称") + private String zcmc; + + @ApiModelProperty("政策类型") + private String zclx; + + @ApiModelProperty("政策级别") + private String zcLevel; + + @ApiModelProperty("发文单位") + private String sourceUnit; + + @ApiModelProperty("受理单位") + private String acceptUnit; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("发文时间") + private Date publishTime; + + @ApiModelProperty("政策内容") + private String zcContent; + + @ApiModelProperty("补贴标准") + private String subsidyStandard; + + @ApiModelProperty("经办渠道") + private String handleChannel; + + @ApiModelProperty("申报条件") + private String applyCondition; + + @ApiModelProperty("政策文件URL") + private String fileUrl; + + @ApiModelProperty("政策文件名称") + private String fileName; + + @ApiModelProperty("浏览数") + private Integer viewNum; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/policy/PolicyInfoQuery.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/policy/PolicyInfoQuery.java new file mode 100644 index 0000000..6b52116 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/policy/PolicyInfoQuery.java @@ -0,0 +1,24 @@ +package com.ruoyi.cms.domain.policy; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 政策信息查询参数 + * @author kiro + * @date 2026-01-11 + */ +@Data +@ApiModel("政策信息查询参数") +public class PolicyInfoQuery { + + @ApiModelProperty("页码") + private Integer pageNum = 1; + + @ApiModelProperty("每页条数") + private Integer pageSize = 10; + + @ApiModelProperty("政策名称搜索关键词") + private String searchValue; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/policy/PolicyInfoMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/policy/PolicyInfoMapper.java new file mode 100644 index 0000000..3b0fe33 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/policy/PolicyInfoMapper.java @@ -0,0 +1,45 @@ +package com.ruoyi.cms.mapper.policy; + +import com.ruoyi.cms.domain.policy.PolicyInfo; +import com.ruoyi.cms.domain.policy.PolicyInfoQuery; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 政策信息Mapper接口 + * @author kiro + * @date 2026-01-11 + */ +public interface PolicyInfoMapper { + + /** + * 分页查询政策列表 + */ + List selectPolicyInfoList(@Param("query") PolicyInfoQuery query); + + /** + * 根据ID查询政策详情 + */ + PolicyInfo selectPolicyInfoById(@Param("id") Long id); + + /** + * 更新浏览数 + */ + int updateViewNum(@Param("id") Long id); + + /** + * 新增政策 + */ + int insertPolicyInfo(PolicyInfo policyInfo); + + /** + * 修改政策 + */ + int updatePolicyInfo(PolicyInfo policyInfo); + + /** + * 批量删除政策 + */ + int deletePolicyInfoByIds(@Param("ids") Long[] ids); +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/policy/IPolicyInfoService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/policy/IPolicyInfoService.java new file mode 100644 index 0000000..0ae0b9d --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/policy/IPolicyInfoService.java @@ -0,0 +1,57 @@ +package com.ruoyi.cms.service.policy; + +import com.ruoyi.cms.domain.policy.PolicyInfo; +import com.ruoyi.cms.domain.policy.PolicyInfoQuery; +import com.ruoyi.common.core.page.TableDataInfo; + +import java.util.List; + +/** + * 政策信息Service接口 + * @author kiro + * @date 2026-01-11 + */ +public interface IPolicyInfoService { + + /** + * 分页查询政策列表(门户端) + */ + TableDataInfo getPortalList(PolicyInfoQuery query); + + /** + * 获取政策详情 + */ + PolicyInfo getDetail(Long id); + + /** + * 浏览数加1 + */ + int addViewNum(Long id); + + // ========== CMS后台管理接口 ========== + + /** + * 查询政策列表 + */ + List selectList(PolicyInfoQuery query); + + /** + * 根据ID查询政策 + */ + PolicyInfo selectById(Long id); + + /** + * 新增政策 + */ + int insert(PolicyInfo policyInfo); + + /** + * 修改政策 + */ + int update(PolicyInfo policyInfo); + + /** + * 批量删除政策 + */ + int deleteByIds(Long[] ids); +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/policy/impl/PolicyInfoServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/policy/impl/PolicyInfoServiceImpl.java new file mode 100644 index 0000000..08346c2 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/policy/impl/PolicyInfoServiceImpl.java @@ -0,0 +1,87 @@ +package com.ruoyi.cms.service.policy.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ruoyi.cms.domain.policy.PolicyInfo; +import com.ruoyi.cms.domain.policy.PolicyInfoQuery; +import com.ruoyi.cms.mapper.policy.PolicyInfoMapper; +import com.ruoyi.cms.service.policy.IPolicyInfoService; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.SecurityUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 政策信息Service实现 + * @author kiro + * @date 2026-01-11 + */ +@Slf4j +@Service +public class PolicyInfoServiceImpl implements IPolicyInfoService { + + @Autowired + private PolicyInfoMapper policyInfoMapper; + + @Override + public TableDataInfo getPortalList(PolicyInfoQuery query) { + PageHelper.startPage(query.getPageNum(), query.getPageSize()); + List list = policyInfoMapper.selectPolicyInfoList(query); + PageInfo pageInfo = new PageInfo<>(list); + + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(200); + rspData.setMsg("操作成功"); + rspData.setRows(list); + rspData.setTotal(pageInfo.getTotal()); + return rspData; + } + + @Override + public PolicyInfo getDetail(Long id) { + return policyInfoMapper.selectPolicyInfoById(id); + } + + @Override + public int addViewNum(Long id) { + return policyInfoMapper.updateViewNum(id); + } + + // ========== CMS后台管理接口实现 ========== + + @Override + public List selectList(PolicyInfoQuery query) { + return policyInfoMapper.selectPolicyInfoList(query); + } + + @Override + public PolicyInfo selectById(Long id) { + return policyInfoMapper.selectPolicyInfoById(id); + } + + @Override + public int insert(PolicyInfo policyInfo) { + policyInfo.setCreateBy(SecurityUtils.getUsername()); + policyInfo.setCreateTime(String.valueOf(new Date())); + if (policyInfo.getViewNum() == null) { + policyInfo.setViewNum(0); + } + return policyInfoMapper.insertPolicyInfo(policyInfo); + } + + @Override + public int update(PolicyInfo policyInfo) { + policyInfo.setUpdateBy(SecurityUtils.getUsername()); + policyInfo.setUpdateTime(String.valueOf(new Date())); + return policyInfoMapper.updatePolicyInfo(policyInfo); + } + + @Override + public int deleteByIds(Long[] ids) { + return policyInfoMapper.deletePolicyInfoByIds(ids); + } +} diff --git a/ruoyi-bussiness/src/main/resources/mapper/policy/PolicyInfoMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/policy/PolicyInfoMapper.xml new file mode 100644 index 0000000..81c5992 --- /dev/null +++ b/ruoyi-bussiness/src/main/resources/mapper/policy/PolicyInfoMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, zcmc, zclx, zc_level, source_unit, accept_unit, publish_time, view_num, create_time + from policy_info + + + + select id, zcmc, zclx, zc_level, source_unit, accept_unit, publish_time, + zc_content, subsidy_standard, handle_channel, apply_condition, + file_url, file_name, view_num, create_by, create_time, update_by, update_time, remark + from policy_info + + + + + + + + update policy_info set view_num = view_num + 1 where id = #{id} + + + + insert into policy_info ( + zcmc, zclx, zc_level, source_unit, accept_unit, publish_time, + zc_content, subsidy_standard, handle_channel, apply_condition, + file_url, file_name, view_num, create_by, create_time, del_flag, remark + ) values ( + #{zcmc}, #{zclx}, #{zcLevel}, #{sourceUnit}, #{acceptUnit}, #{publishTime}, + #{zcContent}, #{subsidyStandard}, #{handleChannel}, #{applyCondition}, + #{fileUrl}, #{fileName}, #{viewNum}, #{createBy}, now(), '0', #{remark} + ) + + + + update policy_info + + zcmc = #{zcmc}, + zclx = #{zclx}, + zc_level = #{zcLevel}, + source_unit = #{sourceUnit}, + accept_unit = #{acceptUnit}, + publish_time = #{publishTime}, + zc_content = #{zcContent}, + subsidy_standard = #{subsidyStandard}, + handle_channel = #{handleChannel}, + apply_condition = #{applyCondition}, + file_url = #{fileUrl}, + file_name = #{fileName}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = now() + + where id = #{id} + + + + update policy_info set del_flag = '2' + where id in + + #{id} + + + + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 0c649f3..b5f096e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -119,6 +119,8 @@ public class SecurityConfig // 移动端公用查询,可匿名访问 .antMatchers("/app/common/**").permitAll() .antMatchers("/app/**").permitAll() + // 门户端公开接口,可匿名访问 + .antMatchers("/portal/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() //放行前端界面 .antMatchers("/kashi/job-portal/detail/**").permitAll() diff --git a/sql/policy_info.sql b/sql/policy_info.sql new file mode 100644 index 0000000..2d03ff7 --- /dev/null +++ b/sql/policy_info.sql @@ -0,0 +1,53 @@ +-- 政策信息表(瀚高/PostgreSQL) +CREATE TABLE policy_info ( + id BIGSERIAL PRIMARY KEY, + zcmc VARCHAR(500) NOT NULL, + zclx VARCHAR(100), + zc_level VARCHAR(50), + source_unit VARCHAR(200), + accept_unit VARCHAR(200), + publish_time TIMESTAMP, + zc_content TEXT, + subsidy_standard TEXT, + handle_channel TEXT, + apply_condition TEXT, + file_url VARCHAR(500), + file_name VARCHAR(200), + view_num INT DEFAULT 0, + create_by VARCHAR(64) DEFAULT '', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_by VARCHAR(64) DEFAULT '', + update_time TIMESTAMP, + del_flag CHAR(1) DEFAULT '0', + remark VARCHAR(500) DEFAULT '' +); + +-- 表注释 +COMMENT ON TABLE policy_info IS '政策信息表'; + +-- 字段注释 +COMMENT ON COLUMN policy_info.id IS '政策ID'; +COMMENT ON COLUMN policy_info.zcmc IS '政策名称'; +COMMENT ON COLUMN policy_info.zclx IS '政策类型'; +COMMENT ON COLUMN policy_info.zc_level IS '政策级别'; +COMMENT ON COLUMN policy_info.source_unit IS '发文单位'; +COMMENT ON COLUMN policy_info.accept_unit IS '受理单位'; +COMMENT ON COLUMN policy_info.publish_time IS '发文时间'; +COMMENT ON COLUMN policy_info.zc_content IS '政策内容'; +COMMENT ON COLUMN policy_info.subsidy_standard IS '补贴标准'; +COMMENT ON COLUMN policy_info.handle_channel IS '经办渠道'; +COMMENT ON COLUMN policy_info.apply_condition IS '申报条件'; +COMMENT ON COLUMN policy_info.file_url IS '政策文件URL'; +COMMENT ON COLUMN policy_info.file_name IS '政策文件名称'; +COMMENT ON COLUMN policy_info.view_num IS '浏览数'; +COMMENT ON COLUMN policy_info.create_by IS '创建者'; +COMMENT ON COLUMN policy_info.create_time IS '创建时间'; +COMMENT ON COLUMN policy_info.update_by IS '更新者'; +COMMENT ON COLUMN policy_info.update_time IS '更新时间'; +COMMENT ON COLUMN policy_info.del_flag IS '删除标志(0代表存在 2代表删除)'; +COMMENT ON COLUMN policy_info.remark IS '备注'; + +-- 创建索引 +CREATE INDEX idx_policy_info_zcmc ON policy_info(zcmc); +CREATE INDEX idx_policy_info_zclx ON policy_info(zclx); +CREATE INDEX idx_policy_info_del_flag ON policy_info(del_flag); diff --git a/sql/policy_info_data.sql b/sql/policy_info_data.sql new file mode 100644 index 0000000..5ea440a --- /dev/null +++ b/sql/policy_info_data.sql @@ -0,0 +1,15 @@ +-- 政策信息测试数据(石河子) +INSERT INTO policy_info (zcmc, zclx, zc_level, source_unit, zc_content, view_num, create_by, create_time, del_flag) VALUES +('石河子市高层次人才引进政策', '人才政策', '市级', '石河子市人力资源和社会保障局', '为吸引高层次人才来石河子发展,对符合条件的人才给予安家费、住房补贴、生活补贴等优惠政策。', 1234, 'admin', '2025-01-10 10:00:00', '0'); + +INSERT INTO policy_info (zcmc, zclx, zc_level, source_unit, zc_content, view_num, create_by, create_time, del_flag) VALUES +('新疆生产建设兵团创业扶持政策', '创业政策', '兵团级', '新疆生产建设兵团人力资源和社会保障局', '对符合条件的创业者提供创业担保贷款、创业补贴、场地租金减免等扶持措施,支持兵团职工自主创业。', 856, 'admin', '2025-01-08 14:30:00', '0'); + +INSERT INTO policy_info (zcmc, zclx, zc_level, source_unit, zc_content, view_num, create_by, create_time, del_flag) VALUES +('石河子大学毕业生就业补贴政策', '就业政策', '市级', '石河子市就业服务中心', '对石河子大学应届毕业生到本地中小微企业就业的,给予一次性就业补贴和社保补贴,鼓励毕业生留疆就业。', 2156, 'admin', '2025-01-05 09:15:00', '0'); + +INSERT INTO policy_info (zcmc, zclx, zc_level, source_unit, zc_content, view_num, create_by, create_time, del_flag) VALUES +('第八师石河子市技能人才培养激励政策', '培训政策', '师市级', '第八师石河子市人社局', '鼓励企业开展职业技能培训,对取得职业资格证书的人员给予培训补贴和技能提升补贴,助力兵团技能人才队伍建设。', 3421, 'admin', '2025-01-03 16:45:00', '0'); + +INSERT INTO policy_info (zcmc, zclx, zc_level, source_unit, zc_content, view_num, create_by, create_time, del_flag) VALUES +('石河子市灵活就业人员社保补贴政策', '社保政策', '市级', '石河子市社会保险事业中心', '对就业困难人员和离校2年内未就业高校毕业生灵活就业后缴纳社会保险费的,给予社保补贴,减轻灵活就业人员负担。', 1678, 'admin', '2025-01-01 11:20:00', '0');