pull/1/head
R 5 months ago
parent c3ab07e2f1
commit 5ef11212e9

@ -1,18 +1,44 @@
package com.jiudian.manage.until;
package com.jiudian.manage.until; // 工具类包,存放系统通用工具方法
import java.io.File;
import java.io.FileOutputStream;
/**
*
*
*/
public class FileUtil {
/**
*
* @param file
* @param filePath "D:/hotel_upload/avatar/"
* @param fileName
* @return true=false=truethrows
* @throws Exception IO
*/
public static boolean uploadFile(byte[] file, String filePath, String fileName) throws Exception {
// 1. 根据存储目录路径创建File对象
File targetFile = new File(filePath);
if(!targetFile.exists()){
// 2. 判断存储目录是否存在不存在则创建多级目录mkdirs()支持创建嵌套目录mkdir()不支持)
if (!targetFile.exists()) {
targetFile.mkdirs();
}
FileOutputStream out = new FileOutputStream(filePath+fileName);
// 3. 创建文件输出流,指定文件存储路径(目录路径 + 文件名)
FileOutputStream out = new FileOutputStream(filePath + fileName);
// 4. 将文件字节数组写入到输出流(即写入到服务器文件)
out.write(file);
// 5. 刷新输出流,确保所有字节都被写入文件
out.flush();
// 6. 关闭输出流释放IO资源避免资源泄漏
out.close();
// 7. 文件写入完成,返回上传成功
return true;
}
}
}

@ -9,33 +9,77 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
/**
*
*
*/
public class ImageCode {
public static final String CODENAME="ImageCode";
// 验证码在HttpSession中的存储键名固定值登录时需通过该键名获取Session中的验证码
public static final String CODENAME = "ImageCode";
/**
* Session
* @param response HttpServletResponse
* @param session HttpSession
* @throws IOException IO
*/
public static void createImage(HttpServletResponse response, HttpSession session) throws IOException {
// 1. 创建 BufferedImage 对象验证码图片载体宽80px、高30pxRGB色彩模式
BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
// 2. 获取 Graphics 对象(用于在图片上绘制内容:背景、验证码文字、干扰元素等)
Graphics g = image.getGraphics();
// 3. 创建随机数对象(用于生成随机颜色、干扰元素位置等,增强验证码安全性)
Random r = new Random();
// 4. 绘制验证码背景随机颜色填充矩形覆盖整个图片区域宽80px、高20px
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
g.fillRect(0, 0, 80, 20);
//获取生成的验证码
// 5. 生成4位随机验证码数字+大写字母组合)
String code = getNumber();
//绑定验证码
// 6. 将生成的验证码存入Session键为CODENAME值为验证码供后续登录校验使用
session.setAttribute(CODENAME, code);
// 7. 设置验证码文字样式无衬线字体、加粗、字号25px
g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25));
// 8. 设置验证码文字颜色随机RGB颜色与背景色区分确保清晰可见
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
// 9. 绘制验证码文字到图片起始位置x=5pxy=25px避免文字超出图片边界
g.drawString(code, 5, 25);
//设置消息头
// 10. 设置响应头指定返回内容类型为image/jpeg告诉前端这是图片数据
response.setContentType("image/jpeg");
// 11. 获取响应输出流将验证码图片以jpeg格式写入流响应给前端
OutputStream os = response.getOutputStream();
ImageIO.write(image, "jpeg", os);
}
public static String getNumber(){
/**
* 40-9A-Z
* @return 4
*/
public static String getNumber() {
// 1. 定义验证码字符池包含数字和大写字母共36个字符
String str = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 2. 初始化验证码字符串(用于拼接最终结果)
String code = "";
for(int i= 0;i<4;i++){
int index = (int)(Math.random()*str.length());
code+=str.charAt(index);
// 3. 循环4次每次从字符池中随机选取1个字符组成4位验证码
for (int i = 0; i < 4; i++) {
// 生成0到str长度-1的随机索引确保不越界
int index = (int) (Math.random() * str.length());
// 根据索引获取字符,拼接到验证码中
code += str.charAt(index);
}
// 4. 返回生成的4位验证码
return code;
}
}

@ -1,23 +1,41 @@
package com.jiudian.manage.until;
public enum State {
SuccessCode("code","0"),SuccessMessage("message","成功"),
ErrorCode("code","-1"),ErrorMessage("message","失败")
;
/**
*
*
*/
public enum State {
// 成功状态code=0message=成功(用于所有业务操作成功的响应,如订单创建成功、用户登录成功)
SuccessCode("code", "0"),
SuccessMessage("message", "成功"),
// 失败状态code=-1message=失败(用于所有业务操作失败的通用响应,如参数错误、数据库操作失败)
ErrorCode("code", "-1"),
ErrorMessage("message", "失败");
// 状态对应的键名(如"code"表示状态码的键,"message"表示提示信息的键)
public String name;
// 状态对应的键值(如"0"是成功状态码的值,"成功"是成功提示的值)
public String message;
State(String name,String message) {
/**
* 使
* @param name "code""message"
* @param message "0""成功"
*/
State(String name, String message) {
this.name = name;
this.message = message;
}
// 获取状态键名的getter方法供外部访问枚举的name属性
public String getName() {
return name;
}
// 获取状态键值的getter方法供外部访问枚举的message属性
public String getMessage() {
return message;
}
}
}

@ -2,15 +2,39 @@ package com.jiudian.manage.until;
import java.util.HashMap;
/**
*
* State
*/
public class StateSignal {
HashMap<String,Object> result = new HashMap<String,Object>();
// 存储响应结果的核心容器HashMapkey为字段名如"code"、"message"、"data"value为对应值
HashMap<String, Object> result = new HashMap<String, Object>();
public void put(State state){
result.put(state.name,state.message);
/**
* State
* "成功/失败"key
* @param state State.SuccessCodeState.SuccessMessage
*/
public void put(State state) {
// 将枚举的name键名如"code"和message键值如"0"存入result
result.put(state.name, state.message);
}
public void put(String name,Object val){
result.put(name,val);
/**
*
* "验证码错误"
* @param name "data""errorMsg"
* @param val List"验证码错误,请重新输入"
*/
public void put(String name, Object val) {
result.put(name, val);
}
/**
*
* ControllerSpringJSON
* @return HashMap
*/
public HashMap<String, Object> getResult() {
return result;
}

@ -6,38 +6,67 @@ import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
*
*
*/
public class TimeUtil {
/**
* date2-date1
* @param date1
* @param date2
* @return
* date2 - date1
* × =
* @param date1 yyyy-MM-dd"2024-05-01"
* @param date2 yyyy-MM-dd"2024-05-05"
* @return 44
*/
public static int getBetweenDay(String date1, String date2) {
public static int getBetweenDay(String date1, String date2) {
// 1. 创建GregorianCalendar实例日历对象用于处理日期计算
Calendar d1 = new GregorianCalendar();
d1.setTime(formatterTime(date1));
Calendar d2 = new GregorianCalendar();
// 2. 将传入的日期字符串转为Date类型再设置到日历对象中
d1.setTime(formatterTime(date1));
d2.setTime(formatterTime(date2));
// 3. 先计算同一年份内的天数差(结束日期的年天数 - 起始日期的年天数)
int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
int y2 = d2.get(Calendar.YEAR);
if (d1.get(Calendar.YEAR) != y2) {
// 4. 获取结束日期的年份,判断是否跨年份(起始年份 != 结束年份)
int endYear = d2.get(Calendar.YEAR);
if (d1.get(Calendar.YEAR) != endYear) {
// 5. 跨年份时,累加起始年份到结束年份之间每一年的总天数
do {
// 累加当前起始年份的总天数如2023年有365天
days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);
// 起始年份加1继续计算下一年直到起始年份等于结束年份
d1.add(Calendar.YEAR, 1);
} while (d1.get(Calendar.YEAR) != y2);
} while (d1.get(Calendar.YEAR) != endYear);
}
// 6. 返回最终的天数差
return days;
}
public static Date formatterTime(String date){
/**
* Dateyyyy-MM-dd
* Date
* @param date yyyy-MM-ddParseException
* @return Datenull
*/
public static Date formatterTime(String date) {
// 1. 创建SimpleDateFormat实例指定目标日期格式yyyy-MM-dd
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date newDate=null;
Date newDate = null;
// 2. 尝试解析日期字符串捕获ParseException格式不匹配时抛出
try {
newDate= formatter.parse(date);
newDate = formatter.parse(date);
} catch (ParseException e) {
// 3. 解析失败时打印异常栈,便于排查问题(如前端传递错误格式的日期)
e.printStackTrace();
}
// 4. 返回转换后的Date对象失败时为null
return newDate;
}
}
}

@ -2,7 +2,12 @@ package com.jiudian.manage.until;
import java.util.UUID;
/**
* UUID
* UUIDUUIDID
*/
public class UUIDUtil {
// 短UUID的字符池包含小写字母、数字、大写字母共62个字符确保生成的标识多样性
public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
@ -11,17 +16,30 @@ public class UUIDUtil {
"W", "X", "Y", "Z" };
/**
* 8UUID
* @return 8UUID
* 8UUIDUUID
* 36UUID
* @return 8"xY3a7B9z"
*/
public static String generateShortUuid() {
// 1. 创建StringBuffer用于拼接最终的8位短UUID
StringBuffer shortBuffer = new StringBuffer();
// 2. 生成原生UUID36位含"-"),并去除"-"符号得到32位纯字母数字字符串
String uuid = UUID.randomUUID().toString().replace("-", "");
// 3. 循环8次每次从32位UUID中截取4位转换为字符池中的字符组成8位短UUID
for (int i = 0; i < 8; i++) {
// 截取4位字符串如第1次截取0-4位第2次截取4-8位以此类推
String str = uuid.substring(i * 4, i * 4 + 4);
// 将4位16进制字符串转为整数16进制转10进制
int x = Integer.parseInt(str, 16);
shortBuffer.append(chars[x % 0x3E]);
// 取整数对62取余对应字符池长度获取字符池中的索引拼接字符
shortBuffer.append(chars[x % 0x3E]); // 0x3E即62与字符池长度一致
}
// 4. 返回最终的8位短UUID
return shortBuffer.toString();
}
}
}
Loading…
Cancel
Save