From 4392b8dfbcb8de87466fd22e1a5b6d58bbc2bddb Mon Sep 17 00:00:00 2001 From: sunface Date: Wed, 21 Jul 2021 10:50:20 +0800 Subject: [PATCH] update #56, show user tags as moderator role --- pages/dashboard/tag-moderator.tsx | 64 +++++++++++++++++++++++++ pages/index.tsx | 2 - pages/tags/[name].tsx | 5 +- server/internal/api/tag.go | 12 +++++ server/internal/api/user.go | 4 ++ server/internal/server.go | 3 +- server/internal/tags/tags.go | 23 +++++++++ src/components/tags/simple-tag-card.tsx | 29 +++++++++++ src/data/links.tsx | 5 ++ 9 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 pages/dashboard/tag-moderator.tsx create mode 100644 src/components/tags/simple-tag-card.tsx diff --git a/pages/dashboard/tag-moderator.tsx b/pages/dashboard/tag-moderator.tsx new file mode 100644 index 00000000..b96fb9eb --- /dev/null +++ b/pages/dashboard/tag-moderator.tsx @@ -0,0 +1,64 @@ +import {Text, Box, Heading, Image, Center, Button, Flex, VStack, Divider, useToast, Wrap, WrapItem, useColorModeValue, StackDivider } from "@chakra-ui/react" +import Card from "components/card" +import Nav from "layouts/nav/nav" +import PageContainer from "layouts/page-container" +import Sidebar from "layouts/sidebar/sidebar" +import React, { useEffect, useState } from "react" +import {dashboardLinks} from "src/data/links" +import { requestApi } from "utils/axios/request" +import PageContainer1 from "layouts/page-container1" +import Empty from "components/empty" +import { IDType } from "src/types/id" +import UserCard from "components/users/user-card" +import userCustomTheme from "theme/user-custom" +import TagCard from "components/tags/tag-card" +import SimpleTagCard from "components/tags/simple-tag-card" + + +const FollowersPage = () => { + const [tags, setTags] = useState([]) + const borderColor = useColorModeValue(userCustomTheme.borderColor.light, userCustomTheme.borderColor.dark) + + const getTags = async () => { + const res = await requestApi.get(`/tag/list/byUserModeratorRole`) + console.log(res) + setTags(res.data) + } + + useEffect(() => { + getTags() + }, []) + + return ( + <> + + + + + You are a moderator of these tags, you can modify the tag and manage the posts. + + { + tags.length === 0 ? + + : + <> + + {tags.map(tag => + + + + + )} + +
没有更多标签了
+ + } +
+
+
+ + ) +} +export default FollowersPage + + diff --git a/pages/index.tsx b/pages/index.tsx index 7645f0fc..1783814d 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -17,8 +17,6 @@ import PageContainer1 from "layouts/page-container1" import React, { useEffect, useState } from "react" import { requestApi } from "utils/axios/request" import StoryFilters from "components/story/story-filter" -import { concat } from "lodash" -import useInfiniteScroll from 'src/hooks/use-infinite-scroll' import { HomeSidebar } from "src/types/misc" import Link from "next/link" import { ReserveUrls } from "src/data/reserve-urls" diff --git a/pages/tags/[name].tsx b/pages/tags/[name].tsx index eca8d3c1..ef0c2546 100644 --- a/pages/tags/[name].tsx +++ b/pages/tags/[name].tsx @@ -139,7 +139,10 @@ const UserPage = () => { {moderators.length > 0 && - Tag moderators + + Tag moderators + {isAdmin(session.user.role) && router.push(`/admin/tags`)}>{getSvgIcon('edit','.9rem')}} + {moderators.map(m => diff --git a/server/internal/api/tag.go b/server/internal/api/tag.go index ad3732e9..b00d43ad 100644 --- a/server/internal/api/tag.go +++ b/server/internal/api/tag.go @@ -223,3 +223,15 @@ func RemoveTagStory(c *gin.Context) { c.JSON(http.StatusOK, common.RespSuccess(nil)) } + +func GetTagListByUserModeratorRole(c *gin.Context) { + user := user.CurrentUser(c) + + res, err := tags.GetTagListByUserModeratorRole(user.ID) + if err != nil { + c.JSON(err.Status, common.RespError(err.Message)) + return + } + + c.JSON(http.StatusOK, common.RespSuccess(res)) +} diff --git a/server/internal/api/user.go b/server/internal/api/user.go index cdbd269e..c6033f74 100644 --- a/server/internal/api/user.go +++ b/server/internal/api/user.go @@ -198,3 +198,7 @@ func UserRegister(c *gin.Context) { user.Register(c, req.Code, req.Nickname, req.Username) } + +func GetUserModerators(c *gin.Context) { + +} diff --git a/server/internal/server.go b/server/internal/server.go index 21974ebf..dd21dcb1 100644 --- a/server/internal/server.go +++ b/server/internal/server.go @@ -105,7 +105,7 @@ func (s *Server) Start() error { r.POST("/tag/moderator", IsLogin(), api.AddModerator) r.DELETE("/tag/moderator/:tagID/:userID", IsLogin(), api.DeleteModerator) r.DELETE("/tag/story/:tagID/:storyID", IsLogin(), api.RemoveTagStory) - + r.GET("/tag/list/byUserModeratorRole", IsLogin(), api.GetTagListByUserModeratorRole) // user apis r.GET("/user/all", api.GetUsers) r.POST("/user/ids", api.GetUsersByIDs) @@ -125,6 +125,7 @@ func (s *Server) Start() error { r.GET("/user/email/exist/:email", api.UserEmailExist) r.GET("/user/email/byCode", api.GetUserEmailByCode) r.POST("/user/register", api.UserRegister) + // interaction apis r.POST("/interaction/like/:id", IsLogin(), api.Like) r.POST("/interaction/follow/:id", IsLogin(), api.Follow) diff --git a/server/internal/tags/tags.go b/server/internal/tags/tags.go index da2df2b5..fdf8a24c 100644 --- a/server/internal/tags/tags.go +++ b/server/internal/tags/tags.go @@ -335,3 +335,26 @@ func RemoveTagStory(tagID, storyID string) *e.Error { return nil } + +func GetTagListByUserModeratorRole(userID string) ([]*models.Tag, *e.Error) { + tags := make([]*models.Tag, 0) + rows, err := db.Conn.Query("SELECT tag_id FROM tag_moderators WHERE user_id=?", userID) + if err != nil { + logger.Warn("get tag moderators error", "error", err) + return nil, e.New(http.StatusInternalServerError, e.Internal) + } + + for rows.Next() { + var tid string + rows.Scan(&tid) + + t, err := GetTag(tid, "") + if err != nil { + logger.Warn("query tag error", "error", err) + continue + } + tags = append(tags, t) + } + + return tags, nil +} diff --git a/src/components/tags/simple-tag-card.tsx b/src/components/tags/simple-tag-card.tsx new file mode 100644 index 00000000..94116cf0 --- /dev/null +++ b/src/components/tags/simple-tag-card.tsx @@ -0,0 +1,29 @@ +import React from "react" +import {chakra, Heading, Image, Text, HStack,Button, Flex,PropsOf, Box, Tooltip, Tag as ChakraTag, useColorModeValue} from "@chakra-ui/react" +import { Tag } from "src/types/tag" +import { ReserveUrls } from "src/data/reserve-urls" +import NextLink from "next/link" + +type Props = PropsOf & { + tag: Tag +} + + +export const SimpleTagCard= (props:Props) =>{ + const {tag} = props + return ( + + + + + + {tag.title} + {tag.md} + + + + + ) +} + +export default SimpleTagCard diff --git a/src/data/links.tsx b/src/data/links.tsx index 760f7659..2f03b97a 100644 --- a/src/data/links.tsx +++ b/src/data/links.tsx @@ -45,6 +45,11 @@ export const dashboardLinks: any[] = [ path: `${ReserveUrls.Dashboard}/followers`, disabled: false }, + { + title: 'Tag Moderator', + path: `${ReserveUrls.Dashboard}/tag-moderator`, + disabled: false + }, ] export const searchLinks: any[] = [{