Commit e3cd8cd3 authored by 万成波's avatar 万成波

移动端动态

parent cfae5224
......@@ -36,7 +36,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
baseEntity.setUpdateBy(username);
}
} catch (Exception e) {
log.error("=> 自动注入异常:", e);
// log.error("=> 自动注入异常:", e);
// throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
......@@ -56,7 +56,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
}
}
} catch (Exception e) {
log.error("=> 自动注入异常:", e);
// log.error("=> 自动注入异常:", e);
// throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
......
package com.tangguo.framework.config;
import com.tangguo.common.mauth.MobileProperties;
import com.tangguo.framework.config.properties.PermitAllUrlProperties;
import com.tangguo.framework.security.filter.JwtAuthenticationTokenFilter;
import com.tangguo.framework.security.handle.AuthenticationEntryPointImpl;
......@@ -20,6 +21,8 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.web.filter.CorsFilter;
import javax.annotation.Resource;
/**
* spring security配置
*
......@@ -63,6 +66,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PermitAllUrlProperties permitAllUrl;
@Resource
private MobileProperties mobileProperties;
/**
* 解决 无法直接注入 AuthenticationManager
*
......@@ -112,6 +119,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
// 移动端接口
.antMatchers(this.mobileProperties.getPathPatterns()).permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()
......
package com.tangguo.controller.mobile;
import com.tangguo.common.core.domain.AjaxResult;
import com.tangguo.common.mauth.MobileAuth;
import com.tangguo.domain.bo.CreateMomentBO;
import com.tangguo.service.IBbsMomentService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 移动端动态控制器
*
* @author 谈笑
* @createTime 2025-09-02 16:19:17 星期二
*/
@RestController
@RequestMapping("/bbs/mobile/moment")
public class MBbsMomentController {
@Resource
private IBbsMomentService momentService;
/**
* 创建动态
*
* @param bo 动态
* @return 创建结果
*/
@MobileAuth
@PostMapping("/create")
public AjaxResult createMoment(@RequestBody CreateMomentBO bo) {
this.momentService.createMoment(bo);
return AjaxResult.success();
}
}
package com.tangguo.controller.mobile;
import com.github.pagehelper.PageHelper;
import com.tangguo.common.core.domain.AjaxResult;
import com.tangguo.common.mauth.MobileAuth;
import com.tangguo.common.utils.PageUtils;
import com.tangguo.domain.BbsTopic;
import com.tangguo.domain.bo.CreateTopicBO;
import com.tangguo.domain.vo.BbsMomentListVO;
import com.tangguo.domain.vo.BbsTopicListVO;
import com.tangguo.service.IBbsMomentService;
import com.tangguo.service.IBbsTopicService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* 移动端话题控制器
*
* @author 谈笑
* @createTime 2025-09-02 16:19:17 星期二
*/
@RestController
@RequestMapping("/bbs/mobile/topic")
public class MBbsTopicController {
@Resource
private IBbsTopicService topicService;
/**
* 查询选择话题
*
* @param name 话题名称
* @return 话题
*/
@MobileAuth
@GetMapping("/select")
public AjaxResult getSelectTopics(String name) {
PageUtils.startPage();
List<BbsTopicListVO> topics = this.topicService.getSelectTopics(name);
return AjaxResult.success(topics);
}
/**
* 创建话题
*
* @param bo 话题
* @return 创建结果
*/
@MobileAuth
@PostMapping("/create")
public AjaxResult createTopic(@RequestBody CreateTopicBO bo) {
this.topicService.createTopic(bo);
return AjaxResult.success();
}
/**
* 查询热搜话题
*
* @return 话题
*/
@MobileAuth
@GetMapping("/ranking")
public AjaxResult getRankingTopic() {
List<BbsTopicListVO> topics = this.topicService.getRankingTopic();
return AjaxResult.success(topics);
}
/**
* 查询话题详情
*
* @param topicId 话题Id
* @return 话题明细
*/
@MobileAuth
@GetMapping("/details")
public AjaxResult getTopicDetails(@RequestParam Long topicId) {
PageUtils.startPage();
List<BbsMomentListVO> details = this.topicService.getTopicDetails(topicId);
return AjaxResult.success(details);
}
}
......@@ -3,6 +3,8 @@ package com.tangguo.controller.mobile;
import com.tangguo.common.core.domain.AjaxResult;
import com.tangguo.common.mauth.MobileAuth;
import com.tangguo.domain.bo.CodeLoginBO;
import com.tangguo.domain.vo.BbsUserMomentCountVO;
import com.tangguo.service.IBbsMomentService;
import com.tangguo.service.impl.BbsUserService;
import org.springframework.web.bind.annotation.*;
......@@ -10,18 +12,21 @@ import javax.annotation.Resource;
import java.util.Map;
/**
* 动态用户管理控制器
* 移动端用户控制器
*
* @author 谈笑
* @createTime 2025-09-02 14:42:17 星期二
*/
@RestController
@RequestMapping("/bbs/mobile/user")
public class BbsUserController {
public class MBbsUserController {
@Resource
private BbsUserService bbsUserService;
@Resource
private IBbsMomentService momentService;
/**
* 企微用户Code登录
......@@ -48,4 +53,17 @@ public class BbsUserController {
return AjaxResult.success(profileMap);
}
/**
* 查询用户动态相关统计数据
*
* @return 动态统计数据
*/
@MobileAuth
@GetMapping("/moment/count")
public AjaxResult userMomentCount() {
BbsUserMomentCountVO momentCount = this.momentService.getUserMomentCount();
return AjaxResult.success(momentCount);
}
}
......@@ -66,6 +66,11 @@ public class BbsMoment extends BaseEntity {
@ApiModelProperty("外部链接地址")
private String linkUrl;
/** 附件地址(逗号分割) */
@Excel(name = "附件地址(逗号分割)")
@ApiModelProperty("附件地址(逗号分割)")
private String attachmentUrls;
/** 是否开启评论:0 否、1 是 */
@Excel(name = "是否开启评论:0 否、1 是")
@ApiModelProperty("是否开启评论:0 否、1 是")
......@@ -113,6 +118,11 @@ public class BbsMoment extends BaseEntity {
@ApiModelProperty("动态点赞人数")
private Integer likeCount;
/** 动态评论人数 */
@Excel(name = "动态评论人数")
@ApiModelProperty("动态评论人数")
private Integer commentCount;
/** 动态投票人数 */
@Excel(name = "动态投票人数")
@ApiModelProperty("动态投票人数")
......
......@@ -22,9 +22,9 @@ import lombok.experimental.Accessors;
@ToString
@NoArgsConstructor
@Accessors(chain = true)
@TableName("bbs_moment_attachments")
@TableName("bbs_moment_attachment")
@ApiModel(value = "BbsMomentAttachments", description = "动态附件实体")
public class BbsMomentAttachments extends BaseEntity {
public class BbsMomentAttachment extends BaseEntity {
private static final long serialVersionUID = 1L;
/** ID */
......
package com.tangguo.domain.bo;
import lombok.Data;
import java.util.List;
/**
*
*
* @author 谈笑
* @createTime 2025-09-02 16:38:31 星期二
*/
@Data
public class CreateMomentBO {
/** 动态内容 */
private String content;
/** 动态类型:IMAGE 图片动态、VIDEO 视频动态 */
private String type;
/** 话题名称(逗号分割) */
private List<String> topicNames;
/** 话题Ids(逗号分割) */
private List<String> topicIds;
/** 外部链接地址 */
private String linkUrl;
/** 动态附件地址 */
private List<String> attachmentUrls;
/** 是否开启评论:0 否、1 是 */
private Integer isEnableComment;
/** 是否精选评论:0 否、1 是 */
private Integer isEnableFeaturedComment;
/** 是否开启投票:0 否、1 是 */
private Integer isEnableVote;
/** 投票标题 */
private String voteTitle;
/** 投票选项类型:TEXT 文字、IMAGE 图片 */
private String voteOptionType;
/** 动态附件 */
private List<Attachment> attachments;
/** 动态投票选项 */
private List<VoteOption> voteOptions;
/**
* 动态附件
*/
@Data
public static class Attachment {
/** 附件名称 */
private String name;
/** 附件类型:图片 IMAGE、视频 VIDEO */
private String type;
/** 附件预览地址 */
private String url;
/** 文件扩展名:PNG、JPG、MP4 */
private String fileExt;
}
/**
* 动态投票选项
*/
@Data
public static class VoteOption {
/** 选项类型:TEXT 文字、IMAGE 图片 */
private String type;
/** 选项名称 */
private String name;
/** 选项编码 */
private String code;
/** 图片地址 */
private String imageUrl;
/** 排序值 */
private Integer sort;
}
}
package com.tangguo.domain.bo;
import lombok.Data;
/**
*
*
* @author 谈笑
* @createTime 2025-09-02 16:29:21 星期二
*/
@Data
public class CreateTopicBO {
/**
* 话题名称
*/
private String name;
}
package com.tangguo.domain.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.tangguo.common.annotation.Excel;
import com.tangguo.domain.bo.CreateMomentBO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
*
*
* @author 谈笑
* @createTime 2025-09-03 15:42:59 星期三
*/
@Data
public class BbsMomentListVO {
/** 动态Id */
private Long id;
/** 发布人用户名 */
private String userName;
/** 动态内容 */
private String content;
/** 动态类型:IMAGE 图片动态、VIDEO 视频动态 */
private String type;
/** 话题名称 */
private List<String> topicNames;
/** 话题Ids */
private List<String> topicIds;
/** 外部链接地址 */
private String linkUrl;
/** 附件地址 */
private List<String> attachmentUrls;
/** 是否开启评论:0 否、1 是 */
private Integer isEnableComment;
/** 是否精选评论:0 否、1 是 */
private Integer isEnableFeaturedComment;
/** 是否开启投票:0 否、1 是 */
private Integer isEnableVote;
/** 投票标题 */
private String voteTitle;
/** 投票选项类型:TEXT 文字、IMAGE 图片 */
private String voteOptionType;
/** 投票选项JSON */
private String voteOptions;
/** 动态点赞人数 */
private Integer likeCount;
/** 动态评论人数 */
private Integer commentCount;
/** 动态投票人数 */
private Integer voteCount;
}
package com.tangguo.domain.vo;
import com.tangguo.common.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
*
* @author 谈笑
* @createTime 2025-09-03 15:48:15 星期三
*/
@Data
public class BbsTopicListVO {
/** 话题Id */
private Long id;
/** 话题名称 */
private String name;
/** 话题动态数量 */
private int momentCount;
}
package com.tangguo.domain.vo;
import lombok.Data;
/**
*
*
* @author 谈笑
* @createTime 2025-09-03 15:29:02 星期三
*/
@Data
public class BbsUserMomentCountVO {
/**
* 动态数量
*/
private int momentCount;
/**
* 评论数量
*/
private int commentCount;
/**
* 点在数量
*/
private int likeCount;
}
package com.tangguo.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 启用禁用状态枚举
*
* @author 谈笑
* @createTime 2025-09-02 17:05:22 星期二
*/
@Getter
@AllArgsConstructor
public enum EnableStatus {
QY(1, "启用"), JY(0, "禁用");
private final int status;
private final String desc;
}
package com.tangguo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tangguo.domain.BbsMomentAttachments;
import com.tangguo.domain.BbsMomentAttachment;
/**
* 动态附件Mapper接口
......@@ -9,5 +9,5 @@ import com.tangguo.domain.BbsMomentAttachments;
* @author ruoyi
* @date 2025-09-01
*/
public interface BbsMomentAttachmentsMapper extends BaseMapper<BbsMomentAttachments> {
public interface BbsMomentAttachmentMapper extends BaseMapper<BbsMomentAttachment> {
}
......@@ -2,6 +2,7 @@ package com.tangguo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tangguo.domain.BbsMoment;
import com.tangguo.domain.vo.BbsUserMomentCountVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
......@@ -16,4 +17,7 @@ public interface BbsMomentMapper extends BaseMapper<BbsMoment> {
List<BbsMoment> selectBbsMomentList(@Param("moment") BbsMoment moment);
BbsUserMomentCountVO selectUserMomentCount(@Param("userName") String userName);
}
......@@ -2,6 +2,10 @@ package com.tangguo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tangguo.domain.BbsTopic;
import com.tangguo.domain.vo.BbsTopicListVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 话题Mapper接口
......@@ -10,4 +14,10 @@ import com.tangguo.domain.BbsTopic;
* @date 2025-08-27
*/
public interface BbsTopicMapper extends BaseMapper<BbsTopic> {
List<BbsTopicListVO> selectSelectTopics(@Param("name") String name);
List<BbsTopicListVO> selectRankingTopic();
}
package com.tangguo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tangguo.domain.BbsMomentAttachment;
import com.tangguo.domain.bo.CreateMomentBO;
import java.util.List;
/**
* 动态附件Service接口
*
* @author ruoyi
* @date 2025-09-01
*/
public interface IBbsMomentAttachmentService extends IService<BbsMomentAttachment> {
/**
* 查询动态附件
*
* @param momentId 动态Id
* @return 附件
*/
List<BbsMomentAttachment> getAttachments(Long momentId);
/**
* 添加动态附件
*
* @param userName 用户名
* @param momentId 动态Id
* @param attachments 动态附件
*/
void addAttachments(String userName, Long momentId, List<CreateMomentBO.Attachment> attachments);
/**
* 删除动态附件
*
* @param momentId 动态Id
*/
void deleteAttachments(Long momentId);
}
package com.tangguo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tangguo.domain.BbsMomentAttachments;
/**
* 动态附件Service接口
*
* @author ruoyi
* @date 2025-09-01
*/
public interface IBbsMomentAttachmentsService extends IService<BbsMomentAttachments> {
}
......@@ -2,6 +2,8 @@ package com.tangguo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tangguo.domain.BbsMoment;
import com.tangguo.domain.bo.CreateMomentBO;
import com.tangguo.domain.vo.BbsUserMomentCountVO;
import java.util.List;
......@@ -19,6 +21,22 @@ public interface IBbsMomentService extends IService<BbsMoment> {
* @param bbsMoment 动态
* @return 动态集合
*/
public List<BbsMoment> selectBbsMomentList(BbsMoment bbsMoment);
List<BbsMoment> selectBbsMomentList(BbsMoment bbsMoment);
/**
* 查询用户动态相关统计数据
*
* @return 动态统计数据
*/
BbsUserMomentCountVO getUserMomentCount();
/**
* 创建动态
*
* @param bo 动态
*/
void createMoment(CreateMomentBO bo);
}
package com.tangguo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tangguo.domain.BbsMomentAttachment;
import com.tangguo.domain.BbsMomentVoteOption;
import com.tangguo.domain.bo.CreateMomentBO;
import java.util.List;
/**
* 动态投票选项Service接口
......@@ -11,4 +15,30 @@ import com.tangguo.domain.BbsMomentVoteOption;
*/
public interface IBbsMomentVoteOptionService extends IService<BbsMomentVoteOption> {
/**
* 查询动态投票选项
*
* @param momentId 动态Id
* @return 投票选项
*/
List<BbsMomentVoteOption> getVoteOptions(Long momentId);
/**
* 添加动态投票选项
*
* @param momentId 动态Id
* @param voteOptions 投票选项
*/
void addVoteOptions(Long momentId, List<CreateMomentBO.VoteOption> voteOptions);
/**
* 删除动态投票选项
*
* @param momentId 动态Id
*/
void deleteVoteOptions(Long momentId);
}
......@@ -2,6 +2,9 @@ package com.tangguo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tangguo.domain.BbsTopic;
import com.tangguo.domain.bo.CreateTopicBO;
import com.tangguo.domain.vo.BbsMomentListVO;
import com.tangguo.domain.vo.BbsTopicListVO;
import java.util.List;
......@@ -53,4 +56,38 @@ public interface IBbsTopicService extends IService<BbsTopic> {
*/
void deleteTopic(Long topicId);
/**
* 查询选择话题
*
* @param name 话题名称
* @return 话题
*/
List<BbsTopicListVO> getSelectTopics(String name);
/**
* 查询热搜话题
*
* @return 话题
*/
List<BbsTopicListVO> getRankingTopic();
/**
* 查询话题详情
*
* @param topicId 话题Id
* @return 话题明细
*/
List<BbsMomentListVO> getTopicDetails(Long topicId);
/**
* 创建话题
*
* @param bo 话题
*/
void createTopic(CreateTopicBO bo);
}
package com.tangguo.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tangguo.domain.BbsMomentAttachment;
import com.tangguo.domain.bo.CreateMomentBO;
import com.tangguo.mapper.BbsMomentAttachmentMapper;
import com.tangguo.service.IBbsMomentAttachmentService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 动态附件Service业务层处理
*
* @author ruoyi
* @date 2025-09-01
*/
@Service
public class BbsMomentAttachmentServiceImpl extends ServiceImpl<BbsMomentAttachmentMapper, BbsMomentAttachment> implements IBbsMomentAttachmentService {
@Resource
private BbsMomentAttachmentMapper bbsMomentAttachmentMapper;
/**
* 查询动态附件
*
* @param momentId 动态Id
* @return 附件
*/
@Override
public List<BbsMomentAttachment> getAttachments(Long momentId) {
return this.list(
Wrappers.lambdaQuery(BbsMomentAttachment.class).eq(BbsMomentAttachment::getMomentId, momentId)
);
}
/**
* 添加动态附件
*
* @param userName 用户名
* @param momentId 动态Id
* @param attachments 动态附件
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void addAttachments(String userName, Long momentId, List<CreateMomentBO.Attachment> attachments) {
if (CollUtil.isNotEmpty(attachments)) {
List<BbsMomentAttachment> newAttachments = new ArrayList<>(attachments.size());
for (CreateMomentBO.Attachment attachment : attachments) {
BbsMomentAttachment newAttachment = new BbsMomentAttachment();
newAttachment.setMomentId(momentId);
newAttachment.setUserName(userName);
newAttachment.setName(attachment.getName());
newAttachment.setType(attachment.getType());
newAttachment.setUrl(attachment.getUrl());
newAttachment.setFileExt(attachment.getFileExt());
newAttachments.add(newAttachment);
}
this.saveBatch(newAttachments);
}
}
/**
* 删除动态附件
*
* @param momentId 动态Id
*/
@Override
public void deleteAttachments(Long momentId) {
this.remove(
Wrappers.lambdaQuery(BbsMomentAttachment.class).eq(BbsMomentAttachment::getMomentId, momentId)
);
}
}
package com.tangguo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tangguo.domain.BbsMomentAttachments;
import com.tangguo.mapper.BbsMomentAttachmentsMapper;
import com.tangguo.service.IBbsMomentAttachmentsService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 动态附件Service业务层处理
*
* @author ruoyi
* @date 2025-09-01
*/
@Service
public class BbsMomentAttachmentsServiceImpl extends ServiceImpl<BbsMomentAttachmentsMapper, BbsMomentAttachments> implements IBbsMomentAttachmentsService {
@Resource
private BbsMomentAttachmentsMapper bbsMomentAttachmentsMapper;
}
package com.tangguo.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tangguo.common.exception.ServiceException;
import com.tangguo.common.mauth.MobileTokenHelper;
import com.tangguo.domain.BbsMoment;
import com.tangguo.domain.bo.CreateMomentBO;
import com.tangguo.domain.vo.BbsUserMomentCountVO;
import com.tangguo.enums.EnableStatus;
import com.tangguo.mapper.BbsMomentMapper;
import com.tangguo.service.IBbsMomentAttachmentService;
import com.tangguo.service.IBbsMomentService;
import com.tangguo.service.IBbsMomentVoteOptionService;
import org.apache.ibatis.parsing.TokenHandler;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
......@@ -21,6 +32,12 @@ public class BbsMomentServiceImpl extends ServiceImpl<BbsMomentMapper, BbsMoment
@Resource
private BbsMomentMapper bbsMomentMapper;
@Resource
private IBbsMomentAttachmentService attachmentsService;
@Resource
private IBbsMomentVoteOptionService voteOptionService;
/**
* 查询动态列表
......@@ -33,4 +50,92 @@ public class BbsMomentServiceImpl extends ServiceImpl<BbsMomentMapper, BbsMoment
return this.baseMapper.selectBbsMomentList(moment);
}
/**
* 查询用户动态相关统计数据
*
* @return 动态统计数据
*/
@Override
public BbsUserMomentCountVO getUserMomentCount() {
String username = MobileTokenHelper.getUsername();
return this.baseMapper.selectUserMomentCount(username);
}
/**
* 创建动态
*
* @param bo 动态
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void createMoment(CreateMomentBO bo) {
// 添加动态
String username = MobileTokenHelper.getUsername();
BbsMoment newMoment = this.buildBbsMoment(bo);
newMoment.setUserName(username);
this.save(newMoment);
// 添加动态附件
List<CreateMomentBO.Attachment> attachments = bo.getAttachments();
this.attachmentsService.addAttachments(username, newMoment.getId(), attachments);
// 添加动态投票选项
if (EnableStatus.QY.getStatus() == bo.getIsEnableVote()) {
List<CreateMomentBO.VoteOption> voteOptions = bo.getVoteOptions();
this.voteOptionService.addVoteOptions(newMoment.getId(), voteOptions);
}
}
/**
* 构建动态实体
*
* @param bo 动态
* @return 动态实体
*/
private BbsMoment buildBbsMoment(CreateMomentBO bo) {
BbsMoment newMoment = new BbsMoment();
newMoment.setContent(bo.getContent());
newMoment.setType(bo.getType());
newMoment.setLinkUrl(bo.getLinkUrl());
newMoment.setIsEnableComment(bo.getIsEnableComment());
newMoment.setIsEnableFeaturedComment(bo.getIsEnableFeaturedComment());
// 动态主题
List<String> topicNames = bo.getTopicNames();
if (CollUtil.isNotEmpty(topicNames)) {
newMoment.setTopicNames(String.join(",", topicNames));
}
List<String> topicIds = bo.getTopicIds();
if (CollUtil.isNotEmpty(topicIds)) {
newMoment.setTopicIds(String.join(",", topicIds));
}
// 动态附件
List<String> attachmentUrls = bo.getAttachmentUrls();
if (CollUtil.isNotEmpty(attachmentUrls)) {
newMoment.setAttachmentUrls(String.join(",", attachmentUrls));
}
// 动态投票
Integer isEnableVote = bo.getIsEnableVote();
newMoment.setIsEnableVote(isEnableVote);
if (EnableStatus.QY.getStatus() == isEnableVote) {
newMoment.setVoteTitle(bo.getVoteTitle());
newMoment.setVoteOptionType(bo.getVoteOptionType());
List<CreateMomentBO.VoteOption> voteOptions = bo.getVoteOptions();
for (int i = 0; i < voteOptions.size(); i++) {
int index = i + 1;
CreateMomentBO.VoteOption option = voteOptions.get(i);
option.setType(bo.getVoteOptionType());
option.setCode(String.valueOf(index));
option.setSort(index);
}
newMoment.setVoteOptions(JSONUtil.toJsonStr(voteOptions));
}
return newMoment;
}
}
package com.tangguo.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tangguo.domain.BbsMomentVoteOption;
import com.tangguo.domain.bo.CreateMomentBO;
import com.tangguo.mapper.BbsMomentVoteOptionMapper;
import com.tangguo.service.IBbsMomentVoteOptionService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 动态投票选项Service业务层处理
......@@ -21,4 +28,56 @@ public class BbsMomentVoteOptionServiceImpl extends ServiceImpl<BbsMomentVoteOpt
private BbsMomentVoteOptionMapper bbsMomentVoteOptionMapper;
/**
* 查询动态投票选项
*
* @param momentId 动态Id
* @return 投票选项
*/
@Override
public List<BbsMomentVoteOption> getVoteOptions(Long momentId) {
return this.list(
Wrappers.lambdaQuery(BbsMomentVoteOption.class).eq(BbsMomentVoteOption::getMomentId, momentId)
);
}
/**
* 添加动态投票选项
*
* @param momentId 动态Id
* @param voteOptions 投票选项
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void addVoteOptions(Long momentId, List<CreateMomentBO.VoteOption> voteOptions) {
if (CollUtil.isNotEmpty(voteOptions)) {
List<BbsMomentVoteOption> newVoteOptions = new ArrayList<>(voteOptions.size());
for (CreateMomentBO.VoteOption voteOption : voteOptions) {
BbsMomentVoteOption newVoteOption = new BbsMomentVoteOption();
newVoteOption.setMomentId(momentId);
newVoteOption.setType(voteOption.getType());
newVoteOption.setName(voteOption.getName());
newVoteOption.setCode(voteOption.getCode());
newVoteOption.setImageUrl(voteOption.getImageUrl());
newVoteOption.setSort(voteOption.getSort());
newVoteOptions.add(newVoteOption);
}
this.saveBatch(newVoteOptions);
}
}
/**
* 删除动态投票选项
*
* @param momentId 动态Id
*/
@Override
public void deleteVoteOptions(Long momentId) {
this.remove(
Wrappers.lambdaQuery(BbsMomentVoteOption.class).eq(BbsMomentVoteOption::getMomentId, momentId)
);
}
}
......@@ -5,14 +5,19 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tangguo.common.exception.ServiceException;
import com.tangguo.common.mauth.MobileTokenHelper;
import com.tangguo.common.utils.StringUtils;
import com.tangguo.domain.BbsTopic;
import com.tangguo.domain.bo.CreateTopicBO;
import com.tangguo.domain.vo.BbsMomentListVO;
import com.tangguo.domain.vo.BbsTopicListVO;
import com.tangguo.enums.TopicTopStatus;
import com.tangguo.mapper.BbsTopicMapper;
import com.tangguo.service.IBbsTopicService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
......@@ -137,4 +142,63 @@ public class BbsTopicServiceImpl extends ServiceImpl<BbsTopicMapper, BbsTopic> i
this.removeById(topicId);
}
/**
* 查询选择话题
*
* @param name 话题名称
* @return 话题
*/
@Override
public List<BbsTopicListVO> getSelectTopics(String name) {
return this.baseMapper.selectSelectTopics(name);
}
/**
* 查询热搜话题
*
* @return 话题
*/
@Override
public List<BbsTopicListVO> getRankingTopic() {
return this.baseMapper.selectRankingTopic();
}
/**
* 查询话题详情
*
* @param topicId 话题Id
* @return 话题明细
*/
@Override
public List<BbsMomentListVO> getTopicDetails(Long topicId) {
return Collections.emptyList();
}
/**
* 创建话题
*
* @param bo 话题
*/
@Override
public void createTopic(CreateTopicBO bo) {
synchronized (bo.getName().intern()) {
long nameCount = this.count(
Wrappers.lambdaQuery(BbsTopic.class).eq(BbsTopic::getName, bo.getName())
);
if (nameCount > 0) {
throw new ServiceException("创建失败,当前话题名称已存在。");
}
BbsTopic newTopic = new BbsTopic();
newTopic.setCreateBy(MobileTokenHelper.getUsername());
newTopic.setSource("移动端用户");
newTopic.setName(bo.getName());
this.save(newTopic);
}
}
}
......@@ -51,21 +51,13 @@ public class BbsUserService {
throw new ServiceException("登录失败,查询企微用户信息失败。");
}
try {
QwmhUserInfo dbUser = this.bbsUserMapper.selectQwmhUserInfo(userName);
if (Objects.nonNull(dbUser)) {
Map<String, Object> payloads = new LinkedHashMap<>(1);
payloads.put("userName", dbUser.getUserName());
return MobileTokenHelper.createDetailToken(payloads);
} else {
throw new ServiceException("登录失败,未查询到当前登录用户数据。");
}
} catch (ServiceException e) {
log.error("=> 移动端用户登录失败:", e);
throw e;
} catch (Exception e) {
log.error("=> 移动端用户登录失败:", e);
throw new ServiceException("登录失败:" + e.getMessage());
QwmhUserInfo dbUser = this.bbsUserMapper.selectQwmhUserInfo(userName);
if (Objects.nonNull(dbUser)) {
Map<String, Object> payloads = new LinkedHashMap<>(1);
payloads.put("userName", dbUser.getUserName());
return MobileTokenHelper.createDetailToken(payloads);
} else {
throw new ServiceException("登录失败,未查询到当前登录用户数据。");
}
}
......
......@@ -2,6 +2,6 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tangguo.mapper.BbsMomentAttachmentsMapper">
<mapper namespace="com.tangguo.mapper.BbsMomentAttachmentMapper">
</mapper>
......@@ -28,4 +28,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
m.create_time DESC
</select>
<select id="selectUserMomentCount" resultType="com.tangguo.domain.vo.BbsUserMomentCountVO">
SELECT
(SELECT COUNT(*) FROM bbs_moment WHERE user_name = #{userName}) AS monent_count,
(SELECT COUNT(*) FROM bbs_moment_comment WHERE user_name = #{userName}) AS comment_count,
(SELECT COUNT(*) FROM bbs_moment_like WHERE user_name = #{userName}) AS like_count
</select>
</mapper>
......@@ -3,6 +3,32 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tangguo.mapper.BbsTopicMapper">
<select id="selectSelectTopics" resultType="com.tangguo.domain.vo.BbsTopicListVO">
SELECT
id, name
FROM
bbs_topic
<where>
<if test="name != null and name != ''">
name LIKE CONCAT('%', #{name}, '%')
</if>
</where>
ORDER BY
is_top DESC, CASE WHEN is_top = 1 THEN top_time END DESC, heat DESC, sort ASC, create_time DESC
</select>
<select id="selectRankingTopic" resultType="com.tangguo.domain.vo.BbsTopicListVO">
SELECT
t.id, t.name, COUNT(m.id) AS moment_count
FROM
bbs_topic t
LEFT JOIN
bbs_moment m ON FIND_IN_SET(t.id, m.topic_ids)
ORDER BY
t.is_top DESC, CASE WHEN t.is_top = 1 THEN t.top_time END DESC, t.heat DESC, t.sort ASC, t.create_time DESC
LIMIT 10
</select>
</mapper>
......@@ -4,7 +4,22 @@
<mapper namespace="com.tangguo.mapper.BbsUserMapper">
<select id="selectQwmhUserInfo" resultType="com.tangguo.common.domain.QwmhUserInfo">
SELECT * FROM qwmh_sys_user_view WHERE user_name = #{userName}
SELECT
uv.nike_name,
uv.user_name,
uv.dept_name,
IFNULL(p.current_points, 0) AS current_points,
IFNULL(p.accumulated_points, 0) AS accumulated_points,
IFNULL(p.grade_name, ug.name) AS grade_name
FROM
qwmh_sys_user_view uv
LEFT JOIN
bbs_user_points p ON p.user_name = uv.user_name
CROSS JOIN (
SELECT (SELECT name FROM bbs_grade WHERE is_initial = 1 ORDER BY create_time DESC LIMIT 1) AS name
) ug
WHERE
uv.user_name = #{userName}
</select>
</mapper>
......@@ -29,7 +29,7 @@ public interface IBbsUserPointsService extends IService<BbsUserPoints> {
* @param userName 用户名
* @return 积分
*/
BbsUserPoints getUserPoints(String userName);
BbsUserPoints getAndInitUserPoints(String userName);
/**
......
......@@ -68,7 +68,7 @@ public class BbsUserPointsExchangeServiceImpl extends ServiceImpl<BbsUserPointsE
// 用户积分校验
String userName = exchange.getUserName();
Integer exchangePoints = dbGoods.getExchangePoints();
BbsUserPoints dbUserPoints = this.userPointsService.getUserPoints(userName);
BbsUserPoints dbUserPoints = this.userPointsService.getAndInitUserPoints(userName);
int currentPoints = dbUserPoints.getCurrentPoints() - dbGoods.getExchangePoints();
if (currentPoints < 0) {
throw new ServiceException("兑换失败,当前用户可用积分不足。");
......
......@@ -63,7 +63,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
*/
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
@Override
public BbsUserPoints getUserPoints(String userName) {
public BbsUserPoints getAndInitUserPoints(String userName) {
BbsUserPoints dbUserPoints = this.baseMapper.selectUserPoints(userName);
if (Objects.isNull(dbUserPoints)) {
QwmhUserInfo qwmhSysUser = this.baseMapper.selectQwmhUser(userName);
......@@ -163,7 +163,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
// 更新用户积分
String userName = detail.getUserName();
BbsUserPoints userPoints = this.pointsServiceImpl.getUserPoints(userName);
BbsUserPoints userPoints = this.pointsServiceImpl.getAndInitUserPoints(userName);
int beforeCurrentPoints = userPoints.getCurrentPoints();
int afterCurrentPoints = beforeCurrentPoints + points;
userPoints.setCurrentPoints(afterCurrentPoints);
......@@ -206,7 +206,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
// 更新用户积分
String userName = detail.getUserName();
BbsUserPoints userPoints = this.pointsServiceImpl.getUserPoints(userName);
BbsUserPoints userPoints = this.pointsServiceImpl.getAndInitUserPoints(userName);
Integer beforeCurrentPoints = userPoints.getCurrentPoints();
if (points > beforeCurrentPoints) {
throw new ServiceException("扣减用户积分失败,当前用户可用积分不足。");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment