From 6ed9f7373224835185b0833de9aff9ba33b2fe11 Mon Sep 17 00:00:00 2001 From: ikmkj <1@qq,com> Date: Tue, 29 Jul 2025 23:00:58 +0800 Subject: [PATCH] =?UTF-8?q?docs(README):=20=E6=9B=B4=E6=96=B0=E5=89=8D?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E9=83=A8=E7=BD=B2=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化数据库配置步骤,增加创建数据库和导入SQL文件的详细说明 - 更新配置文件修改说明,提供更具体的配置示例 - 补充API文档访问说明 - 完善前端部署步骤,包括运行开发服务器和生产构建 - 增加SnowflakeIdUtil和TimeUtil工具类 --- .clinerules | 6 ++ README.md | 78 +++++++++++++------ .../musichouduan/util/SnowflakeIdUtil.java | 78 +++++++++++++++++++ .../com/test/musichouduan/util/TimeUtil.java | 21 +++++ 4 files changed, 161 insertions(+), 22 deletions(-) create mode 100644 .clinerules create mode 100644 music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java create mode 100644 music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java diff --git a/.clinerules b/.clinerules new file mode 100644 index 0000000..bfee509 --- /dev/null +++ b/.clinerules @@ -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。 \ No newline at end of file diff --git a/README.md b/README.md index 9b497b1..d7a5fd5 100644 --- a/README.md +++ b/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 diff --git a/music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java b/music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java new file mode 100644 index 0000000..f2cb375 --- /dev/null +++ b/music-houduan/src/main/java/com/test/musichouduan/util/SnowflakeIdUtil.java @@ -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(); + } +} diff --git a/music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java b/music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java new file mode 100644 index 0000000..96bdac2 --- /dev/null +++ b/music-houduan/src/main/java/com/test/musichouduan/util/TimeUtil.java @@ -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); + } +}