바이트의 기술적 측면
16192 단어 tailwindcssreactprogramming
⚠️⚠️ 프로젝트는 더 이상 유지 관리되거나 호스팅되지 않습니다. 코드는 Github에서 사용할 수 있습니다.
If you are unaware of Bytes then check out this blog that I wrote:
Bytes - A Platform to share bite-sized learnings!
이 블로그에서는 Bytes의 데이터베이스 모델링인 기술 스택을 선택하기로 한 결정에 대해 이야기하겠습니다.
목차
Tech Stack
Database Modelling
Schemas
Relationships
기술 스택
NextJS
하퍼DB
TailwindCSS
Firebase(저장 및 인증)
데이터베이스 모델링
스키마
사용자 스키마
export type UserSchema = {
uid: string;
email: string;
name: string;
username: string;
verified: boolean;
__createdtime__?: string;
__updatedtime__?: string;
};
사후 스키마
export type PostSchema = {
pid: string;
images: Array<string>;
slug: string;
title: string;
uid: string;
reactions: number;
__createdtime__?: string;
__updatedtime__?: string;
};
태그 스키마
export type TagType = {
tid: string;
name: string;
color: string;
image?: string;
slug?: string;
__createdtime__?: string;
__updatedtime__?: string;
};
Post_Tag 스키마
export type Post_Tag_Type = {
pid: string;
ptid: string;
tid: string;
__createdtime__?: string;
__updatedtime__?: string;
};
관계
사용자 <-> 게시물
uid
로 갖게 됩니다.uid
에서 사용자와 게시물을 내부 조인하기만 하면 됩니다.-- Gets all the Posts of a User
SELECT p.*,u.name,u.username FROM bytes.post AS p INNER JOIN bytes.user AS u ON u.uid=p.uid WHERE u.username='${username}'
게시 <-> 태그
Post_Tag
라는 별도의 테이블을 만들어게시물 ID를
pid
로, 태그 ID를 tid
로 지정-- Gets all Tags for a Post
SELECT t.* FROM bytes.post_tag AS pt INNER JOIN bytes.tag AS t ON pt.tid=t.tid WHERE pt.pid='${post.pid}'
-- Get all Posts of a Tag
SELECT p.*,u.name,u.username FROM bytes.post_tag AS pt INNER JOIN bytes.post AS p ON pt.pid=p.pid INNER JOIN bytes.user AS u ON p.uid = u.uid WHERE pt.tid='${tag.tid}'
경로 보호
이 경로 중
/upload
경로가 보호되며 사용자가 로그인한 경우에만 액세스할 수 있습니다.// useRequireLogin.tsx
const router = useRouter();
const { user, setUser } = useContext(UserContext);
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true);
firebase.auth().onAuthStateChanged(async (user) => {
if (user) {
const authUser = await getAuthUserFromHarper(user.uid);
setUser({ ...authUser, isLoggedIn: true });
setLoading(false);
router.push(to);
} else {
setUser({});
setLoading(false);
router.push("/login");
}
});
}, []);
return { user, loading };
// ------------------------
// Using in the Upload Page
// /pages/upload.tsx
// ------------------------
const { user, loading } = useRequireLogin({ to: "/upload" });
if (loading || !user.isLoggedIn) return null;
이 블로그가 마음에 들었고 여기에서 무언가를 배웠기를 바랍니다.
아직 Bytes에 추가하고 있는 몇 가지 개선 사항과 기능이 있습니다.
소셜
내 트위터에서 나를 팔로우할 수 있습니다.
Reference
이 문제에 관하여(바이트의 기술적 측면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shubhamverma/technical-aspects-of-bytes-l4b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)