Commit 7c1c8c48 authored by 万成波's avatar 万成波

用户等级

parent d85c499b
package com.tangguo.controller;
import com.tangguo.common.annotation.Log;
import com.tangguo.common.core.controller.BaseController;
import com.tangguo.common.core.domain.AjaxResult;
import com.tangguo.common.core.page.TableDataInfo;
import com.tangguo.common.enums.BusinessType;
import com.tangguo.domain.BbsGrade;
import com.tangguo.service.IBbsGradeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* 用户等级Controller
*
* @author ruoyi
* @date 2025-08-28
*/
@Api(tags = "用户等级管理")
@RestController
@RequestMapping("/bbs/moment/grade")
public class BbsGradeController extends BaseController {
@Resource
private IBbsGradeService bbsGradeService;
/**
* 查询用户等级列表
*/
@ApiOperation("查询用户等级列表")
@PreAuthorize("@ss.hasPermi('grade:grade:list')")
@GetMapping("/list")
public TableDataInfo list(BbsGrade bbsGrade) {
startPage();
List<BbsGrade> list = bbsGradeService.selectBbsGradeList(bbsGrade);
return getDataTable(list);
}
/**
* 获取用户等级详细信息
*/
@ApiOperation("获取用户等级详细信息")
@PreAuthorize("@ss.hasPermi('grade:grade:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(bbsGradeService.getById(id));
}
/**
* 新增用户等级
*/
@ApiOperation("新增用户等级")
@PreAuthorize("@ss.hasPermi('grade:grade:add')")
@Log(title = "用户等级", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody BbsGrade grade) {
this.bbsGradeService.addGrade(grade);
return AjaxResult.success();
}
/**
* 修改用户等级
*/
@ApiOperation("修改用户等级")
@PreAuthorize("@ss.hasPermi('grade:grade:edit')")
@Log(title = "用户等级", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody BbsGrade grade) {
this.bbsGradeService.editGrade(grade);
return AjaxResult.success();
}
/**
* 删除用户等级
*/
@ApiOperation("删除用户等级")
@PreAuthorize("@ss.hasPermi('grade:grade:remove')")
@Log(title = "用户等级", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public AjaxResult remove(@PathVariable Long id) {
this.bbsGradeService.deleteGrade(id);
return AjaxResult.success();
}
}
...@@ -98,17 +98,29 @@ public class BbsSensitiveWordController extends BaseController { ...@@ -98,17 +98,29 @@ public class BbsSensitiveWordController extends BaseController {
} }
/** /**
* 修改敏感词库 * 修改敏感词库
*/ */
@ApiOperation("修改敏感词库") @ApiOperation("修改敏感词库")
@PreAuthorize("@ss.hasPermi('word:word:edit')") @PreAuthorize("@ss.hasPermi('word:word:edit')")
@Log(title = "敏感词库", businessType = BusinessType.UPDATE) @Log(title = "敏感词库", businessType = BusinessType.IMPORT)
@PostMapping("/import") @PostMapping("/import")
public AjaxResult importWords(MultipartFile file) { public AjaxResult importWords(MultipartFile file) {
DataImportResult<String> result = this.bbsSensitiveWordService.importWords(file); DataImportResult<String> result = this.bbsSensitiveWordService.importWords(file);
return AjaxResult.success(result); return AjaxResult.success(result);
} }
/**
* 刷新敏感词库缓存
*/
@ApiOperation("刷新敏感词库缓存")
@PreAuthorize("@ss.hasPermi('word:word:refresh')")
@Log(title = "敏感词库", businessType = BusinessType.UPDATE)
@PutMapping("/refresh")
public AjaxResult refresh() {
this.bbsSensitiveWordService.refreshCacheWords();
return AjaxResult.success();
}
} }
...@@ -81,10 +81,10 @@ public class BbsTopicController extends BaseController { ...@@ -81,10 +81,10 @@ public class BbsTopicController extends BaseController {
/** /**
* 修改话题 * 置顶话题
*/ */
@ApiOperation("修改话题") @ApiOperation("置顶话题")
@PreAuthorize("@ss.hasPermi('topic:topic:edit')") @PreAuthorize("@ss.hasPermi('topic:topic:top')")
@Log(title = "话题", businessType = BusinessType.UPDATE) @Log(title = "话题", businessType = BusinessType.UPDATE)
@PutMapping("/top") @PutMapping("/top")
public AjaxResult top(@RequestBody BbsTopic bbsTopic) { public AjaxResult top(@RequestBody BbsTopic bbsTopic) {
......
package com.tangguo.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tangguo.common.annotation.Excel;
import com.tangguo.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
/**
* 用户等级对象 bbs_grade
*
* @author ruoyi
* @date 2025-08-28
*/
@Data
@ToString
@NoArgsConstructor
@Accessors(chain = true)
@TableName("bbs_grade")
@ApiModel(value = "BbsGrade", description = "用户等级实体")
public class BbsGrade extends BaseEntity {
private static final long serialVersionUID = 1L;
/** ID */
@TableId(type = IdType.AUTO)
@ApiModelProperty("ID")
private Long id;
/** 等级名称 */
@Excel(name = "等级名称")
@ApiModelProperty("等级名称")
private String name;
/** 等级编码 */
@Excel(name = "等级编码")
@ApiModelProperty("等级编码")
private String code;
/** 最小积分 */
@Excel(name = "最小积分")
@ApiModelProperty("最小积分")
private Integer minPoints;
/** 最大积分 */
@Excel(name = "最大积分")
@ApiModelProperty("最大积分")
private Integer maxPoints;
/** 排序值(升序) */
@Excel(name = "排序值", readConverterExp = "升=序")
@ApiModelProperty("排序值(升序)")
private Integer sort;
}
package com.tangguo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tangguo.domain.BbsGrade;
/**
* 用户等级Mapper接口
*
* @author ruoyi
* @date 2025-08-28
*/
public interface BbsGradeMapper extends BaseMapper<BbsGrade> {
}
package com.tangguo.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tangguo.domain.BbsGrade;
/**
* 用户等级Service接口
*
* @author ruoyi
* @date 2025-08-28
*/
public interface IBbsGradeService extends IService<BbsGrade> {
/**
* 查询用户等级列表
*
* @param bbsGrade 用户等级
* @return 用户等级集合
*/
List<BbsGrade> selectBbsGradeList(BbsGrade bbsGrade);
/**
* 新增等级
*
* @param grade 等级
*/
void addGrade(BbsGrade grade);
/**
* 修改等级
*
* @param grade 等级
*/
void editGrade(BbsGrade grade);
/**
* 删除等级
*
* @param gradeId 等级Id
*/
void deleteGrade(Long gradeId);
}
...@@ -24,6 +24,12 @@ public interface IBbsSensitiveWordService extends IService<BbsSensitiveWord> { ...@@ -24,6 +24,12 @@ public interface IBbsSensitiveWordService extends IService<BbsSensitiveWord> {
Set<String> getDbWords(); Set<String> getDbWords();
/**
* 刷新缓存敏感词
*/
void refreshCacheWords();
/** /**
* 查询敏感词库列表 * 查询敏感词库列表
* *
......
package com.tangguo.service.impl;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.utils.StringUtils;
import com.tangguo.domain.BbsGrade;
import com.tangguo.mapper.BbsGradeMapper;
import com.tangguo.service.IBbsGradeService;
import org.springframework.stereotype.Service;
import javax.annotation.Generated;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
/**
* 用户等级Service业务层处理
*
* @author ruoyi
* @date 2025-08-28
*/
@Service
public class BbsGradeServiceImpl extends ServiceImpl<BbsGradeMapper, BbsGrade> implements IBbsGradeService {
@Resource
private BbsGradeMapper bbsGradeMapper;
/**
* 查询用户等级列表
*
* @param grade 用户等级
* @return 用户等级
*/
@Override
public List<BbsGrade> selectBbsGradeList(BbsGrade grade) {
LambdaQueryWrapper<BbsGrade> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(BbsGrade::getCreateTime);
lqw.like(StringUtils.isNotBlank(grade.getName()), BbsGrade::getName, grade.getName());
lqw.eq(StringUtils.isNotBlank(grade.getCode()), BbsGrade::getCode, grade.getCode());
lqw.eq(grade.getSort() != null, BbsGrade::getSort, grade.getSort());
return bbsGradeMapper.selectList(lqw);
}
/**
* 新增等级
*
* @param grade 等级
*/
@Override
public void addGrade(BbsGrade grade) {
long nameCount = this.count(
Wrappers.lambdaQuery(BbsGrade.class).eq(BbsGrade::getName, grade.getName())
);
if (nameCount > 0) {
throw new ServiceException("添加失败,当前等级名称已存在。");
}
Integer s1 = grade.getMinPoints();
Integer e1 = grade.getMaxPoints();
if (s1 < 0 || e1 < 0 || s1 >= e1) {
throw new ServiceException("添加失败,当前等级积分范围错误。");
}
List<BbsGrade> dbGrades = this.list();
for (BbsGrade g : dbGrades) {
if (!(e1 < g.getMinPoints() || s1 > g.getMaxPoints())) {
throw new ServiceException("添加失败,当前等级积分范围和等级【" + g.getName() + "】积分范围冲突。");
}
}
BbsGrade addGrade = new BbsGrade();
addGrade.setName(grade.getName());
addGrade.setCode(IdUtil.fastSimpleUUID());
addGrade.setSort(grade.getSort());
addGrade.setMinPoints(grade.getMinPoints());
addGrade.setMaxPoints(grade.getMaxPoints());
this.save(addGrade);
}
/**
* 修改等级
*
* @param grade 等级
*/
@Override
public void editGrade(BbsGrade grade) {
BbsGrade dbGrade = this.getById(grade.getId());
if (Objects.isNull(dbGrade)) {
throw new ServiceException("修改失败,未查询到当前等级数据。");
}
if (!dbGrade.getName().equals(grade.getName())) {
long nameCount = this.count(
Wrappers.lambdaQuery(BbsGrade.class).eq(BbsGrade::getName, grade.getName())
);
if (nameCount > 0) {
throw new ServiceException("修改失败,当前等级名称已存在。");
}
}
Integer s1 = grade.getMinPoints();
Integer e1 = grade.getMaxPoints();
if (s1 < 0 || e1 < 0 || s1 >= e1) {
throw new ServiceException("修改失败,当前等级积分范围错误。");
}
List<BbsGrade> dbGrades = this.list();
for (BbsGrade g : dbGrades) {
if (!(e1 < g.getMinPoints() || s1 > g.getMaxPoints())) {
throw new ServiceException("修改失败,当前等级积分范围和等级【" + g.getName() + "】积分范围冲突。");
}
}
BbsGrade updGrade = new BbsGrade();
updGrade.setId(dbGrade.getId());
updGrade.setName(grade.getName());
updGrade.setSort(grade.getSort());
updGrade.setMinPoints(grade.getMinPoints());
updGrade.setMaxPoints(grade.getMaxPoints());
this.save(updGrade);
}
/**
* 删除等级
*
* @param gradeId 等级Id
*/
@Override
public void deleteGrade(Long gradeId) {
this.removeById(gradeId);
}
}
...@@ -64,6 +64,19 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap ...@@ -64,6 +64,19 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
} }
/**
* 刷新缓存敏感词
*/
@Override
public void refreshCacheWords() {
this.redisCache.deleteObject(WORD_CACHE_KEY);
log.info("=> 缓存敏感词已清空");
Set<String> dbWords = this.getDbWords();
this.redisCache.setCacheSet(WORD_CACHE_KEY, new HashSet<>(dbWords));
log.info("=> 缓存敏感词已刷新,敏感词数量:{}", dbWords.size());
}
/** /**
* 查询敏感词库列表 * 查询敏感词库列表
* *
...@@ -84,7 +97,6 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap ...@@ -84,7 +97,6 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
* *
* @param word 敏感词 * @param word 敏感词
*/ */
@Transactional(rollbackFor = Exception.class)
@Override @Override
public void addWord(BbsSensitiveWord word) { public void addWord(BbsSensitiveWord word) {
long wordCount = this.count( long wordCount = this.count(
...@@ -125,7 +137,7 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap ...@@ -125,7 +137,7 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
} }
BbsSensitiveWord updWord = new BbsSensitiveWord(); BbsSensitiveWord updWord = new BbsSensitiveWord();
updWord.setId(word.getId()); updWord.setId(dbWord.getId());
updWord.setName(word.getName()); updWord.setName(word.getName());
updWord.setSort(word.getSort()); updWord.setSort(word.getSort());
this.updateById(updWord); this.updateById(updWord);
...@@ -163,43 +175,37 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap ...@@ -163,43 +175,37 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
try { try {
// 读取敏感词 // 读取敏感词
reader = new BufferedReader(new InputStreamReader(file.getInputStream())); reader = new BufferedReader(new InputStreamReader(file.getInputStream()));
String word; String readWord;
Set<String> words = new LinkedHashSet<>(10); Set<String> readWords = new LinkedHashSet<>(10);
while (Objects.nonNull(word = reader.readLine())) { while (Objects.nonNull(readWord = reader.readLine())) {
if (StrUtil.isNotBlank(word)) { if (StrUtil.isNotBlank(readWord)) {
words.add(word); readWords.add(readWord);
} }
} }
// 校验敏感词 // 校验敏感词
Set<String> cacheWords = this.redisCache.getCacheSet(WORD_CACHE_KEY); Set<String> cacheWords = this.redisCache.getCacheSet(WORD_CACHE_KEY);
List<String> addWords = new ArrayList<>(words.size()); List<BbsSensitiveWord> addWords = new ArrayList<>(readWords.size());
for (String w : words) { for (String word : readWords) {
if (cacheWords.contains(w)) { if (!cacheWords.contains(word)) {
BbsSensitiveWord newWord = new BbsSensitiveWord();
newWord.setName(word);
addWords.add(newWord);
} else {
DataImportResult.Row<String> row = new DataImportResult.Row<>(); DataImportResult.Row<String> row = new DataImportResult.Row<>();
row.setRowData(w); row.setRowData(word);
row.setMessage("当前敏感词已存在"); row.setMessage("当前敏感词已存在");
result.getFailRows().add(row); result.getFailRows().add(row);
} else {
addWords.add(w);
} }
} }
super.saveBatch(addWords);
// 添加敏感词
List<BbsSensitiveWord> newWords = new ArrayList<>(addWords.size());
for (String addWord : addWords) {
BbsSensitiveWord newWord = new BbsSensitiveWord();
newWord.setName(addWord);
newWords.add(newWord);
}
super.saveBatch(newWords);
// 缓存敏感词 // 缓存敏感词
this.redisCache.setAddValues(WORD_CACHE_KEY, addWords.toArray()); this.redisCache.setAddValues(WORD_CACHE_KEY, addWords.toArray());
result.setTotalCount(words.size()); result.setTotalCount(readWords.size());
result.setSuccessCount(addWords.size()); result.setSuccessCount(addWords.size());
result.setFailCount(words.size() - addWords.size()); result.setFailCount(readWords.size() - addWords.size());
} catch (Exception e) { } catch (Exception e) {
log.error("=> 导入敏感词失败:", e); log.error("=> 导入敏感词失败:", e);
......
...@@ -116,7 +116,7 @@ public class BbsTopicServiceImpl extends ServiceImpl<BbsTopicMapper, BbsTopic> i ...@@ -116,7 +116,7 @@ public class BbsTopicServiceImpl extends ServiceImpl<BbsTopicMapper, BbsTopic> i
Integer isTop = topic.getIsTop(); Integer isTop = topic.getIsTop();
if (!dbTopic.getIsTop().equals(isTop)) { if (!dbTopic.getIsTop().equals(isTop)) {
LambdaUpdateWrapper<BbsTopic> wrapper = Wrappers.lambdaUpdate(BbsTopic.class); LambdaUpdateWrapper<BbsTopic> wrapper = Wrappers.lambdaUpdate(BbsTopic.class);
wrapper.set(BbsTopic::getId, dbTopic.getId()); wrapper.eq(BbsTopic::getId, dbTopic.getId());
if (IsTop.TOP.getIsTop() == isTop) { if (IsTop.TOP.getIsTop() == isTop) {
wrapper.set(BbsTopic::getIsTop, IsTop.TOP.getIsTop()); wrapper.set(BbsTopic::getIsTop, IsTop.TOP.getIsTop());
wrapper.set(BbsTopic::getTopTime, new Date()); wrapper.set(BbsTopic::getTopTime, new Date());
......
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