diff --git a/pom.xml b/pom.xml index cdeb9ec..c665721 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ yudao-module-mall yudao-module-crm yudao-module-erp + yudao-module-portal diff --git a/yudao-module-portal/pom.xml b/yudao-module-portal/pom.xml new file mode 100644 index 0000000..6ba7284 --- /dev/null +++ b/yudao-module-portal/pom.xml @@ -0,0 +1,24 @@ + + + + cn.iocoder.boot + yudao + ${revision} + + 4.0.0 + + yudao-module-portal-api + yudao-module-portal-biz + + yudao-module-portal + pom + + ${project.artifactId} + + portal 模块,我们放门户网站业务。 + 例如说:各大品牌官网 + + + diff --git a/yudao-module-portal/sql/1.sql b/yudao-module-portal/sql/1.sql new file mode 100644 index 0000000..a1d5c37 --- /dev/null +++ b/yudao-module-portal/sql/1.sql @@ -0,0 +1,55 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '职位管理', '', 2, 0, ${table.parentMenuId}, + 'job-post', '', 'portal/jobpost/index', 0, 'JobPost' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位查询', 'portal:job-post:query', 3, 1, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位创建', 'portal:job-post:create', 3, 2, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位更新', 'portal:job-post:update', 3, 3, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位删除', 'portal:job-post:delete', 3, 4, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位导出', 'portal:job-post:export', 3, 5, @parentId, + '', '', '', 0 +); \ No newline at end of file diff --git a/yudao-module-portal/sql/2.sql b/yudao-module-portal/sql/2.sql new file mode 100644 index 0000000..ed34702 --- /dev/null +++ b/yudao-module-portal/sql/2.sql @@ -0,0 +1,55 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '新闻管理', '', 2, 0, ${table.parentMenuId}, + 'news', '', 'portal/news/index', 0, 'News' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻查询', 'portal:news:query', 3, 1, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻创建', 'portal:news:create', 3, 2, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻更新', 'portal:news:update', 3, 3, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻删除', 'portal:news:delete', 3, 4, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻导出', 'portal:news:export', 3, 5, @parentId, + '', '', '', 0 +); \ No newline at end of file diff --git a/yudao-module-portal/sql/3.sql b/yudao-module-portal/sql/3.sql new file mode 100644 index 0000000..423b033 --- /dev/null +++ b/yudao-module-portal/sql/3.sql @@ -0,0 +1,55 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '新闻类型管理', '', 2, 0, ${table.parentMenuId}, + 'news-type', '', 'portal/newstype/index', 0, 'NewsType' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻类型查询', 'portal:news-type:query', 3, 1, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻类型创建', 'portal:news-type:create', 3, 2, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻类型更新', 'portal:news-type:update', 3, 3, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻类型删除', 'portal:news-type:delete', 3, 4, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '新闻类型导出', 'portal:news-type:export', 3, 5, @parentId, + '', '', '', 0 +); \ No newline at end of file diff --git a/yudao-module-portal/sql/4.sql b/yudao-module-portal/sql/4.sql new file mode 100644 index 0000000..7ce87b5 --- /dev/null +++ b/yudao-module-portal/sql/4.sql @@ -0,0 +1,55 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '用户管理', '', 2, 0, ${table.parentMenuId}, + 'user', '', 'portal/user/index', 0, 'User' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '用户查询', 'portal:user:query', 3, 1, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '用户创建', 'portal:user:create', 3, 2, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '用户更新', 'portal:user:update', 3, 3, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '用户删除', 'portal:user:delete', 3, 4, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '用户导出', 'portal:user:export', 3, 5, @parentId, + '', '', '', 0 +); \ No newline at end of file diff --git a/yudao-module-portal/sql/5.sql b/yudao-module-portal/sql/5.sql new file mode 100644 index 0000000..6fcaef9 --- /dev/null +++ b/yudao-module-portal/sql/5.sql @@ -0,0 +1,55 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '职位类别管理', '', 2, 0, ${table.parentMenuId}, + 'job-category', '', 'portal/jobcategory/index', 0, 'JobCategory' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位类别查询', 'portal:job-category:query', 3, 1, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位类别创建', 'portal:job-category:create', 3, 2, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位类别更新', 'portal:job-category:update', 3, 3, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位类别删除', 'portal:job-category:delete', 3, 4, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '职位类别导出', 'portal:job-category:export', 3, 5, @parentId, + '', '', '', 0 +); \ No newline at end of file diff --git a/yudao-module-portal/sql/6.sql b/yudao-module-portal/sql/6.sql new file mode 100644 index 0000000..d3705c0 --- /dev/null +++ b/yudao-module-portal/sql/6.sql @@ -0,0 +1,55 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status, component_name +) +VALUES ( + '城市管理', '', 2, 0, ${table.parentMenuId}, + 'city', '', 'portal/city/index', 0, 'City' +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '城市查询', 'portal:city:query', 3, 1, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '城市创建', 'portal:city:create', 3, 2, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '城市更新', 'portal:city:update', 3, 3, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '城市删除', 'portal:city:delete', 3, 4, @parentId, + '', '', '', 0 +); +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '城市导出', 'portal:city:export', 3, 5, @parentId, + '', '', '', 0 +); \ No newline at end of file diff --git a/yudao-module-portal/sql/portal.sql b/yudao-module-portal/sql/portal.sql new file mode 100644 index 0000000..a3a9a30 --- /dev/null +++ b/yudao-module-portal/sql/portal.sql @@ -0,0 +1,99 @@ +-- 用户表 +CREATE TABLE `portal_user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `username` varchar(50) NOT NULL COMMENT '用户名', + `password` varchar(100) NOT NULL COMMENT '密码', + `token` varchar(100) DEFAULT NULL COMMENT '登录token', + `creator` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '创建者', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '更新者', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' NOT NULL COMMENT '是否删除', + `tenant_id` bigint(20) DEFAULT 0 NOT NULL COMMENT '租户编号', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_username` (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; + +-- 职位表 +CREATE TABLE `portal_job_post` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `title` varchar(100) NOT NULL COMMENT '职位标题', + `description` text COMMENT '职位描述', + `requirement` text COMMENT '职位要求', + `city_id` bigint(20) NOT NULL COMMENT '城市ID', + `job_category_id` bigint(20) NOT NULL COMMENT '职位类别ID', + `publish_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间', + `creator` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '创建者', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '更新者', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' NOT NULL COMMENT '是否删除', + `tenant_id` bigint(20) DEFAULT 0 NOT NULL COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_city` (`city_id`), + KEY `idx_category` (`job_category_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='职位表'; + +-- 城市表 +CREATE TABLE `portal_city` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(50) NOT NULL COMMENT '城市名称', + `code` varchar(20) NOT NULL COMMENT '城市编码', + `creator` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '创建者', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '更新者', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' NOT NULL COMMENT '是否删除', + `tenant_id` bigint(20) DEFAULT 0 NOT NULL COMMENT '租户编号', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='城市表'; + +-- 职位类别表 +CREATE TABLE `portal_job_category` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(50) NOT NULL COMMENT '类别名称', + `parent_id` bigint(20) DEFAULT NULL COMMENT '父类别ID', + `creator` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '创建者', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '更新者', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' NOT NULL COMMENT '是否删除', + `tenant_id` bigint(20) DEFAULT 0 NOT NULL COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_parent` (`parent_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='职位类别表'; + +-- 新闻表 +CREATE TABLE `portal_news` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `news_title` varchar(200) NOT NULL COMMENT '新闻标题', + `news_desc` varchar(500) DEFAULT NULL COMMENT '新闻描述', + `news_content` text NOT NULL COMMENT '新闻内容', + `news_path` varchar(100) NOT NULL COMMENT '新闻路径', + `cover_img` varchar(255) DEFAULT NULL COMMENT '封面图片', + `news_type_id` bigint(20) NOT NULL COMMENT '新闻类型ID', + `publish_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间', + `creator` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '创建者', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '更新者', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' NOT NULL COMMENT '是否删除', + `tenant_id` bigint(20) DEFAULT 0 NOT NULL COMMENT '租户编号', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_path` (`news_path`), + KEY `idx_type` (`news_type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='新闻表'; + +-- 新闻类型表 +CREATE TABLE `portal_news_type` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `type_name` varchar(50) NOT NULL COMMENT '类型名称', + `creator` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '创建者', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', + `updater` varchar(64) COLLATE utf8mb4_bin DEFAULT '' NULL COMMENT '更新者', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) DEFAULT b'0' NOT NULL COMMENT '是否删除', + `tenant_id` bigint(20) DEFAULT 0 NOT NULL COMMENT '租户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='新闻类型表'; \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-api/pom.xml b/yudao-module-portal/yudao-module-portal-api/pom.xml new file mode 100644 index 0000000..7577044 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-api/pom.xml @@ -0,0 +1,33 @@ + + + + cn.iocoder.boot + yudao-module-portal + ${revision} + + 4.0.0 + yudao-module-portal-api + jar + + ${project.artifactId} + + portal 模块 API,暴露给其它模块调用 + + + + + cn.iocoder.boot + yudao-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/yudao-module-portal/yudao-module-portal-api/src/main/java/cn/iocoder/yudao/module/portal/enums/ErrorCodeConstants.java b/yudao-module-portal/yudao-module-portal-api/src/main/java/cn/iocoder/yudao/module/portal/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..e5c0f48 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-api/src/main/java/cn/iocoder/yudao/module/portal/enums/ErrorCodeConstants.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.portal.enums; + +import cn.iocoder.yudao.framework.common.exception.ErrorCode; + +/** + * Report 错误码枚举类 + * + * report 系统,使用 1-003-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== portal 模块 1_012_000_000 ========== + ErrorCode JOB_POST_NOT_EXISTS = new ErrorCode(1_012_000_000, "职位不存在"); + ErrorCode NEWS_NOT_EXISTS = new ErrorCode(1_012_000_000, "新闻不存在"); + ErrorCode NEWS_TYPE_NOT_EXISTS = new ErrorCode( 1_012_000_000, "新闻类型不存在"); + ErrorCode USER_NOT_EXISTS = new ErrorCode( 1_012_000_000, "用户不存在"); + ErrorCode JOB_CATEGORY_NOT_EXISTS = new ErrorCode( 1_012_000_000, "职位类别不存在"); + ErrorCode CITY_NOT_EXISTS = new ErrorCode( 1_012_000_000, "城市不存在"); + +} diff --git a/yudao-module-portal/yudao-module-portal-api/src/main/java/package-info.java b/yudao-module-portal/yudao-module-portal-api/src/main/java/package-info.java new file mode 100644 index 0000000..6e0d77c --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-api/src/main/java/package-info.java @@ -0,0 +1,3 @@ +/** + * 占位,避免 api 目录无文件时,git 无法提交 + */ diff --git a/yudao-module-portal/yudao-module-portal-biz/pom.xml b/yudao-module-portal/yudao-module-portal-biz/pom.xml new file mode 100644 index 0000000..d232a7d --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/pom.xml @@ -0,0 +1,61 @@ + + + + cn.iocoder.boot + yudao-module-portal + ${revision} + + 4.0.0 + yudao-module-portal-biz + jar + + ${project.artifactId} + + portal 模块,我们放门户网站业务。 + 例如说:品牌官网 + + + + + cn.iocoder.boot + yudao-module-portal-api + ${revision} + + + cn.iocoder.boot + yudao-module-system-api + ${revision} + + + cn.iocoder.boot + yudao-module-infra-api + ${revision} + + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-tenant + + + + + cn.iocoder.boot + yudao-spring-boot-starter-mq + + + + cn.iocoder.boot + yudao-spring-boot-starter-excel + + + + cn.iocoder.boot + yudao-spring-boot-starter-biz-ip + + + + + diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/CityController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/CityController.java new file mode 100644 index 0000000..0ac28f7 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/CityController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.portal.controller.admin.city; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.portal.controller.admin.city.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.city.CityDO; +import cn.iocoder.yudao.module.portal.service.city.CityService; + +@Tag(name = "管理后台 - 城市") +@RestController +@RequestMapping("/portal/city") +@Validated +public class CityController { + + @Resource + private CityService cityService; + + @PostMapping("/create") + @Operation(summary = "创建城市") + @PreAuthorize("@ss.hasPermission('portal:city:create')") + public CommonResult createCity(@Valid @RequestBody CitySaveReqVO createReqVO) { + return success(cityService.createCity(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新城市") + @PreAuthorize("@ss.hasPermission('portal:city:update')") + public CommonResult updateCity(@Valid @RequestBody CitySaveReqVO updateReqVO) { + cityService.updateCity(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除城市") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('portal:city:delete')") + public CommonResult deleteCity(@RequestParam("id") Long id) { + cityService.deleteCity(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得城市") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('portal:city:query')") + public CommonResult getCity(@RequestParam("id") Long id) { + CityDO city = cityService.getCity(id); + return success(BeanUtils.toBean(city, CityRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得城市分页") + @PreAuthorize("@ss.hasPermission('portal:city:query')") + public CommonResult> getCityPage(@Valid CityPageReqVO pageReqVO) { + PageResult pageResult = cityService.getCityPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, CityRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出城市 Excel") + @PreAuthorize("@ss.hasPermission('portal:city:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportCityExcel(@Valid CityPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = cityService.getCityPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "城市.xls", "数据", CityRespVO.class, + BeanUtils.toBean(list, CityRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CityPageReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CityPageReqVO.java new file mode 100644 index 0000000..e393f15 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CityPageReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.portal.controller.admin.city.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 城市分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CityPageReqVO extends PageParam { + + @Schema(description = "城市名称", example = "芋艿") + private String name; + + @Schema(description = "城市编码") + private String code; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CityRespVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CityRespVO.java new file mode 100644 index 0000000..cfb6c7a --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CityRespVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.portal.controller.admin.city.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 城市 Response VO") +@Data +@ExcelIgnoreUnannotated +public class CityRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7162") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "城市名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("城市名称") + private String name; + + @Schema(description = "城市编码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("城市编码") + private String code; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CitySaveReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CitySaveReqVO.java new file mode 100644 index 0000000..8eea8f5 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/city/vo/CitySaveReqVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.portal.controller.admin.city.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 城市新增/修改 Request VO") +@Data +public class CitySaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7162") + private Long id; + + @Schema(description = "城市名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "城市名称不能为空") + private String name; + + @Schema(description = "城市编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "城市编码不能为空") + private String code; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/JobCategoryController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/JobCategoryController.java new file mode 100644 index 0000000..e804085 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/JobCategoryController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobcategory; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobcategory.JobCategoryDO; +import cn.iocoder.yudao.module.portal.service.jobcategory.JobCategoryService; + +@Tag(name = "管理后台 - 职位类别") +@RestController +@RequestMapping("/portal/job-category") +@Validated +public class JobCategoryController { + + @Resource + private JobCategoryService jobCategoryService; + + @PostMapping("/create") + @Operation(summary = "创建职位类别") + @PreAuthorize("@ss.hasPermission('portal:job-category:create')") + public CommonResult createJobCategory(@Valid @RequestBody JobCategorySaveReqVO createReqVO) { + return success(jobCategoryService.createJobCategory(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新职位类别") + @PreAuthorize("@ss.hasPermission('portal:job-category:update')") + public CommonResult updateJobCategory(@Valid @RequestBody JobCategorySaveReqVO updateReqVO) { + jobCategoryService.updateJobCategory(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除职位类别") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('portal:job-category:delete')") + public CommonResult deleteJobCategory(@RequestParam("id") Long id) { + jobCategoryService.deleteJobCategory(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得职位类别") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('portal:job-category:query')") + public CommonResult getJobCategory(@RequestParam("id") Long id) { + JobCategoryDO jobCategory = jobCategoryService.getJobCategory(id); + return success(BeanUtils.toBean(jobCategory, JobCategoryRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得职位类别分页") + @PreAuthorize("@ss.hasPermission('portal:job-category:query')") + public CommonResult> getJobCategoryPage(@Valid JobCategoryPageReqVO pageReqVO) { + PageResult pageResult = jobCategoryService.getJobCategoryPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, JobCategoryRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出职位类别 Excel") + @PreAuthorize("@ss.hasPermission('portal:job-category:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportJobCategoryExcel(@Valid JobCategoryPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = jobCategoryService.getJobCategoryPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "职位类别.xls", "数据", JobCategoryRespVO.class, + BeanUtils.toBean(list, JobCategoryRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategoryPageReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategoryPageReqVO.java new file mode 100644 index 0000000..7d0d407 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategoryPageReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 职位类别分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobCategoryPageReqVO extends PageParam { + + @Schema(description = "类别名称", example = "赵六") + private String name; + + @Schema(description = "父类别ID", example = "8012") + private Long parentId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategoryRespVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategoryRespVO.java new file mode 100644 index 0000000..0fb4b1a --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategoryRespVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 职位类别 Response VO") +@Data +@ExcelIgnoreUnannotated +public class JobCategoryRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12274") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "类别名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("类别名称") + private String name; + + @Schema(description = "父类别ID", example = "8012") + @ExcelProperty("父类别ID") + private Long parentId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategorySaveReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategorySaveReqVO.java new file mode 100644 index 0000000..994207c --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobcategory/vo/JobCategorySaveReqVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 职位类别新增/修改 Request VO") +@Data +public class JobCategorySaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12274") + private Long id; + + @Schema(description = "类别名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotEmpty(message = "类别名称不能为空") + private String name; + + @Schema(description = "父类别ID", example = "8012") + private Long parentId; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/JobPostController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/JobPostController.java new file mode 100644 index 0000000..9091004 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/JobPostController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobpost; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobpost.JobPostDO; +import cn.iocoder.yudao.module.portal.service.jobpost.JobPostService; + +@Tag(name = "管理后台 - 职位") +@RestController +@RequestMapping("/portal/job-post") +@Validated +public class JobPostController { + + @Resource + private JobPostService jobPostService; + + @PostMapping("/create") + @Operation(summary = "创建职位") + @PreAuthorize("@ss.hasPermission('portal:job-post:create')") + public CommonResult createJobPost(@Valid @RequestBody JobPostSaveReqVO createReqVO) { + return success(jobPostService.createJobPost(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新职位") + @PreAuthorize("@ss.hasPermission('portal:job-post:update')") + public CommonResult updateJobPost(@Valid @RequestBody JobPostSaveReqVO updateReqVO) { + jobPostService.updateJobPost(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除职位") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('portal:job-post:delete')") + public CommonResult deleteJobPost(@RequestParam("id") Long id) { + jobPostService.deleteJobPost(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得职位") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('portal:job-post:query')") + public CommonResult getJobPost(@RequestParam("id") Long id) { + JobPostDO jobPost = jobPostService.getJobPost(id); + return success(BeanUtils.toBean(jobPost, JobPostRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得职位分页") + @PreAuthorize("@ss.hasPermission('portal:job-post:query')") + public CommonResult> getJobPostPage(@Valid JobPostPageReqVO pageReqVO) { + PageResult pageResult = jobPostService.getJobPostPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, JobPostRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出职位 Excel") + @PreAuthorize("@ss.hasPermission('portal:job-post:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportJobPostExcel(@Valid JobPostPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = jobPostService.getJobPostPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "职位.xls", "数据", JobPostRespVO.class, + BeanUtils.toBean(list, JobPostRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostPageReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostPageReqVO.java new file mode 100644 index 0000000..aee73f5 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostPageReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 职位分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobPostPageReqVO extends PageParam { + + @Schema(description = "职位标题") + private String title; + + @Schema(description = "职位描述", example = "随便") + private String description; + + @Schema(description = "职位要求") + private String requirement; + + @Schema(description = "城市ID", example = "12580") + private Long cityId; + + @Schema(description = "职位类别ID", example = "7839") + private Long jobCategoryId; + + @Schema(description = "发布时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] publishTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostRespVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostRespVO.java new file mode 100644 index 0000000..1e09666 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostRespVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 职位 Response VO") +@Data +@ExcelIgnoreUnannotated +public class JobPostRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15137") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "职位标题", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("职位标题") + private String title; + + @Schema(description = "职位描述", example = "随便") + @ExcelProperty("职位描述") + private String description; + + @Schema(description = "职位要求") + @ExcelProperty("职位要求") + private String requirement; + + @Schema(description = "城市ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12580") + @ExcelProperty("城市ID") + private Long cityId; + + @Schema(description = "职位类别ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7839") + @ExcelProperty("职位类别ID") + private Long jobCategoryId; + + @Schema(description = "发布时间") + @ExcelProperty("发布时间") + private LocalDateTime publishTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostSaveReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostSaveReqVO.java new file mode 100644 index 0000000..6b2f6ee --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/jobpost/vo/JobPostSaveReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 职位新增/修改 Request VO") +@Data +public class JobPostSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15137") + private Long id; + + @Schema(description = "职位标题", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "职位标题不能为空") + private String title; + + @Schema(description = "职位描述", example = "随便") + private String description; + + @Schema(description = "职位要求") + private String requirement; + + @Schema(description = "城市ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12580") + @NotNull(message = "城市ID不能为空") + private Long cityId; + + @Schema(description = "职位类别ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7839") + @NotNull(message = "职位类别ID不能为空") + private Long jobCategoryId; + + @Schema(description = "发布时间") + private LocalDateTime publishTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/NewsController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/NewsController.java new file mode 100644 index 0000000..36b187a --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/NewsController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.portal.controller.admin.news; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.portal.controller.admin.news.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.news.NewsDO; +import cn.iocoder.yudao.module.portal.service.news.NewsService; + +@Tag(name = "管理后台 - 新闻") +@RestController +@RequestMapping("/portal/news") +@Validated +public class NewsController { + + @Resource + private NewsService newsService; + + @PostMapping("/create") + @Operation(summary = "创建新闻") + @PreAuthorize("@ss.hasPermission('portal:news:create')") + public CommonResult createNews(@Valid @RequestBody NewsSaveReqVO createReqVO) { + return success(newsService.createNews(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新新闻") + @PreAuthorize("@ss.hasPermission('portal:news:update')") + public CommonResult updateNews(@Valid @RequestBody NewsSaveReqVO updateReqVO) { + newsService.updateNews(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除新闻") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('portal:news:delete')") + public CommonResult deleteNews(@RequestParam("id") Long id) { + newsService.deleteNews(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得新闻") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('portal:news:query')") + public CommonResult getNews(@RequestParam("id") Long id) { + NewsDO news = newsService.getNews(id); + return success(BeanUtils.toBean(news, NewsRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得新闻分页") + @PreAuthorize("@ss.hasPermission('portal:news:query')") + public CommonResult> getNewsPage(@Valid NewsPageReqVO pageReqVO) { + PageResult pageResult = newsService.getNewsPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, NewsRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出新闻 Excel") + @PreAuthorize("@ss.hasPermission('portal:news:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportNewsExcel(@Valid NewsPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = newsService.getNewsPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "新闻.xls", "数据", NewsRespVO.class, + BeanUtils.toBean(list, NewsRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsPageReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsPageReqVO.java new file mode 100644 index 0000000..0c6ba27 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsPageReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.portal.controller.admin.news.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 新闻分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NewsPageReqVO extends PageParam { + + @Schema(description = "新闻标题") + private String newsTitle; + + @Schema(description = "新闻描述") + private String newsDesc; + + @Schema(description = "新闻内容") + private String newsContent; + + @Schema(description = "新闻路径") + private String newsPath; + + @Schema(description = "封面图片") + private String coverImg; + + @Schema(description = "新闻类型ID", example = "23155") + private Long newsTypeId; + + @Schema(description = "发布时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] publishTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsRespVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsRespVO.java new file mode 100644 index 0000000..d7b76e7 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsRespVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.portal.controller.admin.news.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 新闻 Response VO") +@Data +@ExcelIgnoreUnannotated +public class NewsRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7907") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "新闻标题", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("新闻标题") + private String newsTitle; + + @Schema(description = "新闻描述") + @ExcelProperty("新闻描述") + private String newsDesc; + + @Schema(description = "新闻内容", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("新闻内容") + private String newsContent; + + @Schema(description = "新闻路径", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("新闻路径") + private String newsPath; + + @Schema(description = "封面图片") + @ExcelProperty("封面图片") + private String coverImg; + + @Schema(description = "新闻类型ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23155") + @ExcelProperty("新闻类型ID") + private Long newsTypeId; + + @Schema(description = "发布时间") + @ExcelProperty("发布时间") + private LocalDateTime publishTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsSaveReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsSaveReqVO.java new file mode 100644 index 0000000..ecefdfd --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/news/vo/NewsSaveReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.portal.controller.admin.news.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 新闻新增/修改 Request VO") +@Data +public class NewsSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7907") + private Long id; + + @Schema(description = "新闻标题", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "新闻标题不能为空") + private String newsTitle; + + @Schema(description = "新闻描述") + private String newsDesc; + + @Schema(description = "新闻内容", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "新闻内容不能为空") + private String newsContent; + + @Schema(description = "新闻路径", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "新闻路径不能为空") + private String newsPath; + + @Schema(description = "封面图片") + private String coverImg; + + @Schema(description = "新闻类型ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23155") + @NotNull(message = "新闻类型ID不能为空") + private Long newsTypeId; + + @Schema(description = "发布时间") + private LocalDateTime publishTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/NewsTypeController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/NewsTypeController.java new file mode 100644 index 0000000..3a62a74 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/NewsTypeController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.portal.controller.admin.newstype; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.portal.controller.admin.newstype.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.newstype.NewsTypeDO; +import cn.iocoder.yudao.module.portal.service.newstype.NewsTypeService; + +@Tag(name = "管理后台 - 新闻类型") +@RestController +@RequestMapping("/portal/news-type") +@Validated +public class NewsTypeController { + + @Resource + private NewsTypeService newsTypeService; + + @PostMapping("/create") + @Operation(summary = "创建新闻类型") + @PreAuthorize("@ss.hasPermission('portal:news-type:create')") + public CommonResult createNewsType(@Valid @RequestBody NewsTypeSaveReqVO createReqVO) { + return success(newsTypeService.createNewsType(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新新闻类型") + @PreAuthorize("@ss.hasPermission('portal:news-type:update')") + public CommonResult updateNewsType(@Valid @RequestBody NewsTypeSaveReqVO updateReqVO) { + newsTypeService.updateNewsType(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除新闻类型") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('portal:news-type:delete')") + public CommonResult deleteNewsType(@RequestParam("id") Long id) { + newsTypeService.deleteNewsType(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得新闻类型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('portal:news-type:query')") + public CommonResult getNewsType(@RequestParam("id") Long id) { + NewsTypeDO newsType = newsTypeService.getNewsType(id); + return success(BeanUtils.toBean(newsType, NewsTypeRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得新闻类型分页") + @PreAuthorize("@ss.hasPermission('portal:news-type:query')") + public CommonResult> getNewsTypePage(@Valid NewsTypePageReqVO pageReqVO) { + PageResult pageResult = newsTypeService.getNewsTypePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, NewsTypeRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出新闻类型 Excel") + @PreAuthorize("@ss.hasPermission('portal:news-type:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportNewsTypeExcel(@Valid NewsTypePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = newsTypeService.getNewsTypePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "新闻类型.xls", "数据", NewsTypeRespVO.class, + BeanUtils.toBean(list, NewsTypeRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypePageReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypePageReqVO.java new file mode 100644 index 0000000..4a25dd1 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypePageReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.portal.controller.admin.newstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 新闻类型分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class NewsTypePageReqVO extends PageParam { + + @Schema(description = "类型名称", example = "王五") + private String typeName; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypeRespVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypeRespVO.java new file mode 100644 index 0000000..8565f96 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypeRespVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.portal.controller.admin.newstype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 新闻类型 Response VO") +@Data +@ExcelIgnoreUnannotated +public class NewsTypeRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "22991") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @ExcelProperty("类型名称") + private String typeName; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypeSaveReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypeSaveReqVO.java new file mode 100644 index 0000000..ce2285d --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/newstype/vo/NewsTypeSaveReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.portal.controller.admin.newstype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 新闻类型新增/修改 Request VO") +@Data +public class NewsTypeSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "22991") + private Long id; + + @Schema(description = "类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotEmpty(message = "类型名称不能为空") + private String typeName; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/PortalUserController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/PortalUserController.java new file mode 100644 index 0000000..a233ccc --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/PortalUserController.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.portal.controller.admin.portaluser; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.portaluser.PortalUserDO; +import cn.iocoder.yudao.module.portal.service.user.PortalUserService; + +@Tag(name = "管理后台 - 用户") +@RestController +@RequestMapping("/portal/user") +@Validated +public class PortalUserController { + + @Resource + private PortalUserService userService; + + @PostMapping("/create") + @Operation(summary = "创建用户") + @PreAuthorize("@ss.hasPermission('portal:user:create')") + public CommonResult createUser(@Valid @RequestBody PortalUserSaveReqVO createReqVO) { + return success(userService.createUser(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新用户") + @PreAuthorize("@ss.hasPermission('portal:user:update')") + public CommonResult updateUser(@Valid @RequestBody PortalUserSaveReqVO updateReqVO) { + userService.updateUser(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('portal:user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('portal:user:query')") + public CommonResult getUser(@RequestParam("id") Long id) { + PortalUserDO user = userService.getUser(id); + return success(BeanUtils.toBean(user, PortalUserRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得用户分页") + @PreAuthorize("@ss.hasPermission('portal:user:query')") + public CommonResult> getUserPage(@Valid PortalUserPageReqVO pageReqVO) { + PageResult pageResult = userService.getUserPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PortalUserRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出用户 Excel") + @PreAuthorize("@ss.hasPermission('portal:user:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUserExcel(@Valid PortalUserPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = userService.getUserPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "用户.xls", "数据", PortalUserRespVO.class, + BeanUtils.toBean(list, PortalUserRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserPageReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserPageReqVO.java new file mode 100644 index 0000000..e08f4e3 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserPageReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 用户分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PortalUserPageReqVO extends PageParam { + + @Schema(description = "用户名", example = "李四") + private String username; + + @Schema(description = "密码") + private String password; + + @Schema(description = "登录token") + private String token; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserRespVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserRespVO.java new file mode 100644 index 0000000..defe743 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserRespVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 用户 Response VO") +@Data +@ExcelIgnoreUnannotated +public class PortalUserRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "943") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @ExcelProperty("用户名") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("密码") + private String password; + + @Schema(description = "登录token") + @ExcelProperty("登录token") + private String token; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserSaveReqVO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserSaveReqVO.java new file mode 100644 index 0000000..ddd3c29 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/admin/portaluser/vo/PortalUserSaveReqVO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 用户新增/修改 Request VO") +@Data +public class PortalUserSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "943") + private Long id; + + @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotEmpty(message = "用户名不能为空") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "密码不能为空") + private String password; + + @Schema(description = "登录token") + private String token; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/city/AppCityController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/city/AppCityController.java new file mode 100644 index 0000000..eaa0fef --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/city/AppCityController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.portal.controller.app.city; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.portal.controller.admin.city.vo.CityPageReqVO; +import cn.iocoder.yudao.module.portal.controller.admin.city.vo.CityRespVO; +import cn.iocoder.yudao.module.portal.controller.admin.city.vo.CitySaveReqVO; +import cn.iocoder.yudao.module.portal.dal.dataobject.city.CityDO; +import cn.iocoder.yudao.module.portal.service.city.CityService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 城市") +@RestController +@RequestMapping("/portal/city") +@Validated +public class AppCityController { + + @Resource + private CityService cityService; + + @PostMapping("/create") + @Operation(summary = "创建城市") + public CommonResult createCity(@Valid @RequestBody CitySaveReqVO createReqVO) { + return success(cityService.createCity(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新城市") + public CommonResult updateCity(@Valid @RequestBody CitySaveReqVO updateReqVO) { + cityService.updateCity(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除城市") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteCity(@RequestParam("id") Long id) { + cityService.deleteCity(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得城市") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getCity(@RequestParam("id") Long id) { + CityDO city = cityService.getCity(id); + return success(BeanUtils.toBean(city, CityRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得城市分页") + public CommonResult> getCityPage(@Valid CityPageReqVO pageReqVO) { + PageResult pageResult = cityService.getCityPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, CityRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出城市 Excel") + @ApiAccessLog(operateType = EXPORT) + public void exportCityExcel(@Valid CityPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = cityService.getCityPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "城市.xls", "数据", CityRespVO.class, + BeanUtils.toBean(list, CityRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/jobcategory/AppJobCategoryController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/jobcategory/AppJobCategoryController.java new file mode 100644 index 0000000..4d26829 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/jobcategory/AppJobCategoryController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.portal.controller.app.jobcategory; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo.JobCategoryPageReqVO; +import cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo.JobCategoryRespVO; +import cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo.JobCategorySaveReqVO; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobcategory.JobCategoryDO; +import cn.iocoder.yudao.module.portal.service.jobcategory.JobCategoryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 职位类别") +@RestController +@RequestMapping("/portal/job-category") +@Validated +public class AppJobCategoryController { + + @Resource + private JobCategoryService jobCategoryService; + + @PostMapping("/create") + @Operation(summary = "创建职位类别") + public CommonResult createJobCategory(@Valid @RequestBody JobCategorySaveReqVO createReqVO) { + return success(jobCategoryService.createJobCategory(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新职位类别") + public CommonResult updateJobCategory(@Valid @RequestBody JobCategorySaveReqVO updateReqVO) { + jobCategoryService.updateJobCategory(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除职位类别") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteJobCategory(@RequestParam("id") Long id) { + jobCategoryService.deleteJobCategory(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得职位类别") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getJobCategory(@RequestParam("id") Long id) { + JobCategoryDO jobCategory = jobCategoryService.getJobCategory(id); + return success(BeanUtils.toBean(jobCategory, JobCategoryRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得职位类别分页") + public CommonResult> getJobCategoryPage(@Valid JobCategoryPageReqVO pageReqVO) { + PageResult pageResult = jobCategoryService.getJobCategoryPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, JobCategoryRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出职位类别 Excel") + @ApiAccessLog(operateType = EXPORT) + public void exportJobCategoryExcel(@Valid JobCategoryPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = jobCategoryService.getJobCategoryPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "职位类别.xls", "数据", JobCategoryRespVO.class, + BeanUtils.toBean(list, JobCategoryRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/jobpost/AppJobPostController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/jobpost/AppJobPostController.java new file mode 100644 index 0000000..b34641b --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/jobpost/AppJobPostController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.portal.controller.app.jobpost; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo.JobPostPageReqVO; +import cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo.JobPostRespVO; +import cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo.JobPostSaveReqVO; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobpost.JobPostDO; +import cn.iocoder.yudao.module.portal.service.jobpost.JobPostService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 职位") +@RestController +@RequestMapping("/portal/job-post") +@Validated +public class AppJobPostController { + + @Resource + private JobPostService jobPostService; + + @PostMapping("/create") + @Operation(summary = "创建职位") + public CommonResult createJobPost(@Valid @RequestBody JobPostSaveReqVO createReqVO) { + return success(jobPostService.createJobPost(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新职位") + public CommonResult updateJobPost(@Valid @RequestBody JobPostSaveReqVO updateReqVO) { + jobPostService.updateJobPost(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除职位") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteJobPost(@RequestParam("id") Long id) { + jobPostService.deleteJobPost(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得职位") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getJobPost(@RequestParam("id") Long id) { + JobPostDO jobPost = jobPostService.getJobPost(id); + return success(BeanUtils.toBean(jobPost, JobPostRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得职位分页") + public CommonResult> getJobPostPage(@Valid JobPostPageReqVO pageReqVO) { + PageResult pageResult = jobPostService.getJobPostPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, JobPostRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出职位 Excel") + @ApiAccessLog(operateType = EXPORT) + public void exportJobPostExcel(@Valid JobPostPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = jobPostService.getJobPostPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "职位.xls", "数据", JobPostRespVO.class, + BeanUtils.toBean(list, JobPostRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/news/AppNewsController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/news/AppNewsController.java new file mode 100644 index 0000000..4b8f371 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/news/AppNewsController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.portal.controller.app.news; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.portal.controller.admin.news.vo.NewsPageReqVO; +import cn.iocoder.yudao.module.portal.controller.admin.news.vo.NewsRespVO; +import cn.iocoder.yudao.module.portal.controller.admin.news.vo.NewsSaveReqVO; +import cn.iocoder.yudao.module.portal.dal.dataobject.news.NewsDO; +import cn.iocoder.yudao.module.portal.service.news.NewsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 新闻") +@RestController +@RequestMapping("/portal/news") +@Validated +public class AppNewsController { + + @Resource + private NewsService newsService; + + @PostMapping("/create") + @Operation(summary = "创建新闻") + public CommonResult createNews(@Valid @RequestBody NewsSaveReqVO createReqVO) { + return success(newsService.createNews(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新新闻") + public CommonResult updateNews(@Valid @RequestBody NewsSaveReqVO updateReqVO) { + newsService.updateNews(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除新闻") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteNews(@RequestParam("id") Long id) { + newsService.deleteNews(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得新闻") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getNews(@RequestParam("id") Long id) { + NewsDO news = newsService.getNews(id); + return success(BeanUtils.toBean(news, NewsRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得新闻分页") + public CommonResult> getNewsPage(@Valid NewsPageReqVO pageReqVO) { + PageResult pageResult = newsService.getNewsPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, NewsRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出新闻 Excel") + @ApiAccessLog(operateType = EXPORT) + public void exportNewsExcel(@Valid NewsPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = newsService.getNewsPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "新闻.xls", "数据", NewsRespVO.class, + BeanUtils.toBean(list, NewsRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/newstype/AppNewsTypeController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/newstype/AppNewsTypeController.java new file mode 100644 index 0000000..8040429 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/newstype/AppNewsTypeController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.portal.controller.app.newstype; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.portal.controller.admin.newstype.vo.NewsTypePageReqVO; +import cn.iocoder.yudao.module.portal.controller.admin.newstype.vo.NewsTypeRespVO; +import cn.iocoder.yudao.module.portal.controller.admin.newstype.vo.NewsTypeSaveReqVO; +import cn.iocoder.yudao.module.portal.dal.dataobject.newstype.NewsTypeDO; +import cn.iocoder.yudao.module.portal.service.newstype.NewsTypeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 新闻类型") +@RestController +@RequestMapping("/portal/news-type") +@Validated +public class AppNewsTypeController { + + @Resource + private NewsTypeService newsTypeService; + + @PostMapping("/create") + @Operation(summary = "创建新闻类型") + public CommonResult createNewsType(@Valid @RequestBody NewsTypeSaveReqVO createReqVO) { + return success(newsTypeService.createNewsType(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新新闻类型") + public CommonResult updateNewsType(@Valid @RequestBody NewsTypeSaveReqVO updateReqVO) { + newsTypeService.updateNewsType(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除新闻类型") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteNewsType(@RequestParam("id") Long id) { + newsTypeService.deleteNewsType(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得新闻类型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getNewsType(@RequestParam("id") Long id) { + NewsTypeDO newsType = newsTypeService.getNewsType(id); + return success(BeanUtils.toBean(newsType, NewsTypeRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得新闻类型分页") + public CommonResult> getNewsTypePage(@Valid NewsTypePageReqVO pageReqVO) { + PageResult pageResult = newsTypeService.getNewsTypePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, NewsTypeRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出新闻类型 Excel") + @ApiAccessLog(operateType = EXPORT) + public void exportNewsTypeExcel(@Valid NewsTypePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = newsTypeService.getNewsTypePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "新闻类型.xls", "数据", NewsTypeRespVO.class, + BeanUtils.toBean(list, NewsTypeRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/portaluser/AppPortalUserController.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/portaluser/AppPortalUserController.java new file mode 100644 index 0000000..31887b4 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/controller/app/portaluser/AppPortalUserController.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.module.portal.controller.app.portaluser; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo.PortalUserPageReqVO; +import cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo.PortalUserRespVO; +import cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo.PortalUserSaveReqVO; +import cn.iocoder.yudao.module.portal.dal.dataobject.portaluser.PortalUserDO; +import cn.iocoder.yudao.module.portal.service.user.PortalUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 用户") +@RestController +@RequestMapping("/portal/user") +@Validated +public class AppPortalUserController { + + @Resource + private PortalUserService userService; + + @PostMapping("/create") + @Operation(summary = "创建用户") + public CommonResult createUser(@Valid @RequestBody PortalUserSaveReqVO createReqVO) { + return success(userService.createUser(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新用户") + public CommonResult updateUser(@Valid @RequestBody PortalUserSaveReqVO updateReqVO) { + userService.updateUser(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getUser(@RequestParam("id") Long id) { + PortalUserDO user = userService.getUser(id); + return success(BeanUtils.toBean(user, PortalUserRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得用户分页") + public CommonResult> getUserPage(@Valid PortalUserPageReqVO pageReqVO) { + PageResult pageResult = userService.getUserPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PortalUserRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出用户 Excel") + @ApiAccessLog(operateType = EXPORT) + public void exportUserExcel(@Valid PortalUserPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = userService.getUserPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "用户.xls", "数据", PortalUserRespVO.class, + BeanUtils.toBean(list, PortalUserRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/city/CityDO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/city/CityDO.java new file mode 100644 index 0000000..566b4be --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/city/CityDO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.portal.dal.dataobject.city; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 城市 DO + * + * @author 篮智科技 + */ +@TableName("portal_city") +@KeySequence("portal_city_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CityDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 城市名称 + */ + private String name; + /** + * 城市编码 + */ + private String code; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/jobcategory/JobCategoryDO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/jobcategory/JobCategoryDO.java new file mode 100644 index 0000000..714a530 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/jobcategory/JobCategoryDO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.portal.dal.dataobject.jobcategory; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 职位类别 DO + * + * @author 篮智科技 + */ +@TableName("portal_job_category") +@KeySequence("portal_job_category_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobCategoryDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 类别名称 + */ + private String name; + /** + * 父类别ID + */ + private Long parentId; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/jobpost/JobPostDO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/jobpost/JobPostDO.java new file mode 100644 index 0000000..9aaef0c --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/jobpost/JobPostDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.portal.dal.dataobject.jobpost; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 职位 DO + * + * @author 篮智科技 + */ +@TableName("portal_job_post") +@KeySequence("portal_job_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobPostDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 职位标题 + */ + private String title; + /** + * 职位描述 + */ + private String description; + /** + * 职位要求 + */ + private String requirement; + /** + * 城市ID + */ + private Long cityId; + /** + * 职位类别ID + */ + private Long jobCategoryId; + /** + * 发布时间 + */ + private LocalDateTime publishTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/news/NewsDO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/news/NewsDO.java new file mode 100644 index 0000000..ea0cf85 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/news/NewsDO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.portal.dal.dataobject.news; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 新闻 DO + * + * @author 篮智科技 + */ +@TableName("portal_news") +@KeySequence("portal_news_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NewsDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 新闻标题 + */ + private String newsTitle; + /** + * 新闻描述 + */ + private String newsDesc; + /** + * 新闻内容 + */ + private String newsContent; + /** + * 新闻路径 + */ + private String newsPath; + /** + * 封面图片 + */ + private String coverImg; + /** + * 新闻类型ID + */ + private Long newsTypeId; + /** + * 发布时间 + */ + private LocalDateTime publishTime; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/newstype/NewsTypeDO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/newstype/NewsTypeDO.java new file mode 100644 index 0000000..e422b99 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/newstype/NewsTypeDO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.portal.dal.dataobject.newstype; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 新闻类型 DO + * + * @author 篮智科技 + */ +@TableName("portal_news_type") +@KeySequence("portal_news_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class NewsTypeDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 类型名称 + */ + private String typeName; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/portaluser/PortalUserDO.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/portaluser/PortalUserDO.java new file mode 100644 index 0000000..750c8dc --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/dataobject/portaluser/PortalUserDO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.portal.dal.dataobject.portaluser; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 用户 DO + * + * @author 篮智科技 + */ +@TableName("portal_user") +@KeySequence("portal_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PortalUserDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 登录token + */ + private String token; + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/city/CityMapper.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/city/CityMapper.java new file mode 100644 index 0000000..976af6c --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/city/CityMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.portal.dal.mysql.city; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.portal.dal.dataobject.city.CityDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.portal.controller.admin.city.vo.*; + +/** + * 城市 Mapper + * + * @author 篮智科技 + */ +@Mapper +public interface CityMapper extends BaseMapperX { + + default PageResult selectPage(CityPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(CityDO::getName, reqVO.getName()) + .eqIfPresent(CityDO::getCode, reqVO.getCode()) + .betweenIfPresent(CityDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CityDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/jobcategory/JobCategoryMapper.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/jobcategory/JobCategoryMapper.java new file mode 100644 index 0000000..2e59602 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/jobcategory/JobCategoryMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.portal.dal.mysql.jobcategory; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobcategory.JobCategoryDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo.*; + +/** + * 职位类别 Mapper + * + * @author 篮智科技 + */ +@Mapper +public interface JobCategoryMapper extends BaseMapperX { + + default PageResult selectPage(JobCategoryPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(JobCategoryDO::getName, reqVO.getName()) + .eqIfPresent(JobCategoryDO::getParentId, reqVO.getParentId()) + .betweenIfPresent(JobCategoryDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(JobCategoryDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/jobpost/JobPostMapper.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/jobpost/JobPostMapper.java new file mode 100644 index 0000000..83d4c00 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/jobpost/JobPostMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.portal.dal.mysql.jobpost; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobpost.JobPostDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo.*; + +/** + * 职位 Mapper + * + * @author 篮智科技 + */ +@Mapper +public interface JobPostMapper extends BaseMapperX { + + default PageResult selectPage(JobPostPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(JobPostDO::getTitle, reqVO.getTitle()) + .eqIfPresent(JobPostDO::getDescription, reqVO.getDescription()) + .eqIfPresent(JobPostDO::getRequirement, reqVO.getRequirement()) + .eqIfPresent(JobPostDO::getCityId, reqVO.getCityId()) + .eqIfPresent(JobPostDO::getJobCategoryId, reqVO.getJobCategoryId()) + .betweenIfPresent(JobPostDO::getPublishTime, reqVO.getPublishTime()) + .betweenIfPresent(JobPostDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(JobPostDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/news/NewsMapper.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/news/NewsMapper.java new file mode 100644 index 0000000..947857b --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/news/NewsMapper.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.portal.dal.mysql.news; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.portal.dal.dataobject.news.NewsDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.portal.controller.admin.news.vo.*; + +/** + * 新闻 Mapper + * + * @author 篮智科技 + */ +@Mapper +public interface NewsMapper extends BaseMapperX { + + default PageResult selectPage(NewsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(NewsDO::getNewsTitle, reqVO.getNewsTitle()) + .eqIfPresent(NewsDO::getNewsDesc, reqVO.getNewsDesc()) + .eqIfPresent(NewsDO::getNewsContent, reqVO.getNewsContent()) + .eqIfPresent(NewsDO::getNewsPath, reqVO.getNewsPath()) + .eqIfPresent(NewsDO::getCoverImg, reqVO.getCoverImg()) + .eqIfPresent(NewsDO::getNewsTypeId, reqVO.getNewsTypeId()) + .betweenIfPresent(NewsDO::getPublishTime, reqVO.getPublishTime()) + .betweenIfPresent(NewsDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(NewsDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/newstype/NewsTypeMapper.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/newstype/NewsTypeMapper.java new file mode 100644 index 0000000..973d350 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/newstype/NewsTypeMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.portal.dal.mysql.newstype; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.portal.dal.dataobject.newstype.NewsTypeDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.portal.controller.admin.newstype.vo.*; + +/** + * 新闻类型 Mapper + * + * @author 篮智科技 + */ +@Mapper +public interface NewsTypeMapper extends BaseMapperX { + + default PageResult selectPage(NewsTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(NewsTypeDO::getTypeName, reqVO.getTypeName()) + .betweenIfPresent(NewsTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(NewsTypeDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/portaluser/PortalUserMapper.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/portaluser/PortalUserMapper.java new file mode 100644 index 0000000..5c4c61f --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/dal/mysql/portaluser/PortalUserMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.portal.dal.mysql.portaluser; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.portal.dal.dataobject.portaluser.PortalUserDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo.*; + +/** + * 用户 Mapper + * + * @author 篮智科技 + */ +@Mapper +public interface PortalUserMapper extends BaseMapperX { + + default PageResult selectPage(PortalUserPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(PortalUserDO::getUsername, reqVO.getUsername()) + .eqIfPresent(PortalUserDO::getPassword, reqVO.getPassword()) + .eqIfPresent(PortalUserDO::getToken, reqVO.getToken()) + .betweenIfPresent(PortalUserDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(PortalUserDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/city/CityService.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/city/CityService.java new file mode 100644 index 0000000..b7269f1 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/city/CityService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.portal.service.city; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.portal.controller.admin.city.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.city.CityDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 城市 Service 接口 + * + * @author 篮智科技 + */ +public interface CityService { + + /** + * 创建城市 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCity(@Valid CitySaveReqVO createReqVO); + + /** + * 更新城市 + * + * @param updateReqVO 更新信息 + */ + void updateCity(@Valid CitySaveReqVO updateReqVO); + + /** + * 删除城市 + * + * @param id 编号 + */ + void deleteCity(Long id); + + /** + * 获得城市 + * + * @param id 编号 + * @return 城市 + */ + CityDO getCity(Long id); + + /** + * 获得城市分页 + * + * @param pageReqVO 分页查询 + * @return 城市分页 + */ + PageResult getCityPage(CityPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/city/CityServiceImpl.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/city/CityServiceImpl.java new file mode 100644 index 0000000..b201759 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/city/CityServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.portal.service.city; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.portal.controller.admin.city.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.city.CityDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.portal.dal.mysql.city.CityMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.portal.enums.ErrorCodeConstants.*; + +/** + * 城市 Service 实现类 + * + * @author 篮智科技 + */ +@Service +@Validated +public class CityServiceImpl implements CityService { + + @Resource + private CityMapper cityMapper; + + @Override + public Long createCity(CitySaveReqVO createReqVO) { + // 插入 + CityDO city = BeanUtils.toBean(createReqVO, CityDO.class); + cityMapper.insert(city); + // 返回 + return city.getId(); + } + + @Override + public void updateCity(CitySaveReqVO updateReqVO) { + // 校验存在 + validateCityExists(updateReqVO.getId()); + // 更新 + CityDO updateObj = BeanUtils.toBean(updateReqVO, CityDO.class); + cityMapper.updateById(updateObj); + } + + @Override + public void deleteCity(Long id) { + // 校验存在 + validateCityExists(id); + // 删除 + cityMapper.deleteById(id); + } + + private void validateCityExists(Long id) { + if (cityMapper.selectById(id) == null) { + throw exception(CITY_NOT_EXISTS); + } + } + + @Override + public CityDO getCity(Long id) { + return cityMapper.selectById(id); + } + + @Override + public PageResult getCityPage(CityPageReqVO pageReqVO) { + return cityMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobcategory/JobCategoryService.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobcategory/JobCategoryService.java new file mode 100644 index 0000000..86a33a6 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobcategory/JobCategoryService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.portal.service.jobcategory; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobcategory.JobCategoryDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 职位类别 Service 接口 + * + * @author 篮智科技 + */ +public interface JobCategoryService { + + /** + * 创建职位类别 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createJobCategory(@Valid JobCategorySaveReqVO createReqVO); + + /** + * 更新职位类别 + * + * @param updateReqVO 更新信息 + */ + void updateJobCategory(@Valid JobCategorySaveReqVO updateReqVO); + + /** + * 删除职位类别 + * + * @param id 编号 + */ + void deleteJobCategory(Long id); + + /** + * 获得职位类别 + * + * @param id 编号 + * @return 职位类别 + */ + JobCategoryDO getJobCategory(Long id); + + /** + * 获得职位类别分页 + * + * @param pageReqVO 分页查询 + * @return 职位类别分页 + */ + PageResult getJobCategoryPage(JobCategoryPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobcategory/JobCategoryServiceImpl.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobcategory/JobCategoryServiceImpl.java new file mode 100644 index 0000000..6b20e57 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobcategory/JobCategoryServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.portal.service.jobcategory; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.portal.controller.admin.jobcategory.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobcategory.JobCategoryDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.portal.dal.mysql.jobcategory.JobCategoryMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.portal.enums.ErrorCodeConstants.*; + +/** + * 职位类别 Service 实现类 + * + * @author 篮智科技 + */ +@Service +@Validated +public class JobCategoryServiceImpl implements JobCategoryService { + + @Resource + private JobCategoryMapper jobCategoryMapper; + + @Override + public Long createJobCategory(JobCategorySaveReqVO createReqVO) { + // 插入 + JobCategoryDO jobCategory = BeanUtils.toBean(createReqVO, JobCategoryDO.class); + jobCategoryMapper.insert(jobCategory); + // 返回 + return jobCategory.getId(); + } + + @Override + public void updateJobCategory(JobCategorySaveReqVO updateReqVO) { + // 校验存在 + validateJobCategoryExists(updateReqVO.getId()); + // 更新 + JobCategoryDO updateObj = BeanUtils.toBean(updateReqVO, JobCategoryDO.class); + jobCategoryMapper.updateById(updateObj); + } + + @Override + public void deleteJobCategory(Long id) { + // 校验存在 + validateJobCategoryExists(id); + // 删除 + jobCategoryMapper.deleteById(id); + } + + private void validateJobCategoryExists(Long id) { + if (jobCategoryMapper.selectById(id) == null) { + throw exception(JOB_CATEGORY_NOT_EXISTS); + } + } + + @Override + public JobCategoryDO getJobCategory(Long id) { + return jobCategoryMapper.selectById(id); + } + + @Override + public PageResult getJobCategoryPage(JobCategoryPageReqVO pageReqVO) { + return jobCategoryMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobpost/JobPostService.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobpost/JobPostService.java new file mode 100644 index 0000000..65ae9e8 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobpost/JobPostService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.portal.service.jobpost; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobpost.JobPostDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 职位 Service 接口 + * + * @author 篮智科技 + */ +public interface JobPostService { + + /** + * 创建职位 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createJobPost(@Valid JobPostSaveReqVO createReqVO); + + /** + * 更新职位 + * + * @param updateReqVO 更新信息 + */ + void updateJobPost(@Valid JobPostSaveReqVO updateReqVO); + + /** + * 删除职位 + * + * @param id 编号 + */ + void deleteJobPost(Long id); + + /** + * 获得职位 + * + * @param id 编号 + * @return 职位 + */ + JobPostDO getJobPost(Long id); + + /** + * 获得职位分页 + * + * @param pageReqVO 分页查询 + * @return 职位分页 + */ + PageResult getJobPostPage(JobPostPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobpost/JobPostServiceImpl.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobpost/JobPostServiceImpl.java new file mode 100644 index 0000000..c5ae862 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/jobpost/JobPostServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.portal.service.jobpost; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.portal.controller.admin.jobpost.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.jobpost.JobPostDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.portal.dal.mysql.jobpost.JobPostMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.portal.enums.ErrorCodeConstants.*; + +/** + * 职位 Service 实现类 + * + * @author 篮智科技 + */ +@Service +@Validated +public class JobPostServiceImpl implements JobPostService { + + @Resource + private JobPostMapper jobPostMapper; + + @Override + public Long createJobPost(JobPostSaveReqVO createReqVO) { + // 插入 + JobPostDO jobPost = BeanUtils.toBean(createReqVO, JobPostDO.class); + jobPostMapper.insert(jobPost); + // 返回 + return jobPost.getId(); + } + + @Override + public void updateJobPost(JobPostSaveReqVO updateReqVO) { + // 校验存在 + validateJobPostExists(updateReqVO.getId()); + // 更新 + JobPostDO updateObj = BeanUtils.toBean(updateReqVO, JobPostDO.class); + jobPostMapper.updateById(updateObj); + } + + @Override + public void deleteJobPost(Long id) { + // 校验存在 + validateJobPostExists(id); + // 删除 + jobPostMapper.deleteById(id); + } + + private void validateJobPostExists(Long id) { + if (jobPostMapper.selectById(id) == null) { + throw exception(JOB_POST_NOT_EXISTS); + } + } + + @Override + public JobPostDO getJobPost(Long id) { + return jobPostMapper.selectById(id); + } + + @Override + public PageResult getJobPostPage(JobPostPageReqVO pageReqVO) { + return jobPostMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/news/NewsService.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/news/NewsService.java new file mode 100644 index 0000000..86ae953 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/news/NewsService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.portal.service.news; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.portal.controller.admin.news.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.news.NewsDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 新闻 Service 接口 + * + * @author 篮智科技 + */ +public interface NewsService { + + /** + * 创建新闻 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createNews(@Valid NewsSaveReqVO createReqVO); + + /** + * 更新新闻 + * + * @param updateReqVO 更新信息 + */ + void updateNews(@Valid NewsSaveReqVO updateReqVO); + + /** + * 删除新闻 + * + * @param id 编号 + */ + void deleteNews(Long id); + + /** + * 获得新闻 + * + * @param id 编号 + * @return 新闻 + */ + NewsDO getNews(Long id); + + /** + * 获得新闻分页 + * + * @param pageReqVO 分页查询 + * @return 新闻分页 + */ + PageResult getNewsPage(NewsPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/news/NewsServiceImpl.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/news/NewsServiceImpl.java new file mode 100644 index 0000000..383c3e5 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/news/NewsServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.portal.service.news; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.portal.controller.admin.news.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.news.NewsDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.portal.dal.mysql.news.NewsMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.portal.enums.ErrorCodeConstants.*; + +/** + * 新闻 Service 实现类 + * + * @author 篮智科技 + */ +@Service +@Validated +public class NewsServiceImpl implements NewsService { + + @Resource + private NewsMapper newsMapper; + + @Override + public Long createNews(NewsSaveReqVO createReqVO) { + // 插入 + NewsDO news = BeanUtils.toBean(createReqVO, NewsDO.class); + newsMapper.insert(news); + // 返回 + return news.getId(); + } + + @Override + public void updateNews(NewsSaveReqVO updateReqVO) { + // 校验存在 + validateNewsExists(updateReqVO.getId()); + // 更新 + NewsDO updateObj = BeanUtils.toBean(updateReqVO, NewsDO.class); + newsMapper.updateById(updateObj); + } + + @Override + public void deleteNews(Long id) { + // 校验存在 + validateNewsExists(id); + // 删除 + newsMapper.deleteById(id); + } + + private void validateNewsExists(Long id) { + if (newsMapper.selectById(id) == null) { + throw exception(NEWS_NOT_EXISTS); + } + } + + @Override + public NewsDO getNews(Long id) { + return newsMapper.selectById(id); + } + + @Override + public PageResult getNewsPage(NewsPageReqVO pageReqVO) { + return newsMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/newstype/NewsTypeService.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/newstype/NewsTypeService.java new file mode 100644 index 0000000..c5cfb48 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/newstype/NewsTypeService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.portal.service.newstype; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.portal.controller.admin.newstype.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.newstype.NewsTypeDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 新闻类型 Service 接口 + * + * @author 篮智科技 + */ +public interface NewsTypeService { + + /** + * 创建新闻类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createNewsType(@Valid NewsTypeSaveReqVO createReqVO); + + /** + * 更新新闻类型 + * + * @param updateReqVO 更新信息 + */ + void updateNewsType(@Valid NewsTypeSaveReqVO updateReqVO); + + /** + * 删除新闻类型 + * + * @param id 编号 + */ + void deleteNewsType(Long id); + + /** + * 获得新闻类型 + * + * @param id 编号 + * @return 新闻类型 + */ + NewsTypeDO getNewsType(Long id); + + /** + * 获得新闻类型分页 + * + * @param pageReqVO 分页查询 + * @return 新闻类型分页 + */ + PageResult getNewsTypePage(NewsTypePageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/newstype/NewsTypeServiceImpl.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/newstype/NewsTypeServiceImpl.java new file mode 100644 index 0000000..2c36a3e --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/newstype/NewsTypeServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.portal.service.newstype; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.portal.controller.admin.newstype.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.newstype.NewsTypeDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.portal.dal.mysql.newstype.NewsTypeMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.portal.enums.ErrorCodeConstants.*; + +/** + * 新闻类型 Service 实现类 + * + * @author 篮智科技 + */ +@Service +@Validated +public class NewsTypeServiceImpl implements NewsTypeService { + + @Resource + private NewsTypeMapper newsTypeMapper; + + @Override + public Long createNewsType(NewsTypeSaveReqVO createReqVO) { + // 插入 + NewsTypeDO newsType = BeanUtils.toBean(createReqVO, NewsTypeDO.class); + newsTypeMapper.insert(newsType); + // 返回 + return newsType.getId(); + } + + @Override + public void updateNewsType(NewsTypeSaveReqVO updateReqVO) { + // 校验存在 + validateNewsTypeExists(updateReqVO.getId()); + // 更新 + NewsTypeDO updateObj = BeanUtils.toBean(updateReqVO, NewsTypeDO.class); + newsTypeMapper.updateById(updateObj); + } + + @Override + public void deleteNewsType(Long id) { + // 校验存在 + validateNewsTypeExists(id); + // 删除 + newsTypeMapper.deleteById(id); + } + + private void validateNewsTypeExists(Long id) { + if (newsTypeMapper.selectById(id) == null) { + throw exception(NEWS_TYPE_NOT_EXISTS); + } + } + + @Override + public NewsTypeDO getNewsType(Long id) { + return newsTypeMapper.selectById(id); + } + + @Override + public PageResult getNewsTypePage(NewsTypePageReqVO pageReqVO) { + return newsTypeMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/user/PortalServiceImpl.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/user/PortalServiceImpl.java new file mode 100644 index 0000000..5fe4079 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/user/PortalServiceImpl.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.portal.service.user; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.portaluser.PortalUserDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.portal.dal.mysql.portaluser.PortalUserMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.portal.enums.ErrorCodeConstants.*; + +/** + * 用户 Service 实现类 + * + * @author 篮智科技 + */ +@Service +@Validated +public class PortalServiceImpl implements PortalUserService { + + @Resource + private PortalUserMapper portalUserMapper; + + @Override + public Long createUser(PortalUserSaveReqVO createReqVO) { + // 插入 + PortalUserDO user = BeanUtils.toBean(createReqVO, PortalUserDO.class); + portalUserMapper.insert(user); + // 返回 + return user.getId(); + } + + @Override + public void updateUser(PortalUserSaveReqVO updateReqVO) { + // 校验存在 + validateUserExists(updateReqVO.getId()); + // 更新 + PortalUserDO updateObj = BeanUtils.toBean(updateReqVO, PortalUserDO.class); + portalUserMapper.updateById(updateObj); + } + + @Override + public void deleteUser(Long id) { + // 校验存在 + validateUserExists(id); + // 删除 + portalUserMapper.deleteById(id); + } + + private void validateUserExists(Long id) { + if (portalUserMapper.selectById(id) == null) { + throw exception(USER_NOT_EXISTS); + } + } + + @Override + public PortalUserDO getUser(Long id) { + return portalUserMapper.selectById(id); + } + + @Override + public PageResult getUserPage(PortalUserPageReqVO pageReqVO) { + return portalUserMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/user/PortalUserService.java b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/user/PortalUserService.java new file mode 100644 index 0000000..66c92e1 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/java/cn/iocoder/yudao/module/portal/service/user/PortalUserService.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.portal.service.user; + +import javax.validation.*; +import cn.iocoder.yudao.module.portal.controller.admin.portaluser.vo.*; +import cn.iocoder.yudao.module.portal.dal.dataobject.portaluser.PortalUserDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +/** + * 用户 Service 接口 + * + * @author 篮智科技 + */ +public interface PortalUserService { + + /** + * 创建用户 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUser(@Valid PortalUserSaveReqVO createReqVO); + + /** + * 更新用户 + * + * @param updateReqVO 更新信息 + */ + void updateUser(@Valid PortalUserSaveReqVO updateReqVO); + + /** + * 删除用户 + * + * @param id 编号 + */ + void deleteUser(Long id); + + /** + * 获得用户 + * + * @param id 编号 + * @return 用户 + */ + PortalUserDO getUser(Long id); + + /** + * 获得用户分页 + * + * @param pageReqVO 分页查询 + * @return 用户分页 + */ + PageResult getUserPage(PortalUserPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/city/CityMapper.xml b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/city/CityMapper.xml new file mode 100644 index 0000000..5f705b9 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/city/CityMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/jobcategory/JobCategoryMapper.xml b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/jobcategory/JobCategoryMapper.xml new file mode 100644 index 0000000..f603dd7 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/jobcategory/JobCategoryMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/jobpost/JobPostMapper.xml b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/jobpost/JobPostMapper.xml new file mode 100644 index 0000000..12ce57b --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/jobpost/JobPostMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/news/NewsMapper.xml b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/news/NewsMapper.xml new file mode 100644 index 0000000..628669b --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/news/NewsMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/newstype/NewsTypeMapper.xml b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/newstype/NewsTypeMapper.xml new file mode 100644 index 0000000..5acf55f --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/newstype/NewsTypeMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/portaluser/PortalUserMapper.xml b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/portaluser/PortalUserMapper.xml new file mode 100644 index 0000000..76794ab --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/main/resources/mapper/portaluser/PortalUserMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/address/MemberAddressServiceImplTest.java b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/address/MemberAddressServiceImplTest.java new file mode 100644 index 0000000..f584993 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/address/MemberAddressServiceImplTest.java @@ -0,0 +1,98 @@ +package cn.iocoder.yudao.module.member.service.address; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressCreateReqVO; +import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressUpdateReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.address.MemberAddressDO; +import cn.iocoder.yudao.module.member.dal.mysql.address.MemberAddressMapper; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.ADDRESS_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * {@link AddressServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +@Import(AddressServiceImpl.class) +public class MemberAddressServiceImplTest extends BaseDbUnitTest { + + @Resource + private AddressServiceImpl addressService; + + @Resource + private MemberAddressMapper addressMapper; + + @Test + public void testCreateAddress_success() { + // 准备参数 + AppAddressCreateReqVO reqVO = randomPojo(AppAddressCreateReqVO.class); + + // 调用 + Long addressId = addressService.createAddress(randomLongId(), reqVO); + // 断言 + assertNotNull(addressId); + // 校验记录的属性是否正确 + MemberAddressDO address = addressMapper.selectById(addressId); + assertPojoEquals(reqVO, address); + } + + @Test + public void testUpdateAddress_success() { + // mock 数据 + MemberAddressDO dbAddress = randomPojo(MemberAddressDO.class); + addressMapper.insert(dbAddress);// @Sql: 先插入出一条存在的数据 + // 准备参数 + AppAddressUpdateReqVO reqVO = randomPojo(AppAddressUpdateReqVO.class, o -> { + o.setId(dbAddress.getId()); // 设置更新的 ID + }); + + // 调用 + addressService.updateAddress(dbAddress.getUserId(), reqVO); + // 校验是否更新正确 + MemberAddressDO address = addressMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, address); + } + + @Test + public void testUpdateAddress_notExists() { + // 准备参数 + AppAddressUpdateReqVO reqVO = randomPojo(AppAddressUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> addressService.updateAddress(randomLongId(), reqVO), ADDRESS_NOT_EXISTS); + } + + @Test + public void testDeleteAddress_success() { + // mock 数据 + MemberAddressDO dbAddress = randomPojo(MemberAddressDO.class); + addressMapper.insert(dbAddress);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbAddress.getId(); + + // 调用 + addressService.deleteAddress(dbAddress.getUserId(), id); + // 校验数据不存在了 + assertNull(addressMapper.selectById(id)); + } + + @Test + public void testDeleteAddress_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> addressService.deleteAddress(randomLongId(), id), ADDRESS_NOT_EXISTS); + } + +} diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java new file mode 100644 index 0000000..78ddc56 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java @@ -0,0 +1,118 @@ +package cn.iocoder.yudao.module.member.service.auth; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; +import cn.iocoder.yudao.module.system.api.social.SocialUserApi; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.security.crypto.password.PasswordEncoder; + +import javax.annotation.Resource; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString; + +// TODO @芋艿:单测的 review,等逻辑都达成一致后 +/** + * {@link MemberAuthService} 的单元测试类 + * + * @author 宋天 + */ +@Import({MemberAuthServiceImpl.class, YudaoRedisAutoConfiguration.class}) +public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest { + + // TODO @芋艿:登录相关的单测,待补全 + + @Resource + private MemberAuthServiceImpl authService; + + @MockBean + private MemberUserService userService; + @MockBean + private SmsCodeApi smsCodeApi; + @MockBean + private LoginLogApi loginLogApi; + @MockBean + private OAuth2TokenApi oauth2TokenApi; + @MockBean + private SocialUserApi socialUserApi; + @MockBean + private PasswordEncoder passwordEncoder; + + @Resource + private MemberUserMapper memberUserMapper; + + // TODO 芋艿:后续重构这个单测 +// @Test +// public void testUpdatePassword_success(){ +// // 准备参数 +// MemberUserDO userDO = randomUserDO(); +// memberUserMapper.insert(userDO); +// +// // 新密码 +// String newPassword = randomString(); +// +// // 请求实体 +// AppMemberUserUpdatePasswordReqVO reqVO = AppMemberUserUpdatePasswordReqVO.builder() +// .oldPassword(userDO.getPassword()) +// .password(newPassword) +// .build(); +// +// // 测试桩 +// // 这两个相等是为了返回ture这个结果 +// when(passwordEncoder.matches(reqVO.getOldPassword(),reqVO.getOldPassword())).thenReturn(true); +// when(passwordEncoder.encode(newPassword)).thenReturn(newPassword); +// +// // 更新用户密码 +// authService.updatePassword(userDO.getId(), reqVO); +// assertEquals(memberUserMapper.selectById(userDO.getId()).getPassword(),newPassword); +// } + + // TODO 芋艿:后续重构这个单测 +// @Test +// public void testResetPassword_success(){ +// // 准备参数 +// MemberUserDO userDO = randomUserDO(); +// memberUserMapper.insert(userDO); +// +// // 随机密码 +// String password = randomNumbers(11); +// // 随机验证码 +// String code = randomNumbers(4); +// +// // mock +// when(passwordEncoder.encode(password)).thenReturn(password); +// +// // 更新用户密码 +// AppMemberUserResetPasswordReqVO reqVO = new AppMemberUserResetPasswordReqVO(); +// reqVO.setMobile(userDO.getMobile()); +// reqVO.setPassword(password); +// reqVO.setCode(code); +// +// authService.resetPassword(reqVO); +// assertEquals(memberUserMapper.selectById(userDO.getId()).getPassword(),password); +// } + + // ========== 随机对象 ========== + + @SafeVarargs + private static MemberUserDO randomUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setPassword(randomString()); + }; + return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers)); + } + + +} diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImplTest.java b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImplTest.java new file mode 100644 index 0000000..6d8e6f9 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImplTest.java @@ -0,0 +1,160 @@ +package cn.iocoder.yudao.module.member.service.group; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupCreateReqVO; +import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupPageReqVO; +import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; +import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.GROUP_HAS_USER; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.GROUP_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +// TODO 芋艿:完全 review 完,在去 review 单测 +/** + * {@link MemberGroupServiceImpl} 的单元测试类 + * + * @author owen + */ +@Import(MemberGroupServiceImpl.class) +public class MemberGroupServiceImplTest extends BaseDbUnitTest { + + @Resource + private MemberGroupServiceImpl groupService; + + @Resource + private MemberGroupMapper groupMapper; + + @MockBean + private MemberUserService memberUserService; + + @Test + public void testCreateGroup_success() { + // 准备参数 + MemberGroupCreateReqVO reqVO = randomPojo(MemberGroupCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + + // 调用 + Long groupId = groupService.createGroup(reqVO); + // 断言 + assertNotNull(groupId); + // 校验记录的属性是否正确 + MemberGroupDO group = groupMapper.selectById(groupId); + assertPojoEquals(reqVO, group); + } + + @Test + public void testUpdateGroup_success() { + // mock 数据 + MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class); + groupMapper.insert(dbGroup);// @Sql: 先插入出一条存在的数据 + // 准备参数 + MemberGroupUpdateReqVO reqVO = randomPojo(MemberGroupUpdateReqVO.class, o -> { + o.setId(dbGroup.getId()); // 设置更新的 ID + o.setStatus(randomCommonStatus()); + }); + + // 调用 + groupService.updateGroup(reqVO); + // 校验是否更新正确 + MemberGroupDO group = groupMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, group); + } + + @Test + public void testUpdateGroup_notExists() { + // 准备参数 + MemberGroupUpdateReqVO reqVO = randomPojo(MemberGroupUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> groupService.updateGroup(reqVO), GROUP_NOT_EXISTS); + } + + @Test + public void testDeleteGroup_success() { + // mock 数据 + MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class); + groupMapper.insert(dbGroup);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbGroup.getId(); + + // 调用 + groupService.deleteGroup(id); + // 校验数据不存在了 + assertNull(groupMapper.selectById(id)); + } + + @Test + public void testDeleteGroup_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> groupService.deleteGroup(id), GROUP_NOT_EXISTS); + } + + @Test + public void testDeleteGroup_hasUser() { + // mock 数据 + MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class); + groupMapper.insert(dbGroup);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbGroup.getId(); + + // mock 会员数据 + when(memberUserService.getUserCountByGroupId(eq(id))).thenReturn(1L); + + // 调用, 并断言异常 + assertServiceException(() -> groupService.deleteGroup(id), GROUP_HAS_USER); + } + + @Test + public void testGetGroupPage() { + String name = randomString(); + int status = CommonStatusEnum.ENABLE.getStatus(); + + // mock 数据 + MemberGroupDO dbGroup = randomPojo(MemberGroupDO.class, o -> { // 等会查询到 + o.setName(name); + o.setStatus(status); + o.setCreateTime(buildTime(2023, 2, 18)); + }); + groupMapper.insert(dbGroup); + // 测试 name 不匹配 + groupMapper.insert(cloneIgnoreId(dbGroup, o -> o.setName(""))); + // 测试 status 不匹配 + groupMapper.insert(cloneIgnoreId(dbGroup, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + groupMapper.insert(cloneIgnoreId(dbGroup, o -> o.setCreateTime(null))); + // 准备参数 + MemberGroupPageReqVO reqVO = new MemberGroupPageReqVO(); + reqVO.setName(name); + reqVO.setStatus(status); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = groupService.getGroupPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbGroup, pageResult.getList().get(0)); + } + +} diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImplTest.java b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImplTest.java new file mode 100644 index 0000000..4393229 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImplTest.java @@ -0,0 +1,268 @@ +package cn.iocoder.yudao.module.member.service.level; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; +import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelListReqVO; +import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; +import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomInt; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; + +// TODO 芋艿:完全 review 完,在去 review 单测 +/** + * {@link MemberLevelServiceImpl} 的单元测试类 + * + * @author owen + */ +@Import(MemberLevelServiceImpl.class) +public class MemberLevelServiceImplTest extends BaseDbUnitTest { + + @Resource + private MemberLevelServiceImpl levelService; + + @Resource + private MemberLevelMapper memberlevelMapper; + + @MockBean + private MemberLevelRecordService memberLevelRecordService; + @MockBean + private MemberExperienceRecordService memberExperienceRecordService; + @MockBean + private MemberUserService memberUserService; + + @Test + public void testCreateLevel_success() { + // 准备参数 + MemberLevelCreateReqVO reqVO = randomPojo(MemberLevelCreateReqVO.class, o -> { + o.setDiscountPercent(randomInt()); + o.setIcon(randomURL()); + o.setBackgroundUrl(randomURL()); + o.setStatus(randomCommonStatus()); + }); + + // 调用 + Long levelId = levelService.createLevel(reqVO); + // 断言 + assertNotNull(levelId); + // 校验记录的属性是否正确 + MemberLevelDO level = memberlevelMapper.selectById(levelId); + assertPojoEquals(reqVO, level); + } + + @Test + public void testUpdateLevel_success() { + // mock 数据 + MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class); + memberlevelMapper.insert(dbLevel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + MemberLevelUpdateReqVO reqVO = randomPojo(MemberLevelUpdateReqVO.class, o -> { + o.setId(dbLevel.getId()); // 设置更新的 ID + //以下要保持一致 + o.setName(dbLevel.getName()); + o.setLevel(dbLevel.getLevel()); + o.setExperience(dbLevel.getExperience()); + //以下是要修改的字段 + o.setDiscountPercent(randomInt()); + o.setIcon(randomURL()); + o.setBackgroundUrl(randomURL()); + o.setStatus(randomCommonStatus()); + }); + + // 调用 + levelService.updateLevel(reqVO); + // 校验是否更新正确 + MemberLevelDO level = memberlevelMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, level); + } + + @Test + public void testUpdateLevel_notExists() { + // 准备参数 + MemberLevelUpdateReqVO reqVO = randomPojo(MemberLevelUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> levelService.updateLevel(reqVO), LEVEL_NOT_EXISTS); + } + + @Test + public void testDeleteLevel_success() { + // mock 数据 + MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class); + memberlevelMapper.insert(dbLevel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbLevel.getId(); + + // 调用 + levelService.deleteLevel(id); + // 校验数据不存在了 + assertNull(memberlevelMapper.selectById(id)); + } + + @Test + public void testDeleteLevel_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> levelService.deleteLevel(id), LEVEL_NOT_EXISTS); + } + + @Test + public void testGetLevelList() { + // mock 数据 + MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class, o -> { // 等会查询到 + o.setName("黄金会员"); + o.setStatus(1); + }); + memberlevelMapper.insert(dbLevel); + // 测试 name 不匹配 + memberlevelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setName(""))); + // 测试 status 不匹配 + memberlevelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setStatus(0))); + // 准备参数 + MemberLevelListReqVO reqVO = new MemberLevelListReqVO(); + reqVO.setName("黄金会员"); + reqVO.setStatus(1); + + // 调用 + List list = levelService.getLevelList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbLevel, list.get(0)); + } + + @Test + public void testCreateLevel_nameUnique() { + // 准备参数 + String name = randomString(); + + // mock 数据 + memberlevelMapper.insert(randomLevelDO(o -> o.setName(name))); + + // 调用,校验异常 + List list = memberlevelMapper.selectList(); + assertServiceException(() -> levelService.validateNameUnique(list, null, name), LEVEL_NAME_EXISTS, name); + } + + @Test + public void testUpdateLevel_nameUnique() { + // 准备参数 + Long id = randomLongId(); + String name = randomString(); + + // mock 数据 + memberlevelMapper.insert(randomLevelDO(o -> o.setName(name))); + + // 调用,校验异常 + List list = memberlevelMapper.selectList(); + assertServiceException(() -> levelService.validateNameUnique(list, id, name), LEVEL_NAME_EXISTS, name); + } + + @Test + public void testCreateLevel_levelUnique() { + // 准备参数 + Integer level = randomInteger(); + String name = randomString(); + + // mock 数据 + memberlevelMapper.insert(randomLevelDO(o -> { + o.setLevel(level); + o.setName(name); + })); + + // 调用,校验异常 + List list = memberlevelMapper.selectList(); + assertServiceException(() -> levelService.validateLevelUnique(list, null, level), LEVEL_VALUE_EXISTS, level, name); + } + + @Test + public void testUpdateLevel_levelUnique() { + // 准备参数 + Long id = randomLongId(); + Integer level = randomInteger(); + String name = randomString(); + + // mock 数据 + memberlevelMapper.insert(randomLevelDO(o -> { + o.setLevel(level); + o.setName(name); + })); + + // 调用,校验异常 + List list = memberlevelMapper.selectList(); + assertServiceException(() -> levelService.validateLevelUnique(list, id, level), LEVEL_VALUE_EXISTS, level, name); + } + + @Test + public void testCreateLevel_experienceOutRange() { + // 准备参数 + int level = 10; + int experience = 10; + String name = randomString(); + + // mock 数据 + memberlevelMapper.insert(randomLevelDO(o -> { + o.setLevel(level); + o.setExperience(experience); + o.setName(name); + })); + List list = memberlevelMapper.selectList(); + + // 调用,校验异常 + assertServiceException(() -> levelService.validateExperienceOutRange(list, null, level + 1, experience - 1), LEVEL_EXPERIENCE_MIN, name, level); + // 调用,校验异常 + assertServiceException(() -> levelService.validateExperienceOutRange(list, null, level - 1, experience + 1), LEVEL_EXPERIENCE_MAX, name, level); + } + + @Test + public void testUpdateLevel_experienceOutRange() { + // 准备参数 + int level = 10; + int experience = 10; + Long id = randomLongId(); + String name = randomString(); + + // mock 数据 + memberlevelMapper.insert(randomLevelDO(o -> { + o.setLevel(level); + o.setExperience(experience); + o.setName(name); + })); + List list = memberlevelMapper.selectList(); + + // 调用,校验异常 + assertServiceException(() -> levelService.validateExperienceOutRange(list, id, level + 1, experience - 1), LEVEL_EXPERIENCE_MIN, name, level); + // 调用,校验异常 + assertServiceException(() -> levelService.validateExperienceOutRange(list, id, level - 1, experience + 1), LEVEL_EXPERIENCE_MAX, name, level); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static MemberLevelDO randomLevelDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setDiscountPercent(randomInt(0, 100)); + o.setIcon(randomURL()); + o.setBackgroundUrl(randomURL()); + }; + return randomPojo(MemberLevelDO.class, ArrayUtils.append(consumer, consumers)); + } +} diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImplTest.java b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImplTest.java new file mode 100644 index 0000000..5fd4f7a --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImplTest.java @@ -0,0 +1,133 @@ +package cn.iocoder.yudao.module.member.service.tag; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagCreateReqVO; +import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagPageReqVO; +import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagUpdateReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO; +import cn.iocoder.yudao.module.member.dal.mysql.tag.MemberTagMapper; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.TAG_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +// TODO 芋艿:完全 review 完,在去 review 单测 +/** + * {@link MemberTagServiceImpl} 的单元测试类 + * + * @author 芋道源码 + */ +@Import(MemberTagServiceImpl.class) +public class MemberTagServiceImplTest extends BaseDbUnitTest { + + @Resource + private MemberTagServiceImpl tagService; + + @Resource + private MemberTagMapper tagMapper; + + @MockBean + private MemberUserService memberUserService; + + @Test + public void testCreateTag_success() { + // 准备参数 + MemberTagCreateReqVO reqVO = randomPojo(MemberTagCreateReqVO.class); + + // 调用 + Long tagId = tagService.createTag(reqVO); + // 断言 + assertNotNull(tagId); + // 校验记录的属性是否正确 + MemberTagDO tag = tagMapper.selectById(tagId); + assertPojoEquals(reqVO, tag); + } + + @Test + public void testUpdateTag_success() { + // mock 数据 + MemberTagDO dbTag = randomPojo(MemberTagDO.class); + tagMapper.insert(dbTag);// @Sql: 先插入出一条存在的数据 + // 准备参数 + MemberTagUpdateReqVO reqVO = randomPojo(MemberTagUpdateReqVO.class, o -> { + o.setId(dbTag.getId()); // 设置更新的 ID + }); + + // 调用 + tagService.updateTag(reqVO); + // 校验是否更新正确 + MemberTagDO tag = tagMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, tag); + } + + @Test + public void testUpdateTag_notExists() { + // 准备参数 + MemberTagUpdateReqVO reqVO = randomPojo(MemberTagUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> tagService.updateTag(reqVO), TAG_NOT_EXISTS); + } + + @Test + public void testDeleteTag_success() { + // mock 数据 + MemberTagDO dbTag = randomPojo(MemberTagDO.class); + tagMapper.insert(dbTag);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTag.getId(); + + // 调用 + tagService.deleteTag(id); + // 校验数据不存在了 + assertNull(tagMapper.selectById(id)); + } + + @Test + public void testDeleteTag_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> tagService.deleteTag(id), TAG_NOT_EXISTS); + } + + @Test + public void testGetTagPage() { + // mock 数据 + MemberTagDO dbTag = randomPojo(MemberTagDO.class, o -> { // 等会查询到 + o.setName("test"); + o.setCreateTime(buildTime(2023, 2, 18)); + }); + tagMapper.insert(dbTag); + // 测试 name 不匹配 + tagMapper.insert(cloneIgnoreId(dbTag, o -> o.setName("ne"))); + // 测试 createTime 不匹配 + tagMapper.insert(cloneIgnoreId(dbTag, o -> o.setCreateTime(null))); + // 准备参数 + MemberTagPageReqVO reqVO = new MemberTagPageReqVO(); + reqVO.setName("test"); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = tagService.getTagPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbTag, pageResult.getList().get(0)); + } + +} diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java new file mode 100644 index 0000000..85e01d4 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java @@ -0,0 +1,137 @@ +package cn.iocoder.yudao.module.member.service.user; + +import cn.hutool.core.util.RandomUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; +import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; +import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; +import cn.iocoder.yudao.module.infra.api.file.FileApi; +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl; +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.crypto.password.PasswordEncoder; + +import javax.annotation.Resource; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static cn.hutool.core.util.RandomUtil.randomNumbers; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; + +// TODO @芋艿:单测的 review,等逻辑都达成一致后 +/** + * {@link MemberUserServiceImpl} 的单元测试类 + * + * @author 宋天 + */ +@Disabled +@Import({MemberUserServiceImpl.class, YudaoRedisAutoConfiguration.class}) +public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest { + + @Resource + private MemberUserServiceImpl memberUserService; + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Resource + private MemberUserMapper userMapper; + + @MockBean + private MemberAuthServiceImpl authService; + + @MockBean + private PasswordEncoder passwordEncoder; + + @MockBean + private SmsCodeApi smsCodeApi; + @MockBean + private FileApi fileApi; + + // TODO 芋艿:后续重构这个单测 +// @Test +// public void testUpdateNickName_success(){ +// // mock 数据 +// MemberUserDO userDO = randomUserDO(); +// userMapper.insert(userDO); +// +// // 随机昵称 +// String newNickName = randomString(); +// +// // 调用接口修改昵称 +// memberUserService.updateUser(userDO.getId(),newNickName); +// // 查询新修改后的昵称 +// String nickname = memberUserService.getUser(userDO.getId()).getNickname(); +// // 断言 +// assertEquals(newNickName,nickname); +// } +// +// @Test +// public void testUpdateAvatar_success() throws Exception { +// // mock 数据 +// MemberUserDO dbUser = randomUserDO(); +// userMapper.insert(dbUser); +// +// // 准备参数 +// Long userId = dbUser.getId(); +// byte[] avatarFileBytes = randomBytes(10); +// ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes); +// // mock 方法 +// String avatar = randomString(); +// when(fileApi.createFile(eq(avatarFileBytes))).thenReturn(avatar); +// // 调用 +// String str = memberUserService.updateUserAvatar(userId, avatarFile); +// // 断言 +// assertEquals(avatar, str); +// } + + @Test + @Disabled // TODO 芋艿:后续再修复 + public void updateMobile_success(){ + // mock数据 + String oldMobile = randomNumbers(11); + MemberUserDO userDO = randomUserDO(); + userDO.setMobile(oldMobile); + userMapper.insert(userDO); + + // TODO 芋艿:需要修复该单元测试,重构多模块带来的 + // 旧手机和旧验证码 +// SmsCodeDO codeDO = new SmsCodeDO(); + String oldCode = RandomUtil.randomString(4); +// codeDO.setMobile(userDO.getMobile()); +// codeDO.setCode(oldCode); +// codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()); +// codeDO.setUsed(Boolean.FALSE); +// when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); + + // 更新手机号 + String newMobile = randomNumbers(11); + String newCode = randomNumbers(4); + AppMemberUserUpdateMobileReqVO reqVO = new AppMemberUserUpdateMobileReqVO(); + reqVO.setMobile(newMobile); + reqVO.setCode(newCode); + reqVO.setOldCode(oldCode); + memberUserService.updateUserMobile(userDO.getId(),reqVO); + + assertEquals(memberUserService.getUser(userDO.getId()).getMobile(),newMobile); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static MemberUserDO randomUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(MemberUserDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/resources/application-unit-test.yaml b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..c656a9f --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,47 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +yudao: + info: + base-package: cn.iocoder.yudao.module diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/resources/logback.xml b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/resources/sql/clean.sql b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..f972e04 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/sql/clean.sql @@ -0,0 +1,5 @@ +DELETE FROM "member_user"; +DELETE FROM "member_address"; +DELETE FROM "member_tag"; +DELETE FROM "member_level"; +DELETE FROM "member_group"; \ No newline at end of file diff --git a/yudao-module-portal/yudao-module-portal-biz/src/test/resources/sql/create_tables.sql b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..782a818 --- /dev/null +++ b/yudao-module-portal/yudao-module-portal-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,113 @@ +CREATE TABLE IF NOT EXISTS "member_user" +( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '编号', + "nickname" varchar(30) NOT NULL DEFAULT '' COMMENT '用户昵称', + "name" varchar(30) NULL COMMENT '真实名字', + sex tinyint null comment '性别', + birthday datetime null comment '出生日期', + area_id int null comment '所在地', + mark varchar(255) null comment '用户备注', + point int default 0 null comment '积分', + "avatar" varchar(255) NOT NULL DEFAULT '' COMMENT '头像', + "status" tinyint NOT NULL COMMENT '状态', + "mobile" varchar(11) NOT NULL COMMENT '手机号', + "password" varchar(100) NOT NULL DEFAULT '' COMMENT '密码', + "register_ip" varchar(32) NOT NULL COMMENT '注册 IP', + "login_ip" varchar(50) NULL DEFAULT '' COMMENT '最后登录IP', + "login_date" datetime NULL DEFAULT NULL COMMENT '最后登录时间', + "tag_ids" varchar(255) NULL DEFAULT NULL COMMENT '用户标签编号列表,以逗号分隔', + "level_id" bigint NULL DEFAULT NULL COMMENT '等级编号', + "experience" bigint NULL DEFAULT NULL COMMENT '经验', + "group_id" bigint NULL DEFAULT NULL COMMENT '用户分组编号', + "creator" varchar(64) NULL DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) NULL DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit(1) NOT NULL DEFAULT '0' COMMENT '是否删除', + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '会员表'; + +CREATE TABLE IF NOT EXISTS "member_address" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint(20) NOT NULL, + "name" varchar(10) NOT NULL, + "mobile" varchar(20) NOT NULL, + "area_id" bigint(20) NOT NULL, + "detail_address" varchar(250) NOT NULL, + "default_status" bit NOT NULL, + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "creator" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "updater" varchar(64) DEFAULT '', + PRIMARY KEY ("id") +) COMMENT '用户收件地址'; + +CREATE TABLE IF NOT EXISTS "member_tag" +( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL default '0', + PRIMARY KEY ("id") +) COMMENT '会员标签'; + +CREATE TABLE IF NOT EXISTS "member_level" +( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar NOT NULL, + "experience" int NOT NULL, + "level" int NOT NULL, + "discount_percent" int NOT NULL, + "icon" varchar NOT NULL, + "background_url" varchar NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + "status" tinyint NOT NULL DEFAULT '0', + PRIMARY KEY ("id") +) COMMENT '会员等级'; + +CREATE TABLE IF NOT EXISTS "member_group" +( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar NOT NULL, + "remark" varchar NOT NULL, + "status" tinyint NOT NULL DEFAULT '0', + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '用户分组'; +CREATE TABLE IF NOT EXISTS "member_brokerage_record" +( + "id" int NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "biz_id" varchar NOT NULL, + "biz_type" varchar NOT NULL, + "title" varchar NOT NULL, + "price" int NOT NULL, + "total_price" int NOT NULL, + "description" varchar NOT NULL, + "status" varchar NOT NULL, + "frozen_days" int NOT NULL, + "unfreeze_time" varchar, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '佣金记录'; diff --git a/yudao-server/pom.xml b/yudao-server/pom.xml index f094835..0c9c29a 100644 --- a/yudao-server/pom.xml +++ b/yudao-server/pom.xml @@ -101,6 +101,13 @@ ${revision} + + + cn.iocoder.boot + yudao-module-portal-biz + ${revision} + +