Complete main UI #37
@@ -1,8 +1,8 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import Icon from '@ant-design/icons'
|
import Icon from '@ant-design/icons'
|
||||||
import '@/assets/css/components/common/loading-mask.scss'
|
import '@/assets/css/components/common/loading-mask.scss'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
|
||||||
import { COLOR_FONT_MAIN } from '@/constants/common.constants'
|
import { COLOR_FONT_MAIN } from '@/constants/common.constants'
|
||||||
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
|
|
||||||
const LoadingMask: React.FC = () => {
|
const LoadingMask: React.FC = () => {
|
||||||
const loadingIcon = (
|
const loadingIcon = (
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import Icon from '@ant-design/icons'
|
import Icon from '@ant-design/icons'
|
||||||
import { notification } from 'antd'
|
|
||||||
import { getLoginStatus, getNickname, logout } from '@/utils/auth'
|
|
||||||
import { getRedirectUrl } from '@/utils/common'
|
|
||||||
import { COLOR_ERROR } from '@/constants/common.constants'
|
import { COLOR_ERROR } from '@/constants/common.constants'
|
||||||
|
import { getRedirectUrl } from '@/utils/common'
|
||||||
|
import { getLoginStatus, getNickname, logout } from '@/utils/auth'
|
||||||
|
|
||||||
const SidebarFooter: React.FC = () => {
|
const SidebarFooter: React.FC = () => {
|
||||||
const matches = useMatches()
|
const matches = useMatches()
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import Icon from '@ant-design/icons'
|
import Icon from '@ant-design/icons'
|
||||||
import '@/assets/css/components/common/sidebar.scss'
|
import '@/assets/css/components/common/sidebar.scss'
|
||||||
|
import { getLocalStorage, setLocalStorage } from '@/utils/common'
|
||||||
import SidebarSeparate from '@/components/common/sidebar/SidebarSeparate'
|
import SidebarSeparate from '@/components/common/sidebar/SidebarSeparate'
|
||||||
import SidebarFooter from '@/components/common/sidebar/SidebarFooter'
|
import SidebarFooter from '@/components/common/sidebar/SidebarFooter'
|
||||||
import { getLocalStorage, setLocalStorage } from '@/utils/common'
|
|
||||||
|
|
||||||
interface SidebarProps extends React.PropsWithChildren {
|
interface SidebarProps extends React.PropsWithChildren {
|
||||||
title: string
|
title: string
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import Icon from '@ant-design/icons'
|
|||||||
import '@/assets/css/components/home/footer.scss'
|
import '@/assets/css/components/home/footer.scss'
|
||||||
import FitCenter from '@/components/common/FitCenter'
|
import FitCenter from '@/components/common/FitCenter'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
import { NavLink } from 'react-router-dom'
|
|
||||||
|
|
||||||
const Footer: React.FC = () => {
|
const Footer: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ import ReactDOM from 'react-dom/client'
|
|||||||
import zh_CN from 'antd/locale/zh_CN'
|
import zh_CN from 'antd/locale/zh_CN'
|
||||||
import '@/assets/css/base.scss'
|
import '@/assets/css/base.scss'
|
||||||
import '@/assets/css/common.scss'
|
import '@/assets/css/common.scss'
|
||||||
import App from './App'
|
|
||||||
import { COLOR_MAIN } from '@/constants/common.constants'
|
import { COLOR_MAIN } from '@/constants/common.constants'
|
||||||
|
import App from './App'
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById('root')!).render(
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import Icon from '@ant-design/icons'
|
import Icon from '@ant-design/icons'
|
||||||
import router from '@/router'
|
|
||||||
import '@/assets/css/pages/home-framework.scss'
|
import '@/assets/css/pages/home-framework.scss'
|
||||||
|
import { COLOR_FONT_SECONDARY } from '@/constants/common.constants'
|
||||||
|
import router from '@/router'
|
||||||
import LoadingMask from '@/components/common/LoadingMask'
|
import LoadingMask from '@/components/common/LoadingMask'
|
||||||
import HideScrollbar, { HideScrollbarElement } from '@/components/common/HideScrollbar'
|
import HideScrollbar, { HideScrollbarElement } from '@/components/common/HideScrollbar'
|
||||||
import { COLOR_FONT_SECONDARY } from '@/constants/common.constants'
|
|
||||||
|
|
||||||
export const HomeFrameworkContext = createContext<{
|
export const HomeFrameworkContext = createContext<{
|
||||||
navbarHiddenState: {
|
navbarHiddenState: {
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { notification } from 'antd'
|
|
||||||
import '@/assets/css/pages/login.scss'
|
import '@/assets/css/pages/login.scss'
|
||||||
import { getLocalTime, setToken } from '@/utils/common'
|
|
||||||
import { getUserInfo, login } from '@/utils/auth'
|
|
||||||
import {
|
import {
|
||||||
PERMISSION_LOGIN_SUCCESS,
|
PERMISSION_LOGIN_SUCCESS,
|
||||||
PERMISSION_LOGIN_USERNAME_PASSWORD_ERROR,
|
PERMISSION_LOGIN_USERNAME_PASSWORD_ERROR,
|
||||||
PERMISSION_USER_DISABLE,
|
PERMISSION_USER_DISABLE,
|
||||||
PERMISSION_USERNAME_NOT_FOUND
|
PERMISSION_USERNAME_NOT_FOUND
|
||||||
} from '@/constants/common.constants'
|
} from '@/constants/common.constants'
|
||||||
|
import { utcToLocalTime, setToken } from '@/utils/common'
|
||||||
|
import { getUserInfo, login } from '@/utils/auth'
|
||||||
|
|
||||||
const Login: React.FC = () => {
|
const Login: React.FC = () => {
|
||||||
const [messageApi, contextHolder] = message.useMessage()
|
const [messageApi, contextHolder] = message.useMessage()
|
||||||
@@ -44,7 +43,7 @@ const Login: React.FC = () => {
|
|||||||
<span>
|
<span>
|
||||||
最近登录:
|
最近登录:
|
||||||
{user.lastLoginTime
|
{user.lastLoginTime
|
||||||
? `${getLocalTime(user.lastLoginTime)}【${
|
? `${utcToLocalTime(user.lastLoginTime)}【${
|
||||||
user.lastLoginIp
|
user.lastLoginIp
|
||||||
}】`
|
}】`
|
||||||
: '无'}
|
: '无'}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import system from '@/router/system'
|
|
||||||
import '@/assets/css/pages/system-framework.scss'
|
import '@/assets/css/pages/system-framework.scss'
|
||||||
|
import system from '@/router/system'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
import Sidebar from '@/components/common/sidebar'
|
import Sidebar from '@/components/common/sidebar'
|
||||||
import SidebarItemList from '@/components/common/sidebar/SidebarItemList'
|
import SidebarItemList from '@/components/common/sidebar/SidebarItemList'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { tools } from '@/router/tools'
|
|
||||||
import '@/assets/css/pages/tools-framework.scss'
|
import '@/assets/css/pages/tools-framework.scss'
|
||||||
|
import { tools } from '@/router/tools'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
import SidebarScroll, { SidebarScrollElement } from '@/components/common/sidebar/SidebarScroll'
|
import SidebarScroll, { SidebarScrollElement } from '@/components/common/sidebar/SidebarScroll'
|
||||||
import Sidebar from '@/components/common/sidebar'
|
import Sidebar from '@/components/common/sidebar'
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import user from '@/router/user'
|
|
||||||
import '@/assets/css/pages/tools-framework.scss'
|
import '@/assets/css/pages/tools-framework.scss'
|
||||||
|
import user from '@/router/user'
|
||||||
|
import { hasPathPermission } from '@/utils/auth'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
import Sidebar from '@/components/common/sidebar'
|
import Sidebar from '@/components/common/sidebar'
|
||||||
import SidebarItemList from '@/components/common/sidebar/SidebarItemList'
|
import SidebarItemList from '@/components/common/sidebar/SidebarItemList'
|
||||||
import SidebarItem from '@/components/common/sidebar/SidebarItem'
|
import SidebarItem from '@/components/common/sidebar/SidebarItem'
|
||||||
import { hasPathPermission } from '@/utils/auth'
|
|
||||||
import LoadingMask from '@/components/common/LoadingMask'
|
import LoadingMask from '@/components/common/LoadingMask'
|
||||||
|
|
||||||
const ToolsFramework: React.FC = () => {
|
const ToolsFramework: React.FC = () => {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import '@/assets/css/components/home/home.scss'
|
import '@/assets/css/components/home/home.scss'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
|
||||||
import { HomeFrameworkContext } from '@/pages/HomeFramework'
|
import { HomeFrameworkContext } from '@/pages/HomeFramework'
|
||||||
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
import Slogan from '@/components/home/Slogan'
|
import Slogan from '@/components/home/Slogan'
|
||||||
import OxygenToolbox from '@/components/home/OxygenToolbox'
|
import OxygenToolbox from '@/components/home/OxygenToolbox'
|
||||||
import Indicator from '@/components/common/Indicator'
|
import Indicator from '@/components/common/Indicator'
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
import React, { useEffect, useState } from 'react'
|
import React from 'react'
|
||||||
import Icon from '@ant-design/icons'
|
import Icon from '@ant-design/icons'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
|
||||||
import HideScrollbar from '@/components/common/HideScrollbar'
|
|
||||||
import FlexBox from '@/components/common/FlexBox'
|
|
||||||
import Card from '@/components/common/Card'
|
|
||||||
import {
|
import {
|
||||||
COLOR_ERROR_SECONDARY,
|
COLOR_ERROR_SECONDARY,
|
||||||
COLOR_FONT_SECONDARY,
|
COLOR_FONT_SECONDARY,
|
||||||
@@ -14,7 +10,7 @@ import {
|
|||||||
DATABASE_SELECT_SUCCESS,
|
DATABASE_SELECT_SUCCESS,
|
||||||
DATABASE_UPDATE_SUCCESS
|
DATABASE_UPDATE_SUCCESS
|
||||||
} from '@/constants/common.constants'
|
} from '@/constants/common.constants'
|
||||||
import { getLocalTime } from '@/utils/common'
|
import { utcToLocalTime } from '@/utils/common'
|
||||||
import {
|
import {
|
||||||
r_sys_group_add,
|
r_sys_group_add,
|
||||||
r_sys_group_change_status,
|
r_sys_group_change_status,
|
||||||
@@ -24,6 +20,10 @@ import {
|
|||||||
r_sys_group_update,
|
r_sys_group_update,
|
||||||
r_sys_role_get_list
|
r_sys_role_get_list
|
||||||
} from '@/services/system'
|
} from '@/services/system'
|
||||||
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
|
import HideScrollbar from '@/components/common/HideScrollbar'
|
||||||
|
import FlexBox from '@/components/common/FlexBox'
|
||||||
|
import Card from '@/components/common/Card'
|
||||||
|
|
||||||
const Group: React.FC = () => {
|
const Group: React.FC = () => {
|
||||||
const [modal, contextHolder] = AntdModal.useModal()
|
const [modal, contextHolder] = AntdModal.useModal()
|
||||||
@@ -75,14 +75,14 @@ const Group: React.FC = () => {
|
|||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
width: '10%',
|
width: '10%',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
render: (value: string) => getLocalTime(value)
|
render: (value: string) => utcToLocalTime(value)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '修改时间',
|
title: '修改时间',
|
||||||
dataIndex: 'updateTime',
|
dataIndex: 'updateTime',
|
||||||
width: '10%',
|
width: '10%',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
render: (value: string) => getLocalTime(value)
|
render: (value: string) => utcToLocalTime(value)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '状态',
|
title: '状态',
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
import dayjs from 'dayjs'
|
||||||
import Card from '@/components/common/Card'
|
|
||||||
import { r_sys_log_get } from '@/services/system'
|
|
||||||
import {
|
import {
|
||||||
COLOR_ERROR_SECONDARY,
|
COLOR_ERROR_SECONDARY,
|
||||||
COLOR_FONT_SECONDARY,
|
COLOR_FONT_SECONDARY,
|
||||||
DATABASE_SELECT_SUCCESS
|
DATABASE_SELECT_SUCCESS
|
||||||
} from '@/constants/common.constants'
|
} from '@/constants/common.constants'
|
||||||
|
import { dayjsToUtc, utcToLocalTime } from '@/utils/common'
|
||||||
|
import { r_sys_log_get } from '@/services/system'
|
||||||
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
|
import Card from '@/components/common/Card'
|
||||||
import HideScrollbar from '@/components/common/HideScrollbar'
|
import HideScrollbar from '@/components/common/HideScrollbar'
|
||||||
import { getLocalTime } from '@/utils/common'
|
|
||||||
import FlexBox from '@/components/common/FlexBox'
|
import FlexBox from '@/components/common/FlexBox'
|
||||||
|
|
||||||
const Log: React.FC = () => {
|
const Log: React.FC = () => {
|
||||||
@@ -87,7 +88,7 @@ const Log: React.FC = () => {
|
|||||||
{
|
{
|
||||||
title: '开始时间',
|
title: '开始时间',
|
||||||
dataIndex: 'startTime',
|
dataIndex: 'startTime',
|
||||||
render: (value: string) => getLocalTime(value),
|
render: (value: string) => utcToLocalTime(value),
|
||||||
align: 'center',
|
align: 'center',
|
||||||
sorter: true
|
sorter: true
|
||||||
},
|
},
|
||||||
@@ -96,7 +97,9 @@ const Log: React.FC = () => {
|
|||||||
dataIndex: 'executeTime',
|
dataIndex: 'executeTime',
|
||||||
render: (value, record) => (
|
render: (value, record) => (
|
||||||
<AntdTooltip
|
<AntdTooltip
|
||||||
title={`${getLocalTime(record.startTime)} ~ ${getLocalTime(record.endTime)}`}
|
title={`${utcToLocalTime(record.startTime)} ~ ${utcToLocalTime(
|
||||||
|
record.endTime
|
||||||
|
)}`}
|
||||||
>
|
>
|
||||||
{`${value}ms`}
|
{`${value}ms`}
|
||||||
</AntdTooltip>
|
</AntdTooltip>
|
||||||
@@ -188,12 +191,9 @@ const Log: React.FC = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleOnDateRangeChange = (_dates: unknown, dateStrings: [string, string]) => {
|
const handleOnDateRangeChange = (dates: [dayjs.Dayjs | null, dayjs.Dayjs | null] | null) => {
|
||||||
if (dateStrings[0] && dateStrings[1]) {
|
if (dates && dates[0] && dates[1]) {
|
||||||
setTimeRange([
|
setTimeRange([dayjsToUtc(dates[0]), dayjsToUtc(dates[1])])
|
||||||
new Date(dateStrings[0]).toISOString(),
|
|
||||||
new Date(dateStrings[1]).toISOString()
|
|
||||||
])
|
|
||||||
} else {
|
} else {
|
||||||
setTimeRange(undefined)
|
setTimeRange(undefined)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,5 @@
|
|||||||
import React, { useEffect, useState } from 'react'
|
import React from 'react'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen'
|
import Icon from '@ant-design/icons'
|
||||||
import HideScrollbar from '@/components/common/HideScrollbar'
|
|
||||||
import FlexBox from '@/components/common/FlexBox'
|
|
||||||
import Card from '@/components/common/Card'
|
|
||||||
import {
|
|
||||||
r_sys_role_add,
|
|
||||||
r_sys_role_change_status,
|
|
||||||
r_sys_power_get_list,
|
|
||||||
r_sys_role_get,
|
|
||||||
r_sys_role_update,
|
|
||||||
r_sys_role_delete,
|
|
||||||
r_sys_role_delete_list
|
|
||||||
} from '@/services/system'
|
|
||||||
import {
|
import {
|
||||||
COLOR_ERROR_SECONDARY,
|
COLOR_ERROR_SECONDARY,
|
||||||
COLOR_FONT_SECONDARY,
|
COLOR_FONT_SECONDARY,
|
||||||
@@ -22,8 +10,20 @@ import {
|
|||||||
DATABASE_SELECT_SUCCESS,
|
DATABASE_SELECT_SUCCESS,
|
||||||
DATABASE_UPDATE_SUCCESS
|
DATABASE_UPDATE_SUCCESS
|
||||||
} from '@/constants/common.constants'
|
} from '@/constants/common.constants'
|
||||||
import Icon from '@ant-design/icons'
|
import { utcToLocalTime, powerListToPowerTree } from '@/utils/common'
|
||||||
import { getLocalTime, powerListToPowerTree } from '@/utils/common'
|
import {
|
||||||
|
r_sys_role_add,
|
||||||
|
r_sys_role_change_status,
|
||||||
|
r_sys_power_get_list,
|
||||||
|
r_sys_role_get,
|
||||||
|
r_sys_role_update,
|
||||||
|
r_sys_role_delete,
|
||||||
|
r_sys_role_delete_list
|
||||||
|
} from '@/services/system'
|
||||||
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
|
import HideScrollbar from '@/components/common/HideScrollbar'
|
||||||
|
import FlexBox from '@/components/common/FlexBox'
|
||||||
|
import Card from '@/components/common/Card'
|
||||||
|
|
||||||
const Role: React.FC = () => {
|
const Role: React.FC = () => {
|
||||||
const [modal, contextHolder] = AntdModal.useModal()
|
const [modal, contextHolder] = AntdModal.useModal()
|
||||||
@@ -67,14 +67,14 @@ const Role: React.FC = () => {
|
|||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
width: '10%',
|
width: '10%',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
render: (value: string) => getLocalTime(value)
|
render: (value: string) => utcToLocalTime(value)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '修改时间',
|
title: '修改时间',
|
||||||
dataIndex: 'updateTime',
|
dataIndex: 'updateTime',
|
||||||
width: '10%',
|
width: '10%',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
render: (value: string) => getLocalTime(value)
|
render: (value: string) => utcToLocalTime(value)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '状态',
|
title: '状态',
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import React, { useEffect, useState } from 'react'
|
import React from 'react'
|
||||||
|
import Icon from '@ant-design/icons'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
import {
|
import {
|
||||||
COLOR_BACKGROUND,
|
COLOR_BACKGROUND,
|
||||||
COLOR_ERROR_SECONDARY,
|
COLOR_ERROR_SECONDARY,
|
||||||
@@ -10,12 +12,7 @@ import {
|
|||||||
DATABASE_SELECT_SUCCESS,
|
DATABASE_SELECT_SUCCESS,
|
||||||
DATABASE_UPDATE_SUCCESS
|
DATABASE_UPDATE_SUCCESS
|
||||||
} from '@/constants/common.constants'
|
} from '@/constants/common.constants'
|
||||||
import { ColumnsType } from 'antd/es/table/interface'
|
import { utcToLocalTime, isPastTime, localTimeToUtc, dayjsToUtc } from '@/utils/common'
|
||||||
import FitFullScreen from '@/components/common/FitFullScreen.tsx'
|
|
||||||
import HideScrollbar from '@/components/common/HideScrollbar.tsx'
|
|
||||||
import FlexBox from '@/components/common/FlexBox.tsx'
|
|
||||||
import Card from '@/components/common/Card.tsx'
|
|
||||||
import Icon from '@ant-design/icons'
|
|
||||||
import {
|
import {
|
||||||
r_sys_group_get_list,
|
r_sys_group_get_list,
|
||||||
r_sys_role_get_list,
|
r_sys_role_get_list,
|
||||||
@@ -24,10 +21,12 @@ import {
|
|||||||
r_sys_user_delete_list,
|
r_sys_user_delete_list,
|
||||||
r_sys_user_get,
|
r_sys_user_get,
|
||||||
r_sys_user_update
|
r_sys_user_update
|
||||||
} from '@/services/system.tsx'
|
} from '@/services/system'
|
||||||
import { getLocalTime, isPastTime } from '@/utils/common.tsx'
|
import { r_api_avatar_random_base64 } from '@/services/api/avatar'
|
||||||
import { r_api_avatar_random_base64 } from '@/services/api/avatar.ts'
|
import FitFullScreen from '@/components/common/FitFullScreen'
|
||||||
import moment from 'moment'
|
import HideScrollbar from '@/components/common/HideScrollbar'
|
||||||
|
import FlexBox from '@/components/common/FlexBox'
|
||||||
|
import Card from '@/components/common/Card'
|
||||||
|
|
||||||
const User: React.FC = () => {
|
const User: React.FC = () => {
|
||||||
const [modal, contextHolder] = AntdModal.useModal()
|
const [modal, contextHolder] = AntdModal.useModal()
|
||||||
@@ -57,7 +56,7 @@ const User: React.FC = () => {
|
|||||||
const [tableSelectedItem, setTableSelectedItem] = useState<React.Key[]>([])
|
const [tableSelectedItem, setTableSelectedItem] = useState<React.Key[]>([])
|
||||||
const [avatar, setAvatar] = useState('')
|
const [avatar, setAvatar] = useState('')
|
||||||
|
|
||||||
const dataColumns: ColumnsType<UserWithRoleInfoVo> = [
|
const dataColumns: _ColumnsType<UserWithRoleInfoVo> = [
|
||||||
{
|
{
|
||||||
dataIndex: 'username',
|
dataIndex: 'username',
|
||||||
title: '用户',
|
title: '用户',
|
||||||
@@ -122,7 +121,7 @@ const User: React.FC = () => {
|
|||||||
title: '最近登录',
|
title: '最近登录',
|
||||||
render: (_, record) =>
|
render: (_, record) =>
|
||||||
record.currentLoginTime
|
record.currentLoginTime
|
||||||
? `${getLocalTime(record.currentLoginTime)}【${record.currentLoginIp}】`
|
? `${utcToLocalTime(record.currentLoginTime)}【${record.currentLoginIp}】`
|
||||||
: '无',
|
: '无',
|
||||||
align: 'center'
|
align: 'center'
|
||||||
},
|
},
|
||||||
@@ -334,10 +333,10 @@ const User: React.FC = () => {
|
|||||||
void r_sys_user_update({
|
void r_sys_user_update({
|
||||||
...formValues,
|
...formValues,
|
||||||
expiration: formValues.expiration
|
expiration: formValues.expiration
|
||||||
? new Date(formValues.expiration).toISOString()
|
? localTimeToUtc(formValues.expiration)
|
||||||
: undefined,
|
: undefined,
|
||||||
credentialsExpiration: formValues.credentialsExpiration
|
credentialsExpiration: formValues.credentialsExpiration
|
||||||
? new Date(formValues.credentialsExpiration).toISOString()
|
? localTimeToUtc(formValues.credentialsExpiration)
|
||||||
: undefined
|
: undefined
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
@@ -362,10 +361,10 @@ const User: React.FC = () => {
|
|||||||
void r_sys_user_add({
|
void r_sys_user_add({
|
||||||
...formValues,
|
...formValues,
|
||||||
expiration: formValues.expiration
|
expiration: formValues.expiration
|
||||||
? new Date(formValues.expiration).toISOString()
|
? localTimeToUtc(formValues.expiration)
|
||||||
: undefined,
|
: undefined,
|
||||||
credentialsExpiration: formValues.credentialsExpiration
|
credentialsExpiration: formValues.credentialsExpiration
|
||||||
? new Date(formValues.credentialsExpiration).toISOString()
|
? localTimeToUtc(formValues.credentialsExpiration)
|
||||||
: undefined
|
: undefined
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
@@ -649,9 +648,9 @@ const User: React.FC = () => {
|
|||||||
<AntdForm.Item
|
<AntdForm.Item
|
||||||
name={'expiration'}
|
name={'expiration'}
|
||||||
label={'过期时间'}
|
label={'过期时间'}
|
||||||
getValueProps={(date: string) => (date ? { value: moment.utc(date) } : {})}
|
getValueProps={(date: string) => (date ? { value: dayjs(date) } : {})}
|
||||||
getValueFromEvent={(_, dateString: string) =>
|
getValueFromEvent={(date: dayjs.Dayjs | null) =>
|
||||||
dateString ? moment(dateString).format('yyyy-MM-DD HH:mm:ss') : undefined
|
date ? dayjsToUtc(date) : undefined
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<AntdDatePicker showTime allowClear changeOnBlur style={{ width: '100%' }} />
|
<AntdDatePicker showTime allowClear changeOnBlur style={{ width: '100%' }} />
|
||||||
@@ -659,9 +658,9 @@ const User: React.FC = () => {
|
|||||||
<AntdForm.Item
|
<AntdForm.Item
|
||||||
name={'credentialsExpiration'}
|
name={'credentialsExpiration'}
|
||||||
label={'认证过期时间'}
|
label={'认证过期时间'}
|
||||||
getValueProps={(date: string) => (date ? { value: moment.utc(date) } : {})}
|
getValueProps={(date: string) => (date ? { value: dayjs(date) } : {})}
|
||||||
getValueFromEvent={(_, dateString: string) =>
|
getValueFromEvent={(date: dayjs.Dayjs | null) =>
|
||||||
dateString ? moment(dateString).format('yyyy-MM-DD HH:mm:ss') : undefined
|
date ? dayjsToUtc(date) : undefined
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<AntdDatePicker showTime allowClear changeOnBlur style={{ width: '100%' }} />
|
<AntdDatePicker showTime allowClear changeOnBlur style={{ width: '100%' }} />
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import tools from '@/router/tools'
|
import system from '@/router/system'
|
||||||
import home from '@/router/home'
|
import home from '@/router/home'
|
||||||
import user from '@/router/user'
|
import user from '@/router/user'
|
||||||
import system from '@/router/system'
|
import tools from '@/router/tools'
|
||||||
|
|
||||||
const mapJsonToRoute = (jsonObject: RouteJsonObject[]): RouteObject[] => {
|
const mapJsonToRoute = (jsonObject: RouteJsonObject[]): RouteObject[] => {
|
||||||
return jsonObject.map((value) => ({
|
return jsonObject.map((value) => ({
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import request from '@/services'
|
|
||||||
import { URL_API_V1_AVATAR_RANDOM_BASE64 } from '@/constants/urls.constants'
|
import { URL_API_V1_AVATAR_RANDOM_BASE64 } from '@/constants/urls.constants'
|
||||||
|
import request from '@/services'
|
||||||
|
|
||||||
export const r_api_avatar_random_base64 = () =>
|
export const r_api_avatar_random_base64 = () =>
|
||||||
request.get<AvatarBase64Vo>(URL_API_V1_AVATAR_RANDOM_BASE64)
|
request.get<AvatarBase64Vo>(URL_API_V1_AVATAR_RANDOM_BASE64)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import request from '@/services'
|
|
||||||
import { URL_LOGIN, URL_LOGOUT } from '@/constants/urls.constants'
|
import { URL_LOGIN, URL_LOGOUT } from '@/constants/urls.constants'
|
||||||
|
import request from '@/services'
|
||||||
|
|
||||||
export const r_auth_login = (username: string, password: string) =>
|
export const r_auth_login = (username: string, password: string) =>
|
||||||
request.post<TokenVo>(URL_LOGIN, {
|
request.post<TokenVo>(URL_LOGIN, {
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import axios, { type AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
|
import axios, { type AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
|
||||||
import { jwtDecode, JwtPayload } from 'jwt-decode'
|
import { jwtDecode, JwtPayload } from 'jwt-decode'
|
||||||
import { message } from 'antd'
|
|
||||||
import { getToken, removeToken, setToken } from '@/utils/common'
|
|
||||||
import {
|
import {
|
||||||
PERMISSION_ACCESS_DENIED,
|
PERMISSION_ACCESS_DENIED,
|
||||||
PERMISSION_TOKEN_HAS_EXPIRED,
|
PERMISSION_TOKEN_HAS_EXPIRED,
|
||||||
@@ -9,6 +7,7 @@ import {
|
|||||||
PERMISSION_TOKEN_RENEW_SUCCESS,
|
PERMISSION_TOKEN_RENEW_SUCCESS,
|
||||||
PERMISSION_UNAUTHORIZED
|
PERMISSION_UNAUTHORIZED
|
||||||
} from '@/constants/common.constants'
|
} from '@/constants/common.constants'
|
||||||
|
import { getToken, removeToken, setToken } from '@/utils/common'
|
||||||
|
|
||||||
const service: AxiosInstance = axios.create({
|
const service: AxiosInstance = axios.create({
|
||||||
baseURL: import.meta.env.VITE_API_URL,
|
baseURL: import.meta.env.VITE_API_URL,
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import request from '@/services/index'
|
|
||||||
import {
|
import {
|
||||||
URL_SYS_USER_INFO,
|
URL_SYS_USER_INFO,
|
||||||
URL_SYS_USER,
|
URL_SYS_USER,
|
||||||
@@ -10,6 +9,7 @@ import {
|
|||||||
URL_SYS_GROUP_LIST,
|
URL_SYS_GROUP_LIST,
|
||||||
URL_SYS_LOG
|
URL_SYS_LOG
|
||||||
} from '@/constants/urls.constants'
|
} from '@/constants/urls.constants'
|
||||||
|
import request from '@/services/index'
|
||||||
|
|
||||||
export const r_sys_user_info = () => request.get<UserWithPowerInfoVo>(URL_SYS_USER_INFO)
|
export const r_sys_user_info = () => request.get<UserWithPowerInfoVo>(URL_SYS_USER_INFO)
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { getCaptcha, getLocalStorage, removeToken, setLocalStorage } from './common'
|
|
||||||
import { r_auth_login, r_auth_logout } from '@/services/auth'
|
|
||||||
import { r_sys_user_info } from '@/services/system'
|
|
||||||
import {
|
import {
|
||||||
STORAGE_TOKEN_KEY,
|
STORAGE_TOKEN_KEY,
|
||||||
STORAGE_USER_INFO_KEY,
|
STORAGE_USER_INFO_KEY,
|
||||||
DATABASE_SELECT_SUCCESS
|
DATABASE_SELECT_SUCCESS
|
||||||
} from '@/constants/common.constants'
|
} from '@/constants/common.constants'
|
||||||
|
import { getCaptcha, getLocalStorage, removeToken, setLocalStorage } from './common'
|
||||||
|
import { r_sys_user_info } from '@/services/system'
|
||||||
|
import { r_auth_login, r_auth_logout } from '@/services/auth'
|
||||||
|
|
||||||
let captcha: Captcha
|
let captcha: Captcha
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import moment from 'moment'
|
|
||||||
import ReactDOM from 'react-dom/client'
|
import ReactDOM from 'react-dom/client'
|
||||||
|
import moment from 'moment'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
import { STORAGE_TOKEN_KEY, STORAGE_USER_INFO_KEY } from '@/constants/common.constants'
|
import { STORAGE_TOKEN_KEY, STORAGE_USER_INFO_KEY } from '@/constants/common.constants'
|
||||||
import LoadingMask from '@/components/common/LoadingMask'
|
import LoadingMask from '@/components/common/LoadingMask'
|
||||||
@@ -144,10 +145,22 @@ export const getRedirectUrl = (path: string, redirectUrl: string): string => {
|
|||||||
return `${path}?redirect=${encodeURIComponent(redirectUrl)}`
|
return `${path}?redirect=${encodeURIComponent(redirectUrl)}`
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getLocalTime = (utcTime: string, format: string = 'yyyy-MM-DD HH:mm:ssZ') => {
|
export const utcToLocalTime = (utcTime: string, format: string = 'yyyy-MM-DD HH:mm:ssZ') => {
|
||||||
return moment.utc(utcTime).local().format(format)
|
return moment.utc(utcTime).local().format(format)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const dayjsToLocalTime = (date: dayjs.Dayjs, format: string = 'YYYY-MM-DD HH:mm:ssZ') => {
|
||||||
|
return date.format(format)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const dayjsToUtc = (date: dayjs.Dayjs) => {
|
||||||
|
return date.toISOString()
|
||||||
|
}
|
||||||
|
|
||||||
|
export const localTimeToUtc = (localTime: string) => {
|
||||||
|
return moment(localTime).toISOString()
|
||||||
|
}
|
||||||
|
|
||||||
export const isPastTime = (utcTime: string) => {
|
export const isPastTime = (utcTime: string) => {
|
||||||
return moment.utc(utcTime).isBefore(moment.now())
|
return moment.utc(utcTime).isBefore(moment.now())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export default defineConfig({
|
|||||||
react: ['Suspense', 'createContext'],
|
react: ['Suspense', 'createContext'],
|
||||||
'react-router': ['useMatches', 'RouterProvider'],
|
'react-router': ['useMatches', 'RouterProvider'],
|
||||||
'react-router-dom': ['createBrowserRouter'],
|
'react-router-dom': ['createBrowserRouter'],
|
||||||
antd: ['message']
|
antd: ['message', 'notification']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
from: 'react-router',
|
from: 'react-router',
|
||||||
|
|||||||
Reference in New Issue
Block a user