LogServiceImpl.java 5.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package top.charles7c.cnadmin.monitor.service.impl;

19 20 21 22
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

23 24 25 26 27 28 29
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

30 31 32
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

33
import cn.hutool.core.bean.BeanUtil;
34 35 36
import cn.hutool.core.util.StrUtil;

import top.charles7c.cnadmin.common.model.query.PageQuery;
37
import top.charles7c.cnadmin.common.model.vo.PageDataVO;
38 39 40
import top.charles7c.cnadmin.common.util.ExceptionUtils;
import top.charles7c.cnadmin.common.util.ReflectUtils;
import top.charles7c.cnadmin.common.util.helper.QueryHelper;
41
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
42
import top.charles7c.cnadmin.monitor.mapper.LogMapper;
43
import top.charles7c.cnadmin.monitor.model.entity.LogDO;
44 45
import top.charles7c.cnadmin.monitor.model.query.LoginLogQuery;
import top.charles7c.cnadmin.monitor.model.query.OperationLogQuery;
46 47
import top.charles7c.cnadmin.monitor.model.query.SystemLogQuery;
import top.charles7c.cnadmin.monitor.model.vo.*;
48
import top.charles7c.cnadmin.monitor.service.LogService;
49
import top.charles7c.cnadmin.system.service.UserService;
50 51

/**
52
 * 系统日志业务实现类
53 54 55 56 57 58 59 60 61 62
 *
 * @author Charles7c
 * @since 2022/12/23 20:12
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class LogServiceImpl implements LogService {

    private final LogMapper logMapper;
63
    private final UserService userService;
64 65 66

    @Async
    @EventListener
67 68
    public void save(LogDO logDO) {
        logMapper.insert(logDO);
69
    }
70 71

    @Override
72 73
    public PageDataVO<OperationLogVO> list(OperationLogQuery query, PageQuery pageQuery) {
        QueryWrapper<LogDO> queryWrapper = QueryHelper.build(query);
74 75 76 77 78 79 80 81

        // 限定查询信息
        String[] fieldsName = ReflectUtils.getNonStaticFieldsName(OperationLogVO.class);
        List<String> columns = Arrays.stream(fieldsName).map(StrUtil::toUnderlineCase)
            .filter(n -> !n.endsWith("string")).collect(Collectors.toList());
        queryWrapper.select(columns);

        // 分页查询
82 83
        IPage<LogDO> page = logMapper.selectPage(pageQuery.toPage(), queryWrapper);
        PageDataVO<OperationLogVO> pageDataVO = PageDataVO.build(page, OperationLogVO.class);
84 85 86 87

        // 填充数据(如果是查询个人操作日志,只查询一次用户信息即可)
        if (query.getUid() != null) {
            String nickname = ExceptionUtils.exToNull(() -> userService.getById(query.getUid()).getNickname());
88
            pageDataVO.getList().forEach(o -> o.setCreateUserString(nickname));
89
        } else {
90
            pageDataVO.getList().forEach(this::fill);
91
        }
92
        return pageDataVO;
93 94 95
    }

    @Override
96 97
    public PageDataVO<LoginLogVO> list(LoginLogQuery query, PageQuery pageQuery) {
        QueryWrapper<LogDO> queryWrapper = QueryHelper.build(query);
98
        queryWrapper.lambda()
99
            .and(qw -> qw.like(LogDO::getRequestUrl, "/auth/login").or().like(LogDO::getRequestUrl, "/auth/logout"));
100 101 102 103 104 105 106 107

        // 限定查询信息
        String[] fieldsName = ReflectUtils.getNonStaticFieldsName(LoginLogVO.class);
        List<String> columns = Arrays.stream(fieldsName).map(StrUtil::toUnderlineCase)
            .filter(n -> !n.endsWith("string")).collect(Collectors.toList());
        queryWrapper.select(columns);

        // 分页查询
108 109
        IPage<LogDO> page = logMapper.selectPage(pageQuery.toPage(), queryWrapper);
        PageDataVO<LoginLogVO> pageDataVO = PageDataVO.build(page, LoginLogVO.class);
110 111

        // 填充数据
112 113
        pageDataVO.getList().forEach(this::fill);
        return pageDataVO;
114 115
    }

116
    @Override
117 118
    public PageDataVO<SystemLogVO> list(SystemLogQuery query, PageQuery pageQuery) {
        QueryWrapper<LogDO> queryWrapper = QueryHelper.build(query);
119 120 121 122 123 124 125 126

        // 限定查询信息
        String[] fieldsName = ReflectUtils.getNonStaticFieldsName(SystemLogVO.class);
        List<String> columns = Arrays.stream(fieldsName).map(StrUtil::toUnderlineCase)
            .filter(n -> !n.endsWith("string")).collect(Collectors.toList());
        queryWrapper.select(columns);

        // 分页查询
127 128
        IPage<LogDO> page = logMapper.selectPage(pageQuery.toPage(), queryWrapper);
        PageDataVO<SystemLogVO> pageDataVO = PageDataVO.build(page, SystemLogVO.class);
129 130

        // 填充数据
131 132
        pageDataVO.getList().forEach(this::fill);
        return pageDataVO;
133 134 135 136
    }

    @Override
    public SystemLogDetailVO detail(Long logId) {
137 138
        LogDO logDO = logMapper.selectById(logId);
        CheckUtils.throwIfNull(logDO, String.format("ID为 [%s] 的日志已不存在", logId));
139

140 141 142
        SystemLogDetailVO systemLogDetailVO = BeanUtil.copyProperties(logDO, SystemLogDetailVO.class);
        this.fill(systemLogDetailVO);
        return systemLogDetailVO;
143 144
    }

145 146 147
    /**
     * 填充数据
     *
148 149
     * @param logVO
     *            日志信息
150
     */
151 152
    private void fill(LogVO logVO) {
        Long createUser = logVO.getCreateUser();
153 154 155
        if (createUser == null) {
            return;
        }
156
        logVO.setCreateUserString(
157
            ExceptionUtils.exToNull(() -> userService.getById(createUser)).getNickname());
158
    }
159
}