docs(README): 更新前后端部署说明
- 优化数据库配置步骤,增加创建数据库和导入SQL文件的详细说明 - 更新配置文件修改说明,提供更具体的配置示例 - 补充API文档访问说明 - 完善前端部署步骤,包括运行开发服务器和生产构建 - 增加SnowflakeIdUtil和TimeUtil工具类
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
package com.test.musichouduan.util;
|
||||
|
||||
public class SnowflakeIdUtil {
|
||||
|
||||
private static final long START_TIMESTAMP = 1609459200000L; // 2021-01-01 00:00:00
|
||||
|
||||
private static final long SEQUENCE_BIT = 12;
|
||||
private static final long MACHINE_BIT = 5;
|
||||
private static final long DATA_CENTER_BIT = 5;
|
||||
|
||||
private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
|
||||
private static final long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
|
||||
private static final long MAX_DATA_CENTER_NUM = ~(-1L << DATA_CENTER_BIT);
|
||||
|
||||
private static final long MACHINE_LEFT = SEQUENCE_BIT;
|
||||
private static final long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
|
||||
private static final long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;
|
||||
|
||||
private long dataCenterId;
|
||||
private long machineId;
|
||||
private long sequence = 0L;
|
||||
private long lastStamp = -1L;
|
||||
|
||||
private static SnowflakeIdUtil instance;
|
||||
|
||||
public static synchronized SnowflakeIdUtil getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new SnowflakeIdUtil(1, 1);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public SnowflakeIdUtil(long dataCenterId, long machineId) {
|
||||
if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) {
|
||||
throw new IllegalArgumentException("Data center ID can't be greater than " + MAX_DATA_CENTER_NUM + " or less than 0");
|
||||
}
|
||||
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
|
||||
throw new IllegalArgumentException("Machine ID can't be greater than " + MAX_MACHINE_NUM + " or less than 0");
|
||||
}
|
||||
this.dataCenterId = dataCenterId;
|
||||
this.machineId = machineId;
|
||||
}
|
||||
|
||||
public synchronized long nextId() {
|
||||
long currStamp = getNewStamp();
|
||||
if (currStamp < lastStamp) {
|
||||
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
|
||||
}
|
||||
|
||||
if (currStamp == lastStamp) {
|
||||
sequence = (sequence + 1) & MAX_SEQUENCE;
|
||||
if (sequence == 0L) {
|
||||
currStamp = getNextMill();
|
||||
}
|
||||
} else {
|
||||
sequence = 0L;
|
||||
}
|
||||
|
||||
lastStamp = currStamp;
|
||||
|
||||
return (currStamp - START_TIMESTAMP) << TIMESTAMP_LEFT
|
||||
| dataCenterId << DATA_CENTER_LEFT
|
||||
| machineId << MACHINE_LEFT
|
||||
| sequence;
|
||||
}
|
||||
|
||||
private long getNextMill() {
|
||||
long mill = getNewStamp();
|
||||
while (mill <= lastStamp) {
|
||||
mill = getNewStamp();
|
||||
}
|
||||
return mill;
|
||||
}
|
||||
|
||||
private long getNewStamp() {
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.test.musichouduan.util;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class TimeUtil {
|
||||
|
||||
public static String getCurrentTime() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
return sdf.format(new Date());
|
||||
}
|
||||
|
||||
public static long getTimestamp() {
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public static String formatDate(Date date, String format) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(format);
|
||||
return sdf.format(date);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user