docs(README): 更新前后端部署说明

- 优化数据库配置步骤,增加创建数据库和导入SQL文件的详细说明
- 更新配置文件修改说明,提供更具体的配置示例
- 补充API文档访问说明
- 完善前端部署步骤,包括运行开发服务器和生产构建
- 增加SnowflakeIdUtil和TimeUtil工具类
This commit is contained in:
ikmkj
2025-07-29 23:00:58 +08:00
parent 8dab150332
commit 6ed9f73732
4 changed files with 161 additions and 22 deletions

View File

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

View File

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