diff --git a/.clinerules/TEMPLATE_README.md b/.clinerules/TEMPLATE_README.md index 7f37af1..b3b58e6 100644 --- a/.clinerules/TEMPLATE_README.md +++ b/.clinerules/TEMPLATE_README.md @@ -1,5 +1,5 @@ ## 项目说明 -本项目模板(Hair Keeper v1.0.0)是一个高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑。 +本项目模板(Hair Keeper v1.1.0)是一个高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑。 Hair Keeper是个诙谐有趣的名称,和项目内容毫无关系。 diff --git a/README.md b/README.md index 7f37af1..b3b58e6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ## 项目说明 -本项目模板(Hair Keeper v1.0.0)是一个高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑。 +本项目模板(Hair Keeper v1.1.0)是一个高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑。 Hair Keeper是个诙谐有趣的名称,和项目内容毫无关系。 diff --git a/simple_deploy.sh b/simple_deploy.sh new file mode 100644 index 0000000..ab2ff99 --- /dev/null +++ b/simple_deploy.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 此脚本用来一键部署到生产服务器 +# 需事先配置好ssh免密登录,目标服务器需要安装好node、pnpm和pm2来运行容器 +set -e + +# 配置 +REMOTE_USER="" +REMOTE_HOST="" +REMOTE_PORT="" +PROJECT_NAME="" +REMOTE_DIR="~/$PROJECT_NAME" + +echo "🔨 开始构建项目..." +pnpm run build + +echo "📦 准备部署文件..." +# 创建临时目录 +TEMP_DIR=$(mktemp -d) +trap "rm -rf $TEMP_DIR" EXIT + +# 复制必要文件 +cp -r .next $TEMP_DIR/ +cp -r public $TEMP_DIR/ +cp -r prisma $TEMP_DIR/ +cp package.json $TEMP_DIR/ +cp pnpm-lock.yaml $TEMP_DIR/ +cp next.config.ts $TEMP_DIR/ + +echo "🚀 上传文件到服务器..." +ssh ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_DIR}" +rsync -avz --delete \ + --exclude=node_modules \ + --exclude=.git \ + $TEMP_DIR/ ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/ + +# 上传环境变量文件 +echo "📝 上传环境变量文件..." +[ -f .env ] && scp .env ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/.env +[ -f .env.production ] && scp .env.production ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/.env.production + +echo "⚙️ 在服务器上配置和启动服务..." +ssh ${REMOTE_USER}@${REMOTE_HOST} << ENDSSH +cd ${REMOTE_DIR} + +# 安装生产依赖(包括prisma用于数据库迁移和pm2用于进程管理) +echo "📥 安装依赖..." +pnpm install --prod + +# 等待数据库启动 +echo "⏳ 等待数据库启动..." +sleep 5 + +# 运行数据库迁移 +echo "🗄️ 运行数据库迁移..." +npx prisma migrate deploy +npx prisma generate + +# 使用PM2管理Next.js服务 +echo "🔄 使用PM2重启服务..." +/home/user/.local/share/pnpm/pm2 delete $PROJECT_NAME || true +/home/user/.local/share/pnpm/pm2 start pnpm --name $PROJECT_NAME -- start -p ${REMOTE_PORT} +# 保存当前 PM2 进程列表的快照,使其在系统重启后能自动恢复 +/home/user/.local/share/pnpm/pm2 save + +echo "✅ 部署完成!服务运行在端口 ${REMOTE_PORT}" +echo "📊 查看服务状态: pm2 status" +echo "📝 查看日志: pm2 logs $PROJECT_NAME" +echo "❌ 关闭服务: pm2 delete $PROJECT_NAME" +ENDSSH + +echo "🎉 部署成功!" +echo "访问地址: http://${REMOTE_HOST}:${REMOTE_PORT}" \ No newline at end of file diff --git a/src/components/layout/app-sidebar.tsx b/src/components/layout/app-sidebar.tsx index a341913..9f85c7f 100644 --- a/src/components/layout/app-sidebar.tsx +++ b/src/components/layout/app-sidebar.tsx @@ -45,7 +45,7 @@ export function AppSidebar({ menuItems, ...props }: AppSidebarProps) { // 等待侧边栏关闭动画完成后再导航 setTimeout(() => { router.push(href) - }, 300) + }, 350) } }, [isMobile, setOpenMobile, router]) diff --git a/src/constants/site.ts b/src/constants/site.ts index d673b16..8cd1dee 100644 --- a/src/constants/site.ts +++ b/src/constants/site.ts @@ -3,4 +3,4 @@ */ export const SITE_NAME = 'Hair Keeper' export const SITE_DESCRIPTION = '高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑' -export const SITE_VERSION = 'v1.0.0' \ No newline at end of file +export const SITE_VERSION = 'v1.1.0' \ No newline at end of file diff --git a/instrumentation.ts b/src/instrumentation.ts similarity index 100% rename from instrumentation.ts rename to src/instrumentation.ts