diff --git a/.gitignore b/.gitignore index 91acedc1b..edacf6a72 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,8 @@ dist npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-lock.yaml +pnpm-workspace.yaml # env *.env diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c0f446890..42b73c3f5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -70,7 +70,9 @@ SERVER_PORT=8082 #### 配置 IDEA 参数 - 设置 JDK 版本为 java 17 + - 设置 VM Option,最好运行在其他端口,非 `8080`,这里设置 `8081` + 若上面在环境变量中设置了端口,那这里就不需要再额外设置 ```shell -Dserver.port=8081 @@ -101,14 +103,27 @@ SERVER_PORT=8082 ``` 3. 执行 [`db/init/init_script.sql`](backend/src/main/resources/db/init/init_script.sql) 脚本,导入基本的数据 - + 管理员:**admin/123456** + 普通用户1:**user1/123456** + 普通用户2:**user2/123456** + ![初始化脚本](assets/contributing/resources_img.png) -4. 处理完环境问题直接跑起来就能通了 +#### 配置 Redis - ![运行画面](assets/contributing/backend_img_4.png) +填写环境变量 `.env` 中的 Redis 相关配置并启动 Redis + +```ini +REDIS_HOST= +REDIS_PORT= +``` + +处理完环境问题直接跑起来就能通了 + +![运行画面](assets/contributing/backend_img_4.png) ### Docker 环境 + #### 配置环境变量 ```shell @@ -177,6 +192,8 @@ cd frontend_nuxt/ cp .env.dev.example .env ``` +若依赖本机部署的后端,需要修改 `.env` 中的 `NUXT_PUBLIC_API_BASE_URL` 值与后端服务端口一致 + ### 安装依赖和运行 前端安装依赖并启动服务。 @@ -193,7 +210,7 @@ npm run dev ## 其他配置 -配置第三方登录,这里以 GitHub 为例: +### 配置第三方登录,这里以 GitHub 为例: - 修改 `application.properties` 配置 @@ -208,3 +225,24 @@ npm run dev ![github配置](assets/contributing/github_img.png) ![github配置2](assets/contributing/github_img_2.png) + +### 配置 Resend 邮箱服务 + +https://resend.com/emails 创建账号并登录 + +- `Domains` -> `Add Domain` + ![image-20250906150459400](assets/contributing/image-20250906150459400.png) + +- 填写域名 + ![image-20250906150541817](assets/contributing/image-20250906150541817.png) + +- 等待一段时间后解析成功,创建 key + `API Keys` -> `Create API Key`,输入名称,设置 `Permission` 为 `Sending access` + **Key 只能查看一次,务必保存下来** + ![image-20250906150811572](assets/contributing/image-20250906150811572.png) + ![image-20250906150924975](assets/contributing/image-20250906150924975.png) + ![image-20250906150944130](assets/contributing/image-20250906150944130.png) +- 修改 `.env` 配置中的 `RESEND_API_KEY` 和 `RESEND_FROM_EMAIL` + `RESEND_FROM_EMAIL`: **noreply@域名** + `RESEND_API_KEY`:**刚刚复制的 Key** + ![image-20250906151218330](assets/contributing/image-20250906151218330.png) diff --git a/assets/contributing/image-20250906150459400.png b/assets/contributing/image-20250906150459400.png new file mode 100644 index 000000000..eb029da6f Binary files /dev/null and b/assets/contributing/image-20250906150459400.png differ diff --git a/assets/contributing/image-20250906150541817.png b/assets/contributing/image-20250906150541817.png new file mode 100644 index 000000000..060428753 Binary files /dev/null and b/assets/contributing/image-20250906150541817.png differ diff --git a/assets/contributing/image-20250906150811572.png b/assets/contributing/image-20250906150811572.png new file mode 100644 index 000000000..87a92365d Binary files /dev/null and b/assets/contributing/image-20250906150811572.png differ diff --git a/assets/contributing/image-20250906150924975.png b/assets/contributing/image-20250906150924975.png new file mode 100644 index 000000000..46919c0ec Binary files /dev/null and b/assets/contributing/image-20250906150924975.png differ diff --git a/assets/contributing/image-20250906150944130.png b/assets/contributing/image-20250906150944130.png new file mode 100644 index 000000000..9bc7ebc70 Binary files /dev/null and b/assets/contributing/image-20250906150944130.png differ diff --git a/assets/contributing/image-20250906151218330.png b/assets/contributing/image-20250906151218330.png new file mode 100644 index 000000000..38b54c627 Binary files /dev/null and b/assets/contributing/image-20250906151218330.png differ diff --git a/backend/open-isle.env.example b/backend/open-isle.env.example index ab495f8e4..a62ac877f 100644 --- a/backend/open-isle.env.example +++ b/backend/open-isle.env.example @@ -13,8 +13,13 @@ JWT_RESET_SECRET= JWT_INVITE_SECRET= JWT_EXPIRATION=2592000000 +# === Redis === +REDIS_HOST= +REDIS_PORT= + # === Resend === RESEND_API_KEY=<你的resend-api-key> +RESEND_FROM_EMAIL=<你的 resend 发送邮箱> # === COS === # COS_BASE_URL=https://<你的cos>.cos.ap-guangzhou.myqcloud.com diff --git a/backend/src/main/java/com/openisle/service/ResendEmailSender.java b/backend/src/main/java/com/openisle/service/ResendEmailSender.java index fbc4663c5..ec774981d 100644 --- a/backend/src/main/java/com/openisle/service/ResendEmailSender.java +++ b/backend/src/main/java/com/openisle/service/ResendEmailSender.java @@ -18,6 +18,9 @@ public class ResendEmailSender extends EmailSender { @Value("${resend.api.key}") private String apiKey; + @Value("${resend.from.email}") + private String fromEmail; + private final RestTemplate restTemplate = new RestTemplate(); @Override @@ -33,7 +36,7 @@ public class ResendEmailSender extends EmailSender { body.put("to", to); body.put("subject", subject); body.put("text", text); - body.put("from", "openisle "); // todo(tim): use config + body.put("from", "openisle <" + fromEmail + ">"); HttpEntity> entity = new HttpEntity<>(body, headers); restTemplate.exchange(url, HttpMethod.POST, entity, String.class); diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 9f3d03125..3fed4b3c7 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -56,6 +56,7 @@ app.captcha.comment-enabled=${CAPTCHA_COMMENT_ENABLED:false} # ========= Optional ========= # for resend email send service, you can improve your service by yourself resend.api.key=${RESEND_API_KEY:} +resend.from.email=${RESEND.FROM.EMAIL} # your email services: ... # for tencent cloud image upload service, you can improve your service by yourself diff --git a/backend/src/main/resources/db/init/init_script.sql b/backend/src/main/resources/db/init/init_script.sql index 6f87a3e63..3ea4bd2c1 100644 --- a/backend/src/main/resources/db/init/init_script.sql +++ b/backend/src/main/resources/db/init/init_script.sql @@ -35,9 +35,9 @@ DELETE FROM `users`; -- 插入用户,两个普通用户,一个管理员 -- username:admin/user1/user2 password:123321 INSERT INTO `users` (`id`, `approved`, `avatar`, `created_at`, `display_medal`, `email`, `experience`, `introduction`, `password`, `password_reset_code`, `point`, `register_reason`, `role`, `username`, `verification_code`, `verified`) VALUES - (1, b'1', '', '2025-09-01 16:08:17.426430', 'PIONEER', 'adminmail@openisle.com', 70, NULL, '$2a$10$m.lLbT3wFtnzFMi7JqN17ecv/dzH704WzU1f/xvQ0nVz4XxTXPT0K', NULL, 110, '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试', 'ADMIN', 'admin', NULL, b'1'), - (2, b'1', '', '2025-09-03 16:08:17.426430', 'PIONEER', 'usermail2@openisle.com', 70, NULL, '$2a$10$m.lLbT3wFtnzFMi7JqN17ecv/dzH704WzU1f/xvQ0nVz4XxTXPT0K', NULL, 110, '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试', 'USER', 'user1', NULL, b'1'), - (3, b'1', '', '2025-09-02 17:21:21.617666', 'PIONEER', 'usermail1@openisle.com', 40, NULL, '$2a$10$m.lLbT3wFtnzFMi7JqN17ecv/dzH704WzU1f/xvQ0nVz4XxTXPT0K', NULL, 40, '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试', 'USER', 'user2', NULL, b'1'); + (1, b'1', '', '2025-09-01 16:08:17.426430', 'PIONEER', 'adminmail@openisle.com', 70, NULL, '$2a$10$dux.NXwW09cCsdZ05BgcnOtxVqqjcmnbj3.8xcxGl/iiIlv06y7Oe', NULL, 110, '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试', 'ADMIN', 'admin', NULL, b'1'), + (2, b'1', '', '2025-09-03 16:08:17.426430', 'PIONEER', 'usermail2@openisle.com', 70, NULL, '$2a$10$dux.NXwW09cCsdZ05BgcnOtxVqqjcmnbj3.8xcxGl/iiIlv06y7Oe', NULL, 110, '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试', 'USER', 'user1', NULL, b'1'), + (3, b'1', '', '2025-09-02 17:21:21.617666', 'PIONEER', 'usermail1@openisle.com', 40, NULL, '$2a$10$dux.NXwW09cCsdZ05BgcnOtxVqqjcmnbj3.8xcxGl/iiIlv06y7Oe', NULL, 40, '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试', 'USER', 'user2', NULL, b'1'); -- 创建 tags 表(如果不存在) CREATE TABLE IF NOT EXISTS `tags` ( diff --git a/frontend_nuxt/.env.dev.example b/frontend_nuxt/.env.dev.example index 4f6562719..a7ca3ee34 100644 --- a/frontend_nuxt/.env.dev.example +++ b/frontend_nuxt/.env.dev.example @@ -1,5 +1,5 @@ ; 本地部署后端 -NUXT_PUBLIC_API_BASE_URL=https://127.0.0.1:8081 +NUXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8080 NUXT_PUBLIC_WEBSOCKET_URL=https://127.0.0.1:8082 NUXT_PUBLIC_WEBSITE_BASE_URL=http://localhost:3000 diff --git a/frontend_nuxt/.env.staging.example b/frontend_nuxt/.env.staging.example index b020df6fb..0cc8ef140 100644 --- a/frontend_nuxt/.env.staging.example +++ b/frontend_nuxt/.env.staging.example @@ -1,5 +1,5 @@ ; 本地部署后端 -; NUXT_PUBLIC_API_BASE_URL=https://127.0.0.1:8081 +; NUXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8080 ; 预发环境后端 NUXT_PUBLIC_API_BASE_URL=https://staging.open-isle.com diff --git a/frontend_nuxt/nuxt.config.ts b/frontend_nuxt/nuxt.config.ts index ec01e7cb4..383014822 100644 --- a/frontend_nuxt/nuxt.config.ts +++ b/frontend_nuxt/nuxt.config.ts @@ -1,6 +1,10 @@ import { defineNuxtConfig } from 'nuxt/config' export default defineNuxtConfig({ + devServer: { + host: '0.0.0.0', + port: 3000 + }, ssr: true, modules: ['@nuxt/image'], runtimeConfig: {