访客模式基本完成

This commit is contained in:
Sun
2023-12-04 20:47:44 +08:00
parent b067b20c43
commit 8a3ff3477d
11 changed files with 72 additions and 70 deletions

View File

@@ -25,21 +25,31 @@ func PublicModeInterceptor(c *gin.Context) {
if ok && token != "" {
// 直接返回缓存的用户信息
if userInfo, success := global.UserToken.Get(token); success {
global.Logger.Debug("缓存的用户TOKEN:", token)
c.Set("userInfo", userInfo)
return
} else {
global.Logger.Debug("准备查询数据库的用户资料", token)
global.Logger.Debug("数据库查询TOKEN:", token)
mUser := models.User{}
// 去库中查询是否存在该用户
if info, err := mUser.GetUserInfoByToken(token); err == nil && info.Token != "" && info.ID != 0 {
global.Logger.Debug("数据库查询用户:", info.ID)
// 通过 设置当前用户信息
global.UserToken.SetDefault(info.Token, info)
global.CUserToken.SetDefault(cToken, token)
c.Set("userInfo", info)
return
} else {
global.Logger.Debug("数据库查询用户失败", token)
}
}
} else {
global.Logger.Debug("token为空或者不OK")
}
} else {
global.Logger.Debug("cToken不存在")
}
// 获取公开账号的信息
var userId *uint
if err := global.SystemSetting.GetValueByInterface(systemSetting.PANEL_PUBLIC_USER_ID, &userId); err == nil && userId != nil {
@@ -49,10 +59,13 @@ func PublicModeInterceptor(c *gin.Context) {
c.Abort()
return
}
global.Logger.Debug("公开访问模式的用户id", userInfo.ID)
global.Logger.Debug("访客用户TOKEN:", token)
global.Logger.Debug("访客用户ID:", userInfo.ID)
c.Set("userInfo", userInfo)
c.Set(base.GIN_GET_VISIT_MODE, base.VISIT_MODE_PUBLIC)
return
} else {
global.Logger.Debug("访客用户不存在:", userId, " ", token)
apiReturn.ErrorCode(c, 1001, global.Lang.Get("login.err_token_expire"), nil)
c.Abort()
return

View File

@@ -35,6 +35,7 @@ func (a *UserApi) GetAuthInfo(c *gin.Context) {
user.HeadImage = userInfo.HeadImage
user.Name = userInfo.Name
user.Role = userInfo.Role
user.Username = userInfo.Username
apiReturn.SuccessData(c, gin.H{
"user": user,
"visitMode": visitMode,

View File

@@ -15,6 +15,7 @@ func InitUsersRouter(router *gin.RouterGroup) {
rAdmin.POST("panel/users/create", userApi.Create)
rAdmin.POST("panel/users/update", userApi.Update)
rAdmin.POST("panel/users/getList", userApi.GetList)
rAdmin.POST("panel/users/deletes", userApi.Deletes)
rAdmin.POST("panel/users/getPublicVisitUser", userApi.GetPublicVisitUser)
rAdmin.POST("panel/users/setPublicVisitUser", userApi.SetPublicVisitUser)
}

View File

@@ -25,3 +25,16 @@ export function deletes<T>(userIds: number[]) {
data: { userIds },
})
}
export function getPublicVisitUser<T>() {
return post<T>({
url: '/panel/users/getPublicVisitUser',
})
}
export function setPublicVisitUser<T>(userId: number | null) {
return post<T>({
url: '/panel/users/setPublicVisitUser',
data: { userId },
})
}

View File

@@ -81,7 +81,8 @@ export default {
userCountText: '共{count}位用户',
deletePromptContent: '你确定删除{name}({username})',
currentUseUsername: '当前账号',
publicMode: '公开访问',
setOrUnsetPublicMode: '设置/取消公开访问',
pblicText: '公开',
},
deskModule: {
searchBox: {

View File

@@ -1,6 +1,5 @@
export * from './app'
export * from './user'
export * from './settings'
export * from './auth'
export * from './admin'
export * from './notice'

View File

@@ -1,30 +0,0 @@
import { ss } from '@/utils/storage'
const LOCAL_NAME = 'settingsStorage'
export interface SettingsState {
systemMessage: string
temperature: number
top_p: number
}
export function defaultSetting(): SettingsState {
return {
systemMessage: 'You are ChatGPT, a large language model trained by OpenAI. Follow the user\'s instructions carefully. Respond using markdown.',
temperature: 0.8,
top_p: 1,
}
}
export function getLocalState(): SettingsState {
const localSetting: SettingsState | undefined = ss.get(LOCAL_NAME)
return { ...defaultSetting(), ...localSetting }
}
export function setLocalState(setting: SettingsState): void {
ss.set(LOCAL_NAME, setting)
}
export function removeLocalState() {
ss.remove(LOCAL_NAME)
}

View File

@@ -1,22 +0,0 @@
import { defineStore } from 'pinia'
import type { SettingsState } from './helper'
import { defaultSetting, getLocalState, removeLocalState, setLocalState } from './helper'
export const useSettingStore = defineStore('setting-store', {
state: (): SettingsState => getLocalState(),
actions: {
updateSetting(settings: Partial<SettingsState>) {
this.$state = { ...this.$state, ...settings }
this.recordState()
},
resetSetting() {
this.$state = defaultSetting()
removeLocalState()
},
recordState() {
setLocalState(this.$state)
},
},
})

View File

@@ -6,7 +6,7 @@ import About from './tabs/About.vue'
import Users from './tabs/Users.vue'
import UserInfo from './tabs/UserInfo.vue'
import ItemGroupManage from './tabs/ItemGroupManage.vue'
import { useUserStore } from '@/store'
import { useAuthStore } from '@/store'
import { AdminAuthRole } from '@/enums/admin'
import { RoundCardModal } from '@/components/common'
@@ -18,7 +18,7 @@ const emit = defineEmits<{
(e: 'update:visible', visible: boolean): void
}>()
const userStore = useUserStore()
const authStore = useAuthStore()
const show = computed({
get: () => props.visible,
@@ -44,7 +44,7 @@ const show = computed({
<NTabPane name="about" tab="关于">
<About />
</NTabPane>
<NTabPane v-if="userStore.userInfo?.role === AdminAuthRole.admin" name="password" tab="账号管理">
<NTabPane v-if="authStore.userInfo?.role === AdminAuthRole.admin" name="password" tab="账号管理">
<Users />
</NTabPane>
</NTabs>

View File

@@ -40,14 +40,14 @@ function handleLogiut() {
<div class="text-slate-500 mb-[5px]">
账号/邮箱
</div>
{{ userStore.userInfo.username }}
{{ authStore.userInfo?.username }}
</NCard>
<NCard style="border-radius:10px" class="mt-[10px]" size="small">
<div class="text-slate-500 mb-[5px]">
昵称
</div>
{{ userStore.userInfo.name }}
{{ authStore.userInfo?.name }}
</NCard>
<NCard style="border-radius:10px" class="mt-[10px]" size="small">

View File

@@ -3,19 +3,20 @@ import { h, onMounted, reactive, ref } from 'vue'
import { NAlert, NButton, NDataTable, NDropdown, NTag, useDialog, useMessage } from 'naive-ui'
import type { DataTableColumns, PaginationProps } from 'naive-ui'
import EditUser from './EditUser/index.vue'
import { deletes as usersDeletes, getList as usersGetList } from '@/api/panel/users'
import { getPublicVisitUser, setPublicVisitUser, deletes as usersDeletes, getList as usersGetList } from '@/api/panel/users'
import { SvgIcon } from '@/components/common'
import { useUserStore } from '@/store'
import { useAuthStore } from '@/store'
import { t } from '@/locales'
import { AdminAuthRole } from '@/enums/admin'
const message = useMessage()
const userStore = useUserStore()
const authStore = useAuthStore()
const tableIsLoading = ref<boolean>(false)
const editUserDialogShow = ref<boolean>(false)
const keyWord = ref<string>()
const editUserUserInfo = ref<User.Info>()
const dialog = useDialog()
const publicVisitUserId = ref<number | null>(null)
const createColumns = ({
update,
@@ -27,9 +28,13 @@ const createColumns = ({
title: t('adminSettingUsers.username'),
key: 'username',
render(row: User.Info) {
if (row.username === userStore.userInfo.username)
return `${row.username} (${t('adminSettingUsers.currentUseUsername')})`
return row.username
let publicVisitHtml = ''
if (publicVisitUserId.value && publicVisitUserId.value === row.id)
publicVisitHtml = `[${t('adminSettingUsers.pblicText')}]`
if (row.username === authStore.userInfo?.username)
return `${publicVisitHtml}${row.username} (${t('adminSettingUsers.currentUseUsername')})`
return publicVisitHtml + row.username
},
},
{
@@ -42,9 +47,9 @@ const createColumns = ({
render(row) {
switch (row.role) {
case AdminAuthRole.admin:
return h(NTag, t('common.role.admin'))
return h(NTag, { type: 'info' }, t('common.role.admin'))
case AdminAuthRole.regularUser:
return h(NTag, { type: 'info' }, t('common.role.regularUser'))
return h(NTag, t('common.role.regularUser'))
default:
return '-'
}
@@ -79,6 +84,24 @@ const createColumns = ({
case 'update':
update(row)
break
case 'publicMode':
// 取消
if (publicVisitUserId.value && publicVisitUserId.value === row.id) {
setPublicVisitUser(null).then(({ code }) => {
if (code === 0)
publicVisitUserId.value = null
})
}
else {
// 设置
setPublicVisitUser(row.id as number).then(({ code }) => {
if (code === 0)
publicVisitUserId.value = row.id as number
else if (code === 1111)
message.error('用户不存在,请刷新后再试')
})
}
break
case 'delete':
dialog.warning({
title: t('common.warning'),
@@ -101,7 +124,7 @@ const createColumns = ({
key: 'update',
},
{
label: t('adminSettingUsers.publicMode'),
label: t('adminSettingUsers.setOrUnsetPublicMode'),
key: 'publicMode',
},
{
@@ -184,6 +207,9 @@ async function deletes(ids: number[]) {
}
onMounted(() => {
getPublicVisitUser<User.Info>().then(({ data }) => {
publicVisitUserId.value = data.id || null
})
getList(null)
})
</script>