系统日志常用功能

无敌的宇宙
无敌的宇宙
擅长邻域:Java,HTML,JavaScript,MySQL,支付,退款,图片上传

分类: Java 专栏: java vue 标签: 系统日志

2025-04-20 10:25:08 167浏览

可直接使用,vue论坛项目

sql

/*
 Navicat Premium Data Transfer

 Source Server         : 127
 Source Server Type    : MySQL
 Source Server Version : 80022
 Source Host           : localhost:3306
 Source Schema         : kaoshi_springboot_app

 Target Server Type    : MySQL
 Target Server Version : 80022
 File Encoding         : 65001

 Date: 20/04/2025 10:18:04
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for jf_syslog
-- ----------------------------
DROP TABLE IF EXISTS `jf_syslog`;
CREATE TABLE `jf_syslog`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `cts` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `lurl` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `lp` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
  `role` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `realname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2574 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

package com.jff.forum.bean;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/*系统日志
*/
@Data
@TableName("jf_syslog")
public class JfSyslog {

    @TableId(type = IdType.AUTO)
      Integer id;
      String cts;
      String lurl;
      String lp;
      String role;
      String realname;

}

package com.jff.forum.dao;



import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jff.forum.bean.JfSyslog;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;


@Component
@Mapper
public interface JfSyslogMapper extends BaseMapper<JfSyslog> {


}

package com.jff.forum.service;

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.jff.forum.bean.JfSyslog;
import com.jff.forum.dao.JfSyslogMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class JfSyslogService extends ServiceImpl<JfSyslogMapper, JfSyslog> {

    @Autowired
    JfSyslogMapper syslogMapper;
    public  List<JfSyslog> getlist (JfSyslog o){
        LambdaQueryWrapper<JfSyslog> lambdaQueryWrapper = Wrappers.lambdaQuery();

        if(o!=null) {

            if(o.getCts()!=null&&o.getCts().trim().length() > 0  ){
                lambdaQueryWrapper.like(JfSyslog::getCts,o.getCts());
            }
            if(o.getRealname()!=null&&o.getRealname().trim().length() > 0  ){
                lambdaQueryWrapper.like(JfSyslog::getRealname,o.getRealname());
            }

        }
        List<JfSyslog> li = syslogMapper.selectList(lambdaQueryWrapper);

        return  li;
    }

    public void delall ( ){
        LambdaQueryWrapper<JfSyslog> lambdaQueryWrapper = Wrappers.lambdaQuery();

         syslogMapper.delete(lambdaQueryWrapper);


    }
    
    

}

controller

package com.jff.forum.control.api;


import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jff.forum.bean.JfSyslog;
import com.jff.forum.service.JfSyslogService;
import com.jff.forum.util.MessUntil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@CrossOrigin
@RestController
@RequestMapping("/jfSyslog")
public class JfSyslogController {

	@Autowired
	JfSyslogService syslogService;
	 



	@RequestMapping("/page")
	public MessUntil page(@RequestParam(value="pageNo",defaultValue="1")int pageNo,
						  @RequestParam(value="pageSize",defaultValue="10")int pageSize, JfSyslog u )  {
		MessUntil mess=new MessUntil();




		 PageHelper.startPage(pageNo,pageSize," id desc ");
    	 List<JfSyslog> li=syslogService.getlist(u);
    	 PageInfo<JfSyslog> pageInfo = new  PageInfo(li,pageSize);




		return mess.succ(pageInfo);
	}


	@RequestMapping("/list")
	public MessUntil list(   JfSyslog u )  {
		MessUntil mess=new MessUntil();





		List<JfSyslog> li=syslogService.getlist(u);




		return mess.succ(li);
	}




	@RequestMapping("del")
	public MessUntil del(Integer id )   {
		MessUntil mess=new MessUntil();

		JfSyslog ol=syslogService.getById(id);


		if(id==null )return mess.error( "参数错误");

		 try{
			 syslogService.removeById(id);
		 }catch (Exception e){
			 return mess.error( "删除失败,请先删除关联数据");
		 }

		return mess.succ(  );
	}

	@RequestMapping("delall")
	public MessUntil delall( )   {
		MessUntil mess=new MessUntil();

		syslogService.delall();

		return mess.succ(  );
	}
}


login拦截器

package com.jff.forum.config;

import com.jff.forum.bean.JfSyslog;
import com.jff.forum.service.JfSyslogService;
import com.jff.forum.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;


public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    JfSyslogService syslogService;


    @Override
    public boolean preHandle(HttpServletRequest request,  HttpServletResponse response, Object handler   ) throws Exception {
        String url = request.getRequestURI();
        System.out.println("url==" + url);
  if(url.indexOf("/upimgs")>-1)return true;
        JfSyslog l=new JfSyslog();

        String p = "";
        Enumeration enu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String paraName = (String) enu.nextElement();
            if(paraName.equals("loginRole")){
                l.setRole( request.getParameter(paraName));


            }else if(paraName.equals("loginRealname")){
                l.setRealname(  request.getParameter(paraName) );
            }else{
                p += paraName + ": " + request.getParameter(paraName) + "<br>";

            }

        }


        l.setCts(DateUtils.getNowDateTsString());
        l.setLurl(url);
        l.setLp(p);


        syslogService.save(l);



        return true;
    }


}

注册拦截器


package com.jff.forum;



import com.jff.forum.config.LoginInterceptor;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class MyWebAppConfiguration   extends WebMvcConfigurationSupport  implements ApplicationContextAware {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");

        registry.addResourceHandler("/upimgs/**").addResourceLocations("file:D:/upimgs/");
        super.addResourceHandlers(registry);
    }

    @Bean
    public LoginInterceptor getAccessInterceptor(){

        return new LoginInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( getAccessInterceptor()) ;
        super.addInterceptors(registry);
    }


}

vue

<template>
    <div class="about">
        <v-header />
        <v-sidebar />
        <div class="content-box" >
            <div class="content">
                <div>
                    <div class="crumbs">
                        <el-breadcrumb separator="/">
                            <el-breadcrumb-item>
                                <i class="el-icon-paperclip"></i> 系统日志管理
                            </el-breadcrumb-item>
                        </el-breadcrumb>
                    </div>
                    <div class="container">
                        <div class="handle-box">
                            <el-input v-model="query.realname" placeholder="姓名" class="handle-input mr10"></el-input>


                            <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
                            <el-button type="danger" icon="el-icon-delete" @click="handleDelall">清空日志</el-button>

                        </div>
                        <el-table :data="tableData" border class="table" ref="multipleTable" header-cell-class-name="table-header">
                            <el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
                            <el-table-column prop="lurl" label="请求路径" width="200" align="center"></el-table-column>
                            <el-table-column prop="lurl" label="请求参数" width="200" align="center">
                                <template #default="scope">
                                    <div v-html="scope.row.lp"></div>
                                </template>
                            </el-table-column>
                            <el-table-column prop="realname" label="姓名"   align="center"></el-table-column>
                            <el-table-column prop="role" label="角色"   align="center"></el-table-column>
                            <el-table-column prop="cts" label="请求时间" width="200" align="center"></el-table-column>


                            <el-table-column label="操作" width="180" fixed="right" align="center">
                                <template #default="scope">
                                    <el-button type="danger"  @click ="handleDelete(scope.$index, scope.row)">删除</el-button>




                                </template>
                            </el-table-column>
                        </el-table>
                        <div class="pagination">
                            <el-pagination background layout="total, prev, pager, next" :current-page="query.pageNo"
                                           :page-size="query.pageSize" :total="pageTotal" @current-change="handlePageChange"></el-pagination>
                        </div>
                    </div>


                </div>
            </div>
        </div>
    </div>
</template>

<script>
    import vHeader from "./Header.vue";
    import vSidebar from "./Sidebar.vue";
    import {syslog_page , syslog_del ,syslog_delall} from '../../api';
    export default {
        name: "System",
        components: {
            vHeader,
            vSidebar,
        },
        data() {
            return {
                FILE_URL:'',

                FILE_ACTION:'',

                lander:{},
                tableData: [],
                query :{

                    realname: '',
                    pageNo: 1,
                    pageSize: 10,
                },
                pageTotal: 0,


            };
        },
        methods:{

              


            // 查询操作
            handleSearch (){

                this.query.pageNo = 1;
                this.getPage();
            },

            // 分页导航
            handlePageChange (val) {
                this.query.pageNo = val;
                this.getPage();
            },

            handleDelall ( ) {

                // 二次确认删除
                this.$confirm("确定要清空日志么?", "提示", {
                    type: "warning",
                })
                    .then(() => {
                        syslog_delall({ }).then((res) => {

                            if (res.data.status == 1) {

                                this.getPage();
                            } else {
                                this.$notify({
                                    title: '提示',
                                    message: res.data.msg,
                                    duration: 0
                                });
                            }

                        })

                    })
                    .catch(() => {
                        this.$message({
                            type: 'info',
                            message: '已取消 '
                        });
                    });

            },

                //删除操作
            handleDelete(index,row){

                // 二次确认删除
                this.$confirm("确定要删除吗?", "提示", {
                    type: "warning",
                })
                    .then(() => {
                        syslog_del({id:row.id }).then((res) => {
                           
                            if(res.data.status==1){
                                this.$message.success("删除成功");
                                this.tableData.splice(index, 1);
                                this.getPage();
                            }else{
                                this.$notify({
                                    title: '提示',
                                    message: res.data.msg,
                                    duration: 0
                                });
                            }

                        })

                    })
                    .catch(() => {
                        this.$message({
                            type: 'info',
                            message: '已取消删除'
                        });
                    });


            },

            //获取列表数据
            getPage(){

                syslog_page(this.query).then((res) => {
                   
                    this.tableData = res.data.obj.list
                    this.pageTotal = res.data.obj.total//该页总共多少条记录
                })
            },

        },
        mounted() {
            this.lander=JSON.parse(localStorage.loginUser)
            this.FILE_URL=process.env.VUE_APP_API_ROOT
            //去后端查询所有的用户给tableData赋值
            this.getPage();

        }
    }
</script>

<style scoped>
    .handle-box {
        margin-bottom: 20px;
    }

    .handle-select {
        width: 120px;
    }

    .handle-input {
        width: 120px;
        display: inline-block;
    }
    .table {
        width: 100%;
        font-size: 14px;
    }
    .red {
        color: #ff0000;
    }
    .mr10 {
        margin-right: 10px;
    }
    /*滚动条的宽度*/
    /deep/ .el-table__body-wrapper::-webkit-scrollbar {
        width: 6px;
        height: 6px;
    }
    /*滚动条滑块*/
    /deep/ .el-table__body-wrapper::-webkit-scrollbar-thumb {
        background-color: #409eff;
        /*border-radius: 3px;*/
    }
</style>



export const syslog_page= (params) => http({
    url: '/jfSyslog/page',
    method: 'post',
    params: params
})
export const syslog_del= (params) => http({
    url: '/jfSyslog/del',
    method: 'post',
    params: params
})
export const syslog_delall= (params) => http({
    url: '/jfSyslog/delall',
    method: 'post',
    params: params
})
// request.js
import axios from 'axios'
import QS from 'qs'; //如果是form表单需要通过qs模块进行序列化数据
// 一些请求的基本配置
const service = axios.create({
    baseURL: process.env.VUE_APP_API_ROOT,// 接口的域名地址
    // timeout: 5000,
    headers: {"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"}//form表单格式
})

// 输出方法
export default function request(option) {

//-----------------------自己加------------
    try{

        let   lander=JSON.parse(localStorage.loginUser)

        option.params.loginRole=localStorage.role;
        option.params.loginRealname=lander.realname ;
    }catch (e) {

    }

//-----------------------自己加------------

    return new Promise((resolve, reject) => {
        const options = {
            url: option.url,
            method: option.method,
            params:option.params ,
            responseType: option.responseType || '',
            data:QS.stringify(Object.assign(option.params)),
            timeout: option.timeout || 15000, 
        }





        if(option.method === 'get'){//判断请求方式
            delete options.data;
        }else{
            delete options.params;
        }

        service(options)
            .then(
                res => {
                    resolve(res);
                },
                res => {
                    if (option.reject) {
                        reject(res);
                    }
                })
            .catch(error => {
                reject()
                console.error(error)
            })
    })
}

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695