Built Portfolio Page -3 (Projects Component)

Steps:

  1. Add project component

Add projects component

add src/components/Projects.tsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import React from 'react'
import SectionHeading from './Section-heading'
import { projectsData } from '@/libs/data'
import Image from 'next/image';

export default function Projects() {
return (
<section>
<SectionHeading>
My Projects
</SectionHeading>
<div>
{projectsData.map((project, index)=>(
<React.Fragment key={index}>
<Project {...project} />
</React.Fragment>
))}
</div>
</section>
)
}

type ProjectProps = (typeof projectsData)[number];

function Project({title,description,tags,imageUrl } :
ProjectProps) {
return(
<section className="group bg-gray-100 max-w-[42rem] border border-black/5
overflow-hidden sm:pr-8 relative sm:h-[20rem] mb-3 sm:mb-8 last:mb-0 even:pl-8
hover:bg-gray-200 transition">
<div className='py-4 pb-7 px-5 sm:pl-10 sm:pr-2 sm:pt-10 sm:max-w-[50%]
flex flex-col h-full group-even:ml-[18rem]'>
<h3 className='text-2xl font-semibold'>{title}</h3>
<p className='mt-2 leading-relaxed text-gray-700'>{description}</p>
<ul className='flex flex-wrap mt-4 gap-2 sm:mt-auto'>
{tags.map((tag,index) => (
<li className='bg-black/[0.7] px-3 py-1 text-[0.7rem] upppercase
tracking-wider text-white rounded-full'
key={index}
>
{tag}
</li>
))}
</ul>
</div>
<Image
src={imageUrl} alt="Project I worked on" quality={95}
className='absolute top-8 -right-40 w-[28.25rem] rounded-t-lg shadow-2xl
transition
group-hover:scale-[1.05]
group-hover:-translate-x-3
group-hover:translate-y-3
group-hover:-rotate-2

group-even:group-hover:translate-x-3
group-even:group-hover:-translate-y-3
group-even:group-hover:rotate-2
group-even:right-[inital] group-even:-left-40'
/>
</section>
)
}

More...

Mysql Windows Docker Setup

背景

我发现在window上直接装mysql ,比在虚拟机上要方便。

步骤

首先先下载docker for windows:在官网 下载即可。安装完毕后,打开命令行,执行以下语句。

Pull Image

1
docker pull mysql:8.0.34

这里8.0.34为mysql的版本,你可以选择你喜欢的版本,不建议直接用最新版

Create Volume

1
docker volume create --driver local --opt device=C:\10.VM\data\mysql01 --opt type=none --opt o=bind mysql01 

Start Container

1
docker run --restart=always -p 3501:3306 --name mysql01 -v mysql01:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxxxxx -d mysql:8.0.34

Docker 设置代理

背景

使用 proxychains 企图让 docker pull使用代理来拉取镜像,实际上没有走代理,依然很慢

对于镜像, 可以使用国内的加速镜像, 也可以用自己的代理服务器访问 dockerhub

国内镜像加速
对于国内加速镜像,直接设置镜像地址就好了:
编辑/etc/docker/daemon.json添加

1
2
3
{
"registry-mirrors": ["[https://docker.mirrors.ustc.edu.cn](https://docker.mirrors.ustc.edu.cn/)"]
}

也可以用其它镜像比如阿里云 或者 daocloud 等等。

设置代理的方法

More...

自定义Next auth的登陆字段

背景

用next auth可以方便的编写用户登陆逻辑,但如果我们不想用email作为登陆主字段,就要做一些定制化开发。
使用 CredentialsProvider 时,你可以完全自定义认证逻辑,包括不使用 email。你可以设置一个只使用用户名和密码的认证系统,而不需要 email。以下是如何实现这一点的步骤:

1. 配置 CredentialsProvider:

在你的 NextAuth.js 配置文件中(通常是 pages/api/auth/[...nextauth].jsapp/api/auth/[...nextauth]/route.js),你可以这样设置 CredentialsProvider:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials"

export default NextAuth({
providers: [
CredentialsProvider({
name: 'Credentials',
credentials: {
username: { label: "Username", type: "text", placeholder: "jsmith" },
password: { label: "Password", type: "password" }
},
async authorize(credentials, req) {
// 这里添加你的认证逻辑
const user = await authenticateUser(credentials.username, credentials.password)

if (user) {
// 返回的对象将被保存在 JWT 的 user 属性中
return {
id: user.id,
username: user.username,
// 不包含 email 字段
}
} else {
return null
}
}
})
],
callbacks: {
async jwt({ token, user }) {
if (user) {
token.id = user.id
token.username = user.username
}
return token
},
async session({ session, token }) {
session.user = {
id: token.id,
username: token.username,
}
return session
}
},
// 其他配置...
})

2. 修改类型定义:

如果你使用 TypeScript,你可能需要修改类型定义以反映这种变化。创建或编辑 types/next-auth.d.ts 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import "next-auth"

declare module "next-auth" {
interface User {
id: string
username: string
}

interface Session {
user: User
}
}

declare module "next-auth/jwt" {
interface JWT {
id: string
username: string
}
}

3. 实现认证逻辑:

你需要实现 authenticateUser 函数来验证用户名和密码。这可能涉及检查数据库或其他认证服务。

如何使用 Jest 和 React-Testing-Library 对 Next.js 13+ App Router API 路由进行单元测试

简介

本文中使用的所有示例都在此存储库中。

将介绍以下内容:

  • 单元测试 Next.js API GET 路由
  • 单元测试 Next.js API POST/PUT/DELETE 路由

单元测试 Next.js GET 路由

📁app/api/items/route.ts:

1
2
3
4
5
6
7
8
9
import { NextResponse } from 'next/server';

export async function GET() {
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
];
return NextResponse.json(items, { status: 200 });
}

这是一个简单的 GET 端点,它将返回一些项目的 json 对象。在您的情况下,这可能会从数据库或其他一些 API 调用获取数据,然后将其返回给客户端。本文的最后一个示例将介绍这一点。也就是说,让我们看看这个测试会是什么样子:

More...

使用 Next.js 设置 Jest 完成单元测试

背景

Jest 和 React 测试库经常一起用于单元测试和快照测试。本指南将向您展示如何使用 Next.js 设置 Jest 并编写您的第一个测试。

快速开始

您可以将 create-next-app 与 Next.js with-jest 示例结合使用来快速入门:

1
npx create-next-app@latest --example with-jest with-jest-app

手动设置

要设置 Jest,请安装 jest 和以下软件包作为开发依赖项:

1
npm install -D jest jest-environment-jsdom @testing-library/react @testing-library/jest-dom

通过运行以下命令生成基本的 Jest 配置文件:

1
npm init jest@latest
More...

学习总结 Build and Deploy TWITTER clone Application

背景

最近看到一个很棒的视频教程,从0开的搭建一个类似Twitter的应用,用到了 React, Tailwind, Next, Prisma, Mongo, NextAuth & Vercel 等技术,都是最近比较流行的技术
视频地址

学习过程

一开始学习时遇到不少困难,比如Next的版本和视频不一样,MongoDB不好用,非Get的环境拿不到Session等,最后都被我克服了,换用了mysql和一些方法,实现了类似效果。
后来我又根据最新的NextJS版本,重新自己写了一个,放到了Github上,并部署到了Vercel。果然很简单。

GitHub地址

最新可以运行的程序源码: link

CSS布局教程

推荐一下 Josh Comeau 的经典三篇教程,我有搞不懂的属性经常拿出来看看,常看常新,我认为是最好的交互式教程,比MDN等都要好,可以按顺序阅读:

  • Flexbox 交互式指南:link
  • CSS Grid 交互式指南:link
  • CSS 居中终极指南:link

看了这三篇对于现代 CSS 最关键的知识点之一:布局就几乎搞定了。

请我喝杯咖啡吧~

支付宝
微信