系统日志常用功能
分类: 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)展开评论
暂无评论,快来写一下吧
展开评论
您可能感兴趣的博客
他的专栏
他感兴趣的技术


java
vue
springboot
Mysql
ssm
小程序
uniapp
js和jquery