forked from free-lancers/electricity_bill_calc_service
		
	new:新增withdraw请求,该暂无真实数据
This commit is contained in:
		
							
								
								
									
										11
									
								
								.idea/dataSources.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.idea/dataSources.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="DataSourceManagerImpl" format="xml" multifile-model="true"> | ||||
|     <data-source source="LOCAL" name="PostgreSQL - postgres@39.105.39.8" uuid="996b1b9f-5c40-4bd6-8c3c-0af67aaaa15d"> | ||||
|       <driver-ref>postgresql</driver-ref> | ||||
|       <synchronize>true</synchronize> | ||||
|       <jdbc-driver>org.postgresql.Driver</jdbc-driver> | ||||
|       <jdbc-url>jdbc:postgresql://39.105.39.8:9432/postgres</jdbc-url> | ||||
|     </data-source> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										8
									
								
								.idea/electricity_bill_calc_service.iml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.idea/electricity_bill_calc_service.iml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <module type="WEB_MODULE" version="4"> | ||||
|   <component name="NewModuleRootManager"> | ||||
|     <content url="file://$MODULE_DIR$" /> | ||||
|     <orderEntry type="inheritedJdk" /> | ||||
|     <orderEntry type="sourceFolder" forTests="false" /> | ||||
|   </component> | ||||
| </module> | ||||
							
								
								
									
										6
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="JavaScriptSettings"> | ||||
|     <option name="languageLevel" value="ES6" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										8
									
								
								.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="ProjectModuleManager"> | ||||
|     <modules> | ||||
|       <module fileurl="file://$PROJECT_DIR$/.idea/electricity_bill_calc_service.iml" filepath="$PROJECT_DIR$/.idea/electricity_bill_calc_service.iml" /> | ||||
|     </modules> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										6
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="VcsDirectoryMappings"> | ||||
|     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||||
|   </component> | ||||
| </project> | ||||
| @@ -42,34 +42,35 @@ type _LoginForm struct { | ||||
| } | ||||
|  | ||||
| func doLogin(c *fiber.Ctx) error { | ||||
| 	result := response.NewResult(c) | ||||
| 	loginData := new(_LoginForm) | ||||
| 	if err := c.BodyParser(loginData); err != nil { | ||||
| 	result := response.NewResult(c)                 //创建一个相应结果对象 | ||||
| 	loginData := new(_LoginForm)                    //创建一个解析登录表单数据的实体 | ||||
| 	if err := c.BodyParser(loginData); err != nil { //解析请求体中的Json数据到loginData里,如果解析出错就返回错误 | ||||
| 		userLog.Error("表单解析失败!", zap.Error(err)) | ||||
| 		return result.Error(http.StatusInternalServerError, "表单解析失败。") | ||||
| 		return result.Error(http.StatusInternalServerError, "表单解析失败。") //返回一个内部服务器错误的相应结果 | ||||
| 	} | ||||
| 	var ( | ||||
| 		session *model.Session | ||||
| 		err     error | ||||
| 	) | ||||
| 	userLog.Info("有用户请求登录。", zap.String("username", loginData.Username), zap.Int16("type", loginData.Type)) | ||||
| 	if loginData.Type == model.USER_TYPE_ENT { | ||||
| 		session, err = service.UserService.ProcessEnterpriseUserLogin(loginData.Username, loginData.Password) | ||||
| 	userLog.Info("有用户请求登录。", zap.String("username", loginData.Username), zap.Int16("type", loginData.Type)) //记录日志相关信息 | ||||
| 	if loginData.Type == model.USER_TYPE_ENT {                                                              //根据登录类型选择不同的处理方法 | ||||
| 		session, err = service.UserService.ProcessEnterpriseUserLogin(loginData.Username, loginData.Password) //企业用户 | ||||
| 	} else { | ||||
| 		session, err = service.UserService.ProcessManagementUserLogin(loginData.Username, loginData.Password) | ||||
| 		userLog.Info("该用户是管理用户") | ||||
| 		session, err = service.UserService.ProcessManagementUserLogin(loginData.Username, loginData.Password) //管理用户 | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		if authError, ok := err.(*exceptions.AuthenticationError); ok { | ||||
| 			if authError.NeedReset { | ||||
| 		if authError, ok := err.(*exceptions.AuthenticationError); ok { //检查错误是否为身份验证错误 | ||||
| 			if authError.NeedReset { //如果需要重置密码则返回对应结果 | ||||
| 				return result.LoginNeedReset() | ||||
| 			} | ||||
| 			return result.Error(int(authError.Code), authError.Message) | ||||
| 			return result.Error(int(authError.Code), authError.Message) //返回身份验证错误相应 | ||||
| 		} else { | ||||
| 			userLog.Error("用户登录请求处理失败!", zap.Error(err)) | ||||
| 			return result.Error(http.StatusInternalServerError, err.Error()) | ||||
| 			return result.Error(http.StatusInternalServerError, err.Error()) //返回内部服务器错误 | ||||
| 		} | ||||
| 	} | ||||
| 	return result.LoginSuccess(session) | ||||
| 	return result.LoginSuccess(session) //返回登录成功相应结果,包含会话信息 | ||||
| } | ||||
|  | ||||
| func doLogout(c *fiber.Ctx) error { | ||||
|   | ||||
							
								
								
									
										74
									
								
								controller/withdraw.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								controller/withdraw.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"electricity_bill_calc/logger" | ||||
| 	"electricity_bill_calc/response" | ||||
| 	"github.com/gofiber/fiber/v2" | ||||
| 	"go.uber.org/zap" | ||||
| ) | ||||
|  | ||||
| var withdrawLog = logger.Named("Handler", "Withdraw") | ||||
|  | ||||
| func InitializeWithdrawHandlers(router *fiber.App) { | ||||
| 	router.Get("/withdraw", withdraw) | ||||
| } | ||||
|  | ||||
| //用于检索用户的核算报表 | ||||
| func withdraw(c *fiber.Ctx) error { | ||||
| 	//记录日志 | ||||
| 	withdrawLog.Info("带分页的待审核的核算撤回申请列表") | ||||
| 	//获取请求参数 | ||||
| 	result := response.NewResult(c) | ||||
| 	keyword := c.Query("keyword", "") | ||||
| 	page := c.QueryInt("page", 1) | ||||
| 	withdrawLog.Info("参数为: ", zap.String("keyword", keyword), zap.Int("page", page)) | ||||
| 	//中间数据库操作暂且省略。。。。 | ||||
| 	//首先进行核算报表的分页查询 | ||||
|  | ||||
| 	//TODO: 2023-07-18 此处的data需要经过上面数据库查询后进行数据返回,此处只是作于演示 | ||||
| 	data := fiber.Map{ | ||||
| 		"report": fiber.Map{ | ||||
| 			"id":                    "string", | ||||
| 			"parkId":                "string", | ||||
| 			"periodBegin":           "string", | ||||
| 			"periodEnd":             "string", | ||||
| 			"published":             true, | ||||
| 			"publishedAt":           "string", | ||||
| 			"withdraw":              0, | ||||
| 			"lastWithdrawAppliedAt": "string", | ||||
| 			"lastWithdrawAuditAt":   "string", | ||||
| 			"status":                0, | ||||
| 			"message":               "string", | ||||
| 		}, | ||||
| 		"park": fiber.Map{ | ||||
| 			"id":            "string", | ||||
| 			"userId":        "string", | ||||
| 			"name":          "string", | ||||
| 			"tenement":      "string", | ||||
| 			"area":          "string", | ||||
| 			"capacity":      "string", | ||||
| 			"category":      0, | ||||
| 			"meter04kvType": 0, | ||||
| 			"region":        "string", | ||||
| 			"address":       "string", | ||||
| 			"contact":       "string", | ||||
| 			"phone":         "string", | ||||
| 		}, | ||||
| 		"user": fiber.Map{ | ||||
| 			"id":      "string", | ||||
| 			"name":    "string", | ||||
| 			"contact": "string", | ||||
| 			"phone":   "string", | ||||
| 			"region":  "string", | ||||
| 			"address": "string", | ||||
| 		}, | ||||
| 	} | ||||
| 	datas := make([]interface{}, 0) | ||||
| 	datas = append(datas, data) | ||||
| 	//TODO: 2023-07-18 此处返回值是个示例,具体返回值需要查询数据库 | ||||
| 	return result.Success( | ||||
| 		"withdraw请求成功", | ||||
| 		response.NewPagedResponse(page, 20).ToMap(), | ||||
| 		fiber.Map{"records": datas}, | ||||
| 	) | ||||
| } | ||||
							
								
								
									
										13
									
								
								doc/routerSetting.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								doc/routerSetting.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| ## fiber | ||||
| #### fiber实例 | ||||
| - app(是fiber创建的实例通常用app表示,其中有可选配置选项) | ||||
|     - BodyLimit 设置请求正文允许的最大大小(默认为4 * 1024 * 1024) | ||||
|     - EnablePrintRoutes 不打印框架自带日志(默认false) | ||||
|     - EnableTrustedProxyCheck 禁用受信代理(默认false) | ||||
|     - Prefork 预处理配置(默认false) | ||||
|     - ErrorHandler 全局错误处理 (默认false) | ||||
|     - JSONEncoder json编码 (默认json.Marshal) | ||||
|     - JSONDecoder json解码  (默认json.Unmarshal) | ||||
|     - 。。。。。。。。(还有很多配置) | ||||
| - Use(中间件设置,一个或者多个) | ||||
| - Group(类似于gin框架中的路由分组) | ||||
| @@ -53,6 +53,9 @@ func (ql QueryLogger) TraceQueryStart(ctx context.Context, conn *pgx.Conn, data | ||||
| 	ql.logger.Info("查询参数", lo.Map(data.Args, func(elem any, index int) zap.Field { | ||||
| 		return zap.Any(fmt.Sprintf("[Arg %d]: ", index), elem) | ||||
| 	})...) | ||||
| 	//	for index, arg := range data.Args { | ||||
| 	//		ql.logger.Info(fmt.Sprintf("[Arg %d]: %v", index, arg)) | ||||
| 	//	} | ||||
| 	return ctx | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -15,10 +15,13 @@ var ( | ||||
|  | ||||
| func SetupRedisConnection() error { | ||||
| 	var err error | ||||
| 	a := fmt.Sprintf("%s:%d", config.RedisSettings.Host, config.RedisSettings.Port) | ||||
| 	fmt.Println(a) | ||||
| 	Rd, err = rueidis.NewClient(rueidis.ClientOption{ | ||||
| 		InitAddress: []string{fmt.Sprintf("%s:%d", config.RedisSettings.Host, config.RedisSettings.Port)}, | ||||
| 		Password:    config.RedisSettings.Password, | ||||
| 		InitAddress: []string{"127.0.0.1:6379"}, | ||||
| 		Password:    "", | ||||
| 		SelectDB:    config.RedisSettings.DB, | ||||
| 		DisableCache:true, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
|   | ||||
| @@ -16,7 +16,7 @@ type LoginResponse struct { | ||||
| func (r Result) LoginSuccess(session *model.Session) error { | ||||
| 	res := &LoginResponse{} | ||||
| 	res.Code = http.StatusOK | ||||
| 	res.Message = "用户已成功登录。" | ||||
| 	res.Message = "用户已成功登录。"+ "👋!" | ||||
| 	res.NeedReset = false | ||||
| 	res.Session = session | ||||
| 	return r.Ctx.Status(fiber.StatusOK).JSON(res) | ||||
|   | ||||
| @@ -25,24 +25,24 @@ func init() { | ||||
| } | ||||
|  | ||||
| func App() *fiber.App { | ||||
| 	app := fiber.New(fiber.Config{ | ||||
| 		BodyLimit:               30 * 1024 * 1024, | ||||
| 		EnablePrintRoutes:       true, | ||||
| 		EnableTrustedProxyCheck: false, | ||||
| 		Prefork:                 false, | ||||
| 		ErrorHandler:            errorHandler, | ||||
| 		JSONEncoder:             json.Marshal, | ||||
| 		JSONDecoder:             json.Unmarshal, | ||||
| 	app := fiber.New(fiber.Config{ //创建fiber实例的时候选择配置选项 | ||||
| 		BodyLimit:               30 * 1024 * 1024, //设置请求正文允许的最大大小。 | ||||
| 		EnablePrintRoutes:       true,             //自定义方案,用于启动消息 | ||||
| 		EnableTrustedProxyCheck: false,            //禁用受信代理 | ||||
| 		Prefork:                 false,            //禁止预处理(如果要启用预处理则需要通过shell脚本运行) | ||||
| 		ErrorHandler:            errorHandler,     //相应全局处理错误 | ||||
| 		JSONEncoder:             json.Marshal,     //json编码 | ||||
| 		JSONDecoder:             json.Unmarshal,   //json解码 | ||||
| 	}) | ||||
| 	app.Use(compress.New()) | ||||
| 	app.Use(compress.New())	//压缩中间件 | ||||
| 	app.Use(recover.New(recover.Config{ | ||||
| 		EnableStackTrace:  true, | ||||
| 		StackTraceHandler: stackTraceHandler, | ||||
| 	})) | ||||
| 	}))	//恢复中间件 | ||||
| 	app.Use(logger.NewLogMiddleware(logger.LogMiddlewareConfig{ | ||||
| 		Logger: logger.Named("App"), | ||||
| 	})) | ||||
| 	app.Use(security.SessionRecovery) | ||||
| 	}))	//日志中间件 | ||||
| 	app.Use(security.SessionRecovery)	//会话恢复中间件 | ||||
|  | ||||
| 	controller.InitializeUserHandlers(app) | ||||
| 	controller.InitializeRegionHandlers(app) | ||||
| @@ -53,6 +53,7 @@ func App() *fiber.App { | ||||
| 	controller.InitializeInvoiceHandler(app) | ||||
| 	controller.InitializeTopUpHandlers(app) | ||||
| 	controller.InitializeReportHandlers(app) | ||||
| 	controller.InitializeWithdrawHandlers(app) | ||||
|  | ||||
| 	return app | ||||
| } | ||||
|   | ||||
| @@ -80,7 +80,7 @@ func (us _UserService) ProcessEnterpriseUserLogin(username, password string) (*m | ||||
| 		us.log.Error("处理企业用户登录失败。", zap.String("username", username), zap.Error(err)) | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	token, _ := uuid.NewRandom() | ||||
| 	token, _ := uuid.NewRandom() //生成uuid作为会话的token使用 | ||||
| 	userSession := &model.Session{ | ||||
| 		Uid:       user.Id, | ||||
| 		Name:      user.Username, | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| Database: | ||||
|   User: electricity | ||||
|   Pass: nLgxPO5s8gK2tR0OL0Q | ||||
|   Host: postgres | ||||
|   Port: 5432 | ||||
|   Host: 39.105.39.8 | ||||
|   Port: 9432 | ||||
|   DB: electricity | ||||
|   MaxIdleConns: 0 | ||||
|   MaxOpenConns: 20 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user