"package trip\n\nimport (\n\t"context"\n\trentalpb "rentCar/server/rental/api/gen/v1"\n\t"rentCar/server/rental/trip/dao"\n\t"rentCar/server/shared/auth"\n\t"rentCar/server/shared/id"\n\n\t"go.uber.org/zap"\n\t"google.golang.org/grpc/codes"\n\t"google.golang.org/grpc/status"\n)\n\n// 处理行程服务逻辑\ntype Service struct {\n\tMongo *dao.Mongo\n\tLogger *zap.Logger\n\tProfileManager ProfileManager\n\tCarManager CarManager\n\tPOIManager POIManager\n}\n\n// ACL\ntype ProfileManager interface {\n\tVerify(context.Context, id.AccountID) (id.IdentityID, error)\n}\n\ntype CarManager interface {\n\tVerify(context.Context, id.CarID, *rentalpb.Location) error\n\tUnlock(context.Context, id.CarID) error\n}\n\ntype POIManager interface {\n\tResolve(context.Context, *rentalpb.Location) (string, error)\n}\n\nfunc (s *Service) GetTrip(c context.Context, req *rentalpb.GetTripRequest) (*rentalpb.Trip, error) {\n\treturn nil, status.Error(codes.Unimplemented, "")\n}\nfunc (s *Service) GetTrips(c context.Context, req *rentalpb.GetTripsRequest) (*rentalpb.GetTripsResponse, error) {\n\treturn nil, status.Error(codes.Unimplemented, "")\n}\nfunc (s *Service) UpdateTrip(c context.Context, req *rentalpb.UpdateTripRequest) (*rentalpb.Trip, error) {\n\taid, err := auth.AccountIDFromContext(c)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttid := id.TripID(req.Id)\n\ttr, _ := s.Mongo.GetTrip(c, tid, aid)\n\n\tif req.Current != nil {\n\t\ttr.Trip.Current = s.calcCurrentStatus(tr.Trip, req.Current)\n\t}\n\tif req.EndTrip {\n\t\ttr.Trip.End = tr.Trip.Current\n\t\ttr.Trip.Status = rentalpb.TripStatus_FINISHED\n\t}\n\n\ts.Mongo.UpdateTrip(c, tid, aid, tr.UpdatedAt, tr.Trip)\n\treturn nil, status.Error(codes.Unimplemented, "")\n}\n\nfunc (s *Service) calcCurrentStatus(trip *rentalpb.Trip, cur *rentalpb.Location) *rentalpb.LocationStatus {\n\treturn nil\n}\n\n// 首先实现行程服务,需要实现行程服务器里的方法\nfunc (s *Service) CreateTrip(c context.Context, req *rentalpb.CreateTripRequest) (*rentalpb.TripEntity, error) {\n\t\n\taid, err := auth.AccountIDFromContext(c)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t//验证驾驶者身份\n\tiID, err := s.ProfileManager.Verify(c, aid)\n\tif err != nil {\n\t\treturn nil, status.Errorf(codes.FailedPrecondition, err.Error())\n\t}\n\t//检查车辆状态\n\tcarID := id.CarID(req.CarId)\n\terr = s.CarManager.Verify(c, carID, req.Start)\n\tif err != nil {\n\t\treturn nil, status.Error(codes.FailedPrecondition, err.Error())\n\t}\n\n\tpoi, err := s.POIManager.Resolve(c, req.Start)\n\tif err != nil {\n\t\ts.Logger.Info("cannot resolve poi", zap.Stringer("location", req.Start), zap.Error(err))\n\t}\n\t//创建行程,写入数据库,开始计费\n\tls := &rentalpb.LocationStatus{\n\t\tLocation: req.Start,\n\t\tPoiName: poi,\n\t}\n\ttr, err := s.Mongo.CreateTrip(c, &rentalpb.Trip{\n\t\tAccountId: aid.String(),\n\t\tCarId: carID.String(),\n\t\tIdentityId: iID.String(),\n\t\tStatus: rentalpb.TripStatus_IN_PROGRESS,\n\t\tStart: ls,\n\t\tCurrent: ls,\n\t})\n\n\tif err != nil {\n\t\ts.Logger.Warn("cannot create trip", zap.Error(err))\n\t\treturn nil, status.Error(codes.AlreadyExists, "")\n\t}\n\t//车辆开锁\n\tgo func() {\n\t\terr := s.CarManager.Unlock(context.Background(), carID)\n\t\tif err != nil {\n\t\t\ts.Logger.Error("cannot unlock car", zap.Error(err))\n\t\t}\n\t}()\n\n\treturn &rentalpb.TripEntity{\n\t\tId: tr.ID.Hex(),\n\t\tTrip: tr.Trip,\n\t}, nil\n}\n// 文件是程序的入口,负责初始化和启动gRPC服务器,并注册认证服务\npackage main\n\nimport (\n\t"context"\n\t"log"\n\trentalpb "rentCar/server/rental/api/gen/v1"\n\t"rentCar/server/rental/trip"\n\t"rentCar/server/rental/trip/client/car"\n\t"rentCar/server/rental/trip/client/poi"\n\t"rentCar/server/rental/trip/client/profile"\n\t"rentCar/server/rental/trip/dao"\n\t"rentCar/server/shared/server"\n\n\t"go.mongodb.org/mongo-driver/mongo"\n\t"go.mongodb.org/mongo-driver/mongo/options"\n\t"go.uber.org/zap"\n\t"google.golang.org/grpc"\n)\n\nfunc main() {\n\t//创建日志记录器\n\tlogger, err := zap.NewDevelopment()\n\tif err != nil {\n\t\tlog.Fatalf("cannot create logger :%v", err)\n\t}\n\n\tc := context.Background()\n\t//连接mongoDB\n\tMongoClient, err := mongo.Connect(c, options.Client().ApplyURI("mongodb://localhost:27017/rentCar?readPreference=primary&ssl=false&directConnection=true"))\n\tif err != nil {\n\t\tlogger.Fatal("cannot connect mongo :", zap.Error(err))\n\t}\n\t\n\tlogger.Sugar().Fatal(\n\t\tserver.RunGRPCServer(&server.GRPCConfig{\n\t\t\tName: "rental",\n\t\t\tAddr: ":8082",\n\t\t\tAuthPublicKeyFile: "shared/auth/public.key",\n\t\t\tLogger: logger,\n\t\t\tRegisterFunc: func(s *grpc.Server) {\n\t\t\t\trentalpb.RegisterTripServiceServer(s, &trip.Service{\n\t\t\t\t\tLogger: logger,\n\t\t\t\t\tCarManager: &car.Manager{},\n\t\t\t\t\tProfileManager: &profile.Manager{},\n\t\t\t\t\tPOIManager: &poi.Manager{},\n\t\t\t\t\tMongo: dao.NewMongo(MongoClient.Database("rentCar")),\n\t\t\t\t\t})},\n\t\t}),\n\t)\n}\n\n这是前端代码\n\nimport { rental } from "../../service/proto_gen/rental/rental_pb"\n//import { TripService } from "../../service/trip"\nimport { routing } from "../../utils/routing"\n\nconst shareLocationKey = "share_location"\n\nPage({\n carID: '',\n data: {\n userImgUrl: '',\n shareLocation: false,\n },\n onChooseAvatar(e: any) {\n if (e.detail.avatarUrl) {\n this.setData({\n userImgUrl: e.detail.avatarUrl,\n })\n wx.setStorageSync("head", e.detail.avatarUrl)\n }\n },\n onShareLocation(e: any) {\n this.data.shareLocation = e.detail.value\n wx.setStorageSync(shareLocationKey, this.data.shareLocation)\n },\n //以后若是有多个参数,则opt: Record<'car_id'|'is_vip', string>\n onLoad(opt: Record<'car_id', string>) {\n const o: routing.LockOpts = opt\n this.carID = o.car_id\n this.setData({\n shareLocation: wx.getStorageSync(shareLocationKey) || false\n })\n },\n onUnLockIng() {\n wx.getLocation({\n type: 'gcj02',\n success: async loc => {\n console.log('start a trip', {\n location: {\n latitude: loc.latitude,\n longttude: loc.longitude\n },\n userImgUrl: this.data.shareLocation ? this.data.userImgUrl : '',\n })\n\n if (!this.carID) {\n console.log("no carID specified")\n return\n }\n\n wx.request({\n url: 'http://localhost:8080/v1/trip',\n method: 'POST',\n data: {\n start: "abc",\n } as rental.v1.ICreateTripRequest,\n success: res => {\n console.log(res)\n }\n })\n\n const tripID = 'trip456'\n \n wx.showLoading({\n title: "开锁中",\n mask: true,\n })\n setTimeout(() => {\n wx.redirectTo({\n url: routing.driving({\n //trip_id: trip.id!,\n trip_id: tripID\n }),\n complete: () => {\n wx.hideLoading()\n }\n })\n }, 2000);\n },\n fail: () => {\n wx.showToast({\n icon: 'none',\n title: "请前往设置页授权位置信息"}\n )\n }\n })\n },\n})\n当我点击开锁时,会创建一个新的行程页面,如何把后端的行程传到前端去,我的pbjs生成的微服务用不了,帮我写出代码\n内容:根据您提供的代码,我假设您使用的是gRPC作为通信协议。首先,您需要在前端代码中引入相应的gRPC库。然后,您可以按照以下步骤来实现将后端的行程传递到前端的逻辑:\n\n1. 在前端代码中引入行程服务的gRPC库:\n\njavascript\nimport { TripServiceClient } from \"../../service/proto_gen/rental/rental_grpc_web_pb\";\nimport { CreateTripRequest, TripEntity } from \"../../service/proto_gen/rental/rental_pb\";\n\n\n2. 创建行程服务的gRPC客户端:\n\njavascript\nconst client = new TripServiceClient(\"http://localhost:8080\", null, null);\n\n\n3. 调用后端的CreateTrip方法创建新的行程:\n\njavascript\nconst request = new CreateTripRequest();\nrequest.setCarId(this.carID);\n// 设置其他行程相关参数\n// request.setXXX(...);\n\nclient.createTrip(request, {}, (err, response) => {\n if (err) {\n console.error(\"Failed to create trip:\", err);\n return;\n }\n\n const trip = response.getTrip();\n const tripID = trip.getId();\n\n // 将行程传递到新的页面\n wx.redirectTo({\n url: routing.driving({\n trip_id: tripID\n }),\n complete: () => {\n wx.hideLoading();\n }\n });\n});\n\n\n请注意,上述代码中的setXXX(...)部分需要根据您的实际行程参数进行设置。\n\n这样,您就可以在前端代码中调用后端的CreateTrip方法,并将返回的行程传递到新的页面。\n

RentCar Trip Service: Create, Update, and Manage Trips with Go gRPC

原文地址: https://www.cveoy.top/t/topic/pyTT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录