初步完成底层的数据操作,项目结构初显

主要修改:
- 完成蔬菜数据类(Vegetable.java)
- 完成统一响应类(UnityResponse.java, ResponseTool.java,名字可能会改)
- 完成底层的数据处理类(Tools.java,名字也可能会改,ResponseProcessor.java)
- 新增部分异常类(me.lensfrex.vegetables.exceptions)
- 小改IOUtil的注释
当然还不能跑 ~~(就算跑起来了也是bug一大坨吧(超小声))~~
main
lensfrex 3 years ago
parent abf361a8df
commit 9b22140351
Signed by: lensfrex
GPG Key ID: 0F69A0A2FBEE98A0
  1. 12
      .idea/runConfigurations/vegetables.xml
  2. 22
      vegetables/src/me/lensfrex/vegetables/ResponseProcessor.java
  3. 94
      vegetables/src/me/lensfrex/vegetables/Tools.java
  4. 2
      vegetables/src/me/lensfrex/vegetables/VegetablesMain.java
  5. 50
      vegetables/src/me/lensfrex/vegetables/data/Vegetable.java
  6. 34
      vegetables/src/me/lensfrex/vegetables/data/Vegetables.java
  7. 10
      vegetables/src/me/lensfrex/vegetables/exceptions/IllegalPageParamException.java
  8. 10
      vegetables/src/me/lensfrex/vegetables/exceptions/RequestPageTooLargeException.java
  9. 24
      vegetables/src/me/lensfrex/vegetables/resopnse/ResponseTool.java
  10. 92
      vegetables/src/me/lensfrex/vegetables/resopnse/UnityResponse.java
  11. 14
      vegetables/src/me/lensfrex/vegetables/utils/IOUtils.java

@ -0,0 +1,12 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="vegetables" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="1.8" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<option name="MAIN_CLASS_NAME" value="me.lensfrex.vegetables.VegetablesMain" />
<module name="vegetables" />
<method v="2">
<option name="Make" enabled="true" />
<option name="com.soywiz.korge.intellij.UpdateResourceBeforeRunTask" enabled="false" />
</method>
</configuration>
</component>

@ -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<ArrayList<Vegetable>> getListPage(int pageNum, int pageSize) {
try {
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

@ -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<Vegetables> getListPage(int pageNum, int pageSize) {
// ArrayList<String> source = IOUtils.getListFromFile();
// }
/**
* 根据给定的页索引以及页大小对全部蔬菜数据进行分页并返回分页后的List
*
* @param pageNum 页码从1开始
* @param pageSize 页大小
* @param allVegetableList 全体的待分页的蔬菜数据
* @return LinkedList<Vegetable> 分页后的蔬菜数据
* @throws RequestPageTooLargeException 如果请求的页码已经超过了最大页数
* @throws IllegalPageParamException 如果分页请求的参数不对
*/
public List<Vegetable> getListPage(int pageNum, int pageSize, List<Vegetable> 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<Vegetable> 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<Vegetable> 解析后的蔬菜信息列表
*/
public LinkedList<Vegetable> getAllVegetables(LinkedList<String> vegetableStrings) {
LinkedList<Vegetable> 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;
}
}

@ -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) {
}
}

@ -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 + '\'' +
'}';
}
}

@ -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;
}
}

@ -0,0 +1,10 @@
package me.lensfrex.vegetables.exceptions;
/**
* 数据页请求数据非法异常
*/
public class IllegalPageParamException extends Exception{
public IllegalPageParamException(String message) {
super("IllegalPageRequest: " + message);
}
}

@ -0,0 +1,10 @@
package me.lensfrex.vegetables.exceptions;
/**
* 用于当请求数据的页数已经超过最大页数时抛出的异常
*/
public class RequestPageTooLargeException extends Exception {
public RequestPageTooLargeException() {
super("请求结果的页数已超过最大数量");
}
}

@ -0,0 +1,24 @@
package me.lensfrex.vegetables.resopnse;
public class ResponseTool {
/**
* 构建请求成功的响应返回类
* @param data 请求到的数据
* @param message 请求信息
* @param <T> 请求的数据类型
* @return 构建出的请求响应类
*/
public static <T> UnityResponse<T> success(T data, String message) {
return new UnityResponse<>(UnityResponse.ResultCode.SUCCESS, message, data);
}
/**
* 构建请求失败的响应返回类
* @param message 失败信息
* @param code 失败状态码应从UnityResponse.ResultCode中定义的常量中选择
* @return 构建出的请求响应类
*/
public static UnityResponse<String> error(String message, int code) {
return new UnityResponse<>(code, message, "null");
}
}

@ -0,0 +1,92 @@
package me.lensfrex.vegetables.resopnse;
/**
* 统一的返回数据结构含有字段code, message, data
*
* @param <T> data的类型
*/
public class UnityResponse<T> {
/**
* 返回码其值为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;
}
}

@ -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<String> 集合
* 从文件中读取每行数据
* 为保证性能此处使用LinkedList
* @param path 文件的存储路径
* @return LinkedList<String> 读取到的每行文本
*/
public static List<String> getListFromFile(String path){
List<String> list = new ArrayList<>();
public static LinkedList<String> getListFromFile(String path) {
LinkedList<String> list = new LinkedList<>();
try{
//读取文件内容
//创建一个新的 FileReader ,给定要读取的文件的名称。

Loading…
Cancel
Save