diff --git a/luoo_common/src/main/java/dto/UserMessageDto.java b/luoo_common/src/main/java/dto/UserMessageDto.java new file mode 100644 index 0000000..d0c9b9f --- /dev/null +++ b/luoo_common/src/main/java/dto/UserMessageDto.java @@ -0,0 +1,51 @@ +package dto; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class UserMessageDto implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 消息ID + */ + private String messageId; + + /** + * 消息ID + */ + private String userId; + + + /** + * 消息标题 + */ + private String title; + + /** + * 消息内容 + */ + private String content; + + + /** + * 是否已读 0为未读 1为已读 + */ + private Integer haveRead; + + + /** + * 发送时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sendTime; +} diff --git a/luoo_common/src/main/java/enums/CollectTypeEnum.java b/luoo_common/src/main/java/enums/CollectTypeEnum.java index 50cbea4..3e7c5c0 100644 --- a/luoo_common/src/main/java/enums/CollectTypeEnum.java +++ b/luoo_common/src/main/java/enums/CollectTypeEnum.java @@ -1,30 +1,30 @@ package enums; public enum CollectTypeEnum { - SONG(0, "歌曲"), JOURNAL(1, "期刊"); + SONG(0, "歌曲"), JOURNAL(1, "期刊"), FOLLOW(2, "关注"), BLACK_LIST(3, "黑名单"), THUMB_UP(4, "点赞"); - private Integer type; - private String description; + private Integer type; + private String description; - CollectTypeEnum(int type, String description) { - this.type = type; - this.description = description; - } + CollectTypeEnum(int type, String description) { + this.type = type; + this.description = description; + } - public Integer getType() { - return type; - } + public Integer getType() { + return type; + } - public String getDescription() { - return description; - } + public String getDescription() { + return description; + } - public static CollectTypeEnum getByType(Integer type) { - for (CollectTypeEnum at : CollectTypeEnum.values()) { - if (at.type.equals(type)) { - return at; - } - } - return null; - } + public static CollectTypeEnum getByType(Integer type) { + for (CollectTypeEnum at : CollectTypeEnum.values()) { + if (at.type.equals(type)) { + return at; + } + } + return null; + } } diff --git a/luoo_music/pom.xml b/luoo_music/pom.xml index 0b9600d..0cce7b0 100644 --- a/luoo_music/pom.xml +++ b/luoo_music/pom.xml @@ -57,6 +57,12 @@ tika-core 1.27 + + + + software.amazon.awssdk + s3 + app diff --git a/luoo_music/src/main/java/com/luoo/music/config/AwsS3Config.java b/luoo_music/src/main/java/com/luoo/music/config/AwsS3Config.java new file mode 100644 index 0000000..ba8e41a --- /dev/null +++ b/luoo_music/src/main/java/com/luoo/music/config/AwsS3Config.java @@ -0,0 +1,44 @@ +package com.luoo.music.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3Configuration; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; + +import java.net.URI; + +@Configuration +public class AwsS3Config { + + private static final Region region = Region.of("cn-east-1"); + + @Bean + public S3Client s3Client(){ + AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create("GLwHmLTZ05Kw9RyCGJXnIkua", "ynOBIqdNXH5HBgrVA29DTn4cUSh1wAI"); + S3Configuration s3Config = S3Configuration.builder().pathStyleAccessEnabled(true).build(); + S3Client s3 = S3Client.builder() + .endpointOverride(URI.create("https://s3.bitiful.net/")) + .credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials)) + .region(region) + .serviceConfiguration(s3Config) + .build(); + + return s3; + } + + @Bean + public S3Presigner s3Presigner(){ + S3Configuration s3Config = S3Configuration.builder().pathStyleAccessEnabled(true).build(); + S3Presigner presigner = S3Presigner.builder() + .endpointOverride(URI.create("https://s3.bitiful.net/")) + .region(region) + .build(); + + return presigner; + } +} diff --git a/luoo_music/src/main/java/com/luoo/music/controller/S3Controller.java b/luoo_music/src/main/java/com/luoo/music/controller/S3Controller.java new file mode 100644 index 0000000..d9a3aa2 --- /dev/null +++ b/luoo_music/src/main/java/com/luoo/music/controller/S3Controller.java @@ -0,0 +1,75 @@ +package com.luoo.music.controller; + + +import api.Result; +import com.luoo.music.service.S3Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.UnsupportedEncodingException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@RestController +@CrossOrigin +public class S3Controller { + + @Autowired + private S3Service s3Service; + + + @GetMapping("/awstest") + public Result test() throws UnsupportedEncodingException { + +// s3Service.listObjects() + List list = s3Service.list(); + return Result.success(); + } + + + /** + * 文件存储目录规划 + * + * music 存放期刊和期刊歌曲 二级目录为期刊期刊号 三级目录存放期刊歌曲和封面图片和歌曲图片 + * + * song 存放通用歌曲 + * + * image存放图片 + * + * img + * + * user/avatar/111.jpg + * + * + * + * + */ + @PostMapping("/awsUpload") + public Result upload(MultipartFile file) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); +// String fileName = UUID.randomUUID().toString().trim().replaceAll("-", ""); + + + String filePath = sdf.format(new Date()) + "/" + file.getOriginalFilename(); + try{ + int code = s3Service.singleUpload("indie", filePath, file); + + } catch (Exception ex){ + } + + + return Result.success(); + } + + @PostMapping("/awsCopy") + public Result copy() { + s3Service.copy(); + return Result.success(); + } +} diff --git a/luoo_music/src/main/java/com/luoo/music/service/S3Service.java b/luoo_music/src/main/java/com/luoo/music/service/S3Service.java new file mode 100644 index 0000000..a7a83a6 --- /dev/null +++ b/luoo_music/src/main/java/com/luoo/music/service/S3Service.java @@ -0,0 +1,103 @@ +package com.luoo.music.service; + +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.http.SdkHttpResponse; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.*; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.List; + + +@Service +public class S3Service { + @Resource + private S3Client s3Client; + + @Resource + private S3Presigner s3Presigner; + +// +// public ListObjectsResponse listObjects(){ +// ListObjectsResponse indie = s3Client.listObjects( ListObjectsV2Request.builder().bucket("indie")); +// return indie; +// } + + + public List list() throws UnsupportedEncodingException { +// if(StringUtil.isEmpty(bucket)) return ResultUtil.resultFail("参数错误"); + + ListObjectsV2Request.Builder builder = ListObjectsV2Request.builder(); + // 设置bucket + builder.bucket("indie"); + + + ListObjectsV2Request listObjReq = builder.build(); + ListObjectsV2Response listObjRes = s3Client.listObjectsV2(listObjReq); + + + + List s3ObjectList = listObjRes.contents(); + + + return s3ObjectList; + } + + + + /** + * 异步完整上传不分片 + * @param bucket bucket + * @param key 对象路径 + * @param file 文件对象 + */ +// @Async("awsThreadPoolExecutor") + public int singleUpload(String bucket, String key, MultipartFile file) throws IOException { + Long startTime = System.currentTimeMillis() / 1000; + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucket) + .key(key) + .build(); + RequestBody requestBody = RequestBody.fromInputStream(file.getInputStream(), file.getSize()); + PutObjectResponse putObjectResponse = s3Client.putObject(putObjectRequest, requestBody); + SdkHttpResponse sdkHttpResponse = putObjectResponse.sdkHttpResponse(); + if(!sdkHttpResponse.isSuccessful()){ + return -1; + } + long endTime = System.currentTimeMillis() / 1000; +// log.info("上传文件(" + key + ")总计耗费时间为:" + (endTime - startTime) + " 秒"); + + return 1; + } + + + + public int copy() { + + String bucket = "indie"; //存储桶名 + String sourceKey = "20240121/1.mp3"; //copy的源文件路径 + String destinationKey = "20240121/2.mp3"; // copy的目的地路径 + CopyObjectResponse copyObjectResponse = s3Client.copyObject(CopyObjectRequest.builder().sourceBucket(bucket).sourceKey(sourceKey).destinationBucket(bucket).destinationKey(destinationKey).build()); + SdkHttpResponse sdkHttpResponse = copyObjectResponse.sdkHttpResponse(); + if(!sdkHttpResponse.isSuccessful()){ + return -1; + } + return 1; + } + + public void uploadAvatar(String bucket, String key, byte[] buffer) { + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucket) + .key(key) + .build(); + RequestBody requestBody = RequestBody.fromInputStream(new ByteArrayInputStream(buffer), buffer.length); + s3Client.putObject(putObjectRequest, requestBody); + } + +} diff --git a/luoo_user/src/main/java/com/luoo/user/controller/LoginController.java b/luoo_user/src/main/java/com/luoo/user/controller/LoginController.java index cbcd601..d080ad0 100644 --- a/luoo_user/src/main/java/com/luoo/user/controller/LoginController.java +++ b/luoo_user/src/main/java/com/luoo/user/controller/LoginController.java @@ -46,8 +46,9 @@ import util.StringTools; @CrossOrigin @RequestMapping("/user") @Api(tags = "LoginController") -public class LoginController extends BaseController{ - private static final List DEFAULT_SUPPORTED_COUNTRY_CODES=Arrays.asList(new CountryCodeDTO("中国","+86")); +public class LoginController extends BaseController { + private static final List DEFAULT_SUPPORTED_COUNTRY_CODES = Arrays + .asList(new CountryCodeDTO("中国", "+86")); @Autowired private UserInfoService userInfoService; @@ -71,30 +72,44 @@ public class LoginController extends BaseController{ */ @ApiOperation(value = "1.发送短信验证码", notes = "有效期15分钟,一个手机号一天内最多发送50个请求") @ApiImplicitParams({ @ApiImplicitParam(name = "mobile", value = "手机号", required = true), - @ApiImplicitParam(name = "countryCode", value = "国家码,默认为‘+86’", required = false, defaultValue="+86"), - @ApiImplicitParam(name = "deviceId", value = "设备id", required = true)}) + @ApiImplicitParam(name = "countryCode", value = "国家码,默认为‘+86’", required = false, defaultValue = "+86"), + @ApiImplicitParam(name = "deviceId", value = "设备id", required = true), + @ApiImplicitParam(name = "imageCheckCode", value = "图形验证码", required = false) }) @PostMapping("/sendsms") @GlobalInterceptor(frequencyType = RequestFrequencyTypeEnum.DAY, requestFrequencyThreshold = 50) - public Result sendSms( - @VerifyParam(required = true) @RequestParam("deviceId") String deviceId, - @RequestParam(name="countryCode",defaultValue="+86") String countryCode, - @VerifyParam(required = true, regex = VerifyRegexEnum.MOBILE) @RequestParam("mobile") String mobile) { - userInfoService.sendSms(deviceId,mobile); + public Result sendSms(@VerifyParam(required = true) @RequestParam("deviceId") String deviceId, + @RequestParam(name = "countryCode", defaultValue = "+86") String countryCode, + @VerifyParam(required = true, regex = VerifyRegexEnum.MOBILE) @RequestParam("mobile") String mobile, + @VerifyParam(required = false) @RequestParam("imageCheckCode") String imageCheckCode) { + if (!StringTools.isEmpty(imageCheckCode)) { + // 得到缓存中的验证码 + String redisImageCheckCodeKey = Constants.REDIS_KEY_IMAGE_CHECK_CODE + deviceId; + String redisImageCheckCode = (String) redisTemplate.opsForValue().get(redisImageCheckCodeKey); + if (StringTools.isEmpty(redisImageCheckCode)) { + return Result.failed(StatusCode.USER_IMAGE_VERIFICATION_CODE_EXPIRED); + } + if (!redisImageCheckCode.equalsIgnoreCase(imageCheckCode)) { + return Result.failed(StatusCode.USER_IMAGE_VERIFICATION_CODE_MISMATCH); + } + redisTemplate.delete(redisImageCheckCodeKey); + } + + userInfoService.sendSms(deviceId, mobile); return Result.success(); } - + @ApiOperation(value = "2.登录/注册", notes = "成功后返回token") @ApiImplicitParams({ @ApiImplicitParam(name = "mobile", value = "手机号", required = true), - @ApiImplicitParam(name = "mobileCheckCode", value = "6位验证码", required = true), - @ApiImplicitParam(name = "deviceId", value = "设备id", required = true), - @ApiImplicitParam(name = "deviceBrand", value = "设备品牌", required = false) }) + @ApiImplicitParam(name = "mobileCheckCode", value = "6位验证码", required = true), + @ApiImplicitParam(name = "deviceId", value = "设备id", required = true), + @ApiImplicitParam(name = "deviceBrand", value = "设备品牌", required = false) }) @PostMapping("/appLogin") - @GlobalInterceptor - public Result appLogin(HttpServletRequest request, + @GlobalInterceptor(frequencyType = RequestFrequencyTypeEnum.HOUR, requestFrequencyThreshold = 12) + public Result appLogin(HttpServletRequest request, @VerifyParam(required = true, regex = VerifyRegexEnum.MOBILE) @RequestParam("mobile") String mobile, @VerifyParam(required = true, regex = VerifyRegexEnum.MOBILE_CHECK_CODE) @RequestParam("mobileCheckCode") String mobileCheckCode, @VerifyParam(required = true) @RequestParam("deviceId") String deviceId, - @RequestParam("deviceBrand") String deviceBrand) { + @RequestParam("deviceBrand") String deviceBrand) { // 得到缓存中的验证码 String redisMobileCheckCodeKey = Constants.REDIS_KEY_MOBILE_CHECK_CODE + deviceId; try { @@ -116,34 +131,30 @@ public class LoginController extends BaseController{ } } - - /** * token 续期 */ @ApiOperation(value = "3.token续期", notes = "有效期7天") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "设备id", required = true), - @ApiImplicitParam(name = "deviceBrand", value = "设备品牌", required = false) }) + @ApiImplicitParams({ @ApiImplicitParam(name = "deviceId", value = "设备id", required = true), + @ApiImplicitParam(name = "deviceBrand", value = "设备品牌", required = false) }) @PostMapping("/autoLogin") @GlobalInterceptor - public Result autoLogin(HttpServletRequest request,@RequestHeader(value = "token", required = false) String token, - @VerifyParam(required = true) @RequestParam("deviceId") String deviceId, - @RequestParam("deviceBrand") String deviceBrand) { - return Result.success(userInfoService.autoLogin(token,deviceId,deviceBrand,getIpAddr(request))); + public Result autoLogin(HttpServletRequest request, + @RequestHeader(value = "token", required = false) String token, + @VerifyParam(required = true) @RequestParam("deviceId") String deviceId, + @RequestParam("deviceBrand") String deviceBrand) { + return Result.success(userInfoService.autoLogin(token, deviceId, deviceBrand, getIpAddr(request))); } /** * 获取图行验证码 */ @ApiOperation(value = "4.获取图形验证码", notes = "4.三次短信验证失败后,获取图形验证码,有效期10分钟") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "设备id", required = true)}) + @ApiImplicitParams({ @ApiImplicitParam(name = "deviceId", value = "设备id", required = true) }) @GetMapping("/imageCheckCode/{deviceId}") @GlobalInterceptor public void imageCheckCode(HttpServletResponse response, - @VerifyParam(required = true) @PathVariable("deviceId") String deviceId) - throws IOException { + @VerifyParam(required = true) @PathVariable("deviceId") String deviceId) throws IOException { CreateImageCode vCode = new CreateImageCode(130, 38, 5, 10); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); @@ -155,35 +166,12 @@ public class LoginController extends BaseController{ vCode.write(response.getOutputStream()); } - @ApiOperation(value = "5.图形验证码+短信验证码 登录/注册后返回token") - @PostMapping("/appLoginWithImageCode") - @GlobalInterceptor - public Result appLoginWithImageCheckCode( - HttpServletRequest request, - @VerifyParam(required = true, regex = VerifyRegexEnum.MOBILE) @RequestParam("mobile") String mobile, - @VerifyParam(required = true, regex = VerifyRegexEnum.MOBILE_CHECK_CODE) @RequestParam("mobileCheckCode") String mobileCheckCode, - @VerifyParam(required = true) @RequestParam("deviceId") String deviceId, - @RequestParam("deviceBrand") String deviceBrand, - @VerifyParam(required = true) @RequestParam("imageCheckCode") String imageCheckCode) { - // 得到缓存中的验证码 - String redisImageCheckCodeKey = Constants.REDIS_KEY_IMAGE_CHECK_CODE + deviceId; - String redisImageCheckCode = (String) redisTemplate.opsForValue().get(redisImageCheckCodeKey); - if (StringTools.isEmpty(redisImageCheckCode)) { - return Result.failed(StatusCode.USER_IMAGE_VERIFICATION_CODE_EXPIRED); - } - if (!redisImageCheckCode.equalsIgnoreCase(imageCheckCode)) { - return Result.failed(StatusCode.USER_IMAGE_VERIFICATION_CODE_MISMATCH); - } - redisTemplate.delete(redisImageCheckCodeKey); - return appLogin(request, mobile, mobileCheckCode, deviceId, deviceBrand); - } - /** * 获取支持的手机号国家码 */ - @ApiOperation(value = "6.获取支持的手机号国家码", notes = "v1仅支持'+86'") + @ApiOperation(value = "5.获取支持的手机号国家码", notes = "v1仅支持'+86'") @GetMapping("/supportedCountryCode") - public Result> getSupportedCountryCode(){ + public Result> getSupportedCountryCode() { return Result.success(DEFAULT_SUPPORTED_COUNTRY_CODES); } } diff --git a/luoo_user/src/main/java/com/luoo/user/controller/MyController.java b/luoo_user/src/main/java/com/luoo/user/controller/MyController.java index 791f05c..0eae87f 100644 --- a/luoo_user/src/main/java/com/luoo/user/controller/MyController.java +++ b/luoo_user/src/main/java/com/luoo/user/controller/MyController.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Paths; import java.util.Date; +import java.util.EnumMap; import org.apache.commons.io.IOUtils; import org.springframework.beans.BeanUtils; @@ -26,6 +27,7 @@ import controller.BaseController; import com.luoo.user.dto.response.UserRespDTO; import com.luoo.user.pojo.UserInfo; import com.luoo.user.service.S3Service; +import com.luoo.user.service.UserCollectService; import com.luoo.user.service.UserInfoService; import annotation.GlobalInterceptor; @@ -33,6 +35,7 @@ import annotation.VerifyParam; import api.Result; import api.StatusCode; import dto.UserLoginDto; +import enums.CollectTypeEnum; import enums.DateTimePatternEnum; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -52,6 +55,9 @@ public class MyController extends BaseController{ @Autowired private UserInfoService userInfoService; + @Autowired + private UserCollectService userCollectService; + public static String UPLOAD_DIRECTORY = "user/avatar/"; @ApiOperation(value = "1.获取个人信息", notes = "游客无法获取个人信息") @@ -65,6 +71,22 @@ public class MyController extends BaseController{ UserRespDTO userRespDTO = new UserRespDTO(); UserInfo user = userInfoService.findById(userLoginDto.getUserId()); BeanUtils.copyProperties(user, userRespDTO); + //EnumMap map=userCollectService.getUserCollectTypeMap(user.getId()); + int fansCount=userCollectService.getFansCount(user.getId()); + int followCount=userCollectService.getCount(user.getId(),CollectTypeEnum.FOLLOW.getType()); + int thumbUpCount=userCollectService.getCount(user.getId(),CollectTypeEnum.THUMB_UP.getType()); + int songCount=userCollectService.getCount(user.getId(),CollectTypeEnum.SONG.getType()); + int journalCount=userCollectService.getCount(user.getId(),CollectTypeEnum.JOURNAL.getType()); + + userRespDTO.setFollowCount(followCount); + userRespDTO.setFansCount(fansCount); + userRespDTO.setThumbUpCount(thumbUpCount); + userRespDTO.setCommentReplyCount(0); + userRespDTO.setSongCount(songCount); + userRespDTO.setJournalCount(journalCount); + if(null!=user.getBirthday()) { + userRespDTO.setBirthDay(DateUtil.format(user.getBirthday(), DateTimePatternEnum.YYYY_DOT_MM_DOT_DD.getPattern())); + } return Result.success(userRespDTO); } @@ -110,7 +132,7 @@ public class MyController extends BaseController{ @ApiOperation(value = "3.上传个人头像", notes = "图片压缩为70X70 JPEG,存入S3,桶为indie,目录为 user/avatar/") @PostMapping("/uploadAvatar") @GlobalInterceptor(checkLogin = true) - public Result uploadAvatar(@RequestHeader(value = "token", required = false) String token, + public Result uploadAvatar(@RequestHeader(value = "token", required = false) String token, @VerifyParam(required = true) MultipartFile file) throws IOException { UserLoginDto userLoginDto = getUserLoginDto(token); @@ -123,6 +145,6 @@ public class MyController extends BaseController{ user.setAvatar(filePath); userInfoService.update(user); - return Result.success(); + return Result.success(filePath); } } diff --git a/luoo_user/src/main/java/com/luoo/user/controller/UserCollectController.java b/luoo_user/src/main/java/com/luoo/user/controller/UserCollectController.java index e8b4217..941d580 100644 --- a/luoo_user/src/main/java/com/luoo/user/controller/UserCollectController.java +++ b/luoo_user/src/main/java/com/luoo/user/controller/UserCollectController.java @@ -3,9 +3,7 @@ package com.luoo.user.controller; import annotation.GlobalInterceptor; import annotation.VerifyParam; import api.Result; -import client.vo.SimpleUser; import com.luoo.user.service.UserCollectService; -import com.luoo.user.service.UserService; import dto.UserLoginDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -15,8 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import util.JwtUtil; -import java.util.List; - @Api(tags = "UserCollectController") @RestController @RequestMapping("/userCollect") @@ -25,12 +21,11 @@ public class UserCollectController { private JwtUtil jwtUtil; @Autowired private UserCollectService userCollectService; - @Autowired - private UserService userService; - @ApiOperation(value = "1.收藏/喜欢") - @ApiImplicitParams({ @ApiImplicitParam(name = "objectId", value = "收藏/喜欢的id,此处为歌曲/期刊id", required = true), - @ApiImplicitParam(name = "collectType", value = "收藏/喜欢的类型,0为歌曲,1为期刊", required = true) }) + @ApiOperation(value = "1.喜欢歌曲/收藏期刊/关注/黑名单/点赞") + @ApiImplicitParams({ + @ApiImplicitParam(name = "objectId", value = "喜欢歌曲/收藏期刊/关注某用户/某用户列入黑名单/点赞评论的id", required = true), + @ApiImplicitParam(name = "collectType", value = "0:歌曲,1:期刊,2:关注,3:黑名单,4:点赞", required = true) }) @PostMapping("/addCollect") @GlobalInterceptor(checkLogin = true) public Result addCollect(@RequestHeader(value = "token", required = false) String token, @@ -41,9 +36,10 @@ public class UserCollectController { return Result.success(); } - @ApiOperation(value = "2.取消 收藏/喜欢") - @ApiImplicitParams({ @ApiImplicitParam(name = "objectId", value = "收藏/喜欢的id,此处为歌曲/期刊id", required = true), - @ApiImplicitParam(name = "collectType", value = "收藏/喜欢的类型,0为歌曲,1为期刊", required = true) }) + @ApiOperation(value = "2.取消 喜欢歌曲/收藏期刊/关注/黑名单/点赞") + @ApiImplicitParams({ + @ApiImplicitParam(name = "objectId", value = "喜欢歌曲/收藏期刊/关注某用户/某用户列入黑名单/点赞评论的id", required = true), + @ApiImplicitParam(name = "collectType", value = "0:歌曲,1:期刊,2:关注,3:黑名单,4:点赞", required = true) }) @DeleteMapping("/cancelCollect") @GlobalInterceptor(checkLogin = true) public Result cancelCollect(@RequestHeader(value = "token", required = false) String token, @@ -54,13 +50,4 @@ public class UserCollectController { collectType); return Result.success(); } - - /* - * @ApiOperation(value = "根据 IDs 获取用户简要信息") - * - * @GetMapping("/findUserByIds") public Result> - * findUserByIds(@RequestBody List ids) { List userByIds = - * userService.findUserByIds(ids); return Result.success(userByIds); } - */ - } diff --git a/luoo_user/src/main/java/com/luoo/user/controller/UserCollectInfoController.java b/luoo_user/src/main/java/com/luoo/user/controller/UserCollectInfoController.java new file mode 100644 index 0000000..65f1207 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/controller/UserCollectInfoController.java @@ -0,0 +1,37 @@ +package com.luoo.user.controller; + + +import api.Result; +import com.luoo.user.pojo.UserCollectInfo; +import com.luoo.user.service.UserCollectInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/UserCollectInfo") +public class UserCollectInfoController { + + + @Autowired + private UserCollectInfoService userCollectInfoService; + + + @PostMapping("/save") + public Result save(){ + userCollectInfoService.save(); + return Result.success(); + } + + @GetMapping("/show") + public Result show(){ + UserCollectInfo userCollectInfo =userCollectInfoService.findByUserId(); + return Result.success(userCollectInfo); + } + + @PutMapping("/unCollect") + public Result unCollect() { + userCollectInfoService.unCollect(); + return Result.success(); + } + +} diff --git a/luoo_user/src/main/java/com/luoo/user/controller/UserMessageController.java b/luoo_user/src/main/java/com/luoo/user/controller/UserMessageController.java new file mode 100644 index 0000000..6cf7a4c --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/controller/UserMessageController.java @@ -0,0 +1,61 @@ +package com.luoo.user.controller; + + +import api.PageResult; +import api.Result; +import com.luoo.user.pojo.UserMessage; +import com.luoo.user.service.UserMessageService; +import dto.UserMessageDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/userMessage") +public class UserMessageController { + + @Autowired + private UserMessageService userMessageService; + + + /** + * 测试时用的,忽略这个方法 + * * @param userMessageDto + * @return + */ + + @PostMapping("/sendUserMessage") + public Result sendUserMessage(@RequestBody UserMessageDto userMessageDto) { + + userMessageService.sendUserMessage(userMessageDto); + return Result.success(); + } + + + /**测试时用的,获取当前登录用户ID请走TOKEN + * 根据登录的用户ID获取消息 + * @return + */ + @GetMapping("/list/{userId}/{page}/{size}") + public Result list(@PathVariable String userId,@PathVariable int page,@PathVariable int size){ +// List list = userMessageService.findByUserId(userId); + + Page pageList = userMessageService.findSearch(userId,page,size); + return Result.success(new PageResult(pageList.getTotalElements(),pageList.getContent())); + } + + @PutMapping("/haveRead/{messageId}") + public Result haveRead(@PathVariable String messageId) { + userMessageService.haveRead(messageId); + return Result.success(); + } + + @PutMapping("/batchHaveRead") + public Result haveRead(@RequestBody List userMessageList) { + userMessageService.batchHaveRead(userMessageList); + return Result.success(); + } + +} diff --git a/luoo_user/src/main/java/com/luoo/user/dao/AppUpdateDao.java b/luoo_user/src/main/java/com/luoo/user/dao/AppUpdateDao.java index a979a2d..d86778c 100644 --- a/luoo_user/src/main/java/com/luoo/user/dao/AppUpdateDao.java +++ b/luoo_user/src/main/java/com/luoo/user/dao/AppUpdateDao.java @@ -1,11 +1,43 @@ package com.luoo.user.dao; +import com.luoo.user.pojo.AppUpdate; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -import com.luoo.user.pojo.AppUpdate; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Predicate; +import java.util.ArrayList; +import java.util.List; public interface AppUpdateDao extends JpaRepository, JpaSpecificationExecutor { - //AppUpdate selectLatestUpdate(String appVersion, String deviceId); + default AppUpdate selectLatestUpdate(String appVersion, String deviceId){ + Specification appUpdateSpecification = createAppUpdateSpecification(appVersion, deviceId); + Sort createTimeDescSort = Sort.by(Sort.Direction.DESC, "createTime"); + Page appUpdatePage = this.findAll(appUpdateSpecification, PageRequest.of(0, 1, createTimeDescSort)); + if(appUpdatePage.getContent().isEmpty()){ + return null; + } + return appUpdatePage.getContent().get(0); + } + + default Specification createAppUpdateSpecification(String appVersion, String deviceId) { + return (root, criteriaQuery, criteriaBuilder) -> { + List predicateList = new ArrayList<>(); + predicateList.add(criteriaBuilder.greaterThan(root.get("version"), appVersion)); + Predicate allPublishPredicate = criteriaBuilder.equal(root.get("status"), 2); + Predicate grayPublishPredicate = criteriaBuilder.equal(root.get("status"), 1); + Expression grayDeviceExpress = criteriaBuilder + .function("find_in_set", Integer.class, criteriaBuilder.literal(deviceId), root.get("grayscaleDevice")); + Predicate grayDevicePredicate = criteriaBuilder.gt(grayDeviceExpress, 0); + Predicate grayScalePredicate = criteriaBuilder.and(grayPublishPredicate, grayDevicePredicate); + predicateList.add(criteriaBuilder.or(allPublishPredicate, grayScalePredicate)); + Predicate[] predicates = new Predicate[predicateList.size()]; + return criteriaBuilder.and(predicateList.toArray(predicates)); + }; + } } diff --git a/luoo_user/src/main/java/com/luoo/user/dao/UserCollectDao.java b/luoo_user/src/main/java/com/luoo/user/dao/UserCollectDao.java index 45a7036..74ba5e1 100644 --- a/luoo_user/src/main/java/com/luoo/user/dao/UserCollectDao.java +++ b/luoo_user/src/main/java/com/luoo/user/dao/UserCollectDao.java @@ -1,11 +1,20 @@ package com.luoo.user.dao; +import java.util.List; + +import org.springframework.data.jpa.repository.Query; import org.springframework.data.mongodb.repository.MongoRepository; +import com.luoo.user.dto.UserCollectCount; import com.luoo.user.pojo.UserCollect; public interface UserCollectDao extends MongoRepository { public UserCollect findByUserIdAndObjectIdAndCollectType(String userId, String objectId, Integer collectType); public long deleteByUserIdAndObjectIdAndCollectType(String userId, String objectId, Integer collectType); + //@Query(value = "select NumberInt(collectType),count(*) from common.userCollect where userId=?1 group by collectType", nativeQuery = true) + //public List countByUserIdAndGroupByCollectType(String userId); + + public int countByObjectIdAndCollectType(String objectId, Integer collectType); + public int countByUserIdAndCollectType(String userId, Integer collectType); } diff --git a/luoo_user/src/main/java/com/luoo/user/dao/UserCollectInfoDao.java b/luoo_user/src/main/java/com/luoo/user/dao/UserCollectInfoDao.java new file mode 100644 index 0000000..21d7e48 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/dao/UserCollectInfoDao.java @@ -0,0 +1,9 @@ +package com.luoo.user.dao; + +import com.luoo.user.pojo.UserCollectInfo; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface UserCollectInfoDao extends MongoRepository { + + UserCollectInfo findUserCollectInfoByUserId(String userId); +} diff --git a/luoo_user/src/main/java/com/luoo/user/dao/UserMessageDao.java b/luoo_user/src/main/java/com/luoo/user/dao/UserMessageDao.java new file mode 100644 index 0000000..bdc5112 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/dao/UserMessageDao.java @@ -0,0 +1,19 @@ +package com.luoo.user.dao; + +import com.luoo.user.pojo.UserMessage; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.mongodb.repository.MongoRepository; + +import java.util.List; + +public interface UserMessageDao extends MongoRepository { + + List findAllByUserId(String userId); + + Page findByUserId(String userId, Pageable pageable); + + +} diff --git a/luoo_user/src/main/java/com/luoo/user/dto/UserCollectCount.java b/luoo_user/src/main/java/com/luoo/user/dto/UserCollectCount.java new file mode 100644 index 0000000..ddadf05 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/dto/UserCollectCount.java @@ -0,0 +1,11 @@ +package com.luoo.user.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserCollectCount { + private int collectType; + private long count; +} diff --git a/luoo_user/src/main/java/com/luoo/user/dto/UserCollectJournalDto.java b/luoo_user/src/main/java/com/luoo/user/dto/UserCollectJournalDto.java new file mode 100644 index 0000000..932c189 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/dto/UserCollectJournalDto.java @@ -0,0 +1,59 @@ +package com.luoo.user.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + + +@Data +public class UserCollectJournalDto implements Serializable { + private String id; + + /** + * 期刊编号 + */ + private String number; + /** + * 期刊标题 + */ + private String name; + /** + * 期刊简介 + */ + private String summary; + /** + * 用户ID + */ + private String userId; + /** + * 启停状态 停用:0,启用:1 + */ + private String state; + /** + * 发布状态 未发布:0,已发布:1 + */ + private String status; + /** + * 是否定时 否:0 是:1 + */ + private String scheduled; + /** + * 封面路径 + */ + private String coverPhoto; + /** + * 发布日期 + */ + private LocalDateTime pubTime; + /** + * 创建日期 + */ + private LocalDateTime createTime; + /** + * 更新日期 + */ + private LocalDateTime updateTime; + + +} diff --git a/luoo_user/src/main/java/com/luoo/user/dto/UserCollectSongDto.java b/luoo_user/src/main/java/com/luoo/user/dto/UserCollectSongDto.java new file mode 100644 index 0000000..5eec7b0 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/dto/UserCollectSongDto.java @@ -0,0 +1,67 @@ +package com.luoo.user.dto; + +import lombok.Data; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +import java.io.Serializable; +import java.time.LocalDateTime; + + +@Data +public class UserCollectSongDto implements Serializable { + + private String id; + + /** + * 歌曲名称 + */ + private String name; + /** + * 歌手或乐队 + */ + private String artist; + /** + * 专辑 + */ + private String album; + /** + * 封面图片路径 + */ + private String picture; + /** + * 歌曲状态 0:停用,1:启用 + */ + private String state; + /** + * 文件大小 + */ + private Long size; + /** + * 歌曲时长 + */ + private Long duration; + /** + * 歌曲文件路径 + */ + private String url; + /** + * 歌词 + */ + private String lyric; + /** + * 上传人员ID + */ + private String userId; + /** + * 创建日期 + */ + private LocalDateTime createTime; + /** + * 更新日期 + */ + private LocalDateTime updateTime; + + + +} diff --git a/luoo_user/src/main/java/com/luoo/user/dto/response/UserRespDTO.java b/luoo_user/src/main/java/com/luoo/user/dto/response/UserRespDTO.java index 32b12d5..2f92b11 100644 --- a/luoo_user/src/main/java/com/luoo/user/dto/response/UserRespDTO.java +++ b/luoo_user/src/main/java/com/luoo/user/dto/response/UserRespDTO.java @@ -17,4 +17,18 @@ public class UserRespDTO { private String signature; @ApiModelProperty(value = "用户标识,如“贡献者”,“音乐人”") private String badge; + @ApiModelProperty(value = "关注数") + private int followCount; + @ApiModelProperty(value = "粉丝数") + private int fansCount; + @ApiModelProperty(value = "获赞数") + private int thumbUpCount; + @ApiModelProperty(value = "喜欢歌曲数") + private int songCount; + @ApiModelProperty(value = "收藏期刊数") + private int journalCount; + @ApiModelProperty(value = "获得评论数") + private int commentReplyCount; + @ApiModelProperty(value = "生日,格式为: yyyy.MM.dd") + private String birthDay; } diff --git a/luoo_user/src/main/java/com/luoo/user/listener/UserMessageListener.java b/luoo_user/src/main/java/com/luoo/user/listener/UserMessageListener.java new file mode 100644 index 0000000..79a706a --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/listener/UserMessageListener.java @@ -0,0 +1,29 @@ +package com.luoo.user.listener; + + +import com.luoo.user.dao.UserMessageDao; +import com.luoo.user.pojo.UserMessage; +import dto.UserMessageDto; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +@RabbitListener(queues = "userMessage") +public class UserMessageListener { + + @Autowired + private UserMessageDao userMessageDao; + + @RabbitHandler + public void executeSendUserMessage(UserMessageDto userMessageDto) { + + UserMessage userMessage = new UserMessage(); + BeanUtils.copyProperties(userMessageDto,userMessage); + + userMessageDao.save(userMessage); + } + +} diff --git a/luoo_user/src/main/java/com/luoo/user/pojo/AppUpdate.java b/luoo_user/src/main/java/com/luoo/user/pojo/AppUpdate.java index 87d328c..946d028 100644 --- a/luoo_user/src/main/java/com/luoo/user/pojo/AppUpdate.java +++ b/luoo_user/src/main/java/com/luoo/user/pojo/AppUpdate.java @@ -11,9 +11,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; @Entity @@ -58,6 +56,7 @@ public class AppUpdate implements Serializable { */ private String grayscaleDevice; + @Transient private String[] updateDescArray; public String[] getUpdateDescArray() { diff --git a/luoo_user/src/main/java/com/luoo/user/pojo/UserCollectInfo.java b/luoo_user/src/main/java/com/luoo/user/pojo/UserCollectInfo.java new file mode 100644 index 0000000..2313084 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/pojo/UserCollectInfo.java @@ -0,0 +1,40 @@ +package com.luoo.user.pojo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +@Data +public class UserCollectInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 收藏ID + */ + @Id + private String collectId; + + /** + * 用户ID + */ + private String userId; + + /** + * 收藏的单曲 + */ + private List songList; + + + + /** + * 收藏的期刊 + */ + private List journalList; +} diff --git a/luoo_user/src/main/java/com/luoo/user/pojo/UserInfo.java b/luoo_user/src/main/java/com/luoo/user/pojo/UserInfo.java index be561c7..680046d 100644 --- a/luoo_user/src/main/java/com/luoo/user/pojo/UserInfo.java +++ b/luoo_user/src/main/java/com/luoo/user/pojo/UserInfo.java @@ -67,11 +67,11 @@ public class UserInfo implements Serializable { /** * 粉丝数 */ - private Integer fansCount; + private int fansCount; /** * 关注数 */ - private Integer followCount; + private int followCount; /** * 创建时间 */ @@ -111,5 +111,5 @@ public class UserInfo implements Serializable { /** * 0:禁用 1:正常 */ - private Integer status; + private int status; } diff --git a/luoo_user/src/main/java/com/luoo/user/pojo/UserMessage.java b/luoo_user/src/main/java/com/luoo/user/pojo/UserMessage.java new file mode 100644 index 0000000..12102e8 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/pojo/UserMessage.java @@ -0,0 +1,53 @@ +package com.luoo.user.pojo; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class UserMessage implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 消息ID + */ + @Id + private String messageId; + + /** + * 消息ID + */ + private String userId; + + + /** + * 消息标题 + */ + private String title; + + /** + * 消息内容 + */ + private String content; + + + /** + * 是否已读 0为未读 1为已读 + */ + private Integer haveRead; + + + /** + * 发送时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date sendTime; +} diff --git a/luoo_user/src/main/java/com/luoo/user/service/AppUpdateService.java b/luoo_user/src/main/java/com/luoo/user/service/AppUpdateService.java index a9a87d4..26f27a6 100644 --- a/luoo_user/src/main/java/com/luoo/user/service/AppUpdateService.java +++ b/luoo_user/src/main/java/com/luoo/user/service/AppUpdateService.java @@ -151,7 +151,6 @@ public class AppUpdateService { */ public AppUpdate getLatestUpdate(String appVersion, String deviceId) { - //return appUpdateDao.selectLatestUpdate(appVersion, deviceId); - return null; + return appUpdateDao.selectLatestUpdate(appVersion, deviceId); } } diff --git a/luoo_user/src/main/java/com/luoo/user/service/UserCollectInfoService.java b/luoo_user/src/main/java/com/luoo/user/service/UserCollectInfoService.java new file mode 100644 index 0000000..16cde92 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/service/UserCollectInfoService.java @@ -0,0 +1,61 @@ +package com.luoo.user.service; + + +import com.luoo.user.dao.UserCollectInfoDao; +import com.luoo.user.dto.UserCollectSongDto; +import com.luoo.user.pojo.UserCollectInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.stereotype.Service; +import util.IdWorker; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class UserCollectInfoService { + + @Autowired + private UserCollectInfoDao userCollectInfoDao; + + @Autowired + private IdWorker idWorker; + + + public void save() { + + UserCollectInfo userCollectInfo = new UserCollectInfo(); + UserCollectSongDto userCollectSongDto = new UserCollectSongDto(); + userCollectSongDto.setName("smell like teensprit"); + userCollectSongDto.setArtist("Nirvana"); + + UserCollectSongDto userCollectSongDto1 = new UserCollectSongDto(); + userCollectSongDto1.setName("the unforgiven"); + userCollectSongDto1.setArtist("Metallica"); + + List list = new ArrayList(); + list.add(userCollectSongDto); + list.add(userCollectSongDto1); + userCollectInfo.setSongList(list); + userCollectInfo.setCollectId(idWorker.nextId()+""); + userCollectInfo.setUserId("111222"); + userCollectInfoDao.save(userCollectInfo); + } + + + public UserCollectInfo findByUserId(){ + + return userCollectInfoDao.findUserCollectInfoByUserId("111222"); + } + + public void unCollect(){ + UserCollectInfo userCollectInfo = userCollectInfoDao.findUserCollectInfoByUserId("111222"); + UserCollectSongDto userCollectSongDto = new UserCollectSongDto(); + userCollectSongDto.setName("smell like teensprit"); + userCollectSongDto.setArtist("Nirvana"); + userCollectInfo.getSongList().remove(userCollectSongDto); + userCollectInfoDao.save(userCollectInfo); + } +} diff --git a/luoo_user/src/main/java/com/luoo/user/service/UserCollectService.java b/luoo_user/src/main/java/com/luoo/user/service/UserCollectService.java index 9a24388..8b355a3 100644 --- a/luoo_user/src/main/java/com/luoo/user/service/UserCollectService.java +++ b/luoo_user/src/main/java/com/luoo/user/service/UserCollectService.java @@ -1,6 +1,8 @@ package com.luoo.user.service; import java.util.Date; +import java.util.EnumMap; +import java.util.List; import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; @@ -8,6 +10,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.luoo.user.dao.UserCollectDao; +import com.luoo.user.dto.UserCollectCount; import com.luoo.user.pojo.UserCollect; import api.StatusCode; @@ -24,7 +27,7 @@ public class UserCollectService { throw new BizException(StatusCode.VALIDATE_FAILED); } String collectId=userId+"_"+objectId+"_"+collectType; - Optional dbCollect = userCollectDao.findById(collectId);//.findByUserIdAndObjectIdAndCollectType(userId, objectId, collectType); + Optional dbCollect = userCollectDao.findById(collectId); if (dbCollect.isPresent()) { return; } @@ -41,6 +44,26 @@ public class UserCollectService { Integer collectType) { String collectId=userId+"_"+objectId+"_"+collectType; userCollectDao.deleteById(collectId); - //userCollectDao.deleteByUserIdAndObjectIdAndCollectType(userId, objectId, collectType); + } + + public EnumMap getUserCollectTypeMap(String userId) { + EnumMap userCollectTypeMap=new EnumMap<>(CollectTypeEnum.class); + /* + * List + * userCollectCounts=userCollectDao.countByUserIdAndGroupByCollectType(userId); + * + * userCollectCounts.forEach(u->{ CollectTypeEnum collectTypeEnum = + * CollectTypeEnum.getByType(u.getCollectType()); + * userCollectTypeMap.put(collectTypeEnum, u.getCount()); }); + */ + return userCollectTypeMap; + } + + public int getFansCount(String userId) { + return userCollectDao.countByObjectIdAndCollectType(userId,CollectTypeEnum.FOLLOW.getType()); + } + + public int getCount(String userId, Integer type) { + return userCollectDao.countByUserIdAndCollectType(userId,type); } } diff --git a/luoo_user/src/main/java/com/luoo/user/service/UserMessageService.java b/luoo_user/src/main/java/com/luoo/user/service/UserMessageService.java new file mode 100644 index 0000000..533c1d9 --- /dev/null +++ b/luoo_user/src/main/java/com/luoo/user/service/UserMessageService.java @@ -0,0 +1,93 @@ +package com.luoo.user.service; + +import com.luoo.user.dao.UserMessageDao; +import com.luoo.user.pojo.UserMessage; +import com.mongodb.bulk.BulkWriteResult; +import dto.UserMessageDto; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.mongodb.core.BulkOperations; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; +import util.IdWorker; + +import java.util.Date; +import java.util.List; + +@Service +public class UserMessageService { + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private UserMessageDao userMessageDao; + @Autowired + private IdWorker idWorker; + + @Autowired + private MongoTemplate mongoTemplate; + + public void sendUserMessage(UserMessageDto userMessageDto) { + + userMessageDto.setMessageId(idWorker.nextId()+""); + userMessageDto.setHaveRead(0); + userMessageDto.setSendTime(new Date()); + rabbitTemplate.convertAndSend("userMessage",userMessageDto); + } + + + public List list() { + + return userMessageDao.findAll(); + } + + public List findByUserId(String userId) { + + return userMessageDao.findAllByUserId(userId); + } + + public Page findSearch(String userId,int page,int size) { + + + PageRequest pageRequest = PageRequest.of(page-1,size); + return userMessageDao.findByUserId(userId,pageRequest); + } + + + public void haveRead(String messageId) { + + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(messageId)); + Update update = new Update(); + update.set("haveRead",1); //已读为1 + mongoTemplate.updateFirst(query,update,UserMessage.class); + + } + + + + public void batchHaveRead(List userMessageList) { + + BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.ORDERED, UserMessage.class); + + for (UserMessage userMessage: userMessageList) { + Query query = new Query(); + query.addCriteria(Criteria.where("_id").is(userMessage.getMessageId())); + Update update = new Update(); + update.set("haveRead",1); //已读为1 + // 添加更新操作 + bulkOps.updateOne(query,update); + + } + + //执行批量更新操作 + + BulkWriteResult result = bulkOps.execute(); + } +} diff --git a/luoo_user/src/main/resources/sql/domain.sql b/luoo_user/src/main/resources/sql/domain.sql new file mode 100644 index 0000000..4943f3e --- /dev/null +++ b/luoo_user/src/main/resources/sql/domain.sql @@ -0,0 +1,14 @@ +-- 创建表 +drop table if exists indie_user.tb_app_update; +create table if not exists indie_user.tb_app_update ( + id varchar(100) not null comment 'ID' primary key, + version varchar(10) default '' not null comment '版本号', + update_desc varchar(500) default '' not null comment '更新描述', + update_type tinyint(1) default 0 not null comment '更新类型(0=全更新, 1=局部热更新)', + status tinyint(1) default 1 not null comment '状态(0=未发布, 1=灰度发布, 2=全网发布)', + grayscale_device varchar(4000) default '' not null comment '灰度设备ID集合(英文逗号相隔)', + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间' +) comment '应用版本更新记录表'; + +create index idx_version on indie_user.tb_app_update (version); +create index idx_create_time on indie_user.tb_app_update (create_time); \ No newline at end of file