1、统计模块api统计实现

pull/254/head
xjs 4 years ago
parent 2c6d0fe295
commit 465b67df50

@ -25,11 +25,11 @@ import java.util.List;
public interface RemoteWarningCRUDFeign { public interface RemoteWarningCRUDFeign {
@PostMapping("apiwarning") @PostMapping("apiwarning")
public R<ApiRecord> saveApiRecordForRPC(@RequestBody ApiRecord apiRecord); R<ApiRecord> saveApiRecordForRPC(@RequestBody ApiRecord apiRecord);
@PutMapping("apiwarning") @PutMapping("apiwarning")
public R<ApiRecord> updateApiRecordForRPC(@RequestBody ApiRecord apiRecord); R<ApiRecord> updateApiRecordForRPC(@RequestBody ApiRecord apiRecord);
@GetMapping("apiwarning") @GetMapping("apiwarning")
R<List<ApiRecord>> selectApiRecordListForRPC(@SpringQueryMap ApiRecord apiRecord); R<List<ApiRecord>> selectApiRecordListForRPC(@SpringQueryMap ApiRecord apiRecord);
@ -38,6 +38,9 @@ public interface RemoteWarningCRUDFeign {
R<ApiWarning> saveApiWarningForRPC(@RequestBody ApiWarning apiWarning); R<ApiWarning> saveApiWarningForRPC(@RequestBody ApiWarning apiWarning);
@GetMapping("apiwarning/getApiNameForRPC") @GetMapping("apiwarning/getApiNameForRPC")
public R<List<String>> getApiName(); R<List<String>> getApiName();
@GetMapping("apistatistics")
R<List<ApiRecord>> selectApiRecordListForRPC();
} }

@ -53,6 +53,12 @@ public class RemoteWarningCRUDFactory implements FallbackFactory<RemoteWarningCR
log.error("调用预警服务api预警查询所有api名称接口失败执行降级处理----"); log.error("调用预警服务api预警查询所有api名称接口失败执行降级处理----");
return R.fail(); return R.fail();
} }
@Override
public R<List<ApiRecord>> selectApiRecordListForRPC() {
log.error("调用预警服务api统计查询所有api接口失败执行降级处理----");
return R.fail();
}
}; };
} }
} }

@ -9,6 +9,7 @@ import com.ruoyi.file.utils.FileUploadUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
@ -17,12 +18,13 @@ import java.util.Date;
/** /**
* oss * oss
*
* @author xiejs * @author xiejs
* @since 2022-01-25 * @since 2022-01-25
*/ */
@Service @Service
@Primary @Primary
public class AliyunOssFileServiceImpl implements ISysFileService{ public class AliyunOssFileServiceImpl implements ISysFileService {
@Autowired @Autowired
@ -30,6 +32,7 @@ public class AliyunOssFileServiceImpl implements ISysFileService{
@Override @Override
public String uploadFile(MultipartFile file) throws Exception { public String uploadFile(MultipartFile file) throws Exception {
Assert.notNull(file, "file is null");
try { try {
String endpoint = aliyunOssProperties.getEndpoint(); String endpoint = aliyunOssProperties.getEndpoint();
String keyId = aliyunOssProperties.getKeyId(); String keyId = aliyunOssProperties.getKeyId();
@ -42,13 +45,13 @@ public class AliyunOssFileServiceImpl implements ISysFileService{
//获取文件后缀 //获取文件后缀
String extension = FileUploadUtils.getExtension(file); String extension = FileUploadUtils.getExtension(file);
//获取文件名称 //获取文件名称
String fileName = getDataTime()+"."+extension; String fileName = getDataTime() + "." + extension;
//执行文件上传 bucket名称 文件名称 文件流 //执行文件上传 bucket名称 文件名称 文件流
ossClient.putObject(bucketName,fileName,is); ossClient.putObject(bucketName, fileName, is);
//关闭ossClient //关闭ossClient
ossClient.shutdown(); ossClient.shutdown();
//拼接文件地址 //拼接文件地址
return "https://"+bucketName+"."+endpoint+"/"+fileName; return "https://" + bucketName + "." + endpoint + "/" + fileName;
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
@ -57,13 +60,14 @@ public class AliyunOssFileServiceImpl implements ISysFileService{
/** /**
* *
* @return *
* @return
*/ */
private String getDataTime(){ private String getDataTime() {
String today = DateUtil.format(new Date(), "yyyy-MM"); String today = DateUtil.format(new Date(), "yyyy-MM");
String time = DateUtil.formatDateTime(new Date()); String time = DateUtil.formatDateTime(new Date());
int random = RandomUtil.randomInt(1000, 10000); int random = RandomUtil.randomInt(100, 10000);
//防止同一时间生成文件名重复 //防止同一时间生成文件名重复
return today+"/"+time+"-"+random; return today + "/" + time + "-" + random;
} }
} }

@ -0,0 +1,18 @@
import request from '@/utils/request'
//查询API历史记录统计
export function getStatisticsHistoryApi() {
return request({
url: '/statistics/apistatistics/history',
method: 'get',
})
}
//查询API当天记录统计
export function getStatisticsTodayApi() {
return request({
url: '/statistics/apistatistics/today',
method: 'get',
})
}

@ -0,0 +1,130 @@
<template>
<div>
<div ref="historyChart" style="height: 400px;width: 100%;margin-top: 25px">
</div>
<div ref="todayChart" style="height: 400px;width: 100%">
</div>
</div>
</template>
<script>
import {getStatisticsHistoryApi, getStatisticsTodayApi} from "@/api/business/statistics/apistatistics";
// ECharts
var echarts = require('echarts/lib/echarts');
//
require('echarts/lib/chart/bar');
//
require('echarts/lib/component/tooltip');
require('echarts/lib/component/title');
export default {
name: "ApiStatistics",
data() {
return {
historyApiData: {},
todayApiData: {},
}
},
created() {
this.getStatisticsHistoryApi()
this.getStatisticsTodayApi()
},
mounted() {
},
methods: {
initHistory() {
let historyChart = echarts.init(this.$refs.historyChart)
//
historyChart.setOption({
title: {
text: '总计API调用次数',
textStyle:{
color: '#541264',
fontWeight:'1000',
align:'center',
},
left:"center",
},
tooltip: {},
xAxis: {
data: this.historyApiData.apiNames
},
yAxis: {
splitNumber: 10,
max:2000,
},
series: [{
name: '次数',
type: 'bar',
data: this.historyApiData.count
}]
});
},
initToday() {
let todayChart = echarts.init(this.$refs.todayChart)
//
todayChart.setOption({
title: {
text: '今日API调用次数',
textStyle:{
color: '#541264',
fontWeight:'1000',
align:'center',
},
left:"center",
},
tooltip: {},
xAxis: {
data: this.todayApiData.apiNames
},
yAxis: {
splitNumber: 10,
max:80,
},
series: [{
name: '次数',
type: 'bar',
data: this.todayApiData.count
}]
});
},
//API
getStatisticsHistoryApi() {
getStatisticsHistoryApi().then(res => {
this.historyApiData = res.data
this.initHistory()
})
},
//API
getStatisticsTodayApi() {
getStatisticsTodayApi().then(res => {
this.todayApiData = res.data
this.initToday()
})
},
},
}
</script>
<style scoped>
</style>

@ -59,8 +59,12 @@
</el-image> </el-image>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading2" type="primary" icon="el-icon-search" size="mini" <el-button v-loading="loading2"
type="primary"
icon="el-icon-search"
size="mini"
@click="getBeautyPicture()" @click="getBeautyPicture()"
v-hasPermi="['open:apitools:beautypicture']"
slot="reference">搜索 slot="reference">搜索
</el-button> </el-button>
</el-popover> </el-popover>
@ -91,8 +95,12 @@
</div> </div>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading3" type="primary" icon="el-icon-search" @click="getHistoryToday()" <el-button v-loading="loading3"
type="primary"
icon="el-icon-search"
@click="getHistoryToday()"
size="mini" size="mini"
v-hasPermi="['open:apitools:historytoday']"
slot="reference">搜索 slot="reference">搜索
</el-button> </el-button>
@ -132,7 +140,10 @@
</el-card> </el-card>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading4" type="primary" @click="getIdCardQuery('idCardForm')" slot="reference"> <el-button v-loading="loading4" type="primary"
@click="getIdCardQuery('idCardForm')"
v-hasPermi="['open:apitools:idcardquery']"
slot="reference">
搜索 搜索
</el-button> </el-button>
</el-popover> </el-popover>
@ -170,7 +181,11 @@
</div> </div>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button type="primary" slot="reference" @click="getMobileBelong('mobileBelongForm')"></el-button> <el-button type="primary"
slot="reference"
v-hasPermi="['open:apitools:mobilebelong']"
@click="getMobileBelong('mobileBelongForm')">搜索
</el-button>
</el-popover> </el-popover>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -202,7 +217,10 @@
</div> </div>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading6" type="primary" slot="reference" <el-button v-loading="loading6"
type="primary"
slot="reference"
v-hasPermi="['open:apitools:nowweather']"
@click="getNowWeather('nowWeatherForm')">搜索 @click="getNowWeather('nowWeatherForm')">搜索
</el-button> </el-button>
</el-popover> </el-popover>
@ -256,7 +274,10 @@
</div> </div>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading7" type="primary" slot="reference" <el-button v-loading="loading7"
type="primary"
slot="reference"
v-hasPermi="['open:apitools:forecastweather']"
@click="getForecastWeather('forecastWeatherForm')">搜索 @click="getForecastWeather('forecastWeatherForm')">搜索
</el-button> </el-button>
</el-popover> </el-popover>
@ -290,7 +311,10 @@
</div> </div>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading8" type="primary" slot="reference" <el-button v-loading="loading8"
type="primary"
slot="reference"
v-hasPermi="['open:apitools:garbagesorting']"
@click="getGarbageSorting('garbageSortingForm')">搜索 @click="getGarbageSorting('garbageSortingForm')">搜索
</el-button> </el-button>
</el-popover> </el-popover>
@ -319,7 +343,10 @@
</div> </div>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading9" type="primary" slot="reference" <el-button v-loading="loading9"
type="primary"
slot="reference"
v-hasPermi="['open:apitools:simplecomplex']"
@click="getSimpleComplex('simpleComplexForm')">搜索 @click="getSimpleComplex('simpleComplexForm')">搜索
</el-button> </el-button>
</el-popover> </el-popover>
@ -361,7 +388,10 @@
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading10" type="primary" slot="reference" <el-button v-loading="loading10"
type="primary"
slot="reference"
v-hasPermi="['open:apitools:chinesedict']"
@click="getChineseDict('chineseDictForm')">搜索 @click="getChineseDict('chineseDictForm')">搜索
</el-button> </el-button>
</el-popover> </el-popover>
@ -399,7 +429,10 @@
</div> </div>
<el-button @click="close" icon="el-icon-close" circle plain size="mini" <el-button @click="close" icon="el-icon-close" circle plain size="mini"
style="float: right"></el-button> style="float: right"></el-button>
<el-button v-loading="loading11" type="primary" slot="reference" <el-button v-loading="loading11"
type="primary"
slot="reference"
v-hasPermi="['open:apitools:ipinfo']"
@click="getIpInfo('ipInfoForm')">搜索 @click="getIpInfo('ipInfoForm')">搜索
</el-button> </el-button>
</el-popover> </el-popover>

@ -0,0 +1,45 @@
package com.xjs.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.xjs.service.ApiStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* api
* @author xiejs
* @since 2022-01-25
*/
@RestController
@RequestMapping("apistatistics")
@Api(tags = "业务模块-API记录统计")
public class ApiStatisticsController {
@Autowired
private ApiStatisticsService apiStatisticsService;
@GetMapping("history")
@ApiOperation("查询API历史记录统计")
@RequiresPermissions("statistics:apistatistics:list")
public R<Map<String, List>> statisticsHistoryApi() {
Map<String, List> map = apiStatisticsService.statisticsHistoryApi();
return R.ok(map);
}
@GetMapping("today")
@ApiOperation("查询API当天记录统计")
@RequiresPermissions("statistics:apistatistics:list")
public R<Map<String, List>> statisticsTodayApi() {
Map<String, List> map = apiStatisticsService.statisticsTodayApi();
return R.ok(map);
}
}

@ -0,0 +1,27 @@
package com.xjs.service;
import java.util.List;
import java.util.Map;
/**
* api
* @author xiejs
* @since 2022-01-25
*/
public interface ApiStatisticsService {
/**
* api
* @return map
*/
Map<String, List> statisticsHistoryApi();
/**
* api
* @return map
*/
Map<String, List> statisticsTodayApi();
}

@ -0,0 +1,65 @@
package com.xjs.service.impl;
import com.ruoyi.common.core.domain.R;
import com.xjs.business.warning.RemoteWarningCRUDFeign;
import com.xjs.business.warning.domain.ApiRecord;
import com.xjs.service.ApiStatisticsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* api
* @author xiejs
* @since 2022-01-25
*/
@Service
public class ApiStatisticsServiceImpl implements ApiStatisticsService {
@Autowired
private RemoteWarningCRUDFeign remoteWarningCRUDFeign;
@Override
public Map<String, List> statisticsHistoryApi() {
List<ApiRecord> recordList = getData();
Map<String, List> map = new HashMap<>();
List<String> apiNames = new ArrayList<>();
List<Long> count = new ArrayList<>();
recordList.forEach(record ->{
apiNames.add(record.getApiName());
count.add(record.getTotalCount());
});
map.put("apiNames", apiNames);
map.put("count", count);
return map;
}
@Override
public Map<String, List> statisticsTodayApi() {
List<ApiRecord> recordList = getData();
Map<String, List> map = new HashMap<>();
List<String> apiNames = new ArrayList<>();
List<Long> count = new ArrayList<>();
recordList.forEach(record ->{
apiNames.add(record.getApiName());
count.add(record.getDayCount());
});
map.put("apiNames", apiNames);
map.put("count", count);
return map;
}
/**
* Rdata
* @return List
*/
private List<ApiRecord> getData() {
R<List<ApiRecord>> listR = remoteWarningCRUDFeign.selectApiRecordListForRPC();
return listR.getData();
}
}

@ -0,0 +1,35 @@
package com.xjs.controller;
import com.ruoyi.common.core.domain.R;
import com.xjs.domain.ApiRecord;
import com.xjs.service.ApiWarningService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* api
* @author xiejs
* @since 2022-01-25
*/
@RestController
@RequestMapping("apistatistics")
@Api(tags = "业务模块-API记录统计")
public class ApiStatisticsController {
@Autowired
private ApiWarningService apiWarningService;
@GetMapping
@ApiOperation("远程查询API记录统计")
public R<List<ApiRecord>> selectApiRecordListForRPC() {
List<ApiRecord> apiRecords = apiWarningService.selectApiRecordList(new ApiRecord());
return R.ok(apiRecords);
}
}
Loading…
Cancel
Save