diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 62ac42e..edac14c 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,9 +7,27 @@ - + + + + + + + + \ No newline at end of file diff --git a/client/src/views/management/Organization.vue b/client/src/views/management/Organization.vue index 7b1e6a8..c928959 100644 --- a/client/src/views/management/Organization.vue +++ b/client/src/views/management/Organization.vue @@ -28,18 +28,10 @@ onMounted(() => { type: 'form', api: { method: 'post', - url: `${information.baseUrl}/jsonapi`, + url: `${information.baseUrl}/organization/save`, data: { - data: { - type: 'organization', - attributes: { - name: '${name}' - } - } + name: '${name}', }, - headers: { - 'Content-Type': 'application/vnd.api+json' - } }, body: [ { @@ -60,7 +52,7 @@ onMounted(() => { page: { size: '${perPage|default:undefined}', number: '${page|default:undefined}', - } + }, }, }, columns: [ diff --git a/pom.xml b/pom.xml index f61283a..e41c934 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 3.4.0 2024.0.0 5.8.32 - 7.1.4 + 1.6.3 @@ -45,7 +45,12 @@ com.yahoo.elide elide-spring-boot-starter - ${elide.version} + 7.1.4 + + + com.blinkfox + fenix-spring-boot-starter + 3.0.0 @@ -53,6 +58,15 @@ hutool-all ${hutool.version} + + org.projectlombok + lombok + + + org.mapstruct + mapstruct + ${mapstruct.version} + com.mysql @@ -62,10 +76,6 @@ com.h2database h2 - - org.projectlombok - lombok - @@ -90,6 +100,33 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.12.1 + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + -Amapstruct.defaultComponentModel=spring + -Amapstruct.defaultInjectionStrategy=constructor + + + org.springframework.boot spring-boot-build diff --git a/src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java b/src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java index bfed158..2ab1fee 100644 --- a/src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java +++ b/src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java @@ -1,10 +1,13 @@ package com.lanyuanxiaoyao.server; +import com.blinkfox.fenix.EnableFenix; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -13,6 +16,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; * @since 2025-03-03 */ @Slf4j +@EnableFenix +@EnableConfigurationProperties @SpringBootApplication public class ServerApplication { public static void main(String[] args) { diff --git a/src/main/java/com/lanyuanxiaoyao/server/controller/OrganizationController.java b/src/main/java/com/lanyuanxiaoyao/server/controller/OrganizationController.java new file mode 100644 index 0000000..7df8636 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/controller/OrganizationController.java @@ -0,0 +1,25 @@ +package com.lanyuanxiaoyao.server.controller; + +import com.lanyuanxiaoyao.server.controller.base.AbstractController; +import com.lanyuanxiaoyao.server.entity.Organization; +import com.lanyuanxiaoyao.server.service.OrganizationService; +import com.lanyuanxiaoyao.server.service.base.AbstractService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequestMapping("organization") +public class OrganizationController extends AbstractController { + private final OrganizationService organizationService; + + public OrganizationController(OrganizationService organizationService) { + this.organizationService = organizationService; + } + + @Override + public AbstractService getService() { + return organizationService; + } +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/controller/base/AbstractController.java b/src/main/java/com/lanyuanxiaoyao/server/controller/base/AbstractController.java new file mode 100644 index 0000000..280dd48 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/controller/base/AbstractController.java @@ -0,0 +1,14 @@ +package com.lanyuanxiaoyao.server.controller.base; + +import com.lanyuanxiaoyao.server.service.base.AbstractService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +public abstract class AbstractController { + public abstract AbstractService getService(); + + @PostMapping("save") + public ID save(@RequestBody ENTITY entity) { + return getService().save(entity); + } +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/Organization.java b/src/main/java/com/lanyuanxiaoyao/server/entity/Organization.java index 1dfc07b..a305a10 100644 --- a/src/main/java/com/lanyuanxiaoyao/server/entity/Organization.java +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/Organization.java @@ -37,4 +37,12 @@ public class Organization { @OneToMany(fetch = FetchType.LAZY, mappedBy = "organization") @ToString.Exclude private Set departments; + + @Getter + @Setter + @ToString + public static final class SaveVO { + private Long id; + private String name; + } } diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/DepartmentMapper.java b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/DepartmentMapper.java new file mode 100644 index 0000000..82a3188 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/DepartmentMapper.java @@ -0,0 +1,27 @@ +package com.lanyuanxiaoyao.server.entity.mapper; + +import com.lanyuanxiaoyao.server.entity.Department; +import com.lanyuanxiaoyao.server.entity.mapper.qualifier.DepartmentQualifier; +import com.lanyuanxiaoyao.server.entity.mapper.qualifier.OrganizationQualifier; +import com.lanyuanxiaoyao.server.entity.vo.DepartmentSaveVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +/** + * 部门bean转换 + * + * @author lanyuanxiaoyao + * @version 20250327 + */ +@Mapper( + uses = { + OrganizationQualifier.class, + DepartmentQualifier.class, + } +) +public abstract class DepartmentMapper implements EntityMapper { + @Mapping(target = "organization", source = "organizationId") + @Mapping(target = "parent", source = "parentId") + @Override + public abstract Department fromVO(DepartmentSaveVO saveVO); +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/EntityMapper.java b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/EntityMapper.java new file mode 100644 index 0000000..4a0418e --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/EntityMapper.java @@ -0,0 +1,5 @@ +package com.lanyuanxiaoyao.server.entity.mapper; + +interface EntityMapper { + SE fromVO(CE creationVO); +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/OrganizationMapper.java b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/OrganizationMapper.java new file mode 100644 index 0000000..d0f6535 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/OrganizationMapper.java @@ -0,0 +1,14 @@ +package com.lanyuanxiaoyao.server.entity.mapper; + +import com.lanyuanxiaoyao.server.entity.Organization; +import org.mapstruct.Mapper; + +/** + * 组织bean转换 + * + * @author lanyuanxiaoyao + * @version 20250327 + */ +@Mapper +public interface OrganizationMapper extends EntityMapper { +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/DepartmentQualifier.java b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/DepartmentQualifier.java new file mode 100644 index 0000000..396996f --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/DepartmentQualifier.java @@ -0,0 +1,19 @@ +package com.lanyuanxiaoyao.server.entity.mapper.qualifier; + +import com.lanyuanxiaoyao.server.entity.Department; +import com.lanyuanxiaoyao.server.repository.DepartmentRepository; +import org.springframework.stereotype.Component; + +@Component +public class DepartmentQualifier implements EntityQualifier { + private final DepartmentRepository departmentRepository; + + public DepartmentQualifier(DepartmentRepository departmentRepository) { + this.departmentRepository = departmentRepository; + } + + @Override + public Department get(Long id) { + return departmentRepository.getReferenceById(id); + } +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/EntityQualifier.java b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/EntityQualifier.java new file mode 100644 index 0000000..043ffc6 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/EntityQualifier.java @@ -0,0 +1,5 @@ +package com.lanyuanxiaoyao.server.entity.mapper.qualifier; + +public interface EntityQualifier { + E get(ID id); +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/OrganizationQualifier.java b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/OrganizationQualifier.java new file mode 100644 index 0000000..0108243 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/mapper/qualifier/OrganizationQualifier.java @@ -0,0 +1,19 @@ +package com.lanyuanxiaoyao.server.entity.mapper.qualifier; + +import com.lanyuanxiaoyao.server.entity.Organization; +import com.lanyuanxiaoyao.server.repository.OrganizationRepository; +import org.springframework.stereotype.Component; + +@Component +public class OrganizationQualifier implements EntityQualifier { + private final OrganizationRepository organizationRepository; + + public OrganizationQualifier(OrganizationRepository organizationRepository) { + this.organizationRepository = organizationRepository; + } + + @Override + public Organization get(Long id) { + return organizationRepository.getReferenceById(id); + } +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/entity/vo/DepartmentSaveVO.java b/src/main/java/com/lanyuanxiaoyao/server/entity/vo/DepartmentSaveVO.java new file mode 100644 index 0000000..b8967e0 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/entity/vo/DepartmentSaveVO.java @@ -0,0 +1,15 @@ +package com.lanyuanxiaoyao.server.entity.vo; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class DepartmentSaveVO { + private Long id; + private String name; + private Long organizationId; + private Long parentId; +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/repository/DepartmentRepository.java b/src/main/java/com/lanyuanxiaoyao/server/repository/DepartmentRepository.java new file mode 100644 index 0000000..203be7e --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/repository/DepartmentRepository.java @@ -0,0 +1,10 @@ +package com.lanyuanxiaoyao.server.repository; + +import com.blinkfox.fenix.jpa.FenixJpaRepository; +import com.blinkfox.fenix.specification.FenixJpaSpecificationExecutor; +import com.lanyuanxiaoyao.server.entity.Department; +import org.springframework.stereotype.Repository; + +@Repository +public interface DepartmentRepository extends FenixJpaRepository, FenixJpaSpecificationExecutor { +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/repository/OrganizationRepository.java b/src/main/java/com/lanyuanxiaoyao/server/repository/OrganizationRepository.java new file mode 100644 index 0000000..4a3ef2a --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/repository/OrganizationRepository.java @@ -0,0 +1,12 @@ +package com.lanyuanxiaoyao.server.repository; + +import com.blinkfox.fenix.jpa.FenixJpaRepository; +import com.blinkfox.fenix.specification.FenixJpaSpecificationExecutor; +import com.lanyuanxiaoyao.server.entity.Organization; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrganizationRepository extends FenixJpaRepository, FenixJpaSpecificationExecutor { + @Override + Organization getReferenceById(Long aLong); +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/service/OrganizationService.java b/src/main/java/com/lanyuanxiaoyao/server/service/OrganizationService.java new file mode 100644 index 0000000..8c357be --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/service/OrganizationService.java @@ -0,0 +1,23 @@ +package com.lanyuanxiaoyao.server.service; + +import com.lanyuanxiaoyao.server.entity.Organization; +import com.lanyuanxiaoyao.server.repository.OrganizationRepository; +import com.lanyuanxiaoyao.server.service.base.AbstractService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class OrganizationService extends AbstractService { + private final OrganizationRepository organizationRepository; + + public OrganizationService(OrganizationRepository organizationRepository) { + this.organizationRepository = organizationRepository; + } + + @Override + public Long save(Organization organization) { + Organization save = organizationRepository.saveOrUpdateByNotNullProperties(organization); + return save.getId(); + } +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/service/base/AbstractService.java b/src/main/java/com/lanyuanxiaoyao/server/service/base/AbstractService.java new file mode 100644 index 0000000..bd72034 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/service/base/AbstractService.java @@ -0,0 +1,5 @@ +package com.lanyuanxiaoyao.server.service.base; + +public abstract class AbstractService { + public abstract ID save(ENTITY entity); +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 77931ef..0299f6d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -28,4 +28,6 @@ logging: datastores: jpql: query: - DefaultQueryLogger: debug \ No newline at end of file + DefaultQueryLogger: debug +fenix: + print-banner: false \ No newline at end of file