Files
wechat_wc/src/pages/userDatabase/index.tsx
T

191 lines
6.1 KiB
TypeScript

import { View, Text, Input, Button } from '@tarojs/components'
import Taro from '@tarojs/taro'
import { useState, useEffect } from 'react'
import './index.scss'
import {
listAllUsers,
switchUser,
deleteUser,
createUser,
getUserInfo,
verifyAdminPassword
} from '../../utils/store'
import { useThemeContext } from '../../context/ThemeContext'
import { useSafeArea } from '../../hooks/useSafeArea'
import { useStatusBar } from '../../hooks/useStatusBar'
import ThemedPageMeta from '../../components/ThemedPageMeta'
export default function UserDatabasePage() {
const { theme, resolvedTheme } = useThemeContext()
const safe = useSafeArea()
useStatusBar(resolvedTheme)
const [isUnlocked, setIsUnlocked] = useState(false)
const [password, setPassword] = useState('')
const [pwdError, setPwdError] = useState(false)
const [users, setUsers] = useState<any[]>([])
const [showAdd, setShowAdd] = useState(false)
const [newNick, setNewNick] = useState('')
const refresh = () => setUsers(listAllUsers())
useEffect(() => {
refresh()
}, [])
const handleUnlock = () => {
if (verifyAdminPassword(password)) {
setIsUnlocked(true)
setPwdError(false)
refresh()
} else {
setPwdError(true)
}
}
const handleSwitch = (openid: string) => {
if (switchUser(openid)) {
Taro.showToast({ title: '切换成功', icon: 'success' })
refresh()
} else {
Taro.showToast({ title: '切换失败', icon: 'none' })
}
}
const handleDelete = (openid: string) => {
Taro.showModal({
title: '确认删除',
content: '删除后将清空该用户所有数据,无法恢复',
confirmColor: '#e64340',
success: (res) => {
if (res.confirm) {
deleteUser(openid)
refresh()
Taro.showToast({ title: '已删除', icon: 'success' })
}
}
})
}
const handleCreate = () => {
if (!newNick.trim()) {
Taro.showToast({ title: '请输入昵称', icon: 'none' })
return
}
createUser(newNick.trim())
setShowAdd(false)
setNewNick('')
refresh()
Taro.showToast({ title: '创建成功', icon: 'success' })
}
const activeOpenid = getUserInfo()?.openid || ''
if (!isUnlocked) {
return (
<View className={`theme-${resolvedTheme}`}>
<ThemedPageMeta />
<View className='udb-page'>
<View className='udb-lock-card dashed-card mt-20'>
<View className='star-badge' />
<Text className='udb-lock-icon'>🔐</Text>
<Text className='udb-lock-title'>管理员验证</Text>
<Text className='udb-lock-desc'>请输入密码以访问用户数据库</Text>
<Input
className='udb-password-input'
type='text'
password
placeholder='输入密码'
value={password}
onInput={(e: any) => setPassword(e.detail.value)}
/>
{pwdError && (
<Text className='udb-error'>密码错误,请重试</Text>
)}
<View className='btn-gradient udb-btn' onTap={handleUnlock}>
<Text>进入数据库</Text>
</View>
</View>
</View>
</View>
)
}
return (
<View className={`theme-${resolvedTheme}`}>
<ThemedPageMeta />
<View className='udb-page'>
<View className='page-header dashed-card mt-20' style={{ marginTop: `${safe.headerPaddingTop}px` }}>
<View className='star-badge' />
<Text className='page-title'>本地用户数据库</Text>
</View>
<View className='udb-toolbar'>
<View className='btn-gradient udb-add-btn' onTap={() => setShowAdd(true)}>
<Text>+ 新建账号</Text>
</View>
</View>
<View className='udb-table'>
<View className='udb-row udb-header'>
<Text className='udb-col col-nick'>昵称</Text>
<Text className='udb-col col-id'>ID</Text>
<Text className='udb-col col-stats'>设计/订单</Text>
<Text className='udb-col col-action'>操作</Text>
</View>
{users.map((u) => (
<View key={u.openid} className={`udb-row ${u.openid === activeOpenid ? 'active' : ''}`}>
<Text className='udb-col col-nick'>{u.nickName}</Text>
<Text className='udb-col col-id'>{u.openid}</Text>
<Text className='udb-col col-stats'>{u.designCount} / {u.orderCount}</Text>
<View className='udb-col col-action'>
{u.openid !== activeOpenid && (
<View className='udb-link' onTap={() => handleSwitch(u.openid)}>
<Text>切换</Text>
</View>
)}
{u.openid === activeOpenid && (
<Text className='udb-current'>当前</Text>
)}
<View className='udb-link udb-danger' onTap={() => handleDelete(u.openid)}>
<Text>删除</Text>
</View>
</View>
</View>
))}
{users.length === 0 && (
<View className='udb-empty'>
<Text>暂无用户数据</Text>
</View>
)}
</View>
{/* 新建账号弹窗 */}
{showAdd && (
<View className='modal-overlay'>
<View className='udb-add-card dashed-card'>
<View className='star-badge' />
<Text className='udb-add-title'>新建本地账号</Text>
<Input
className='udb-add-input'
type='text'
placeholder='请输入昵称'
value={newNick}
onInput={(e: any) => setNewNick(e.detail.value)}
/>
<View className='udb-add-actions'>
<View className='btn-outline' onTap={() => setShowAdd(false)}>
<Text>取消</Text>
</View>
<View className='btn-gradient' onTap={handleCreate}>
<Text>创建</Text>
</View>
</View>
</View>
</View>
)}
</View>
</View>
)
}