Browse Source

fix: 客户端游客登录/注册/点赞等功能 v1

liaoyitao 9 months ago
parent
commit
323c6d57b1

+ 5 - 0
pom.xml

@@ -153,6 +153,11 @@
153 153
             <artifactId>calcite-core</artifactId>
154 154
             <version>1.37.0</version>
155 155
         </dependency>
156
+        <dependency>
157
+            <groupId>cn.hutool</groupId>
158
+            <artifactId>hutool-all</artifactId>
159
+            <version>5.8.25</version>
160
+        </dependency>
156 161
 
157 162
     </dependencies>
158 163
 

+ 2 - 0
src/main/java/com/lqkj/link/config/WebSecurityConfig.java

@@ -38,6 +38,8 @@ public class WebSecurityConfig {
38 38
                         .requestMatchers(
39 39
                                 "/jwt/token",
40 40
                                 "/jwt/getAdminToken",
41
+                                "jwt/getGuestToken",
42
+                                "/user/manage/register",
41 43
                                 "/encrypt/**",
42 44
                                 "/swagger-ui.html",
43 45
                                 "/swagger-ui/**",

+ 24 - 1
src/main/java/com/lqkj/link/module/authority/controller/UserInfoController.java

@@ -22,7 +22,7 @@ import org.springframework.web.multipart.MultipartFile;
22 22
 
23 23
 import java.util.ArrayList;
24 24
 import java.util.List;
25
-import java.util.Map;
25
+import java.util.Objects;
26 26
 
27 27
 import static com.lqkj.link.APIVersion.VERSION_V1;
28 28
 
@@ -194,4 +194,27 @@ public class UserInfoController {
194 194
         userInfoService.resourceRefreshed(userCode);
195 195
         return MessageBean.ok(null, "更新用户刷新资源状态");
196 196
     }
197
+
198
+    @Operation(
199
+            summary = "注册用户接口",
200
+            description = "注册用户接口",
201
+            requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
202
+                    description = "用户实体",
203
+                    required = true,
204
+                    content = @Content(
205
+                            mediaType = "application/json",
206
+                            schema = @Schema(implementation = UserInfo.class)
207
+                    )
208
+            )
209
+    )
210
+    @PostMapping("/manage/register")
211
+    public MessageBean register(@RequestBody UserInfo userInfo, HttpServletRequest request) {
212
+        String authHeader = request.getHeader("Authorization");
213
+        String userCode = null;
214
+        if (Objects.nonNull(authHeader)){
215
+             userCode = jwtService.decryptUsernameWithHeader(authHeader);
216
+        }
217
+        userInfoService.register(userInfo, false, userCode);
218
+        return MessageBean.ok(null, "保存用户接口");
219
+    }
197 220
 }

+ 7 - 0
src/main/java/com/lqkj/link/module/authority/service/DatabaseUserDetailService.java

@@ -1,8 +1,11 @@
1 1
 package com.lqkj.link.module.authority.service;
2 2
 
3
+import cn.hutool.core.util.RandomUtil;
3 4
 import com.lqkj.link.module.authority.domain.UserInfo;
4 5
 import com.lqkj.link.module.authority.repository.UserInfoRepository;
6
+import com.lqkj.link.module.jwt.service.JwtService;
5 7
 import com.lqkj.link.util.RSAUtils;
8
+import org.springframework.context.annotation.Lazy;
6 9
 import org.springframework.transaction.annotation.Transactional;
7 10
 import org.springframework.security.core.userdetails.UserDetails;
8 11
 import org.springframework.security.core.userdetails.UserDetailsService;
@@ -11,11 +14,15 @@ import org.springframework.stereotype.Service;
11 14
 
12 15
 import java.util.Date;
13 16
 
17
+
14 18
 @Service
15 19
 public class DatabaseUserDetailService implements UserDetailsService {
16 20
 
17 21
     private final UserInfoRepository userInfoRepository;
18 22
 
23
+
24
+
25
+
19 26
     public DatabaseUserDetailService(UserInfoRepository userInfoRepository) {
20 27
         this.userInfoRepository = userInfoRepository;
21 28
     }

+ 89 - 0
src/main/java/com/lqkj/link/module/authority/service/UserInfoService.java

@@ -1,9 +1,12 @@
1 1
 package com.lqkj.link.module.authority.service;
2 2
 
3
+import cn.hutool.core.util.RandomUtil;
3 4
 import com.lqkj.link.module.authority.domain.UserInfo;
4 5
 import com.lqkj.link.module.authority.repository.RoleInfoRepository;
5 6
 import com.lqkj.link.module.authority.repository.UserInfoRepository;
7
+import com.lqkj.link.util.RSAUtils;
6 8
 import jakarta.annotation.PostConstruct;
9
+import org.bouncycastle.jcajce.PKIXCertRevocationCheckerParameters;
7 10
 import org.springframework.transaction.annotation.Transactional;
8 11
 import org.apache.commons.lang3.StringUtils;
9 12
 import org.springframework.data.domain.Page;
@@ -28,6 +31,27 @@ public class UserInfoService {
28 31
         this.roleInfoRepository = roleInfoRepository;
29 32
     }
30 33
 
34
+    /**
35
+     * 游客登录
36
+     * @return
37
+     */
38
+    @Transactional
39
+    public String getGuestToken() {
40
+        UserInfo guestUser = new UserInfo();
41
+        guestUser.setUserCode(RandomUtil.randomNumbers(8));
42
+        guestUser.setDisplayName("游客");
43
+        if (userInfoRepository.findByUserCode(guestUser.getUserCode()) != null){
44
+            throw new RuntimeException("当前体验人数较多,请稍后重试!");
45
+        }
46
+        guestUser.setPassword(passwordEncoder.encode("88888888"));
47
+        guestUser.setHasAuth(false);
48
+        guestUser.setHasManage(false);
49
+        guestUser.setLocking(false);
50
+        guestUser.setRefreshResource(false);
51
+        register(guestUser, true, null);
52
+        return guestUser.getUserCode();
53
+    }
54
+
31 55
     @PostConstruct
32 56
     public void initSuperUser() {
33 57
         if (!userInfoRepository.existsById(1)) {
@@ -176,4 +200,69 @@ public class UserInfoService {
176 200
     public void resourceRefreshed(String userCode) {
177 201
         userInfoRepository.resourceRefreshed();
178 202
     }
203
+
204
+    /**
205
+     * 注册
206
+     * @param userInfo
207
+     */
208
+    @Transactional
209
+    public void register(UserInfo userInfo, boolean isGuest, String userCode) {
210
+        if (!isGuest){
211
+            userInfo.setUserCode(RSAUtils.decryptBase64(userInfo.getUserCode()));
212
+            if (StringUtils.isNotBlank(userInfo.getPassword()) && userInfo.getPassword().length() == 172) {
213
+                userInfo.setPassword(RSAUtils.decryptBase64(userInfo.getPassword()));
214
+            }
215
+            checkerParameters(userInfo.getUserCode(), userInfo.getPassword());
216
+            assemblyParameter(userInfo, userCode);
217
+        }
218
+        userInfoRepository.save(userInfo);
219
+
220
+    }
221
+
222
+    /**
223
+     * 组装参数
224
+     * @param userInfo
225
+     * @param userCode
226
+     */
227
+    private void assemblyParameter(UserInfo userInfo, String userCode) {
228
+        if (Objects.nonNull(userCode)){
229
+            UserInfo guestUser = userInfoRepository.findByUserCode(userCode);
230
+            userInfo.setUserId(guestUser.getUserId());
231
+            userInfo.setDisplayName(userInfo.getUserCode());
232
+            userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
233
+        }else {
234
+            userInfo.setLocking(false);
235
+            userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
236
+            userInfo.setUpdateTime(new Date());
237
+            userInfo.setRefreshResource(false);
238
+            userInfo.setHasAuth(false);
239
+            userInfo.setDisplayName(userInfo.getUserCode());
240
+            userInfo.setHasManage(false);
241
+            userInfo.setUpdateTime(new Date());
242
+            userInfo.setLocking(false);
243
+        }
244
+    }
245
+    /**
246
+     * 验证参数
247
+     * @param userCode 用户账号
248
+     * @param password 用户密码
249
+     */
250
+    private void checkerParameters(String userCode, String password) {
251
+        if (StringUtils.isBlank(userCode)) {
252
+            throw new RuntimeException("账号不能为空!");
253
+        }
254
+        if (StringUtils.isBlank(password)) {
255
+            throw new RuntimeException("密码不能为空!");
256
+        }
257
+        if (userInfoRepository.hasSameUserCode(userCode)) {
258
+            throw new RuntimeException("该手机号已被注册!");
259
+        }
260
+        if (userCode.matches("^1[3-9]\\\\d{9}$")){
261
+            throw new RuntimeException("请输入正确的手机号!");
262
+        }
263
+        if (password.matches("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,16}$")){
264
+            throw new RuntimeException("密码必须是8-16位数字、大写字母、小写字母!");
265
+        }
266
+
267
+    }
179 268
 }

+ 21 - 4
src/main/java/com/lqkj/link/module/jwt/controller/JwtController.java

@@ -1,6 +1,7 @@
1 1
 package com.lqkj.link.module.jwt.controller;
2 2
 
3 3
 import com.lqkj.link.message.MessageBean;
4
+import com.lqkj.link.module.authority.service.UserInfoService;
4 5
 import com.lqkj.link.module.jwt.service.JwtService;
5 6
 import com.lqkj.link.module.authority.domain.LoginBody;
6 7
 import com.lqkj.link.module.authority.domain.UserInfo;
@@ -11,11 +12,11 @@ import io.swagger.v3.oas.annotations.media.Content;
11 12
 import io.swagger.v3.oas.annotations.media.Schema;
12 13
 import io.swagger.v3.oas.annotations.tags.Tag;
13 14
 import jakarta.servlet.http.HttpServletRequest;
15
+import org.checkerframework.checker.units.qual.A;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.context.annotation.Lazy;
14 18
 import org.springframework.security.crypto.password.PasswordEncoder;
15
-import org.springframework.web.bind.annotation.PostMapping;
16
-import org.springframework.web.bind.annotation.RequestBody;
17
-import org.springframework.web.bind.annotation.RequestMapping;
18
-import org.springframework.web.bind.annotation.RestController;
19
+import org.springframework.web.bind.annotation.*;
19 20
 
20 21
 @RestController
21 22
 @RequestMapping("/jwt")
@@ -23,9 +24,13 @@ import org.springframework.web.bind.annotation.RestController;
23 24
 public class JwtController {
24 25
 
25 26
     private final DatabaseUserDetailService userDetailService;
27
+
26 28
     private final JwtService jwtService;
27 29
     private final PasswordEncoder passwordEncoder;
28 30
 
31
+    @Autowired
32
+    private UserInfoService userInfoService;
33
+
29 34
     public JwtController(DatabaseUserDetailService userDetailService, JwtService jwtService, PasswordEncoder passwordEncoder) {
30 35
         this.userDetailService = userDetailService;
31 36
         this.jwtService = jwtService;
@@ -93,4 +98,16 @@ public class JwtController {
93 98
     public MessageBean<String> getAdminToken() {
94 99
         return MessageBean.ok(jwtService.generateToken("meta-link"), "登录");
95 100
     }
101
+
102
+
103
+    @Operation(
104
+            summary = "游客登录",
105
+            description = "游客登录"
106
+    )
107
+    @GetMapping("/getGuestToken")
108
+    public MessageBean<String> getGuestToken() {
109
+        String userCode = userInfoService.getGuestToken();
110
+        String token = jwtService.generateToken(userCode);
111
+        return MessageBean.ok(token, "登录");
112
+    }
96 113
 }

+ 36 - 0
src/main/java/com/lqkj/link/module/zone/controller/LikesInfoController.java

@@ -0,0 +1,36 @@
1
+package com.lqkj.link.module.zone.controller;
2
+
3
+import com.lqkj.link.message.MessageBean;
4
+import com.lqkj.link.module.zone.service.LikesInfoService;
5
+import io.swagger.v3.oas.annotations.Parameter;
6
+import io.swagger.v3.oas.annotations.tags.Tag;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.web.bind.annotation.PostMapping;
9
+import org.springframework.web.bind.annotation.RequestMapping;
10
+import org.springframework.web.bind.annotation.RestController;
11
+
12
+@RestController
13
+@RequestMapping("/likes")
14
+@Tag(name = "点赞", description = "点赞")
15
+public class LikesInfoController {
16
+
17
+    @Autowired
18
+    private LikesInfoService likesInfoService;
19
+
20
+    /**
21
+     * 作品点赞
22
+     *
23
+     * @param zoneId
24
+     * @param userCode
25
+     * @return
26
+     */
27
+    @PostMapping("/save")
28
+    public MessageBean save(@Parameter(name = "zoneId", description = "作品ID") Integer zoneId,
29
+                           @Parameter(name = "userCode", description = "用户ID") Integer userCode,
30
+                            @Parameter(name = "isLike", description = "是否点赞") Boolean isLike) {
31
+        likesInfoService.save(zoneId, userCode, isLike);
32
+        return MessageBean.ok(null, "点赞/取消点赞成功");
33
+    }
34
+
35
+
36
+}

+ 6 - 2
src/main/java/com/lqkj/link/module/zone/controller/ZoneInfoController.java

@@ -198,9 +198,13 @@ public class ZoneInfoController {
198 198
     @PostMapping("/" + VERSION_V1 + "/resourceCenter")
199 199
     public MessageBean<Page<Map<String, Object>>> resourceCenter(@RequestParam(required = false, defaultValue = "") String name,
200 200
                                                                  @RequestParam(required = false, defaultValue = "0") Integer searchType,
201
+                                                                 @RequestParam(required = false, defaultValue = "0") Integer orderType,
201 202
                                                                  @RequestParam(required = false, defaultValue = "0") Integer page,
202
-                                                                 @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
203
-        return MessageBean.ok(zoneInfoService.resourceCenter(name, searchType, page, pageSize), "资源中心");
203
+                                                                 @RequestParam(required = false, defaultValue = "10") Integer pageSize,
204
+                                                                 HttpServletRequest request) {
205
+        String authHeader = request.getHeader("Authorization");
206
+        String userCode = jwtService.decryptUsernameWithHeader(authHeader);
207
+        return MessageBean.ok(zoneInfoService.resourceCenter(name, searchType, page, pageSize, orderType, userCode), "资源中心");
204 208
     }
205 209
 
206 210
     @Operation(

+ 40 - 0
src/main/java/com/lqkj/link/module/zone/domain/LikesInfo.java

@@ -0,0 +1,40 @@
1
+package com.lqkj.link.module.zone.domain;
2
+
3
+import com.fasterxml.jackson.annotation.JsonFormat;
4
+import io.swagger.v3.oas.annotations.media.Schema;
5
+import jakarta.persistence.*;
6
+import lombok.AllArgsConstructor;
7
+import lombok.Getter;
8
+import lombok.NoArgsConstructor;
9
+import lombok.Setter;
10
+
11
+import java.util.Date;
12
+
13
+@Entity
14
+@Table(name = "likes")
15
+@Getter
16
+@Setter
17
+@NoArgsConstructor
18
+@AllArgsConstructor
19
+public class LikesInfo {
20
+
21
+    @Id
22
+    @Column(name = "id")
23
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
24
+    @Schema(description = "点赞ID")
25
+    private Integer id;
26
+
27
+    @Column(name = "user_id")
28
+    @Schema(description = "作者用户ID")
29
+    private Integer userId;
30
+
31
+    @Column(name = "zone_id")
32
+    @Schema(description = "区域/作品id")
33
+    private Integer zoneId;
34
+
35
+    @Column(name = "create_time")
36
+    @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
37
+    @Schema(description = "添加时间")
38
+    private Date createTime;
39
+
40
+}

+ 3 - 0
src/main/java/com/lqkj/link/module/zone/domain/ZoneInfo.java

@@ -59,4 +59,7 @@ public class ZoneInfo {
59 59
     private String templateFilePath;
60 60
     @Column(name = "template_use")
61 61
     private Integer templateUse;
62
+    @Column(name = "like_count")
63
+    @Schema(description = "点赞次数")
64
+    private Integer likeCount;
62 65
 }

+ 30 - 0
src/main/java/com/lqkj/link/module/zone/repository/LikesInfoRepository.java

@@ -0,0 +1,30 @@
1
+package com.lqkj.link.module.zone.repository;
2
+
3
+import com.lqkj.link.module.zone.domain.LikesInfo;
4
+import com.lqkj.link.module.zone.domain.ZoneInfo;
5
+import io.swagger.v3.oas.annotations.Parameter;
6
+import org.springframework.data.domain.Page;
7
+import org.springframework.data.domain.Pageable;
8
+import org.springframework.data.jpa.repository.JpaRepository;
9
+import org.springframework.data.jpa.repository.Modifying;
10
+import org.springframework.data.jpa.repository.Query;
11
+import org.springframework.data.repository.query.Param;
12
+import org.springframework.stereotype.Repository;
13
+
14
+import java.util.List;
15
+import java.util.Map;
16
+
17
+@Repository
18
+public interface LikesInfoRepository extends JpaRepository<LikesInfo, Integer> {
19
+
20
+    @Modifying
21
+    @Query(nativeQuery = true,
22
+            value = "delete from likes where user_id = :userId and zone_id = :zoneId"
23
+    )
24
+    void deleteByUserIdandZoneId(@Param("userId") Integer userId, @Param("zoneId") Integer zoneId);
25
+
26
+    @Query(nativeQuery = true,
27
+            value = "select count(*) > 0 from likes where user_id = :userId and zone_id = :zoneId"
28
+    )
29
+    boolean isLiked(@Param("zoneId") Integer zoneId, @Param("userId") Integer userId);
30
+}

+ 8 - 3
src/main/java/com/lqkj/link/module/zone/repository/ZoneInfoRepository.java

@@ -65,17 +65,22 @@ public interface ZoneInfoRepository extends JpaRepository<ZoneInfo, Integer> {
65 65
     @Query(nativeQuery = true,
66 66
         value = "select zi.zone_id as \"zoneId\", zi.zone_name as \"zoneName\"," +
67 67
                 "zi.thumbnail, ui.head_img as \"headImg\", ui.display_name as \"displayName\"," +
68
-                "zi.share_count as \"shareCount\", zi.view_count as \"viewCount\", ui.user_id as \"authorId\" " +
68
+                "zi.share_count as \"shareCount\", zi.view_count as \"viewCount\", " +
69
+                "ui.user_id as \"authorId\", zi.like_count as \"likeCount\" " +
69 70
                 "from zone_info zi left join user_info ui " +
70 71
                 "on zi.user_id = ui.user_id " +
71 72
                 "where zone_name like concat('%', :name, '%') " +
72 73
                 "and (zi.user_id is null or zi.auth_status = 2) " +
73 74
                 "and (:searchType = 0 or (:searchType = 1 and zi.user_id is null) or (:searchType = 2 and zi.user_id is not null)) " +
74
-                "order by zi.update_time desc "
75
+                "order by " +
76
+                "CASE WHEN :orderType = 0 THEN zi.update_time END DESC," +
77
+                "CASE WHEN :orderType = 1 THEN zi.like_count END DESC," +
78
+                "CASE WHEN :orderType = 2 THEN zi.view_count END DESC;"
75 79
     )
76 80
     Page<Map<String, Object>> pageQueryResourceCenter(@Param("name") String name,
77 81
                                            @Param("searchType") Integer searchType,
78
-                                           Pageable pageable);
82
+                                           Pageable pageable,
83
+                                           @Param("orderType") Integer orderType);
79 84
 
80 85
     @Modifying
81 86
     @Query(nativeQuery = true,

+ 13 - 0
src/main/java/com/lqkj/link/module/zone/service/LikesInfoService.java

@@ -0,0 +1,13 @@
1
+package com.lqkj.link.module.zone.service;
2
+
3
+public interface LikesInfoService {
4
+
5
+    /**
6
+     * 作品点赞
7
+     *
8
+     * @param zoneId
9
+     * @param userCode
10
+     * @return
11
+     */
12
+    void save(Integer zoneId, Integer userCode, boolean isLike);
13
+}

+ 27 - 3
src/main/java/com/lqkj/link/module/zone/service/ZoneInfoService.java

@@ -6,13 +6,19 @@ import com.lqkj.link.module.authority.domain.UserInfo;
6 6
 import com.lqkj.link.module.authority.repository.UserInfoRepository;
7 7
 import com.lqkj.link.module.zone.domain.*;
8 8
 import com.lqkj.link.module.zone.repository.GeomInfoRepository;
9
+import com.lqkj.link.module.zone.repository.LikesInfoRepository;
9 10
 import com.lqkj.link.module.zone.repository.ModelInfoRepository;
10 11
 import com.lqkj.link.module.zone.repository.ZoneInfoRepository;
11 12
 import com.lqkj.link.util.Unzipper;
12 13
 import org.apache.commons.lang3.StringUtils;
14
+import org.apache.commons.lang3.SystemUtils;
15
+import org.aspectj.weaver.ast.Var;
13 16
 import org.locationtech.jts.geom.Coordinate;
14 17
 import org.locationtech.jts.geom.GeometryFactory;
18
+import org.springframework.beans.BeanUtils;
19
+import org.springframework.beans.factory.annotation.Autowired;
15 20
 import org.springframework.data.domain.Page;
21
+import org.springframework.data.domain.PageImpl;
16 22
 import org.springframework.data.domain.PageRequest;
17 23
 import org.springframework.data.domain.Pageable;
18 24
 import org.springframework.stereotype.Service;
@@ -31,6 +37,9 @@ public class ZoneInfoService {
31 37
     private final GeomInfoRepository geomInfoRepository;
32 38
     private final ModelInfoRepository modelInfoRepository;
33 39
 
40
+    @Autowired
41
+    private LikesInfoRepository likesInfoRepository;
42
+
34 43
     public ZoneInfoService(ZoneInfoRepository zoneInfoRepository, UserInfoRepository userInfoRepository,
35 44
                            GeomInfoRepository geomInfoRepository, ModelInfoRepository modelInfoRepository) {
36 45
         this.zoneInfoRepository = zoneInfoRepository;
@@ -242,9 +251,24 @@ public class ZoneInfoService {
242 251
         return zoneInfoRepository.pageQueryMyWork(userCode, name, pageable);
243 252
     }
244 253
 
245
-    public Page<Map<String, Object>> resourceCenter(String name, Integer searchType, Integer page, Integer pageSize) {
254
+    public Page<Map<String, Object>> resourceCenter(String name, Integer searchType, Integer page, Integer pageSize, Integer orderType, String userCode) {
246 255
         Pageable pageable = PageRequest.of(page, pageSize);
247
-        return zoneInfoRepository.pageQueryResourceCenter(name, searchType, pageable);
256
+        Page<Map<String, Object>> maps = zoneInfoRepository.pageQueryResourceCenter(name, searchType, pageable, orderType);
257
+        List<Map<String, Object>> result = new ArrayList<>();
258
+
259
+        maps.getContent().forEach(map -> {
260
+            Integer zoneId = (Integer) map.get("zoneId");
261
+            UserInfo userInfo = userInfoRepository.findByUserCode(userCode);
262
+            boolean isLiked = likesInfoRepository.isLiked(zoneId, userInfo.getUserId());
263
+            HashMap<String, Object> zoneInfo = new HashMap<>(map);
264
+            if (isLiked) {
265
+                zoneInfo.put("isLiked", true);
266
+            } else {
267
+                zoneInfo.put("isLiked", false);
268
+            }
269
+            result.add(zoneInfo);
270
+        });
271
+        return new PageImpl<>(result, PageRequest.of(page, pageSize), maps.getTotalElements());
248 272
     }
249 273
 
250 274
     public Page<Map<String, Object>> auditCenter(String name, Integer searchType, Integer page, Integer pageSize) {
@@ -303,7 +327,7 @@ public class ZoneInfoService {
303 327
 
304 328
         ZoneInfo zoneInfo = new ZoneInfo(null, userInfo.getUserId(), name, template == null ? null : template.getInitLocation(),
305 329
                 template == null ? null : template.getThumbnail(), 0, new Date(), 0, 0,
306
-                null, null, 0);
330
+                null, null, 0, 0);
307 331
         ZoneInfo newInfo = zoneInfoRepository.save(zoneInfo);
308 332
 
309 333
         if (templateId != null) {

+ 59 - 0
src/main/java/com/lqkj/link/module/zone/service/impl/LikesInfoServiceImpl.java

@@ -0,0 +1,59 @@
1
+package com.lqkj.link.module.zone.service.impl;
2
+
3
+import com.lqkj.link.module.zone.domain.LikesInfo;
4
+import com.lqkj.link.module.zone.domain.ZoneInfo;
5
+import com.lqkj.link.module.zone.repository.LikesInfoRepository;
6
+import com.lqkj.link.module.zone.repository.ZoneInfoRepository;
7
+import com.lqkj.link.module.zone.service.LikesInfoService;
8
+import org.springframework.beans.factory.annotation.Autowired;
9
+import org.springframework.stereotype.Service;
10
+import org.springframework.transaction.annotation.Transactional;
11
+
12
+import java.util.Date;
13
+
14
+@Service
15
+public class LikesInfoServiceImpl implements LikesInfoService {
16
+
17
+    @Autowired
18
+    private LikesInfoRepository likesInfoRepository;
19
+
20
+    @Autowired
21
+    private ZoneInfoRepository zoneInfoRepository;
22
+
23
+
24
+    @Transactional
25
+    @Override
26
+    public void save(Integer zoneId, Integer userId, boolean isLike) {
27
+        if (isLike){
28
+        LikesInfo likesInfo = new LikesInfo();
29
+        likesInfo.setZoneId(zoneId);
30
+        likesInfo.setUserId(userId);
31
+        likesInfoRepository.save(likesInfo);
32
+        updateZoneLikeCount(zoneId, isLike);
33
+        }
34
+        else {
35
+            likesInfoRepository.deleteByUserIdandZoneId(userId, zoneId);
36
+            updateZoneLikeCount(zoneId, isLike);
37
+        }
38
+
39
+
40
+    }
41
+
42
+    /**
43
+     * 更新作品点赞数
44
+     * @param zoneId
45
+     */
46
+
47
+    private void updateZoneLikeCount(Integer zoneId, boolean isLike) {
48
+        ZoneInfo zoneInfo = zoneInfoRepository.findById(zoneId).get();
49
+        if (isLike){
50
+            zoneInfo.setLikeCount(zoneInfo.getLikeCount() + 1);
51
+        }
52
+        else {
53
+            zoneInfo.setLikeCount(zoneInfo.getLikeCount() - 1);
54
+        }
55
+        zoneInfo.setUpdateTime(new Date());
56
+        zoneInfoRepository.save(zoneInfo);
57
+
58
+    }
59
+}

+ 20 - 0
src/main/resources/db/migration/V3__2.0.0.sql

@@ -0,0 +1,20 @@
1
+alter table zone_info add column like_count INT4 default 0;
2
+comment on column zone_info.like_count is
3
+'点赞数: like_count';
4
+create table Likes (
5
+    id SERIAL not null,
6
+    user_id INT4 not null,
7
+    zone_id INT4 not null,
8
+    create_time TIMESTAMP default current_timestamp,
9
+    constraint PK_LIKES primary key (id)
10
+);
11
+comment on table Likes is
12
+'点赞表: Likes';
13
+comment on column Likes.id is
14
+'id: id';
15
+comment on column Likes.user_id is
16
+'用户id: user_id';
17
+comment on column Likes.zone_id is
18
+'点赞的作品id: zone_id';
19
+comment on column Likes.create_time is
20
+'点赞时间: create_time'