diff --git a/luoo_common/pom.xml b/luoo_common/pom.xml
index 29f00aa..5ec1ed9 100644
--- a/luoo_common/pom.xml
+++ b/luoo_common/pom.xml
@@ -41,5 +41,19 @@
jedis
3.7.0
+
+
+ org.mapstruct
+ mapstruct
+ 1.4.2.Final
+
+
+ org.mapstruct
+ mapstruct-processor
+ 1.4.2.Final
+ provided
+
+
+
diff --git a/luoo_user/pom.xml b/luoo_user/pom.xml
index 3789860..2cfbc1a 100644
--- a/luoo_user/pom.xml
+++ b/luoo_user/pom.xml
@@ -203,6 +203,23 @@
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+ 1.8
+
+
+ org.mapstruct
+ mapstruct-processor
+ 1.4.2.Final
+
+
+
+
diff --git a/luoo_user/src/main/java/com/luoo/user/UserApplication.java b/luoo_user/src/main/java/com/luoo/user/UserApplication.java
index 4aaa3a4..402ffdb 100644
--- a/luoo_user/src/main/java/com/luoo/user/UserApplication.java
+++ b/luoo_user/src/main/java/com/luoo/user/UserApplication.java
@@ -1,5 +1,6 @@
package com.luoo.user;
+import com.luoo.user.listener.JPAEntityListener;
import com.spring4all.mongodb.EnableMongoPlus;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
@@ -47,6 +48,10 @@ public class UserApplication {
env.getProperty("server.port"));
}
+ @Bean
+ public JPAEntityListener jpaEntityListener() {
+ return new JPAEntityListener();
+ }
@Bean
public IdWorker idWorkker(){
return new IdWorker(1, 1);
@@ -66,4 +71,5 @@ public class UserApplication {
public RedisLockUtil redisLockUtil() {
return new RedisLockUtil();
}
+
}
diff --git a/luoo_user/src/main/java/com/luoo/user/config/JPABasePojo.java b/luoo_user/src/main/java/com/luoo/user/config/JPABasePojo.java
new file mode 100644
index 0000000..23cd54f
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/config/JPABasePojo.java
@@ -0,0 +1,71 @@
+package com.luoo.user.config;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.luoo.user.listener.JPAEntityListener;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.Where;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @program: luoo_parent
+ * @description: jpa默认基类
+ * @author: yawei.huang
+ * @create: 2024-08-08 13:29
+ **/
+@Getter
+@Setter
+@MappedSuperclass
+@EntityListeners(JPAEntityListener.class)
+public abstract class JPABasePojo implements Serializable {
+
+ private static final long serialVersionUID = -4451172429717455614L;
+
+ @Id
+ @Column(name = "id", nullable = false)
+ @ApiModelProperty(value = "id")
+ private String id;
+
+ @Size(max = 20)
+ @Column(name = "create_user", length = 20, updatable = false)
+ @ApiModelProperty(value = "创建人")
+ private String createUser;
+
+ @Size(max = 20)
+ @Column(name = "update_user", length = 20)
+ @ApiModelProperty(value = "更新人")
+ private String updateUser;
+
+ @Column(name = "create_user_name", updatable = false)
+ @ApiModelProperty(value = "创建人姓名")
+ private String createUserName;
+
+ @Column(name = "update_user_name")
+ @ApiModelProperty(value = "更新人姓名")
+ private String updateUserName;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("创建时间")
+ @Column(name = "create_time", updatable = false)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("修改时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime updateTime;
+
+ @Column(name = "del_flag")
+ @ApiModelProperty(value = "是否删除 0-未删除 2-已删除")
+ private Integer delFlag;
+
+}
diff --git a/luoo_user/src/main/java/com/luoo/user/controller/StoreController.java b/luoo_user/src/main/java/com/luoo/user/controller/StoreController.java
new file mode 100644
index 0000000..31afbc1
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/controller/StoreController.java
@@ -0,0 +1,68 @@
+package com.luoo.user.controller;
+
+import annotation.GlobalInterceptor;
+import api.Result;
+import com.luoo.user.dto.store.StoreAddDto;
+import com.luoo.user.dto.store.StoreUpdateDto;
+import com.luoo.user.pojo.Store;
+import com.luoo.user.service.StoreService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @program: luoo_parent
+ * @description: 门店
+ * @author: yawei.huang
+ * @create: 2024-08-08 14:28
+ **/
+@Api(tags = "门店模块")
+@RestController
+@CrossOrigin
+@RequestMapping("/store")
+public class StoreController {
+
+ @Autowired
+ private StoreService storeService;
+
+ @RequestMapping("/list")
+ @GlobalInterceptor(checkAdminLogin = true)
+ public Result> getStoreList() {
+ return Result.success(storeService.findAll());
+ }
+
+ @RequestMapping("/get")
+ public Result getStore(String id) {
+ return Result.success(storeService.getOne(id));
+ }
+
+ @RequestMapping("/add")
+ @GlobalInterceptor(checkAdminLogin = true)
+ public Result addStore(StoreAddDto storeAddDto) {
+ Store store = new Store();
+ BeanUtils.copyProperties(storeAddDto, store);
+ storeService.add(store);
+ return Result.success();
+ }
+
+ @RequestMapping("/update")
+ @GlobalInterceptor(checkAdminLogin = true)
+ public Result updateStore(StoreUpdateDto storeUpdateDto) {
+
+ storeService.update(storeUpdateDto);
+ return Result.success();
+ }
+
+ @RequestMapping("/delete")
+ @GlobalInterceptor(checkAdminLogin = true)
+ public Result deleteStore(String id) {
+ storeService.delete(id);
+ return Result.success();
+ }
+
+}
diff --git a/luoo_user/src/main/java/com/luoo/user/dao/StoreDao.java b/luoo_user/src/main/java/com/luoo/user/dao/StoreDao.java
new file mode 100644
index 0000000..ea5e473
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/dao/StoreDao.java
@@ -0,0 +1,9 @@
+package com.luoo.user.dao;
+
+import com.luoo.user.pojo.Store;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface StoreDao extends JpaRepository , JpaSpecificationExecutor {
+
+}
\ No newline at end of file
diff --git a/luoo_user/src/main/java/com/luoo/user/dto/store/StoreAddDto.java b/luoo_user/src/main/java/com/luoo/user/dto/store/StoreAddDto.java
new file mode 100644
index 0000000..b64a6f5
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/dto/store/StoreAddDto.java
@@ -0,0 +1,57 @@
+package com.luoo.user.dto.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Value;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * DTO for {@link com.luoo.user.pojo.Store}
+ */
+@Value
+public class StoreAddDto implements Serializable {
+
+
+ private static final long serialVersionUID = -7780230858811570880L;
+
+ @ApiModelProperty(value = "门店名称")
+ String name;
+
+ @ApiModelProperty(value = "区域id")
+ Integer regionId;
+
+ @ApiModelProperty(value = "门店地址")
+ String address;
+
+ @ApiModelProperty(value = "经度")
+ String lng;
+
+ @ApiModelProperty(value = "纬度")
+ String lat;
+
+ @ApiModelProperty(value = "门店联系人")
+ String contact;
+
+ @Column(name = "phone")
+ @ApiModelProperty(value = "门店电话")
+ String phone;
+
+ @Column(name = "tel")
+ @ApiModelProperty(value = "门店电话")
+ String tel;
+
+ @Column(name = "opening_hours")
+ @ApiModelProperty(value = "营业时间")
+ String openingHours;
+
+ @Column(name = "background")
+ @ApiModelProperty(value = "门店背景图")
+ String background;
+
+ @ApiModelProperty(value = "门店介绍")
+ String description;
+}
\ No newline at end of file
diff --git a/luoo_user/src/main/java/com/luoo/user/dto/store/StoreSearchDto.java b/luoo_user/src/main/java/com/luoo/user/dto/store/StoreSearchDto.java
new file mode 100644
index 0000000..bc01627
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/dto/store/StoreSearchDto.java
@@ -0,0 +1,56 @@
+package com.luoo.user.dto.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Value;
+
+import javax.persistence.Column;
+import java.io.Serializable;
+
+/**
+ * DTO for {@link com.luoo.user.pojo.Store}
+ */
+@Value
+public class StoreSearchDto implements Serializable {
+
+ private static final long serialVersionUID = -4348467275178028461L;
+
+ @ApiModelProperty(value = "id")
+ String id;
+
+ @ApiModelProperty(value = "门店名称")
+ String name;
+
+ @ApiModelProperty(value = "区域id")
+ Integer regionId;
+
+ @ApiModelProperty(value = "门店地址")
+ String address;
+
+ @ApiModelProperty(value = "经度")
+ String lng;
+
+ @ApiModelProperty(value = "纬度")
+ String lat;
+
+ @ApiModelProperty(value = "门店联系人")
+ String contact;
+
+ @Column(name = "phone")
+ @ApiModelProperty(value = "门店电话")
+ String phone;
+
+ @Column(name = "tel")
+ @ApiModelProperty(value = "门店电话")
+ String tel;
+
+ @Column(name = "opening_hours")
+ @ApiModelProperty(value = "营业时间")
+ String openingHours;
+
+ @Column(name = "background")
+ @ApiModelProperty(value = "门店背景图")
+ String background;
+
+ @ApiModelProperty(value = "门店介绍")
+ String description;
+}
\ No newline at end of file
diff --git a/luoo_user/src/main/java/com/luoo/user/dto/store/StoreUpdateDto.java b/luoo_user/src/main/java/com/luoo/user/dto/store/StoreUpdateDto.java
new file mode 100644
index 0000000..71fc1cf
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/dto/store/StoreUpdateDto.java
@@ -0,0 +1,57 @@
+package com.luoo.user.dto.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Value;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+/**
+ * DTO for {@link com.luoo.user.pojo.Store}
+ */
+@Value
+public class StoreUpdateDto implements Serializable {
+
+ private static final long serialVersionUID = -4348467275178028461L;
+
+ @ApiModelProperty(value = "id")
+ String id;
+
+ @ApiModelProperty(value = "门店名称")
+ String name;
+
+ @ApiModelProperty(value = "区域id")
+ Integer regionId;
+
+ @ApiModelProperty(value = "门店地址")
+ String address;
+
+ @ApiModelProperty(value = "经度")
+ String lng;
+
+ @ApiModelProperty(value = "纬度")
+ String lat;
+
+ @ApiModelProperty(value = "门店联系人")
+ String contact;
+
+ @Column(name = "phone")
+ @ApiModelProperty(value = "门店电话")
+ String phone;
+
+ @Column(name = "tel")
+ @ApiModelProperty(value = "门店电话")
+ String tel;
+
+ @Column(name = "opening_hours")
+ @ApiModelProperty(value = "营业时间")
+ String openingHours;
+
+ @Column(name = "background")
+ @ApiModelProperty(value = "门店背景图")
+ String background;
+
+ @ApiModelProperty(value = "门店介绍")
+ String description;
+}
\ No newline at end of file
diff --git a/luoo_user/src/main/java/com/luoo/user/listener/JPAEntityListener.java b/luoo_user/src/main/java/com/luoo/user/listener/JPAEntityListener.java
new file mode 100644
index 0000000..ceb27a4
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/listener/JPAEntityListener.java
@@ -0,0 +1,77 @@
+package com.luoo.user.listener;
+
+import com.luoo.user.config.JPABasePojo;
+import dto.UserLoginDto;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.stereotype.Component;
+import util.IdWorker;
+import util.JwtUtil;
+
+import javax.annotation.PostConstruct;
+import javax.persistence.PrePersist;
+import javax.persistence.PreRemove;
+import javax.persistence.PreUpdate;
+import java.time.LocalDateTime;
+
+/**
+ * @program: luoo_parent
+ * @description: jpa监听
+ * @author: yawei.huang
+ * @create: 2024-08-08 13:35
+ **/
+@Configurable
+@Slf4j
+public class JPAEntityListener {
+
+ private static JwtUtil jwtUtilStatic;
+ private static IdWorker idWorkerStatic;
+
+ @Autowired
+ private JwtUtil jwtUtil;
+
+ @Autowired
+ private IdWorker idWorker;
+
+ @PostConstruct
+ public void init() {
+ jwtUtilStatic = this.jwtUtil;
+ idWorkerStatic = this.idWorker;
+ }
+
+
+ @PrePersist
+ public void setCreatedOn(JPABasePojo jpaBasePojo) {
+ log.info("Setting created on {}", jpaBasePojo);
+ jpaBasePojo.setCreateUser(getCurrentUser().getUserId());
+ jpaBasePojo.setUpdateUser(getCurrentUser().getUserId());
+ jpaBasePojo.setCreateUserName(getCurrentUser().getNickName());
+ jpaBasePojo.setUpdateUserName(getCurrentUser().getNickName());
+ jpaBasePojo.setCreateTime(LocalDateTime.now());
+ jpaBasePojo.setUpdateTime(LocalDateTime.now());
+ jpaBasePojo.setId(String.valueOf(idWorkerStatic.nextId()));
+ jpaBasePojo.setDelFlag(0); // 默认未删除
+ }
+
+ @PreUpdate
+ public void setUpdatedOn(JPABasePojo jpaBasePojo) {
+ log.info("Setting updated on {}", jpaBasePojo);
+ jpaBasePojo.setUpdateUser(getCurrentUser().getUserId());
+ jpaBasePojo.setUpdateUserName(getCurrentUser().getNickName());
+ jpaBasePojo.setUpdateTime(LocalDateTime.now());
+ }
+
+ @PreRemove
+ public void setDeletedOn(JPABasePojo jpaBasePojo) {
+ log.info("Setting deleted on {}", jpaBasePojo);
+ jpaBasePojo.setUpdateUser(getCurrentUser().getUserId());
+ jpaBasePojo.setUpdateUserName(getCurrentUser().getNickName());
+ jpaBasePojo.setUpdateTime(LocalDateTime.now());
+ jpaBasePojo.setDelFlag(2); // 默认已删除
+ }
+
+ private UserLoginDto getCurrentUser() {
+ return jwtUtilStatic.getUser();
+ }
+}
diff --git a/luoo_user/src/main/java/com/luoo/user/mapstruct/StoreMapper.java b/luoo_user/src/main/java/com/luoo/user/mapstruct/StoreMapper.java
new file mode 100644
index 0000000..679c504
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/mapstruct/StoreMapper.java
@@ -0,0 +1,11 @@
+package com.luoo.user.mapstruct;
+
+import com.luoo.user.dto.store.StoreUpdateDto;
+import com.luoo.user.pojo.Store;
+import org.mapstruct.*;
+
+@Mapper(componentModel = "spring")
+public interface StoreMapper {
+
+ void updateStoreFromDto(StoreUpdateDto dto, @MappingTarget Store entity);
+}
\ No newline at end of file
diff --git a/luoo_user/src/main/java/com/luoo/user/pojo/Store.java b/luoo_user/src/main/java/com/luoo/user/pojo/Store.java
new file mode 100644
index 0000000..60c114f
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/pojo/Store.java
@@ -0,0 +1,79 @@
+package com.luoo.user.pojo;
+
+import com.luoo.user.config.JPABasePojo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import javax.validation.constraints.Size;
+
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Entity
+@DynamicUpdate
+@Where(clause = "del_flag = 0")
+@Table(name = "tb_store")
+public class Store extends JPABasePojo {
+
+ private static final long serialVersionUID = 1257837134734167416L;
+
+ @Size(max = 255)
+ @Column(name = "name")
+ @ApiModelProperty(value = "门店名称")
+ private String name;
+
+ @Column(name = "region_id")
+ @ApiModelProperty(value = "区域id")
+ private Integer regionId;
+
+ @Size(max = 255)
+ @Column(name = "address")
+ @ApiModelProperty(value = "门店地址")
+ private String address;
+
+ @Size(max = 100)
+ @Column(name = "lng", length = 100)
+ @ApiModelProperty(value = "经度")
+ private String lng;
+
+ @Size(max = 100)
+ @Column(name = "lat", length = 100)
+ @ApiModelProperty(value = "纬度")
+ private String lat;
+
+ @Size(max = 255)
+ @Column(name = "contact")
+ @ApiModelProperty(value = "门店联系人")
+ private String contact;
+
+ @Size(max = 255)
+ @Column(name = "phone")
+ @ApiModelProperty(value = "门店电话")
+ private String phone;
+
+ @Size(max = 255)
+ @Column(name = "tel")
+ @ApiModelProperty(value = "门店电话")
+ private String tel;
+
+ @Size(max = 255)
+ @Column(name = "opening_hours")
+ @ApiModelProperty(value = "营业时间")
+ private String openingHours;
+
+ @Size(max = 255)
+ @Column(name = "background")
+ @ApiModelProperty(value = "门店背景图")
+ private String background;
+
+ @Lob
+ @Column(name = "description")
+ @ApiModelProperty(value = "门店介绍")
+ private String description;
+
+}
\ No newline at end of file
diff --git a/luoo_user/src/main/java/com/luoo/user/service/StoreService.java b/luoo_user/src/main/java/com/luoo/user/service/StoreService.java
new file mode 100644
index 0000000..d679858
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/service/StoreService.java
@@ -0,0 +1,64 @@
+package com.luoo.user.service;
+
+import com.luoo.user.dao.StoreDao;
+import com.luoo.user.dto.store.StoreUpdateDto;
+import com.luoo.user.mapstruct.StoreMapper;
+import com.luoo.user.pojo.Store;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import util.IdWorker;
+
+import java.util.List;
+
+/**
+ * @program: luoo_parent
+ * @description: 门店业务
+ * @author: yawei.huang
+ * @create: 2024-08-08 14:20
+ **/
+@Service
+@Slf4j
+public class StoreService {
+
+ private final StoreDao storeDao;
+
+ private final StoreMapper storeMapper;
+
+ public StoreService(StoreDao storeDao, StoreMapper storeMapper) {
+ this.storeDao = storeDao;
+ this.storeMapper = storeMapper;
+ }
+
+ // 增删改查
+ @Transactional(rollbackFor = Exception.class)
+ public void add(Store store) {
+ storeDao.save(store);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void delete(String id) {
+ Store store = storeDao.findById(id).orElse(null);
+ store.setDelFlag(2);
+
+ storeDao.save(store);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void update(StoreUpdateDto storeUpdateDto) {
+ Store oldStore = storeDao.findById(storeUpdateDto.getId()).orElseThrow(() -> new RuntimeException("Store not found"));
+ storeMapper.updateStoreFromDto(storeUpdateDto, oldStore);
+ storeDao.save(oldStore);
+ }
+ public Store getOne(String id) {
+ return storeDao.findById(id).orElse(null);
+ }
+
+ // 列表页
+ public List findAll() {
+ return storeDao.findAll();
+ }
+
+}
diff --git a/luoo_user/src/main/java/com/luoo/user/vo/store/StoreAppVO.java b/luoo_user/src/main/java/com/luoo/user/vo/store/StoreAppVO.java
new file mode 100644
index 0000000..b9ce9d8
--- /dev/null
+++ b/luoo_user/src/main/java/com/luoo/user/vo/store/StoreAppVO.java
@@ -0,0 +1,57 @@
+package com.luoo.user.vo.store;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Value;
+
+import javax.persistence.Column;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * DTO for {@link com.luoo.user.pojo.Store}
+ */
+@Value
+public class StoreAppVO implements Serializable {
+
+ private static final long serialVersionUID = -8286907101582384522L;
+
+ @ApiModelProperty(value = "id")
+ String id;
+
+ @ApiModelProperty(value = "门店名称")
+ String name;
+
+ @ApiModelProperty(value = "区域id")
+ Integer regionId;
+
+ @ApiModelProperty(value = "门店地址")
+ String address;
+
+ @ApiModelProperty(value = "经度")
+ String lng;
+
+ @ApiModelProperty(value = "纬度")
+ String lat;
+
+ @ApiModelProperty(value = "门店联系人")
+ String contact;
+
+ @Column(name = "phone")
+ @ApiModelProperty(value = "门店电话")
+ String phone;
+
+ @Column(name = "tel")
+ @ApiModelProperty(value = "门店电话")
+ String tel;
+
+ @Column(name = "opening_hours")
+ @ApiModelProperty(value = "营业时间")
+ String openingHours;
+
+ @Column(name = "background")
+ @ApiModelProperty(value = "门店背景图")
+ String background;
+
+ @ApiModelProperty(value = "门店介绍")
+ String description;
+}
\ No newline at end of file