From 9b22140351d0c5bead233766a9004ac647e5efac Mon Sep 17 00:00:00 2001 From: lensferno Date: Fri, 25 Mar 2022 22:45:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E5=BA=95?= =?UTF-8?q?=E5=B1=82=E7=9A=84=E6=95=B0=E6=8D=AE=E6=93=8D=E4=BD=9C=EF=BC=8C?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84=E5=88=9D=E6=98=BE=20?= =?UTF-8?q?=E4=B8=BB=E8=A6=81=E4=BF=AE=E6=94=B9=EF=BC=9A=20-=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E8=94=AC=E8=8F=9C=E6=95=B0=E6=8D=AE=E7=B1=BB(Vegetabl?= =?UTF-8?q?e.java)=20-=20=E5=AE=8C=E6=88=90=E7=BB=9F=E4=B8=80=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E7=B1=BB(UnityResponse.java,=20ResponseTool.java?= =?UTF-8?q?=EF=BC=8C=E5=90=8D=E5=AD=97=E5=8F=AF=E8=83=BD=E4=BC=9A=E6=94=B9?= =?UTF-8?q?)=20-=20=E5=AE=8C=E6=88=90=E5=BA=95=E5=B1=82=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=A4=84=E7=90=86=E7=B1=BB(Tools.java=EF=BC=8C?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E4=B9=9F=E5=8F=AF=E8=83=BD=E4=BC=9A=E6=94=B9?= =?UTF-8?q?=EF=BC=8CResponseProcessor.java)=20-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=BC=82=E5=B8=B8=E7=B1=BB(me.lensfrex.veget?= =?UTF-8?q?ables.exceptions)=20-=20=E5=B0=8F=E6=94=B9IOUtil=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=20=E5=BD=93=E7=84=B6=E8=BF=98=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E8=B7=91=20~~(=E5=B0=B1=E7=AE=97=E8=B7=91=E8=B5=B7?= =?UTF-8?q?=E6=9D=A5=E4=BA=86=E4=B9=9F=E6=98=AFbug=E4=B8=80=E5=A4=A7?= =?UTF-8?q?=E5=9D=A8=E5=90=A7(=E8=B6=85=E5=B0=8F=E5=A3=B0))~~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/runConfigurations/vegetables.xml | 12 +++ .../vegetables/ResponseProcessor.java | 22 +++++ .../src/me/lensfrex/vegetables/Tools.java | 94 +++++++++++++++++-- .../lensfrex/vegetables/VegetablesMain.java | 2 - .../lensfrex/vegetables/data/Vegetable.java | 50 ++++++++++ .../lensfrex/vegetables/data/Vegetables.java | 34 ------- .../exceptions/IllegalPageParamException.java | 10 ++ .../RequestPageTooLargeException.java | 10 ++ .../vegetables/resopnse/ResponseTool.java | 24 +++++ .../vegetables/resopnse/UnityResponse.java | 92 ++++++++++++++++++ .../me/lensfrex/vegetables/utils/IOUtils.java | 14 +-- 11 files changed, 314 insertions(+), 50 deletions(-) create mode 100644 .idea/runConfigurations/vegetables.xml create mode 100644 vegetables/src/me/lensfrex/vegetables/ResponseProcessor.java create mode 100644 vegetables/src/me/lensfrex/vegetables/data/Vegetable.java delete mode 100644 vegetables/src/me/lensfrex/vegetables/data/Vegetables.java create mode 100644 vegetables/src/me/lensfrex/vegetables/exceptions/IllegalPageParamException.java create mode 100644 vegetables/src/me/lensfrex/vegetables/exceptions/RequestPageTooLargeException.java create mode 100644 vegetables/src/me/lensfrex/vegetables/resopnse/ResponseTool.java create mode 100644 vegetables/src/me/lensfrex/vegetables/resopnse/UnityResponse.java diff --git a/.idea/runConfigurations/vegetables.xml b/.idea/runConfigurations/vegetables.xml new file mode 100644 index 0000000..642f73d --- /dev/null +++ b/.idea/runConfigurations/vegetables.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/vegetables/src/me/lensfrex/vegetables/ResponseProcessor.java b/vegetables/src/me/lensfrex/vegetables/ResponseProcessor.java new file mode 100644 index 0000000..84b3640 --- /dev/null +++ b/vegetables/src/me/lensfrex/vegetables/ResponseProcessor.java @@ -0,0 +1,22 @@ +package me.lensfrex.vegetables; + +import me.lensfrex.vegetables.data.Vegetable; +import me.lensfrex.vegetables.resopnse.UnityResponse; + +import java.util.ArrayList; + +/** + * 请求处理类,上层处理请求,主要为对返回数据的封装。 + * 由于功能简单,仅有处理分页数据 + */ +public class ResponseProcessor { + public UnityResponse> getListPage(int pageNum, int pageSize) { + try { + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } +} diff --git a/vegetables/src/me/lensfrex/vegetables/Tools.java b/vegetables/src/me/lensfrex/vegetables/Tools.java index 87b52f5..f3e7493 100644 --- a/vegetables/src/me/lensfrex/vegetables/Tools.java +++ b/vegetables/src/me/lensfrex/vegetables/Tools.java @@ -1,15 +1,95 @@ package me.lensfrex.vegetables; -import me.lensfrex.vegetables.data.Vegetables; -import me.lensfrex.vegetables.utils.IOUtils; +import me.lensfrex.vegetables.data.Vegetable; +import me.lensfrex.vegetables.exceptions.IllegalPageParamException; +import me.lensfrex.vegetables.exceptions.RequestPageTooLargeException; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; +/** + * 请求处理工具 + * 由于功能较为简单,目前仅有获取分页数据的功能 + */ public class Tools { - public static final String SOURCE_FILE_PATH = "/vegetables.txt"; + // 测试用路径,使用前记得改 :P + public static final String SOURCE_FILE_PATH = "C:\\Users\\lenfrex\\projects\\AmberGround\\vegetables\\resources\\vegetables.txt"; -// public static List getListPage(int pageNum, int pageSize) { -// ArrayList source = IOUtils.getListFromFile(); -// } + /** + * 根据给定的页索引以及页大小,对全部蔬菜数据进行分页并返回分页后的List。 + * + * @param pageNum 页码(从1开始) + * @param pageSize 页大小 + * @param allVegetableList 全体的待分页的蔬菜数据 + * @return LinkedList 分页后的蔬菜数据。 + * @throws RequestPageTooLargeException 如果请求的页码已经超过了最大页数 + * @throws IllegalPageParamException 如果分页请求的参数不对 + */ + public List getListPage(int pageNum, int pageSize, List allVegetableList) + throws RequestPageTooLargeException, IllegalPageParamException { + + // 请求的分页大小或页码非法 + if (pageNum <= 0 || pageSize <= 0) { + throw new IllegalPageParamException( + String.format("分页请求的参数不对:pageNum: %d, pageSize: %d", pageNum, pageSize)); + } + + int resultSize = allVegetableList.size(); + + // 判断上一页的记录是不是已经超过最后一条记录,防止页码超过最大值 + if ((pageNum - 1)*pageSize >= resultSize) { + throw new RequestPageTooLargeException(); + } + + LinkedList pagedVegetableList = new LinkedList<>(); + for (int i = (pageNum - 1)*pageSize; (i < pageNum*pageSize && i < resultSize); i++) { + pagedVegetableList.add(allVegetableList.get(i)); + } + + return pagedVegetableList; + } + + /** + * 根据数据字符串解析并获取蔬菜数据 + * + * @param vegetableStrings 蔬菜数据源字符串列表,字符串信息格式应为 + * "蔬菜名 最低价 平均价 最高价 信息日期" + * 其中信息日期格式应为 "yyyy-mm-dd hh:mm:ss" + * @return LinkedList 解析后的蔬菜信息列表 + */ + public LinkedList getAllVegetables(LinkedList vegetableStrings) { + LinkedList vegetables = new LinkedList<>(); + for (String vegetableString : vegetableStrings) { + vegetables.add(parseVegetableInfo(vegetableString)); + } + + return vegetables; + } + + private static void printMessage() { + System.out.println("Get data source from: " + SOURCE_FILE_PATH); + System.out.println("This is just for test."); + System.out.println("If some IO error occurred, try to change SOURCE_FILE_PATH in me.lensfrex.vegetables.Tools :P"); + } + + /** + * 解析Vegetable的信息字符串,并返回相应的蔬菜信息数据 + * + * @param vegetableString 蔬菜信息字符串, + * 格式应为 "蔬菜名 最低价 平均价 最高价 信息日期" + * 其中信息日期格式应为 "yyyy-mm-dd hh:mm:ss" + * @return 蔬菜信息数据类 + */ + private Vegetable parseVegetableInfo(String vegetableString) { + String[] spilt = vegetableString.split(" "); + Vegetable vegetable = new Vegetable(); + + vegetable.setName(spilt[0]); + vegetable.setPrice(Double.parseDouble(spilt[1]), Vegetable.PRICE_MIN); + vegetable.setPrice(Double.parseDouble(spilt[2]), Vegetable.PRICE_AVG); + vegetable.setPrice(Double.parseDouble(spilt[3]), Vegetable.PRICE_MAX); + vegetable.setPriceDate(spilt[4] + spilt[5]); + + return vegetable; + } } diff --git a/vegetables/src/me/lensfrex/vegetables/VegetablesMain.java b/vegetables/src/me/lensfrex/vegetables/VegetablesMain.java index 01b6ba4..21089ae 100644 --- a/vegetables/src/me/lensfrex/vegetables/VegetablesMain.java +++ b/vegetables/src/me/lensfrex/vegetables/VegetablesMain.java @@ -1,9 +1,7 @@ package me.lensfrex.vegetables; public class VegetablesMain { - public static final String SOURCE_FILE_PATH = "resources/vegetables.txt"; public static void main(String[] args) { - } } diff --git a/vegetables/src/me/lensfrex/vegetables/data/Vegetable.java b/vegetables/src/me/lensfrex/vegetables/data/Vegetable.java new file mode 100644 index 0000000..d633154 --- /dev/null +++ b/vegetables/src/me/lensfrex/vegetables/data/Vegetable.java @@ -0,0 +1,50 @@ +package me.lensfrex.vegetables.data; + +import java.util.Arrays; + +/** + * Vegetable的信息数据类,仅用于存储相关的数据结构 + */ +public class Vegetable { + public static final int PRICE_MIN = 0; + public static final int PRICE_AVG = 1; + public static final int PRICE_MAX = 2; + + private String name; + private double[] price; + + private String priceDate; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice(int priceType) { + return price[priceType]; + } + + public void setPrice(double price, int priceType) { + this.price[priceType] = price; + } + + public String getPriceDate() { + return priceDate; + } + + public void setPriceDate(String priceDate) { + this.priceDate = priceDate; + } + + @Override + public String toString() { + return "Vegetable{" + + "name='" + name + '\'' + + ", price=" + Arrays.toString(price) + + ", priceDate='" + priceDate + '\'' + + '}'; + } +} diff --git a/vegetables/src/me/lensfrex/vegetables/data/Vegetables.java b/vegetables/src/me/lensfrex/vegetables/data/Vegetables.java deleted file mode 100644 index fa608cc..0000000 --- a/vegetables/src/me/lensfrex/vegetables/data/Vegetables.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.lensfrex.vegetables.data; - -import java.util.Date; - -public class Vegetables { - private String name; - private double[] price; - - private String date; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public double getPrice(int priceType) { - return price[priceType]; - } - - public void setPrice(double price, int priceType) { - this.price[priceType] = price; - } - - public String getDate() { - return date; - } - - public void setDate(String date) { - this.date = date; - } -} diff --git a/vegetables/src/me/lensfrex/vegetables/exceptions/IllegalPageParamException.java b/vegetables/src/me/lensfrex/vegetables/exceptions/IllegalPageParamException.java new file mode 100644 index 0000000..81a4ec9 --- /dev/null +++ b/vegetables/src/me/lensfrex/vegetables/exceptions/IllegalPageParamException.java @@ -0,0 +1,10 @@ +package me.lensfrex.vegetables.exceptions; + +/** + * 数据页请求数据非法异常 + */ +public class IllegalPageParamException extends Exception{ + public IllegalPageParamException(String message) { + super("IllegalPageRequest: " + message); + } +} diff --git a/vegetables/src/me/lensfrex/vegetables/exceptions/RequestPageTooLargeException.java b/vegetables/src/me/lensfrex/vegetables/exceptions/RequestPageTooLargeException.java new file mode 100644 index 0000000..ffef88b --- /dev/null +++ b/vegetables/src/me/lensfrex/vegetables/exceptions/RequestPageTooLargeException.java @@ -0,0 +1,10 @@ +package me.lensfrex.vegetables.exceptions; + +/** + * 用于当请求数据的页数已经超过最大页数时抛出的异常 + */ +public class RequestPageTooLargeException extends Exception { + public RequestPageTooLargeException() { + super("请求结果的页数已超过最大数量"); + } +} diff --git a/vegetables/src/me/lensfrex/vegetables/resopnse/ResponseTool.java b/vegetables/src/me/lensfrex/vegetables/resopnse/ResponseTool.java new file mode 100644 index 0000000..2394c84 --- /dev/null +++ b/vegetables/src/me/lensfrex/vegetables/resopnse/ResponseTool.java @@ -0,0 +1,24 @@ +package me.lensfrex.vegetables.resopnse; + +public class ResponseTool { + /** + * 构建请求成功的响应返回类 + * @param data 请求到的数据 + * @param message 请求信息 + * @param 请求的数据类型 + * @return 构建出的请求响应类 + */ + public static UnityResponse success(T data, String message) { + return new UnityResponse<>(UnityResponse.ResultCode.SUCCESS, message, data); + } + + /** + * 构建请求失败的响应返回类 + * @param message 失败信息 + * @param code 失败状态码,应从UnityResponse.ResultCode中定义的常量中选择 + * @return 构建出的请求响应类 + */ + public static UnityResponse error(String message, int code) { + return new UnityResponse<>(code, message, "null"); + } +} diff --git a/vegetables/src/me/lensfrex/vegetables/resopnse/UnityResponse.java b/vegetables/src/me/lensfrex/vegetables/resopnse/UnityResponse.java new file mode 100644 index 0000000..088283d --- /dev/null +++ b/vegetables/src/me/lensfrex/vegetables/resopnse/UnityResponse.java @@ -0,0 +1,92 @@ +package me.lensfrex.vegetables.resopnse; + +/** + * 统一的返回数据结构,含有字段code, message, data + * + * @param data的类型 + */ +public class UnityResponse { + /** + * 返回码。其值为ResultCode中定义的常量 + */ + private int code; + /** + * 返回的结果信息 + */ + private String message; + /** + * 请求的数据,其类型为声明返回类时指定的类型 + */ + private T data; + + public UnityResponse(int code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public UnityResponse() { + this.code = ResultCode.EMPTY_DATA; + this.message = "数据未初始化"; + this.data = null; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "UnityResponse{" + + "code=" + code + + ", message='" + message + '\'' + + ", data=" + data + + '}'; + } + + /** + * 状态码的常量 + */ + static class ResultCode { + /** + * 请求成功 + */ + public static final int SUCCESS = 200; + /** + * 数据是空的 + */ + public static final int EMPTY_DATA = 0; + /** + * 请求的分页页码超过最大值 + */ + public static final int PAGE_OUT_OF_MAX = 100; + /** + * 请求的分页参数有误 + */ + public static final int PAGE_PARAM_WORN = 101; + /** + * 未知错误 + */ + public static final int UNKNOWN_ERROR = 503; + } +} diff --git a/vegetables/src/me/lensfrex/vegetables/utils/IOUtils.java b/vegetables/src/me/lensfrex/vegetables/utils/IOUtils.java index a0b6f14..a4b5ca3 100644 --- a/vegetables/src/me/lensfrex/vegetables/utils/IOUtils.java +++ b/vegetables/src/me/lensfrex/vegetables/utils/IOUtils.java @@ -3,18 +3,18 @@ package me.lensfrex.vegetables.utils; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; public class IOUtils { - // copy 来自实例,偷懒了 /** - * 读取文件,返回list集合 - * @param path 文件的存储路径 D:\领航招新\培训计划\notes\vegetables.txt - * @return List 集合 + * 从文件中读取每行数据。 + * 为保证性能,此处使用LinkedList + * @param path 文件的存储路径 + * @return LinkedList 读取到的每行文本 */ - public static List getListFromFile(String path){ - List list = new ArrayList<>(); + public static LinkedList getListFromFile(String path) { + LinkedList list = new LinkedList<>(); try{ //读取文件内容 //创建一个新的 FileReader ,给定要读取的文件的名称。