From 0dbe149de90b3dbf432632f01efcfdcc9e6c8427 Mon Sep 17 00:00:00 2001 From: sunface Date: Wed, 3 Mar 2021 17:41:50 +0800 Subject: [PATCH] update --- layouts/nav/editor-nav.tsx | 65 ++-------- layouts/page-container1.tsx | 2 +- pages/[username]/[post_id].tsx | 25 ++-- pages/[username]/index.tsx | 64 +++++++++- pages/index.tsx | 127 ++++++++++++++++---- pages/settings/profile.tsx | 28 ++++- pages/tags/[name].tsx | 106 +++++++++------- public/not-found.png | Bin 0 -> 28077 bytes public/useful-but-not-use-yet/v0zA0b2ci.png | Bin 0 -> 7385 bytes server/internal/api/story.go | 58 +++++++++ server/internal/server.go | 8 +- server/internal/storage/sql_tables.go | 45 ++++--- server/internal/story/comment.go | 92 +++++++++++++- server/internal/story/post.go | 93 ++++++++++++-- server/internal/user/users.go | 34 ++++++ server/pkg/models/post.go | 1 + server/pkg/models/user.go | 16 +-- src/components/comments/comments.tsx | 2 +- src/components/markdown-editor/render.tsx | 2 +- src/components/posts/post-author.tsx | 17 ++- src/components/posts/post-card.tsx | 56 +++++++++ src/components/posts/posts.tsx | 32 +++++ src/components/posts/simple-post-card.tsx | 49 ++++++++ src/components/svg-button.tsx | 39 ++++++ src/components/{ => tags}/tag-input.tsx | 3 +- src/components/tags/tags.tsx | 74 ++++++++++++ src/types/posts.ts | 10 +- src/types/session.ts | 3 +- theme.ts | 3 +- 29 files changed, 874 insertions(+), 180 deletions(-) create mode 100644 public/not-found.png create mode 100644 public/useful-but-not-use-yet/v0zA0b2ci.png create mode 100644 src/components/posts/post-card.tsx create mode 100644 src/components/posts/posts.tsx create mode 100644 src/components/posts/simple-post-card.tsx create mode 100644 src/components/svg-button.tsx rename src/components/{ => tags}/tag-input.tsx (91%) create mode 100644 src/components/tags/tags.tsx diff --git a/layouts/nav/editor-nav.tsx b/layouts/nav/editor-nav.tsx index d8b81117..922370e7 100644 --- a/layouts/nav/editor-nav.tsx +++ b/layouts/nav/editor-nav.tsx @@ -21,61 +21,30 @@ import { useViewportScroll } from "framer-motion" import NextLink from "next/link" import React, { useEffect, useState } from "react" import Logo, { LogoIcon } from "src/components/logo" -import RadioCard from "components/radio-card" -import { EditMode } from "src/types/editor" import Card from "components/card" -import TagInput from "components/tag-input" -import { Tag } from "src/types/tag" -import { cloneDeep, remove } from "lodash" -import { requestApi } from "utils/axios/request" import DarkMode from "components/dark-mode" import EditModeSelect from "components/edit-mode-select" +import Tags from "components/tags/tags" +import { Post } from "src/types/posts" +interface Props { + ar : Post + changeTitle: any + changeEditMode: any + publish: any + onChange:any +} -function HeaderContent(props: any) { - const [tags,setTags]:[Tag[],any] = useState([]) - const [allTags,setAllTags] = useState([]) - +function HeaderContent(props: Props) { const { isOpen, onOpen, onClose } = useDisclosure() - useEffect(() => { - requestApi.get('/tags').then(res => { - setAllTags(res.data) - const t = [] - props.ar.tags?.forEach(id => { - res.data.forEach(tag => { - if (tag.id === id) { - t.push(tag) - } - }) - }) - - setTags(t) - }) - },[props.ar]) - - - const addTag = t => { - setTags(t) - - const ids = [] - t.forEach(tag => ids.push(tag.id)) + const onTagsChange = ids => { props.ar.tags = ids } - const removeTag = t => { - const newTags = cloneDeep(tags) - remove(newTags, tag => tag.id === t.id) - setTags(newTags) - - const ids = [] - newTags.forEach(tag => ids.push(tag.id)) - props.ar.tags = ids - } - return ( <> @@ -128,17 +97,7 @@ function HeaderContent(props: any) { 设置标签 - - - {tags.length > 0&& - { - tags.map(tag => - - {tag.title} - removeTag(tag)}/> - ) - } - } + diff --git a/layouts/page-container1.tsx b/layouts/page-container1.tsx index 6b7c044e..bb597966 100644 --- a/layouts/page-container1.tsx +++ b/layouts/page-container1.tsx @@ -43,7 +43,7 @@ function PageContainer1(props: PageContainerProps) { /> - + {children} diff --git a/pages/[username]/[post_id].tsx b/pages/[username]/[post_id].tsx index 8fb3d92c..245972da 100644 --- a/pages/[username]/[post_id].tsx +++ b/pages/[username]/[post_id].tsx @@ -22,6 +22,7 @@ import { Post } from "src/types/posts" import { Tag } from "src/types/tag" import { requestApi } from "utils/axios/request" import UnicornLike from "components/posts/unicorn-like" +import SvgButton from "components/svg-button" const PostPage = () => { const router = useRouter() @@ -35,6 +36,15 @@ const PostPage = () => { } }, [id]) + + useEffect(() => { + if (router && router.asPath.indexOf("#comments") > -1) { + setTimeout(() => { + location.href = "#comments" + },100) + } + },[router]) + const getData = async () => { const res = await requestApi.get(`/post/${id}`) setPost(res.data) @@ -58,7 +68,6 @@ const PostPage = () => { const getComments = async (id) => { const res = await requestApi.get(`/story/comments/${id}`) - console.log(res.data) setComments(res.data) } @@ -96,7 +105,7 @@ const PostPage = () => { {/* */} - { _focus={null} fontSize="1.7rem" fontWeight="300" - icon={} + icon="bookmark" + onClick={null} /> - } + icon="share" + onClick={() => location.href="#comments"} /> {post.creatorId === session?.user.id && - router.push(`${ReserveUrls.Editor}/post/${post.id}`)} - icon={} + icon="edit" /> } diff --git a/pages/[username]/index.tsx b/pages/[username]/index.tsx index c03d650c..e734e099 100644 --- a/pages/[username]/index.tsx +++ b/pages/[username]/index.tsx @@ -1,4 +1,4 @@ -import { Box, chakra, Flex, HStack, VStack, Image, Heading, Text, Button, useColorModeValue, Divider } from "@chakra-ui/react" +import { Box, chakra, Flex, HStack, VStack, Image, Heading, Text, Button, useColorModeValue, Divider, Wrap, Avatar, Center } from "@chakra-ui/react" import Card from "components/card" import Container from "components/container" import SEO from "components/seo" @@ -10,23 +10,38 @@ import PageContainer from "layouts/page-container" import PageContainer1 from "layouts/page-container1" import { useRouter } from "next/router" import React, { useEffect, useState } from "react" -import { FaDove, FaEdit, FaFacebook, FaGithub, FaHeart, FaPlus, FaRegStar, FaStackOverflow, FaStar, FaTwitter, FaWeibo, FaZhihu } from "react-icons/fa" +import { FaComment, FaCommentAlt, FaDove, FaEdit, FaFacebook, FaFile, FaGithub, FaHeart, FaPlus, FaRegStar, FaStackOverflow, FaStar, FaTwitter, FaWeibo, FaZhihu } from "react-icons/fa" import { ReserveUrls } from "src/data/reserve-urls" import { User } from "src/types/session" import { requestApi } from "utils/axios/request" import moment from 'moment' +import { Post } from "src/types/posts" +import PostCard from "components/posts/post-card" +import userCustomTheme from "theme/user-custom" +import Posts from "components/posts/posts" +import Link from "next/link" const UserPage = () => { const router = useRouter() const username = router.query.username const session = useSession() const [user, setUser]: [User, any] = useState(null) + const [posts, setPosts]: [Post[], any] = useState([]) const borderColor = useColorModeValue('white', 'transparent') useEffect(() => { if (username) { - requestApi.get(`/user/info/${username}`).then(res => setUser(res.data)) + initData(username) } }, [username]) + const initData = async (username) => { + const res = await requestApi.get(`/user/info/${username}`) + setUser(res.data) + + const res1 = await requestApi.get(`/user/posts/${res.data.id}`) + setPosts(res1.data) + } + + return ( <> { {user.nickname} {user.tagline && {user.tagline}} - + Followers 0 Following 0 - {session?.user.id === user.id ? + {session?.user.id === user.id ? : } - + {user.about} @@ -86,7 +101,44 @@ const UserPage = () => { {user.availFor} } + {user.rawSkills.length > 0 && + My Tech Stack + + { + user.rawSkills.map(skill => + + + + {skill.title} + + ) + } + + } + {/* + + + 2 posts written + 30 comments written + + */} + + + { + posts.length === 0 ? + + + There doesn't seem to be anything here! + + + + : + + + + } + } diff --git a/pages/index.tsx b/pages/index.tsx index 4fe694fd..89283062 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,27 +1,112 @@ -import { chakra } from "@chakra-ui/react" +import { AddIcon } from "@chakra-ui/icons" +import { + Box, Button, chakra, Flex, HStack, VStack, Menu, + MenuButton, + MenuList, + MenuItem, + IconButton, + Heading, + Divider +} from "@chakra-ui/react" import Card from "components/card" +import PostCard from "components/posts/post-card" +import Posts from "components/posts/posts" +import SimplePostCard from "components/posts/simple-post-card" import SEO from "components/seo" import siteConfig from "configs/site-config" -import Nav from "layouts/nav/nav" -import PageContainer from "layouts/page-container" -import React from "react" - -const HomePage = () => ( - <> - - - - NOT FOUND -

You just hit a route that doesn't exist... the sadness.

-
- - -
- -) +import PageContainer1 from "layouts/page-container1" +import React, { useEffect, useState } from "react" +import { PostFilter } from "src/types/posts" +import { requestApi } from "utils/axios/request" +const HomePage = () => { + const [posts,setPosts] = useState([]) + const [filter, setFilter] = useState(PostFilter.Best) + const initData = async () => { + const res = await requestApi.get(`/home/posts/${filter}`) + setPosts(res.data) + } + + useEffect(() => { + initData() + },[filter]) + + return ( + <> + + + + + + + + + + + + + } + size="xs" + variant="ghost" + _focus={null} + /> + + }> + Modern + + }> + Compact + + + + + + + + + + + + + + + ) +} export default HomePage + +export const HomeSidebar = () => { + const [posts,setPosts] = useState([]) + const [filter, setFilter] = useState(PostFilter.Best) + const initData = async () => { + const res = await requestApi.get(`/home/posts/${filter}`) + setPosts(res.data) + } + + useEffect(() => { + initData() + },[filter]) + + return ( + + + + Top ariticles + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/pages/settings/profile.tsx b/pages/settings/profile.tsx index f006238f..20ea49b1 100644 --- a/pages/settings/profile.tsx +++ b/pages/settings/profile.tsx @@ -16,10 +16,12 @@ import { route } from "next/dist/next-server/server/router" import { Field, Form, Formik } from "formik" import useSession from "hooks/use-session" import { config } from "utils/config" +import Tags from "components/tags/tags" var validator = require('validator'); const UserProfilePage = () => { const [user, setUser] = useState(null) + const [skills, setSkills] = useState([]) const [isLargerThan1280] = useMediaQuery("(min-width: 768px)") useEffect(() => { requestApi.get("/user/self").then(res => setUser(res.data)) @@ -28,7 +30,7 @@ const UserProfilePage = () => { const toast = useToast() const submitUser = async (values, _) => { - await requestApi.post(`/user/update`,values) + await requestApi.post(`/user/update`, values) setUser(values) toast({ description: "更新成功", @@ -70,7 +72,7 @@ const UserProfilePage = () => { } - function validateUrl(value, canBeEmpty=true) { + function validateUrl(value, canBeEmpty = true) { let url = value?.trim() let error if (!canBeEmpty) { @@ -115,7 +117,7 @@ const UserProfilePage = () => { - + 基本信息 {({ field, form }) => ( @@ -199,6 +201,26 @@ const UserProfilePage = () => { )} + + {({ field, form }) => ( + + 自我介绍 +