mirror of https://github.com/veypi/OneAuth.git
添加权限角色编辑
parent
4afa6f345e
commit
5efcf47351
@ -0,0 +1,140 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"github.com/veypi/OneAuth/cfg"
|
||||
"github.com/veypi/OneAuth/libs/auth"
|
||||
"github.com/veypi/OneAuth/libs/base"
|
||||
"github.com/veypi/OneAuth/libs/oerr"
|
||||
"github.com/veypi/OneAuth/models"
|
||||
"github.com/veypi/OneAuth/oalib"
|
||||
"github.com/veypi/OneBD"
|
||||
"github.com/veypi/OneBD/core"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var authP = OneBD.NewHandlerPool(func() core.Handler {
|
||||
return &authHandler{}
|
||||
})
|
||||
|
||||
type authHandler struct {
|
||||
base.AppHandler
|
||||
}
|
||||
|
||||
func (h *authHandler) Get() (interface{}, error) {
|
||||
if !h.GetAuth(auth.Auth, h.UUID).CanRead() {
|
||||
return nil, oerr.NoAuth
|
||||
}
|
||||
var err error
|
||||
id, _ := strconv.Atoi(h.Meta().Query("rid"))
|
||||
rid := uint(id)
|
||||
id, _ = strconv.Atoi(h.Meta().Query("uid"))
|
||||
uid := uint(id)
|
||||
if rid == 0 && uid == 0 {
|
||||
return nil, err
|
||||
}
|
||||
query := &models.Auth{
|
||||
AppUUID: h.UUID,
|
||||
}
|
||||
if rid != 0 {
|
||||
query.RoleID = &rid
|
||||
} else if uid != 0 {
|
||||
query.UserID = &uid
|
||||
}
|
||||
l := make([]*models.Auth, 0, 10)
|
||||
err = cfg.DB().Where(query).Find(&l).Error
|
||||
return l, err
|
||||
}
|
||||
|
||||
func (h *authHandler) Post() (interface{}, error) {
|
||||
if !h.GetAuth(auth.Auth, h.UUID).CanCreate() {
|
||||
return nil, oerr.NoAuth
|
||||
}
|
||||
query := &models.Auth{}
|
||||
err := h.Meta().ReadJson(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if query.ResourceID == 0 {
|
||||
return nil, oerr.ApiArgsError
|
||||
}
|
||||
query.AppUUID = h.UUID
|
||||
res := &models.Resource{}
|
||||
res.ID = query.ResourceID
|
||||
err = cfg.DB().First(res).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
query.RID = res.Name
|
||||
err = cfg.DB().Create(query).Error
|
||||
return query, err
|
||||
}
|
||||
|
||||
func (h *authHandler) Patch() (interface{}, error) {
|
||||
if !h.GetAuth(auth.Auth, h.UUID).CanUpdate() {
|
||||
return nil, oerr.NoAuth
|
||||
}
|
||||
id := h.Meta().ParamsInt("id")
|
||||
if id <= 0 {
|
||||
return nil, oerr.ApiArgsError
|
||||
}
|
||||
a := &models.Auth{}
|
||||
a.ID = uint(id)
|
||||
err := cfg.DB().First(a).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
opts := struct {
|
||||
ResourceID *uint `gorm:"not null"`
|
||||
RUID *string
|
||||
Level *oalib.AuthLevel
|
||||
}{}
|
||||
err = h.Meta().ReadJson(&opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if a.AppUUID != h.UUID {
|
||||
return nil, oerr.ApiArgsError
|
||||
}
|
||||
query := map[string]interface{}{}
|
||||
if opts.ResourceID != nil && a.ResourceID != *opts.ResourceID {
|
||||
query["ResourceID"] = *opts.ResourceID
|
||||
res := &models.Resource{}
|
||||
res.ID = *opts.ResourceID
|
||||
err = cfg.DB().First(res).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
query["RID"] = res.Name
|
||||
a.ResourceID = *opts.ResourceID
|
||||
}
|
||||
if opts.RUID != nil {
|
||||
query["RUID"] = *opts.RUID
|
||||
a.RUID = *opts.RUID
|
||||
}
|
||||
if opts.Level != nil {
|
||||
query["Level"] = *opts.Level
|
||||
a.Level = *opts.Level
|
||||
}
|
||||
err = cfg.DB().Model(a).Where("id = ?", id).Updates(query).Error
|
||||
return a, err
|
||||
}
|
||||
|
||||
func (h *authHandler) Delete() (interface{}, error) {
|
||||
if !h.GetAuth(auth.Auth, h.UUID).CanDelete() {
|
||||
return nil, oerr.NoAuth
|
||||
}
|
||||
id := h.Meta().ParamsInt("id")
|
||||
if id <= 0 {
|
||||
return nil, oerr.ApiArgsError
|
||||
}
|
||||
a := &models.Auth{}
|
||||
a.ID = uint(id)
|
||||
err := cfg.DB().First(a).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if a.AppUUID != h.UUID {
|
||||
return nil, oerr.ApiArgsError
|
||||
}
|
||||
return nil, cfg.DB().Delete(a).Error
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"github.com/veypi/OneBD"
|
||||
"github.com/veypi/OneBD/rfc"
|
||||
)
|
||||
|
||||
func Router(r OneBD.Router) {
|
||||
r.Set("/", authP, rfc.MethodGet, rfc.MethodPost)
|
||||
r.Set("/:id", authP, rfc.MethodPatch, rfc.MethodDelete)
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
package role
|
||||
|
||||
import (
|
||||
"github.com/veypi/OneAuth/cfg"
|
||||
"github.com/veypi/OneAuth/libs/auth"
|
||||
"github.com/veypi/OneAuth/libs/base"
|
||||
"github.com/veypi/OneAuth/libs/oerr"
|
||||
"github.com/veypi/OneAuth/models"
|
||||
"github.com/veypi/OneAuth/oalib"
|
||||
"github.com/veypi/OneBD"
|
||||
"github.com/veypi/OneBD/core"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var authP = OneBD.NewHandlerPool(func() core.Handler {
|
||||
return &authHandler{}
|
||||
})
|
||||
|
||||
type authHandler struct {
|
||||
base.ApiHandler
|
||||
}
|
||||
|
||||
func (h *authHandler) Get() (interface{}, error) {
|
||||
if !h.GetAuth(auth.Auth).CanRead() {
|
||||
return nil, oerr.NoAuth
|
||||
}
|
||||
aid := h.Meta().ParamsInt("id")
|
||||
query := &models.Auth{}
|
||||
var err error
|
||||
if aid > 0 {
|
||||
err = cfg.DB().Where("ID = ?", aid).First(query).Error
|
||||
return query, err
|
||||
}
|
||||
id, _ := strconv.Atoi(h.Meta().Query("id"))
|
||||
uuid := h.Meta().Query("uuid")
|
||||
if id == 0 || uuid == "" {
|
||||
return nil, oerr.ApiArgsMissing
|
||||
}
|
||||
target := &models.App{}
|
||||
err = cfg.DB().Where("UUID = ?", uuid).First(target).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
u := &models.User{}
|
||||
err = cfg.DB().Preload("Roles.Auths").Preload("Auths").Where("ID = ?", id).First(u).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
l := make([]*oalib.SimpleAuth, 0, 10)
|
||||
for _, as := range u.GetAuths() {
|
||||
if as.AppUUID == uuid {
|
||||
l = append(l, &oalib.SimpleAuth{
|
||||
RID: as.RID,
|
||||
RUID: as.RUID,
|
||||
Level: as.Level,
|
||||
})
|
||||
}
|
||||
}
|
||||
return l, nil
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
<template>
|
||||
<div></div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
@ -0,0 +1,64 @@
|
||||
<template>
|
||||
<div>
|
||||
<slot></slot>
|
||||
<n-modal @after-leave="emit('update:modelValue',false)" v-model:show="modelValue">
|
||||
<n-card class="w-4/5 md:w-1/2 rounded-2xl" :title="res.ID > 0 ? res.Name:' '" :bordered="false"
|
||||
size="huge">
|
||||
<template #header-extra>{{ res.ID > 0 ? '编辑' : '创建' }}</template>
|
||||
<div class="grid grid-cols-5 gap-1 gap-y-8" style="line-height: 34px">
|
||||
<div>资源名</div>
|
||||
<div class="col-span-4">
|
||||
<n-input :disabled="res.ID> 0" v-model:value="res.Name"></n-input>
|
||||
</div>
|
||||
<div>资源描述</div>
|
||||
<div class="col-span-4">
|
||||
<n-input type="textarea" v-model:value="res.Des"></n-input>
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="flex justify-end">
|
||||
<n-button class="mx-3" @click="emit('update:modelValue', false)">取消</n-button>
|
||||
<n-button @click="update">{{ res.ID > 0 ? '更新' : '创建' }}</n-button>
|
||||
</div>
|
||||
</template>
|
||||
</n-card>
|
||||
</n-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {modelsResource} from '@/models'
|
||||
import api from '@/api'
|
||||
|
||||
let props = withDefaults(defineProps<{
|
||||
res: modelsResource
|
||||
modelValue: boolean
|
||||
uuid: string
|
||||
}>(), {
|
||||
res: {} as any,
|
||||
modelValue: false,
|
||||
uuid: '',
|
||||
})
|
||||
|
||||
let emit = defineEmits<{
|
||||
(e: 'update:modelValue', v: boolean): void
|
||||
(e: 'ok', v: modelsResource)
|
||||
}>()
|
||||
|
||||
function update() {
|
||||
if (props.res.ID > 0) {
|
||||
emit('update:modelValue', false)
|
||||
api.resource(props.uuid).update(props.res.ID, props.res).Start(e => {
|
||||
})
|
||||
return
|
||||
}
|
||||
api.resource(props.uuid).create(props.res.Name, props.res.Des).Start(e => {
|
||||
emit('ok', e)
|
||||
emit('update:modelValue', false)
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
@ -0,0 +1,68 @@
|
||||
<template>
|
||||
<div>
|
||||
<slot></slot>
|
||||
<n-modal @after-leave="emit('update:modelValue',false)" v-model:show="modelValue">
|
||||
<n-card class="w-4/5 md:w-1/2 rounded-2xl" :title="res.ID > 0 ? res.Name:' '" :bordered="false"
|
||||
size="huge">
|
||||
<template #header-extra>{{ res.ID > 0 ? '编辑' : '创建' }}</template>
|
||||
<div class="grid grid-cols-5 gap-1 gap-y-8" style="line-height: 34px">
|
||||
<div>角色名</div>
|
||||
<div class="col-span-4">
|
||||
<n-input :disabled="res.ID> 0" v-model:value="res.Name"></n-input>
|
||||
</div>
|
||||
<div>角色标签</div>
|
||||
<div class="col-span-4">
|
||||
<n-input type="textarea" v-model:value="res.Tag"></n-input>
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="flex justify-end">
|
||||
<n-button class="mx-3" @click="emit('update:modelValue', false)">取消</n-button>
|
||||
<n-button @click="update">{{ res.ID > 0 ? '更新' : '创建' }}</n-button>
|
||||
</div>
|
||||
</template>
|
||||
</n-card>
|
||||
</n-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {modelsRole} from '@/models'
|
||||
import api from '@/api'
|
||||
import {useMessage} from 'naive-ui'
|
||||
|
||||
let props = withDefaults(defineProps<{
|
||||
res: modelsRole
|
||||
modelValue: boolean
|
||||
uuid: string
|
||||
}>(), {
|
||||
res: {} as any,
|
||||
modelValue: false,
|
||||
uuid: '',
|
||||
})
|
||||
|
||||
let msg = useMessage()
|
||||
let emit = defineEmits<{
|
||||
(e: 'update:modelValue', v: boolean): void
|
||||
(e: 'ok', v: modelsRole)
|
||||
}>()
|
||||
|
||||
function update() {
|
||||
if (props.res.ID > 0) {
|
||||
emit('update:modelValue', false)
|
||||
api.role(props.uuid).update(props.res.ID, props.res).Start(e => {
|
||||
msg.success('更新成功')
|
||||
})
|
||||
return
|
||||
}
|
||||
api.role(props.uuid).create(props.res.Name, props.res.Tag).Start(e => {
|
||||
msg.success('添加成功')
|
||||
emit('ok', e)
|
||||
emit('update:modelValue', false)
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
Loading…
Reference in New Issue