Przeglądaj źródła

上传文件,修改个人信息

icole 4 lat temu
rodzic
commit
3943b82f5a

+ 1 - 2
go.mod

@@ -4,8 +4,7 @@ go 1.16
 
 require (
 	git.i2edu.net/i2/go-zero v1.0.1-0.20210616091154-7fac117e009f
-	git.i2edu.net/i2/i2-bill-erp v0.0.0-20210706034218-31bb41a3c753
-	github.com/boombuler/barcode v1.0.1
+	git.i2edu.net/i2/i2-bill-erp v0.0.0-20210706060443-0dc13cb6dbeb
 	github.com/clbanning/mxj v1.8.4 // indirect
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/go-sql-driver/mysql v1.6.0

+ 2 - 4
go.sum

@@ -1,8 +1,8 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 git.i2edu.net/i2/go-zero v1.0.1-0.20210616091154-7fac117e009f h1:zD6rIG7+PhJwYXuQbHyw1pn/z5oUXzrUg9bo9F9+b5k=
 git.i2edu.net/i2/go-zero v1.0.1-0.20210616091154-7fac117e009f/go.mod h1:a9idDtfMmMXrZIHyDg6XnYjWuCpKG0I6zv6Vo9Fpncc=
-git.i2edu.net/i2/i2-bill-erp v0.0.0-20210706034218-31bb41a3c753 h1:dh27ryFaS49faBJMo5j4zdx9YYZKkZkRmsXaQs3bCCI=
-git.i2edu.net/i2/i2-bill-erp v0.0.0-20210706034218-31bb41a3c753/go.mod h1:gYy5Vw881tLNXYyfGeZvmNcpPaVkcVP5MXzE0dTr6Ys=
+git.i2edu.net/i2/i2-bill-erp v0.0.0-20210706060443-0dc13cb6dbeb h1:JD7s0tGKfqiykoiJnrLMdER0XC5JRNDrmQR/cqQKFZU=
+git.i2edu.net/i2/i2-bill-erp v0.0.0-20210706060443-0dc13cb6dbeb/go.mod h1:gYy5Vw881tLNXYyfGeZvmNcpPaVkcVP5MXzE0dTr6Ys=
 gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
 gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
 github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
@@ -37,8 +37,6 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
 github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
 github.com/bndr/gotabulate v1.1.2 h1:yC9izuZEphojb9r+KYL4W9IJKO/ceIO8HDwxMA24U4c=
 github.com/bndr/gotabulate v1.1.2/go.mod h1:0+8yUgaPTtLRTjf49E8oju7ojpU11YmXyvq1LbPAb3U=
-github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
-github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=

+ 13 - 0
i2bill.api

@@ -169,6 +169,9 @@ service i2bill-api {
 	@handler GetUser
 	get /api/user/info returns(infoResponse)
 	
+	@handler UpdateUser
+	post /api/user/update returns(Response)
+	
 	@handler PunchClock
 	post /api/user/punchClock(punchClockRequest) returns(Response)
 	
@@ -242,6 +245,16 @@ service i2bill-api {
 	get  /api/v1/acquirer_mkt_qr/get returns(Response)
 }
 
+//系统
+@server(
+	jwt: JwtAuth
+	group: system
+)
+service i2bill-api {
+	@handler SystemFileUpload
+	post  /api/v1/system_file/upload returns(Response)
+}
+
 // 城市树
 @server(
 	jwt: JwtAuth

+ 17 - 0
internal/handler/routes.go

@@ -14,6 +14,7 @@ import (
 	mkt_network_detail "git.i2edu.net/i2/i2-bill-api/internal/handler/mkt_network_detail"
 	mkt_part_time_user "git.i2edu.net/i2/i2-bill-api/internal/handler/mkt_part_time_user"
 	sys_optionset "git.i2edu.net/i2/i2-bill-api/internal/handler/sys_optionset"
+	system "git.i2edu.net/i2/i2-bill-api/internal/handler/system"
 	user "git.i2edu.net/i2/i2-bill-api/internal/handler/user"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 
@@ -53,6 +54,11 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 				Path:    "/api/user/info",
 				Handler: user.GetUserHandler(serverCtx),
 			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/user/update",
+				Handler: user.UpdateUserHandler(serverCtx),
+			},
 			{
 				Method:  http.MethodPost,
 				Path:    "/api/user/punchClock",
@@ -146,6 +152,17 @@ func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
 		rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
 	)
 
+	engine.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/v1/system_file/upload",
+				Handler: system.SystemFileUploadHandler(serverCtx),
+			},
+		},
+		rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret),
+	)
+
 	engine.AddRoutes(
 		[]rest.Route{
 			{

+ 22 - 0
internal/handler/system/system_file_upload_handler.go

@@ -0,0 +1,22 @@
+package system
+
+import (
+	"net/http"
+
+	"git.i2edu.net/i2/go-zero/rest/httpx"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/system"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+)
+
+func SystemFileUploadHandler(ctx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+
+		l := system.NewSystemFileUploadLogic(r.Context(), ctx)
+		resp, err := l.SystemFileUpload(r)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 22 - 0
internal/handler/user/update_user_handler.go

@@ -0,0 +1,22 @@
+package user
+
+import (
+	"net/http"
+
+	"git.i2edu.net/i2/go-zero/rest/httpx"
+	"git.i2edu.net/i2/i2-bill-api/internal/logic/user"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+)
+
+func UpdateUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+
+		l := user.NewUpdateUserLogic(r.Context(), ctx)
+		resp, err := l.UpdateUser(r)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 18 - 7
internal/logic/auth/login_by_weixin_logic.go

@@ -76,13 +76,13 @@ func (l *LoginByWeixinLogic) LoginByWeixin(req types.LoginByWeixinRequest) (*typ
 
 		user.LastLoginIp = ""
 		user.LastLoginTime = utils.GetTimestamp()
-		_, err = session.Exec(`update i2bill_user set 
-		mobile = ?, avatar = ?, weixin_openid = ?, password = ?, birthday = ?, register_time = ?, last_login_time = ?, 
-		nickname = ?, erp_id = ?, username = ?, gender = ?, user_level_id = ?, register_ip = ?, last_login_ip = ? where id = ?`, user.Mobile, user.Avatar, user.WeixinOpenid, user.Password, user.Birthday, user.RegisterTime, user.LastLoginTime, user.Nickname, user.ErpId, user.Username, user.Gender, user.UserLevelId, user.RegisterIp, user.LastLoginIp, user.Id)
-		if err != nil {
-			logx.Error(err)
-			return err
-		}
+		//_, err = session.Exec(`update i2bill_user set
+		//mobile = ?, avatar = ?, weixin_openid = ?, password = ?, birthday = ?, register_time = ?, last_login_time = ?,
+		//nickname = ?, erp_id = ?, username = ?, gender = ?, user_level_id = ?, register_ip = ?, last_login_ip = ? where id = ?`, user.Mobile, user.Avatar, user.WeixinOpenid, user.Password, user.Birthday, user.RegisterTime, user.LastLoginTime, user.Nickname, user.ErpId, user.Username, user.Gender, user.UserLevelId, user.RegisterIp, user.LastLoginIp, user.Id)
+		//if err != nil {
+		//	logx.Error(err)
+		//	return err
+		//}
 		return nil
 	})
 	if err != nil {
@@ -99,6 +99,17 @@ func (l *LoginByWeixinLogic) LoginByWeixin(req types.LoginByWeixinRequest) (*typ
 		logx.Error(err)
 		return nil, err
 	}
+	//关联兼职
+	partTime := new(model.I2billMktPartTimeXorm)
+	_, err = l.svcCtx.DB.Where("ipone_number = ? and del_flag = 0 and user_id = 0", rtnInfo.UserInfo.Mobile).Get(partTime)
+	if err != nil {
+		logx.Error(err)
+		return nil, err
+	}
+	partTime.UserId = rtnInfo.UserInfo.ID
+	if partTime.Id != 0 {
+		l.svcCtx.DB.ID(partTime.Id).Update(partTime)
+	}
 	rtnInfo.Token = accessToken
 	return &rtnInfo, nil
 }

+ 2 - 4
internal/logic/base_organ/get_erp_city_tree_logic.go

@@ -26,12 +26,10 @@ func NewGetErpCityTreeLogic(ctx context.Context, svcCtx *svc.ServiceContext) Get
 
 func (l *GetErpCityTreeLogic) GetErpCityTree() (*types.Response, error) {
 	// todo: add your logic here and delete this line
-	ctx := context.Background()
-	in := new(transform.Empty)
-	res, err := l.svcCtx.Transformer.GetErpCityTree(ctx, in)
+	res, err := l.svcCtx.GetErpCity()
 	if err != nil {
 		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
-	return &types.Response{200, "", res}, nil
+	return &types.Response{200, "", transform.TreeNodes{Nodes: res}}, nil
 }

+ 2 - 3
internal/logic/base_organ_school/get_erp_sch_tree_logic.go

@@ -26,11 +26,10 @@ func NewGetErpSchTreeLogic(ctx context.Context, svcCtx *svc.ServiceContext) GetE
 
 func (l *GetErpSchTreeLogic) GetErpSchTree() (*types.Response, error) {
 	// todo: add your logic here and delete this line
-	in := new(transform.Empty)
-	res, err := l.svcCtx.Transformer.GetErpOrganSchTree(l.ctx, in)
+	res, err := l.svcCtx.GetErpOrganSchoolTree()
 	if err != nil {
 		logx.Error(err.Error())
 		return &types.Response{500, err.Error(), nil}, nil
 	}
-	return &types.Response{200, "", res}, nil
+	return &types.Response{200, "", transform.TreeNodes{Nodes: res}}, nil
 }

+ 2 - 4
internal/logic/mkt_network_detail/get_erp_mkt_network_detail_logic.go

@@ -26,13 +26,11 @@ func NewGetErpMktNetworkDetailLogic(ctx context.Context, svcCtx *svc.ServiceCont
 
 func (l *GetErpMktNetworkDetailLogic) GetErpMktNetworkDetail() (*types.Response, error) {
 	// todo: add your logic here and delete this line
-	ctx := context.Background()
-	var in = new(transform.Empty)
-	res, err := l.svcCtx.Transformer.GetErpMktNetWorkDetailTree(ctx, in)
+	res, err := l.svcCtx.GetErpNetworkDetailTree()
 	var code = 200
 	var msg string
 	var data interface{}
-	data = res
+	data = transform.TreeNodes{Nodes: res}
 	if err != nil {
 		logx.Error(err.Error())
 		code = 500

+ 60 - 0
internal/logic/system/system_file_upload_logic.go

@@ -0,0 +1,60 @@
+package system
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"net/http"
+	"os"
+	"path/filepath"
+
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/types"
+
+	"git.i2edu.net/i2/go-zero/core/logx"
+)
+
+type SystemFileUploadLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewSystemFileUploadLogic(ctx context.Context, svcCtx *svc.ServiceContext) SystemFileUploadLogic {
+	return SystemFileUploadLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *SystemFileUploadLogic) SystemFileUpload(r *http.Request) (*types.Response, error) {
+	// todo: add your logic here and delete this line
+	userId := l.svcCtx.GetUserIdByJwt(l.ctx)
+	file, fileHeader, err := r.FormFile("file")
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	dir := "asserts/avatar"
+	_, err = os.Stat(dir)
+	if err != nil && !os.IsExist(err) {
+		err := os.MkdirAll(dir, os.ModePerm)
+		if err != nil {
+			logx.Error(err.Error())
+			return &types.Response{500, err.Error(), nil}, nil
+		}
+	}
+	fileName := fmt.Sprintf("%s/%d%s", dir, userId, filepath.Ext(fileHeader.Filename))
+	newFile, err := os.OpenFile(fileName, os.O_TRUNC|os.O_CREATE|os.O_RDWR, 0777)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	_, err = io.Copy(newFile, file)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	return &types.Response{200, "", fileName}, nil
+}

+ 23 - 3
internal/logic/user/get_user_logic.go

@@ -2,11 +2,12 @@ package user
 
 import (
 	"context"
-
+	"fmt"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/types"
 	"git.i2edu.net/i2/i2-bill-api/model"
 	"git.i2edu.net/i2/i2-bill-erp/transform"
+	"strings"
 
 	"git.i2edu.net/i2/go-zero/core/logx"
 )
@@ -29,6 +30,7 @@ func NewGetUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) GetUserLog
 
 func (l *GetUserLogic) GetUser() (*types.InfoResponse, error) {
 	var user model.User
+	info := &types.InfoResponse{}
 	err := l.svcCtx.SqlConn.QueryRowPartial(&user, "select id, erp_id, avatar, birthday, username, nickname, gender, mobile from i2bill_user where `id` = ? limit 1", l.UserId)
 	if err != nil {
 		logx.Error(err)
@@ -49,13 +51,31 @@ func (l *GetUserLogic) GetUser() (*types.InfoResponse, error) {
 			return nil, err
 		}
 		if len(res) > 0 {
+			//兼职信息
+			resp.UserName, _ = res[0]["name"].(string)
+			cityId, _ := res[0]["city_id"].(int64)
+			cityNodes, err := l.svcCtx.GetErpCity()
+			if err != nil {
+				logx.Error(err)
+				return nil, err
+			}
+			for _, node := range cityNodes {
+				if node.Id == cityId {
+					resp.CityName = node.Text
+					break
+				}
+			}
+			resp.Gender = res[0]["sex"].(int64)
 			resp.ErpRoleType = 2
 		} else {
 			resp.ErpRoleType = 0
 		}
-
 	}
-	info := &types.InfoResponse{}
+	if !strings.HasPrefix(user.Avatar, "http") && user.Avatar != "" {
+		domain := strings.TrimRight(l.svcCtx.Config.Domain, "/")
+		filePath := strings.TrimLeft(user.Avatar, "/")
+		user.Avatar = fmt.Sprintf("%s/%s", domain, filePath)
+	}
 	info.ID = user.Id
 	info.Avatar = user.Avatar
 	info.Birthday = user.Birthday

+ 50 - 0
internal/logic/user/update_user_logic.go

@@ -0,0 +1,50 @@
+package user
+
+import (
+	"context"
+	"encoding/json"
+	"git.i2edu.net/i2/i2-bill-api/internal/svc"
+	"git.i2edu.net/i2/i2-bill-api/internal/types"
+	"git.i2edu.net/i2/i2-bill-api/model"
+	"io/ioutil"
+	"net/http"
+
+	"git.i2edu.net/i2/go-zero/core/logx"
+)
+
+type UpdateUserLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewUpdateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) UpdateUserLogic {
+	return UpdateUserLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *UpdateUserLogic) UpdateUser(r *http.Request) (*types.Response, error) {
+	// todo: add your logic here and delete this line
+	userId := l.svcCtx.GetUserIdByJwt(l.ctx)
+	user := new(model.UserXorm)
+	bodyByte, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	err = json.Unmarshal(bodyByte, user)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	user.Id = userId
+	_, err = l.svcCtx.DB.ID(user.Id).Cols("mobile", "avatar").Update(user)
+	if err != nil {
+		logx.Error(err.Error())
+		return &types.Response{500, err.Error(), nil}, nil
+	}
+	return &types.Response{200, "", nil}, nil
+}

+ 1 - 0
internal/svc/cache.go

@@ -8,6 +8,7 @@ const (
 	cacheErpActivity          = "i2bill:cache:erp:activity"
 	cacheErpSchool            = "i2bill:cache:erp:school"
 	cacheErpNetworkDetailTree = "i2bill:cache:erp:network_detail_tree"
+	cacheErpCityTree          = "i2bill:cache:erp:city_tree"
 )
 
 // Cache defined

+ 16 - 0
internal/svc/cache_erp.go

@@ -69,3 +69,19 @@ func (svc *ServiceContext) GetErpActivity() ([]*transform.Active, error) {
 	}
 	return actives, nil
 }
+
+func (svc *ServiceContext) GetErpCity() ([]*transform.TreeNode, error) {
+	var nodes []*transform.TreeNode
+	if err := svc.RdCli.GetCache(cacheErpCityTree, nodes); err != nil {
+		res, err := svc.Transformer.GetErpCityTree(context.Background(), &transform.Empty{})
+		if err != nil {
+			return nil, err
+		}
+		err = svc.RdCli.SetWithExpire(cacheErpCityTree, res.Nodes, time.Hour)
+		if err != nil {
+			return nil, err
+		}
+		return res.Nodes, nil
+	}
+	return nodes, nil
+}

+ 2 - 1
internal/utils/utils.go

@@ -7,6 +7,7 @@ import (
 	"hash/crc32"
 	"reflect"
 	"strconv"
+	"strings"
 	"time"
 
 	uuid "github.com/satori/go.uuid"
@@ -135,7 +136,7 @@ func TreePath(nodes []*transform.TreeNode, tagId int64, idPath, namePath *string
 	for _, node := range nodes {
 		if node.Id == tagId {
 			*idPath = *idPath + "," + fmt.Sprintf("%d", node.Id)
-			*namePath = *namePath + "," + node.Text
+			*namePath = strings.TrimLeft(*namePath+","+node.Text, ",")
 			return true
 		}
 		if node.Nodes != nil {

+ 1 - 1
model/i2bill_user_model.go

@@ -253,7 +253,7 @@ func GetErpUser(mobile string, erpUserId string, rpcClient transformclient.Trans
 	if erpRoles.UserId != "" {
 		roles := strings.Split(erpRoles.Role, ",")
 		for _, r := range roles {
-			if r == "LAMK" || r == "LAMKM" || r == "student/readingStudent" {
+			if r == "LAMK" || r == "LAMKM" || r == "student/readingStudent" || r == "LATMK" {
 				return erpRoles.UserId, nil
 			}
 		}