From ddfc68e2ca5c904db61bb89c4fb65d34efceb295 Mon Sep 17 00:00:00 2001 From: zykzhangyukang <3053161401@qq.com> Date: Thu, 4 Feb 2021 10:52:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=8E=B7=E5=8F=96=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E9=94=99=E8=AF=AF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++-- document/images/logo.png | Bin 0 -> 33156 bytes .../coderman/common/utils/AddressUtil.java | 89 ++++++++++-------- 3 files changed, 68 insertions(+), 45 deletions(-) create mode 100644 document/images/logo.png diff --git a/README.md b/README.md index 71a5715..a619b43 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,27 @@ -## 🚀 简介 | Intro 新冠-物资管理系统 +

logo

+

course-online   🚀   新冠-物资管理系统

+

2020新冠疫情期间, 寂寞消遣之作~

+

https://www.zykhome.club

+ + +--- + +

+ jdk 8+ + + + + jdk 8+ + GitHub stars + GitHub forks + size +

>该项目是一个以新冠疫情为主题开发的一个物资管理系统,主要分为系统模块和业务模块,业务模块是处理疫情期间,物资的发放,物资入库,以及查看物资的库存等. 系统模块是一个后台通用的RBAC权限模块,可以精确的控制到后台API级别的权限控制,项目不定期更新中.武汉加油~~ 开发模式:前后端分离,前端负责数据渲染,后端返回数据。 -![https://img.shields.io/badge/license-Apache%202.0-blue.svg?longCache=true&style=flat-square](https://img.shields.io/badge/license-Apache%202.0-blue.svg?longCache=true&style=flat-square) -![https://img.shields.io/badge/springboot-2.2.1-yellow.svg?style=flat-square](https://img.shields.io/badge/springboot-2.2.1-yellow.svg?style=flat-square) -![https://img.shields.io/badge/shiro-1.4.2-orange.svg?longCache=true&style=flat-square](https://img.shields.io/badge/shiro-1.4.2-orange.svg?longCache=true&style=flat-square) - - ### [在线预览](https://www.zykhome.club/#/login "在线预览") & [后端项目](https://github.com/zykzhangyukang/Xinguan "后端项目") & [前端项目](https://github.com/zykzhangyukang/xinguan-vue "前端项目") #### 模块划分 diff --git a/document/images/logo.png b/document/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2237dd8238dcf0b2c74fb964906a657234fcb959 GIT binary patch literal 33156 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 K 86400000L)) { + log.info("文件不存在或者文件存在时间超过1天进入..."); + try { + InputStream inputStream = new ClassPathResource("ip2region/ip2region.db").getInputStream(); + IOUtils.copy(inputStream, new FileOutputStream(file)); + } catch (IOException exception) { + exception.printStackTrace(); } - - dataBlock = (DataBlock) method.invoke(searcher, ip); - - return dataBlock.getRegion(); - - } catch (Exception e) { - e.printStackTrace(); } - }catch (Exception e) { - e.printStackTrace(); } + //查询算法 + int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree + try { + DbConfig config = new DbConfig(); + DbSearcher searcher = new DbSearcher(config, dbPath); + //define the method + Method method = null; + switch (algorithm) { + case DbSearcher.BTREE_ALGORITHM: + method = searcher.getClass().getMethod("btreeSearch", String.class); + break; + case DbSearcher.BINARY_ALGORITHM: + method = searcher.getClass().getMethod("binarySearch", String.class); + break; + case DbSearcher.MEMORY_ALGORITYM: + method = searcher.getClass().getMethod("memorySearch", String.class); + break; + } + DataBlock dataBlock = null; + if (Util.isIpAddress(ip) == false) { + log.error("Error: Invalid ip address"); + } + dataBlock = (DataBlock) method.invoke(searcher, ip); + return dataBlock.getRegion(); + } catch (Exception e) { + e.printStackTrace(); + } return null; }