From 96c960c04f212d1ec2a4a33d5055af677056c651 Mon Sep 17 00:00:00 2001 From: dhy <1452562016@qq.com> Date: Wed, 18 Dec 2024 17:14:20 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- link_homework/api/v1/hello.go | 1 - link_homework/api/v1/homework/login.go | 1 + link_homework/go.mod | 18 ++-- link_homework/go.sum | 104 +++++-------------- link_homework/hack/config.yaml | 2 +- link_homework/internal/cmd/cmd.go | 36 +++---- link_homework/internal/consts/consts.go | 6 ++ link_homework/internal/controller/auth/login.go | 56 ++++++++++ link_homework/internal/controller/member.go | 33 ++++++ link_homework/internal/logic/logic.go | 9 ++ link_homework/internal/logic/login/login.go | 51 ++++++++++ link_homework/internal/logic/login/token.go | 43 ++++++++ .../internal/logic/middleware/JWTMiddleware.go | 43 ++++++++ link_homework/internal/service/login.go | 47 +++++++++ link_homework/internal/service/middleware.go | 8 ++ link_homework/main.go | 21 +++- link_homework/manifest/config/config.yaml | 13 ++- link_homework/utility/utility.go | 113 +++++++++++++++++++++ 18 files changed, 492 insertions(+), 113 deletions(-) delete mode 100644 link_homework/api/v1/hello.go create mode 100644 link_homework/api/v1/homework/login.go create mode 100644 link_homework/internal/controller/auth/login.go create mode 100644 link_homework/internal/controller/member.go create mode 100644 link_homework/internal/logic/login/login.go create mode 100644 link_homework/internal/logic/login/token.go create mode 100644 link_homework/internal/logic/middleware/JWTMiddleware.go create mode 100644 link_homework/internal/service/login.go create mode 100644 link_homework/internal/service/middleware.go create mode 100644 link_homework/utility/utility.go diff --git a/link_homework/api/v1/hello.go b/link_homework/api/v1/hello.go deleted file mode 100644 index b7b1f99..0000000 --- a/link_homework/api/v1/hello.go +++ /dev/null @@ -1 +0,0 @@ -package v1 diff --git a/link_homework/api/v1/homework/login.go b/link_homework/api/v1/homework/login.go new file mode 100644 index 0000000..ca2fd8f --- /dev/null +++ b/link_homework/api/v1/homework/login.go @@ -0,0 +1 @@ +package homework diff --git a/link_homework/go.mod b/link_homework/go.mod index 0535b7d..f524a4a 100644 --- a/link_homework/go.mod +++ b/link_homework/go.mod @@ -4,33 +4,37 @@ go 1.21.13 require ( github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1 + github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1 github.com/gogf/gf/v2 v2.8.1 + github.com/golang-jwt/jwt/v4 v4.5.1 ) require ( github.com/BurntSushi/toml v1.4.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect - github.com/goflyfox/gtoken v1.5.10 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect + github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/redis/go-redis/v9 v9.7.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/sdk v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect - golang.org/x/net v0.27.0 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/link_homework/go.sum b/link_homework/go.sum index b7260ea..dea55a0 100644 --- a/link_homework/go.sum +++ b/link_homework/go.sum @@ -1,134 +1,82 @@ -github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/goflyfox/gtoken v1.5.10 h1:oj/v5r/1TjMMZvxpyEZYdsEvG2ZK/SGGnyjvsKi4uHk= -github.com/goflyfox/gtoken v1.5.10/go.mod h1:YpoSAn9tbfrSBoQnY7raQP0HaiRjQAE+4J179ecRH5I= github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1 h1:jbaPawkb8qmaYzrmBDbTa8Zkhzacq1RBOZw+qRJExI4= github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1/go.mod h1:s2aI1fV9AvKi4NtMpv3pV0EHtazkvfUNVQmzapr7UJQ= -github.com/gogf/gf/v2 v2.5.4/go.mod h1:7yf5qp0BznfsYx7Sw49m3mQvBsHpwAjJk3Q9ZnKoUEc= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1 h1:1vPFyN0GLv24JD3WGhvKzXvKG+fmuixDTawbtfzCzRQ= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1/go.mod h1:IWyGxzplp06tRc6Ah/eCLuBntnKSw9sn1maH0vzPPtw= github.com/gogf/gf/v2 v2.8.1 h1:1oVQg3G5OgCats4qWFTH3pHLe92nfUQeUDta05tUs1g= github.com/gogf/gf/v2 v2.8.1/go.mod h1:6iYuZZ+A0ZcH8+4MDS/P0SvTPCvKzRvyAsY1kbkJYJc= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= +github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 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/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -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= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -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.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -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/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -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/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 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.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= diff --git a/link_homework/hack/config.yaml b/link_homework/hack/config.yaml index db113b7..b8c20b1 100644 --- a/link_homework/hack/config.yaml +++ b/link_homework/hack/config.yaml @@ -5,7 +5,7 @@ gfcli: gen: dao: - link: "mysql:live:p4jMAMShNM8HTrbX@tcp(39.101.133.168:3306)/live?charset=utf8mb4&parseTime=True&loc=Local" - group: "live" + group: "default" tables: "live, activity_interactive_form, activity_interactive_group, activity_interactive_record" descriptionTag: true - link: "mysql:cms:AF42R3ib6YkFaemm@tcp(39.101.133.168:3306)/cms?charset=utf8mb4&parseTime=True&loc=Local" diff --git a/link_homework/internal/cmd/cmd.go b/link_homework/internal/cmd/cmd.go index 4a0a6af..f9eafdb 100644 --- a/link_homework/internal/cmd/cmd.go +++ b/link_homework/internal/cmd/cmd.go @@ -2,10 +2,12 @@ package cmd import ( "context" - "github.com/goflyfox/gtoken/gtoken" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gcmd" + member "link_homework/internal/controller" + "link_homework/internal/controller/auth" + "link_homework/internal/logic/middleware" ) var ( @@ -16,33 +18,19 @@ var ( Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { s := g.Server() //后台 - - //启动gtoken - // 创建一个GfToken对象,用于处理用户登录、登出、权限验证等操作 - gfToken := >oken.GfToken{ - // 设置登录路径,即用户登录接口登入成功后会获得一个Token - LoginPath: "/login", - //// 设置登录前执行的函数,在用户登录之前会调用这个函数进行一些预处理,比如验证用户名和密码等。 - //LoginBeforeFunc: loginFunc, //手动编写 没有同时配置登入路径,登入方法,登出路径启动时会报错 - // 设置登出路径,即用户登出接口登入成功后会删除Token - LogoutPath: "/user/logout", - //// 设置需要拦截的路径,按照前缀拦截,所有以/user或/system开头的路径都需要进行Token认证。 - //AuthPaths: g.SliceStr{"/user", "/system"}, - //// 设置不需要拦截的路径,所有以/user/info或/system/user/开头的路径都不需要进行Token认证。 - //AuthExcludePaths: g.SliceStr{"/user/info", "/system/user/*"}, - //// 开启全局拦截,默认关闭,如果设置为true,则所有请求都会经过Token认证中间件,如果设置为false,则只有指定路径的请求会经过Token认证中间件。 - //GlobalMiddleware: true, - } + s.Group("/api", func(group *ghttp.RouterGroup) { + group.POST("/", auth.NewLoginController()) + group.POST("/api/v2/member", new(member.MemberController)) + //group.POST("/login", login.NewLoginLogic()) + //group.POST("/logout", login.NewTokenLogic()) + }) s.Group("/api/homework_manage", func(group *ghttp.RouterGroup) { - //group.Middleware(middleware.MiddlewareIsLogin) - gfToken.Middleware(ctx, group) - //直接写接口,不用再分组 + group.Middleware(middleware.JWTMiddleware) + }) //客户端 s.Group("/api/homework_client", func(group *ghttp.RouterGroup) { - //group.Middleware(middleware.MiddlewareIsLogin) - gfToken.Middleware(ctx, group) - //直接写接口,不用再分组 + }) s.Run() diff --git a/link_homework/internal/consts/consts.go b/link_homework/internal/consts/consts.go index d709a2b..6a1a295 100644 --- a/link_homework/internal/consts/consts.go +++ b/link_homework/internal/consts/consts.go @@ -1 +1,7 @@ package consts + +// Redis和其他配置常量 +const ( + URL_KEY = "jingwang:cms:env" // Redis中的键 + URL_HASH_KEY = "HLJW_BASE_URL" // Redis中的hashKey +) diff --git a/link_homework/internal/controller/auth/login.go b/link_homework/internal/controller/auth/login.go new file mode 100644 index 0000000..d088d14 --- /dev/null +++ b/link_homework/internal/controller/auth/login.go @@ -0,0 +1,56 @@ +package auth + +import ( + "net/http" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "link_homework/internal/model/dto" + "link_homework/internal/service" +) + +type LoginController struct { +} + +func NewLoginController() *LoginController { + return &LoginController{} +} + +// 登录接口 + +func (c *LoginController) Login(r *ghttp.Request) { + var ( + username = r.Get("username").String() + password = r.Get("password").String() + ) + + token, err := service.LoginLogic().Login(r.Context(), username, password) + if err != nil { + r.Response.WriteJsonExit(dto.Error(err.Error())) + } + + r.Response.WriteJsonExit(dto.SuccessWithData(g.Map{ + "token": token, + })) +} + +// 退出接口 +func (c *LoginController) Logout(r *ghttp.Request) { + // 获取请求中的 context + ctx := r.Context() + + // 从请求头中获取 token + token := r.Header.Get("Authorization") + if token == "" { + r.Response.WriteJsonExit(dto.ErrorWithCode(http.StatusUnauthorized, "Token 不能为空")) + } + + // 校验 Token 是否有效 + valid, err := service.TokenLogic().ValidateToken(ctx, token) + if err != nil || !valid { + r.Response.WriteJsonExit(dto.ErrorWithCode(http.StatusUnauthorized, "Token 无效")) + } + + // 返回登出成功 + r.Response.WriteJsonExit(dto.Success()) +} diff --git a/link_homework/internal/controller/member.go b/link_homework/internal/controller/member.go new file mode 100644 index 0000000..fa0a53e --- /dev/null +++ b/link_homework/internal/controller/member.go @@ -0,0 +1,33 @@ +package member + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "link_homework/internal/model/dto" + "link_homework/utility" +) + +// MemberController 处理与成员相关的操作 +type MemberController struct{} + +// GetJwcode 获取用户的 jwcode +// MemberController.GetJwcode +func (c *MemberController) GetJwcode(r *ghttp.Request) { + // 获取 token 参数 + token := r.Get("token").String() + if token == "" { + r.Response.WriteJsonExit(dto.Error("Token is required")) + return + } + + // 调用 GetJwcodeJSON 函数获取 jwcode + result := utility.GetJwcodeJSON(token) + if result.Code != 200 { + r.Response.WriteJsonExit(result) // 直接返回错误结果 + return + } + + // 成功返回 jwcode + r.Response.WriteJsonExit(dto.SuccessWithData(map[string]interface{}{ + "jwcode": result.Data, + })) +} diff --git a/link_homework/internal/logic/logic.go b/link_homework/internal/logic/logic.go index 4c79103..6bbf97d 100644 --- a/link_homework/internal/logic/logic.go +++ b/link_homework/internal/logic/logic.go @@ -1 +1,10 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + package logic + +import ( + _ "link_homework/internal/logic/login" + _ "link_homework/internal/logic/middleware" +) diff --git a/link_homework/internal/logic/login/login.go b/link_homework/internal/logic/login/login.go new file mode 100644 index 0000000..4502b67 --- /dev/null +++ b/link_homework/internal/logic/login/login.go @@ -0,0 +1,51 @@ +package login + +import ( + "context" + "errors" + "link_homework/internal/service" + "time" + + "github.com/golang-jwt/jwt/v4" +) + +type sLoginLogic struct{} + +var ( + SecretKey = []byte("HomilyLink") // 用于签名 JWT 的密钥 +) + +// 自定义声明结构 +type CustomClaims struct { + Username string `json:"username"` + jwt.RegisteredClaims +} + +func NewLoginLogic() *sLoginLogic { + return &sLoginLogic{} +} + +// 确保在初始化时注册该实现 +func init() { + service.RegisterLoginLogic(&sLoginLogic{}) +} + +func (l *sLoginLogic) Login(ctx context.Context, username, password string) (string, error) { + if username != "admin" || password != "12345" { + return "", errors.New("用户名或密码错误") + } + + // 创建 JWT Token + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "username": username, + "exp": time.Now().Add(time.Hour * 1).Unix(), // 1 小时后过期 + }) + + // 签名并获取完整的编码后的字符串 token + tokenString, err := token.SignedString(SecretKey) + if err != nil { + return "", err + } + + return tokenString, nil +} diff --git a/link_homework/internal/logic/login/token.go b/link_homework/internal/logic/login/token.go new file mode 100644 index 0000000..72ff438 --- /dev/null +++ b/link_homework/internal/logic/login/token.go @@ -0,0 +1,43 @@ +package login + +import ( + "context" + "errors" + "github.com/golang-jwt/jwt/v4" + "link_homework/internal/service" + "log" +) + +type sTokenLogic struct{} + +func NewTokenLogic() *sTokenLogic { + return &sTokenLogic{} +} + +func init() { + service.RegisterTokenLogic(&sTokenLogic{}) +} + +// ValidateToken 验证 JWT Token 的方法 +func (t *sTokenLogic) ValidateToken(ctx context.Context, tokenString string) (bool, error) { + // 解析 token + token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return SecretKey, nil + }) + + if err != nil { + return false, errors.New("Token 无效: " + err.Error()) + } + + // 如果 token 有效,返回 true + if token.Valid { + // 提取 CustomClaims 并打印 username + if claims, ok := token.Claims.(*CustomClaims); ok { + log.Printf("解析到的用户名: %s", claims.Username) // 打印解析到的用户名 + } + return true, nil + } + + // 如果 token 无效 + return false, errors.New("Token 验证失败") +} diff --git a/link_homework/internal/logic/middleware/JWTMiddleware.go b/link_homework/internal/logic/middleware/JWTMiddleware.go new file mode 100644 index 0000000..8ffddad --- /dev/null +++ b/link_homework/internal/logic/middleware/JWTMiddleware.go @@ -0,0 +1,43 @@ +package middleware + +import ( + "link_homework/internal/logic/login" + "net/http" + "strings" + + "github.com/gogf/gf/v2/net/ghttp" + "github.com/golang-jwt/jwt/v4" +) + +// JWT 验证中间件 +func JWTMiddleware(r *ghttp.Request) { + // 从请求头中获取 token + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + r.Response.WriteStatusExit(http.StatusUnauthorized, "Authorization header missing") + } + + // 检查 token 前缀 + parts := strings.SplitN(authHeader, " ", 2) + if len(parts) != 2 || parts[0] != "Bearer" { + r.Response.WriteStatusExit(http.StatusUnauthorized, "Invalid Authorization header format") + } + + tokenString := parts[1] + + // 解析 token + token, err := jwt.ParseWithClaims(tokenString, &login.CustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return login.SecretKey, nil + }) + + if err != nil || !token.Valid { + r.Response.WriteStatusExit(http.StatusUnauthorized, "Invalid token") + } + + // 将用户信息存储在上下文中 + if claims, ok := token.Claims.(*login.CustomClaims); ok { + r.SetCtxVar("username", claims.Username) + } + + r.Middleware.Next() +} diff --git a/link_homework/internal/service/login.go b/link_homework/internal/service/login.go new file mode 100644 index 0000000..b8da34e --- /dev/null +++ b/link_homework/internal/service/login.go @@ -0,0 +1,47 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" +) + +type ( + ILoginLogic interface { + Login(ctx context.Context, username string, password string) (string, error) + } + ITokenLogic interface { + // ValidateToken 验证 JWT Token 的方法 + ValidateToken(ctx context.Context, tokenString string) (bool, error) + } +) + +var ( + localLoginLogic ILoginLogic + localTokenLogic ITokenLogic +) + +func LoginLogic() ILoginLogic { + if localLoginLogic == nil { + panic("implement not found for interface ILoginLogic, forgot register?") + } + return localLoginLogic +} + +func RegisterLoginLogic(i ILoginLogic) { + localLoginLogic = i +} + +func TokenLogic() ITokenLogic { + if localTokenLogic == nil { + panic("implement not found for interface ITokenLogic, forgot register?") + } + return localTokenLogic +} + +func RegisterTokenLogic(i ITokenLogic) { + localTokenLogic = i +} diff --git a/link_homework/internal/service/middleware.go b/link_homework/internal/service/middleware.go new file mode 100644 index 0000000..3d70438 --- /dev/null +++ b/link_homework/internal/service/middleware.go @@ -0,0 +1,8 @@ +// ================================================================================ +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +type () diff --git a/link_homework/main.go b/link_homework/main.go index 20c6a7a..c6d8ea3 100644 --- a/link_homework/main.go +++ b/link_homework/main.go @@ -1,12 +1,14 @@ package main import ( + "fmt" "github.com/gogf/gf/v2/frame/g" _ "link_homework/internal/packed" "github.com/gogf/gf/v2/os/gctx" _ "github.com/gogf/gf/contrib/drivers/mysql/v2" + _ "github.com/gogf/gf/contrib/nosql/redis/v2" "link_homework/internal/cmd" @@ -18,7 +20,6 @@ func main() { //启动日志 g.Log().Info(ctx, "服务启动中") - //检查数据库链接 // 检查默认数据库链接 db := g.DB() @@ -36,6 +37,24 @@ func main() { } g.Log().Info(ctx, "CMS 数据库链接成功") + // 检查 Redis 配置并连接 + // 如果配置中存在 Redis 配置,初始化 Redis 客户端 + // 打印 Redis 配置,确保它加载正确 + redisConfig, err := g.Cfg().Get(ctx, "redis.default") + if err != nil { + fmt.Println("获取 Redis 配置失败:", err) + return + } + fmt.Printf("Redis 配置:%v\n", redisConfig) + + // 测试 Redis 连接 + _, err = g.Redis().Do(ctx, "PING") + if err != nil { + g.Log().Fatal(ctx, fmt.Sprintf("Redis 链接失败: %v", err)) + return + } + g.Log().Info(ctx, "Redis 链接成功") + //启动主命令逻辑 cmd.Main.Run(ctx) diff --git a/link_homework/manifest/config/config.yaml b/link_homework/manifest/config/config.yaml index b188f3a..642bcce 100644 --- a/link_homework/manifest/config/config.yaml +++ b/link_homework/manifest/config/config.yaml @@ -18,4 +18,15 @@ database: link: "mysql:cms:AF42R3ib6YkFaemm@tcp(39.101.133.168:3306)/cms?charset=utf8mb4&parseTime=True&loc=Local" debug: true -# redis暂不配置,记得加 \ No newline at end of file + +# https://goframe.org/docs/core/gredis-config-file + +redis: + default: +# address: "39.101.133.168:7001" +# password: "test" + address: "127.0.0.1:6379" + password: "" + db: 0 + + diff --git a/link_homework/utility/utility.go b/link_homework/utility/utility.go new file mode 100644 index 0000000..c09c6da --- /dev/null +++ b/link_homework/utility/utility.go @@ -0,0 +1,113 @@ +package utility + +import ( + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "io/ioutil" + "link_homework/internal/consts" + "link_homework/internal/model/dto" + "net/http" + "strings" +) + +// 获取 URL +func getUrl(key, hashKey string) *dto.Result { + ctx := gctx.New() + + // 1. 从 Redis 获取 URL + redisUrl, err := g.Redis().Do(ctx, "HGET", key, hashKey) + if err == nil && redisUrl.String() != "" { + g.Log().Infof(ctx, "从 Redis 获取到 URL: %s", redisUrl.String()) + return dto.SuccessWithData(redisUrl.String()) + } + + // 2. 如果 Redis 中没有,查询数据库 + urlResult := selectBaseUrl(hashKey) + if urlResult.Code != 200 { + return urlResult // 数据库查询失败,返回错误 + } + url := urlResult.Data.(string) + + // 3. 将 URL 存入 Redis + if _, err = g.Redis().Do(ctx, "HSET", key, hashKey, url); err != nil { + g.Log().Warningf(ctx, "将数据存入 Redis 失败: %v", err) + } + + g.Log().Infof(ctx, "将 URL 存入 Redis: %s", url) + return dto.SuccessWithData(url) +} + +// 查询数据库中的 URL +func selectBaseUrl(hashKey string) *dto.Result { + ctx := gctx.New() + + // 查询数据库 + value, err := g.DB("cms").Model("env").Where("`key` = ?", hashKey).Value("value") + if err != nil { + g.Log().Errorf(ctx, "数据库查询失败, 错误: %v, key: %s", err, hashKey) + return dto.Error("数据库查询失败") + } + + if value.IsNil() || value.String() == "" { + g.Log().Errorf(ctx, "未找到对应数据, key: %s", hashKey) + return dto.Error("未找到对应数据") + } + + return dto.SuccessWithData(value.String()) +} + +// 获取 jwcode +func GetJwcodeJSON(token string) *dto.Result { + // 1. 获取基础 URL + urlResult := getUrl(consts.URL_KEY, consts.URL_HASH_KEY) + if urlResult.Code != 200 { + return urlResult // 如果获取 URL 失败,直接返回错误 + } + baseUrl := urlResult.Data.(string) + + // 2. 拼接完整的 URL + url := baseUrl + "/api/v2/member/info" + requestBody := strings.NewReader(`{"token":"` + token + `"}`) + + // 3. 创建 HTTP 请求 + req, err := http.NewRequest("POST", url, requestBody) + if err != nil { + return dto.Error("HTTP 请求创建失败: " + err.Error()) + } + req.Header.Set("Content-Type", "application/json") + + // 4. 发送请求 + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return dto.Error("HTTP 请求失败: " + err.Error()) + } + defer resp.Body.Close() + + // 5. 检查 HTTP 状态码 + if resp.StatusCode != http.StatusOK { + return dto.Error("HTTP 状态码错误: " + resp.Status) + } + + // 6. 读取并解析响应体 + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return dto.Error("读取响应失败: " + err.Error()) + } + + // 7. 解析 JSON 数据 + var jsonResponse map[string]interface{} + if err = json.Unmarshal(body, &jsonResponse); err != nil { + return dto.Error("解析 JSON 失败: " + err.Error()) + } + + // 8. 提取 jwcode + if data, ok := jsonResponse["data"].(map[string]interface{}); ok { + if jwcode, exists := data["jwcode"].(string); exists { + return dto.SuccessWithData(g.Map{"jwcode": jwcode}) + } + } + + return dto.Error("响应体中没有 jwcode") +} From 4e47b507b0b7f0453e63819dee8739244ae9f792 Mon Sep 17 00:00:00 2001 From: dhy <1452562016@qq.com> Date: Wed, 18 Dec 2024 18:49:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=AB=AF-=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E3=80=81=E9=80=80=E5=87=BA=E6=8E=A5=E5=8F=A3=20?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=B7=A5=E5=85=B7=E7=B1=BB-?= =?UTF-8?q?=E8=8E=B7=E5=8F=96token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- link_homework/internal/cmd/cmd.go | 9 +++--- link_homework/internal/controller/auth/login.go | 4 +-- link_homework/internal/controller/member.go | 33 ------------------- link_homework/internal/logic/login/login.go | 29 +++++++++++++++-- link_homework/internal/logic/login/token.go | 43 ------------------------- link_homework/internal/service/login.go | 17 ++-------- link_homework/manifest/config/config.yaml | 8 ++--- link_homework/utility/utility.go | 22 +++++++------ 8 files changed, 51 insertions(+), 114 deletions(-) delete mode 100644 link_homework/internal/controller/member.go delete mode 100644 link_homework/internal/logic/login/token.go diff --git a/link_homework/internal/cmd/cmd.go b/link_homework/internal/cmd/cmd.go index f9eafdb..a8521be 100644 --- a/link_homework/internal/cmd/cmd.go +++ b/link_homework/internal/cmd/cmd.go @@ -5,7 +5,6 @@ import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gcmd" - member "link_homework/internal/controller" "link_homework/internal/controller/auth" "link_homework/internal/logic/middleware" ) @@ -19,10 +18,10 @@ var ( s := g.Server() //后台 s.Group("/api", func(group *ghttp.RouterGroup) { - group.POST("/", auth.NewLoginController()) - group.POST("/api/v2/member", new(member.MemberController)) - //group.POST("/login", login.NewLoginLogic()) - //group.POST("/logout", login.NewTokenLogic()) + // 登录接口 + group.POST("/login", auth.NewLoginController().Login) + // 退出接口 + group.POST("/logout", auth.NewLoginController().Logout) }) s.Group("/api/homework_manage", func(group *ghttp.RouterGroup) { group.Middleware(middleware.JWTMiddleware) diff --git a/link_homework/internal/controller/auth/login.go b/link_homework/internal/controller/auth/login.go index d088d14..cb22fbb 100644 --- a/link_homework/internal/controller/auth/login.go +++ b/link_homework/internal/controller/auth/login.go @@ -40,13 +40,13 @@ func (c *LoginController) Logout(r *ghttp.Request) { ctx := r.Context() // 从请求头中获取 token - token := r.Header.Get("Authorization") + token := r.Header.Get("token") if token == "" { r.Response.WriteJsonExit(dto.ErrorWithCode(http.StatusUnauthorized, "Token 不能为空")) } // 校验 Token 是否有效 - valid, err := service.TokenLogic().ValidateToken(ctx, token) + valid, err := service.LoginLogic().ValidateToken(ctx, token) if err != nil || !valid { r.Response.WriteJsonExit(dto.ErrorWithCode(http.StatusUnauthorized, "Token 无效")) } diff --git a/link_homework/internal/controller/member.go b/link_homework/internal/controller/member.go deleted file mode 100644 index fa0a53e..0000000 --- a/link_homework/internal/controller/member.go +++ /dev/null @@ -1,33 +0,0 @@ -package member - -import ( - "github.com/gogf/gf/v2/net/ghttp" - "link_homework/internal/model/dto" - "link_homework/utility" -) - -// MemberController 处理与成员相关的操作 -type MemberController struct{} - -// GetJwcode 获取用户的 jwcode -// MemberController.GetJwcode -func (c *MemberController) GetJwcode(r *ghttp.Request) { - // 获取 token 参数 - token := r.Get("token").String() - if token == "" { - r.Response.WriteJsonExit(dto.Error("Token is required")) - return - } - - // 调用 GetJwcodeJSON 函数获取 jwcode - result := utility.GetJwcodeJSON(token) - if result.Code != 200 { - r.Response.WriteJsonExit(result) // 直接返回错误结果 - return - } - - // 成功返回 jwcode - r.Response.WriteJsonExit(dto.SuccessWithData(map[string]interface{}{ - "jwcode": result.Data, - })) -} diff --git a/link_homework/internal/logic/login/login.go b/link_homework/internal/logic/login/login.go index 4502b67..4752a2a 100644 --- a/link_homework/internal/logic/login/login.go +++ b/link_homework/internal/logic/login/login.go @@ -3,16 +3,16 @@ package login import ( "context" "errors" - "link_homework/internal/service" "time" "github.com/golang-jwt/jwt/v4" + "link_homework/internal/service" ) type sLoginLogic struct{} var ( - SecretKey = []byte("HomilyLink") // 用于签名 JWT 的密钥 + SecretKey = []byte("HomilyLink") // 用于签名和验证 JWT 的密钥 ) // 自定义声明结构 @@ -30,6 +30,7 @@ func init() { service.RegisterLoginLogic(&sLoginLogic{}) } +// Login 方法实现用户登录并生成 Token func (l *sLoginLogic) Login(ctx context.Context, username, password string) (string, error) { if username != "admin" || password != "12345" { return "", errors.New("用户名或密码错误") @@ -49,3 +50,27 @@ func (l *sLoginLogic) Login(ctx context.Context, username, password string) (str return tokenString, nil } + +// ValidateToken 验证 Token 是否有效 +func (l *sLoginLogic) ValidateToken(ctx context.Context, tokenString string) (bool, error) { + // 解析 token + token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return SecretKey, nil + }) + + if err != nil { + return false, errors.New("Token 无效: " + err.Error()) + } + + // 如果 token 有效,返回 true + if token.Valid { + // 提取 CustomClaims 并打印 username + //if claims, ok := token.Claims.(*CustomClaims); ok { + // log.Printf("解析到的用户名: %s", claims.Username) // 打印解析到的用户名 + //} + return true, nil + } + + // 如果 token 无效 + return false, errors.New("Token 验证失败") +} diff --git a/link_homework/internal/logic/login/token.go b/link_homework/internal/logic/login/token.go deleted file mode 100644 index 72ff438..0000000 --- a/link_homework/internal/logic/login/token.go +++ /dev/null @@ -1,43 +0,0 @@ -package login - -import ( - "context" - "errors" - "github.com/golang-jwt/jwt/v4" - "link_homework/internal/service" - "log" -) - -type sTokenLogic struct{} - -func NewTokenLogic() *sTokenLogic { - return &sTokenLogic{} -} - -func init() { - service.RegisterTokenLogic(&sTokenLogic{}) -} - -// ValidateToken 验证 JWT Token 的方法 -func (t *sTokenLogic) ValidateToken(ctx context.Context, tokenString string) (bool, error) { - // 解析 token - token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { - return SecretKey, nil - }) - - if err != nil { - return false, errors.New("Token 无效: " + err.Error()) - } - - // 如果 token 有效,返回 true - if token.Valid { - // 提取 CustomClaims 并打印 username - if claims, ok := token.Claims.(*CustomClaims); ok { - log.Printf("解析到的用户名: %s", claims.Username) // 打印解析到的用户名 - } - return true, nil - } - - // 如果 token 无效 - return false, errors.New("Token 验证失败") -} diff --git a/link_homework/internal/service/login.go b/link_homework/internal/service/login.go index b8da34e..e49b489 100644 --- a/link_homework/internal/service/login.go +++ b/link_homework/internal/service/login.go @@ -11,17 +11,15 @@ import ( type ( ILoginLogic interface { + // Login 方法实现用户登录并生成 Token Login(ctx context.Context, username string, password string) (string, error) - } - ITokenLogic interface { - // ValidateToken 验证 JWT Token 的方法 + // ValidateToken 验证 Token 是否有效 ValidateToken(ctx context.Context, tokenString string) (bool, error) } ) var ( localLoginLogic ILoginLogic - localTokenLogic ITokenLogic ) func LoginLogic() ILoginLogic { @@ -34,14 +32,3 @@ func LoginLogic() ILoginLogic { func RegisterLoginLogic(i ILoginLogic) { localLoginLogic = i } - -func TokenLogic() ITokenLogic { - if localTokenLogic == nil { - panic("implement not found for interface ITokenLogic, forgot register?") - } - return localTokenLogic -} - -func RegisterTokenLogic(i ITokenLogic) { - localTokenLogic = i -} diff --git a/link_homework/manifest/config/config.yaml b/link_homework/manifest/config/config.yaml index 642bcce..0df5265 100644 --- a/link_homework/manifest/config/config.yaml +++ b/link_homework/manifest/config/config.yaml @@ -23,10 +23,10 @@ database: redis: default: -# address: "39.101.133.168:7001" -# password: "test" - address: "127.0.0.1:6379" - password: "" + address: "39.101.133.168:7001" + pass: "test" +# address: "127.0.0.1:6379" +# password: "" db: 0 diff --git a/link_homework/utility/utility.go b/link_homework/utility/utility.go index c09c6da..513bfc1 100644 --- a/link_homework/utility/utility.go +++ b/link_homework/utility/utility.go @@ -2,6 +2,8 @@ package utility import ( "encoding/json" + "errors" + "fmt" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" "io/ioutil" @@ -58,11 +60,11 @@ func selectBaseUrl(hashKey string) *dto.Result { } // 获取 jwcode -func GetJwcodeJSON(token string) *dto.Result { +func GetJwcodeJSON(token string) (string, error) { // 1. 获取基础 URL urlResult := getUrl(consts.URL_KEY, consts.URL_HASH_KEY) if urlResult.Code != 200 { - return urlResult // 如果获取 URL 失败,直接返回错误 + return "", errors.New("获取基础 URL 失败: " + urlResult.Message) } baseUrl := urlResult.Data.(string) @@ -73,7 +75,7 @@ func GetJwcodeJSON(token string) *dto.Result { // 3. 创建 HTTP 请求 req, err := http.NewRequest("POST", url, requestBody) if err != nil { - return dto.Error("HTTP 请求创建失败: " + err.Error()) + return "", fmt.Errorf("HTTP 请求创建失败: %v", err) } req.Header.Set("Content-Type", "application/json") @@ -81,33 +83,33 @@ func GetJwcodeJSON(token string) *dto.Result { client := &http.Client{} resp, err := client.Do(req) if err != nil { - return dto.Error("HTTP 请求失败: " + err.Error()) + return "", fmt.Errorf("HTTP 请求失败: %v", err) } defer resp.Body.Close() // 5. 检查 HTTP 状态码 if resp.StatusCode != http.StatusOK { - return dto.Error("HTTP 状态码错误: " + resp.Status) + return "", fmt.Errorf("HTTP 状态码错误: %v", resp.Status) } // 6. 读取并解析响应体 body, err := ioutil.ReadAll(resp.Body) if err != nil { - return dto.Error("读取响应失败: " + err.Error()) + return "", fmt.Errorf("读取响应失败: %v", err) } // 7. 解析 JSON 数据 var jsonResponse map[string]interface{} if err = json.Unmarshal(body, &jsonResponse); err != nil { - return dto.Error("解析 JSON 失败: " + err.Error()) + return "", fmt.Errorf("解析 JSON 失败: %v", err) } - // 8. 提取 jwcode + // 8. 提取并直接返回 jwcode if data, ok := jsonResponse["data"].(map[string]interface{}); ok { if jwcode, exists := data["jwcode"].(string); exists { - return dto.SuccessWithData(g.Map{"jwcode": jwcode}) + return jwcode, nil // 直接返回 jwcode } } - return dto.Error("响应体中没有 jwcode") + return "", errors.New("响应体中没有 jwcode") } From f72b519ed278f839c6575e721cb3b64a1498b14e Mon Sep 17 00:00:00 2001 From: dhy <1452562016@qq.com> Date: Wed, 18 Dec 2024 19:11:41 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=90=88=E5=B9=B6dhy=E5=88=86=E6=94=AF?= =?UTF-8?q?=E5=86=85=E5=AE=B9=20=E7=AE=A1=E7=90=86=E7=AB=AF-=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E3=80=81=E9=80=80=E5=87=BA=E6=8E=A5=E5=8F=A3=20?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=B7=A5=E5=85=B7=E7=B1=BB-?= =?UTF-8?q?=E8=8E=B7=E5=8F=96token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- link_homework/go.sum | 10 ++++++---- link_homework/internal/cmd/cmd.go | 3 +-- link_homework/internal/logic/logic.go | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/link_homework/go.sum b/link_homework/go.sum index 45393c4..4654ea2 100644 --- a/link_homework/go.sum +++ b/link_homework/go.sum @@ -28,10 +28,12 @@ github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrt github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1 h1:jbaPawkb8qmaYzrmBDbTa8Zkhzacq1RBOZw+qRJExI4= github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1/go.mod h1:s2aI1fV9AvKi4NtMpv3pV0EHtazkvfUNVQmzapr7UJQ= -github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.2 h1:w8EfQgPvKfLBvS1rEFJfirixCRJYiSauOYlrjCZ2Y/Q= -github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.2/go.mod h1:9oQtAMrDDbVIWSSb9NTMAywpZ1cqtywgpzwbHk0lvxM= -github.com/gogf/gf/v2 v2.8.2 h1:4k641rn+hV1COAKygqsqcTm8+lDTkcO8HQ4iBv/uTFs= -github.com/gogf/gf/v2 v2.8.2/go.mod h1:n++xPYGUUMadw6IygLEgGZqc6y6DRLrJKg5kqCrPLWY= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1 h1:1vPFyN0GLv24JD3WGhvKzXvKG+fmuixDTawbtfzCzRQ= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.8.1/go.mod h1:IWyGxzplp06tRc6Ah/eCLuBntnKSw9sn1maH0vzPPtw= +github.com/gogf/gf/v2 v2.8.1 h1:1oVQg3G5OgCats4qWFTH3pHLe92nfUQeUDta05tUs1g= +github.com/gogf/gf/v2 v2.8.1/go.mod h1:6iYuZZ+A0ZcH8+4MDS/P0SvTPCvKzRvyAsY1kbkJYJc= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= diff --git a/link_homework/internal/cmd/cmd.go b/link_homework/internal/cmd/cmd.go index ea1f338..169917a 100644 --- a/link_homework/internal/cmd/cmd.go +++ b/link_homework/internal/cmd/cmd.go @@ -6,13 +6,12 @@ import ( "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gcmd" "link_homework/internal/controller/article" + "link_homework/internal/controller/auth" "link_homework/internal/controller/clientPage" "link_homework/internal/controller/homework" "link_homework/internal/controller/live" "link_homework/internal/controller/record" "link_homework/internal/logic/middleware" - "link_homework/internal/controller/auth" - "link_homework/internal/logic/middleware" ) var ( diff --git a/link_homework/internal/logic/logic.go b/link_homework/internal/logic/logic.go index 8df460e..72a3ed1 100644 --- a/link_homework/internal/logic/logic.go +++ b/link_homework/internal/logic/logic.go @@ -9,7 +9,7 @@ import ( _ "link_homework/internal/logic/client" _ "link_homework/internal/logic/homework" _ "link_homework/internal/logic/live" - _ "link_homework/internal/logic/record" _ "link_homework/internal/logic/login" _ "link_homework/internal/logic/middleware" + _ "link_homework/internal/logic/record" )