需求
@Service
public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdUser> implements AdminUserService {
/**
* 后台系统登录
* @param dto
* @return
*/
@Override
public ResponseResult login(AdUserDto dto) {
// 1. 检验参数
if(StringUtils.isBlank(dto.getName()) || StringUtils.isBlank(dto.getPassword())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 2. 查询用户是否存在
LambdaQueryWrapper<AdUser> query = new LambdaQueryWrapper<>();
query.eq(AdUser::getName, dto.getName());
AdUser adUser = getOne(query);
if(adUser == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
// 3. 比对密码, 手动加盐验证
String password = dto.getPassword();
String salt = adUser.getSalt();
password = DigestUtils.md5DigestAsHex((password+salt).getBytes());
if(password.equals(adUser.getPassword())){
// 4. 返回数据, token和用户信息
String token = AppJwtUtil.getToken(adUser.getId().longValue());
Map<String, Object> map = new HashMap<>();
map.put("token", token);
adUser.setPassword("");
adUser.setSalt("");
map.put("user", adUser);
return ResponseResult.okResult(map);
}else{
return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
}
}
}
配置
server:
port: 6011
spring:
application:
name: leadnews-admin
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: fc3009fa-ac38-4d3c-a4ea-94b8985a27e6
config:
server-addr: 127.0.0.1:8848
namespace: fc3009fa-ac38-4d3c-a4ea-94b8985a27e6
file-extension: yml
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/leadnews_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 1234
# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
# 设置别名包扫描路径,通过该属性可以给包中的类注册别名
type-aliases-package: com.heima.model.admin.pojos
@Component
public class AuthorizeFilter implements Ordered, GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取request和response对象
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//2.判断是否是登录
if(request.getURI().getPath().contains("/login")){
//放行
return chain.filter(exchange);
}
//3.获取token
String token = request.getHeaders().getFirst("token");
//4.判断token是否存在
if(StringUtils.isBlank(token)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
//5.判断token是否有效
try {
Claims claimsBody = AppJwtUtil.getClaimsBody(token);
//是否是过期
int result = AppJwtUtil.verifyToken(claimsBody);
if(result == 1 || result == 2){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
// 获取用户信息
String userId = claimsBody.get("id").toString();
// 存储在header中
ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
httpHeaders.add("userId", userId);
}).build();
// 重置请求
exchange.mutate().request(serverHttpRequest);
} catch (Exception e) {
e.printStackTrace();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
//6.放行
return chain.filter(exchange);
}
/**
* 优先级设置 值越小 优先级越高
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
配置
server:
port: 6001
spring:
application:
name: leadnews-admin-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: fc3009fa-ac38-4d3c-a4ea-94b8985a27e6
config:
server-addr: 127.0.0.1:8848
namespace: fc3009fa-ac38-4d3c-a4ea-94b8985a27e6
file-extension: yml
spring:
cloud:
gateway:
globalcors:
add-to-simple-url-handler-mapping: true
corsConfigurations:
'[/**]':
allowedHeaders: "*"
allowedOrigins: "*"
allowedMethods:
- GET
- POST
- DELETE
- PUT
- OPTION
routes:
# 登录服务
- id: login
uri: lb://leadnews-admin
predicates:
- Path=/admin/**
filters:
- StripPrefix= 1
# 频道服务
- id: channel
uri: lb://leadnews-wemedia
predicates:
- Path=/wemedia/**
filters:
- StripPrefix= 1
需求
public ResponseResult saveSensitive(WmSensitive wmSensitive) {
// 1. 检查参数
if(StringUtils.isBlank(wmSensitive.getSensitives())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "敏感词不能为空");
}
// 2. 判断敏感词名称是否重复
LambdaQueryWrapper<WmSensitive> query = new LambdaQueryWrapper<>();
query.eq(WmSensitive::getSensitives, wmSensitive.getSensitives());
query.last("limit 1");
WmSensitive sensitive = getOne(query);
if(sensitive != null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST);
}
// 3. 新增敏感词
wmSensitive.setCreatedTime(new Date());
save(wmSensitive);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult findList(SensitiveDto dto) {
// 1. 检查参数
dto.checkParam();
// 2. 分页查询
IPage page = new Page(dto.getPage(), dto.getSize());
LambdaQueryWrapper<WmSensitive> query = new LambdaQueryWrapper<>();
// 2.1 按照频道名称模糊查询
query.like(dto.getName()!=null, WmSensitive::getSensitives, dto.getName());
// 2.2 按照创建时间倒序查询
query.orderByDesc(WmSensitive::getCreatedTime);
// 2.3 查询结果
page(page, query);
// 3. 返回结果
PageResponseResult result = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
result.setData(page.getRecords());
return result;
}
需求
public ResponseResult updateSensitive(WmSensitive wmSensitive) {
// 1. 检查参数
if(StringUtils.isBlank(wmSensitive.getSensitives())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 2. 修改敏感词
updateById(wmSensitive);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult delSensitive(Integer id) {
// 1. 检查参数
if(id == null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 2. 根据id查询敏感词
WmSensitive wmSensitive = getById(id);
if(wmSensitive == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
// 3. 删除敏感词
removeById(id);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult saveChannel(WmChannel wmChannel) {
// 1. 检查参数
// 1.1 频道名称和描述不能为空
if(StringUtils.isBlank(wmChannel.getName()) || StringUtils.isBlank(wmChannel.getDescription())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "名称和描述不能为空");
}
// 1.2 频道排序不能为空, 且范围为[0, 255]
if(wmChannel.getOrd() == null || wmChannel.getOrd() < 0 || wmChannel.getOrd() > 255){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "排序不能为空, 且范围为[0, 255]");
}
// 2. 判断频道名称是否重复
LambdaQueryWrapper<WmChannel> query = new LambdaQueryWrapper<>();
query.eq(WmChannel::getName, wmChannel.getName());
query.last("limit 1");
WmChannel channel = getOne(query);
if(channel != null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST);
}
// 3. 保存频道
wmChannel.setIsDefault(true);
wmChannel.setCreatedTime(new Date());
save(wmChannel);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult findList(ChannelDto dto) {
// 1. 检查参数
dto.checkParam();
// 2. 分页查询
IPage page = new Page(dto.getPage(), dto.getSize());
LambdaQueryWrapper<WmChannel> query = new LambdaQueryWrapper<>();
// 2.1 按照频道名称模糊查询
query.like(dto.getName()!=null, WmChannel::getName, dto.getName());
// 2.2 按照创建时间倒序查询
query.orderByDesc(WmChannel::getCreatedTime);
// 2.3 查询结果
page(page, query);
// 3. 返回结果
PageResponseResult result = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
result.setData(page.getRecords());
return result;
}
需求
public ResponseResult updateChannel(WmChannel wmChannel) {
// 1. 检查参数
// 1.1 名称不能为空
if(wmChannel.getName()!=null && StringUtils.isBlank(wmChannel.getName())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "名称不能为空");
}
// 1.2 描述不能为空
if(wmChannel.getDescription()!=null && StringUtils.isBlank(wmChannel.getDescription())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "描述不能为空");
}
// 1.3 排序不能为空, 且范围为[0, 255]
if(wmChannel.getOrd()!=null){
if(wmChannel.getOrd() < 0 || wmChannel.getOrd() > 255){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "排序范围为[0, 255]");
}
}
// 2. 如果频道被引用则不能禁用
if(wmChannel.getStatus().equals(false)){
// 2.1 查询频道是否被文章引用
if (isRefer(wmChannel.getId())){
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR, "没有文章引用的频道才可以禁用");
}
}
updateById(wmChannel);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult delChannel(Integer id) {
// 1. 检查参数
if(id == null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 2. 根据id查询频道
// 2.1 查询频道的状态
WmChannel wmChannel = getById(id);
if(wmChannel.getStatus().equals(1)){
// 启用
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR, "禁用的频道才可以删除");
}
// 2.2 查询频道是否被文章引用
LambdaQueryWrapper<WmNews> query = new LambdaQueryWrapper<>();
query.eq(WmNews::getChannelId, id);
query.last("limit 1");
WmNews wmNews = wmNewsMapper.selectOne(query);
if(wmNews != null){
// 有文章引用
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR, "没有文章引用的频道才可以删除");
}
// 3. 删除频道
removeById(id);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult findList(AdminAuthDto dto) {
// 1. 检查参数
dto.checkParam();
// 2. 根据审核状态条件分页查询
IPage page = new Page(dto.getPage(), dto.getSize());
LambdaQueryWrapper<ApUserRealname> query = new LambdaQueryWrapper<>();
// 2.1 根据审核状态条件查询
query.like(dto.getStatus()!=null, ApUserRealname::getStatus, dto.getStatus());
// 2.2 按照创建时间倒序查询
query.orderByDesc(ApUserRealname::getCreatedTime);
// 2.3 查询结果
page(page, query);
// 3. 返回结果
PageResponseResult result = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
result.setData(page.getRecords());
return result;
}
public ResponseResult authPass(AdminAuthDto dto) {
ApUserRealname apUserRealname = new ApUserRealname();
apUserRealname.setId(dto.getId());
apUserRealname.setStatus((short) 9);
apUserRealname.setUpdatedTime(new Date());
updateById(apUserRealname);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
@RestController
public class WemediaClient implements IWemediaClient {
@Autowired
private WmUserService wmUserService;
@PostMapping("/api/v1/user/save")
@Override
public ResponseResult saveUser(@RequestBody WmUserDto dto) {
return wmUserService.saveUser(dto);
}
}
public ResponseResult saveUser(WmUserDto dto) {
WmUser wmUser = new WmUser();
BeanUtils.copyProperties(dto, wmUser);
wmUser.setCreatedTime(new Date());
wmUser.setStatus(1);
save(wmUser);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
public ResponseResult authFail(AdminAuthDto dto) {
ApUserRealname apUserRealname = new ApUserRealname();
apUserRealname.setId(dto.getId());
apUserRealname.setStatus((short) 2);
apUserRealname.setReason(dto.getMsg());
apUserRealname.setUpdatedTime(new Date());
updateById(apUserRealname);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult listVo(AdminNewsAuthDto dto) {
// 1. 检验参数
dto.checkParam();
// 2. 分页查询文章
IPage page = new Page(dto.getPage(), dto.getSize());
LambdaQueryWrapper<WmNews> query = new LambdaQueryWrapper<>();
// 2.1 按照标题模糊查询
query.like(!StringUtils.isBlank(dto.getTitle()), WmNews::getTitle, dto.getTitle());
// 2.2 按照审核状态查询
query.eq(dto.getStatus()!=null, WmNews::getStatus, dto.getStatus());
// 2.3 按照创建时间倒序查询
query.orderByDesc(WmNews::getCreatedTime);
// 2.4 查询结果
page(page, query);
List<WmNews> records = page.getRecords();
List<AdminNewsDto> collect = records.stream().map((item) -> {
AdminNewsDto adminNewsDto = new AdminNewsDto();
BeanUtils.copyProperties(item, adminNewsDto);
// 作者id
Integer userId = item.getUserId();
// 作者名字
String authorName = wmUserMapper.selectById(userId).getName();
// 设置名字
adminNewsDto.setAuthorName(authorName);
return adminNewsDto;
}).collect(Collectors.toList());
// 3. 返回结果
PageResponseResult result = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
result.setData(collect);
return result;
}
需求
public ResponseResult adminGetNewsDetail(Integer id) {
// 1. 检验参数
if(id == null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 2. 获取文章对象
WmNews news = getById(id);
if(news == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "文章不存在");
}
// 3. 设置作者名称
AdminNewsDto adminNewsDto = new AdminNewsDto();
BeanUtils.copyProperties(news, adminNewsDto);
// 3.1 获取作者名称
String authorName = wmUserMapper.selectById(news.getUserId()).getName();
adminNewsDto.setAuthorName(authorName);
// 4. 返回结果
return ResponseResult.okResult(adminNewsDto);
}
需求
public ResponseResult authNewsFail(AdminNewsAuthDto dto) {
if(dto.getMsg() == null){
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR, "需要给出拒绝原因");
}
WmNews wmNews = new WmNews();
wmNews.setId(dto.getId());
wmNews.setReason(dto.getMsg());
wmNews.setStatus(dto.getStatus().shortValue());
updateById(wmNews);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
需求
public ResponseResult authNewsPass(AdminNewsAuthDto dto) {
// 1. 更新自媒体文章状态
WmNews wmNews = new WmNews();
wmNews.setId(dto.getId());
wmNews.setStatus(dto.getStatus().shortValue());
updateById(wmNews);
// 2. 创建app端的文章信息
ArticleDto articleDto = new ArticleDto();
// 2.1 获取自媒体端文章
WmNews news = getById(dto.getId());
wmNewsAutoScanService.saveAppArticle(news);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
黑马程序员. 黑马头条
https://gitee.com/yu-ba-ba-ba/leadnews