docs(README): 更新前后端部署说明
- 优化数据库配置步骤,增加创建数据库和导入SQL文件的详细说明 - 更新配置文件修改说明,提供更具体的配置示例 - 补充API文档访问说明 - 完善前端部署步骤,包括运行开发服务器和生产构建 - 增加SnowflakeIdUtil和TimeUtil工具类
This commit is contained in:
6
.clinerules
Normal file
6
.clinerules
Normal file
@@ -0,0 +1,6 @@
|
||||
1、执行任务的时候,首先分析任务,然后将该任务分成多个可执行的小任务,一步一步执行。
|
||||
2、不要启动我项目的服务
|
||||
3、若是新建项目或者开发新的功能,首先使用context7 MCP服务来寻找对应的文档
|
||||
4、若是修改业务逻辑等,就不要使用context7 MCP服务来寻找对应的文档,先查看查看前端该功能对应的后端接口,查看后端接口的逻辑,若是已经实现就返回前端处理逻辑,若是后端还们没有实现,则先处理后端在处理前端。
|
||||
5、使用filesystem MCP服务来对文件进行操作,只能操作修改、更新、创建或者删除,有关到对文件的操作如,修改,更新,创建和删除等,都要使用filesystem MCP服务,只有查看或者读取文件的时候使用apply_diff工具。
|
||||
6、若是规则5对文件操作失败,则使用apply_diff工具,若是apply_diff失败或者文件修改编辑失败,就要先保存该文件然后重新读取在做修改再来apply_diff。
|
||||
78
README.md
78
README.md
@@ -124,46 +124,88 @@
|
||||
|
||||
### 后端部署
|
||||
|
||||
1. 配置数据库
|
||||
1. **配置数据库**
|
||||
在您的MySQL服务器中,创建一个名为 `music_db` 的数据库,并使用 `utf8mb4` 字符集。
|
||||
```sql
|
||||
CREATE DATABASE music_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||||
```
|
||||
然后,将 `sql/music_db.sql` 文件导入到 `music_db` 数据库中,以创建所有必需的表和初始数据。
|
||||
|
||||
2. 修改配置文件
|
||||
- 编辑 `music-houduan/src/main/resources/application.yml`
|
||||
- 配置数据库连接信息
|
||||
- 配置Redis连接信息
|
||||
- 配置文件上传路径
|
||||
2. **修改配置文件**
|
||||
- 打开 `music-houduan/src/main/resources/application.yml` 文件。
|
||||
- **数据库连接**:找到 `spring.datasource` 部分,并更新 `url`、`username` 和 `password` 以匹配您的MySQL配置。
|
||||
```yaml
|
||||
url: jdbc:mysql://localhost:3306/music_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
|
||||
username: your-mysql-username
|
||||
password: your-mysql-password
|
||||
```
|
||||
- **Redis连接**:找到 `spring.redis` 部分,并更新 `host` 和 `port`。
|
||||
```yaml
|
||||
host: localhost
|
||||
port: 6379
|
||||
```
|
||||
- **文件上传路径**:找到 `file.upload` 部分,并配置您希望存储上传文件的路径,或者保留不修改。
|
||||
```yaml
|
||||
path: /path/to/your/upload/folder/
|
||||
```
|
||||
请确保此目录存在并且您的应用程序具有写入权限。
|
||||
|
||||
3. 构建项目
|
||||
3. **构建项目**
|
||||
在 `music-houduan` 目录下,使用Maven构建项目。
|
||||
```bash
|
||||
cd music-houduan
|
||||
mvn clean package -DskipTests
|
||||
```
|
||||
|
||||
4. 运行项目
|
||||
4. **运行项目**
|
||||
构建成功后,运行生成的jar文件。
|
||||
```bash
|
||||
java -jar target/music-houduan-1.0.0.jar
|
||||
```
|
||||
默认情况下,后端服务将在 `http://localhost:8085` 上运行。
|
||||
|
||||
5. **API文档**
|
||||
您可以通过以下URL访问API文档:
|
||||
- **Swagger UI**: [http://localhost:8085/swagger-ui/index.html](http://localhost:8085/swagger-ui/index.html)
|
||||
- **Knife4j**: [http://localhost:8085/doc.html](http://localhost:8085/doc.html)
|
||||
|
||||
### 前端部署
|
||||
|
||||
1. 安装依赖
|
||||
1. **安装依赖**
|
||||
在 `music-qianduan` 目录下,使用npm安装项目依赖项。
|
||||
```bash
|
||||
cd music-qianduan
|
||||
npm install
|
||||
```
|
||||
|
||||
2. 修改配置
|
||||
- 编辑 `.env` 文件,配置API地址
|
||||
2. **修改配置**
|
||||
- 在 `music-qianduan` 根目录中,创建一个名为 `.env.development` 的文件(用于开发环境)或 `.env.production` 的文件(用于生产环境)。
|
||||
- 在此文件中,设置 `VITE_API_URL` 变量以指向您的后端API。
|
||||
```
|
||||
VITE_API_URL=http://localhost:8085
|
||||
```
|
||||
|
||||
3. 构建项目
|
||||
3. **运行开发服务器**
|
||||
对于开发,请使用以下命令启动Vite开发服务器:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
前端应用程序将在 `http://localhost:5173` 上可用。
|
||||
|
||||
4. **构建项目**
|
||||
对于生产,请使用以下命令构建项目:
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
4. 部署静态资源
|
||||
- 将 `dist` 目录下的文件部署到Web服务器
|
||||
5. **部署静态资源**
|
||||
- 构建完成后,将 `music-qianduan/dist` 目录的内容部署到您的Web服务器(例如Nginx、Apache)。
|
||||
- 确保您的Web服务器配置正确,以处理单页应用程序(SPA)的路由。对于Nginx,您可能需要添加如下配置:
|
||||
```nginx
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
```
|
||||
|
||||
## 使用说明
|
||||
|
||||
@@ -209,11 +251,3 @@
|
||||
- 后端开发:XXX
|
||||
- 产品设计:XXX
|
||||
- 测试:XXX
|
||||
|
||||
## 版权声明
|
||||
|
||||
本项目仅用于学习和演示目的,不得用于商业用途。音乐文件版权归原作者所有。
|
||||
|
||||
## 联系方式
|
||||
|
||||
如有问题或建议,请联系:example@example.com
|
||||
|
||||
@@ -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