petsoft

个人笔记, 只记录有意义的地方, 应该没有学习的价值

安装项目

npx create-next-app .

1714119848082.png

带括号不会被计入路由, 如login的路由是http://localhost:3000/login

允许外链

images: {
        remotePatterns: [
            {
                protocol: "https",
                hostname: "bytegrad.com",
            }
        ]
    }

next.config.mjs

看起来不错的UI库

https://ui.shadcn.com/docs

npx shadcn-ui init
<p className="opacity-80">current guests</p>

用于设置元素的不透明度

<div className="grid grid-cols-3 grid-rows-[45px_1fr]"></div>

网格的第一行高度为45px, 第二行将占用除第一行之外的所有可用空间.

<div className="grid grid-rows-[45px_300px_500px] md:grid-cols-3 md:grid-rows-[45px_1fr] gap-4 h-[600px]">
        <div className="md:row-start-1 md:row-span-1 md:col-start-1 md:col-span-1">
          <SearchForm />
        </div>
        <div className="md:row-start-2 md:row-span-full md:col-start-1 md:col-span-1">
          <ContentBlock>
            <PetList />
          </ContentBlock>
        </div>
        <div className="md:row-start-1 md:row-span-full md:col-start-2 md:col-span-full">
          <ContentBlock>
            <PetDetails />
          </ContentBlock>
        </div>
      </div>

grid的示例, 直接看代码

const handleAddPet = (newPet: Omit<Pet, "id">) => {
    setPets((prevPets) => {
      return [
        ...prevPets,
        {
          id: String(Date.now()),
          ...newPet,
        },
      ];
    });
  };

处理id属性

prisma

npm install typescript ts-node @types/node --save-dev
npm install prisma --save-dev
npx prisma init --datasource-provider sqlite
npx prisma db push
Best practice for instantiating Prisma Client with Next.js | Prisma Documentation
Best practice for instantiating Prisma Client with Next.js

添加种子

"prisma": {
    "seed": "ts-node --compiler-options {\"module\":\"commonjs\"} prisma/seed.ts"
  },

package.json中添加

npx prisma db seed
export default function PetFormBtn({ actionType }: petFoemBtnProps) {
  const { pending } = useFormStatus();
  return (
    <Button type="submit" disabled={pending}>
      {actionType === "add" ? "Add a new Pet" : "Edit Pet"}
    </Button>
  );
}

管理按钮的状态

const [isPending, startTransition] = useTransition();
<PetButtons
          buttonType="checkout"
          disabled={isPending}
          onclick={async () => {
            startTransition(() => {
              checkoutPet(selectedPet?.id);
            });
          }}
        />

管理按钮的状态

    <form
      action={async (formData) => {
        if (actionType === "add") {
          // onFormSubmit();
          handleAddPet(formData);
        } else {
          // onFormSubmit();
          handleEditPet(formData);
        }
        setTimeout(onFormSubmit, 0);
      }}
    >

久仰setTimeout(0)大名, 今天终于见识了.gpt的解释如下

1714651055606.png

React Hook Form
Building forms with React Hook Form and Zod.

react-hook-form+zod的用法参考这个文档

cursor yyds

Read more

imaginify

最近体验了flux模型, 看了levelsio的采访, 确实很想做一个ai photo的网站, 挖个坑, 有时间自己搓一个,拿这个项目先练练手, 托管在了vercel, https://ai-photo-nu.vercel.app/ 值得学习 表格设计, 高度复用, UI很简洁 认证一如既往的clerk, 应用了clerk的webhooks特征, 很优秀的解决方案, 自己的orlco论坛可以借鉴 上传视频和ai处理用的cloudinary, 效果并不好, 不如podcast里提到的uploader stuff, 然后自托管ai模型, 这里自托管的高价费用还没有找到合适的解决方案, 先挖个坑 用户-图片-生成图片, 增删改查的实现很简洁, mongodb在这种数据量不大, 无高并发请求的应用中十分方便

By kamado nezuko

pricewise

nextjs项目, 数据库用的mongodb. 快速的浏览了, bright data感觉没必要用, 如果反爬策略非常严格可以考虑, crawlee集成了视频中提到的Cheerio, Playwright, Puppeteer感觉更好 值得学习 美观的网站, 静态资源很重要, 目前还不知道怎么找or设计 jsm的代码总给人一种清高的感觉, 每一部分都很独立 发送邮件用的nodemailer 定时任务设置路由, 用https://cron-job.org/定时请求实现

By kamado nezuko

podcast

前端nextjs后端convex, convex很适合小型项目的快速交付, 认证和clerk集成也很方便 值得学习 ()+layout, 实现代码重用 tailwind.config.ts里写颜色配置, 方便统一颜色 图片处理的很好 loading状态用钩子处理的 组件层次关系处理的很好, 之间几乎无关联 只在必要的时候使用了一个usecontext 实践示例 embla-carousel实现轮播图 处理音频和图片, uploader stuff上传文件 实现了左右侧边栏 openai-api文生图, 文生语音

By kamado nezuko