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