From a77fe77e79b921e013fd7f5048411f9dcdeacfb4 Mon Sep 17 00:00:00 2001 From: wsczx Date: Sat, 22 Oct 2022 20:36:10 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E8=BF=87excel?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF=E6=8C=81=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=90=8E=E8=87=AA=E5=8A=A8=E5=8F=91=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/admin/api_group.go | 4 +- server/admin/api_ip_map.go | 4 +- server/admin/api_other.go | 6 +- server/admin/api_policy.go | 4 +- server/admin/api_user.go | 28 +++++++++- server/admin/resp_test.go | 6 +- server/admin/server.go | 1 + server/admin/uploaduser.go | 70 ++++++++++++++++++++++++ server/conf/files/批量添加用户模版.xlsx | Bin 0 -> 14214 bytes server/go.mod | 12 +++- server/go.sum | 25 ++++++++- web/src/pages/user/List.vue | 30 +++++++++- 12 files changed, 168 insertions(+), 22 deletions(-) create mode 100755 server/admin/uploaduser.go create mode 100755 server/conf/files/批量添加用户模版.xlsx diff --git a/server/admin/api_group.go b/server/admin/api_group.go index f5975c1..8f9a01d 100644 --- a/server/admin/api_group.go +++ b/server/admin/api_group.go @@ -2,7 +2,7 @@ package admin import ( "encoding/json" - "io/ioutil" + "io" "net/http" "strconv" @@ -79,7 +79,7 @@ func GroupDetail(w http.ResponseWriter, r *http.Request) { } func GroupSet(w http.ResponseWriter, r *http.Request) { - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { RespError(w, RespInternalErr, err) return diff --git a/server/admin/api_ip_map.go b/server/admin/api_ip_map.go index 49aeb85..b2339a9 100644 --- a/server/admin/api_ip_map.go +++ b/server/admin/api_ip_map.go @@ -2,7 +2,7 @@ package admin import ( "encoding/json" - "io/ioutil" + "io" "net/http" "strconv" @@ -59,7 +59,7 @@ func UserIpMapDetail(w http.ResponseWriter, r *http.Request) { func UserIpMapSet(w http.ResponseWriter, r *http.Request) { _ = r.ParseForm() - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { RespError(w, RespInternalErr, err) return diff --git a/server/admin/api_other.go b/server/admin/api_other.go index 234a220..20f6f27 100644 --- a/server/admin/api_other.go +++ b/server/admin/api_other.go @@ -3,7 +3,7 @@ package admin import ( "encoding/json" "errors" - "io/ioutil" + "io" "net/http" "regexp" @@ -20,7 +20,7 @@ func setOtherGet(data interface{}, w http.ResponseWriter) { } func setOtherEdit(data interface{}, w http.ResponseWriter, r *http.Request) { - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { RespError(w, RespInternalErr, err) return @@ -73,7 +73,7 @@ func SetOtherAuditLog(w http.ResponseWriter, r *http.Request) { } func SetOtherAuditLogEdit(w http.ResponseWriter, r *http.Request) { - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { RespError(w, RespInternalErr, err) return diff --git a/server/admin/api_policy.go b/server/admin/api_policy.go index a4934c9..2adc512 100644 --- a/server/admin/api_policy.go +++ b/server/admin/api_policy.go @@ -2,7 +2,7 @@ package admin import ( "encoding/json" - "io/ioutil" + "io" "net/http" "strconv" @@ -57,7 +57,7 @@ func PolicyDetail(w http.ResponseWriter, r *http.Request) { } func PolicySet(w http.ResponseWriter, r *http.Request) { - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { RespError(w, RespInternalErr, err) return diff --git a/server/admin/api_user.go b/server/admin/api_user.go index f58efe9..4b8ceef 100644 --- a/server/admin/api_user.go +++ b/server/admin/api_user.go @@ -5,9 +5,10 @@ import ( "encoding/base64" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "net/url" + "os" "strconv" "strings" "text/template" @@ -80,7 +81,7 @@ func UserDetail(w http.ResponseWriter, r *http.Request) { func UserSet(w http.ResponseWriter, r *http.Request) { _ = r.ParseForm() - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { RespError(w, RespInternalErr, err) return @@ -111,7 +112,28 @@ func UserSet(w http.ResponseWriter, r *http.Request) { sessdata.CloseUserLimittimeSession() RespSucess(w, nil) } - +func UserUpload(w http.ResponseWriter, r *http.Request) { + r.ParseMultipartForm(8 << 20) + file, header, err := r.FormFile("file") + if err != nil || !strings.Contains(header.Filename, ".xlsx") || !strings.Contains(header.Filename, ".xls") { + RespError(w, RespInternalErr, "文件解析失败:仅支持xlsx或xls文件") + return + } + defer file.Close() + newFile, err := os.Create(base.Cfg.FilesPath + header.Filename) + if err != nil { + RespError(w, RespInternalErr, "创建文件失败:", err) + return + } + defer newFile.Close() + io.Copy(newFile, file) + if err = UploadUser(newFile.Name()); err != nil { + RespError(w, RespInternalErr, err) + return + } + os.Remove(base.Cfg.FilesPath + header.Filename) + RespSucess(w, "批量添加成功") +} func UserDel(w http.ResponseWriter, r *http.Request) { _ = r.ParseForm() idS := r.FormValue("id") diff --git a/server/admin/resp_test.go b/server/admin/resp_test.go index 4d3dd60..b4dbd53 100644 --- a/server/admin/resp_test.go +++ b/server/admin/resp_test.go @@ -2,7 +2,7 @@ package admin import ( "encoding/json" - "io/ioutil" + "io" "net/http/httptest" "testing" @@ -15,7 +15,7 @@ func TestRespSucess(t *testing.T) { RespSucess(w, "data") // fmt.Println(w) assert.Equal(w.Code, 200) - body, _ := ioutil.ReadAll(w.Body) + body, _ := io.ReadAll(w.Body) res := Resp{} err := json.Unmarshal(body, &res) assert.Nil(err) @@ -30,7 +30,7 @@ func TestRespError(t *testing.T) { RespError(w, 10, "err-msg") // fmt.Println(w) assert.Equal(w.Code, 200) - body, _ := ioutil.ReadAll(w.Body) + body, _ := io.ReadAll(w.Body) res := Resp{} err := json.Unmarshal(body, &res) assert.Nil(err) diff --git a/server/admin/server.go b/server/admin/server.go index d4939e0..50a24ce 100644 --- a/server/admin/server.go +++ b/server/admin/server.go @@ -49,6 +49,7 @@ func StartAdmin() { r.HandleFunc("/user/list", UserList) r.HandleFunc("/user/detail", UserDetail) r.HandleFunc("/user/set", UserSet) + r.HandleFunc("/user/uploaduser", UserUpload).Methods(http.MethodPost) r.HandleFunc("/user/del", UserDel) r.HandleFunc("/user/online", UserOnline) r.HandleFunc("/user/offline", UserOffline) diff --git a/server/admin/uploaduser.go b/server/admin/uploaduser.go new file mode 100755 index 0000000..6970ce3 --- /dev/null +++ b/server/admin/uploaduser.go @@ -0,0 +1,70 @@ +package admin + +import ( + "fmt" + "strconv" + "time" + + "github.com/bjdgyc/anylink/dbdata" + "github.com/bjdgyc/anylink/pkg/utils" + "github.com/xuri/excelize/v2" +) + +func UploadUser(file string) error { + user := &dbdata.User{} + f, err := excelize.OpenFile(file) + if err != nil { + return err + } + defer func() { + if err := f.Close(); err != nil { + return + } + }() + rows, err := f.GetRows("Sheet1") + if err != nil { + return err + } + if rows[0][0] != "id" || rows[0][1] != "username" || rows[0][2] != "nickname" || rows[0][3] != "email" || rows[0][4] != "pin_code" || rows[0][5] != "limittime" || rows[0][6] != "otp_secret" || rows[0][7] != "disable_otp" || rows[0][8] != "groups" || rows[0][9] != "status" || rows[0][10] != "send_email" { + return fmt.Errorf("批量添加失败,表格格式不正确") + } + for index, row := range rows[:] { + if index == 0 { + continue + } + id, _ := strconv.Atoi(row[0]) + if len(row[4]) < 6 { + row[4] = utils.RandomRunes(8) + } + limittime, _ := time.Parse("2006-01-02 15:04:05", row[5]) + disableOtp, _ := strconv.ParseBool(row[7]) + group := []string{row[8]} + status, _ := strconv.Atoi(row[9]) + sendmail, _ := strconv.ParseBool(row[10]) + // createdAt, _ := time.Parse("2006-01-02 03:04:05", row[11]) + // updatedAt, _ := time.Parse("2006-01-02 03:04:05", row[12]) + user = &dbdata.User{ + Id: id, + Username: row[1], + Nickname: row[2], + Email: row[3], + PinCode: row[4], + LimitTime: &limittime, + OtpSecret: row[6], + DisableOtp: disableOtp, + Groups: group, + Status: int8(status), + SendEmail: sendmail, + // CreatedAt: createdAt, + // UpdatedAt: updatedAt, + } + if err := dbdata.AddBatch(user); err != nil { + return fmt.Errorf("请检查是否导入有重复用户") + } + } + if user.SendEmail { + err := userAccountMail(user) + return err + } + return nil +} diff --git a/server/conf/files/批量添加用户模版.xlsx b/server/conf/files/批量添加用户模版.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..a3cf8c3cda369aac4958ddc88b67b578def9e829 GIT binary patch literal 14214 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 ZbADtcz`n;aR3KC!QZOJOafWB@{|9s{;b8y( literal 0 HcmV?d00001 diff --git a/server/go.mod b/server/go.mod index 7aa6ebc..caf2dff 100644 --- a/server/go.mod +++ b/server/go.mod @@ -28,9 +28,10 @@ require ( github.com/stretchr/testify v1.8.0 github.com/xhit/go-simple-mail/v2 v2.10.0 github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119 + github.com/xuri/excelize/v2 v2.6.1 go.uber.org/atomic v1.10.0 - golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f - golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 + golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 + golang.org/x/net v0.0.0-20220812174116-3211cb980234 golang.org/x/text v0.3.7 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac layeh.com/radius v0.0.0-20210819152912-ad72663a72ab @@ -53,10 +54,13 @@ require ( github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/pelletier/go-toml v1.9.3 // indirect github.com/pion/transport v0.13.0 // indirect github.com/pion/udp v0.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/richardlehane/mscfb v1.0.4 // indirect + github.com/richardlehane/msoleps v1.0.3 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/spf13/afero v1.6.0 // indirect github.com/spf13/cast v1.3.1 // indirect @@ -66,8 +70,10 @@ require ( github.com/syndtr/goleveldb v1.0.0 // indirect github.com/tklauser/go-sysconf v0.3.7 // indirect github.com/tklauser/numcpus v0.2.3 // indirect + github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect + github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect + golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/server/go.sum b/server/go.sum index 5371b25..df5d139 100644 --- a/server/go.sum +++ b/server/go.sum @@ -394,6 +394,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -464,6 +466,11 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= +github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= +github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -544,6 +551,12 @@ github.com/xhit/go-simple-mail/v2 v2.10.0/go.mod h1:kA1XbQfCI4JxQ9ccSN6VFyIEkkug github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119 h1:YyPWX3jLOtYKulBR6AScGIs74lLrJcgeKRwcbAuQOG4= github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119/go.mod h1:/nuTSlK+okRfR/vnIPqR89fFKonnWPiZymN5ydRJkX8= +github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c= +github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/excelize/v2 v2.6.1 h1:ICBdtw803rmhLN3zfvyEGH3cwSmZv+kde7LhTDT659k= +github.com/xuri/excelize/v2 v2.6.1/go.mod h1:tL+0m6DNwSXj/sILHbQTYsLi9IF4TW59H2EF3Yrx1AU= +github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M= +github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -598,8 +611,9 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 h1:GIAS/yBem/gq2MUqgNIzUHW7cJMmx3TGZOrnyYaNQ6c= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -612,6 +626,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE= +golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -681,8 +697,9 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= +golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -767,8 +784,9 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -992,6 +1010,7 @@ 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.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/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= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/web/src/pages/user/List.vue b/web/src/pages/user/List.vue index 4ae0aae..9207797 100644 --- a/web/src/pages/user/List.vue +++ b/web/src/pages/user/List.vue @@ -10,7 +10,17 @@ @click="handleEdit('')">添加 - + + + 批量添加 + + @@ -297,6 +307,24 @@ export default { }, methods: { + upLoadUser(item) { + const formData = new FormData(); + formData.append("file", item.file); + axios.post('/user/uploaduser', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }).then(resp => { + if (resp.data.code === 0) { + this.$message.success(resp.data.data); + this.getData(1); + } else { + this.$message.error(resp.data.msg); + this.getData(1); + } + console.log(resp.data); + }) + }, getOtpImg(row) { // this.base64Img = Buffer.from(data).toString('base64'); this.otpImgData.visible = true From a8d0a39ca049669be5e249d13ee95710ad8a16a0 Mon Sep 17 00:00:00 2001 From: wsczx Date: Sat, 22 Oct 2022 21:05:20 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dint=E8=BD=ACint8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/admin/uploaduser.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/admin/uploaduser.go b/server/admin/uploaduser.go index 6970ce3..3b4fe98 100755 --- a/server/admin/uploaduser.go +++ b/server/admin/uploaduser.go @@ -39,7 +39,8 @@ func UploadUser(file string) error { limittime, _ := time.Parse("2006-01-02 15:04:05", row[5]) disableOtp, _ := strconv.ParseBool(row[7]) group := []string{row[8]} - status, _ := strconv.Atoi(row[9]) + s, _ := strconv.Atoi(row[9]) + status := int8(s) sendmail, _ := strconv.ParseBool(row[10]) // createdAt, _ := time.Parse("2006-01-02 03:04:05", row[11]) // updatedAt, _ := time.Parse("2006-01-02 03:04:05", row[12]) @@ -53,7 +54,7 @@ func UploadUser(file string) error { OtpSecret: row[6], DisableOtp: disableOtp, Groups: group, - Status: int8(status), + Status: status, SendEmail: sendmail, // CreatedAt: createdAt, // UpdatedAt: updatedAt, From c68374f4f0be917d897f90e5393d22f37551088b Mon Sep 17 00:00:00 2001 From: wsczx Date: Sat, 22 Oct 2022 22:06:12 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=BC=BA=E8=BD=ACint8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/admin/api_user.go | 1 + server/admin/uploaduser.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/server/admin/api_user.go b/server/admin/api_user.go index 4b8ceef..4d075bd 100644 --- a/server/admin/api_user.go +++ b/server/admin/api_user.go @@ -129,6 +129,7 @@ func UserUpload(w http.ResponseWriter, r *http.Request) { io.Copy(newFile, file) if err = UploadUser(newFile.Name()); err != nil { RespError(w, RespInternalErr, err) + os.Remove(base.Cfg.FilesPath + header.Filename) return } os.Remove(base.Cfg.FilesPath + header.Filename) diff --git a/server/admin/uploaduser.go b/server/admin/uploaduser.go index 3b4fe98..de8e511 100755 --- a/server/admin/uploaduser.go +++ b/server/admin/uploaduser.go @@ -7,6 +7,7 @@ import ( "github.com/bjdgyc/anylink/dbdata" "github.com/bjdgyc/anylink/pkg/utils" + "github.com/spf13/cast" "github.com/xuri/excelize/v2" ) @@ -39,8 +40,7 @@ func UploadUser(file string) error { limittime, _ := time.Parse("2006-01-02 15:04:05", row[5]) disableOtp, _ := strconv.ParseBool(row[7]) group := []string{row[8]} - s, _ := strconv.Atoi(row[9]) - status := int8(s) + status := cast.ToInt8(row[9]) sendmail, _ := strconv.ParseBool(row[10]) // createdAt, _ := time.Parse("2006-01-02 03:04:05", row[11]) // updatedAt, _ := time.Parse("2006-01-02 03:04:05", row[12]) From 77518a3a0ca336a36478f1823b759a486b4fab67 Mon Sep 17 00:00:00 2001 From: wsczx Date: Sat, 22 Oct 2022 22:12:49 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0go=20mod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/go.mod b/server/go.mod index caf2dff..5a79c53 100644 --- a/server/go.mod +++ b/server/go.mod @@ -23,6 +23,7 @@ require ( github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/songgao/packets v0.0.0-20160404182456-549a10cd4091 github.com/songgao/water v0.0.0-20200317203138-2b4b6d7c09d8 + github.com/spf13/cast v1.3.1 github.com/spf13/cobra v1.2.1 github.com/spf13/viper v1.8.1 github.com/stretchr/testify v1.8.0 @@ -63,7 +64,6 @@ require ( github.com/richardlehane/msoleps v1.0.3 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/spf13/afero v1.6.0 // indirect - github.com/spf13/cast v1.3.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.2.0 // indirect From 7b190108925df9f91827e1b2cb6b302d667eb87f Mon Sep 17 00:00:00 2001 From: wsczx Date: Sat, 22 Oct 2022 22:22:27 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=9B=B8=E5=B7=AE8=E5=B0=8F=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/admin/uploaduser.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/admin/uploaduser.go b/server/admin/uploaduser.go index de8e511..4f904bf 100755 --- a/server/admin/uploaduser.go +++ b/server/admin/uploaduser.go @@ -37,13 +37,13 @@ func UploadUser(file string) error { if len(row[4]) < 6 { row[4] = utils.RandomRunes(8) } - limittime, _ := time.Parse("2006-01-02 15:04:05", row[5]) + limittime, _ := time.ParseInLocation("2006-01-02 15:04:05", row[5], time.Local) disableOtp, _ := strconv.ParseBool(row[7]) group := []string{row[8]} status := cast.ToInt8(row[9]) sendmail, _ := strconv.ParseBool(row[10]) - // createdAt, _ := time.Parse("2006-01-02 03:04:05", row[11]) - // updatedAt, _ := time.Parse("2006-01-02 03:04:05", row[12]) + // createdAt, _ := time.ParseInLocation("2006-01-02 15:04:05", row[11], time.Local) + // updatedAt, _ := time.ParseInLocation("2006-01-02 15:04:05", row[12], time.Local) user = &dbdata.User{ Id: id, Username: row[1],