Browse Source

更新、增加角色接口

lijian 6 years ago
parent
commit
3e79e92c7d

+ 28 - 0
pkg/models/menu.go

@@ -0,0 +1,28 @@
+package models
+
+import (
+	"errors"
+
+	"github.com/jinzhu/gorm"
+)
+
+// Menu 系统菜单
+type Menu struct {
+	gorm.Model
+	ParentID  int    //父级节点
+	Name      string `gorm:"size:50;"` // 名称
+	Label     string `gorm:"size:50;"` // 标签
+	RouterURL string `gorm:"size:200"` // 路由地址
+	Icon      string `gorm:"size:20"`  //图标
+	KeepLive  bool   //是否显示到标签栏
+}
+
+// Validate 验证
+func (a *Menu) Validate() error {
+	nlen := len(a.Name)
+	nLab := len(a.Label)
+	if nlen == 0 || nlen > 50 || nLab == 0 || nLab > 50 {
+		return errors.New("参数不合法")
+	}
+	return nil
+}

+ 12 - 0
pkg/models/relation.go

@@ -0,0 +1,12 @@
+package models
+
+// Relation 规则节点关系
+type Relation struct {
+	FromID            int
+	FromType          string
+	ToID              int
+	ToType            string
+	RelationTypeGroup string
+	RelationType      string
+	AdditionalInfo    string
+}

+ 11 - 0
pkg/models/roles.go

@@ -1,6 +1,8 @@
 package models
 
 import (
+	"errors"
+
 	"github.com/jinzhu/gorm"
 )
 
@@ -9,4 +11,13 @@ type Role struct {
 	gorm.Model
 	RoleName string `gorm:"size:50;not null"`
 	RoleCode int32
+	MenuList string `gorm:"size:100000;"`
+}
+
+// Validate ``
+func (a *Role) Validate() error {
+	if a.RoleName == "" {
+		return errors.New("角色名为空")
+	}
+	return nil
 }

+ 20 - 0
pkg/models/rulechain.go

@@ -0,0 +1,20 @@
+package models
+
+import (
+	"github.com/jinzhu/gorm"
+)
+
+// RuleChain 规则链
+type RuleChain struct {
+	gorm.Model
+	AdditionalInfo  string //节点属性信息
+	Configuration   string //配置信息
+	Name            string //名称
+	FirstRuleNodeID int    //第一个节点的ID
+	Root            bool   //是否为root chain
+	DebugModel      bool   //调试模式
+	Intro           string //描述
+	ProductID       uint   //产品ID
+	DeviceID        string //设备ID
+	VendorID        uint   //厂商ID
+}

+ 17 - 0
pkg/models/rulenode.go

@@ -0,0 +1,17 @@
+package models
+
+import (
+	"github.com/jinzhu/gorm"
+)
+
+// RuleNode 规则链中的节点
+type RuleNode struct {
+	gorm.Model
+	RuleChainID    int    //关联rulechain id
+	AdditionalInfo string //附加属性信息
+	Configuration  string //配置信息
+	Type           string //类型
+	Name           string //名称
+	DebugModel     bool   //调试模式
+	Intro          string //描述
+}

+ 1 - 0
pkg/mysql/migrate.go

@@ -43,6 +43,7 @@ func MigrateDatabase(dbhost, dbport, dbname, dbuser, dbpass string) error {
 		&models.Role{},
 		&models.Protocal{},
 		&models.AlarmRule{},
+		&models.Menu{},
 	).Error
 	if err != nil {
 		fmt.Printf("%s", err.Error())

+ 24 - 0
services/knowoapi/admin_test.go

@@ -0,0 +1,24 @@
+package main
+
+import (
+	"net/http"
+	"sparrow/pkg/models"
+	"testing"
+
+	"github.com/kataras/iris/httptest"
+)
+
+func TestRoleCreate(t *testing.T) {
+	*confDBPass = "123456"
+	e := httptest.New(t, newApp())
+	// get token
+	tk := getToken()
+	e.POST("/api/v1/admin/role").WithHeader("Authorization", "Bearer "+tk).
+		WithJSON(models.Role{
+			RoleCode: 0,
+			RoleName: "普通用户",
+			MenuList: "home",
+		}).
+		Expect().Status(http.StatusOK).
+		JSON().Object().Values().Contains(0)
+}

+ 25 - 0
services/knowoapi/base_test.go

@@ -0,0 +1,25 @@
+package main
+
+import (
+	"sparrow/pkg/models"
+	"sparrow/services/knowoapi/controllers"
+	"testing"
+
+	"github.com/kataras/iris/httptest"
+)
+
+func TestController(t *testing.T) {
+	e := httptest.New(t, newApp())
+	e.POST("/").Expect().Status(httptest.StatusOK)
+}
+
+func getToken() string {
+	tk := new(controllers.Token)
+	user := models.User{
+		UserKey:  "f7f2d7e5a8954ff4ef07ce7f77898c3f1dd389038842788346514183b5eff8b53e",
+		UserName: "lijian",
+		VendorID: 1,
+	}
+	user.ID = 1
+	return tk.TokenMaker(&user)
+}

+ 106 - 0
services/knowoapi/controllers/role.go

@@ -0,0 +1,106 @@
+package controllers
+
+import (
+	"sparrow/pkg/models"
+	"sparrow/services/knowoapi/services"
+
+	"github.com/kataras/iris"
+)
+
+// RoleController role
+type RoleController struct {
+	Ctx     iris.Context
+	Service services.RoleService
+	Token   Token
+}
+
+// Post ``
+// POST /admin/role
+func (a *RoleController) Post() {
+	role := new(models.Role)
+	if err := parseBody(a.Ctx, role); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	if err := a.Service.Create(role); err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, role)
+}
+
+// Delete delete
+// DELETE /admin/role
+func (a *RoleController) Delete() {
+	role := new(models.Role)
+	// ID为1的不允许删除
+	if role.ID == 1 {
+		responseError(a.Ctx, ErrNormal, "普通用户角色不允许删除")
+		return
+	}
+	if err := parseBody(a.Ctx, role); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	if err := a.Service.Delete(role); err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, role)
+}
+
+// Put delPutete
+// Put /admin/role
+func (a *RoleController) Put() {
+	role := new(models.Role)
+	if err := parseBody(a.Ctx, role); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	if err := a.Service.Update(role); err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, role)
+}
+
+// Get get roles
+// GET /admin/role?pi=&ps=&name
+func (a *RoleController) Get() {
+	role := new(models.Role)
+	if err := parseBody(a.Ctx, role); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	pi, err := a.Ctx.URLParamInt("pi")
+	if err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	ps, err := a.Ctx.URLParamInt("ps")
+	if err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+	name := a.Ctx.URLParam("name")
+	datas, total, err := a.Service.QueryAll(pi, ps, name)
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+
+	done(a.Ctx, map[string]interface{}{
+		"list":  datas,
+		"total": total,
+	})
+}
+
+// GetBy get role by id
+func (a *RoleController) GetBy(id int) {
+	role, err := a.Service.QueryRole(id)
+	if err != nil {
+		responseError(a.Ctx, ErrDatabase, err.Error())
+		return
+	}
+	done(a.Ctx, role)
+}

+ 7 - 2
services/knowoapi/controllers/token.go

@@ -24,8 +24,8 @@ type UserClaims struct {
 	jwt.StandardClaims
 }
 
-// tokenMaker 生成token
-func (t *Token) tokenMaker(user *models.User) string {
+// TokenMaker 生成token
+func (t *Token) TokenMaker(user *models.User) string {
 	claims := UserClaims{
 		UserName: user.UserName,
 		UserID:   user.ID,
@@ -55,3 +55,8 @@ func (t *Token) getVendorID(ctx iris.Context) uint {
 	claims := t.getUserClaims(ctx)
 	return uint(claims["VendorID"].(float64))
 }
+
+func (t *Token) getRoleID(ctx iris.Context) int {
+	claims := t.getUserClaims(ctx)
+	return int(claims["RoleCode"].(float64))
+}

+ 16 - 1
services/knowoapi/controllers/user.go

@@ -35,7 +35,7 @@ func (a *UserController) PostLogin() {
 	result := map[string]interface{}{
 		"user_id":      user.ID,
 		"company":      user.Vendor.VendorName,
-		"access_token": a.Token.tokenMaker(user),
+		"access_token": a.Token.TokenMaker(user),
 		"user_role":    user.UserRoleID,
 	}
 	done(a.Ctx, result)
@@ -111,3 +111,18 @@ func (a *UserController) PutChange() {
 	}
 	done(a.Ctx, "修改成功")
 }
+
+// GetMenu get user menu
+// GET /user/menu
+func (a *UserController) GetMenu() {
+	roleid := a.Token.getRoleID(a.Ctx)
+	role, err := a.Service.GetRole(roleid)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, "用户角色信息错误,请联系管理员")
+		return
+	}
+	done(a.Ctx, map[string]interface{}{
+		"menu_list": role.MenuList,
+		"role_name": role.RoleName,
+	})
+}

+ 3 - 2
services/knowoapi/main.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"fmt"
 	"sparrow/pkg/generator"
 	"sparrow/pkg/server"
 	"sparrow/services/knowoapi/model"
@@ -45,12 +46,12 @@ func newApp() *iris.Application {
 	registerErrors(app)
 	db, err := getDB()
 	if err != nil {
-		//server.Log.Fatal(err)
+		fmt.Print(err)
 	}
 	models := new(model.All).Init(db)
 	gen, err := generator.NewKeyGenerator(*confAESKey)
 	if err != nil {
-		//server.Log.Fatal(err)
+		fmt.Print(err)
 	}
 
 	//注册路由

+ 0 - 12
services/knowoapi/main_test.go

@@ -1,12 +0,0 @@
-package main
-
-import (
-	"testing"
-
-	"github.com/kataras/iris/httptest"
-)
-
-func TestController(t *testing.T) {
-	e := httptest.New(t, newApp())
-	e.POST("/").Expect().Status(httptest.StatusOK)
-}

+ 2 - 0
services/knowoapi/model/all.go

@@ -11,6 +11,7 @@ type All struct {
 	Protocal    *Protocal
 	Alert       *Alert
 	Device      *Device
+	Role        *Role
 }
 
 // Init 初始化所有model
@@ -22,5 +23,6 @@ func (a *All) Init(db *gorm.DB) *All {
 	a.Protocal = new(Protocal).Init(db)
 	a.Alert = new(Alert).Init(db)
 	a.Device = new(Device).Init(db)
+	a.Role = new(Role).Init(db)
 	return a
 }

+ 50 - 0
services/knowoapi/model/role.go

@@ -0,0 +1,50 @@
+package model
+
+import (
+	"sparrow/pkg/models"
+
+	"github.com/jinzhu/gorm"
+)
+
+// Role role
+type Role struct {
+	db *gorm.DB
+}
+
+// Init init
+func (a *Role) Init(db *gorm.DB) *Role {
+	a.db = db
+	return a
+}
+
+// Create create
+func (a *Role) Create(role *models.Role) error {
+	return a.db.Save(role).Error
+}
+
+// Update update
+func (a *Role) Update(role *models.Role) error {
+	return a.db.Save(role).Error
+}
+
+// Delete delete
+func (a *Role) Delete(role *models.Role) error {
+	return a.db.Delete(role).Error
+}
+
+// QueryAll query all roles
+func (a *Role) QueryAll(pi, ps int, name string) (datas []models.Role, total int, err error) {
+	tx := a.db.Where("1=1")
+	if name != "" {
+		tx = tx.Where("role_name like ?", "%"+name+"%")
+	}
+	err = tx.Limit(ps).Offset((pi - 1) * ps).Find(&datas).Error
+	err = tx.Model(&models.Role{}).Count(&total).Error
+	return
+}
+
+// QueryRole query a role
+func (a *Role) QueryRole(roleid int) (data models.Role, err error) {
+	err = a.db.Where(roleid).First(&data).Error
+	return
+}

+ 76 - 0
services/knowoapi/model/role_test.go

@@ -0,0 +1,76 @@
+package model
+
+import (
+	"sparrow/pkg/models"
+	"testing"
+
+	"github.com/jinzhu/gorm"
+)
+
+func TestRoleCreate(t *testing.T) {
+	role := newRole(t)
+	err := role.Create(&models.Role{
+		RoleCode: 0,
+		RoleName: "管理员",
+		MenuList: "home",
+	})
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestRoleUpdate(t *testing.T) {
+	role := newRole(t)
+	data := &models.Role{
+		RoleCode: 0,
+
+		RoleName: "管理员修改",
+		MenuList: "home",
+	}
+	data.ID = 1
+	err := role.Update(data)
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+func TestRoleDelete(t *testing.T) {
+	role := newRole(t)
+	data := &models.Role{
+		RoleCode: 0,
+		RoleName: "管理员修改",
+		MenuList: "home",
+	}
+	data.ID = 1
+	err := role.Delete(data)
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
+func TestQueryRole(t *testing.T) {
+	role := newRole(t)
+	data, err := role.QueryRole(2)
+	if err != nil && err == gorm.ErrRecordNotFound {
+		t.Error(err)
+	}
+	if err != nil && err != gorm.ErrRecordNotFound {
+		t.Fatal(err)
+	}
+	t.Log(data)
+}
+func TestQueryAllRole(t *testing.T) {
+	role := newRole(t)
+	datas, count, err := role.QueryAll(1, 10, "")
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Logf("记录数:%d,list:%v", count, datas)
+}
+func newRole(t *testing.T) *Role {
+	db, err := getDB()
+	if err != nil {
+		t.Fatal(err)
+	}
+	Role := new(Role).Init(db)
+	return Role
+}

+ 6 - 0
services/knowoapi/router.go

@@ -48,6 +48,7 @@ func registerRouters(srv *iris.Application, models *model.All, gen *generator.Ke
 	protocalService := services.NewProtocalService(models)
 	alertService := services.NewAlertService(models)
 	deviceService := services.NewDeviceService(models)
+	roleService := services.NewRoleService(models)
 	v1router := srv.Party("/api/v1")
 
 	// 登陆,注册
@@ -75,4 +76,9 @@ func registerRouters(srv *iris.Application, models *model.All, gen *generator.Ke
 	//device api
 	deviceAPI := mvc.New(userRouter.Party("/device"))
 	deviceAPI.Register(deviceService).Handle(new(controllers.DeviceController))
+
+	//管理员接口组
+	adminRouter := v1router.Party("/admin", newJWThandle())
+	RoleAPI := mvc.New(adminRouter.Party("/role"))
+	RoleAPI.Register(roleService).Handle(new(controllers.RoleController))
 }

+ 46 - 0
services/knowoapi/services/role.go

@@ -0,0 +1,46 @@
+package services
+
+import (
+	"sparrow/pkg/models"
+	"sparrow/services/knowoapi/model"
+)
+
+// RoleService role service
+type RoleService interface {
+	Create(*models.Role) error
+	Delete(*models.Role) error
+	Update(*models.Role) error
+	QueryAll(int, int, string) ([]models.Role, int, error)
+	QueryRole(int) (models.Role, error)
+}
+
+type roleService struct {
+	models *model.All
+}
+
+// NewRoleService new role service
+func NewRoleService(models *model.All) RoleService {
+	return roleService{
+		models: models,
+	}
+}
+
+func (a roleService) Create(role *models.Role) error {
+	return a.models.Role.Create(role)
+}
+
+func (a roleService) Delete(role *models.Role) error {
+	return a.models.Role.Delete(role)
+}
+
+func (a roleService) Update(role *models.Role) error {
+	return a.models.Role.Update(role)
+}
+
+func (a roleService) QueryAll(pi, ps int, name string) ([]models.Role, int, error) {
+	return a.models.Role.QueryAll(pi, ps, name)
+}
+
+func (a roleService) QueryRole(roleid int) (models.Role, error) {
+	return a.models.Role.QueryRole(roleid)
+}

+ 5 - 0
services/knowoapi/services/user.go

@@ -23,6 +23,8 @@ type UserService interface {
 	CheckPhone(string) (bool, error)
 	// check email exsits
 	CheckEmail(string) (bool, error)
+	// get role info
+	GetRole(int) (models.Role, error)
 }
 
 type userservice struct {
@@ -80,3 +82,6 @@ func (a userservice) CheckPhone(name string) (bool, error) {
 func (a userservice) CheckEmail(name string) (bool, error) {
 	return a.model.User.CheckEmail(name)
 }
+func (a userservice) GetRole(roleid int) (models.Role, error) {
+	return a.model.Role.QueryRole(roleid)
+}