mirror of https://github.com/veypi/OneAuth.git
更新权限和用户模型
parent
3d194e935d
commit
cd7029c298
@ -1,3 +1,7 @@
|
|||||||
# OneAuth
|
# OneAuth
|
||||||
|
|
||||||
统一验证服务
|
统一验证服务
|
||||||
|
|
||||||
|
## 用户验证思路
|
||||||
|
|
||||||
|
![](https://public.veypi.com/img/screenshot/20211012194238.png)
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package auth
|
||||||
|
|
||||||
|
import (
|
||||||
|
"OneAuth/models"
|
||||||
|
"github.com/veypi/utils"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var keyCache = sync.Map{}
|
||||||
|
|
||||||
|
func GetUserKey(uid uint, app *models.App) string {
|
||||||
|
if app.ID == 1 {
|
||||||
|
key, _ := keyCache.LoadOrStore(uid, utils.RandSeq(16))
|
||||||
|
return key.(string)
|
||||||
|
}
|
||||||
|
// TODO: 获取其他应用user_key
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func RefreshUserKey(uid uint, app *models.App) string {
|
||||||
|
if app.ID == 1 {
|
||||||
|
key := utils.RandSeq(16)
|
||||||
|
keyCache.Store(uid, key)
|
||||||
|
return key
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
function padLeftZero(str: string): string {
|
||||||
|
return ('00' + str).substr(str.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
const util = {
|
||||||
|
title: function (title: string) {
|
||||||
|
window.document.title = title ? title + ' - Home' : 'veypi project'
|
||||||
|
},
|
||||||
|
getCookie(name: string) {
|
||||||
|
const reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
|
||||||
|
const arr = document.cookie.match(reg)
|
||||||
|
if (arr) {
|
||||||
|
return unescape(arr[2])
|
||||||
|
} else return null
|
||||||
|
},
|
||||||
|
delCookie(name: string) {
|
||||||
|
const exp = new Date()
|
||||||
|
exp.setTime(exp.getTime() - 1)
|
||||||
|
const cval = this.getCookie(name)
|
||||||
|
if (cval !== null) {
|
||||||
|
document.cookie = name + '=' + cval + ';expires=' + exp.toLocaleString()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setCookie(name: string, value: string, time: number) {
|
||||||
|
const exp = new Date()
|
||||||
|
exp.setTime(exp.getTime() + time)
|
||||||
|
document.cookie =
|
||||||
|
name + '=' + escape(value) + ';expires=' + exp.toLocaleString()
|
||||||
|
},
|
||||||
|
checkLogin() {
|
||||||
|
// return parseInt(this.getCookie('stat')) === 1
|
||||||
|
return Boolean(localStorage.auth_token)
|
||||||
|
},
|
||||||
|
|
||||||
|
formatDate(date: Date, fmt: string) {
|
||||||
|
if (/(y+)/.test(fmt)) {
|
||||||
|
fmt = fmt.replace(
|
||||||
|
RegExp.$1,
|
||||||
|
(date.getFullYear() + '').substr(4 - RegExp.$1.length)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const o = {
|
||||||
|
'M+': date.getMonth() + 1,
|
||||||
|
'd+': date.getDate(),
|
||||||
|
'h+': date.getHours(),
|
||||||
|
'm+': date.getMinutes(),
|
||||||
|
's+': date.getSeconds()
|
||||||
|
}
|
||||||
|
for (const k in o) {
|
||||||
|
if (new RegExp(`(${k})`).test(fmt)) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
|
||||||
|
// @ts-ignore
|
||||||
|
const str = o[k] + ''
|
||||||
|
fmt = fmt.replace(
|
||||||
|
RegExp.$1,
|
||||||
|
RegExp.$1.length === 1 ? str : padLeftZero(str)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fmt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default util
|
@ -0,0 +1,14 @@
|
|||||||
|
// 1. 确保在声明补充的类型之前导入 'vue'
|
||||||
|
import Vue from 'vue'
|
||||||
|
import api from '@/api'
|
||||||
|
|
||||||
|
export type PluginFunction<T> = (Vue: typeof Vue, options?: T) => void;
|
||||||
|
|
||||||
|
// 2. 定制一个文件,设置你想要补充的类型
|
||||||
|
// 在 types/vue.d.ts 里 Vue 有构造函数类型
|
||||||
|
declare module 'vue/types/vue' {
|
||||||
|
// 3. 声明为 Vue 补充的东西
|
||||||
|
interface Vue {
|
||||||
|
$api: typeof api;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="about">
|
|
||||||
<h1>This is an about page</h1>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
@ -0,0 +1,21 @@
|
|||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
<template>
|
||||||
|
<div class='home d-flex justify-center align-center'>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang='ts'>
|
||||||
|
import {Component, Vue} from 'vue-property-decorator'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
components: {}
|
||||||
|
})
|
||||||
|
export default class Demo extends Vue {
|
||||||
|
mounted() {
|
||||||
|
}
|
||||||
|
|
||||||
|
created() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -0,0 +1,118 @@
|
|||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
<template>
|
||||||
|
<v-row class="fill-height" align="center" justify="center" style="background: #ebebeb">
|
||||||
|
<v-col cols="12" sm="8" md="6" lg="4" xl="3">
|
||||||
|
<v-card class="elevation-12 mx-5" style="opacity: 0.8">
|
||||||
|
<v-row justify="center">
|
||||||
|
<v-card class="elevation-1 mt-n7 primary" style="width: 80%">
|
||||||
|
<v-card-actions>
|
||||||
|
<v-row>
|
||||||
|
<v-icon
|
||||||
|
style="position: absolute;left: 10px;top:19px;z-index: 1"
|
||||||
|
@click="$router.back()"
|
||||||
|
size="36"
|
||||||
|
>mdi-arrow-left-circle
|
||||||
|
</v-icon>
|
||||||
|
<v-col cols="12" class="text-center">
|
||||||
|
<h1 class="display-2 ">注册</h1>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</v-card-actions>
|
||||||
|
</v-card>
|
||||||
|
</v-row>
|
||||||
|
<v-card-text class="text-center">
|
||||||
|
<v-form ref="form">
|
||||||
|
<v-text-field
|
||||||
|
type="text"
|
||||||
|
prepend-inner-icon="mdi-account-circle"
|
||||||
|
v-model="form.username"
|
||||||
|
label="账号"
|
||||||
|
:rules="ruleInline.user"
|
||||||
|
:counter="16"
|
||||||
|
>
|
||||||
|
</v-text-field>
|
||||||
|
<v-text-field
|
||||||
|
type="password"
|
||||||
|
v-model="form.passwd"
|
||||||
|
label="密码"
|
||||||
|
prepend-inner-icon="mdi-lock"
|
||||||
|
:rules="ruleInline.password"
|
||||||
|
:counter="16"
|
||||||
|
></v-text-field>
|
||||||
|
<v-text-field
|
||||||
|
type="password"
|
||||||
|
v-model="form.passwdCheck"
|
||||||
|
label="密码"
|
||||||
|
prepend-inner-icon="mdi-lock"
|
||||||
|
:rules="ruleInline.passwordCheck"
|
||||||
|
:counter="16"
|
||||||
|
@keyup.enter="handleSubmit"
|
||||||
|
></v-text-field>
|
||||||
|
</v-form>
|
||||||
|
</v-card-text>
|
||||||
|
<v-card-actions>
|
||||||
|
<v-spacer></v-spacer>
|
||||||
|
<v-btn type="primary" @click="handleSubmit">提交</v-btn>
|
||||||
|
<v-btn @click="handleReset()">重置</v-btn>
|
||||||
|
</v-card-actions>
|
||||||
|
</v-card>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang='ts'>
|
||||||
|
import {Component, Vue} from 'vue-property-decorator'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
components: {}
|
||||||
|
})
|
||||||
|
export default class Register extends Vue {
|
||||||
|
form = {
|
||||||
|
passwd: '',
|
||||||
|
passwdCheck: '',
|
||||||
|
email: '',
|
||||||
|
username: ''
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleInline = {
|
||||||
|
user: [
|
||||||
|
(v: string) => !!v || 'required',
|
||||||
|
(v: string) => (v && v.length >= 3 && v.length <= 16) || '长度要求3~16'
|
||||||
|
],
|
||||||
|
password: [
|
||||||
|
(v: string) => !!v || 'required',
|
||||||
|
(v: string) => (v && v.length >= 6 && v.length <= 16) || '长度要求6~16'
|
||||||
|
],
|
||||||
|
passwordCheck: [
|
||||||
|
(v: string) => !!v || 'required',
|
||||||
|
(v: string) => (v && v === this.form.passwd) || '密码不一致'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
handleSubmit() {
|
||||||
|
if (!this.$refs.form.validate()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$api.user.register(this.form.username, this.form.passwd).Start(
|
||||||
|
(data) => {
|
||||||
|
// this.$message.success('注册成功!')
|
||||||
|
this.$router.push({name: 'login'})
|
||||||
|
},
|
||||||
|
(data) => {
|
||||||
|
if (data && data.code === '31011') {
|
||||||
|
// this.$message.error('用户名重复')
|
||||||
|
} else {
|
||||||
|
// this.$message.error('注册失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
handleReset() {
|
||||||
|
this.form.username = ''
|
||||||
|
this.form.passwd = ''
|
||||||
|
this.form.passwdCheck = ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
Loading…
Reference in New Issue