mirror of https://github.com/sunface/rust-course
parent
af49765582
commit
25acb1cf9b
@ -0,0 +1,112 @@
|
||||
import { Text, Box, Heading, Image, Center, Button, Flex, VStack, Divider, useToast, FormControl, FormLabel, FormHelperText, Input, FormErrorMessage, HStack, Wrap, useMediaQuery, Avatar, Textarea, } 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 { adminLinks, settingLinks } from "src/data/links"
|
||||
import { requestApi } from "utils/axios/request"
|
||||
import { useRouter } from "next/router"
|
||||
import { Field, Form, Formik } from "formik"
|
||||
import { config } from "configs/config"
|
||||
import Tags from "components/tags/tags"
|
||||
var validator = require('validator');
|
||||
|
||||
const UserNavbarPage = () => {
|
||||
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))
|
||||
}, [])
|
||||
const router = useRouter()
|
||||
const toast = useToast()
|
||||
|
||||
const submitUser = async (values, _) => {
|
||||
await requestApi.post(`/user/update`, values)
|
||||
setUser(values)
|
||||
toast({
|
||||
description: "更新成功",
|
||||
status: "success",
|
||||
duration: 2000,
|
||||
isClosable: true,
|
||||
})
|
||||
}
|
||||
|
||||
function validateNickname(value) {
|
||||
let error
|
||||
if (!value?.trim()) {
|
||||
error = "昵称不能为空"
|
||||
}
|
||||
|
||||
if (value?.length > config.user.nicknameMaxLen) {
|
||||
error = `长度不能超过${config.user.nicknameMaxLen}`
|
||||
}
|
||||
|
||||
return error
|
||||
}
|
||||
|
||||
function validateEmail(value) {
|
||||
let email = value?.trim()
|
||||
let error
|
||||
|
||||
if (email?.length > config.user.usernameMaxLen) {
|
||||
error = `长度不能超过${config.user.usernameMaxLen}`
|
||||
return error
|
||||
}
|
||||
|
||||
if (email) {
|
||||
if (!validator.isEmail(email)) {
|
||||
error = "Email格式不合法"
|
||||
return error
|
||||
}
|
||||
}
|
||||
return error
|
||||
}
|
||||
|
||||
|
||||
function validateUrl(value, canBeEmpty = true) {
|
||||
let url = value?.trim()
|
||||
let error
|
||||
if (!canBeEmpty) {
|
||||
if (!url) {
|
||||
error = "url不能为空"
|
||||
return error
|
||||
}
|
||||
}
|
||||
|
||||
if (url) {
|
||||
if (!validator.isURL(value)) {
|
||||
error = "URL格式不合法"
|
||||
return error
|
||||
}
|
||||
}
|
||||
|
||||
return error
|
||||
}
|
||||
|
||||
function validateLen(value) {
|
||||
let error
|
||||
if (value?.length > config.commonMaxlen) {
|
||||
error = `长度不能超过${config.commonMaxlen}`
|
||||
}
|
||||
|
||||
return error
|
||||
}
|
||||
|
||||
const Layout = isLargerThan1280 ? HStack : VStack
|
||||
return (
|
||||
<>
|
||||
<PageContainer>
|
||||
<Box display="flex">
|
||||
<Sidebar routes={settingLinks} width={["120px", "120px", "250px", "250px"]} height="fit-content" title="博客设置" />
|
||||
{user && <Card ml="4" width="100%">
|
||||
<Heading></Heading>
|
||||
</Card>}
|
||||
</Box>
|
||||
</PageContainer>
|
||||
</>
|
||||
)
|
||||
}
|
||||
export default UserNavbarPage
|
||||
|
@ -0,0 +1,40 @@
|
||||
package user
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sort"
|
||||
|
||||
"github.com/imdotdev/im.dev/server/pkg/db"
|
||||
"github.com/imdotdev/im.dev/server/pkg/e"
|
||||
"github.com/imdotdev/im.dev/server/pkg/models"
|
||||
)
|
||||
|
||||
func AddNavbar(nav *models.Navbar) *e.Error {
|
||||
_, err := db.Conn.Exec("INSERT INTO user_navbar (user_id,label,type,value,weight) VALUES (?,?,?,?,?)",
|
||||
nav.UserID, nav.Label, nav.Type, nav.Value, nav.Weight)
|
||||
if err != nil {
|
||||
logger.Warn("add user navbar error", "error", err)
|
||||
return e.New(http.StatusInternalServerError, e.Internal)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetNavbars(userID string) (models.Navbars, *e.Error) {
|
||||
rows, err := db.Conn.Query("SELECT label,type,value,weight FROM navbar WHERE user_id=?", userID)
|
||||
if err != nil {
|
||||
logger.Warn("get user navbar error", "error", err)
|
||||
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
||||
}
|
||||
|
||||
navs := make(models.Navbars, 0)
|
||||
for rows.Next() {
|
||||
nav := &models.Navbar{}
|
||||
rows.Scan(&nav.Label, &nav.Type, &nav.Value, &nav.Weight)
|
||||
navs = append(navs, nav)
|
||||
}
|
||||
|
||||
sort.Sort(navs)
|
||||
|
||||
return navs, nil
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package models
|
||||
|
||||
const (
|
||||
NavbarTypeLink = 1
|
||||
NavbarTypeSeries = 2
|
||||
)
|
||||
|
||||
type Navbar struct {
|
||||
UserID string `json:"userID"`
|
||||
Label string `json:"label"`
|
||||
Type int `json:"type"`
|
||||
Value string `json:"value"`
|
||||
Weight int `json:"weight"`
|
||||
}
|
||||
|
||||
type Navbars []*Navbar
|
||||
|
||||
func (t Navbars) Len() int { return len(t) }
|
||||
func (t Navbars) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
|
||||
func (t Navbars) Less(i, j int) bool {
|
||||
return t[i].Weight > t[j].Weight
|
||||
}
|
||||
|
||||
func ValidNavbarType(tp int) bool {
|
||||
if tp == NavbarTypeLink || tp == NavbarTypeSeries {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
Loading…
Reference in new issue