Compare commits

...

4 Commits

Author SHA1 Message Date
zhangshu fd58ff2d5b server add mongo 1 year ago
zhangshu 32f3ddef4f fix code style 1 year ago
zhangshu b8e031f07f add config and init log 1 year ago
zhangshu 9fc8ea07c6 add Login Page 1 year ago
  1. 2
      .gitignore
  2. 214
      youtube_collection_server/Utils/LogUtil.go
  3. 12
      youtube_collection_server/config.yml
  4. 25
      youtube_collection_server/config/EnvConfig.go
  5. 68
      youtube_collection_server/config/config.go
  6. 24
      youtube_collection_server/controller/UserController.go
  7. 7
      youtube_collection_server/entity/User.go
  8. 30
      youtube_collection_server/go.mod
  9. 64
      youtube_collection_server/go.sum
  10. 34
      youtube_collection_server/main.go
  11. 22
      youtube_collection_server/middle/Cors.go
  12. 19
      youtube_collection_server/service/UserService.go
  13. 7
      youtube_collection_web/src/assets/locales/en-US.json
  14. 7
      youtube_collection_web/src/assets/locales/zh-CN.json
  15. 97
      youtube_collection_web/src/components/Login.js

2
.gitignore

@ -156,3 +156,5 @@ dmypy.json
cython_debug/
.vscode
youtube_collection_web/node_modules
.idea
*/logs

214
youtube_collection_server/Utils/LogUtil.go

@ -0,0 +1,214 @@
package utils
import (
"bytes"
"fmt"
"io"
"os"
"path"
"time"
"github.com/gin-gonic/gin"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/logrusorgru/aurora"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
)
var Logger *logrus.Logger
var isInit bool
func CheckInitLog() bool {
return isInit
}
func init() {
isInit = false
}
const (
maxAgeHour = 168
rotationHour = 24
)
type SaveFormatter struct {
}
func (m *SaveFormatter) Format(entry *logrus.Entry) ([]byte, error) {
var b *bytes.Buffer
if entry.Buffer != nil {
b = entry.Buffer
} else {
b = &bytes.Buffer{}
}
timestamp := entry.Time.Format("2006-01-02 15:04:05")
var newLog string
newLog = fmt.Sprintf("[%s] [%s:%d] [%s] %s \n", timestamp, path.Base(entry.Caller.File), entry.Caller.Line, entry.Level, entry.Message)
b.WriteString(newLog)
return b.Bytes(), nil
}
type ConsoleFormatter struct {
}
func (m *ConsoleFormatter) Format(entry *logrus.Entry) ([]byte, error) {
var b *bytes.Buffer
if entry.Buffer != nil {
b = entry.Buffer
} else {
b = &bytes.Buffer{}
}
timestamp := entry.Time.Format("2006-01-02 15:04:05")
var newLog string
var levelString aurora.Value
switch entry.Level.String() {
case "info":
levelString = aurora.Green(entry.Level)
case "warning":
levelString = aurora.Yellow(entry.Level)
case "debug":
levelString = aurora.Gray(16-1, entry.Level)
case "error":
levelString = aurora.Red(entry.Level)
case "fatal":
levelString = aurora.Red(entry.Level)
case "panic":
levelString = aurora.Red(entry.Level)
}
newLog = fmt.Sprintf("[%s] [%s:%d] [%s] %s \n", timestamp, path.Base(entry.Caller.File), entry.Caller.Line, levelString, entry.Message)
b.WriteString(newLog)
return b.Bytes(), nil
}
func InitLogger(env string, logPath string) *logrus.Logger {
logFilePath := ""
errFilePath := ""
if dir, err := os.Getwd(); err == nil {
logFilePath = dir + "/logs/" + logPath + "/all.log"
errFilePath = dir + "/logs/" + logPath + "/error.log"
}
accessWriter, err := rotatelogs.New(
logFilePath+".%Y-%m-%d",
rotatelogs.WithLinkName(logFilePath),
rotatelogs.WithRotationTime(time.Hour*rotationHour),
rotatelogs.WithMaxAge(time.Hour*maxAgeHour),
)
if err != nil {
panic(err)
}
errorWriter, err := rotatelogs.New(
errFilePath+".%Y-%m-%d",
rotatelogs.WithLinkName(errFilePath),
rotatelogs.WithRotationTime(time.Hour*rotationHour),
rotatelogs.WithMaxAge(time.Hour*maxAgeHour),
)
if err != nil {
panic(err)
}
allWriter := io.MultiWriter(accessWriter, errorWriter)
//实例化
logger := logrus.New()
logger.Out = os.Stdout
//设置日志格式
logger.SetFormatter(&ConsoleFormatter{})
logger.SetReportCaller(true)
//设置输出
if env != "dev" {
logger.AddHook(lfshook.NewHook(
lfshook.WriterMap{
logrus.DebugLevel: accessWriter,
logrus.InfoLevel: accessWriter,
logrus.ErrorLevel: allWriter,
logrus.PanicLevel: allWriter,
},
&SaveFormatter{},
))
}
//设置日志级别
logger.SetLevel(logrus.DebugLevel)
Logger = logger
isInit = true
return logger
}
func InitReqLogger(env string, logPath string) *logrus.Logger {
logFilePath := ""
errFilePath := ""
if dir, err := os.Getwd(); err == nil {
logFilePath = dir + "/logs/" + logPath + "/req.log"
errFilePath = dir + "/logs/" + logPath + "/req-error.log"
}
accessWriter, err := rotatelogs.New(
logFilePath+".%Y-%m-%d",
rotatelogs.WithLinkName(logFilePath),
rotatelogs.WithRotationTime(time.Hour*rotationHour),
rotatelogs.WithMaxAge(time.Hour*maxAgeHour),
)
if err != nil {
panic(err)
}
errorWriter, err := rotatelogs.New(
errFilePath+".%Y-%m-%d",
rotatelogs.WithLinkName(errFilePath),
rotatelogs.WithRotationTime(time.Hour*rotationHour),
rotatelogs.WithMaxAge(time.Hour*maxAgeHour),
)
if err != nil {
panic(err)
}
allWriter := io.MultiWriter(accessWriter, errorWriter)
//实例化
logger := logrus.New()
logger.Out = os.Stdout
//设置日志格式
logger.SetFormatter(&ConsoleFormatter{})
logger.SetReportCaller(true)
//设置输出
if env != "dev" {
logger.AddHook(lfshook.NewHook(
lfshook.WriterMap{
logrus.DebugLevel: accessWriter,
logrus.InfoLevel: accessWriter,
logrus.ErrorLevel: allWriter,
logrus.PanicLevel: allWriter,
},
&SaveFormatter{},
))
}
//设置日志级别
logger.SetLevel(logrus.DebugLevel)
Logger = logger
isInit = true
return logger
}
func LoggerToFile(env string, logPath string) gin.HandlerFunc {
logger := InitReqLogger(env, logPath)
return func(c *gin.Context) {
// 开始时间
startTime := time.Now()
// 处理请求
c.Next()
// 结束时间
endTime := time.Now()
// 执行时间
latencyTime := endTime.Sub(startTime)
// 请求方式
reqMethod := c.Request.Method
// 请求路由
reqUri := c.Request.RequestURI
// 状态码
statusCode := c.Writer.Status()
// 请求IP
clientIP := c.ClientIP()
//日志格式
logger.Infof("|%3d|%13v|%15s|%s|%s|",
statusCode,
latencyTime,
clientIP,
reqMethod,
reqUri,
)
}
}

12
youtube_collection_server/config.yml

@ -0,0 +1,12 @@
server:
ip: 127.0.0.1
port: 9999
log:
logenv: test
logpath: server
mongo:
host: 47.108.20.249
port: 27017
username: root
password: zs960108
database: youtube_dev

25
youtube_collection_server/config/EnvConfig.go

@ -0,0 +1,25 @@
package config
type EnvConfig struct {
Server ServerEntity
Log LogEntity
Mongo MongoEntity
}
type ServerEntity struct {
Ip string
Port int
}
type LogEntity struct {
LogEnv string
LogPath string
}
type MongoEntity struct {
Host string
Port string
Username string
Password string
Database string
}

68
youtube_collection_server/config/config.go

@ -0,0 +1,68 @@
package config
import (
"context"
"flag"
"fmt"
"io/ioutil"
utils "youtube_collection_server/Utils"
service "youtube_collection_server/service"
"github.com/sirupsen/logrus"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"gopkg.in/yaml.v2"
)
var configFile string
var MyEnv EnvConfig
var Logger *logrus.Logger
var MyDB *mongo.Database
func init() {
flag.StringVar(&configFile, "cf", "config.yml", "配置文件名")
}
type User struct {
Name string
Age int
City string
}
type Users struct {
Collection *mongo.Collection
UserInfo map[string](*User)
}
func InitConfig() {
flag.Parse()
//读取配置文件
data, _ := ioutil.ReadFile(configFile)
err := yaml.Unmarshal(data, &MyEnv)
if err != nil {
fmt.Println("读取配置文件错误...")
return
}
//初始化日志
Logger = utils.InitLogger(MyEnv.Log.LogEnv, MyEnv.Log.LogPath)
Logger.Info("初始化Logger成功...")
//初始化db
dbUrl := fmt.Sprintf("mongodb://%s:%s@%s:%s", MyEnv.Mongo.Username, MyEnv.Mongo.Password, MyEnv.Mongo.Host, MyEnv.Mongo.Port)
clientOptions := options.Client().ApplyURI(dbUrl)
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
Logger.Fatal(err)
}
// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
Logger.Fatal(err)
}
Logger.Info("Connected to MongoDB!")
MyDB = client.Database(MyEnv.Mongo.Database)
initService()
}
func initService() {
service.UserServiceInstance.InitService(MyDB.Collection("my_test"))
}

24
youtube_collection_server/controller/UserController.go

@ -0,0 +1,24 @@
package controller
import (
"context"
"github.com/gin-gonic/gin"
entity "youtube_collection_server/entity"
service "youtube_collection_server/service"
)
type userController struct {
}
var UserController userController
func (m *userController) Test(c *gin.Context) {
user1 := entity.User{Name: "one", Age: 11, City: "1 City"}
service.UserServiceInstance.Collection.InsertOne(context.TODO(), user1)
c.JSON(200, gin.H{
"username": "name1",
"data": "data1",
})
}

7
youtube_collection_server/entity/User.go

@ -0,0 +1,7 @@
package entity
type User struct {
Name string
Age int
City string
}

30
youtube_collection_server/go.mod

@ -2,12 +2,28 @@ module youtube_collection_server
go 1.22.2
require (
github.com/gin-gonic/gin v1.9.1
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/sirupsen/logrus v1.9.3
)
require (
github.com/golang/snappy v0.0.1 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
golang.org/x/sync v0.1.0 // indirect
)
require (
github.com/bytedance/sonic v1.9.1 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.9.1
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
@ -15,17 +31,23 @@ require (
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/lestrrat-go/strftime v1.0.6 // indirect
github.com/logrusorgru/aurora v2.0.3+incompatible
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
go.mongodb.org/mongo-driver v1.15.0
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/crypto v0.17.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/yaml.v2 v2.4.0
gopkg.in/yaml.v3 v3.0.1 // indirect
)

64
youtube_collection_server/go.sum

@ -24,16 +24,27 @@ github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QX
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v1.0.6 h1:CFGsDEt1pOpFNU+TJB0nhz9jl+K0hZSLE205AhTIGQQ=
github.com/lestrrat-go/strftime v1.0.6/go.mod h1:f7jQKgV5nnJpYgdEasS+/y7EsTb8ykN2z68n3TtcTaw=
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -41,10 +52,18 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@ -60,19 +79,62 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc=
go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
@ -80,6 +142,8 @@ google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cn
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

34
youtube_collection_server/main.go

@ -1,20 +1,34 @@
package main
import (
"fmt"
utils "youtube_collection_server/Utils"
config "youtube_collection_server/config"
"youtube_collection_server/controller"
"youtube_collection_server/middle"
"github.com/gin-gonic/gin"
)
func main() {
config.InitConfig()
// 创建一个默认的路由引擎
r := gin.Default()
// 配置路由
f := func(c *gin.Context) {
c.JSON(200, gin.H{
"username": "name1",
"data": "data1",
})
router := gin.Default()
//初始化路由
initRouter(router)
config.Logger.Infof("服务器启动成功...端口:%d", config.MyEnv.Server.Port)
router.Use(middle.Cors())
err := router.Run(fmt.Sprintf(":"+"%d", config.MyEnv.Server.Port))
if err != nil {
config.Logger.Error("服务器启动失败")
return
}
}
func initRouter(router *gin.Engine) {
router.Use(utils.LoggerToFile(config.MyEnv.Log.LogEnv, config.MyEnv.Log.LogPath))
noAuth := router.Group("")
{
noAuth.GET("/test", controller.UserController.Test)
}
r.GET("/", f)
// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
r.Run()
}

22
youtube_collection_server/middle/Cors.go

@ -0,0 +1,22 @@
package middle
import (
"net/http"
"github.com/gin-gonic/gin"
)
func Cors() gin.HandlerFunc {
return func(context *gin.Context) {
method := context.Request.Method
context.Header("Access-Control-Allow-Origin", "*")
context.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
context.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
context.Header("Access-Control-Allow-Credentials", "true")
if method == "OPTIONS" {
context.AbortWithStatus(http.StatusNoContent)
}
context.Next()
}
}

19
youtube_collection_server/service/UserService.go

@ -0,0 +1,19 @@
package service
import (
entity "youtube_collection_server/entity"
"go.mongodb.org/mongo-driver/mongo"
)
var UserServiceInstance UserService
type UserService struct {
Collection *mongo.Collection
UserInfo map[string](*entity.User)
}
func (m *UserService) InitService(Collection *mongo.Collection) {
m.Collection = Collection
m.UserInfo = map[string](*entity.User){}
}

7
youtube_collection_web/src/assets/locales/en-US.json

@ -1,3 +1,8 @@
{
"hello":"Hello"
"hello": "Hello",
"login_page": {
"login": "Login",
"username": "Username",
"password": "Password"
}
}

7
youtube_collection_web/src/assets/locales/zh-CN.json

@ -1,3 +1,8 @@
{
"hello":"你好"
"hello": "你好",
"login_page": {
"login": "登录",
"username": "用户名",
"password": "密码"
}
}

97
youtube_collection_web/src/components/Login.js

@ -1,16 +1,103 @@
import React from 'react'
import { useNavigate } from 'react-router-dom';
import { Button } from 'antd'
// import { useNavigate } from 'react-router-dom';
import { Card, Button, Flex, Form, Input, Space } from 'antd';
import { useTranslation } from 'react-i18next';
const boxStyle = {
width: '100%',
height: '100vh',
borderRadius: 6,
border: '1px solid #40a9ff',
};
const justify = "center"
const alignItems = "center"
function Login() {
const navigate = useNavigate();
// const navigate = useNavigate();
const [t] = useTranslation()
const [form] = Form.useForm();
function button_onclick() {
navigate('/home')
alert(form.getFieldValue('username'))
// navigate('/home')
}
const onReset = () => {
form.resetFields();
};
return (
<div>
<Flex style={boxStyle} justify={justify} align={alignItems}>
<Card title={t('login_page.login')} bordered={false} style={{ width: 600 }}>
<Form
name="basic"
labelAlign="left"
labelCol={{
offset: 4,
span: 8,
}}
wrapperCol={{
span: 16,
}}
style={{
maxWidth: 600,
}}
initialValues={{
remember: true,
}}
onFinish={button_onclick}
autoComplete="off"
form={form}
>
<Form.Item
label={t('login_page.username')}
name="username"
rules={[
{
required: true,
message: 'Please input your username!',
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t('login_page.password')}
name="password"
rules={[
{
required: true,
message: 'Please input your password!',
},
]}
>
<Input.Password />
</Form.Item>
<Form.Item
wrapperCol={{
offset: 0,
span: 24,
}}
>
<Space>
<Button type="primary" htmlType="submit">
Submit
</Button>
<Button htmlType="button" onClick={onReset}>
Reset
</Button>
</Space>
</Form.Item>
</Form>
</Card>
<Button onClick={button_onclick}>Home</Button>
</Flex>
</div>
)
}

Loading…
Cancel
Save