用户中心上线(NextJS改造)

用最新的 NextJS 实现

跟着鱼皮哥的课程实现的项目,一边学习项目的规范和实践经验,一边探索用 nextjs 实现相同的功能。

项目已上线,欢迎大家体验!

项目

Github 仓库:用户中心项目 - 鱼皮

上线地址:鱼皮用户中心项目改造 - NextJs 版

开发记录:开发记录.md

主要功能

  • 用户注册、登录、注销
  • 用户表格查看

待完善部分

  • 统一后端返回
  • 定义统一错误码
  • docker
  • nginx

技术栈

总体来说,使用 T3 Stack 启动了 NextJS 的项目,前后端同构,前端是 React 后端是 Nodejs。T3 stack 集成了生产级的配置,配好了 prettier 和 eslint,以及全栈需要各项开源项目。

前端:

  • NextJS 15 + Tailwindcss 4 + React 19,跟进最新技术框架
  • Shadcn UI 定制化组件开发,学习其设计方法和理念,组件属性解构、cn 和 cva 模式
  • Tankstack Query 异步数据状态管理,高效实现 React 组件数据获取、缓存和更新
  • Tankstack Table 强大的 Headless UI 表格状态管理和数据操作

后端:

  • 项目分层 api、services、repositories
  • JSDoc 风格代码注释
  • Drizzle ORM 数据库访问
  • 阿里云 RDS 的 Serverless MySql 数据库
  • JWT session 和 cookie 管理

其他

  • 测试 Vitest (AI 写的),Rest Client 测试 api 端点
  • Cloufalre 域名托管
  • Vercel 项目部署上线
  • Github 数据托管,commit 命名遵循 Angular Commit Message Guidelines

项目结构

可以直接在 Github 仓库 中查看

tmp51B.png

后端

app/api/v1/user controler 的接口,前端直接访问,如 example.com/api/v1/user/current 。 get 方法 和 post 方法

server/db/ 数据库相关 Drizzle ORM server/db/index.ts 创建数据库连接 server/db/schema.ts 数据库表设计 server/db/types.ts 根据 schema 自动定义类型

server/repositories/user.ts 用户数据访问层 server/services/user.ts 服务层

server/utils/error-handling.ts 用 TRPCError 包装 NextResponse server/utils/hash.ts 用 bcryptjs 密码加密函数 server/utils/session.ts 根据 NextJS 文档建议,JWT session 创建

前端

app/ 页面

app/(auth)/ 用户相关页面 app/(auth)/login 登录表单,useEffect + React Form Hook + Zod + axios app/(auth)/register 注册表单,Tankstack Query(useMutation) + React Form Hook + Zod + axios app/(auth)/logout 登出页面,清除 session

app/(dashboard)/layout.ts 侧边栏设计 app/(dashboard)/welcome/ 用户主页 app/(dashbaord)/user-manage 用户数据库表格,Tankstack Table

components/ 组件整理 components/ui/ 导入进来的 shadcn ui 组件,可定制 components/aceternity/ 从组件库 aceternity ui 复制来的组件代码 compoents/fallback/ 用于 suspense 的骨架组件 components/user-manage tankstack table 表格的构建,columns 定义 compoents/ ** .tsx 自建的各种 React 组件

其他

src/env.js 复用 t3 实现环境变量配置 src/middleware.ts 中间件,鉴权,路由保护和跳转 (ps. 之前出了挺火的漏洞233,所以必须在别处二次鉴权)

test/ 测试代码 test/rest-client 后端端点连接和测试

eslint.config.js 静态检查 prettier.config.js 代码格式化

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
SawanaHSN
作者分享
AI 超级智能体笔记和作业 - AI 应用部分
7
AI 超级智能体 Day 2 复习了 AI 超级智能体项目,同步构建 NextJS 的复刻项目。研究了阿里云百炼接口文档,以及 “NextJS 的 spring ai”,vercel 的 ai sdk 库。实现了基本的 ai 调用和生成文字 completion 功能。 1. [Github仓库](https://github.com/waitlistSawana/ai-super-agent-yupi-nextjs) 和 [上线地址](https://ai-super-agent-yupi-nextjs.hsawana9.com/)。 2. 基于阿里云百炼的 openai 兼容接口,参考 ai sdk provider 封装模型调用方法。 3. 集成 Shadcn UI 的 Registry,如果是集成了 shadcn ui 的项目,可以通过两行命令,轻松集成代码。 收获: 1. 学习封装 ai sdk 的 ai provider 2. 学习和实现 Shadcn UI 的 Registry 欢迎大家使用我的 Registry,推荐用集成了 ShadcnUI 的 NextJS 或者其他 React 框架: ``` # Init Shadcn UI # 初始化 Shadcn UI pnpm dlx shadcn@latest init # Add dashscope provider with vercel ai sdk # 增加阿里云百炼 ai 调用函数,通过 vercel ai sdk # create file - ./lib/ai/providers/dashscop.ts pnpm dlx shadcn@latest add https://ai-super-agent-yupi-nextjs.hsawana9.com/r/dashscrop-ai-provider.json # Add api route and component for generate text # 增加 api 后端端点和组件,使用阿里云百炼 # create files - ./components/generate-text.tsx - ./app/api/v1/generate-text/route.ts pnpm dlx shadcn@latest add https://ai-super-agent-yupi-nextjs.hsawana9.com/r/nextjs-generate-text-api-and-component-for-dashscrop-ai-provider.json ```
6
AI 超级智能体项目 day 1 第一次启动了 java 项目,在 vscode / trae,直接克隆 spring ai alibaba 的仓库 1. 克隆 2. 获取 api key 3. 命令启动 收获: - pom.xml == package.josn:之前是 js 全栈,迁移理解,都是包管理器,只是用到 xml 语法 - java 主程序:@SpringBootApplication - java controller / api 端点:@RestController @RequestMapping("/helloworld") (我勒个注解驱动的框架(误)) 常用命令: ```bash # 1. 首次运行:安装依赖并构建项目 mvn clean install # 2. 启动项目 mvn spring-boot:run # 其他常用命令 # 清理项目 mvn clean # 编译项目 mvn compile # 打包项目 mvn package # 安装到本地仓库 mvn install ```
6
力扣:手搓二分查找 取中间值,代入判断,更新待选结果,更新上下界 --- 排序 取上下界限定待选值范围 while 下界 <= 上界: (# 仍有待选值) 中间值 = (下界 + 上界)// 2 if 中间值满足约束: 存为待选结果 更新上界为 中间值 - 1 (# 排除中间值和更偏离的值) else: 更新下界为 中间值 + 1 (# 排除中间值和更偏离值) return 待选结果
3
力扣 - k个有序链表重排序: 思路是 while 循环中比较每一个子链表的头选出最小的那个。 重点在于熟悉链表的概念以及创建和更新 - 理解链表和列表区别和操作: - 列表是选中了存储中的一团数据(连续的区域),一次性拿到所有值,创建和更新都是整团整团地更新,可以通过索引随机地访问里面的值,或者批量处理。 - 链表是选中了一枚数据,只有那一个节点的值+指向下一个节点的指针,所以没办法一次性知道链表的所有值,需要 list node.next.next...value 往下访问(递归?)。这也导致头尾的增删很快(只访问一枚数据),而且在存储中是游离分布的。 - 新建虚拟头部 dummy,返回时返回 dummy.next(),就把头部去掉了。 - current = dummy 后,这两个都指向同一个“实际”节点(dummy),current.next 会让 dummy.next 同步变化。 - current 的更新,使其始终代表最末端节点,current = current.next。
4
下载 APP