From e2c152a5697f6b8a7647e19e162f714dca5ff556 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Sun, 19 Mar 2023 15:55:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E6=8A=A5=E8=A1=A8=E3=80=81license=E6=B5=81=E9=87=8F?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E9=A1=B5=E9=9D=A2=EF=BC=8C=E5=8F=8A=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-admin/src/api/report.js | 16 +++ neutrino-proxy-admin/src/lang/zh.js | 10 +- neutrino-proxy-admin/src/router/index.js | 14 ++ .../src/views/report/licenseFlowReport.vue | 128 ++++++++++++++++++ .../src/views/report/userFlowReport.vue | 123 +++++++++++++++++ .../controller/req/LicenseFlowReportReq.java | 3 +- .../controller/req/UserFlowReportReq.java | 5 +- .../controller/res/LicenseFlowReportRes.java | 30 ++-- .../controller/res/UserFlowReportRes.java | 38 ++---- .../proxy/server/service/ReportService.java | 115 +++++++++++++++- .../proxy/server/util/FormatUtil.java | 49 +++++++ 11 files changed, 485 insertions(+), 46 deletions(-) create mode 100644 neutrino-proxy-admin/src/api/report.js create mode 100644 neutrino-proxy-admin/src/views/report/licenseFlowReport.vue create mode 100644 neutrino-proxy-admin/src/views/report/userFlowReport.vue create mode 100644 neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/util/FormatUtil.java diff --git a/neutrino-proxy-admin/src/api/report.js b/neutrino-proxy-admin/src/api/report.js new file mode 100644 index 00000000..f4632503 --- /dev/null +++ b/neutrino-proxy-admin/src/api/report.js @@ -0,0 +1,16 @@ +import request from '@/utils/request' +export function fetchUserFlowReportList(query) { + return request({ + url: '/report/user/flow-report/page', + method: 'get', + params: query + }) +} + +export function fetchLicenseFlowReportList(query) { + return request({ + url: '/report/license/flow-report/page', + method: 'get', + params: query + }) +} diff --git a/neutrino-proxy-admin/src/lang/zh.js b/neutrino-proxy-admin/src/lang/zh.js index 92d042cf..7fc4f215 100644 --- a/neutrino-proxy-admin/src/lang/zh.js +++ b/neutrino-proxy-admin/src/lang/zh.js @@ -56,7 +56,10 @@ export default { jobLog: '调度日志', log: '日志管理', loginLog: '登录日志', - clientConnectLog: '客户端连接日志' + clientConnectLog: '客户端连接日志', + report: '报表管理', + userFlowReport: '用户流量报表', + licenseFlowReport: 'License流量报表' }, navbar: { logOut: '退出登录', @@ -153,7 +156,10 @@ export default { msg: '消息', outcome: '结果', err: '异常信息', - resetKey: '重置Key' + resetKey: '重置Key', + upFlow: '上行流量', + downFlow: '下行流量', + totalFlow: '总流量' }, button: { lookOver: '查看' diff --git a/neutrino-proxy-admin/src/router/index.js b/neutrino-proxy-admin/src/router/index.js index 020c9374..1dd444cf 100644 --- a/neutrino-proxy-admin/src/router/index.js +++ b/neutrino-proxy-admin/src/router/index.js @@ -80,6 +80,20 @@ export const asyncRouterMap = [ { path: 'jobManager', component: _import('system/jobManager'), name: 'jobManager', meta: { title: 'jobManager' }} ] }, + { + path: '/report', + component: Layout, + redirect: 'noredirect', + name: 'report', + meta: { + title: 'report', + icon: 'component' + }, + children: [ + { path: 'userFlowReport', component: _import('report/userFlowReport'), name: 'userFlowReport', meta: { title: 'userFlowReport' }}, + { path: 'licenseFlowReport', component: _import('report/licenseFlowReport'), name: 'licenseFlowReport', meta: { title: 'licenseFlowReport' }} + ] + }, { path: '/log', component: Layout, diff --git a/neutrino-proxy-admin/src/views/report/licenseFlowReport.vue b/neutrino-proxy-admin/src/views/report/licenseFlowReport.vue new file mode 100644 index 00000000..bd5f98e2 --- /dev/null +++ b/neutrino-proxy-admin/src/views/report/licenseFlowReport.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/neutrino-proxy-admin/src/views/report/userFlowReport.vue b/neutrino-proxy-admin/src/views/report/userFlowReport.vue new file mode 100644 index 00000000..3447a6b6 --- /dev/null +++ b/neutrino-proxy-admin/src/views/report/userFlowReport.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/LicenseFlowReportReq.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/LicenseFlowReportReq.java index f4069327..8d06f818 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/LicenseFlowReportReq.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/LicenseFlowReportReq.java @@ -29,5 +29,6 @@ import lombok.Data; */ @Data public class LicenseFlowReportReq { - + private Integer userId; + private Integer licenseId; } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/UserFlowReportReq.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/UserFlowReportReq.java index 66a2fd7a..943bf4d1 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/UserFlowReportReq.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/req/UserFlowReportReq.java @@ -29,5 +29,8 @@ import lombok.Data; */ @Data public class UserFlowReportReq { - + /** + * 用户ID + */ + private Integer userId; } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/LicenseFlowReportRes.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/LicenseFlowReportRes.java index 9abcaf24..84df44cb 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/LicenseFlowReportRes.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/LicenseFlowReportRes.java @@ -22,6 +22,7 @@ package fun.asgc.neutrino.proxy.server.controller.res; import lombok.Data; +import lombok.experimental.Accessors; import java.util.Date; @@ -29,6 +30,7 @@ import java.util.Date; * @author: aoshiguchen * @date: 2022/12/21 */ +@Accessors(chain = true) @Data public class LicenseFlowReportRes { /** @@ -48,31 +50,27 @@ public class LicenseFlowReportRes { */ private String licenseName; /** - * 写入字节数 + * 上行流量字节数 */ - private Long writeBytes; + private Long upFlowBytes; /** - * 读取字节数 + * 下行流量字节数 */ - private Long readBytes; + private Long downFlowBytes; /** - * 写入流量描述 + * 总流量字节数 */ - private String writeFlowStr; + private Long totalFlowBytes; /** - * 读取流量描述 + * 上行流量描述 */ - private String readFlowStr; + private String upFlowDesc; /** - * 流量描述 + * 下行流量描述 */ - private String flowStr; + private String downFlowDesc; /** - * 报表时间 + * 总流量描述 */ - private Date date; - /** - * 创建时间 - */ - private Date createTime; + private String totalFlowDesc; } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/UserFlowReportRes.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/UserFlowReportRes.java index f854b3ac..802126d9 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/UserFlowReportRes.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/res/UserFlowReportRes.java @@ -22,6 +22,7 @@ package fun.asgc.neutrino.proxy.server.controller.res; import lombok.Data; +import lombok.experimental.Accessors; import java.util.Date; @@ -29,6 +30,7 @@ import java.util.Date; * @author: aoshiguchen * @date: 2022/12/21 */ +@Accessors(chain = true) @Data public class UserFlowReportRes { /** @@ -40,39 +42,27 @@ public class UserFlowReportRes { */ private String userName; /** - * 历史写入字节数 + * 上行流量字节数 */ - private Long historyWriteBytes; + private Long upFlowBytes; /** - * 历史读取字节数 + * 下行流量字节数 */ - private Long historyReadBytes; + private Long downFlowBytes; /** - * 写入字节数 + * 总流量字节数 */ - private Long writeBytes; + private Long totalFlowBytes; /** - * 读取字节数 + * 上行流量描述 */ - private Long readBytes; + private String upFlowDesc; /** - * 写入流量描述 + * 下行流量描述 */ - private String writeFlowStr; + private String downFlowDesc; /** - * 读取流量描述 + * 总流量描述 */ - private String readFlowStr; - /** - * 流量描述 - */ - private String flowStr; - /** - * 报表时间 - */ - private Date date; - /** - * 创建时间 - */ - private Date createTime; + private String totalFlowDesc; } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java index 2fb53bbf..36dfb6dd 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/service/ReportService.java @@ -1,14 +1,19 @@ package fun.asgc.neutrino.proxy.server.service; +import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.Lists; import fun.asgc.neutrino.proxy.server.base.page.PageInfo; import fun.asgc.neutrino.proxy.server.base.page.PageQuery; import fun.asgc.neutrino.proxy.server.controller.req.LicenseFlowReportReq; import fun.asgc.neutrino.proxy.server.controller.req.UserFlowReportReq; import fun.asgc.neutrino.proxy.server.controller.res.LicenseFlowReportRes; import fun.asgc.neutrino.proxy.server.controller.res.UserFlowReportRes; +import fun.asgc.neutrino.proxy.server.util.FormatUtil; import lombok.extern.slf4j.Slf4j; import org.noear.solon.annotation.Component; +import java.util.List; + /** * @author: aoshiguchen * @date: 2022/12/23 @@ -25,7 +30,43 @@ public class ReportService { */ public PageInfo userFlowReportPage(PageQuery pageQuery, UserFlowReportReq req) { // TODO - return null; + List all = Lists.newArrayList( + new UserFlowReportRes().setUserId(1).setUserName("用户1").setUpFlowBytes(100L).setDownFlowBytes(200L), + new UserFlowReportRes().setUserId(2).setUserName("用户2").setUpFlowBytes(400L).setDownFlowBytes(600L), + new UserFlowReportRes().setUserId(3).setUserName("用户3").setUpFlowBytes(800L).setDownFlowBytes(1200L), + new UserFlowReportRes().setUserId(4).setUserName("用户4").setUpFlowBytes(120L).setDownFlowBytes(1600L), + new UserFlowReportRes().setUserId(5).setUserName("用户5").setUpFlowBytes(1600L).setDownFlowBytes(2000L), + new UserFlowReportRes().setUserId(6).setUserName("用户6").setUpFlowBytes(2200L).setDownFlowBytes(2500L), + new UserFlowReportRes().setUserId(7).setUserName("用户7").setUpFlowBytes(2800L).setDownFlowBytes(3200L), + new UserFlowReportRes().setUserId(8).setUserName("用户8").setUpFlowBytes(41000L).setDownFlowBytes(52000L), + new UserFlowReportRes().setUserId(9).setUserName("用户9").setUpFlowBytes(310000L).setDownFlowBytes(420000L), + new UserFlowReportRes().setUserId(10).setUserName("用户10").setUpFlowBytes(51000L).setDownFlowBytes(620000L), + new UserFlowReportRes().setUserId(11).setUserName("用户11").setUpFlowBytes(310000L).setDownFlowBytes(20000L), + new UserFlowReportRes().setUserId(12).setUserName("用户12").setUpFlowBytes(23100L).setDownFlowBytes(245200L), + new UserFlowReportRes().setUserId(13).setUserName("用户13").setUpFlowBytes(98100L).setDownFlowBytes(65200L), + new UserFlowReportRes().setUserId(14).setUserName("用户14").setUpFlowBytes(234100L).setDownFlowBytes(7809200L), + new UserFlowReportRes().setUserId(15).setUserName("用户15").setUpFlowBytes(23100L).setDownFlowBytes(4200L), + new UserFlowReportRes().setUserId(16).setUserName("用户16").setUpFlowBytes(21003100L).setDownFlowBytes(4099200L), + new UserFlowReportRes().setUserId(17).setUserName("用户17").setUpFlowBytes(23100L).setDownFlowBytes(4200L), + new UserFlowReportRes().setUserId(18).setUserName("用户18").setUpFlowBytes(10023100L).setDownFlowBytes(20004200L), + new UserFlowReportRes().setUserId(19).setUserName("用户19").setUpFlowBytes(300023100L).setDownFlowBytes(40004200L), + new UserFlowReportRes().setUserId(20).setUserName("用户20").setUpFlowBytes(5000023100L).setDownFlowBytes(600004200L), + new UserFlowReportRes().setUserId(21).setUserName("用户21").setUpFlowBytes(700023100L).setDownFlowBytes(80094200L), + new UserFlowReportRes().setUserId(22).setUserName("用户22").setUpFlowBytes(40000023100L).setDownFlowBytes(6000004200L), + new UserFlowReportRes().setUserId(23).setUserName("用户23").setUpFlowBytes(300000023100L).setDownFlowBytes(40000004200L), + new UserFlowReportRes().setUserId(24).setUserName("用户24").setUpFlowBytes(300998723100L).setDownFlowBytes(2099877664200L), + new UserFlowReportRes().setUserId(25).setUserName("用户25").setUpFlowBytes(50987668623100L).setDownFlowBytes(30987657864200L) + ); + List list = null; + if (pageQuery.getCurrent() == 1) { + list = all.subList(0, 10); + } else if (pageQuery.getCurrent() == 2){ + list = all.subList(10, 20); + } else { + list = all.subList(20, all.size()); + } + fillUserFlowReport(list); + return PageInfo.of(list, 25L, pageQuery.getCurrent(), pageQuery.getSize()); } /** @@ -36,6 +77,76 @@ public class ReportService { */ public PageInfo licenseFlowReportPage(PageQuery pageQuery, LicenseFlowReportReq req) { // TODO - return null; + List all = Lists.newArrayList( + new LicenseFlowReportRes().setUserId(1).setUserName("用户1").setLicenseName("license1").setUpFlowBytes(100L).setDownFlowBytes(200L), + new LicenseFlowReportRes().setUserId(2).setUserName("用户2").setLicenseName("license1").setUpFlowBytes(400L).setDownFlowBytes(600L), + new LicenseFlowReportRes().setUserId(3).setUserName("用户3").setLicenseName("license1").setUpFlowBytes(800L).setDownFlowBytes(1200L), + new LicenseFlowReportRes().setUserId(4).setUserName("用户4").setLicenseName("license1").setUpFlowBytes(120L).setDownFlowBytes(1600L), + new LicenseFlowReportRes().setUserId(5).setUserName("用户5").setLicenseName("license1").setUpFlowBytes(1600L).setDownFlowBytes(2000L), + new LicenseFlowReportRes().setUserId(6).setUserName("用户6").setLicenseName("license1").setUpFlowBytes(2200L).setDownFlowBytes(2500L), + new LicenseFlowReportRes().setUserId(7).setUserName("用户7").setLicenseName("license1").setUpFlowBytes(2800L).setDownFlowBytes(3200L), + new LicenseFlowReportRes().setUserId(8).setUserName("用户8").setLicenseName("license1").setUpFlowBytes(41000L).setDownFlowBytes(52000L), + new LicenseFlowReportRes().setUserId(9).setUserName("用户9").setLicenseName("license1").setUpFlowBytes(310000L).setDownFlowBytes(420000L), + new LicenseFlowReportRes().setUserId(10).setUserName("用户10").setLicenseName("license1").setUpFlowBytes(51000L).setDownFlowBytes(620000L), + new LicenseFlowReportRes().setUserId(11).setUserName("用户11").setLicenseName("license1").setUpFlowBytes(310000L).setDownFlowBytes(20000L), + new LicenseFlowReportRes().setUserId(12).setUserName("用户12").setLicenseName("license1").setUpFlowBytes(23100L).setDownFlowBytes(245200L), + new LicenseFlowReportRes().setUserId(13).setUserName("用户13").setLicenseName("license1").setUpFlowBytes(98100L).setDownFlowBytes(65200L), + new LicenseFlowReportRes().setUserId(14).setUserName("用户14").setLicenseName("license1").setUpFlowBytes(234100L).setDownFlowBytes(7809200L), + new LicenseFlowReportRes().setUserId(15).setUserName("用户15").setLicenseName("license1").setUpFlowBytes(23100L).setDownFlowBytes(4200L), + new LicenseFlowReportRes().setUserId(16).setUserName("用户16").setLicenseName("license1").setUpFlowBytes(21003100L).setDownFlowBytes(4099200L), + new LicenseFlowReportRes().setUserId(17).setUserName("用户17").setLicenseName("license1").setUpFlowBytes(23100L).setDownFlowBytes(4200L), + new LicenseFlowReportRes().setUserId(18).setUserName("用户18").setLicenseName("license1").setUpFlowBytes(10023100L).setDownFlowBytes(20004200L), + new LicenseFlowReportRes().setUserId(19).setUserName("用户19").setLicenseName("license1").setUpFlowBytes(300023100L).setDownFlowBytes(40004200L), + new LicenseFlowReportRes().setUserId(20).setUserName("用户20").setLicenseName("license1").setUpFlowBytes(5000023100L).setDownFlowBytes(600004200L), + new LicenseFlowReportRes().setUserId(21).setUserName("用户21").setLicenseName("license1").setUpFlowBytes(700023100L).setDownFlowBytes(80094200L), + new LicenseFlowReportRes().setUserId(22).setUserName("用户22").setLicenseName("license1").setUpFlowBytes(40000023100L).setDownFlowBytes(6000004200L), + new LicenseFlowReportRes().setUserId(23).setUserName("用户23").setLicenseName("license1").setUpFlowBytes(300000023100L).setDownFlowBytes(40000004200L), + new LicenseFlowReportRes().setUserId(24).setUserName("用户24").setLicenseName("license1").setUpFlowBytes(300998723100L).setDownFlowBytes(2099877664200L), + new LicenseFlowReportRes().setUserId(25).setUserName("用户25").setLicenseName("license1").setUpFlowBytes(50987668623100L).setDownFlowBytes(30987657864200L) + ); + List list = null; + if (pageQuery.getCurrent() == 1) { + list = all.subList(0, 10); + } else if (pageQuery.getCurrent() == 2){ + list = all.subList(10, 20); + } else { + list = all.subList(20, all.size()); + } + fillLicenseFlowReport(list); + return PageInfo.of(list, 25L, pageQuery.getCurrent(), pageQuery.getSize()); + } + + private void fillUserFlowReport(List list) { + if (CollectionUtil.isEmpty(list)) { + return; + } + for (UserFlowReportRes item : list) { + long upFlowBytes = (null == item.getUpFlowBytes()) ? 0 : item.getUpFlowBytes(); + long downFlowBytes = (null == item.getDownFlowBytes()) ? 0 : item.getDownFlowBytes(); + long totalFlowBytes = upFlowBytes + downFlowBytes; + item.setUpFlowBytes(upFlowBytes); + item.setDownFlowBytes(downFlowBytes); + item.setTotalFlowBytes(totalFlowBytes); + item.setUpFlowDesc(FormatUtil.getSizeDescByByteCount(upFlowBytes)); + item.setDownFlowDesc(FormatUtil.getSizeDescByByteCount(downFlowBytes)); + item.setTotalFlowDesc(FormatUtil.getSizeDescByByteCount(totalFlowBytes)); + } + } + + private void fillLicenseFlowReport(List list) { + if (CollectionUtil.isEmpty(list)) { + return; + } + for (LicenseFlowReportRes item : list) { + long upFlowBytes = (null == item.getUpFlowBytes()) ? 0 : item.getUpFlowBytes(); + long downFlowBytes = (null == item.getDownFlowBytes()) ? 0 : item.getDownFlowBytes(); + long totalFlowBytes = upFlowBytes + downFlowBytes; + item.setUpFlowBytes(upFlowBytes); + item.setDownFlowBytes(downFlowBytes); + item.setTotalFlowBytes(totalFlowBytes); + item.setUpFlowDesc(FormatUtil.getSizeDescByByteCount(upFlowBytes)); + item.setDownFlowDesc(FormatUtil.getSizeDescByByteCount(downFlowBytes)); + item.setTotalFlowDesc(FormatUtil.getSizeDescByByteCount(totalFlowBytes)); + } } } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/util/FormatUtil.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/util/FormatUtil.java new file mode 100644 index 00000000..a010d85b --- /dev/null +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/util/FormatUtil.java @@ -0,0 +1,49 @@ +package fun.asgc.neutrino.proxy.server.util; + +/** + * @author: aoshiguchen + * @date: 2023/3/19 + */ +public class FormatUtil { + private static final String[] SIZE_UNINTS = {"B", "KB", "MB", "GB", "TB"}; + private static final int SIZE_SYSTEM = 1024; + /** + * 根据字节数获取大小描述 + * 1、小于1024字节的以B为单位 + * 2、小于1024KB的以KB为单位 + * 3、小于1024M的以MB为单位 + * 4、小于1024G的以GB为单位 + * 5、其他以TB为单位 + * @param byteCount + * @return + */ + public static String getSizeDescByByteCount(long byteCount){ + if(byteCount <= 0){ + return "0B"; + } + + double res = byteCount; + int index = 0; + while (index < SIZE_UNINTS.length && res >= SIZE_SYSTEM){ + res /= SIZE_SYSTEM; + index++; + } + + if(index >= SIZE_UNINTS.length){ + index = SIZE_UNINTS.length - 1; + res *= 1024; + } + + return trimZero(String.format("%.2f", res)) + " " + SIZE_UNINTS[index]; + } + + private static String trimZero(String s) { + if (s.indexOf(".") > 0) { + // 去掉多余的0 + s = s.replaceAll("0+?$", ""); + // 如最后一位是.则去掉 + s = s.replaceAll("[.]$", ""); + } + return s; + } +}