全棧 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL筆記(一)

前言

閱讀本文你需要有

Next.js 基礎
React 基礎
Prisma 基礎
tailwind 基礎
MySql基礎

準備工作

打開網站 https://ui.shadcn.com/docs
這不是一個組件庫。它是可重用組件的集合,您可以將其復制并粘貼到應用中。

打開installation 選擇Next.js 也就是此頁面
請添加圖片描述

項目安裝
npx create-next-app@latest my-app --typescript --tailwind  

請添加圖片描述

出現Success即為成功

npx shadcn-ui@latest init

這下就可以啟動

npm run dev

開始寫代碼

更改下global.css,使文檔的根元素都會占據視口高度的100%。確保網頁在不同設備和屏幕尺寸下都能有一致的布局表現,而不會出現不必要的滾動條。
加入以下代碼

//:root是css的偽類選擇器 確保這些樣式能夠應用到整個頁面中的所有元素。
html,body,:root{height:100%;}

(main)–> (routes) 是一個工作習慣
可以將routes和layout分開
請添加圖片描述

Clerk權限控制

https://clerk.com/ 使用Clerk來進行權限控制
進行注冊 QQ郵箱不能使用 需要使用網易郵箱
請添加圖片描述

根據文檔一步一步來
安裝

npm install @clerk/nextjs

創建環境變量.env文件 在文件中添加內容

NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_d29uZHJvdXMtY29uZG9yLTM0LmNsZXJrLmFjY291bnRzLmRldiQ
CLERK_SECRET_KEY=sk_test_n19eZwEzX9NUaONd3BRMhUWqKeZZn9lHxQDEY3IQ7Q

添加middleware.ts中間件

import { clerkMiddleware } from "@clerk/nextjs/server";export default clerkMiddleware();export const config = {matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"],
};

在全局layout中使用ClerkProvider包裹

return (
<ClerkProvider>
<html lang="en">
<body className={font.className}>{children}</body>
</html>
</ClerkProvider>
);
}

創建目錄結構

創建文件夾(auth),這種被小括號包裹的文件夾,這種命名約定并不會直接影響路由系統,而是用于特定的用途或者命名風格。比如說這里就是用來表示特定的文件 而不影響next路由系統
創建文件夾[[...sign-in]][[...sign-up]]
[[...sign-in]] 是 Next.js 中用于創建動態路由的一種特殊語法。這種語法允許你處理帶有多個參數的動態路由,其中 ... 表示匹配零個或多個路徑段。
最后格式是這樣
請添加圖片描述

并在sign-in中的page.tsx中寫入內容

import { SignUp } from "@clerk/nextjs";
export default function Page() {return <SignUp />;}

在sign-un中的page.tsx中寫入內容

import { SignUp } from "@clerk/nextjs";export default function Page() {return <SignUp />;}

并在.env中加入內容

NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up

讓我們來看看效果 localhost:3000/sign-up
請添加圖片描述

接下來創建主文件夾(main)并在其中page.tsx中創建 <UserButton /> 組件https://clerk.com/docs/components/user/user-button#user-button-component
這個組件支持即時帳戶切換,無需重新加載整個頁面。
😬😬按鈕只會在登陸后顯示

// app/(main)/(routes)/page.tsx
import { UserButton } from "@clerk/nextjs";
export default function Home() {
return (
<div>
<UserButton afterSignOutUrl="/"/>
</div>
);
}

安裝主題
https://ui.shadcn.com/docs/dark
安裝

npm i next-themes

在components文件夾中創建文件夾providers中創建theme-provider.tsx 復制內容

"use client"import * as React from "react"import { ThemeProvider as NextThemesProvider } from "next-themes"import { type ThemeProviderProps } from "next-themes/dist/types"export function ThemeProvider({ children, ...props }: ThemeProviderProps) {return <NextThemesProvider {...props}>{children}</NextThemesProvider>}

進入全局layout文件將body中children文件包裹

import { ThemeProvider } from "@/components/providers/theme-provider";
<html lang="en" suppressHydrationWarning><body className={cn(font.className,"bg-white dark:bg-[#313338]")}><ThemeProviderattribute="class"defaultTheme="light"// forcedTheme="light"enableSystem={false}storageKey="discord-theme">{children}</ThemeProvider></body></html>
);

再搞個切換dark模式與light模式的切換按鈕
在components中創建文件

// components/mode-toggle.tsx
"use client"import * as React from "react"import { Moon, Sun } from "lucide-react"import { useTheme } from "next-themes"import { Button } from "@/components/ui/button"import {DropdownMenu,DropdownMenuContent,DropdownMenuItem,DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function ModeToggle() {const { setTheme } = useTheme()return (<DropdownMenu><DropdownMenuTrigger asChild><Button variant="outline" size="icon"><Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" /><Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" /><span className="sr-only">Toggle theme</span></Button></DropdownMenuTrigger><DropdownMenuContent align="end"><DropdownMenuItem onClick={() => setTheme("light")}>Light</DropdownMenuItem><DropdownMenuItem onClick={() => setTheme("dark")}>Dark</DropdownMenuItem><DropdownMenuItem onClick={() => setTheme("system")}>System</DropdownMenuItem></DropdownMenuContent></DropdownMenu>)}

因為沒有安裝dropdownmenu報錯

npx shadcn-ui@latest add dropdown-menu

拿下
請添加圖片描述

接下來安裝prisma

npm i -D prisma

初始化

npx prisma init

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44955.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44955.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44955.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python3 第十七課 -- 編程第一步

目錄 一. 前言 二. end 關鍵字 一. 前言 在前面的教程中我們已經學習了一些 Python3 的基本語法知識&#xff0c;接下來我們來嘗試一些實例。 打印字符串: print("Hello, world!") 輸出結果為&#xff1a; Hello, world! 輸出變量值&#xff1a; i 256*256…

智慧校園服務監控功能

智慧校園系統中的服務監控功能&#xff0c;扮演著維護整個校園數字化生態系統穩定與高效運作的重要角色。它如同一位全天候的守護者&#xff0c;通過實時跟蹤、分析并響應系統各層面的運行狀況&#xff0c;確保教學、管理等核心業務流程的順暢進行。 服務監控功能覆蓋了智慧校園…

開發個人Ollama-Chat--6 OpenUI

開發個人Ollama-Chat–6 OpenUI Open-webui Open WebUI 是一種可擴展、功能豐富且用戶友好的自托管 WebUI&#xff0c;旨在完全離線運行。它支持各種 LLM 運行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于總所周知的原由&#xff0c;OpenAI 的接口需要密鑰才…

知識圖譜與 LLM:微調與檢索增強生成

Midjourney 的知識圖譜聊天機器人的想法。 大型語言模型 (LLM) 的第一波炒作來自 ChatGPT 和類似的基于網絡的聊天機器人&#xff0c;這些模型在理解和生成文本方面非常出色&#xff0c;這讓人們&#xff08;包括我自己&#xff09;感到震驚。 我們中的許多人登錄并測試了它寫…

微信視頻號的視頻怎么下載到本地?快速教你下載視頻號視頻

天來說說市面上常見的微信視頻號視頻下載工具&#xff0c;教大家快速下載視頻號視頻&#xff01; 方法一&#xff1a;緩存方法 該方法來源早期視頻技術&#xff0c;因早期無法將大量視頻通過網絡存儲&#xff0c;故而會有緩存視頻文件到手機&#xff0c;其目的為了提高用戶體驗…

尚硅谷Vue3入門到實戰,最新版vue3+TypeScript前端開發教程

Vue3 編碼規范 創建vue3工程 基于vite創建 快速上手 | Vue.js (vuejs.org) npm create vuelatest 在nodejs環境下運行進行創建 按提示進行創建 用vscode打開項目 安裝依賴 源文件有src 內有main.ts App.vue 簡單分析 編寫src vue2語法在三中適用 vue2中的date metho…

UnityECS學習中問題及總結entityQuery.ToComponentDataArray和entityQuery.ToEntityArray區別

在Unity的ECS&#xff08;Entity Component System&#xff09;開發中&#xff0c;entityQuery.ToComponentDataArray<T>(Allocator.Temp) 和 entityQuery.ToEntityArray(Allocator.Temp) 是兩種不同的方法&#xff0c;用于從實體查詢中獲取數據。除了泛型參數之外&#…

【深度學習入門篇 ⑤ 】PyTorch網絡模型創建

【&#x1f34a;易編橙&#xff1a;一個幫助編程小伙伴少走彎路的終身成長社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;?o?&#xfe61; ) &#xff01; 易編橙終身成長社群創始團隊嘉賓&#xff0c;橙似錦計劃領銜成員、阿里云專家博主、騰訊云內容共創官…

git、huggingface 學術加速

1、git 有時候服務器不能直接訪問 github&#xff0c;下載代碼會很麻煩&#xff1b;安裝庫的時候&#xff0c;pip xx git 就更難了 比如&#xff0c;這次我需要安裝 unsloth&#xff0c;官方給出的腳本是&#xff1a; pip install “unsloth[cu121-torch220] githttps://git…

【python】函數重構

函數重構 函數重構pycharm函數重構步驟函數重構練習 函數重構 函數重構是指對現有函數進行修改和優化的過程。重構的目的是改善代碼的可讀性、可維護性和靈活性&#xff0c;同時保持其功能不變。函數重構通常包括以下步驟&#xff1a; 理解函數的功能和目的。了解函數的作用和…

OSPF.綜合實驗

1、首先將各個網段基于172.16.0.0 16 進行劃分 1.1、劃分為4個大區域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四個網段 劃分R4 劃分area2 劃分area3 劃分area1 2、進行IP配置 如圖使用配置指令進行配置 ip address x.x.x.x /x 并且將缺省路由…

Sortable.js板塊拖拽示例

圖例 代碼在圖片后面 點贊??關注&#x1f64f;收藏?? 頁面加載后顯示 拖拽效果 源代碼 由于js庫使用外鏈&#xff0c;所以會加載一會兒 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

【Go系列】 Go的錯誤處理

承上啟下 上一篇文章中介紹了struct和interface&#xff0c;在Go語言中&#xff0c;是沒有Class這個概念的&#xff0c;我們可以通過Struct和方法的組合&#xff0c;來實現Class。我們通過Struct嵌套來實現繼承這樣的一種機制&#xff0c;并且不用設置虛函數這樣的特殊說明。同…

如何防止第三方DLL注入自己的進程?

PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY 結構 struct _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY {union {DWORD Flags;struct {DWORD MicrosoftSignedOnly : 1;DWORD StoreSignedOnly : 1;DWORD MitigationOptIn : 1;DWORD AuditMicrosoftSignedOnly : 1;DWORD Audit…

C語言 ——— 實用調試技巧(Visual Studio)

目錄 Debug 和 Release 的區別 F10 --- 逐過程調試 & F11 --- 逐語句調試 F9 --- 新建/切換斷點 & F5 --- 開始調試 shift F5 & ctrl F5 Debug 和 Release 的區別 Debug&#xff1a;通常為調試版本&#xff0c;它包含調試信息&#xff0c;并且不作任何優化…

一 GD32 MCU 開發環境搭建

GD32 系列為通用型 MCU &#xff0c;所以開發環境也可以使用通用型的 IDE &#xff0c;目前使用較多的是 KEIL、 IAR 、 GCC 和 Embedded Builder &#xff0c;客戶可以根據個人喜好來選擇相應的開發環境。 目錄 1、使用 Keil 開發 GD32 目前市面通用的MDK for ARM版本有Kei…

華為OD機試真題2024版-路口最短時間問題

題目描述 假定街道是棋盤型的&#xff0c;每格距離相等&#xff0c;車輛通過每格街道需要時間均為 timePerRoad&#xff1b; 街道的街口&#xff08;交叉點&#xff09;有交通燈&#xff0c;燈的周期 T(lights[row][col]) 各不相同&#xff1b; 車輛可直行、左轉和右轉&…

企業網三層架構

企業網三層架構&#xff1a;是一種層次化模型設計&#xff0c;旨在將復雜的網絡設計分成三個層次&#xff0c;每個層次都著重于某些特定的功能&#xff0c;以提高效率和穩定性。 企業網三層架構層次&#xff1a; 接入層&#xff1a;使終端設備接入到網絡中來&#xff0c;提供…

Python爬蟲教程第二篇:進階技巧與實戰案例

Python爬蟲教程第二篇&#xff1a;進階技巧與實戰案例 在上一篇教程中&#xff0c;我們學習了Python爬蟲的基礎概念、基本流程以及一個簡單的入門實踐案例。本篇教程將帶領大家進一步探索Python爬蟲的進階技巧&#xff0c;并提供一個實戰案例&#xff0c;幫助大家提升爬蟲技能…

Android12 MultiMedia框架之GenericSource extractor

前面兩節學習到了各種Source的創建和extractor service的啟動&#xff0c;本節將以本地播放為例記錄下GenericSource是如何創建一個extractor的。extractor是在PrepareAsync()方法中被創建出來的&#xff0c;為了不過多贅述&#xff0c;我們直接從GenericSource的onPrepareAsyn…