基于Go开发PaaS平台3
Go开发PaaS平台核心功能
代码仓库地址GitHub - yunixiangfeng/gopaas
10-18 中间件前端页面以及核心API开发(中)
C:\Users\Administrator\Desktop\gopaas\middlewareapi\handler\middlewareApiHandler.go
package handlerimport ("context""encoding/json""errors""strconv"log "github.com/asim/go-micro/v3/logger""ithub.com/yunixiangfeng/gopaas/middlewareApi/plugin/form""github.com/yunixiangfeng/gopaas/common"middleware "github.com/yunixiangfeng/gopaas/middleware/proto/middleware"middlewareApi "github.com/yunixiangfeng/gopaas/middlewareApi/proto/middlewareApi"
)type MiddlewareApi struct{MiddlewareService middleware.MiddlewareService
}// middlewareApi.FindMiddlewareById 通过API向外暴露为/middlewareApi/findMiddlewareById,接收http请求
// 即:/middlewareApi/FindMiddlewareById 请求会调用go.micro.api.middlewareApi 服务的middlewareApi.FindMiddlewareById 方法
func (e *MiddlewareApi) FindMiddlewareById(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.FindMiddlewareById request")if _,ok:=req.Get["middle_id"];!ok{return errors.New("参数异常!")}idString := req.Get["middle_id"].Values[0]id,err := strconv.ParseInt(idString,10,64)if err != nil {common.Error(err)return err}middleInfo,err:=e.MiddlewareService.FindMiddlewareByID(ctx,&middleware.MiddlewareId{Id:id})rsp.StatusCode = 200b, _ := json.Marshal(middleInfo)rsp.Body = string(b)return nil
}// middlewareApi.AddMiddleware 通过API向外暴露为/middlewareApi/AddMiddleware,接收http请求
// 即:/middlewareApi/AddMiddleware 请求会调用go.micro.api.middlewareApi 服务的middlewareApi.AddMiddleware 方法
func (e *MiddlewareApi) AddMiddleware(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.AddMiddleware request")addMiddleInfo := &middleware.MiddlewareInfo{}//设置端口port,err := e.setMiddlePort(req)if err != nil {common.Error(err)return err}addMiddleInfo.MiddlePort = port//设置环境变量addMiddleInfo.MiddleEnv = e.setMiddleEnv(req)//设置存储addMiddleInfo.MiddleStorage = e.setMiddleStorage(req)//获取类型middleTypeInfo := e.getMiddleType(req)//判断不同的类型设置不同的值switch middleTypeInfo.MiddleTypeName {case "MYSQL":middleConfig := e.setMiddleConfig(req)addMiddleInfo.MiddleConfig = &middleConfig}//处理表单form.FormToMiddlewareStruct(req.Post,addMiddleInfo)//调用后端服务添加数据response,err := e.MiddlewareService.AddMiddleware(ctx,addMiddleInfo)if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//设置mysql config 设置
func (e *MiddlewareApi) setMiddleConfig(req *middlewareApi.Request)(middleConfig middleware.MiddleConfig) {middleConfig.MiddleConfigRootUser = e.getValue(req,"middle_config_root_user")middleConfig.MiddleConfigRootPwd = e.getValue(req,"middle_config_root_pwd")middleConfig.MiddleConfigUser = e.getValue(req,"middle_config_user")middleConfig.MiddleConfigPwd = e.getValue(req,"middle_config_pwd")middleConfig.MiddleConfigDataBase = e.getValue(req,"middle_config_data_base")return
}
file:///home/gopath/src/gopaas/go-paas-front/middleware-create.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="description" content=""><meta name="author" content=""><link rel="shortcut icon" href="assets/img/logo-fav.png"><title>CPaaS</title><link rel="stylesheet" type="text/css" href="assets/lib/perfect-scrollbar/css/perfect-scrollbar.min.css"/><link rel="stylesheet" type="text/css" href="assets/lib/material-design-icons/css/material-design-iconic-font.min.css"/><!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script><![endif]--><link rel="stylesheet" type="text/css" href="assets/lib/datatables/css/dataTables.bootstrap.min.css"/><link rel="stylesheet" href="assets/css/style.css" type="text/css"/></head><body><div class="be-wrapper"><nav class="navbar navbar-default navbar-fixed-top be-top-header"><div class="container-fluid"><div class="navbar-header"><a href="index.html" class="navbar-brand"></a></div><div class="be-right-navbar"><ul class="nav navbar-nav navbar-right be-user-nav"><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><img src="assets/img/avatar.png" alt="Avatar"><span class="user-name">Túpac Amaru</span></a><ul role="menu" class="dropdown-menu"><li><div class="user-info"><div class="user-name">wu123</div><div class="user-position online">在线</div></div></li><li><a href="#"><span class="icon mdi mdi-face"></span> 账户</a></li><li><a href="#"><span class="icon mdi mdi-settings"></span> 设置</a></li><li><a href="#"><span class="icon mdi mdi-power"></span> 推出登录</a></li></ul></li></ul><div class="page-title"></div><ul class="nav navbar-nav navbar-right be-icons-nav"><li class="dropdown"><a href="#" role="button" aria-expanded="false" class="be-toggle-right-sidebar"><span class="icon mdi mdi-settings"></span></a></li><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><span class="icon mdi mdi-notifications"></span><span class="indicator"></span></a><ul class="dropdown-menu be-notifications"><li><div class="title">消息提醒<span class="badge">3</span></div><div class="list"><div class="be-scroller"><div class="content"><ul><li class="notification notification-unread"><a href="#"><div class="image"><img src="assets/img/avatar2.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">Jessica Caruso</span> accepted your invitation to join the team.</div><span class="date">2 min ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar3.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">Joel King</span> is now following you</div><span class="date">2 days ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar4.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">John Doe</span> is watching your main repository</div><span class="date">2 days ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar5.png" alt="Avatar"></div><div class="notification-info"><span class="text"><span class="user-name">Emily Carter</span> is now following you</span><span class="date">5 days ago</span></div></a></li></ul></div></div></div><div class="footer"> <a href="#">View all notifications</a></div></li></ul></li><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><span class="icon mdi mdi-apps"></span></a><ul class="dropdown-menu be-connections"><li><div class="list"><div class="content"><div class="row"><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/github.png" alt="Github"><span>GitHub</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/bitbucket.png" alt="Bitbucket"><span>Bitbucket</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/slack.png" alt="Slack"><span>Slack</span></a></div></div><div class="row"><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/dribbble.png" alt="Dribbble"><span>Dribbble</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/mail_chimp.png" alt="Mail Chimp"><span>Mail Chimp</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/dropbox.png" alt="Dropbox"><span>Dropbox</span></a></div></div></div></div><div class="footer"> <a href="#">More</a></div></li></ul></li></ul></div></div></nav>
<!--侧边栏-开始
-->
<div class="be-left-sidebar"><div class="left-sidebar-wrapper"><a href="#" class="left-sidebar-toggle">看版</a><div class="left-sidebar-spacer"><div class="left-sidebar-scroll"><div class="left-sidebar-content"><ul class="sidebar-elements"><li class="divider">菜单</li><li class="parent"><a href="#"><i class="icon mdi mdi-home"></i><span>控制台</span></a></li><li class="parent"><a href="#"><i class="icon mdi mdi-face"></i><span>应用管理</span></a><ul class="sub-menu"><li ><a href="pod-index.html">添加应用</a></li></ul></li><li class="parent"><a href="charts.html"><i class="icon mdi mdi-chart-donut"></i><span>服务管理</span></a><ul class="sub-menu"><li ><a href="svc-index.html">添加服务</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-dot-circle"></i><span>域名管理</span></a><ul class="sub-menu"><li ><a href="route-index.html">添加路由</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-dot-circle"></i><span>中间件</span></a><ul class="sub-menu"><li class="active"><a href="middleware-create.html">创建中间件</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-border-all"></i><span>中间件</span></a><ul class="sub-menu"><li><a href="tables-general.html">General</a></li><li><a href="tables-datatables.html">Data Tables</a></li><li><a href="tables-filters.html"><span class="label label-primary pull-right">New</span>Table Filters</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-layers"></i><span>应用市场</span></a><ul class="sub-menu"><li><a href="pages-blank.html">Blank Page</a></li><li><a href="pages-blank-header.html">Blank Page Header</a></li><li><a href="pages-login.html">Login</a></li><li><a href="pages-login2.html">Login v2</a></li><li><a href="pages-404.html">404 Page</a></li><li><a href="pages-sign-up.html">Sign Up</a></li><li><a href="pages-forgot-password.html">Forgot Password</a></li><li><a href="pages-profile.html">Profile</a></li><li><a href="pages-pricing-tables.html">Pricing Tables</a></li><li><a href="pages-pricing-tables2.html">Pricing Tables v2</a></li><li><a href="pages-timeline.html">Timeline</a></li><li><a href="pages-timeline2.html">Timeline v2</a></li><li><a href="pages-invoice.html"><span class="label label-primary pull-right">New</span>Invoice</a></li><li><a href="pages-calendar.html">Calendar</a></li><li><a href="pages-gallery.html">Gallery</a></li><li><a href="pages-code-editor.html"><span class="label label-primary pull-right">New </span>Code Editor</a></li><li><a href="pages-booking.html"><span class="label label-primary pull-right">New</span>Booking</a></li><li><a href="pages-loaders.html"><span class="label label-primary pull-right">New</span>Loaders</a></li></ul></li></ul></div></div></div><div class="progress-widget"><div class="progress-data"><span class="progress-value">60%</span><span class="name">Current Project</span></div><div class="progress"><div style="width: 60%;" class="progress-bar progress-bar-primary"></div></div></div></div>
</div>
<!--
侧边栏-结束
--><div class="be-content"><div class="page-head"><h2 class="page-head-title">中间件</h2><ol class="breadcrumb page-head-nav"><li><a href="#">控制台</a></li><li><a href="#">中间件</a></li><li class="active">中间件列表</li></ol></div><div class="main-content container-fluid"><div class="row pricing-tables"><div class="col-md-3"><div class="pricing-table pricing-table-primary"><div class="pricing-table-image"><img src="./assets/img/Consul.jpeg"></div><div class="pricing-table-title">Consul</div><div class="panel-divider panel-divider-xl"></div><ul class="pricing-table-features"><li>Consul 简化了分布式环境中的服务的注册和发现流程,通过 HTTP 或者 DNS 接口发现。支持外部 SaaS 提供者等。</li><li></li></ul><a href="#" class="btn btn-primary">开始创建</a></div></div><div class="col-md-3"><div class="pricing-table pricing-table-primary"><div class="pricing-table-image"><img src="./assets/img/Mysql.jpeg"></div><div class="pricing-table-title">Mysql</div><div class="panel-divider panel-divider-xl"></div><ul class="pricing-table-features"><li>MySQL 是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,这样就增加了速度并提高了灵活性。</li><li></li></ul><a href="middleware-create-mysql.html" class="btn btn-primary">开始创建</a></div></div><div class="col-md-3"><div class="pricing-table pricing-table-primary"><div class="pricing-table-image"><img src="./assets/img/Redis.jpeg"></div><div class="pricing-table-title">Redis</div><div class="panel-divider panel-divider-xl"></div><ul class="pricing-table-features"><li>Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。</li><li></li></ul><a href="#" class="btn btn-primary">开始创建</a></div></div><div class="col-md-3"><div class="pricing-table pricing-table-primary"><div class="pricing-table-image"><img src="./assets/img/MariaDB.jpeg"></div><div class="pricing-table-title">MariaDB</div><div class="panel-divider panel-divider-xl"></div><ul class="pricing-table-features"><li>MariaDB数据库管理系统是MySQL的一个分支, MariaDB的目的是完全兼容MySQL,使之能轻松成为MySQL的代替品。</li><li></li></ul><a href="#" class="btn btn-primary">开始创建</a></div></div></div></div></div><nav class="be-right-sidebar"><div class="sb-content"><div class="tab-navigation"><ul role="tablist" class="nav nav-tabs nav-justified"><li role="presentation" class="active"><a href="#tab1" aria-controls="tab1" role="tab" data-toggle="tab">Chat</a></li><li role="presentation"><a href="#tab2" aria-controls="tab2" role="tab" data-toggle="tab">Todo</a></li><li role="presentation"><a href="#tab3" aria-controls="tab3" role="tab" data-toggle="tab">Settings</a></li></ul></div><div class="tab-panel"><div class="tab-content"><div id="tab1" role="tabpanel" class="tab-pane tab-chat active"><div class="chat-contacts"><div class="chat-sections"><div class="be-scroller"><div class="content"><h2>Recent</h2><div class="contact-list contact-list-recent"><div class="user"><a href="#"><img src="assets/img/avatar1.png" alt="Avatar"><div class="user-data"><span class="status away"></span><span class="name">Claire Sassu</span><span class="message">Can you share the...</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar2.png" alt="Avatar"><div class="user-data"><span class="status"></span><span class="name">Maggie jackson</span><span class="message">I confirmed the info.</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar3.png" alt="Avatar"><div class="user-data"><span class="status offline"></span><span class="name">Joel King </span><span class="message">Ready for the meeti...</span></div></a></div></div><h2>Contacts</h2><div class="contact-list"><div class="user"><a href="#"><img src="assets/img/avatar4.png" alt="Avatar"><div class="user-data2"><span class="status"></span><span class="name">Mike Bolthort</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar5.png" alt="Avatar"><div class="user-data2"><span class="status"></span><span class="name">Maggie jackson</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar6.png" alt="Avatar"><div class="user-data2"><span class="status offline"></span><span class="name">Jhon Voltemar</span></div></a></div></div></div></div></div><div class="bottom-input"><input type="text" placeholder="Search..." name="q"><span class="mdi mdi-search"></span></div></div><div class="chat-window"><div class="title"><div class="user"><img src="assets/img/avatar2.png" alt="Avatar"><h2>Maggie jackson</h2><span>Active 1h ago</span></div><span class="icon return mdi mdi-chevron-left"></span></div><div class="chat-messages"><div class="be-scroller"><div class="content"><ul><li class="friend"><div class="msg">Hello</div></li><li class="self"><div class="msg">Hi, how are you?</div></li><li class="friend"><div class="msg">Good, I'll need support with my pc</div></li><li class="self"><div class="msg">Sure, just tell me what is going on with your computer?</div></li><li class="friend"><div class="msg">I don't know it just turns off suddenly</div></li></ul></div></div></div><div class="chat-input"><div class="input-wrapper"><span class="photo mdi mdi-camera"></span><input type="text" placeholder="Message..." name="q" autocomplete="off"><span class="send-msg mdi mdi-mail-send"></span></div></div></div></div><div id="tab2" role="tabpanel" class="tab-pane tab-todo"><div class="todo-container"><div class="todo-wrapper"><div class="be-scroller"><div class="todo-content"><span class="category-title">Today</span><ul class="todo-list"><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo1" type="checkbox" checked=""><label for="todo1">Initialize the project</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo2" type="checkbox"><label for="todo2">Create the main structure</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo3" type="checkbox"><label for="todo3">Updates changes to GitHub</label></div></li></ul><span class="category-title">Tomorrow</span><ul class="todo-list"><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo4" type="checkbox"><label for="todo4">Initialize the project</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo5" type="checkbox"><label for="todo5">Create the main structure</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo6" type="checkbox"><label for="todo6">Updates changes to GitHub</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo7" type="checkbox"><label for="todo7" title="This task is too long to be displayed in a normal space!">This task is too long to be displayed in a normal space!</label></div></li></ul></div></div></div><div class="bottom-input"><input type="text" placeholder="Create new task..." name="q"><span class="mdi mdi-plus"></span></div></div></div><div id="tab3" role="tabpanel" class="tab-pane tab-settings"><div class="settings-wrapper"><div class="be-scroller"><span class="category-title">General</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st1" id="st1"><span><label for="st1"></label></span></div><span class="name">Available</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st2" id="st2"><span><label for="st2"></label></span></div><span class="name">Enable notifications</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st3" id="st3"><span><label for="st3"></label></span></div><span class="name">Login with Facebook</span></li></ul><span class="category-title">Notifications</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st4" id="st4"><span><label for="st4"></label></span></div><span class="name">Email notifications</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st5" id="st5"><span><label for="st5"></label></span></div><span class="name">Project updates</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st6" id="st6"><span><label for="st6"></label></span></div><span class="name">New comments</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st7" id="st7"><span><label for="st7"></label></span></div><span class="name">Chat messages</span></li></ul><span class="category-title">Workflow</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st8" id="st8"><span><label for="st8"></label></span></div><span class="name">Deploy on commit</span></li></ul></div></div></div></div></div></div></nav></div><script src="assets/lib/jquery/jquery.min.js" type="text/javascript"></script><script src="assets/lib/perfect-scrollbar/js/perfect-scrollbar.jquery.min.js" type="text/javascript"></script><script src="assets/js/main.js" type="text/javascript"></script><script src="assets/lib/bootstrap/dist/js/bootstrap.min.js" type="text/javascript"></script><script src="assets/lib/datatables/js/jquery.dataTables.min.js" type="text/javascript"></script><script src="assets/lib/datatables/js/dataTables.bootstrap.min.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/dataTables.buttons.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.html5.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.flash.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.print.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.colVis.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.bootstrap.js" type="text/javascript"></script><script src="assets/js/app-tables-datatables.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function(){//initialize the javascriptApp.init();App.dataTables();$.ajax({type:"get",url:"http://127.0.0.1:8080/middlewareApi/",success: function(data){console.log(data);$("#table-data").html("");$.each(data['route_info'],function (i,item) {$("#table-data").append(' <tr class="gradeA">\<td>'+item.id+'</td>\<td>'+item.route_name+'</td>\<td>'+item.route_namespace+'</td>\<td class="center">'+item.route_host+'</td>\<td class="center"><a href="route-detail.html?route_id='+item.id+'">详情</a> <a href="http://localhost:8080/routeApi/deleteRouteById?route_id='+item.id+'" style="color:red;" >删除</a></td>\</tr>');})},error: function(result){console.log(result);}});});</script></body>
</html>
file:///home/gopath/src/gopaas/go-paas-front/middleware-create-mysql.html
10-19 中间件前端页面以及核心API开发(下)
C:\Users\Administrator\Desktop\gopaas\middlewareapi\handler\middlewareApiHandler.go
package handlerimport ("context""encoding/json""errors""strconv"log "github.com/asim/go-micro/v3/logger""ithub.com/yunixiangfeng/gopaas/middlewareApi/plugin/form""github.com/yunixiangfeng/gopaas/common"middleware "github.com/yunixiangfeng/gopaas/middleware/proto/middleware"middlewareApi "github.com/yunixiangfeng/gopaas/middlewareApi/proto/middlewareApi"
)type MiddlewareApi struct {MiddlewareService middleware.MiddlewareService
}// middlewareApi.FindMiddlewareById 通过API向外暴露为/middlewareApi/findMiddlewareById,接收http请求
// 即:/middlewareApi/FindMiddlewareById 请求会调用go.micro.api.middlewareApi 服务的middlewareApi.FindMiddlewareById 方法
func (e *MiddlewareApi) FindMiddlewareById(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.FindMiddlewareById request")if _, ok := req.Get["middle_id"]; !ok {return errors.New("参数异常!")}idString := req.Get["middle_id"].Values[0]id, err := strconv.ParseInt(idString, 10, 64)if err != nil {common.Error(err)return err}middleInfo, err := e.MiddlewareService.FindMiddlewareByID(ctx, &middleware.MiddlewareId{Id: id})rsp.StatusCode = 200b, _ := json.Marshal(middleInfo)rsp.Body = string(b)return nil
}// middlewareApi.AddMiddleware 通过API向外暴露为/middlewareApi/AddMiddleware,接收http请求
// 即:/middlewareApi/AddMiddleware 请求会调用go.micro.api.middlewareApi 服务的middlewareApi.AddMiddleware 方法
func (e *MiddlewareApi) AddMiddleware(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.AddMiddleware request")addMiddleInfo := &middleware.MiddlewareInfo{}//设置端口port, err := e.setMiddlePort(req)if err != nil {common.Error(err)return err}addMiddleInfo.MiddlePort = port//设置环境变量addMiddleInfo.MiddleEnv = e.setMiddleEnv(req)//设置存储addMiddleInfo.MiddleStorage = e.setMiddleStorage(req)//获取类型middleTypeInfo := e.getMiddleType(req)//判断不同的类型设置不同的值switch middleTypeInfo.MiddleTypeName {case "MYSQL":middleConfig := e.setMiddleConfig(req)addMiddleInfo.MiddleConfig = &middleConfig}//处理表单form.FormToMiddlewareStruct(req.Post, addMiddleInfo)//调用后端服务添加数据response, err := e.MiddlewareService.AddMiddleware(ctx, addMiddleInfo)if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//设置mysql config 设置
func (e *MiddlewareApi) setMiddleConfig(req *middlewareApi.Request) (middleConfig middleware.MiddleConfig) {middleConfig.MiddleConfigRootUser = e.getValue(req, "middle_config_root_user")middleConfig.MiddleConfigRootPwd = e.getValue(req, "middle_config_root_pwd")middleConfig.MiddleConfigUser = e.getValue(req, "middle_config_user")middleConfig.MiddleConfigPwd = e.getValue(req, "middle_config_pwd")middleConfig.MiddleConfigDataBase = e.getValue(req, "middle_config_data_base")return
}//获取post值
func (e *MiddlewareApi) getValue(req *middlewareApi.Request, key string) string {value, ok := req.Post[key]if ok {return value.Values[0]}return ""
}//获取类型
func (e *MiddlewareApi) getMiddleType(req *middlewareApi.Request) (middleTypeInfo middleware.MiddleTypeInfo) {typeValue, ok := req.Post["middle_type_id"]if ok {typeId, err := strconv.ParseInt(typeValue.Values[0], 10, 64)if err != nil {common.Error(err)return}typeInfo, err := e.MiddlewareService.FindMiddleTypeByID(context.TODO(), &middleware.MiddleTypeId{Id: typeId,})if err != nil {common.Error(err)return}middleTypeInfo = *typeInfo}return
}//设置中间件的存储
func (e *MiddlewareApi) setMiddleStorage(req *middlewareApi.Request) []*middleware.MiddleStorage {storageSlice := []*middleware.MiddleStorage{}//处理环境变量i := 1for {nameTag := "middle_storage.name." + strconv.Itoa(i)sizeTag := "middle_storage.size." + strconv.Itoa(i)pathTag := "middle_storage.path." + strconv.Itoa(i)key, ok := req.Post[nameTag]if ok {sizeValue, _ := strconv.ParseFloat(req.Post[sizeTag].Values[0], 32)storage := &middleware.MiddleStorage{MiddleStorageName: key.Values[0],MiddleStorageSize: float32(sizeValue),MiddleStoragePath: req.Post[pathTag].Values[0],MiddleStorageClass: "csi-rbd-sc",MiddleStorageAccessMode: "ReadWriteOnce",}storageSlice = append(storageSlice, storage)} else {break}i++}return storageSlice
}//设置中间件环境变量
func (e *MiddlewareApi) setMiddleEnv(req *middlewareApi.Request) []*middleware.MiddleEnv {envSlice := []*middleware.MiddleEnv{}//处理环境变量i := 1for {tag := "middle_env.key." + strconv.Itoa(i)valueTag := "middle_env.value." + strconv.Itoa(i)key, ok := req.Post[tag]if ok {env := &middleware.MiddleEnv{EnvKey: key.Values[0],EnvValue: req.Post[valueTag].Values[0],}envSlice = append(envSlice, env)} else {break}i++}return envSlice
}//设置端口
func (e *MiddlewareApi) setMiddlePort(req *middlewareApi.Request) ([]*middleware.MiddlePort, error) {dataSlice, ok := req.Post["middle_port"]if ok {//特殊处理middlePortSlice := []*middleware.MiddlePort{}for _, v := range dataSlice.Values {i, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)}port := &middleware.MiddlePort{MiddlePort: int32(i),MiddleProtocol: "TCP",}middlePortSlice = append(middlePortSlice, port)}return middlePortSlice, nil}return nil, errors.New("无端口")
}// middlewareApi.DeleteMiddlewareById 通过API向外暴露为/middlewareApi/DeleteMiddlewareById,接收http请求
// 即:/middlewareApi/DeleteMiddlewareById 请求会调用go.micro.api.middlewareApi 服务的 middlewareApi.DeleteMiddlewareById 方法
func (e *MiddlewareApi) DeleteMiddlewareById(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.DeleteMiddlewareById request")if _, ok := req.Get["middle_id"]; !ok {return errors.New("参数异常")}IdString := req.Get["middle_id"].Values[0]Id, err := strconv.ParseInt(IdString, 10, 64)if err != nil {common.Error(err)return err}response, err := e.MiddlewareService.DeleteMiddleware(ctx, &middleware.MiddlewareId{Id: Id,})rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}// middlewareApi.UpdateMiddleware 通过API向外暴露为/middlewareApi/UpdateMiddleware,接收http请求
// 即:/middlewareApi/UpdateMiddleware 请求会调用go.micro.api.middlewareApi 服务的middlewareApi.UpdateMiddleware 方法
func (e *MiddlewareApi) UpdateMiddleware(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.UpdateMiddleware request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问/middlewareApi/UpdateMiddleware'}")rsp.Body = string(b)return nil
}// 默认的方法middlewareApi.Call 通过API向外暴露为/middlewareApi/call,接收http请求
// 即:/middlewareApi/call或/middlewareApi/ 请求会调用go.micro.api.middlewareApi 服务的middlewareApi.FindMiddlewareById 方法
func (e *MiddlewareApi) Call(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}
func (e *MiddlewareApi) FindAllMiddlewareByTypeId(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}func (e *MiddlewareApi) FindMiddleTypeById(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}
func (e *MiddlewareApi) AddMiddleType(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.Call request")typeInfo := &middleware.MiddleTypeInfo{//MiddleTypeName: "CONSUL",//MiddleTypeImageSrc: "/consul.jpg",//MiddleVersion: []*middleware.MiddleVersion{// {// MiddleDockerImage: "docker/consul",// MiddleVs: "v1.0.1",// },// {// MiddleDockerImage: "docker/consul",// MiddleVs: "v1.0.2",// },//},}rspInfo, err := e.MiddlewareService.AddMiddleType(ctx, typeInfo)if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(rspInfo)rsp.Body = string(b)return nil
}
func (e *MiddlewareApi) DeleteMiddleTypeById(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}
func (e *MiddlewareApi) UpdateMiddleType(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}func (e *MiddlewareApi) FindAllMiddleType(ctx context.Context, req *middlewareApi.Request, rsp *middlewareApi.Response) error {log.Info("Received middlewareApi.Call request")allType, err := e.MiddlewareService.FindAllMiddleType(ctx, &middleware.FindAll{})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(allType)rsp.Body = string(b)return nil
}
C:\Users\Administrator\Desktop\gopaas\middlewareapi\plugin\form\form.go
package formimport ("errors""strings""reflect""strconv""time""github.com/yunixiangfeng/gopaas/common""github.com/yunixiangfeng/gopaas/middlewareApi/proto/middlewareApi"
)//根据结构体中name标签映射数据到结构体中并且转换类型
func FormToMiddlewareStruct(data map[string]*middlewareApi.Pair, obj interface{}) {objValue := reflect.ValueOf(obj).Elem()for i := 0; i < objValue.NumField(); i++ {//获取sql对应的值dataTag := strings.Replace(objValue.Type().Field(i).Tag.Get("json"), ",omitempty", "", -1)dataSlice, ok := data[dataTag]if !ok {continue}valueSlice := dataSlice.Valuesif len(valueSlice) <= 0 {continue}//排除port和envif dataTag == "middle_port" {continue}value := valueSlice[0]//端口,环境变量的单独处理//获取对应字段的名称name := objValue.Type().Field(i).Name//特殊类型跳过单独处理if name == "MiddleStorage" {continue}//获取对应字段类型structFieldType := objValue.Field(i).Type()//获取变量类型,也可以直接写"string类型"val := reflect.ValueOf(value)var err errorif structFieldType != val.Type() {//类型转换val, err = TypeConversion(value, structFieldType.Name()) //类型转换if err != nil {common.Error(err)}}//设置类型值objValue.FieldByName(name).Set(val)}
}//类型转换
func TypeConversion(value string, ntype string) (reflect.Value, error) {if ntype == "string" {return reflect.ValueOf(value), nil} else if ntype == "time.Time" {t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)return reflect.ValueOf(t), err} else if ntype == "Time" {t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)return reflect.ValueOf(t), err} else if ntype == "int" {i, err := strconv.Atoi(value)return reflect.ValueOf(i), err} else if ntype == "int32" {i, err := strconv.ParseInt(value, 10, 32)if err != nil {return reflect.ValueOf(int32(i)), err}return reflect.ValueOf(int32(i)), err} else if ntype == "int64" {i, err := strconv.ParseInt(value, 10, 64)return reflect.ValueOf(i), err} else if ntype == "float32" {i, err := strconv.ParseFloat(value, 64)return reflect.ValueOf(float32(i)), err} else if ntype == "float64" {i, err := strconv.ParseFloat(value, 64)return reflect.ValueOf(i), err}//else if .......增加其他一些类型的转换return reflect.ValueOf(value), errors.New("未知的类型:" + ntype)
}
C:\Users\Administrator\Desktop\gopaas\middlewareapi\main.go
package mainimport ("fmt""github.com/afex/hystrix-go/hystrix""github.com/asim/go-micro/plugins/registry/consul/v3"ratelimit "github.com/asim/go-micro/plugins/wrapper/ratelimiter/uber/v3""github.com/asim/go-micro/plugins/wrapper/select/roundrobin/v3"opentracing2 "github.com/asim/go-micro/plugins/wrapper/trace/opentracing/v3""github.com/asim/go-micro/v3""github.com/asim/go-micro/v3/registry""github.com/asim/go-micro/v3/server""github.com/yunixiangfeng/gopaas/common"go_micro_service_middleware "github.com/yunixiangfeng/gopaas/middleware/proto/middleware""net""net/http""strconv"_ "github.com/jinzhu/gorm/dialects/mysql""github.com/opentracing/opentracing-go""github.com/yunixiangfeng/gopaas/middlewareApi/handler"hystrix2 "github.com/yunixiangfeng/gopaas/middlewareApi/plugin/hystrix"middlewareApi "github.com/yunixiangfeng/gopaas/middlewareApi/proto/middlewareApi"
)var (//服务地址hostIp = "192.168.204.130"//服务地址serviceHost = hostIp//服务端口servicePort = "8090"//注册中心配置consulHost = hostIpconsulPort int64 = 8500//链路追踪tracerHost = hostIptracerPort = 6831//熔断端口,每个服务不能重复hystrixPort = 9100//监控端口,每个服务不能重复prometheusPort = 9200
)func main() {//需要本地启动,mysql,consul中间件服务//1.注册中心consul := consul.NewRegistry(func(options *registry.Options) {options.Addrs = []string{consulHost + ":" + strconv.FormatInt(consulPort, 10),}})//2.添加链路追踪t, io, err := common.NewTracer("go.micro.api.middlewareApi", tracerHost+":"+strconv.Itoa(tracerPort))if err != nil {common.Error(err)}defer io.Close()opentracing.SetGlobalTracer(t)//3.添加熔断器hystrixStreamHandler := hystrix.NewStreamHandler()hystrixStreamHandler.Start()//添加日志中心//1)需要程序日志打入到日志文件中//2)在程序中添加filebeat.yml 文件//3) 启动filebeat,启动命令 ./filebeat -e -c filebeat.ymlfmt.Println("日志统一记录在根目录 micro.log 文件中,请点击查看日志!")//启动监听程序go func() {//http://192.168.204.130:9092/turbine/turbine.stream//看板访问地址 http://127.0.0.1:9002/hystrix,url后面一定要带 /hystrixerr = http.ListenAndServe(net.JoinHostPort("0.0.0.0", strconv.Itoa(hystrixPort)), hystrixStreamHandler)if err != nil {common.Error(err)}}()//4.添加监控common.PrometheusBoot(prometheusPort)//5.创建服务service := micro.NewService(//自定义服务地址,且必须写在其它参数前面micro.Server(server.NewServer(func(opts *server.Options) {opts.Advertise = serviceHost + ":" + servicePort})),micro.Name("go.micro.api.middlewareApi"),micro.Version("latest"),//指定服务端口micro.Address(":"+servicePort),//添加注册中心micro.Registry(consul),//添加链路追踪micro.WrapHandler(opentracing2.NewHandlerWrapper(opentracing.GlobalTracer())),micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())),//只作为客户端的时候起作用micro.WrapClient(hystrix2.NewClientHystrixWrapper()),//添加限流micro.WrapHandler(ratelimit.NewHandlerWrapper(1000)),//增加负载均衡micro.WrapClient(roundrobin.NewClientWrapper()),)service.Init()// 指定需要访问的服务,可以快速操作已开发的服务,// 默认API服务名称带有"Api",程序会自动替换// 如果不带有特定字符会使用默认"XXX" 请自行替换middlewareService := go_micro_service_middleware.NewMiddlewareService("go.micro.service.middleware", service.Client())// 注册控制器if err := middlewareApi.RegisterMiddlewareApiHandler(service.Server(), &handler.MiddlewareApi{MiddlewareService: middlewareService}); err != nil {common.Error(err)}// 启动服务if err := service.Run(); err != nil {//输出启动失败信息common.Fatal(err)}
}
10-20 总结&思考
GO PaaS 平台中间件创建与管理
主要内容
中间件服务端开发
中间件服务API开放
中间件页面联调
中间件为什么挂载盘会创建多个?
中间件集群模式如何搞定?
10-21 【扩展阅读】k8s 实战篇 – Mysql 容器化部署详解
第11章 云原生 Go PaaS 平台镜功能开发,商业化镜像市场,完善平台市场功能
开发完成的应用能够包装成各自独立的应用程序,以便于在市场上通过售卖和安装的方式给客户获取到。开发满足业务需求的镜像市场功能,使得我们的应用能够像APP 应用一样在 PaaS 平台上购买和被安装。
11-1 云应用市场开发介绍
GO PaaS 平台云应用市场开发
主要内容
云市场服务开发
云市场API开发
云市场页面联调
11-2 云应用app_store模型开发及管理说明
yu-tool.exe newService github.com/yunixiangfeng/gopaas/appStore yu-v3 --proto_path=. --micro_out=. --go_out=:. ./proto/appStore/appStore.protogo mod tidy
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\appStore.go
package model//应用市场
type AppStore struct{ID int64 `gorm:"primary_key;not_null;auto_increment"`//应用的标识AppSku string `gorm:"unique_index;not null" json:"app_sku"`//应用标题AppTitle string `json:"app_title"`//应用描述AppDetail string `json:"app_detail"`//应用价格AppPrice float32 `json:"app_price"`//安装次数AppInstall int64 `json:"app_install"`//访问次数AppViews int64 `json:"app_views"`//应用审核AppCheck bool `json:"app_check"`//应用分类AppCategoryID int64 `json:"app_category_id"`//服务商AppIsvID int64 `json:"app_isv_id"`//应用图片AppImage[] AppImage `gorm:"ForeignKey:AppID" json:"app_image"`//应用组合,应用的模板AppPod[] AppPod `gorm:"ForeignKey:AppID" json:"app_pod"`//中间件组合AppMiddle[] AppMiddle `gorm:"ForeignKey:AppID" json:"app_middle"`//存储组合AppVolume[] AppVolume `gorm:"ForeignKey:AppID" json:"app_volume"`//评论AppComment[] AppComment `gorm:"ForeignKey:AppID" json:"app_comment"`
}
11-3 云应用辅助信息model 开发
appStore.go 重命名 app_store.go
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\app_category.go
package modeltype AppCategory struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`CategoryName string `json:"category_name"`//@TODO
}
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\app_pod.go
package modeltype AppPod struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`AppID int64 `json:"app_id"`AppPodID int64 `json:"app_pod_id"`
}
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\app_image.go
package model//云引用图片
type AppImage struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`AppID int64 `json:"app_id"`//图片地址AppImageSrc string `json:"app_image_src"`
}
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\app_middle.go
package modeltype AppMiddle struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`AppID int64 `json:"app_id"`AppMiddleID int64 `json:"app_middle_id"`
}
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\app_volume.go
package model//云应用存储模板
type AppVolume struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`AppID int64 `json:"app_id"`AppVolumeID int64 `json:"app_volume_id"`
}
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\app_comment.go
package model//云应用评论
type AppComment struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`AppID int64 `json:"app_id"`AppCommentTitle string `json:"app_comment_title"`AppCommentDetail string `json:"app_comment_detail"`AppUserID int64 `json:"app_user_id"`//@TODO
}
C:\Users\Administrator\Desktop\gopaas\appstore\domain\model\app_isv.go
package model//服务商
type AppIsv struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`AppIsvName string `json:"app_isv_name"`AppIsvDetail string `json:"app_isv_detail"`
}
11-4 云应用市场 repository 代码开发
C:\Users\Administrator\Desktop\gopaas\appstore\domain\repository\appStore_repository.go
package repositoryimport ("github.com/jinzhu/gorm""github.com/yunixiangfeng/gopaas/appStore/domain/model""github.com/yunixiangfeng/gopaas/common"
)//创建需要实现的接口
type IAppStoreRepository interface {//初始化表InitTable() error//根据ID查处找数据FindAppStoreByID(int64) (*model.AppStore, error)//创建一条 appStore 数据CreateAppStore(*model.AppStore) (int64, error)//根据ID删除一条 appStore 数据DeleteAppStoreByID(int64) error//修改更新数据UpdateAppStore(*model.AppStore) error//查找appStore所有数据FindAll() ([]model.AppStore, error)//添加安装数量AddInstallNumber(int64) error//获取安装数量GetInstallNumber(int64) int64//添加浏览量AddViewNumber(int64) error//获取浏览量GetViewNumber(int64) int64
}//创建appStoreRepository
func NewAppStoreRepository(db *gorm.DB) IAppStoreRepository {return &AppStoreRepository{mysqlDb: db}
}type AppStoreRepository struct {mysqlDb *gorm.DB
}//初始化表
func (u *AppStoreRepository) InitTable() error {return u.mysqlDb.CreateTable(&model.AppStore{}, &model.AppComment{}, &model.AppVolume{}, &model.AppPod{}, &model.AppImage{}, &model.AppCategory{}, &model.AppIsv{}, &model.AppMiddle{}).Error
}//添加安装数量统计
func (u *AppStoreRepository) AddInstallNumber(appID int64) error {return u.mysqlDb.Model(&model.AppStore{}).Where("id = ?", appID).UpdateColumn("app_install", gorm.Expr("app_install + ?", 1)).Error
}//获取安装数量统计
func (u *AppStoreRepository) GetInstallNumber(appID int64) int64 {appStore, err := u.FindAppStoreByID(appID)if err != nil {common.Error(err)return 0}return appStore.AppInstall
}//添加浏览统计
func (u *AppStoreRepository) AddViewNumber(appID int64) error {return u.mysqlDb.Model(&model.AppStore{}).Where("id = ?", appID).UpdateColumn("app_views", gorm.Expr("app_views + ?", 1)).Error
}//获取浏览数量
func (u *AppStoreRepository) GetViewNumber(appID int64) int64 {appStore, err := u.FindAppStoreByID(appID)if err != nil {common.Error(err)return 0}return appStore.AppViews
}//根据ID查找AppStore信息
func (u *AppStoreRepository) FindAppStoreByID(appStoreID int64) (appStore *model.AppStore, err error) {appStore = &model.AppStore{}return appStore, u.mysqlDb.Preload("AppImage").Preload("AppPod").Preload("AppMiddle").Preload("AppVolume").Preload("AppComment").First(appStore, appStoreID).Error
}//创建AppStore信息
func (u *AppStoreRepository) CreateAppStore(appStore *model.AppStore) (int64, error) {return appStore.ID, u.mysqlDb.Create(appStore).Error
}//根据ID删除AppStore信息
func (u *AppStoreRepository) DeleteAppStoreByID(appStoreID int64) error {//开启事务tx := u.mysqlDb.Begin()//遇到问题回滚defer func() {if r := recover(); r != nil {tx.Rollback()}}()//遇到问题返回if tx.Error != nil {return tx.Error}//删除应用if err := u.mysqlDb.Where("id = ?", appStoreID).Delete(&model.AppStore{}).Error; err != nil {tx.Rollback()return err}//删除应用图片if err := u.mysqlDb.Where("app_id = ?", appStoreID).Delete(&model.AppImage{}).Error; err != nil {tx.Rollback()return err}//删除中间件if err := u.mysqlDb.Where("app_id = ?", appStoreID).Delete(&model.AppMiddle{}).Error; err != nil {tx.Rollback()return err}//删除对应的Pod组合if err := u.mysqlDb.Where("app_id = ?", appStoreID).Delete(&model.AppPod{}).Error; err != nil {tx.Rollback()return err}//删除存储if err := u.mysqlDb.Where("app_id = ?", appStoreID).Delete(&model.AppVolume{}).Error; err != nil {tx.Rollback()return err}//删除应用评论if err := u.mysqlDb.Where("app_id = ?", appStoreID).Delete(&model.AppComment{}).Error; err != nil {tx.Rollback()return err}return tx.Commit().Error
}//更新AppStore信息
func (u *AppStoreRepository) UpdateAppStore(appStore *model.AppStore) error {return u.mysqlDb.Model(appStore).Update(appStore).Error
}//获取结果集
func (u *AppStoreRepository) FindAll() (appStoreAll []model.AppStore, err error) {return appStoreAll, u.mysqlDb.Find(&appStoreAll).Error
}
11-5 云应用平台Service 代码开发
C:\Users\Administrator\Desktop\gopaas\appstore\domain\service\appStore_data_service.go
package serviceimport ("github.com/yunixiangfeng/gopaas/appStore/domain/model""github.com/yunixiangfeng/gopaas/appStore/domain/repository""k8s.io/client-go/kubernetes"
)//这里是接口类型
type IAppStoreDataService interface {AddAppStore(*model.AppStore) (int64, error)DeleteAppStore(int64) errorUpdateAppStore(*model.AppStore) errorFindAppStoreByID(int64) (*model.AppStore, error)FindAllAppStore() ([]model.AppStore, error)//统计服务AddInstallNum(int64) errorGetInstallNum(int64) int64AddViewNum(int64) errorGetViewNum(int64) int64
}//创建
//注意:返回值 IAppStoreDataService 接口类型
func NewAppStoreDataService(appStoreRepository repository.IAppStoreRepository, clientSet *kubernetes.Clientset) IAppStoreDataService {return &AppStoreDataService{AppStoreRepository: appStoreRepository}
}type AppStoreDataService struct {//注意:这里是 IAppStoreRepository 类型AppStoreRepository repository.IAppStoreRepository
}//安装数量统计
func (u *AppStoreDataService) AddInstallNum(appID int64) error {return u.AppStoreRepository.AddInstallNumber(appID)
}//查询安装数量
func (u *AppStoreDataService) GetInstallNum(appID int64) int64 {return u.AppStoreRepository.GetInstallNumber(appID)
}//添加浏览统计
func (u *AppStoreDataService) AddViewNum(appID int64) error {return u.AppStoreRepository.AddViewNumber(appID)
}//获取浏览量
func (u *AppStoreDataService) GetViewNum(appID int64) int64 {return u.AppStoreRepository.GetViewNumber(appID)
}//插入
func (u *AppStoreDataService) AddAppStore(appStore *model.AppStore) (int64, error) {return u.AppStoreRepository.CreateAppStore(appStore)
}//删除
func (u *AppStoreDataService) DeleteAppStore(appStoreID int64) error {return u.AppStoreRepository.DeleteAppStoreByID(appStoreID)
}//更新
func (u *AppStoreDataService) UpdateAppStore(appStore *model.AppStore) error {return u.AppStoreRepository.UpdateAppStore(appStore)
}//查找
func (u *AppStoreDataService) FindAppStoreByID(appStoreID int64) (*model.AppStore, error) {return u.AppStoreRepository.FindAppStoreByID(appStoreID)
}//查找
func (u *AppStoreDataService) FindAllAppStore() ([]model.AppStore, error) {return u.AppStoreRepository.FindAll()
}
11-6 云应用市场服务端Proto 开发
C:\Users\Administrator\Desktop\gopaas\appstore\proto\appStore\appStore.proto
syntax = "proto3";package appStore;option go_package = "./proto/appStore;appStore";service AppStore {//对外提供添加服务rpc AddAppStore(AppStoreInfo) returns (Response) {}rpc DeleteAppStore(AppStoreId) returns (Response) {}rpc UpdateAppStore(AppStoreInfo) returns (Response) {}rpc FindAppStoreByID(AppStoreId) returns (AppStoreInfo) {}rpc FindAllAppStore(FindAll) returns (AllAppStore) {}//添加常用的接口rpc AddInstallNum(AppStoreId) returns (Response){}rpc GetInstallNum(AppStoreId) returns (Number){}rpc AddViewNum(AppStoreId) returns (Response){}rpc GetViewNum(AppStoreId) returns (Number){}
}message AppStoreInfo {int64 id = 1;string app_sku =2;string app_title= 3;string app_describe =4;string app_detail =5;float app_price =6;int64 app_install =7;int64 app_views =8;bool app_check =9;int64 app_category_id =10;int64 app_isv_id = 11;repeated AppImage app_image =12;repeated AppPod app_pod =13;repeated AppMiddle app_middle =14;repeated AppVolume app_volume =15;repeated AppComment app_comment =16;
}message AppStoreId {int64 id = 1;
}message AppImage {int64 app_id =1;string app_image_src =2;
}message AppPod {int64 app_id =1;int64 app_pod_id =2;
}message AppMiddle{int64 app_id =1;int64 app_middle_id=2;
}message AppComment {int64 app_id =1;string app_comment_title =2;string app_comment_detail =3;int64 app_user_id =4;
}message AppVolume{int64 app_id =1;int64 app_volume_id =2;
}message FindAll {}message Response {string msg =1 ;
}message AllAppStore {repeated AppStoreInfo appStore_info = 1;
}message Number {int64 num =1;
}
make proto
11-7 云应用市场服务端 handler 开发
C:\Users\Administrator\Desktop\gopaas\appstore\handler\appStoreHandler.go
package handlerimport ("context""strconv"log "github.com/asim/go-micro/v3/logger""github.com/yunixiangfeng/gopaas/appStore/domain/model""github.com/yunixiangfeng/gopaas/appStore/domain/service"appStore "github.com/yunixiangfeng/gopaas/appStore/proto/appStore""github.com/yunixiangfeng/gopaas/common"
)type AppStoreHandler struct {//注意这里的类型是 IAppStoreDataService 接口类型AppStoreDataService service.IAppStoreDataService
}//添加安装统计
func (e *AppStoreHandler) AddInstallNum(ctx context.Context, req *appStore.AppStoreId, rsp *appStore.Response) error {if err := e.AppStoreDataService.AddInstallNum(req.Id); err != nil {common.Error(err)rsp.Msg = err.Error()return err}rsp.Msg = "统计成功"return nil
}//获取安装数量
func (e *AppStoreHandler) GetInstallNum(ctx context.Context, req *appStore.AppStoreId, rsp *appStore.Number) error {rsp.Num = e.AppStoreDataService.GetInstallNum(req.Id)return nil
}//添加查询统计
func (e *AppStoreHandler) AddViewNum(ctx context.Context, req *appStore.AppStoreId, rsp *appStore.Response) error {if err := e.AppStoreDataService.AddViewNum(req.Id); err != nil {common.Error(err)rsp.Msg = err.Error()return err}rsp.Msg = "统计成功"return nil
}//获取查询数量
func (e *AppStoreHandler) GetViewNum(ctx context.Context, req *appStore.AppStoreId, rsp *appStore.Number) error {rsp.Num = e.AppStoreDataService.GetViewNum(req.Id)return nil}// Call is a single request handler called via client.Call or the generated client code
func (e *AppStoreHandler) AddAppStore(ctx context.Context, info *appStore.AppStoreInfo, rsp *appStore.Response) error {log.Info("Received *appStore.AddAppStore request")appStoreModel := &model.AppStore{}if err := common.SwapTo(info, appStoreModel); err != nil {common.Error(err)rsp.Msg = err.Error()return err}appStoreID, err := e.AppStoreDataService.AddAppStore(appStoreModel)if err != nil {common.Error(err)rsp.Msg = err.Error()return err}rsp.Msg = "应用市场中新应用添加成功 ID 号为:" + strconv.FormatInt(appStoreID, 10)common.Info(rsp.Msg)return nil
}func (e *AppStoreHandler) DeleteAppStore(ctx context.Context, req *appStore.AppStoreId, rsp *appStore.Response) error {log.Info("Received *appStore.DeleteAppStore request")return e.AppStoreDataService.DeleteAppStore(req.Id)
}func (e *AppStoreHandler) UpdateAppStore(ctx context.Context, req *appStore.AppStoreInfo, rsp *appStore.Response) error {log.Info("Received *appStore.UpdateAppStore request")appStoreModel, err := e.AppStoreDataService.FindAppStoreByID(req.Id)if err != nil {common.Error(err)return err}if err := common.SwapTo(req, appStoreModel); err != nil {common.Error(err)return err}return e.AppStoreDataService.UpdateAppStore(appStoreModel)
}func (e *AppStoreHandler) FindAppStoreByID(ctx context.Context, req *appStore.AppStoreId, rsp *appStore.AppStoreInfo) error {log.Info("Received *appStore.FindAppStoreByID request")appStoreModel, err := e.AppStoreDataService.FindAppStoreByID(req.Id)if err != nil {common.Error(err)return err}if err := common.SwapTo(appStoreModel, rsp); err != nil {common.Error(err)return err}return nil
}func (e *AppStoreHandler) FindAllAppStore(ctx context.Context, req *appStore.FindAll, rsp *appStore.AllAppStore) error {log.Info("Received *appStore.FindAllAppStore request")allAppStore, err := e.AppStoreDataService.FindAllAppStore()if err != nil {common.Error(err)return err}//整理数据格式for _, v := range allAppStore {appStoreInfo := &appStore.AppStoreInfo{}if err := common.SwapTo(v, appStoreInfo); err != nil {common.Error(err)return err}rsp.AppStoreInfo = append(rsp.AppStoreInfo, appStoreInfo)}return nil
}
C:\Users\Administrator\Desktop\gopaas\appstore\main.go
package mainimport ("flag""fmt""path/filepath""github.com/yunixiangfeng/gopaas/appStore/domain/repository""github.com/yunixiangfeng/gopaas/common"//"github.com/afex/hystrix-go/hystrix""github.com/asim/go-micro/plugins/registry/consul/v3"ratelimit "github.com/asim/go-micro/plugins/wrapper/ratelimiter/uber/v3"opentracing2 "github.com/asim/go-micro/plugins/wrapper/trace/opentracing/v3""github.com/asim/go-micro/v3""github.com/asim/go-micro/v3/registry""github.com/asim/go-micro/v3/server""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql""github.com/opentracing/opentracing-go"service2 "github.com/yunixiangfeng/gopaas/appStore/domain/service""github.com/yunixiangfeng/gopaas/appStore/handler"//hystrix2 "github.com/yunixiangfeng/gopaas/appStore/plugin/hystrix""strconv"appStore "github.com/yunixiangfeng/gopaas/appStore/proto/appStore""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/clientcmd""k8s.io/client-go/util/homedir"
)var (//服务地址hostIp = "192.168.204.130"//服务地址serviceHost = hostIp//服务端口servicePort = "8091"//注册中心配置consulHost = hostIpconsulPort int64 = 8500//链路追踪tracerHost = hostIptracerPort = 6831//熔断端口,每个服务不能重复//hystrixPort = 9101//监控端口,每个服务不能重复prometheusPort = 9201
)func main() {//需要本地启动,mysql,consul中间件服务//1.注册中心consul := consul.NewRegistry(func(options *registry.Options) {options.Addrs = []string{consulHost + ":" + strconv.FormatInt(consulPort, 10),}})//2.配置中心,存放经常变动的变量consulConfig, err := common.GetConsulConfig(consulHost, consulPort, "/micro/config")if err != nil {common.Error(err)}//3.使用配置中心连接 mysqlmysqlInfo := common.GetMysqlFromConsul(consulConfig, "mysql")//初始化数据库db, err := gorm.Open("mysql", mysqlInfo.User+":"+mysqlInfo.Pwd+"@("+mysqlInfo.Host+":3306)/"+mysqlInfo.Database+"?charset=utf8&parseTime=True&loc=Local")if err != nil {//命令行输出下,方便查看错误fmt.Println(err)common.Fatal(err)}defer db.Close()//禁止复表db.SingularTable(true)//4.添加链路追踪t, io, err := common.NewTracer("go.micro.service.appStore", tracerHost+":"+strconv.Itoa(tracerPort))if err != nil {common.Error(err)}defer io.Close()opentracing.SetGlobalTracer(t)//添加熔断器,作为客户端需要启用//hystrixStreamHandler := hystrix.NewStreamHandler()//hystrixStreamHandler.Start()//添加日志中心//1)需要程序日志打入到日志文件中//2)在程序中添加filebeat.yml 文件//3) 启动filebeat,启动命令 ./filebeat -e -c filebeat.ymlfmt.Println("日志统一记录在根目录 micro.log 文件中,请点击查看日志!")//启动监听程序//go func() {// //http://192.168.204.130:9092/turbine/turbine.stream// //看板访问地址 http://127.0.0.1:9002/hystrix,url后面一定要带 /hystrix// err = http.ListenAndServe(net.JoinHostPort("0.0.0.0",strconv.Itoa(hystrixPort)),hystrixStreamHandler)// if err !=nil {// common.Error(err)// }//}()//5.添加监控common.PrometheusBoot(prometheusPort)//下载kubectl:https://kubernetes.io/docs/tasks/tools/#tabset-2//macos:// 1.curl -LO "https://dl.k8s.io/release/v1.21.0/bin/darwin/amd64/kubectl"// 2.chmod +x ./kubectl// 3.sudo mv ./kubectl /usr/local/bin/kubectl// sudo chown root: /usr/local/bin/kubectl// 5.kubectl version --client// 6.集群模式下直接拷贝服务端~/.kube/config 文件到本机 ~/.kube/confg 中// 注意:- config中的域名要能解析正确// - 生产环境可以创建另一个证书// 7.kubectl get ns 查看是否正常////6.创建k8s连接//在集群外面连接var kubeconfig *stringif home := homedir.HomeDir(); home != "" {kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")} else {kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")}flag.Parse()config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)if err != nil {common.Fatal(err.Error())}//在集群中外的配置//config, err := rest.InClusterConfig()//if err != nil {// panic(err.Error())//}// create the clientsetclientset, err := kubernetes.NewForConfig(config)if err != nil {common.Fatal(err.Error())}//7.创建服务service := micro.NewService(//自定义服务地址,且必须写在其它参数前面micro.Server(server.NewServer(func(options *server.Options) {options.Advertise = serviceHost + ":" + servicePort})),micro.Name("go.micro.service.appStore"),micro.Version("latest"),//指定服务端口micro.Address(":"+servicePort),//添加注册中心micro.Registry(consul),//添加链路追踪micro.WrapHandler(opentracing2.NewHandlerWrapper(opentracing.GlobalTracer())),micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())),//只作为客户端的时候起作用,如果存在调用别人的情况,原则上不去主动调用//micro.WrapClient(hystrix2.NewClientHystrixWrapper()),//添加限流micro.WrapHandler(ratelimit.NewHandlerWrapper(1000)),)service.Init()//只能执行一遍//err = repository.NewAppStoreRepository(db).InitTable()//if err != nil {// common.Fatal(err)//}// 注册句柄,可以快速操作已开发的服务appStoreDataService := service2.NewAppStoreDataService(repository.NewAppStoreRepository(db), clientset)appStore.RegisterAppStoreHandler(service.Server(), &handler.AppStoreHandler{AppStoreDataService: appStoreDataService})// 启动服务if err := service.Run(); err != nil {//输出启动失败信息common.Fatal(err)}
}
11-8 云应用市场APi Proto 开发
yu-tool.exe createApi github.com/yunixiangfeng/gopaas/appStoreApiyu-v3 --proto_path=. --micro_out=. --go_out=:. ./proto/appStoreApi/appStoreApi.protogo mod tidy
C:\Users\Administrator\Desktop\gopaas\appstoreapi\proto\appStoreApi\appStoreApi.proto
syntax = "proto3";package appStoreApi;option go_package = "./proto/appStoreApi;appStoreApi";service AppStoreApi {rpc FindAppStoreById(Request) returns (Response){}rpc AddAppStore(Request) returns (Response){}rpc DeleteAppStoreById(Request) returns (Response){}rpc UpdateAppStore(Request) returns (Response){}//默认接口rpc Call(Request) returns (Response){}//添加常用的统计接口rpc AddInstallNum(Request) returns (Response){}rpc GetInstallNum(Request) returns (Response){}rpc AddViewNum(Request) returns (Response){}rpc GetViewNum(Request) returns (Response){}
}message Pair {string key = 1;repeated string values = 2;
}message Request {string method = 1;string path = 2;map<string, Pair> header = 3;map<string, Pair> get = 4;map<string, Pair> post = 5;string body = 6;string url = 7;
}message Response {int32 statusCode = 1;map<string, Pair> header = 2;string body = 3;
}
C:\Users\Administrator\Desktop\gopaas\appstoreapi\handler\appStoreApiHandler.go
package handlerimport ("context""encoding/json""errors""strconv"log "github.com/asim/go-micro/v3/logger"appStore "github.com/yunixiangfeng/gopaas/appStore/proto/appStore"appStoreApi "github.com/yunixiangfeng/gopaas/appStoreApi/proto/appStoreApi""github.com/yunixiangfeng/gopaas/common"
)type AppStoreApi struct {AppStoreService appStore.AppStoreService
}//获取 url 中的应用ID
func (e *AppStoreApi) GetId(req *appStoreApi.Request) (int64, error) {if _, ok := req.Get["app_id"]; !ok {return 0, errors.New("参数异常")}//获取到ID后进行转化IdString := req.Get["app_id"].Values[0]Id, err := strconv.ParseInt(IdString, 10, 64)if err != nil {common.Error(err)return 0, err}return Id, nil
}// appStoreApi.FindAppStoreById 通过API向外暴露为/appStoreApi/findAppStoreById,接收http请求
// 即:/appStoreApi/FindAppStoreById 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.FindAppStoreById 方法
func (e *AppStoreApi) FindAppStoreById(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.FindAppStoreById request")Id, err := e.GetId(req)if err != nil {common.Error(err)return err}//获取应用市场中应用的相关信息info, err := e.AppStoreService.FindAppStoreByID(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(info)rsp.Body = string(b)return nil
}// appStoreApi.AddAppStore 通过API向外暴露为/appStoreApi/AddAppStore,接收http请求
// 即:/appStoreApi/AddAppStore 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.AddAppStore 方法
func (e *AppStoreApi) AddAppStore(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.AddAppStore request")addAppStore := &appStore.AppStoreInfo{}//进行简单form数据映射form.FormToAppStoreStruct(req.Post, addAppStore)//设置图片e.SetImage(req, addAppStore)//设置PODe.SetPod(req, addAppStore)//设置中间件e.SetMiddle(req, addAppStore)//设置存储e.SetVolume(req, addAppStore)//调用后端服务进行更新response, err := e.AppStoreService.AddAppStore(ctx, addAppStore)if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//设置图片
func (e *AppStoreApi) SetImage(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_image"]if ok {imageSlice := []*appStore.AppImage{}for _, v := range dataSlice.Values {image := &appStore.AppImage{AppImageSrc: v,}imageSlice = append(imageSlice, image)}appStoreInfo.AppImage = imageSlice}
}//设置POD模板
func (e *AppStoreApi) SetPod(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_pod"]if ok {podSlice := []*appStore.AppPod{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}pod := &appStore.AppPod{AppPodId: id,}podSlice = append(podSlice, pod)}appStoreInfo.AppPod = podSlice}
}//设置中间件模板
func (e *AppStoreApi) SetMiddle(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_middle"]if ok {middleSlice := []*appStore.AppMiddle{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}middle := &appStore.AppMiddle{AppMiddleId: id,}middleSlice = append(middleSlice, middle)}appStoreInfo.AppMiddle = middleSlice}}//设置存储
func (e *AppStoreApi) SetVolume(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_volume"]if ok {volumeSlice := []*appStore.AppVolume{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}volume := &appStore.AppVolume{AppVolumeId: id,}volumeSlice = append(volumeSlice, volume)}appStoreInfo.AppVolume = volumeSlice}
}// appStoreApi.DeleteAppStoreById 通过API向外暴露为/appStoreApi/DeleteAppStoreById,接收http请求
// 即:/appStoreApi/DeleteAppStoreById 请求会调用go.micro.api.appStoreApi 服务的 appStoreApi.DeleteAppStoreById 方法
func (e *AppStoreApi) DeleteAppStoreById(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.DeleteAppStoreById request")Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.DeleteAppStore(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}// appStoreApi.UpdateAppStore 通过API向外暴露为/appStoreApi/UpdateAppStore,接收http请求
// 即:/appStoreApi/UpdateAppStore 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.UpdateAppStore 方法
func (e *AppStoreApi) UpdateAppStore(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.UpdateAppStore request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问/appStoreApi/UpdateAppStore'}")rsp.Body = string(b)return nil
}// 默认的方法appStoreApi.Call 通过API向外暴露为/appStoreApi/call,接收http请求
// 即:/appStoreApi/call或/appStoreApi/ 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.FindAppStoreById 方法
func (e *AppStoreApi) Call(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}//安装统计接口
func (e *AppStoreApi) AddInstallNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.AddInstallNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//获取安装数量
func (e *AppStoreApi) GetInstallNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.GetInstallNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil}//安装统计接口
func (e *AppStoreApi) AddViewNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.AddViewNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//获取安装数量
func (e *AppStoreApi) GetViewNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.GetViewNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil}
file:///C:/Users/Administrator/Desktop/gopaas/go-paas-front/appstore-index.html
11-9 云应用市场 API form 表单处理研发
C:\Users\Administrator\Desktop\gopaas\appstoreapi\plugin\hystrix\form\form.go
package formimport ("errors""sort""strings""reflect""strconv""time""github.com/yunixiangfeng/gopaas/appStoreApi/proto/appStoreApi""github.com/yunixiangfeng/gopaas/common"
)//判断字符串是否存在
func isIn(target string, strArray []string) bool {sort.Strings(strArray)index := sort.SearchStrings(strArray, target)if index < len(strArray) && strArray[index] == target {return true}return false
}func FormToAppStoreStruct(data map[string]*appStoreApi.Pair, obj interface{}) {objValue := reflect.ValueOf(obj).Elem()for i := 0; i < objValue.NumField(); i++ {//获取sql对应的值dataTag := strings.Replace(objValue.Type().Field(i).Tag.Get("json"), ",omitempty", "", -1)dataSlice, ok := data[dataTag]if !ok {continue}valueSlice := dataSlice.Valuesif len(valueSlice) <= 0 {continue}//排除列表tagList := []string{"app_image", "app_pod", "app_middle", "app_volume", "app_comment"}//进行排除if isIn(dataTag, tagList) {continue}value := valueSlice[0]//端口,环境变量的单独处理//获取对应字段的名称name := objValue.Type().Field(i).Name//获取对应字段类型structFieldType := objValue.Field(i).Type()//获取变量类型,也可以直接写"string类型"val := reflect.ValueOf(value)var err errorif structFieldType != val.Type() {//类型转换val, err = TypeConversion(value, structFieldType.Name()) //类型转换if err != nil {common.Error(err)}}//设置类型值objValue.FieldByName(name).Set(val)}
}//类型转换
func TypeConversion(value string, ntype string) (reflect.Value, error) {if ntype == "string" {return reflect.ValueOf(value), nil} else if ntype == "time.Time" {t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)return reflect.ValueOf(t), err} else if ntype == "Time" {t, err := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)return reflect.ValueOf(t), err} else if ntype == "int" {i, err := strconv.Atoi(value)return reflect.ValueOf(i), err} else if ntype == "int32" {i, err := strconv.ParseInt(value, 10, 32)if err != nil {return reflect.ValueOf(int32(i)), err}return reflect.ValueOf(int32(i)), err} else if ntype == "int64" {i, err := strconv.ParseInt(value, 10, 64)return reflect.ValueOf(i), err} else if ntype == "float32" {i, err := strconv.ParseFloat(value, 64)return reflect.ValueOf(float32(i)), err} else if ntype == "float64" {i, err := strconv.ParseFloat(value, 64)return reflect.ValueOf(i), err}//else if .......增加其他一些类型的转换return reflect.ValueOf(value), errors.New("未知的类型:" + ntype)
}
11-10 云应用添加应用addAppStore 接口(上)
C:\Users\Administrator\Desktop\gopaas\appstoreapi\handler\appStoreApiHandler.go
// appStoreApi.AddAppStore 通过API向外暴露为/appStoreApi/AddAppStore,接收http请求
// 即:/appStoreApi/AddAppStore 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.AddAppStore 方法
func (e *AppStoreApi) AddAppStore(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.AddAppStore request")addAppStore := &appStore.AppStoreInfo{}//进行简单form数据映射form.FormToAppStoreStruct(req.Post, addAppStore)//设置图片e.SetImage(req, addAppStore)//设置PODe.SetPod(req, addAppStore)//设置中间件e.SetMiddle(req, addAppStore)//设置存储e.SetVolume(req, addAppStore)//调用后端服务进行更新response, err := e.AppStoreService.AddAppStore(ctx, addAppStore)if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//设置图片
func (e *AppStoreApi) SetImage(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_image"]if ok {imageSlice := []*appStore.AppImage{}for _, v := range dataSlice.Values {image := &appStore.AppImage{AppImageSrc: v,}imageSlice = append(imageSlice, image)}appStoreInfo.AppImage = imageSlice}
}//设置POD模板
func (e *AppStoreApi) SetPod(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_pod"]if ok {podSlice := []*appStore.AppPod{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}pod := &appStore.AppPod{AppPodId: id,}podSlice = append(podSlice, pod)}appStoreInfo.AppPod = podSlice}
}
11-11 云应用addAppStore(中)
C:\Users\Administrator\Desktop\gopaas\appstoreapi\handler\appStoreApiHandler.go
//设置中间件模板
func (e *AppStoreApi) SetMiddle(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_middle"]if ok {middleSlice := []*appStore.AppMiddle{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}middle := &appStore.AppMiddle{AppMiddleId: id,}middleSlice = append(middleSlice, middle)}appStoreInfo.AppMiddle = middleSlice}}//设置存储
func (e *AppStoreApi) SetVolume(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_volume"]if ok {volumeSlice := []*appStore.AppVolume{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}volume := &appStore.AppVolume{AppVolumeId: id,}volumeSlice = append(volumeSlice, volume)}appStoreInfo.AppVolume = volumeSlice}
}
11-12 云应用市场API 开发(下)
C:\Users\Administrator\Desktop\gopaas\appstoreapi\handler\appStoreApiHandler.go
//安装统计接口
func (e *AppStoreApi) AddInstallNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.AddInstallNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//获取安装数量
func (e *AppStoreApi) GetInstallNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.GetInstallNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil}//安装统计接口
func (e *AppStoreApi) AddViewNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.AddViewNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//获取安装数量
func (e *AppStoreApi) GetViewNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.GetViewNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil}
package handlerimport ("context""encoding/json""errors""strconv"log "github.com/asim/go-micro/v3/logger"appStore "github.com/yunixiangfeng/gopaas/appStore/proto/appStore""github.com/yunixiangfeng/gopaas/appStoreApi/plugin/hystrix/form"appStoreApi "github.com/yunixiangfeng/gopaas/appStoreApi/proto/appStoreApi""github.com/yunixiangfeng/gopaas/common"
)type AppStoreApi struct {AppStoreService appStore.AppStoreService
}//获取 url 中的应用ID
func (e *AppStoreApi) GetId(req *appStoreApi.Request) (int64, error) {if _, ok := req.Get["app_id"]; !ok {return 0, errors.New("参数异常")}//获取到ID后进行转化IdString := req.Get["app_id"].Values[0]Id, err := strconv.ParseInt(IdString, 10, 64)if err != nil {common.Error(err)return 0, err}return Id, nil
}// appStoreApi.FindAppStoreById 通过API向外暴露为/appStoreApi/findAppStoreById,接收http请求
// 即:/appStoreApi/FindAppStoreById 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.FindAppStoreById 方法
func (e *AppStoreApi) FindAppStoreById(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.FindAppStoreById request")Id, err := e.GetId(req)if err != nil {common.Error(err)return err}//获取应用市场中应用的相关信息info, err := e.AppStoreService.FindAppStoreByID(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(info)rsp.Body = string(b)return nil
}// appStoreApi.AddAppStore 通过API向外暴露为/appStoreApi/AddAppStore,接收http请求
// 即:/appStoreApi/AddAppStore 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.AddAppStore 方法
func (e *AppStoreApi) AddAppStore(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.AddAppStore request")addAppStore := &appStore.AppStoreInfo{}//进行简单form数据映射form.FormToAppStoreStruct(req.Post, addAppStore)//设置图片e.SetImage(req, addAppStore)//设置PODe.SetPod(req, addAppStore)//设置中间件e.SetMiddle(req, addAppStore)//设置存储e.SetVolume(req, addAppStore)//调用后端服务进行更新response, err := e.AppStoreService.AddAppStore(ctx, addAppStore)if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//设置图片
func (e *AppStoreApi) SetImage(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_image"]if ok {imageSlice := []*appStore.AppImage{}for _, v := range dataSlice.Values {image := &appStore.AppImage{AppImageSrc: v,}imageSlice = append(imageSlice, image)}appStoreInfo.AppImage = imageSlice}
}//设置POD模板
func (e *AppStoreApi) SetPod(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_pod"]if ok {podSlice := []*appStore.AppPod{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}pod := &appStore.AppPod{AppPodId: id,}podSlice = append(podSlice, pod)}appStoreInfo.AppPod = podSlice}
}//设置中间件模板
func (e *AppStoreApi) SetMiddle(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_middle"]if ok {middleSlice := []*appStore.AppMiddle{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}middle := &appStore.AppMiddle{AppMiddleId: id,}middleSlice = append(middleSlice, middle)}appStoreInfo.AppMiddle = middleSlice}}//设置存储
func (e *AppStoreApi) SetVolume(req *appStoreApi.Request, appStoreInfo *appStore.AppStoreInfo) {dataSlice, ok := req.Post["app_volume"]if ok {volumeSlice := []*appStore.AppVolume{}for _, v := range dataSlice.Values {id, err := strconv.ParseInt(v, 10, 64)if err != nil {common.Error(err)continue}volume := &appStore.AppVolume{AppVolumeId: id,}volumeSlice = append(volumeSlice, volume)}appStoreInfo.AppVolume = volumeSlice}
}// appStoreApi.DeleteAppStoreById 通过API向外暴露为/appStoreApi/DeleteAppStoreById,接收http请求
// 即:/appStoreApi/DeleteAppStoreById 请求会调用go.micro.api.appStoreApi 服务的 appStoreApi.DeleteAppStoreById 方法
func (e *AppStoreApi) DeleteAppStoreById(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.DeleteAppStoreById request")Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.DeleteAppStore(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}// appStoreApi.UpdateAppStore 通过API向外暴露为/appStoreApi/UpdateAppStore,接收http请求
// 即:/appStoreApi/UpdateAppStore 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.UpdateAppStore 方法
func (e *AppStoreApi) UpdateAppStore(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.UpdateAppStore request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问/appStoreApi/UpdateAppStore'}")rsp.Body = string(b)return nil
}// 默认的方法appStoreApi.Call 通过API向外暴露为/appStoreApi/call,接收http请求
// 即:/appStoreApi/call或/appStoreApi/ 请求会调用go.micro.api.appStoreApi 服务的appStoreApi.FindAppStoreById 方法
func (e *AppStoreApi) Call(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {log.Info("Received appStoreApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}//安装统计接口
func (e *AppStoreApi) AddInstallNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.AddInstallNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//获取安装数量
func (e *AppStoreApi) GetInstallNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.GetInstallNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil}//安装统计接口
func (e *AppStoreApi) AddViewNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.AddViewNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil
}//获取安装数量
func (e *AppStoreApi) GetViewNum(ctx context.Context, req *appStoreApi.Request, rsp *appStoreApi.Response) error {Id, err := e.GetId(req)if err != nil {common.Error(err)return err}response, err := e.AppStoreService.GetViewNum(ctx, &appStore.AppStoreId{Id: Id,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(response)rsp.Body = string(b)return nil}
C:\Users\Administrator\Desktop\gopaas\appstoreapi\main.go
package mainimport ("fmt""github.com/afex/hystrix-go/hystrix""github.com/asim/go-micro/plugins/registry/consul/v3"ratelimit "github.com/asim/go-micro/plugins/wrapper/ratelimiter/uber/v3""github.com/asim/go-micro/plugins/wrapper/select/roundrobin/v3"opentracing2 "github.com/asim/go-micro/plugins/wrapper/trace/opentracing/v3""github.com/asim/go-micro/v3""github.com/asim/go-micro/v3/registry""github.com/asim/go-micro/v3/server"go_micro_service_appStore "github.com/yunixiangfeng/gopaas/appStore/proto/appStore""github.com/yunixiangfeng/gopaas/common""net""net/http""strconv"_ "github.com/jinzhu/gorm/dialects/mysql""github.com/opentracing/opentracing-go""github.com/yunixiangfeng/gopaas/appStoreApi/handler"hystrix2 "github.com/yunixiangfeng/gopaas/appStoreApi/plugin/hystrix"appStoreApi "github.com/yunixiangfeng/gopaas/appStoreApi/proto/appStoreApi"
)var (//服务地址hostIp = "192.168.204.130"//服务地址serviceHost = hostIp//服务端口servicePort = "8092"//注册中心配置consulHost = hostIpconsulPort int64 = 8500//链路追踪tracerHost = hostIptracerPort = 6831//熔断端口,每个服务不能重复hystrixPort = 9102//监控端口,每个服务不能重复prometheusPort = 9202
)func main() {//需要本地启动,mysql,consul中间件服务//1.注册中心consul := consul.NewRegistry(func(options *registry.Options) {options.Addrs = []string{consulHost + ":" + strconv.FormatInt(consulPort, 10),}})//2.添加链路追踪t, io, err := common.NewTracer("go.micro.api.appStoreApi", tracerHost+":"+strconv.Itoa(tracerPort))if err != nil {common.Error(err)}defer io.Close()opentracing.SetGlobalTracer(t)//3.添加熔断器hystrixStreamHandler := hystrix.NewStreamHandler()hystrixStreamHandler.Start()//添加日志中心//1)需要程序日志打入到日志文件中//2)在程序中添加filebeat.yml 文件//3) 启动filebeat,启动命令 ./filebeat -e -c filebeat.ymlfmt.Println("日志统一记录在根目录 micro.log 文件中,请点击查看日志!")//启动监听程序go func() {//http://192.168.204.130:9092/turbine/turbine.stream//看板访问地址 http://127.0.0.1:9002/hystrix,url后面一定要带 /hystrixerr = http.ListenAndServe(net.JoinHostPort("0.0.0.0", strconv.Itoa(hystrixPort)), hystrixStreamHandler)if err != nil {common.Error(err)}}()//4.添加监控common.PrometheusBoot(prometheusPort)//5.创建服务service := micro.NewService(//自定义服务地址,且必须写在其它参数前面micro.Server(server.NewServer(func(opts *server.Options) {opts.Advertise = serviceHost + ":" + servicePort})),micro.Name("go.micro.api.appStoreApi"),micro.Version("latest"),//指定服务端口micro.Address(":"+servicePort),//添加注册中心micro.Registry(consul),//添加链路追踪micro.WrapHandler(opentracing2.NewHandlerWrapper(opentracing.GlobalTracer())),micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())),//只作为客户端的时候起作用micro.WrapClient(hystrix2.NewClientHystrixWrapper()),//添加限流micro.WrapHandler(ratelimit.NewHandlerWrapper(1000)),//增加负载均衡micro.WrapClient(roundrobin.NewClientWrapper()),)service.Init()// 指定需要访问的服务,可以快速操作已开发的服务,// 默认API服务名称带有"Api",程序会自动替换// 如果不带有特定字符会使用默认"XXX" 请自行替换appStoreService := go_micro_service_appStore.NewAppStoreService("go.micro.service.appStore", service.Client())// 注册控制器if err := appStoreApi.RegisterAppStoreApiHandler(service.Server(), &handler.AppStoreApi{AppStoreService: appStoreService}); err != nil {common.Error(err)}// 启动服务if err := service.Run(); err != nil {//输出启动失败信息common.Fatal(err)}
}
11-13 总结&思考
主要内容
云市场服务开发
云市场API开发
云市场页面联调
云市场能满足现在哪些场景?
云市场对私有化有哪些帮助?
第12章 云原生GoPaaS平台用户中心,健全验证统一管理
系统规模愈来愈大,人员规模成倍增长,关联的人员需要有精确的权限控制体系。本章通过权限管理,提供PaaS 平台的权限服务,得每个操作都可以进行权限控制,达到精细化管理PaaS 平台的目的。
12-1云原生平台用户中心-user-role-permission多对多模型开发
GO PaaS 平台用户中心开发
主要内容
用户中心服务开发
用户中心API开发
用户中心页面联调
yu-tool.exe newService github.com/yunixiangfeng/gopaas/useryu-v3 --proto_path=. --micro_out=. --go_out=:. ./proto/user/user.protogo mod tidy
C:\Users\Administrator\Desktop\gopaas\user\domain\model\user.go
package modeltype User struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`UserName string `gorm:"not_null;unique" json:"user_name"`UserEmail string `gorm:"not_null;unique" json:"user_email"`IsAdmin bool `json:"is_admin"`UserPwd string `json:"user_pwd`UserStatus int32 `json:"user_status"`Role []*Role `gorm:"many2many:user_role"`
}
C:\Users\Administrator\Desktop\gopaas\user\domain\model\role.go
package modeltype Role struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`RoleName string `json:"role_name`RoleStatus int32 `json:"role_status"`Permission []*Permission `gorm:"many2many:role_permission"`
}
C:\Users\Administrator\Desktop\gopaas\user\domain\model\permission.go
package modeltype Permission struct {ID int64 `gorm:"primary_key;not_null;auto_increment"`PermissionName string `json:"permission_name"`PermissionDescribe string `json:"permission_describe"`PermissionAction string `json:"permission_action"`PermissionStatus int32 `json:"permission_status"`
}
12-2云原生平台userrepository开发
C:\Users\Administrator\Desktop\gopaas\user\domain\repository\user_repository.go
package repositoryimport ("github.com/jinzhu/gorm""github.com/yunixiangfeng/gopaas/user/domain/model"
)//创建需要实现的接口
type IUserRepository interface {//初始化表InitTable() error//根据ID查处找数据FindUserByID(int64) (*model.User, error)//创建一条 user 数据CreateUser(*model.User) (int64, error)//根据ID删除一条 user 数据DeleteUserByID(int64) error//修改更新数据UpdateUser(*model.User) error//查找user所有数据FindAll() ([]model.User, error)// 分配角色AddRole(*model.User, []*model.Role) error// 更新用户角色UpdateRole(*model.User, []*model.Role) error// 删除用户的角色DeleteRole(*model.User, []*model.Role) error// 判断用户是否有对应的权限IsRight(string, int64) bool
}//创建userRepository
func NewUserRepository(db *gorm.DB) IUserRepository {return &UserRepository{mysqlDb: db}
}type UserRepository struct {mysqlDb *gorm.DB
}// 为已经存在的用户添加角色
func (u *UserRepository) AddRole(user *model.User, roles []*model.Role) error {return u.mysqlDb.Model(&user).Association("Role").Append(roles).Error
}// 更新用户角色
func (u *UserRepository) UpdateRole(user *model.User, roles []*model.Role) error {return u.mysqlDb.Model(&user).Association("Role").Replace(roles).Error
}// 删除用户角色
func (u *UserRepository) DeleteRole(user *model.User, roles []*model.Role) error {return u.mysqlDb.Model(&user).Association("Role").Delete(roles).Error
}// 检测当前用户是否具备权限
func (u *UserRepository) IsRight(action string, userID int64) bool {permission := &model.Permission{}sql := "select p.id From user u,user_role ur,role r,role_permission rp, permission p WHERE p.permission_action=? AND p.id = rp.permission_id AND rp.role_id=r,id AND ur.role_id AND ur.user_id=u.id AND u.id=?"u.mysqlDb.Raw(sql, action, userID).Scan(permission)// 可以写其它判断逻辑if permission.ID > 0 {return true}return false
}//初始化表
func (u *UserRepository) InitTable() error {return u.mysqlDb.CreateTable(&model.User{}, &model.Role{}, &model.Permission{}).Error
}//根据ID查找User信息
func (u *UserRepository) FindUserByID(userID int64) (user *model.User, err error) {user = &model.User{}return user, u.mysqlDb.First(user, userID).Error
}//创建User信息
func (u *UserRepository) CreateUser(user *model.User) (int64, error) {return user.ID, u.mysqlDb.Create(user).Error
}//根据ID删除User信息
func (u *UserRepository) DeleteUserByID(userID int64) error {return u.mysqlDb.Where("id = ?", userID).Delete(&model.User{}).Error
}//更新User信息
func (u *UserRepository) UpdateUser(user *model.User) error {return u.mysqlDb.Model(user).Update(user).Error
}//获取结果集
func (u *UserRepository) FindAll() (userAll []model.User, err error) {return userAll, u.mysqlDb.Find(&userAll).Error
}
12-3用户中心-角色-repository开发
C:\Users\Administrator\Desktop\gopaas\user\domain\repository\role_respository.go
package repositoryimport ("github.com/jinzhu/gorm""github.com/yunixiangfeng/gopaas/user/domain/model"
)//创建需要实现的接口
type IRoleRepository interface {//根据ID查找role 数据FindRoleByID(int64) (*model.Role, error)//创建一条 role 数据CreateRole(*model.Role) (int64, error)//根据ID删除一条 role 数据DeleteRoleByID(int64) error//修改更新数据UpdateRole(*model.Role) error//查找role所有数据FindAll() ([]model.Role, error)// 根据ID查找所有角色FindAllRoleById([]int64) ([]*model.Role, error)// 添加角色权限AddPermission(*model.Role, []*model.Permission) error// 更新角色权限UpdatePermission(*model.Role, []*model.Permission) error// 删除角色权限DeletePermission(*model.Role, []*model.Permission) error
}//创建RoleRepository
func NewRoleRepository(db *gorm.DB) IRoleRepository {return &RoleRepository{mysqlDb: db}
}type RoleRepository struct {mysqlDb *gorm.DB
}// 根据ID查找所有角色
func (u *RoleRepository) FindAllRoleById(id []int64) (roleAll []*model.Role, err error) {return roleAll, u.mysqlDb.Find(&roleAll, id).Error
}// 添加角色权限
func (u *RoleRepository) AddPermission(role *model.Role, permission []*model.Permission) error {return u.mysqlDb.Model(&role).Association("Permission").Append(permission).Error
}// 更新角色权限
func (u *RoleRepository) UpdatePermission(role *model.Role, permission []*model.Permission) error {return u.mysqlDb.Model(&role).Association("Permission").Append(permission).Error
}// 删除角色权限
func (u *RoleRepository) DeletePermission(role *model.Role, permission []*model.Permission) error {return u.mysqlDb.Model(&role).Association("Permission").Delete(permission).Error
}// 为已经存在的用户添加角色
func (u *RoleRepository) AddRole(role *model.Role, roles []*model.Role) error {return u.mysqlDb.Model(&role).Association("Role").Append(roles).Error
}//根据ID查找Role信息
func (u *RoleRepository) FindRoleByID(roleID int64) (role *model.Role, err error) {role = &model.Role{}return role, u.mysqlDb.Preload("Permission").First(role, roleID).Error
}//创建Role信息
func (u *RoleRepository) CreateRole(role *model.Role) (int64, error) {return role.ID, u.mysqlDb.Create(role).Error
}//根据ID删除Role信息
func (u *RoleRepository) DeleteRoleByID(roleID int64) error {return u.mysqlDb.Where("id = ?", roleID).Delete(&model.Role{}).Error
}//更新Role信息
func (u *RoleRepository) UpdateRole(role *model.Role) error {return u.mysqlDb.Model(role).Update(role).Error
}//获取结果集
func (u *RoleRepository) FindAll() (roleAll []model.Role, err error) {return roleAll, u.mysqlDb.Find(&roleAll).Error
}
12-4用户中心-权限-repository开发
C:\Users\Administrator\Desktop\gopaas\user\domain\repository\permission_respository.go
package repositoryimport ("github.com/jinzhu/gorm""github.com/yunixiangfeng/gopaas/user/domain/model"
)//创建需要实现的接口
type IPermissionRepository interface {//根据ID查找permission数据FindPermissionByID(int64) (*model.Permission, error)//创建一条 permission 数据CreatePermission(*model.Permission) (int64, error)//根据ID删除一条 permission 数据DeletePermissionByID(int64) error//修改更新数据UpdatePermission(*model.Permission) error//查找permission所有数据FindAll() ([]model.Permission, error)// 根据ID查找所有权限FindAllPermissionById(int64) ([]*model.Permission, error)
}//创建PermissionRepository
func NewPermissionRepository(db *gorm.DB) IPermissionRepository {return &PermissionRepository{mysqlDb: db}
}type PermissionRepository struct {mysqlDb *gorm.DB
}//根据ID查找Permission信息
func (u *PermissionRepository) FindPermissionByID(permissionID int64) (permission *model.Permission, err error) {permission = &model.Permission{}return permission, u.mysqlDb.First(permission, permissionID).Error
}//创建Permission信息
func (u *PermissionRepository) CreatePermission(permission *model.Permission) (int64, error) {return permission.ID, u.mysqlDb.Create(permission).Error
}//根据ID删除Permission信息
func (u *PermissionRepository) DeletePermissionByID(permissionID int64) error {return u.mysqlDb.Where("id = ?", permissionID).Delete(&model.Permission{}).Error
}//更新Permission信息
func (u *PermissionRepository) UpdatePermission(permission *model.Permission) error {return u.mysqlDb.Model(permission).Update(permission).Error
}//获取结果集
func (u *PermissionRepository) FindAll() (permissionAll []model.Permission, err error) {return permissionAll, u.mysqlDb.Find(&permissionAll).Error
}// 根据ID查找所有权限
func (u *PermissionRepository) FindAllPermissionById(id int64) (permissionAll []*model.Permission, err error) {return permissionAll, u.mysqlDb.Find(&permissionAll, id).Error
}
12-5用户中心-权限-repository开发
C:\Users\Administrator\Desktop\gopaas\user\domain\repository\permission_respository.go
同上
12-6用户中心-user-service开发
C:\Users\Administrator\Desktop\gopaas\user\domain\service\user_data_service.go
package serviceimport ("github.com/yunixiangfeng/gopaas/user/domain/model""github.com/yunixiangfeng/gopaas/user/domain/repository"v1 "k8s.io/api/apps/v1""k8s.io/client-go/kubernetes"
)//这里是接口类型
type IUserDataService interface {AddUser(*model.User) (int64, error)DeleteUser(int64) errorUpdateUser(*model.User) errorFindUserByID(int64) (*model.User, error)FindAllUser() ([]model.User, error)// 分配角色AddRole(*model.User, []*model.Role) errorUpdateRole(*model.User, []*model.Role) errorDeleteRole(*model.User, []*model.Role) error// 判断用户是否有权限IsRight(string, int64) bool
}//创建
//注意:返回值 IUserDataService 接口类型
func NewUserDataService(userRepository repository.IUserRepository, clientSet *kubernetes.Clientset) IUserDataService {return &UserDataService{UserRepository: userRepository, K8sClientSet: clientSet, deployment: &v1.Deployment{}}
}type UserDataService struct {//注意:这里是 IUserRepository 类型UserRepository repository.IUserRepository
}// 分配角色
func (u *UserDataService) AddRole(user *model.User, role []*model.Role) error {return u.UserRepository.AddRole(user, role)
}
func (u *UserDataService) UpdateRole(user *model.User, role []*model.Role) error {return u.UserRepository.UpdateRole(user, role)
}func (u *UserDataService) DeleteRole(user *model.User, role []*model.Role) error {return u.UserRepository.DeleteRole(user, role)
}// 判断用户是否有权限
func (u *UserDataService) IsRight(action string, userID int64) bool {return u.UserRepository.IsRight(action, userID)
}//插入
func (u *UserDataService) AddUser(user *model.User) (int64, error) {return u.UserRepository.CreateUser(user)
}//删除
func (u *UserDataService) DeleteUser(userID int64) error {return u.UserRepository.DeleteUserByID(userID)
}//更新
func (u *UserDataService) UpdateUser(user *model.User) error {return u.UserRepository.UpdateUser(user)
}//查找
func (u *UserDataService) FindUserByID(userID int64) (*model.User, error) {return u.UserRepository.FindUserByID(userID)
}//查找
func (u *UserDataService) FindAllUser() ([]model.User, error) {return u.UserRepository.FindAll()
}
12-7用户中心-role-service开发
C:\Users\Administrator\Desktop\gopaas\user\domain\service\role_data_service.go
package serviceimport ("github.com/yunixiangfeng/gopaas/user/domain/model""github.com/yunixiangfeng/gopaas/user/domain/repository""k8s.io/client-go/kubernetes"
)//这里是接口类型
type IRoleDataService interface {AddRole(*model.Role) (int64, error)DeleteRole(int64) errorUpdateRole(*model.Role) errorFindRoleByID(int64) (*model.Role, error)FindAllRole() ([]model.Role, error)// 根据ID查找所有角色FindAllRoleByID([]int64) ([]*model.Role, error)// 添加权限AddPermission(*model.Role, []*model.Permission) errorUpdatePermission(*model.Role, []*model.Permission) errorDeletePermission(*model.Role, []*model.Permission) error
}//创建
//注意:返回值 IRoleDataService 接口类型
func NewRoleDataService(roleRepository repository.IRoleRepository, clientSet *kubernetes.Clientset) IRoleDataService {return &RoleDataService{RoleRepository: roleRepository}
}type RoleDataService struct {//注意:这里是 IRoleRepository 类型RoleRepository repository.IRoleRepository
}// 根据ID查找所有角色
func (u *RoleDataService) FindAllRoleByID(id []int64) (roleAll []*model.Role, err error) {return u.RoleRepository.FindAllRoleById(id)
}// 添加权限
func (u *RoleDataService) AddPermission(role *model.Role, permission []*model.Permission) error {return u.RoleRepository.AddPermission(role, permission)
}func (u *RoleDataService) UpdatePermission(role *model.Role, permission []*model.Permission) error {return u.RoleRepository.UpdatePermission(role, permission)
}func (u *RoleDataService) DeletePermission(role *model.Role, permission []*model.Permission) error {return u.RoleRepository.DeletePermission(role, permission)
}//插入
func (u *RoleDataService) AddRole(role *model.Role) (int64, error) {return u.RoleRepository.CreateRole(role)
}//删除
func (u *RoleDataService) DeleteRole(roleID int64) error {return u.RoleRepository.DeleteRoleByID(roleID)
}//更新
func (u *RoleDataService) UpdateRole(role *model.Role) error {return u.RoleRepository.UpdateRole(role)
}//查找
func (u *RoleDataService) FindRoleByID(roleID int64) (*model.Role, error) {return u.RoleRepository.FindRoleByID(roleID)
}//查找
func (u *RoleDataService) FindAllRole() ([]model.Role, error) {return u.RoleRepository.FindAll()
}
12-8用户中心-权限-service开发
C:\Users\Administrator\Desktop\gopaas\user\domain\service\permission_data_service.go
package serviceimport ("github.com/yunixiangfeng/gopaas/user/domain/model""github.com/yunixiangfeng/gopaas/user/domain/repository""k8s.io/client-go/kubernetes"
)//这里是接口类型
type IPermissionDataService interface {AddPermission(*model.Permission) (int64, error)DeletePermission(int64) errorUpdatePermission(*model.Permission) errorFindPermissionByID(int64) (*model.Permission, error)FindAllPermission() ([]model.Permission, error)// 根据ID查询所有权限FindAllPermissionByID([]int64) ([]*model.Permission, error)
}//创建
//注意:返回值 IPermissionDataService 接口类型
func NewPermissionDataService(permissionRepository repository.IPermissionRepository, clientSet *kubernetes.Clientset) IPermissionDataService {return &PermissionDataService{PermissionRepository: permissionRepository}
}type PermissionDataService struct {//注意:这里是 IPermissionRepository 类型PermissionRepository repository.IPermissionRepository
}// 根据ID查询所有权限
func (u *PermissionDataService) FindAllPermissionByID(id []int64) ([]*model.Permission, error) {return u.PermissionRepository.FindAllPermissionById(id)
}//插入
func (u *PermissionDataService) AddPermission(permission *model.Permission) (int64, error) {return u.PermissionRepository.CreatePermission(permission)
}//删除
func (u *PermissionDataService) DeletePermission(permissionID int64) error {return u.PermissionRepository.DeletePermissionByID(permissionID)
}//更新
func (u *PermissionDataService) UpdatePermission(permission *model.Permission) error {return u.PermissionRepository.UpdatePermission(permission)
}//查找
func (u *PermissionDataService) FindPermissionByID(permissionID int64) (*model.Permission, error) {return u.PermissionRepository.FindPermissionByID(permissionID)
}//查找
func (u *PermissionDataService) FindAllPermission() ([]model.Permission, error) {return u.PermissionRepository.FindAll()
}
12-9用户中心-user-proto开发
C:\Users\Administrator\Desktop\gopaas\user\proto\user\user.proto
syntax = "proto3";package user;option go_package = "./proto/user;user";service User {//对外提供添加服务rpc AddUser(UserInfo) returns (Response) {}rpc DeleteUser(UserId) returns (Response) {}rpc UpdateUser(UserInfo) returns (Response) {}rpc FindUserByID(UserId) returns (UserInfo) {}rpc FindAllUser(FindAll) returns (AllUser) {}// rpc AddRole(UserRole) returns (Response) {}rpc UpdateRole(UserRole) returns (Response) {}rpc DeleteRole(UserRole) returns (Response) {}rpc IsRight(UserRight) returns (Right) {}
}message UserRole {int64 user_id=1;repeated int64 role_id=2;
}message UserRight {int64 user_id = 1;string action =2;
}message Right {bool access =1;
}message UserInfo {int64 id = 1;string user_name =2;string user_email =3;bool is_admin =4;string user_pwd =5;int32 user_status = 6;
}message UserId {int64 id = 1;
}message FindAll {}message Response {string msg =1 ;
}message AllUser {repeated UserInfo user_info = 1;
}
12-10用户中心-角色-权限-proto开发及生成
C:\Users\Administrator\Desktop\gopaas\user\proto\role\role.proto
syntax = "proto3";package role;option go_package = "./proto/role;role";service Role {//对外提供添加服务rpc AddRole(RoleInfo) returns (Response) {}rpc DeleteRole(RoleId) returns (Response) {}rpc UpdateRole(RoleInfo) returns (Response) {}rpc FindRoleByID(RoleId) returns (RoleInfo) {}rpc FindAllRole(FindAll) returns (AllRole) {}// rpc AddPermission(RolePermission) returns (Response) {}rpc UpdatePermission(RolePermission) returns (Response) {}rpc DeletePermission(RolePermission) returns (Response) {}
}message RolePermission {int64 role_id =1;repeated int64 permission_id =2;
}message RoleInfo {int64 id = 1;string role_name =2;int32 role_status = 3;
}message RoleId {int64 id = 1;
}message FindAll {}message Response {string msg =1 ;
}message AllRole {repeated RoleInfo role_info = 1;
}
C:\Users\Administrator\Desktop\gopaas\user\proto\permission\permission.proto
syntax = "proto3";package permission;option go_package = "./proto/permission;permission";service Permission {//对外提供添加服务rpc AddPermission(PermissionInfo) returns (Response) {}rpc DeletePermission(PermissionId) returns (Response) {}rpc UpdatePermission(PermissionInfo) returns (Response) {}rpc FindPermissionByID(PermissionId) returns (PermissionInfo) {}rpc FindAllPermission(FindAll) returns (AllPermission) {}}message PermissionInfo {int64 id = 1;string permission_name =2;string permission_describe =3;string permission_action = 4;int32 permission_status = 5;
}message PermissionId {int64 id = 1;
}message FindAll {}message Response {string msg =1 ;
}message AllPermission {repeated PermissionInfo permission_info = 1;
}
PS D:\Workspace\Go\bin> D:\Workspace\Go\bin\protoc.exe --proto_path=C:\Users\Administrator\Desktop\gopaas\user --micro_out=C:\Users\Administrator\Desktop\gopaas\user --go_out=:C:\Users\Administrator\Desktop\gopaas\user C:\Users\Administrator\Desktop\gopaas\user\proto\user\user.proto
PS D:\Workspace\Go\bin> D:\Workspace\Go\bin\protoc.exe --proto_path=C:\Users\Administrator\Desktop\gopaas\user --micro_out=C:\Users\Administrator\Desktop\gopaas\user --go_out=:C:\Users\Administrator\Desktop\gopaas\user C:\Users\Administrator\Desktop\gopaas\user\proto\role\role.proto
PS D:\Workspace\Go\bin> D:\Workspace\Go\bin\protoc.exe --proto_path=C:\Users\Administrator\Desktop\gopaas\user --micro_out=C:\Users\Administrator\Desktop\gopaas\user --go_out=:C:\Users\Administrator\Desktop\gopaas\user C:\Users\Administrator\Desktop\gopaas\user\proto\permission\permission.proto
C:\Users\Administrator\Desktop\gopaas\user\proto\user\user.pb.micro.go
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: proto/user/user.protopackage userimport (fmt "fmt"proto "google.golang.org/protobuf/proto"math "math"
)import (context "context"api "github.com/asim/go-micro/v3/api"client "github.com/asim/go-micro/v3/client"server "github.com/asim/go-micro/v3/server"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option// Api Endpoints for User servicefunc NewUserEndpoints() []*api.Endpoint {return []*api.Endpoint{}
}// Client API for User servicetype UserService interface {//对外提供添加服务AddUser(ctx context.Context, in *UserInfo, opts ...client.CallOption) (*Response, error)DeleteUser(ctx context.Context, in *UserId, opts ...client.CallOption) (*Response, error)UpdateUser(ctx context.Context, in *UserInfo, opts ...client.CallOption) (*Response, error)FindUserByID(ctx context.Context, in *UserId, opts ...client.CallOption) (*UserInfo, error)FindAllUser(ctx context.Context, in *FindAll, opts ...client.CallOption) (*AllUser, error)// 添加常用的接口AddRole(ctx context.Context, in *UserRole, opts ...client.CallOption) (*Response, error)UpdateRole(ctx context.Context, in *UserRole, opts ...client.CallOption) (*Response, error)DeleteRole(ctx context.Context, in *UserRole, opts ...client.CallOption) (*Response, error)IsRight(ctx context.Context, in *UserRight, opts ...client.CallOption) (*Right, error)
}type userService struct {c client.Clientname string
}func NewUserService(name string, c client.Client) UserService {if c == nil {c = client.NewClient()}if len(name) == 0 {name = "user"}return &userService{c: c,name: name,}
}func (c *userService) AddUser(ctx context.Context, in *UserInfo, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "User.AddUser", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) DeleteUser(ctx context.Context, in *UserId, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "User.DeleteUser", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) UpdateUser(ctx context.Context, in *UserInfo, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "User.UpdateUser", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) FindUserByID(ctx context.Context, in *UserId, opts ...client.CallOption) (*UserInfo, error) {req := c.c.NewRequest(c.name, "User.FindUserByID", in)out := new(UserInfo)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) FindAllUser(ctx context.Context, in *FindAll, opts ...client.CallOption) (*AllUser, error) {req := c.c.NewRequest(c.name, "User.FindAllUser", in)out := new(AllUser)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) AddRole(ctx context.Context, in *UserRole, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "User.AddRole", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) UpdateRole(ctx context.Context, in *UserRole, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "User.UpdateRole", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) DeleteRole(ctx context.Context, in *UserRole, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "User.DeleteRole", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *userService) IsRight(ctx context.Context, in *UserRight, opts ...client.CallOption) (*Right, error) {req := c.c.NewRequest(c.name, "User.IsRight", in)out := new(Right)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}// Server API for User servicetype UserHandler interface {//对外提供添加服务AddUser(context.Context, *UserInfo, *Response) errorDeleteUser(context.Context, *UserId, *Response) errorUpdateUser(context.Context, *UserInfo, *Response) errorFindUserByID(context.Context, *UserId, *UserInfo) errorFindAllUser(context.Context, *FindAll, *AllUser) error// 添加常用的接口AddRole(context.Context, *UserRole, *Response) errorUpdateRole(context.Context, *UserRole, *Response) errorDeleteRole(context.Context, *UserRole, *Response) errorIsRight(context.Context, *UserRight, *Right) error
}func RegisterUserHandler(s server.Server, hdlr UserHandler, opts ...server.HandlerOption) error {type user interface {AddUser(ctx context.Context, in *UserInfo, out *Response) errorDeleteUser(ctx context.Context, in *UserId, out *Response) errorUpdateUser(ctx context.Context, in *UserInfo, out *Response) errorFindUserByID(ctx context.Context, in *UserId, out *UserInfo) errorFindAllUser(ctx context.Context, in *FindAll, out *AllUser) errorAddRole(ctx context.Context, in *UserRole, out *Response) errorUpdateRole(ctx context.Context, in *UserRole, out *Response) errorDeleteRole(ctx context.Context, in *UserRole, out *Response) errorIsRight(ctx context.Context, in *UserRight, out *Right) error}type User struct {user}h := &userHandler{hdlr}return s.Handle(s.NewHandler(&User{h}, opts...))
}type userHandler struct {UserHandler
}func (h *userHandler) AddUser(ctx context.Context, in *UserInfo, out *Response) error {return h.UserHandler.AddUser(ctx, in, out)
}func (h *userHandler) DeleteUser(ctx context.Context, in *UserId, out *Response) error {return h.UserHandler.DeleteUser(ctx, in, out)
}func (h *userHandler) UpdateUser(ctx context.Context, in *UserInfo, out *Response) error {return h.UserHandler.UpdateUser(ctx, in, out)
}func (h *userHandler) FindUserByID(ctx context.Context, in *UserId, out *UserInfo) error {return h.UserHandler.FindUserByID(ctx, in, out)
}func (h *userHandler) FindAllUser(ctx context.Context, in *FindAll, out *AllUser) error {return h.UserHandler.FindAllUser(ctx, in, out)
}func (h *userHandler) AddRole(ctx context.Context, in *UserRole, out *Response) error {return h.UserHandler.AddRole(ctx, in, out)
}func (h *userHandler) UpdateRole(ctx context.Context, in *UserRole, out *Response) error {return h.UserHandler.UpdateRole(ctx, in, out)
}func (h *userHandler) DeleteRole(ctx context.Context, in *UserRole, out *Response) error {return h.UserHandler.DeleteRole(ctx, in, out)
}func (h *userHandler) IsRight(ctx context.Context, in *UserRight, out *Right) error {return h.UserHandler.IsRight(ctx, in, out)
}
C:\Users\Administrator\Desktop\gopaas\user\proto\user\user.pb.go
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.30.0
// protoc v4.23.1
// source: proto/user/user.protopackage userimport (protoreflect "google.golang.org/protobuf/reflect/protoreflect"protoimpl "google.golang.org/protobuf/runtime/protoimpl"reflect "reflect"sync "sync"
)const (// Verify that this generated code is sufficiently up-to-date._ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)// Verify that runtime/protoimpl is sufficiently up-to-date._ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)type UserRole struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsUserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`RoleId []int64 `protobuf:"varint,2,rep,packed,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`
}func (x *UserRole) Reset() {*x = UserRole{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[0]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *UserRole) String() string {return protoimpl.X.MessageStringOf(x)
}func (*UserRole) ProtoMessage() {}func (x *UserRole) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[0]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use UserRole.ProtoReflect.Descriptor instead.
func (*UserRole) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{0}
}func (x *UserRole) GetUserId() int64 {if x != nil {return x.UserId}return 0
}func (x *UserRole) GetRoleId() []int64 {if x != nil {return x.RoleId}return nil
}type UserRight struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsUserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`Action string `protobuf:"bytes,2,opt,name=action,proto3" json:"action,omitempty"`
}func (x *UserRight) Reset() {*x = UserRight{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[1]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *UserRight) String() string {return protoimpl.X.MessageStringOf(x)
}func (*UserRight) ProtoMessage() {}func (x *UserRight) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[1]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use UserRight.ProtoReflect.Descriptor instead.
func (*UserRight) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{1}
}func (x *UserRight) GetUserId() int64 {if x != nil {return x.UserId}return 0
}func (x *UserRight) GetAction() string {if x != nil {return x.Action}return ""
}type Right struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsAccess bool `protobuf:"varint,1,opt,name=access,proto3" json:"access,omitempty"`
}func (x *Right) Reset() {*x = Right{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[2]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *Right) String() string {return protoimpl.X.MessageStringOf(x)
}func (*Right) ProtoMessage() {}func (x *Right) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[2]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use Right.ProtoReflect.Descriptor instead.
func (*Right) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{2}
}func (x *Right) GetAccess() bool {if x != nil {return x.Access}return false
}type UserInfo struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsId int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`UserName string `protobuf:"bytes,2,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`UserEmail string `protobuf:"bytes,3,opt,name=user_email,json=userEmail,proto3" json:"user_email,omitempty"`IsAdmin bool `protobuf:"varint,4,opt,name=is_admin,json=isAdmin,proto3" json:"is_admin,omitempty"`UserPwd string `protobuf:"bytes,5,opt,name=user_pwd,json=userPwd,proto3" json:"user_pwd,omitempty"`UserStatus int32 `protobuf:"varint,6,opt,name=user_status,json=userStatus,proto3" json:"user_status,omitempty"`
}func (x *UserInfo) Reset() {*x = UserInfo{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[3]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *UserInfo) String() string {return protoimpl.X.MessageStringOf(x)
}func (*UserInfo) ProtoMessage() {}func (x *UserInfo) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[3]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use UserInfo.ProtoReflect.Descriptor instead.
func (*UserInfo) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{3}
}func (x *UserInfo) GetId() int64 {if x != nil {return x.Id}return 0
}func (x *UserInfo) GetUserName() string {if x != nil {return x.UserName}return ""
}func (x *UserInfo) GetUserEmail() string {if x != nil {return x.UserEmail}return ""
}func (x *UserInfo) GetIsAdmin() bool {if x != nil {return x.IsAdmin}return false
}func (x *UserInfo) GetUserPwd() string {if x != nil {return x.UserPwd}return ""
}func (x *UserInfo) GetUserStatus() int32 {if x != nil {return x.UserStatus}return 0
}type UserId struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsId int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
}func (x *UserId) Reset() {*x = UserId{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[4]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *UserId) String() string {return protoimpl.X.MessageStringOf(x)
}func (*UserId) ProtoMessage() {}func (x *UserId) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[4]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use UserId.ProtoReflect.Descriptor instead.
func (*UserId) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{4}
}func (x *UserId) GetId() int64 {if x != nil {return x.Id}return 0
}type FindAll struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFields
}func (x *FindAll) Reset() {*x = FindAll{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[5]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *FindAll) String() string {return protoimpl.X.MessageStringOf(x)
}func (*FindAll) ProtoMessage() {}func (x *FindAll) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[5]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use FindAll.ProtoReflect.Descriptor instead.
func (*FindAll) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{5}
}type Response struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsMsg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
}func (x *Response) Reset() {*x = Response{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[6]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *Response) String() string {return protoimpl.X.MessageStringOf(x)
}func (*Response) ProtoMessage() {}func (x *Response) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[6]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use Response.ProtoReflect.Descriptor instead.
func (*Response) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{6}
}func (x *Response) GetMsg() string {if x != nil {return x.Msg}return ""
}type AllUser struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsUserInfo []*UserInfo `protobuf:"bytes,1,rep,name=user_info,json=userInfo,proto3" json:"user_info,omitempty"`
}func (x *AllUser) Reset() {*x = AllUser{}if protoimpl.UnsafeEnabled {mi := &file_proto_user_user_proto_msgTypes[7]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *AllUser) String() string {return protoimpl.X.MessageStringOf(x)
}func (*AllUser) ProtoMessage() {}func (x *AllUser) ProtoReflect() protoreflect.Message {mi := &file_proto_user_user_proto_msgTypes[7]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use AllUser.ProtoReflect.Descriptor instead.
func (*AllUser) Descriptor() ([]byte, []int) {return file_proto_user_user_proto_rawDescGZIP(), []int{7}
}func (x *AllUser) GetUserInfo() []*UserInfo {if x != nil {return x.UserInfo}return nil
}var File_proto_user_user_proto protoreflect.FileDescriptorvar file_proto_user_user_proto_rawDesc = []byte{0x0a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x75, 0x73, 0x65,0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3c, 0x0a,0x08, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20,0x03, 0x28, 0x03, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x09, 0x55,0x73, 0x65, 0x72, 0x52, 0x69, 0x67, 0x68, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72,0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1f, 0x0a, 0x05, 0x52, 0x69, 0x67,0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x08, 0x55,0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f,0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72,0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61,0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d,0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x18,0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x19,0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x77, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x50, 0x77, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65,0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a,0x75, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73,0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,0x52, 0x02, 0x69, 0x64, 0x22, 0x09, 0x0a, 0x07, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x22,0x1c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d,0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x36, 0x0a,0x07, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72,0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x75, 0x73,0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x75, 0x73, 0x65,0x72, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0xa8, 0x03, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x2b,0x0a, 0x07, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72,0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72,0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x0a, 0x44,0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0c, 0x2e, 0x75, 0x73, 0x65, 0x72,0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52,0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0a, 0x55, 0x70, 0x64,0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55,0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52,0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0c, 0x46, 0x69, 0x6e,0x64, 0x55, 0x73, 0x65, 0x72, 0x42, 0x79, 0x49, 0x44, 0x12, 0x0c, 0x2e, 0x75, 0x73, 0x65, 0x72,0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55,0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x0b, 0x46, 0x69, 0x6e,0x64, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0d, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e,0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x1a, 0x0d, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x41,0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52,0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52,0x6f, 0x6c, 0x65, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f,0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52,0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52,0x6f, 0x6c, 0x65, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f,0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52,0x6f, 0x6c, 0x65, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f,0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x07, 0x49, 0x73, 0x52, 0x69, 0x67, 0x68, 0x74,0x12, 0x0f, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x69, 0x67, 0x68,0x74, 0x1a, 0x0b, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x67, 0x68, 0x74, 0x22, 0x00,0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72,0x3b, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}var (file_proto_user_user_proto_rawDescOnce sync.Oncefile_proto_user_user_proto_rawDescData = file_proto_user_user_proto_rawDesc
)func file_proto_user_user_proto_rawDescGZIP() []byte {file_proto_user_user_proto_rawDescOnce.Do(func() {file_proto_user_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_user_user_proto_rawDescData)})return file_proto_user_user_proto_rawDescData
}var file_proto_user_user_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_proto_user_user_proto_goTypes = []interface{}{(*UserRole)(nil), // 0: user.UserRole(*UserRight)(nil), // 1: user.UserRight(*Right)(nil), // 2: user.Right(*UserInfo)(nil), // 3: user.UserInfo(*UserId)(nil), // 4: user.UserId(*FindAll)(nil), // 5: user.FindAll(*Response)(nil), // 6: user.Response(*AllUser)(nil), // 7: user.AllUser
}
var file_proto_user_user_proto_depIdxs = []int32{3, // 0: user.AllUser.user_info:type_name -> user.UserInfo3, // 1: user.User.AddUser:input_type -> user.UserInfo4, // 2: user.User.DeleteUser:input_type -> user.UserId3, // 3: user.User.UpdateUser:input_type -> user.UserInfo4, // 4: user.User.FindUserByID:input_type -> user.UserId5, // 5: user.User.FindAllUser:input_type -> user.FindAll0, // 6: user.User.AddRole:input_type -> user.UserRole0, // 7: user.User.UpdateRole:input_type -> user.UserRole0, // 8: user.User.DeleteRole:input_type -> user.UserRole1, // 9: user.User.IsRight:input_type -> user.UserRight6, // 10: user.User.AddUser:output_type -> user.Response6, // 11: user.User.DeleteUser:output_type -> user.Response6, // 12: user.User.UpdateUser:output_type -> user.Response3, // 13: user.User.FindUserByID:output_type -> user.UserInfo7, // 14: user.User.FindAllUser:output_type -> user.AllUser6, // 15: user.User.AddRole:output_type -> user.Response6, // 16: user.User.UpdateRole:output_type -> user.Response6, // 17: user.User.DeleteRole:output_type -> user.Response2, // 18: user.User.IsRight:output_type -> user.Right10, // [10:19] is the sub-list for method output_type1, // [1:10] is the sub-list for method input_type1, // [1:1] is the sub-list for extension type_name1, // [1:1] is the sub-list for extension extendee0, // [0:1] is the sub-list for field type_name
}func init() { file_proto_user_user_proto_init() }
func file_proto_user_user_proto_init() {if File_proto_user_user_proto != nil {return}if !protoimpl.UnsafeEnabled {file_proto_user_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*UserRole); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_user_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*UserRight); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_user_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*Right); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_user_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*UserInfo); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_user_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*UserId); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_user_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*FindAll); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_user_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*Response); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_user_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*AllUser); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}}type x struct{}out := protoimpl.TypeBuilder{File: protoimpl.DescBuilder{GoPackagePath: reflect.TypeOf(x{}).PkgPath(),RawDescriptor: file_proto_user_user_proto_rawDesc,NumEnums: 0,NumMessages: 8,NumExtensions: 0,NumServices: 1,},GoTypes: file_proto_user_user_proto_goTypes,DependencyIndexes: file_proto_user_user_proto_depIdxs,MessageInfos: file_proto_user_user_proto_msgTypes,}.Build()File_proto_user_user_proto = out.Filefile_proto_user_user_proto_rawDesc = nilfile_proto_user_user_proto_goTypes = nilfile_proto_user_user_proto_depIdxs = nil
}
C:\Users\Administrator\Desktop\gopaas\user\proto\role\role.pb.micro.go
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: proto/role/role.protopackage roleimport (fmt "fmt"proto "google.golang.org/protobuf/proto"math "math"
)import (context "context"api "github.com/asim/go-micro/v3/api"client "github.com/asim/go-micro/v3/client"server "github.com/asim/go-micro/v3/server"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option// Api Endpoints for User servicefunc NewRoleEndpoints() []*api.Endpoint {return []*api.Endpoint{}
}// Client API for Role servicetype RoleService interface {//对外提供添加服务AddRole(ctx context.Context, in *RoleInfo, opts ...client.CallOption) (*Response, error)DeleteRole(ctx context.Context, in *RoleId, opts ...client.CallOption) (*Response, error)UpdateRole(ctx context.Context, in *RoleInfo, opts ...client.CallOption) (*Response, error)FindRoleByID(ctx context.Context, in *RoleId, opts ...client.CallOption) (*RoleInfo, error)FindAllRole(ctx context.Context, in *FindAll, opts ...client.CallOption) (*AllRole, error)//AddPermission(ctx context.Context, in *RolePermission, opts ...client.CallOption) (*Response, error)UpdatePermission(ctx context.Context, in *RolePermission, opts ...client.CallOption) (*Response, error)DeletePermission(ctx context.Context, in *RolePermission, opts ...client.CallOption) (*Response, error)
}type roleService struct {c client.Clientname string
}func NewRoleService(name string, c client.Client) RoleService {if c == nil {c = client.NewClient()}if len(name) == 0 {name = "role"}return &roleService{c: c,name: name,}
}func (c *roleService) AddRole(ctx context.Context, in *RoleInfo, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Role.AddRole", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *roleService) DeleteRole(ctx context.Context, in *RoleId, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Role.DeleteRole", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *roleService) UpdateRole(ctx context.Context, in *RoleInfo, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Role.UpdateRole", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *roleService) FindRoleByID(ctx context.Context, in *RoleId, opts ...client.CallOption) (*RoleInfo, error) {req := c.c.NewRequest(c.name, "Role.FindRoleByID", in)out := new(RoleInfo)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *roleService) FindAllRole(ctx context.Context, in *FindAll, opts ...client.CallOption) (*AllRole, error) {req := c.c.NewRequest(c.name, "Role.FindAllRole", in)out := new(AllRole)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *roleService) AddPermission(ctx context.Context, in *RolePermission, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Role.AddPermission", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *roleService) UpdatePermission(ctx context.Context, in *RolePermission, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Role.UpdatePermission", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *roleService) DeletePermission(ctx context.Context, in *RolePermission, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Role.DeletePermission", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}// Server API for Role servicetype RoleHandler interface {//对外提供添加服务AddRole(context.Context, *RoleInfo, *Response) errorDeleteRole(context.Context, *RoleId, *Response) errorUpdateRole(context.Context, *RoleInfo, *Response) errorFindRoleByID(context.Context, *RoleId, *RoleInfo) errorFindAllRole(context.Context, *FindAll, *AllRole) error//AddPermission(context.Context, *RolePermission, *Response) errorUpdatePermission(context.Context, *RolePermission, *Response) errorDeletePermission(context.Context, *RolePermission, *Response) error
}func RegisterRoleHandler(s server.Server, hdlr RoleHandler, opts ...server.HandlerOption) error {type role interface {AddRole(ctx context.Context, in *RoleInfo, out *Response) errorDeleteRole(ctx context.Context, in *RoleId, out *Response) errorUpdateRole(ctx context.Context, in *RoleInfo, out *Response) errorFindRoleByID(ctx context.Context, in *RoleId, out *RoleInfo) errorFindAllRole(ctx context.Context, in *FindAll, out *AllRole) errorAddPermission(ctx context.Context, in *RolePermission, out *Response) errorUpdatePermission(ctx context.Context, in *RolePermission, out *Response) errorDeletePermission(ctx context.Context, in *RolePermission, out *Response) error}type Role struct {role}h := &roleHandler{hdlr}return s.Handle(s.NewHandler(&Role{h}, opts...))
}type roleHandler struct {RoleHandler
}func (h *roleHandler) AddRole(ctx context.Context, in *RoleInfo, out *Response) error {return h.RoleHandler.AddRole(ctx, in, out)
}func (h *roleHandler) DeleteRole(ctx context.Context, in *RoleId, out *Response) error {return h.RoleHandler.DeleteRole(ctx, in, out)
}func (h *roleHandler) UpdateRole(ctx context.Context, in *RoleInfo, out *Response) error {return h.RoleHandler.UpdateRole(ctx, in, out)
}func (h *roleHandler) FindRoleByID(ctx context.Context, in *RoleId, out *RoleInfo) error {return h.RoleHandler.FindRoleByID(ctx, in, out)
}func (h *roleHandler) FindAllRole(ctx context.Context, in *FindAll, out *AllRole) error {return h.RoleHandler.FindAllRole(ctx, in, out)
}func (h *roleHandler) AddPermission(ctx context.Context, in *RolePermission, out *Response) error {return h.RoleHandler.AddPermission(ctx, in, out)
}func (h *roleHandler) UpdatePermission(ctx context.Context, in *RolePermission, out *Response) error {return h.RoleHandler.UpdatePermission(ctx, in, out)
}func (h *roleHandler) DeletePermission(ctx context.Context, in *RolePermission, out *Response) error {return h.RoleHandler.DeletePermission(ctx, in, out)
}
C:\Users\Administrator\Desktop\gopaas\user\proto\role\role.pb.go
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.30.0
// protoc v4.23.1
// source: proto/role/role.protopackage roleimport (protoreflect "google.golang.org/protobuf/reflect/protoreflect"protoimpl "google.golang.org/protobuf/runtime/protoimpl"reflect "reflect"sync "sync"
)const (// Verify that this generated code is sufficiently up-to-date._ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)// Verify that runtime/protoimpl is sufficiently up-to-date._ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)type RolePermission struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsRoleId int64 `protobuf:"varint,1,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"`PermissionId []int64 `protobuf:"varint,2,rep,packed,name=permission_id,json=permissionId,proto3" json:"permission_id,omitempty"`
}func (x *RolePermission) Reset() {*x = RolePermission{}if protoimpl.UnsafeEnabled {mi := &file_proto_role_role_proto_msgTypes[0]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *RolePermission) String() string {return protoimpl.X.MessageStringOf(x)
}func (*RolePermission) ProtoMessage() {}func (x *RolePermission) ProtoReflect() protoreflect.Message {mi := &file_proto_role_role_proto_msgTypes[0]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use RolePermission.ProtoReflect.Descriptor instead.
func (*RolePermission) Descriptor() ([]byte, []int) {return file_proto_role_role_proto_rawDescGZIP(), []int{0}
}func (x *RolePermission) GetRoleId() int64 {if x != nil {return x.RoleId}return 0
}func (x *RolePermission) GetPermissionId() []int64 {if x != nil {return x.PermissionId}return nil
}type RoleInfo struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsId int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`RoleName string `protobuf:"bytes,2,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"`RoleStatus int32 `protobuf:"varint,3,opt,name=role_status,json=roleStatus,proto3" json:"role_status,omitempty"`
}func (x *RoleInfo) Reset() {*x = RoleInfo{}if protoimpl.UnsafeEnabled {mi := &file_proto_role_role_proto_msgTypes[1]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *RoleInfo) String() string {return protoimpl.X.MessageStringOf(x)
}func (*RoleInfo) ProtoMessage() {}func (x *RoleInfo) ProtoReflect() protoreflect.Message {mi := &file_proto_role_role_proto_msgTypes[1]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead.
func (*RoleInfo) Descriptor() ([]byte, []int) {return file_proto_role_role_proto_rawDescGZIP(), []int{1}
}func (x *RoleInfo) GetId() int64 {if x != nil {return x.Id}return 0
}func (x *RoleInfo) GetRoleName() string {if x != nil {return x.RoleName}return ""
}func (x *RoleInfo) GetRoleStatus() int32 {if x != nil {return x.RoleStatus}return 0
}type RoleId struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsId int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
}func (x *RoleId) Reset() {*x = RoleId{}if protoimpl.UnsafeEnabled {mi := &file_proto_role_role_proto_msgTypes[2]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *RoleId) String() string {return protoimpl.X.MessageStringOf(x)
}func (*RoleId) ProtoMessage() {}func (x *RoleId) ProtoReflect() protoreflect.Message {mi := &file_proto_role_role_proto_msgTypes[2]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use RoleId.ProtoReflect.Descriptor instead.
func (*RoleId) Descriptor() ([]byte, []int) {return file_proto_role_role_proto_rawDescGZIP(), []int{2}
}func (x *RoleId) GetId() int64 {if x != nil {return x.Id}return 0
}type FindAll struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFields
}func (x *FindAll) Reset() {*x = FindAll{}if protoimpl.UnsafeEnabled {mi := &file_proto_role_role_proto_msgTypes[3]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *FindAll) String() string {return protoimpl.X.MessageStringOf(x)
}func (*FindAll) ProtoMessage() {}func (x *FindAll) ProtoReflect() protoreflect.Message {mi := &file_proto_role_role_proto_msgTypes[3]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use FindAll.ProtoReflect.Descriptor instead.
func (*FindAll) Descriptor() ([]byte, []int) {return file_proto_role_role_proto_rawDescGZIP(), []int{3}
}type Response struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsMsg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
}func (x *Response) Reset() {*x = Response{}if protoimpl.UnsafeEnabled {mi := &file_proto_role_role_proto_msgTypes[4]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *Response) String() string {return protoimpl.X.MessageStringOf(x)
}func (*Response) ProtoMessage() {}func (x *Response) ProtoReflect() protoreflect.Message {mi := &file_proto_role_role_proto_msgTypes[4]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use Response.ProtoReflect.Descriptor instead.
func (*Response) Descriptor() ([]byte, []int) {return file_proto_role_role_proto_rawDescGZIP(), []int{4}
}func (x *Response) GetMsg() string {if x != nil {return x.Msg}return ""
}type AllRole struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsRoleInfo []*RoleInfo `protobuf:"bytes,1,rep,name=role_info,json=roleInfo,proto3" json:"role_info,omitempty"`
}func (x *AllRole) Reset() {*x = AllRole{}if protoimpl.UnsafeEnabled {mi := &file_proto_role_role_proto_msgTypes[5]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *AllRole) String() string {return protoimpl.X.MessageStringOf(x)
}func (*AllRole) ProtoMessage() {}func (x *AllRole) ProtoReflect() protoreflect.Message {mi := &file_proto_role_role_proto_msgTypes[5]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use AllRole.ProtoReflect.Descriptor instead.
func (*AllRole) Descriptor() ([]byte, []int) {return file_proto_role_role_proto_rawDescGZIP(), []int{5}
}func (x *AllRole) GetRoleInfo() []*RoleInfo {if x != nil {return x.RoleInfo}return nil
}var File_proto_role_role_proto protoreflect.FileDescriptorvar file_proto_role_role_proto_rawDesc = []byte{0x0a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x2f, 0x72, 0x6f, 0x6c,0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x4e, 0x0a,0x0e, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12,0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x65, 0x72, 0x6d,0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52,0x0c, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x58, 0x0a,0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c,0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f,0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x73,0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x6f, 0x6c,0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x18, 0x0a, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49,0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69,0x64, 0x22, 0x09, 0x0a, 0x07, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x22, 0x1c, 0x0a, 0x08,0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18,0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x36, 0x0a, 0x07, 0x41, 0x6c,0x6c, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x6e,0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e,0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x6e,0x66, 0x6f, 0x32, 0xa1, 0x03, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x41,0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f,0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x65,0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65,0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0c, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f,0x6c, 0x65, 0x49, 0x64, 0x1a, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70,0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x6c, 0x65,0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70,0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x6f,0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x12, 0x0c, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f,0x6c, 0x65, 0x49, 0x64, 0x1a, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x6c, 0x65,0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c,0x6c, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0d, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x46, 0x69, 0x6e,0x64, 0x41, 0x6c, 0x6c, 0x1a, 0x0d, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x6c, 0x6c, 0x52,0x6f, 0x6c, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d,0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f,0x6c, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0e, 0x2e, 0x72,0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a,0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,0x6f, 0x6e, 0x12, 0x14, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x65,0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e,0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x10, 0x44, 0x65,0x6c, 0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14,0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0e, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70,0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74,0x6f, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x3b, 0x72, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f,0x74, 0x6f, 0x33,
}var (file_proto_role_role_proto_rawDescOnce sync.Oncefile_proto_role_role_proto_rawDescData = file_proto_role_role_proto_rawDesc
)func file_proto_role_role_proto_rawDescGZIP() []byte {file_proto_role_role_proto_rawDescOnce.Do(func() {file_proto_role_role_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_role_role_proto_rawDescData)})return file_proto_role_role_proto_rawDescData
}var file_proto_role_role_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_proto_role_role_proto_goTypes = []interface{}{(*RolePermission)(nil), // 0: role.RolePermission(*RoleInfo)(nil), // 1: role.RoleInfo(*RoleId)(nil), // 2: role.RoleId(*FindAll)(nil), // 3: role.FindAll(*Response)(nil), // 4: role.Response(*AllRole)(nil), // 5: role.AllRole
}
var file_proto_role_role_proto_depIdxs = []int32{1, // 0: role.AllRole.role_info:type_name -> role.RoleInfo1, // 1: role.Role.AddRole:input_type -> role.RoleInfo2, // 2: role.Role.DeleteRole:input_type -> role.RoleId1, // 3: role.Role.UpdateRole:input_type -> role.RoleInfo2, // 4: role.Role.FindRoleByID:input_type -> role.RoleId3, // 5: role.Role.FindAllRole:input_type -> role.FindAll0, // 6: role.Role.AddPermission:input_type -> role.RolePermission0, // 7: role.Role.UpdatePermission:input_type -> role.RolePermission0, // 8: role.Role.DeletePermission:input_type -> role.RolePermission4, // 9: role.Role.AddRole:output_type -> role.Response4, // 10: role.Role.DeleteRole:output_type -> role.Response4, // 11: role.Role.UpdateRole:output_type -> role.Response1, // 12: role.Role.FindRoleByID:output_type -> role.RoleInfo5, // 13: role.Role.FindAllRole:output_type -> role.AllRole4, // 14: role.Role.AddPermission:output_type -> role.Response4, // 15: role.Role.UpdatePermission:output_type -> role.Response4, // 16: role.Role.DeletePermission:output_type -> role.Response9, // [9:17] is the sub-list for method output_type1, // [1:9] is the sub-list for method input_type1, // [1:1] is the sub-list for extension type_name1, // [1:1] is the sub-list for extension extendee0, // [0:1] is the sub-list for field type_name
}func init() { file_proto_role_role_proto_init() }
func file_proto_role_role_proto_init() {if File_proto_role_role_proto != nil {return}if !protoimpl.UnsafeEnabled {file_proto_role_role_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*RolePermission); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_role_role_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*RoleInfo); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_role_role_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*RoleId); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_role_role_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*FindAll); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_role_role_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*Response); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_role_role_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*AllRole); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}}type x struct{}out := protoimpl.TypeBuilder{File: protoimpl.DescBuilder{GoPackagePath: reflect.TypeOf(x{}).PkgPath(),RawDescriptor: file_proto_role_role_proto_rawDesc,NumEnums: 0,NumMessages: 6,NumExtensions: 0,NumServices: 1,},GoTypes: file_proto_role_role_proto_goTypes,DependencyIndexes: file_proto_role_role_proto_depIdxs,MessageInfos: file_proto_role_role_proto_msgTypes,}.Build()File_proto_role_role_proto = out.Filefile_proto_role_role_proto_rawDesc = nilfile_proto_role_role_proto_goTypes = nilfile_proto_role_role_proto_depIdxs = nil
}
C:\Users\Administrator\Desktop\gopaas\user\proto\permission\permission.pb.micro.go
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: proto/permission/permission.protopackage permissionimport (fmt "fmt"proto "google.golang.org/protobuf/proto"math "math"
)import (context "context"api "github.com/asim/go-micro/v3/api"client "github.com/asim/go-micro/v3/client"server "github.com/asim/go-micro/v3/server"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option// Api Endpoints for User servicefunc NewPermissionEndpoints() []*api.Endpoint {return []*api.Endpoint{}
}// Client API for Permission servicetype PermissionService interface {//对外提供添加服务AddPermission(ctx context.Context, in *PermissionInfo, opts ...client.CallOption) (*Response, error)DeletePermission(ctx context.Context, in *PermissionId, opts ...client.CallOption) (*Response, error)UpdatePermission(ctx context.Context, in *PermissionInfo, opts ...client.CallOption) (*Response, error)FindPermissionByID(ctx context.Context, in *PermissionId, opts ...client.CallOption) (*PermissionInfo, error)FindAllPermission(ctx context.Context, in *FindAll, opts ...client.CallOption) (*AllPermission, error)
}type permissionService struct {c client.Clientname string
}func NewPermissionService(name string, c client.Client) PermissionService {if c == nil {c = client.NewClient()}if len(name) == 0 {name = "permission"}return &permissionService{c: c,name: name,}
}func (c *permissionService) AddPermission(ctx context.Context, in *PermissionInfo, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Permission.AddPermission", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *permissionService) DeletePermission(ctx context.Context, in *PermissionId, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Permission.DeletePermission", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *permissionService) UpdatePermission(ctx context.Context, in *PermissionInfo, opts ...client.CallOption) (*Response, error) {req := c.c.NewRequest(c.name, "Permission.UpdatePermission", in)out := new(Response)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *permissionService) FindPermissionByID(ctx context.Context, in *PermissionId, opts ...client.CallOption) (*PermissionInfo, error) {req := c.c.NewRequest(c.name, "Permission.FindPermissionByID", in)out := new(PermissionInfo)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}func (c *permissionService) FindAllPermission(ctx context.Context, in *FindAll, opts ...client.CallOption) (*AllPermission, error) {req := c.c.NewRequest(c.name, "Permission.FindAllPermission", in)out := new(AllPermission)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}// Server API for Permission servicetype PermissionHandler interface {//对外提供添加服务AddPermission(context.Context, *PermissionInfo, *Response) errorDeletePermission(context.Context, *PermissionId, *Response) errorUpdatePermission(context.Context, *PermissionInfo, *Response) errorFindPermissionByID(context.Context, *PermissionId, *PermissionInfo) errorFindAllPermission(context.Context, *FindAll, *AllPermission) error
}func RegisterPermissionHandler(s server.Server, hdlr PermissionHandler, opts ...server.HandlerOption) error {type permission interface {AddPermission(ctx context.Context, in *PermissionInfo, out *Response) errorDeletePermission(ctx context.Context, in *PermissionId, out *Response) errorUpdatePermission(ctx context.Context, in *PermissionInfo, out *Response) errorFindPermissionByID(ctx context.Context, in *PermissionId, out *PermissionInfo) errorFindAllPermission(ctx context.Context, in *FindAll, out *AllPermission) error}type Permission struct {permission}h := &permissionHandler{hdlr}return s.Handle(s.NewHandler(&Permission{h}, opts...))
}type permissionHandler struct {PermissionHandler
}func (h *permissionHandler) AddPermission(ctx context.Context, in *PermissionInfo, out *Response) error {return h.PermissionHandler.AddPermission(ctx, in, out)
}func (h *permissionHandler) DeletePermission(ctx context.Context, in *PermissionId, out *Response) error {return h.PermissionHandler.DeletePermission(ctx, in, out)
}func (h *permissionHandler) UpdatePermission(ctx context.Context, in *PermissionInfo, out *Response) error {return h.PermissionHandler.UpdatePermission(ctx, in, out)
}func (h *permissionHandler) FindPermissionByID(ctx context.Context, in *PermissionId, out *PermissionInfo) error {return h.PermissionHandler.FindPermissionByID(ctx, in, out)
}func (h *permissionHandler) FindAllPermission(ctx context.Context, in *FindAll, out *AllPermission) error {return h.PermissionHandler.FindAllPermission(ctx, in, out)
}
C:\Users\Administrator\Desktop\gopaas\user\proto\permission\permission.pb.go
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.30.0
// protoc v4.23.1
// source: proto/permission/permission.protopackage permissionimport (protoreflect "google.golang.org/protobuf/reflect/protoreflect"protoimpl "google.golang.org/protobuf/runtime/protoimpl"reflect "reflect"sync "sync"
)const (// Verify that this generated code is sufficiently up-to-date._ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)// Verify that runtime/protoimpl is sufficiently up-to-date._ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)type PermissionInfo struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsId int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`PermissionName string `protobuf:"bytes,2,opt,name=permission_name,json=permissionName,proto3" json:"permission_name,omitempty"`PermissionDescribe string `protobuf:"bytes,3,opt,name=permission_describe,json=permissionDescribe,proto3" json:"permission_describe,omitempty"`PermissionAction string `protobuf:"bytes,4,opt,name=permission_action,json=permissionAction,proto3" json:"permission_action,omitempty"`PermissionStatus int32 `protobuf:"varint,5,opt,name=permission_status,json=permissionStatus,proto3" json:"permission_status,omitempty"`
}func (x *PermissionInfo) Reset() {*x = PermissionInfo{}if protoimpl.UnsafeEnabled {mi := &file_proto_permission_permission_proto_msgTypes[0]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *PermissionInfo) String() string {return protoimpl.X.MessageStringOf(x)
}func (*PermissionInfo) ProtoMessage() {}func (x *PermissionInfo) ProtoReflect() protoreflect.Message {mi := &file_proto_permission_permission_proto_msgTypes[0]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use PermissionInfo.ProtoReflect.Descriptor instead.
func (*PermissionInfo) Descriptor() ([]byte, []int) {return file_proto_permission_permission_proto_rawDescGZIP(), []int{0}
}func (x *PermissionInfo) GetId() int64 {if x != nil {return x.Id}return 0
}func (x *PermissionInfo) GetPermissionName() string {if x != nil {return x.PermissionName}return ""
}func (x *PermissionInfo) GetPermissionDescribe() string {if x != nil {return x.PermissionDescribe}return ""
}func (x *PermissionInfo) GetPermissionAction() string {if x != nil {return x.PermissionAction}return ""
}func (x *PermissionInfo) GetPermissionStatus() int32 {if x != nil {return x.PermissionStatus}return 0
}type PermissionId struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsId int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
}func (x *PermissionId) Reset() {*x = PermissionId{}if protoimpl.UnsafeEnabled {mi := &file_proto_permission_permission_proto_msgTypes[1]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *PermissionId) String() string {return protoimpl.X.MessageStringOf(x)
}func (*PermissionId) ProtoMessage() {}func (x *PermissionId) ProtoReflect() protoreflect.Message {mi := &file_proto_permission_permission_proto_msgTypes[1]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use PermissionId.ProtoReflect.Descriptor instead.
func (*PermissionId) Descriptor() ([]byte, []int) {return file_proto_permission_permission_proto_rawDescGZIP(), []int{1}
}func (x *PermissionId) GetId() int64 {if x != nil {return x.Id}return 0
}type FindAll struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFields
}func (x *FindAll) Reset() {*x = FindAll{}if protoimpl.UnsafeEnabled {mi := &file_proto_permission_permission_proto_msgTypes[2]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *FindAll) String() string {return protoimpl.X.MessageStringOf(x)
}func (*FindAll) ProtoMessage() {}func (x *FindAll) ProtoReflect() protoreflect.Message {mi := &file_proto_permission_permission_proto_msgTypes[2]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use FindAll.ProtoReflect.Descriptor instead.
func (*FindAll) Descriptor() ([]byte, []int) {return file_proto_permission_permission_proto_rawDescGZIP(), []int{2}
}type Response struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsMsg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
}func (x *Response) Reset() {*x = Response{}if protoimpl.UnsafeEnabled {mi := &file_proto_permission_permission_proto_msgTypes[3]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *Response) String() string {return protoimpl.X.MessageStringOf(x)
}func (*Response) ProtoMessage() {}func (x *Response) ProtoReflect() protoreflect.Message {mi := &file_proto_permission_permission_proto_msgTypes[3]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use Response.ProtoReflect.Descriptor instead.
func (*Response) Descriptor() ([]byte, []int) {return file_proto_permission_permission_proto_rawDescGZIP(), []int{3}
}func (x *Response) GetMsg() string {if x != nil {return x.Msg}return ""
}type AllPermission struct {state protoimpl.MessageStatesizeCache protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsPermissionInfo []*PermissionInfo `protobuf:"bytes,1,rep,name=permission_info,json=permissionInfo,proto3" json:"permission_info,omitempty"`
}func (x *AllPermission) Reset() {*x = AllPermission{}if protoimpl.UnsafeEnabled {mi := &file_proto_permission_permission_proto_msgTypes[4]ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))ms.StoreMessageInfo(mi)}
}func (x *AllPermission) String() string {return protoimpl.X.MessageStringOf(x)
}func (*AllPermission) ProtoMessage() {}func (x *AllPermission) ProtoReflect() protoreflect.Message {mi := &file_proto_permission_permission_proto_msgTypes[4]if protoimpl.UnsafeEnabled && x != nil {ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))if ms.LoadMessageInfo() == nil {ms.StoreMessageInfo(mi)}return ms}return mi.MessageOf(x)
}// Deprecated: Use AllPermission.ProtoReflect.Descriptor instead.
func (*AllPermission) Descriptor() ([]byte, []int) {return file_proto_permission_permission_proto_rawDescGZIP(), []int{4}
}func (x *AllPermission) GetPermissionInfo() []*PermissionInfo {if x != nil {return x.PermissionInfo}return nil
}var File_proto_permission_permission_proto protoreflect.FileDescriptorvar file_proto_permission_permission_proto_rawDesc = []byte{0x0a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,0x6f, 0x6e, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22,0xd4, 0x01, 0x0a, 0x0e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e,0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x65, 0x72,0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x70,0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,0x62, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73,0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x2b, 0x0a, 0x11,0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f,0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73,0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x65, 0x72,0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05,0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x1e, 0x0a, 0x0c, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x09, 0x0a, 0x07, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c,0x6c, 0x22, 0x1c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a,0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22,0x54, 0x0a, 0x0d, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,0x12, 0x43, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69,0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x65, 0x72, 0x6d,0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0xf4, 0x02, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,0x73, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x50, 0x65, 0x72, 0x6d, 0x69,0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66,0x6f, 0x1a, 0x14, 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x52,0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x10, 0x44, 0x65, 0x6c,0x65, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x2e,0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69,0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x1a, 0x14, 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73,0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,0x46, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73,0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a,0x14, 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73,0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x46, 0x69, 0x6e, 0x64, 0x50,0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x49, 0x44, 0x12, 0x18, 0x2e,0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69,0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x1a, 0x1a, 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73,0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49,0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c,0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x70, 0x65, 0x72,0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x1a,0x19, 0x2e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x6c, 0x6c,0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x42, 0x1f, 0x5a, 0x1d,0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69,0x6f, 0x6e, 0x3b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70,0x72, 0x6f, 0x74, 0x6f, 0x33,
}var (file_proto_permission_permission_proto_rawDescOnce sync.Oncefile_proto_permission_permission_proto_rawDescData = file_proto_permission_permission_proto_rawDesc
)func file_proto_permission_permission_proto_rawDescGZIP() []byte {file_proto_permission_permission_proto_rawDescOnce.Do(func() {file_proto_permission_permission_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_permission_permission_proto_rawDescData)})return file_proto_permission_permission_proto_rawDescData
}var file_proto_permission_permission_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_proto_permission_permission_proto_goTypes = []interface{}{(*PermissionInfo)(nil), // 0: permission.PermissionInfo(*PermissionId)(nil), // 1: permission.PermissionId(*FindAll)(nil), // 2: permission.FindAll(*Response)(nil), // 3: permission.Response(*AllPermission)(nil), // 4: permission.AllPermission
}
var file_proto_permission_permission_proto_depIdxs = []int32{0, // 0: permission.AllPermission.permission_info:type_name -> permission.PermissionInfo0, // 1: permission.Permission.AddPermission:input_type -> permission.PermissionInfo1, // 2: permission.Permission.DeletePermission:input_type -> permission.PermissionId0, // 3: permission.Permission.UpdatePermission:input_type -> permission.PermissionInfo1, // 4: permission.Permission.FindPermissionByID:input_type -> permission.PermissionId2, // 5: permission.Permission.FindAllPermission:input_type -> permission.FindAll3, // 6: permission.Permission.AddPermission:output_type -> permission.Response3, // 7: permission.Permission.DeletePermission:output_type -> permission.Response3, // 8: permission.Permission.UpdatePermission:output_type -> permission.Response0, // 9: permission.Permission.FindPermissionByID:output_type -> permission.PermissionInfo4, // 10: permission.Permission.FindAllPermission:output_type -> permission.AllPermission6, // [6:11] is the sub-list for method output_type1, // [1:6] is the sub-list for method input_type1, // [1:1] is the sub-list for extension type_name1, // [1:1] is the sub-list for extension extendee0, // [0:1] is the sub-list for field type_name
}func init() { file_proto_permission_permission_proto_init() }
func file_proto_permission_permission_proto_init() {if File_proto_permission_permission_proto != nil {return}if !protoimpl.UnsafeEnabled {file_proto_permission_permission_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*PermissionInfo); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_permission_permission_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*PermissionId); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_permission_permission_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*FindAll); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_permission_permission_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*Response); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}file_proto_permission_permission_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {switch v := v.(*AllPermission); i {case 0:return &v.statecase 1:return &v.sizeCachecase 2:return &v.unknownFieldsdefault:return nil}}}type x struct{}out := protoimpl.TypeBuilder{File: protoimpl.DescBuilder{GoPackagePath: reflect.TypeOf(x{}).PkgPath(),RawDescriptor: file_proto_permission_permission_proto_rawDesc,NumEnums: 0,NumMessages: 5,NumExtensions: 0,NumServices: 1,},GoTypes: file_proto_permission_permission_proto_goTypes,DependencyIndexes: file_proto_permission_permission_proto_depIdxs,MessageInfos: file_proto_permission_permission_proto_msgTypes,}.Build()File_proto_permission_permission_proto = out.Filefile_proto_permission_permission_proto_rawDesc = nilfile_proto_permission_permission_proto_goTypes = nilfile_proto_permission_permission_proto_depIdxs = nil
}
12-11用户中心-userhandler开发
C:\Users\Administrator\Desktop\gopaas\user\handler\userHandler.go
package handlerimport ("context"log "github.com/asim/go-micro/v3/logger""github.com/yunixiangfeng/gopaas/common""github.com/yunixiangfeng/gopaas/user/domain/model""github.com/yunixiangfeng/gopaas/user/domain/service"user "github.com/yunixiangfeng/gopaas/user/proto/user"
)type UserHandler struct {//注意这里的类型是 IUserDataService 接口类型UserDataService service.IUserDataServiceRoleDataService service.IRoleDataService
}func (e *UserHandler) getUserRole(userRole *user.UserRole) (user *model.User, role []*model.Role, err error) {user, err = e.UserDataService.FindUserByID(userRole.UserId)if err != nil {common.Error(err)return}role, err = e.RoleDataService.FindAllRoleByID(userRole.RoleId)if err != nil {common.Error(err)return}return
}func (e *UserHandler) AddRole(ctx context.Context, userRole *user.UserRole, rsp *user.Response) error {// 查找用户和对应的角色user, role, err := e.getUserRole(userRole)if err != nil {common.Error(err)rsp.Msg = err.Error()return err}// 添加对应的角色if err := e.UserDataService.AddRole(user, role); err != nil {common.Error(err)rsp.Msg = err.Error()return err}return nil
}func (e *UserHandler) UpdateRole(ctx context.Context, userRole *user.UserRole, rsp *user.Response) error {// 查找用户和对应的角色user, role, err := e.getUserRole(userRole)if err != nil {common.Error(err)rsp.Msg = err.Error()return err}// 更新对应的角色if err := e.UserDataService.UpdateRole(user, role); err != nil {common.Error(err)rsp.Msg = err.Error()return err}return nil
}func (e *UserHandler) DeleteRole(ctx context.Context, userRole *user.UserRole, rsp *user.Response) error {// 查找用户和对应的角色user, role, err := e.getUserRole(userRole)if err != nil {common.Error(err)rsp.Msg = err.Error()return err}// 删除对应的角色if err := e.UserDataService.DeleteRole(user, role); err != nil {common.Error(err)rsp.Msg = err.Error()return err}return nil
}func (e *UserHandler) IsRight(ctx context.Context, userRight *user.UserRight, rg *user.Right) error {rg.Access = e.UserDataService.IsRight(userRight.Action, userRight.UserId)return nil
}// Call is a single request handler called via client.Call or the generated client code
func (e *UserHandler) AddUser(ctx context.Context, info *user.UserInfo, rsp *user.Response) error {log.Info("Received *user.AddUser request")return nil
}func (e *UserHandler) DeleteUser(ctx context.Context, req *user.UserId, rsp *user.Response) error {log.Info("Received *user.DeleteUser request")return nil
}func (e *UserHandler) UpdateUser(ctx context.Context, req *user.UserInfo, rsp *user.Response) error {log.Info("Received *user.UpdateUser request")return nil
}func (e *UserHandler) FindUserByID(ctx context.Context, req *user.UserId, rsp *user.UserInfo) error {log.Info("Received *user.FindUserByID request")return nil
}func (e *UserHandler) FindAllUser(ctx context.Context, req *user.FindAll, rsp *user.AllUser) error {log.Info("Received *user.FindAllUser request")return nil
}
12-12用户中心-rolehandler开发
C:\Users\Administrator\Desktop\gopaas\user\handler\roleHandler.go
package handlerimport ("context"log "github.com/asim/go-micro/v3/logger""github.com/yunixiangfeng/gopaas/common""github.com/yunixiangfeng/gopaas/user/domain/model""github.com/yunixiangfeng/gopaas/user/domain/service"role "github.com/yunixiangfeng/gopaas/user/proto/role"
)type RoleHandler struct {//注意这里的类型是 IRoleDataService 接口类型RoleDataService service.IRoleDataServicePermissionDataService service.IPermissionDataService
}func (e *RoleHandler) getRolePermission(rolePermission *role.RolePermission) (role *model.Role, permission []*model.Permission, err error) {role, err = e.RoleDataService.FindRoleByID(rolePermission.RoleId)if err != nil {common.Error(err)return}permission, err = e.PermissionDataService.FindAllPermissionByID(rolePermission.PermissionId)if err != nil {common.Error(err)return}return
}func (e *RoleHandler) AddPermission(ctx context.Context, rolePermission *role.RolePermission, rsp *role.Response) error {role, permission, err := e.getRolePermission(rolePermission)if err != nil {common.Error(err)rsp.Msg = err.Error()return err}if err := e.RoleDataService.AddPermission(role, permission); err != nil {common.Error(err)rsp.Msg = err.Error()return err}return nil
}func (e *RoleHandler) UpdatePermission(ctx context.Context, rolePermission *role.RolePermission, rsp *role.Response) error {role, permission, err := e.getRolePermission(rolePermission)if err != nil {common.Error(err)rsp.Msg = err.Error()return err}if err := e.RoleDataService.UpdatePermission(role, permission); err != nil {common.Error(err)rsp.Msg = err.Error()return err}return nil
}func (e *RoleHandler) DeletePermission(ctx context.Context, rolePermission *role.RolePermission, rsp *role.Response) error {role, permission, err := e.getRolePermission(rolePermission)if err != nil {common.Error(err)rsp.Msg = err.Error()return err}if err := e.RoleDataService.DeletePermission(role, permission); err != nil {common.Error(err)rsp.Msg = err.Error()return err}return nil
}// Call is a single request handler called via client.Call or the generated client code
func (e *RoleHandler) AddRole(ctx context.Context, info *role.RoleInfo, rsp *role.Response) error {log.Info("Received *role.AddRole request")return nil
}func (e *RoleHandler) DeleteRole(ctx context.Context, req *role.RoleId, rsp *role.Response) error {log.Info("Received *role.DeleteRole request")return nil
}func (e *RoleHandler) UpdateRole(ctx context.Context, req *role.RoleInfo, rsp *role.Response) error {log.Info("Received *role.UpdateRole request")return nil
}func (e *RoleHandler) FindRoleByID(ctx context.Context, req *role.RoleId, rsp *role.RoleInfo) error {log.Info("Received *role.FindRoleByID request")return nil
}func (e *RoleHandler) FindAllRole(ctx context.Context, req *role.FindAll, rsp *role.AllRole) error {log.Info("Received *role.FindAllRole request")return nil
}
C:\Users\Administrator\Desktop\gopaas\user\main.go
// 注册句柄,可以快速操作已开发的服务userDataService := service2.NewUserDataService(repository.NewUserRepository(db), clientset)roleDataService := service2.NewRoleDataService(repository.NewRoleRepository(db), clientset)permissionDataService := service2.NewPermissionDataService(repository.NewPermissionRepository(db), clientset)user.RegisterUserHandler(service.Server(), &handler.UserHandler{UserDataService: userDataService, RoleDataService: roleDataService})role.RegisterRoleHandler(service.Server(), &handler.RoleHandler{RoleDataService: roleDataService, PermissionDataService: permissionDataService})
12-13用户中心-权限-handler开发
C:\Users\Administrator\Desktop\gopaas\user\handler\permissionHandler.go
package handlerimport ("context"log "github.com/asim/go-micro/v3/logger""github.com/yunixiangfeng/gopaas/user/domain/service"permission "github.com/yunixiangfeng/gopaas/user/proto/permission"
)type PermissionHandler struct {//注意这里的类型是 IPermissionDataService 接口类型PermissionDataService service.IPermissionDataService
}// Call is a single request handler called via client.Call or the generated client code
func (e *PermissionHandler) AddPermission(ctx context.Context, info *permission.PermissionInfo, rsp *permission.Response) error {log.Info("Received *permission.AddPermission request")return nil
}func (e *PermissionHandler) DeletePermission(ctx context.Context, req *permission.PermissionId, rsp *permission.Response) error {log.Info("Received *permission.DeletePermission request")return nil
}func (e *PermissionHandler) UpdatePermission(ctx context.Context, req *permission.PermissionInfo, rsp *permission.Response) error {log.Info("Received *permission.UpdatePermission request")return nil
}func (e *PermissionHandler) FindPermissionByID(ctx context.Context, req *permission.PermissionId, rsp *permission.PermissionInfo) error {log.Info("Received *permission.FindPermissionByID request")return nil
}func (e *PermissionHandler) FindAllPermission(ctx context.Context, req *permission.FindAll, rsp *permission.AllPermission) error {log.Info("Received *permission.FindAllPermission request")return nil
}
C:\Users\Administrator\Desktop\gopaas\user\main.go
permission.RegisterPermissionHandler(service.Server(), &handler.PermissionHandler{PermissionDataService: permissionDataService})
12-14用户中前端API开发
.\yu-tool\yu-tool.exe createApi github.com/yunixiangfeng/gopaas/userApiyu-v3 --proto_path=. --micro_out=. --go_out=:. ./proto/userApi/userApi.protogo mod tidy
C:\Users\Administrator\Desktop\gopaas\go-paas-front\user-role.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="description" content=""><meta name="author" content=""><link rel="shortcut icon" href="assets/img/logo-fav.png"><title>CPaaS</title><link rel="stylesheet" type="text/css" href="assets/lib/perfect-scrollbar/css/perfect-scrollbar.min.css"/><link rel="stylesheet" type="text/css" href="assets/lib/material-design-icons/css/material-design-iconic-font.min.css"/><!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script><![endif]--><link rel="stylesheet" type="text/css" href="assets/lib/datatables/css/dataTables.bootstrap.min.css"/><link rel="stylesheet" href="assets/css/style.css" type="text/css"/></head><body><div class="be-wrapper"><nav class="navbar navbar-default navbar-fixed-top be-top-header"><div class="container-fluid"><div class="navbar-header"><a href="index.html" class="navbar-brand"></a></div><div class="be-right-navbar"><ul class="nav navbar-nav navbar-right be-user-nav"><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><img src="assets/img/avatar.png" alt="Avatar"><span class="user-name">Túpac Amaru</span></a><ul role="menu" class="dropdown-menu"><li><div class="user-info"><div class="user-name">wu123</div><div class="user-position online">在线</div></div></li><li><a href="#"><span class="icon mdi mdi-face"></span> 账户</a></li><li><a href="#"><span class="icon mdi mdi-settings"></span> 设置</a></li><li><a href="#"><span class="icon mdi mdi-power"></span> 推出登录</a></li></ul></li></ul><div class="page-title"></div><ul class="nav navbar-nav navbar-right be-icons-nav"><li class="dropdown"><a href="#" role="button" aria-expanded="false" class="be-toggle-right-sidebar"><span class="icon mdi mdi-settings"></span></a></li><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><span class="icon mdi mdi-notifications"></span><span class="indicator"></span></a><ul class="dropdown-menu be-notifications"><li><div class="title">消息提醒<span class="badge">3</span></div><div class="list"><div class="be-scroller"><div class="content"><ul><li class="notification notification-unread"><a href="#"><div class="image"><img src="assets/img/avatar2.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">Jessica Caruso</span> accepted your invitation to join the team.</div><span class="date">2 min ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar3.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">Joel King</span> is now following you</div><span class="date">2 days ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar4.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">John Doe</span> is watching your main repository</div><span class="date">2 days ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar5.png" alt="Avatar"></div><div class="notification-info"><span class="text"><span class="user-name">Emily Carter</span> is now following you</span><span class="date">5 days ago</span></div></a></li></ul></div></div></div><div class="footer"> <a href="#">View all notifications</a></div></li></ul></li><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><span class="icon mdi mdi-apps"></span></a><ul class="dropdown-menu be-connections"><li><div class="list"><div class="content"><div class="row"><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/github.png" alt="Github"><span>GitHub</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/bitbucket.png" alt="Bitbucket"><span>Bitbucket</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/slack.png" alt="Slack"><span>Slack</span></a></div></div><div class="row"><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/dribbble.png" alt="Dribbble"><span>Dribbble</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/mail_chimp.png" alt="Mail Chimp"><span>Mail Chimp</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/dropbox.png" alt="Dropbox"><span>Dropbox</span></a></div></div></div></div><div class="footer"> <a href="#">More</a></div></li></ul></li></ul></div></div></nav>
<!--侧边栏-开始
-->
<div class="be-left-sidebar"><div class="left-sidebar-wrapper"><a href="#" class="left-sidebar-toggle">看版</a><div class="left-sidebar-spacer"><div class="left-sidebar-scroll"><div class="left-sidebar-content"><ul class="sidebar-elements"><li class="divider">菜单</li><li class="parent"><a href="#"><i class="icon mdi mdi-home"></i><span>控制台</span></a></li><li class="parent"><a href="#"><i class="icon mdi mdi-face"></i><span>应用管理</span></a><ul class="sub-menu"><li ><a href="pod-index.html">添加应用</a></li></ul></li><li class="parent"><a href="charts.html"><i class="icon mdi mdi-chart-donut"></i><span>服务管理</span></a><ul class="sub-menu"><li ><a href="svc-index.html">添加服务</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-dot-circle"></i><span>域名管理</span></a><ul class="sub-menu"><li ><a href="route-index.html">添加路由</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-dot-circle"></i><span>权限管理</span></a><ul class="sub-menu"><li class="active"><a href="route-index.html">权限管理</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-border-all"></i><span>权限管理</span></a><ul class="sub-menu"><li><a href="tables-general.html">General</a></li><li><a href="tables-datatables.html">Data Tables</a></li><li><a href="tables-filters.html"><span class="label label-primary pull-right">New</span>Table Filters</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-layers"></i><span>权限管理</span></a><ul class="sub-menu"><li><a href="pages-blank.html">Blank Page</a></li><li><a href="pages-blank-header.html">Blank Page Header</a></li><li><a href="pages-login.html">Login</a></li><li><a href="pages-login2.html">Login v2</a></li><li><a href="pages-404.html">404 Page</a></li><li><a href="pages-sign-up.html">Sign Up</a></li><li><a href="pages-forgot-password.html">Forgot Password</a></li><li><a href="pages-profile.html">Profile</a></li><li><a href="pages-pricing-tables.html">Pricing Tables</a></li><li><a href="pages-pricing-tables2.html">Pricing Tables v2</a></li><li><a href="pages-timeline.html">Timeline</a></li><li><a href="pages-timeline2.html">Timeline v2</a></li><li><a href="pages-invoice.html"><span class="label label-primary pull-right">New</span>Invoice</a></li><li><a href="pages-calendar.html">Calendar</a></li><li><a href="pages-gallery.html">Gallery</a></li><li><a href="pages-code-editor.html"><span class="label label-primary pull-right">New </span>Code Editor</a></li><li><a href="pages-booking.html"><span class="label label-primary pull-right">New</span>Booking</a></li><li><a href="pages-loaders.html"><span class="label label-primary pull-right">New</span>Loaders</a></li></ul></li></ul></div></div></div><div class="progress-widget"><div class="progress"><div style="width: 60%;" class="progress-bar progress-bar-primary"></div></div></div></div>
</div>
<!--
侧边栏-结束
--><div class="be-content"><div class="page-head"><h2 class="page-head-title">角色管理</h2><ol class="breadcrumb page-head-nav"><li><a href="#">控制台</a></li><li><a href="#">权限管理</a></li><li class="active">权限管理列表</li></ol></div><div class="main-content container-fluid"><div class="main-content container-fluid"><div class="row"><div class="col-md-12"><div class="panel panel-default panel-border-color panel-border-color-primary"><div class="panel-heading panel-heading-divider">角色管理<span class="panel-subtitle">分配系统详细的权限</span></div><div class="panel-body"><form action="http://127.0.0.1:8080/userApi/AddRole" class="form-horizontal group-border-dashed" method="post" novalidate=""><div class="form-group"><label class="col-sm-3 control-label">用户ID</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check6" type="text" checked="" hidden value="1" name="user_id"><label for="check6">张三</label></div></div></div><div class="form-group"><label class="col-sm-3 control-label">角色</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check61" type="checkbox" value="1" name="role_id"><label for="check61">主管</label></div><div class="be-checkbox be-checkbox-color inline"><input id="check7" type="checkbox" value="2" name="role_id"><label for="check7">组长</label></div><div class="be-checkbox be-checkbox-color inline"><input id="check8" type="checkbox" value="3" name="role_id"><label for="check8">组员</label></div><div class="be-checkbox be-checkbox-color inline"><input id="check9" type="checkbox" value="4" name="role_id"><label for="check9">访客</label></div><div class="form-group"><div class="col-sm-2 col-sm-10"><button type="submit" class="btn btn-space btn-primary">提交</button><button class="btn btn-space btn-default">取消</button></div></div></div></div></form></div></div></div></div></div></div></div><nav class="be-right-sidebar"><div class="sb-content"><div class="tab-navigation"><ul role="tablist" class="nav nav-tabs nav-justified"><li role="presentation" class="active"><a href="#tab1" aria-controls="tab1" role="tab" data-toggle="tab">Chat</a></li><li role="presentation"><a href="#tab2" aria-controls="tab2" role="tab" data-toggle="tab">Todo</a></li><li role="presentation"><a href="#tab3" aria-controls="tab3" role="tab" data-toggle="tab">Settings</a></li></ul></div><div class="tab-panel"><div class="tab-content"><div id="tab1" role="tabpanel" class="tab-pane tab-chat active"><div class="chat-contacts"><div class="chat-sections"><div class="be-scroller"><div class="content"><h2>Recent</h2><div class="contact-list contact-list-recent"><div class="user"><a href="#"><img src="assets/img/avatar1.png" alt="Avatar"><div class="user-data"><span class="status away"></span><span class="name">Claire Sassu</span><span class="message">Can you share the...</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar2.png" alt="Avatar"><div class="user-data"><span class="status"></span><span class="name">Maggie jackson</span><span class="message">I confirmed the info.</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar3.png" alt="Avatar"><div class="user-data"><span class="status offline"></span><span class="name">Joel King </span><span class="message">Ready for the meeti...</span></div></a></div></div><h2>Contacts</h2><div class="contact-list"><div class="user"><a href="#"><img src="assets/img/avatar4.png" alt="Avatar"><div class="user-data2"><span class="status"></span><span class="name">Mike Bolthort</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar5.png" alt="Avatar"><div class="user-data2"><span class="status"></span><span class="name">Maggie jackson</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar6.png" alt="Avatar"><div class="user-data2"><span class="status offline"></span><span class="name">Jhon Voltemar</span></div></a></div></div></div></div></div><div class="bottom-input"><input type="text" placeholder="Search..." name="q"><span class="mdi mdi-search"></span></div></div><div class="chat-window"><div class="title"><div class="user"><img src="assets/img/avatar2.png" alt="Avatar"><h2>Maggie jackson</h2><span>Active 1h ago</span></div><span class="icon return mdi mdi-chevron-left"></span></div><div class="chat-messages"><div class="be-scroller"><div class="content"><ul><li class="friend"><div class="msg">Hello</div></li><li class="self"><div class="msg">Hi, how are you?</div></li><li class="friend"><div class="msg">Good, I'll need support with my pc</div></li><li class="self"><div class="msg">Sure, just tell me what is going on with your computer?</div></li><li class="friend"><div class="msg">I don't know it just turns off suddenly</div></li></ul></div></div></div><div class="chat-input"><div class="input-wrapper"><span class="photo mdi mdi-camera"></span><input type="text" placeholder="Message..." name="q" autocomplete="off"><span class="send-msg mdi mdi-mail-send"></span></div></div></div></div><div id="tab2" role="tabpanel" class="tab-pane tab-todo"><div class="todo-container"><div class="todo-wrapper"><div class="be-scroller"><div class="todo-content"><span class="category-title">Today</span><ul class="todo-list"><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo1" type="checkbox" checked=""><label for="todo1">Initialize the project</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo2" type="checkbox"><label for="todo2">Create the main structure</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo3" type="checkbox"><label for="todo3">Updates changes to GitHub</label></div></li></ul><span class="category-title">Tomorrow</span><ul class="todo-list"><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo4" type="checkbox"><label for="todo4">Initialize the project</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo5" type="checkbox"><label for="todo5">Create the main structure</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo6" type="checkbox"><label for="todo6">Updates changes to GitHub</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo7" type="checkbox"><label for="todo7" title="This task is too long to be displayed in a normal space!">This task is too long to be displayed in a normal space!</label></div></li></ul></div></div></div><div class="bottom-input"><input type="text" placeholder="Create new task..." name="q"><span class="mdi mdi-plus"></span></div></div></div><div id="tab3" role="tabpanel" class="tab-pane tab-settings"><div class="settings-wrapper"><div class="be-scroller"><span class="category-title">General</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st1" id="st1"><span><label for="st1"></label></span></div><span class="name">Available</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st2" id="st2"><span><label for="st2"></label></span></div><span class="name">Enable notifications</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st3" id="st3"><span><label for="st3"></label></span></div><span class="name">Login with Facebook</span></li></ul><span class="category-title">Notifications</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st4" id="st4"><span><label for="st4"></label></span></div><span class="name">Email notifications</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st5" id="st5"><span><label for="st5"></label></span></div><span class="name">Project updates</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st6" id="st6"><span><label for="st6"></label></span></div><span class="name">New comments</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st7" id="st7"><span><label for="st7"></label></span></div><span class="name">Chat messages</span></li></ul><span class="category-title">Workflow</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st8" id="st8"><span><label for="st8"></label></span></div><span class="name">Deploy on commit</span></li></ul></div></div></div></div></div></div></nav></div><script src="assets/lib/jquery/jquery.min.js" type="text/javascript"></script><script src="assets/lib/perfect-scrollbar/js/perfect-scrollbar.jquery.min.js" type="text/javascript"></script><script src="assets/js/main.js" type="text/javascript"></script><script src="assets/lib/bootstrap/dist/js/bootstrap.min.js" type="text/javascript"></script><script src="assets/lib/datatables/js/jquery.dataTables.min.js" type="text/javascript"></script><script src="assets/lib/datatables/js/dataTables.bootstrap.min.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/dataTables.buttons.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.html5.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.flash.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.print.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.colVis.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.bootstrap.js" type="text/javascript"></script><script src="assets/js/app-tables-datatables.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function(){//initialize the javascriptApp.init();App.dataTables();$.ajax({type:"get",url:"http://127.0.0.1:8080/routeApi/",success: function(data){console.log(data);$("#table-data").html("");$.each(data['route_info'],function (i,item) {$("#table-data").append(' <tr class="gradeA">\<td>'+item.id+'</td>\<td>'+item.route_name+'</td>\<td>'+item.route_namespace+'</td>\<td class="center">'+item.route_host+'</td>\<td class="center"><a href="route-detail.html?route_id='+item.id+'">详情</a> <a href="http://localhost:8080/routeApi/deleteRouteById?route_id='+item.id+'" style="color:red;" >删除</a></td>\</tr>');})},error: function(result){console.log(result);}});});</script></body>
</html>
C:\Users\Administrator\Desktop\gopaas\go-paas-front\role-permission.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="description" content=""><meta name="author" content=""><link rel="shortcut icon" href="assets/img/logo-fav.png"><title>CPaaS</title><link rel="stylesheet" type="text/css" href="assets/lib/perfect-scrollbar/css/perfect-scrollbar.min.css"/><link rel="stylesheet" type="text/css" href="assets/lib/material-design-icons/css/material-design-iconic-font.min.css"/><!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script><![endif]--><link rel="stylesheet" type="text/css" href="assets/lib/datatables/css/dataTables.bootstrap.min.css"/><link rel="stylesheet" href="assets/css/style.css" type="text/css"/></head><body><div class="be-wrapper"><nav class="navbar navbar-default navbar-fixed-top be-top-header"><div class="container-fluid"><div class="navbar-header"><a href="index.html" class="navbar-brand"></a></div><div class="be-right-navbar"><ul class="nav navbar-nav navbar-right be-user-nav"><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><img src="assets/img/avatar.png" alt="Avatar"><span class="user-name">Túpac Amaru</span></a><ul role="menu" class="dropdown-menu"><li><div class="user-info"><div class="user-name">wu123</div><div class="user-position online">在线</div></div></li><li><a href="#"><span class="icon mdi mdi-face"></span> 账户</a></li><li><a href="#"><span class="icon mdi mdi-settings"></span> 设置</a></li><li><a href="#"><span class="icon mdi mdi-power"></span> 推出登录</a></li></ul></li></ul><div class="page-title"></div><ul class="nav navbar-nav navbar-right be-icons-nav"><li class="dropdown"><a href="#" role="button" aria-expanded="false" class="be-toggle-right-sidebar"><span class="icon mdi mdi-settings"></span></a></li><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><span class="icon mdi mdi-notifications"></span><span class="indicator"></span></a><ul class="dropdown-menu be-notifications"><li><div class="title">消息提醒<span class="badge">3</span></div><div class="list"><div class="be-scroller"><div class="content"><ul><li class="notification notification-unread"><a href="#"><div class="image"><img src="assets/img/avatar2.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">Jessica Caruso</span> accepted your invitation to join the team.</div><span class="date">2 min ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar3.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">Joel King</span> is now following you</div><span class="date">2 days ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar4.png" alt="Avatar"></div><div class="notification-info"><div class="text"><span class="user-name">John Doe</span> is watching your main repository</div><span class="date">2 days ago</span></div></a></li><li class="notification"><a href="#"><div class="image"><img src="assets/img/avatar5.png" alt="Avatar"></div><div class="notification-info"><span class="text"><span class="user-name">Emily Carter</span> is now following you</span><span class="date">5 days ago</span></div></a></li></ul></div></div></div><div class="footer"> <a href="#">View all notifications</a></div></li></ul></li><li class="dropdown"><a href="#" data-toggle="dropdown" role="button" aria-expanded="false" class="dropdown-toggle"><span class="icon mdi mdi-apps"></span></a><ul class="dropdown-menu be-connections"><li><div class="list"><div class="content"><div class="row"><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/github.png" alt="Github"><span>GitHub</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/bitbucket.png" alt="Bitbucket"><span>Bitbucket</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/slack.png" alt="Slack"><span>Slack</span></a></div></div><div class="row"><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/dribbble.png" alt="Dribbble"><span>Dribbble</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/mail_chimp.png" alt="Mail Chimp"><span>Mail Chimp</span></a></div><div class="col-xs-4"><a href="#" class="connection-item"><img src="assets/img/dropbox.png" alt="Dropbox"><span>Dropbox</span></a></div></div></div></div><div class="footer"> <a href="#">More</a></div></li></ul></li></ul></div></div></nav>
<!--侧边栏-开始
-->
<div class="be-left-sidebar"><div class="left-sidebar-wrapper"><a href="#" class="left-sidebar-toggle">看版</a><div class="left-sidebar-spacer"><div class="left-sidebar-scroll"><div class="left-sidebar-content"><ul class="sidebar-elements"><li class="divider">菜单</li><li class="parent"><a href="#"><i class="icon mdi mdi-home"></i><span>控制台</span></a></li><li class="parent"><a href="#"><i class="icon mdi mdi-face"></i><span>应用管理</span></a><ul class="sub-menu"><li ><a href="pod-index.html">添加应用</a></li></ul></li><li class="parent"><a href="charts.html"><i class="icon mdi mdi-chart-donut"></i><span>服务管理</span></a><ul class="sub-menu"><li ><a href="svc-index.html">添加服务</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-dot-circle"></i><span>域名管理</span></a><ul class="sub-menu"><li ><a href="route-index.html">添加路由</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-dot-circle"></i><span>权限管理</span></a><ul class="sub-menu"><li class="active"><a href="route-index.html">权限管理</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-border-all"></i><span>权限管理</span></a><ul class="sub-menu"><li><a href="tables-general.html">General</a></li><li><a href="tables-datatables.html">Data Tables</a></li><li><a href="tables-filters.html"><span class="label label-primary pull-right">New</span>Table Filters</a></li></ul></li><li class="parent"><a href="#"><i class="icon mdi mdi-layers"></i><span>权限管理</span></a><ul class="sub-menu"><li><a href="pages-blank.html">Blank Page</a></li><li><a href="pages-blank-header.html">Blank Page Header</a></li><li><a href="pages-login.html">Login</a></li><li><a href="pages-login2.html">Login v2</a></li><li><a href="pages-404.html">404 Page</a></li><li><a href="pages-sign-up.html">Sign Up</a></li><li><a href="pages-forgot-password.html">Forgot Password</a></li><li><a href="pages-profile.html">Profile</a></li><li><a href="pages-pricing-tables.html">Pricing Tables</a></li><li><a href="pages-pricing-tables2.html">Pricing Tables v2</a></li><li><a href="pages-timeline.html">Timeline</a></li><li><a href="pages-timeline2.html">Timeline v2</a></li><li><a href="pages-invoice.html"><span class="label label-primary pull-right">New</span>Invoice</a></li><li><a href="pages-calendar.html">Calendar</a></li><li><a href="pages-gallery.html">Gallery</a></li><li><a href="pages-code-editor.html"><span class="label label-primary pull-right">New </span>Code Editor</a></li><li><a href="pages-booking.html"><span class="label label-primary pull-right">New</span>Booking</a></li><li><a href="pages-loaders.html"><span class="label label-primary pull-right">New</span>Loaders</a></li></ul></li></ul></div></div></div><div class="progress-widget"><div class="progress"><div style="width: 60%;" class="progress-bar progress-bar-primary"></div></div></div></div>
</div>
<!--
侧边栏-结束
--><div class="be-content"><div class="page-head"><h2 class="page-head-title">权限管理</h2><ol class="breadcrumb page-head-nav"><li><a href="#">控制台</a></li><li><a href="#">权限管理</a></li><li class="active">权限管理列表</li></ol></div><div class="main-content container-fluid"><div class="main-content container-fluid"><div class="row"><div class="col-md-12"><div class="panel panel-default panel-border-color panel-border-color-primary"><div class="panel-heading panel-heading-divider">权限设置<span class="panel-subtitle">分配系统详细的权限</span></div><div class="panel-body"><form action="http://127.0.0.1:8080/userApi/AddPermission" class="form-horizontal group-border-dashed" method="post" novalidate=""><div class="form-group"><label class="col-sm-3 control-label">角色</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><select name="role_id"><option value="1">主管</option><option value="2">组长</option><option value="3">组员</option><option value="4">访客</option></select></div></div></div><div class="form-group"><label class="col-sm-3 control-label">应用管理</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check6" type="checkbox" checked="" name="permission_id" value="1"><label for="check6">应用创建</label></div><div class="be-checkbox be-checkbox-color has-danger inline"><input id="check7" type="checkbox" name="permission_id" value="2"><label for="check7">应用删除</label></div><div class="be-checkbox be-checkbox-color has-success inline"><input id="check8" type="checkbox" name="permission_id" value="3"><label for="check8">应用查看</label></div><div class="be-checkbox be-checkbox-color has-warning inline"><input id="check9" type="checkbox" name="permission_id" value="4"><label for="check9">应用续费</label></div></div></div><div class="form-group"><label class="col-sm-3 control-label">服务管理</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check26" type="checkbox" checked="" name="permission_id" value="5"><label for="check26">服务创建</label></div><div class="be-checkbox be-checkbox-color has-danger inline"><input id="check27" type="checkbox" name="permission_id" value="6"><label for="check27">服务删除</label></div><div class="be-checkbox be-checkbox-color has-success inline"><input id="check28" type="checkbox" name="permission_id" value="7"><label for="check28">服务查看</label></div><div class="be-checkbox be-checkbox-color has-warning inline"><input id="check29" type="checkbox" name="permission_id" value="8"><label for="check29">应用续费</label></div></div></div><div class="form-group"><label class="col-sm-3 control-label">域名管理</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check16" type="checkbox" checked="" name="permission_id" value="9"><label for="check16">域名创建</label></div><div class="be-checkbox be-checkbox-color has-danger inline"><input id="check17" type="checkbox" name="permission_id" value="10"><label for="check17">域名删除</label></div><div class="be-checkbox be-checkbox-color has-success inline"><input id="check18" type="checkbox" name="permission_id" value="11"><label for="check18">域名查看</label></div><div class="be-checkbox be-checkbox-color has-warning inline"><input id="check19" type="checkbox" name="permission_id" value="12"><label for="check19">域名续费</label></div></div></div><div class="form-group"><label class="col-sm-3 control-label">云盘管理</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check36" type="checkbox" checked=""><label for="check36">云盘创建</label></div><div class="be-checkbox be-checkbox-color has-danger inline"><input id="check37" type="checkbox"><label for="check37">云盘删除</label></div><div class="be-checkbox be-checkbox-color has-success inline"><input id="check38" type="checkbox"><label for="check38">云盘查看</label></div><div class="be-checkbox be-checkbox-color has-warning inline"><input id="check39" type="checkbox"><label for="check39">云盘续费</label></div></div></div><div class="form-group"><label class="col-sm-3 control-label">云应用市场</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check46" type="checkbox" checked=""><label for="check46">云应用安装</label></div><div class="be-checkbox be-checkbox-color has-danger inline"><input id="check47" type="checkbox"><label for="check47">云应用删除</label></div><div class="be-checkbox be-checkbox-color has-success inline"><input id="check48" type="checkbox"><label for="check48">云市场查看</label></div><div class="be-checkbox be-checkbox-color has-warning inline"><input id="check49" type="checkbox"><label for="check49">云市场搜索</label></div></div></div><div class="form-group"><label class="col-sm-3 control-label">中间件管理</label><div class="col-sm-6"><div class="be-checkbox be-checkbox-color inline"><input id="check56" type="checkbox" checked=""><label for="check56">中间件创建</label></div><div class="be-checkbox be-checkbox-color has-danger inline"><input id="check57" type="checkbox"><label for="check57">中间件删除</label></div><div class="be-checkbox be-checkbox-color has-success inline"><input id="check58" type="checkbox"><label for="check58">中间件查看</label></div><div class="be-checkbox be-checkbox-color has-warning inline"><input id="check59" type="checkbox"><label for="check59">中间件续费</label></div><div class="form-group"><div class="col-sm-2 col-sm-10"><button type="submit" class="btn btn-space btn-primary">提交</button><button class="btn btn-space btn-default">取消</button></div></div></div></div></form></div></div></div></div></div></div></div><nav class="be-right-sidebar"><div class="sb-content"><div class="tab-navigation"><ul role="tablist" class="nav nav-tabs nav-justified"><li role="presentation" class="active"><a href="#tab1" aria-controls="tab1" role="tab" data-toggle="tab">Chat</a></li><li role="presentation"><a href="#tab2" aria-controls="tab2" role="tab" data-toggle="tab">Todo</a></li><li role="presentation"><a href="#tab3" aria-controls="tab3" role="tab" data-toggle="tab">Settings</a></li></ul></div><div class="tab-panel"><div class="tab-content"><div id="tab1" role="tabpanel" class="tab-pane tab-chat active"><div class="chat-contacts"><div class="chat-sections"><div class="be-scroller"><div class="content"><h2>Recent</h2><div class="contact-list contact-list-recent"><div class="user"><a href="#"><img src="assets/img/avatar1.png" alt="Avatar"><div class="user-data"><span class="status away"></span><span class="name">Claire Sassu</span><span class="message">Can you share the...</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar2.png" alt="Avatar"><div class="user-data"><span class="status"></span><span class="name">Maggie jackson</span><span class="message">I confirmed the info.</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar3.png" alt="Avatar"><div class="user-data"><span class="status offline"></span><span class="name">Joel King </span><span class="message">Ready for the meeti...</span></div></a></div></div><h2>Contacts</h2><div class="contact-list"><div class="user"><a href="#"><img src="assets/img/avatar4.png" alt="Avatar"><div class="user-data2"><span class="status"></span><span class="name">Mike Bolthort</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar5.png" alt="Avatar"><div class="user-data2"><span class="status"></span><span class="name">Maggie jackson</span></div></a></div><div class="user"><a href="#"><img src="assets/img/avatar6.png" alt="Avatar"><div class="user-data2"><span class="status offline"></span><span class="name">Jhon Voltemar</span></div></a></div></div></div></div></div><div class="bottom-input"><input type="text" placeholder="Search..." name="q"><span class="mdi mdi-search"></span></div></div><div class="chat-window"><div class="title"><div class="user"><img src="assets/img/avatar2.png" alt="Avatar"><h2>Maggie jackson</h2><span>Active 1h ago</span></div><span class="icon return mdi mdi-chevron-left"></span></div><div class="chat-messages"><div class="be-scroller"><div class="content"><ul><li class="friend"><div class="msg">Hello</div></li><li class="self"><div class="msg">Hi, how are you?</div></li><li class="friend"><div class="msg">Good, I'll need support with my pc</div></li><li class="self"><div class="msg">Sure, just tell me what is going on with your computer?</div></li><li class="friend"><div class="msg">I don't know it just turns off suddenly</div></li></ul></div></div></div><div class="chat-input"><div class="input-wrapper"><span class="photo mdi mdi-camera"></span><input type="text" placeholder="Message..." name="q" autocomplete="off"><span class="send-msg mdi mdi-mail-send"></span></div></div></div></div><div id="tab2" role="tabpanel" class="tab-pane tab-todo"><div class="todo-container"><div class="todo-wrapper"><div class="be-scroller"><div class="todo-content"><span class="category-title">Today</span><ul class="todo-list"><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo1" type="checkbox" checked=""><label for="todo1">Initialize the project</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo2" type="checkbox"><label for="todo2">Create the main structure</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo3" type="checkbox"><label for="todo3">Updates changes to GitHub</label></div></li></ul><span class="category-title">Tomorrow</span><ul class="todo-list"><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo4" type="checkbox"><label for="todo4">Initialize the project</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo5" type="checkbox"><label for="todo5">Create the main structure</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo6" type="checkbox"><label for="todo6">Updates changes to GitHub</label></div></li><li><div class="be-checkbox be-checkbox-sm"><span class="delete mdi mdi-delete"></span><input id="todo7" type="checkbox"><label for="todo7" title="This task is too long to be displayed in a normal space!">This task is too long to be displayed in a normal space!</label></div></li></ul></div></div></div><div class="bottom-input"><input type="text" placeholder="Create new task..." name="q"><span class="mdi mdi-plus"></span></div></div></div><div id="tab3" role="tabpanel" class="tab-pane tab-settings"><div class="settings-wrapper"><div class="be-scroller"><span class="category-title">General</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st1" id="st1"><span><label for="st1"></label></span></div><span class="name">Available</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st2" id="st2"><span><label for="st2"></label></span></div><span class="name">Enable notifications</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st3" id="st3"><span><label for="st3"></label></span></div><span class="name">Login with Facebook</span></li></ul><span class="category-title">Notifications</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st4" id="st4"><span><label for="st4"></label></span></div><span class="name">Email notifications</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st5" id="st5"><span><label for="st5"></label></span></div><span class="name">Project updates</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" checked="" name="st6" id="st6"><span><label for="st6"></label></span></div><span class="name">New comments</span></li><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st7" id="st7"><span><label for="st7"></label></span></div><span class="name">Chat messages</span></li></ul><span class="category-title">Workflow</span><ul class="settings-list"><li><div class="switch-button switch-button-sm"><input type="checkbox" name="st8" id="st8"><span><label for="st8"></label></span></div><span class="name">Deploy on commit</span></li></ul></div></div></div></div></div></div></nav></div><script src="assets/lib/jquery/jquery.min.js" type="text/javascript"></script><script src="assets/lib/perfect-scrollbar/js/perfect-scrollbar.jquery.min.js" type="text/javascript"></script><script src="assets/js/main.js" type="text/javascript"></script><script src="assets/lib/bootstrap/dist/js/bootstrap.min.js" type="text/javascript"></script><script src="assets/lib/datatables/js/jquery.dataTables.min.js" type="text/javascript"></script><script src="assets/lib/datatables/js/dataTables.bootstrap.min.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/dataTables.buttons.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.html5.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.flash.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.print.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.colVis.js" type="text/javascript"></script><script src="assets/lib/datatables/plugins/buttons/js/buttons.bootstrap.js" type="text/javascript"></script><script src="assets/js/app-tables-datatables.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function(){//initialize the javascriptApp.init();App.dataTables();$.ajax({type:"get",url:"http://127.0.0.1:8080/routeApi/",success: function(data){console.log(data);$("#table-data").html("");$.each(data['route_info'],function (i,item) {$("#table-data").append(' <tr class="gradeA">\<td>'+item.id+'</td>\<td>'+item.route_name+'</td>\<td>'+item.route_namespace+'</td>\<td class="center">'+item.route_host+'</td>\<td class="center"><a href="route-detail.html?route_id='+item.id+'">详情</a> <a href="http://localhost:8080/routeApi/deleteRouteById?route_id='+item.id+'" style="color:red;" >删除</a></td>\</tr>');})},error: function(result){console.log(result);}});});</script></body>
</html>
C:\Users\Administrator\Desktop\gopaas\userapi\proto\userApi\userApi.proto
service UserApi {rpc FindUserById(Request) returns (Response){}rpc AddUser(Request) returns (Response){}rpc DeleteUserById(Request) returns (Response){}rpc UpdateUser(Request) returns (Response){}//默认接口rpc Call(Request) returns (Response){}rpc AddRole(Request) returns (Response){}rpc UpdateRole(Request) returns (Response){}rpc DeleteRole(Request) returns (Response){}rpc IsRight(Request) returns (Response){}rpc AddPermission(Request) returns (Response){}rpc UpdatePermission(Request) returns (Response){}rpc DeletePermission(Request) returns (Response){}
}
PS D:\Workspace\Go\bin> D:\Workspace\Go\bin\protoc.exe --proto_path=C:\Users\Administrator\Desktop\gopaas\userapi --micro_out=C:\Users\Administrator\Desktop\gopaas\userapi --go_out=:C:\Users\Administrator\Desktop\gopaas\userapi C:\Users\Administrator\Desktop\gopaas\userapi\proto\userApi\userApi.proto
C:\Users\Administrator\Desktop\gopaas\userapi\handler\userApiHandler.go
package handlerimport ("context""encoding/json""errors""strconv"log "github.com/asim/go-micro/v3/logger""github.com/yunixiangfeng/gopaas/common"role "github.com/yunixiangfeng/gopaas/user/proto/role"user "github.com/yunixiangfeng/gopaas/user/proto/user"userApi "github.com/yunixiangfeng/gopaas/userApi/proto/userApi"
)type UserApi struct {UserService user.UserServiceRoleService role.RoleService
}func (e *UserApi) getPost(req *userApi.Request, key string) (string, error) {if _, ok := req.Post[key]; !ok {return "", errors.New("参数异常")}return req.Post[key].Values[0], nil
}func (e *UserApi) getStringInt64(stringValue string) int64 {intValue, err := strconv.ParseInt(stringValue, 10, 64)if err != nil {common.Error(err)return 0}return intValue
}func (e *UserApi) AddRole(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {userIdString, err := e.getPost(req, "user_id")if err != nil {common.Error(err)return err}userId := e.getStringInt64(userIdString)if _, ok := req.Post["role_id"]; !ok {common.Error(err)return err}roleId := []int64{}for _, v := range req.Post["role_id"].Values {roleId = append(roleId, e.getStringInt64(v))}rs, err := e.UserService.AddRole(ctx, &user.UserRole{UserId: userId,RoleId: roleId,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(rs)rsp.Body = string(b)return nil
}func (e *UserApi) UpdateRole(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {userIdString, err := e.getPost(req, "user_id")if err != nil {common.Error(err)return err}userId := e.getStringInt64(userIdString)if _, ok := req.Post["role_id"]; !ok {common.Error(err)return err}roleId := []int64{}for _, v := range req.Post["role_id"].Values {roleId = append(roleId, e.getStringInt64(v))}rs, err := e.UserService.UpdateRole(ctx, &user.UserRole{UserId: userId,RoleId: roleId,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(rs)rsp.Body = string(b)return nil
}func (e *UserApi) DeleteRole(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {userIdString, err := e.getPost(req, "user_id")if err != nil {common.Error(err)return err}userId := e.getStringInt64(userIdString)if _, ok := req.Post["role_id"]; !ok {common.Error(err)return err}roleId := []int64{}for _, v := range req.Post["role_id"].Values {roleId = append(roleId, e.getStringInt64(v))}rs, err := e.UserService.DeleteRole(ctx, &user.UserRole{UserId: userId,RoleId: roleId,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(rs)rsp.Body = string(b)return nil
}func (e *UserApi) IsRight(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {if _, ok := req.Get["user_id"]; !ok {return errors.New("参数异常")}idString := req.Get["user_id"].Values[0]userId, err := strconv.ParseInt(idString, 10, 64)if err != nil {common.Error(err)return err}if _, ok := req.Get["user_action"]; !ok {return errors.New("参数异常")}action := req.Get["user_action"].Values[0]right, err := e.UserService.IsRight(ctx, &user.UserRight{UserId: userId,Action: action,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(right)rsp.Body = string(b)return nil
}func (e *UserApi) AddPermission(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {roleIdString, err := e.getPost(req, "role_id")if err != nil {common.Error(err)return err}roleId := e.getStringInt64(roleIdString)if _, ok := req.Post["permission_id"]; !ok {common.Error(err)return err}permissionId := []int64{}for _, v := range req.Post["permission_id"].Values {permissionId = append(permissionId, e.getStringInt64(v))}rs, err := e.RoleService.AddPermission(ctx, &role.RolePermission{PermissionId: permissionId,RoleId: roleId,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(rs)rsp.Body = string(b)return nil
}func (e *UserApi) UpdatePermission(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {roleIdString, err := e.getPost(req, "role_id")if err != nil {common.Error(err)return err}roleId := e.getStringInt64(roleIdString)if _, ok := req.Post["permission_id"]; !ok {common.Error(err)return err}permissionId := []int64{}for _, v := range req.Post["permission_id"].Values {permissionId = append(permissionId, e.getStringInt64(v))}rs, err := e.RoleService.UpdatePermission(ctx, &role.RolePermission{PermissionId: permissionId,RoleId: roleId,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(rs)rsp.Body = string(b)return nil
}func (e *UserApi) DeletePermission(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {roleIdString, err := e.getPost(req, "role_id")if err != nil {common.Error(err)return err}roleId := e.getStringInt64(roleIdString)if _, ok := req.Post["permission_id"]; !ok {common.Error(err)return err}permissionId := []int64{}for _, v := range req.Post["permission_id"].Values {permissionId = append(permissionId, e.getStringInt64(v))}rs, err := e.RoleService.DeletePermission(ctx, &role.RolePermission{PermissionId: permissionId,RoleId: roleId,})if err != nil {common.Error(err)return err}rsp.StatusCode = 200b, _ := json.Marshal(rs)rsp.Body = string(b)return nil
}// userApi.FindUserById 通过API向外暴露为/userApi/findUserById,接收http请求
// 即:/userApi/FindUserById 请求会调用go.micro.api.userApi 服务的userApi.FindUserById 方法
func (e *UserApi) FindUserById(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {log.Info("Received userApi.FindUserById request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问/userApi/FindUserById'}")rsp.Body = string(b)return nil
}// userApi.AddUser 通过API向外暴露为/userApi/AddUser,接收http请求
// 即:/userApi/AddUser 请求会调用go.micro.api.userApi 服务的userApi.AddUser 方法
func (e *UserApi) AddUser(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {log.Info("Received userApi.AddUser request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问/userApi/AddUser'}")rsp.Body = string(b)return nil
}// userApi.DeleteUserById 通过API向外暴露为/userApi/DeleteUserById,接收http请求
// 即:/userApi/DeleteUserById 请求会调用go.micro.api.userApi 服务的 userApi.DeleteUserById 方法
func (e *UserApi) DeleteUserById(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {log.Info("Received userApi.DeleteUserById request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问/userApi/DeleteUserById'}")rsp.Body = string(b)return nil
}// userApi.UpdateUser 通过API向外暴露为/userApi/UpdateUser,接收http请求
// 即:/userApi/UpdateUser 请求会调用go.micro.api.userApi 服务的userApi.UpdateUser 方法
func (e *UserApi) UpdateUser(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {log.Info("Received userApi.UpdateUser request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问/userApi/UpdateUser'}")rsp.Body = string(b)return nil
}// 默认的方法userApi.Call 通过API向外暴露为/userApi/call,接收http请求
// 即:/userApi/call或/userApi/ 请求会调用go.micro.api.userApi 服务的userApi.FindUserById 方法
func (e *UserApi) Call(ctx context.Context, req *userApi.Request, rsp *userApi.Response) error {log.Info("Received userApi.Call request")rsp.StatusCode = 200b, _ := json.Marshal("{success:'成功访问:Call'}")rsp.Body = string(b)return nil
}
C:\Users\Administrator\Desktop\gopaas\userapi\main.go
userService := go_micro_service_user.NewUserService("go.micro.service.user", service.Client())roleService := go_micro_service_role.NewRoleService("go.micro.service.role", service.Client())// 注册控制器if err := userApi.RegisterUserApiHandler(service.Server(), &handler.UserApi{UserService: userService, RoleService: roleService}); err != nil {common.Error(err)}
12-15总结&思考
主要内容
用户中心服务开发
用户中心API开发
用户中心页面联调
用户中心中添加职位如何操作?
用户中心中的数据权限如何添加?
相关文章:

基于Go开发PaaS平台3
Go开发PaaS平台核心功能 代码仓库地址GitHub - yunixiangfeng/gopaas 10-18 中间件前端页面以及核心API开发(中) C:\Users\Administrator\Desktop\gopaas\middlewareapi\handler\middlewareApiHandler.go package handlerimport ("context"…...

虎牙直播在微服务改造的实践总结
博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程,博主也曾写过优秀论文,查重率极低,在这方面…...
设置线程池的大小
线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。在代码中通常不会固定线程池的大小,而应该通过某种配置机制来提供,或者根据Runtime. availableProcessors来动态计算。 幸运的是,要设置线程池的大小也并不困难,只需要避免“过大”和“过…...
Vue3 除了 keep-alive,还有哪些实现页面缓存的方法
有这么一个需求:列表页进入详情页后,切换回列表页,需要对列表页进行缓存,如果从首页进入列表页,就要重新加载列表页。 对于这个需求,我的第一个想法就是使用keep-alive来缓存列表页,列表和详情…...
JavaScript闭包
定义 定义:在计算机科学中,闭包(Closure)是一个函数及其相关引用环境组合而成的实体。简单来说,闭包是指一个函数以及该函数访问的外部变量的集合。在一些编程语言中,函数可以访问在其定义时所处的上下文中…...

华为OD机试之不含101的整数(Java源码)
不含101的数 题目描述 小明在学习二进制时,发现了一类不含 101的数,也就是: 将数字用二进制表示,不能出现 101 。 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个二进制不含 101 的整数? 输入描述…...

SpringCloud Ribbon 学习
SpringCloud Ribbon 学习 文章目录 SpringCloud Ribbon 学习1. Ribbon 是什么?2. LB(Load Balance)3 Ribbon 架构图&机制4 Ribbon 常见负载均衡算法5 测试 1. Ribbon 是什么? Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡…...
预告:XuperOS Global 国际化进展
XuperOS新年致辞中,我们提到XuperOS成长计划的最后一个阶段是国际化。伴随前三个阶段创世、监督、共建先后落地,很多用户特来咨询XuperOS国际化进展,我们在此统一说明。 按照之前的规划,XuperOS将在海外部署一条新的开放链XuperOS…...

炫技操作--递归实现翻转链表(java)
递归实现链表的逆序 leetcode 206题。 翻转链表递归解法普通方式实现链表翻转链表专题 leetcode 206题。 翻转链表 leetcode链接用于测试 题目:描述 将一个链表翻转: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 递归解法 解题思路…...

华为OD机试真题 Java 实现【求最小公倍数】【牛客练习题】
一、题目描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。 数据范围:1≤a,b≤100000 。 二、输入描述 输入两个正整数A和B。 三、输出描述 输出A和B的最小公倍数。 四、解…...
[java]两数之和 II - 输入有序数组
两数之和 II - 输入有序数组 leetcode 167 原题链接解题思路解题代码排序专题 leetcode 167 原题链接 167. 两数之和 II - 输入有序数组 – 原题链接 题目描述: 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出…...

Linux-0.11 boot目录head.s详解
Linux-0.11 boot目录head.s详解 模块简介 在head.s中,操作系统主要做了如下几件事: 重新设置中断描述符和全局描述符检查A20地址线是否开启检查数学协处理器初始化页表并开启分页跳转到main函数执行 过程详解 重新设置IDT和GDT 在setup.s中我们已经…...

离散数学_十章-图 ( 3 ):由旧图构造新图
📷10.3 由旧图构造新图 概念1. 子图2. 真子图3. 导出的子图 旧图构造新图的方法1. 删除或增加图中的边2. 边的收缩3. 删除顶点 有时解决问题只需要图的一部分。 比如我们现在只关心大型计算机网络中涉及济南,广州,深圳的计算机中心࿰…...

Golang每日一练(leetDay0083) 汇总区间、多数元素II
目录 228. 汇总区间 Summary Ranges 🌟 229. 多数元素 II Majority Element ii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专…...

JAVA数组基础
目录 一、使用方式 1-动态初始化 ①先声明数组 ② 创建数组 ③分配方式 二、使用方式 2-静态初始化(直接在声明的同时初始化{ } ) 三、数组使用注意事项和细节 四、数组两种初始化方式都是将内存空间分配到堆上面的 一、使用方式 1-动态初始化 …...

Linux-0.11 文件系统exec.c详解
Linux-0.11 文件系统exec.c详解 模块简介 该模块实现了二进制可执行文件和shell脚本文件的加载和执行。 函数详解 create_tables static unsigned long * create_tables(char * p,int argc,int envc)该函数的作用是建立参数和环境变量指针表。 create_table的作用就是建立…...

NET框架程序设计-第1章.NET框架开发平台体系架构
1.1 .NET 框架基本组成 .NET 框架的核心便是通用语言运行时(Commomn Language Runtime,简称 CLR),CLR 是一个可被各种不同的编程语言所使用的运行时。 托管模块(mangaed module): 一个需要 CLR 才能执行的标准 Window…...

(哈希表 ) 349. 两个数组的交集 ——【Leetcode每日一题】
❓349. 两个数组的交集 难度:简单 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[…...
JavaScript基本语法(二)
JavaScript基本语法 1、变量1.1、简介1.2、变量命名规则1.3、JS的关键字和保留字1.4、声明提升 2、JavaScript数据类型2.1、基本类型2.2、引用类型2.3、两种类型的区别2.4、字符串常用方法 3、数据类型转换 1、变量 1.1、简介 在 JavaScript 中声明一个新变量的方法是使用关键…...

ChatGPT3.5-4资源汇总,直连无梯子
什么是ChatGPT? ChatGPT,全称:聊天生成预训练转换器(英语:Chat Generative Pre-trained Transformer),是OpenAI开发的人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5、GPT-4…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...