xinwei #7
@ -24,7 +24,7 @@ VITE_DROP_CONSOLE=false
|
|||||||
VITE_SOURCEMAP=false
|
VITE_SOURCEMAP=false
|
||||||
|
|
||||||
# 打包路径
|
# 打包路径
|
||||||
VITE_BASE_PATH=/
|
VITE_BASE_PATH=/admin
|
||||||
|
|
||||||
# 商城H5会员端域名
|
# 商城H5会员端域名
|
||||||
VITE_MALL_H5_DOMAIN='http://localhost:3000'
|
VITE_MALL_H5_DOMAIN='http://localhost:3000'
|
||||||
|
@ -4,12 +4,12 @@ NODE_ENV=production
|
|||||||
VITE_DEV=false
|
VITE_DEV=false
|
||||||
|
|
||||||
# 请求路径
|
# 请求路径
|
||||||
VITE_BASE_URL='http://localhost:48080'
|
VITE_BASE_URL='https://mt.ptzykjgs.com'
|
||||||
|
|
||||||
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
|
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
|
||||||
VITE_UPLOAD_TYPE=server
|
VITE_UPLOAD_TYPE=server
|
||||||
# 上传路径
|
# 上传路径
|
||||||
VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
|
VITE_UPLOAD_URL='https://mt.ptzykjgs.com/admin-api/infra/file/upload'
|
||||||
|
|
||||||
# 接口地址
|
# 接口地址
|
||||||
VITE_API_URL=/admin-api
|
VITE_API_URL=/admin-api
|
||||||
@ -24,10 +24,13 @@ VITE_DROP_CONSOLE=true
|
|||||||
VITE_SOURCEMAP=false
|
VITE_SOURCEMAP=false
|
||||||
|
|
||||||
# 打包路径
|
# 打包路径
|
||||||
VITE_BASE_PATH=/
|
VITE_BASE_PATH=/admin
|
||||||
|
|
||||||
# 输出路径
|
# 输出路径
|
||||||
VITE_OUT_DIR=dist-prod
|
VITE_OUT_DIR=dist-prod
|
||||||
|
|
||||||
# 商城H5会员端域名
|
# 商城H5会员端域名
|
||||||
VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn'
|
VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn'
|
||||||
|
|
||||||
|
# 验证码的开关
|
||||||
|
VITE_APP_CAPTCHA_ENABLE=false
|
||||||
|
@ -72,7 +72,7 @@ export const socialAuthRedirect = (type: number, redirectUri: string) => {
|
|||||||
}
|
}
|
||||||
// 获取验证图片以及 token
|
// 获取验证图片以及 token
|
||||||
export const getCode = (data) => {
|
export const getCode = (data) => {
|
||||||
return request.postOriginal({ url: 'system/captcha/get', data })
|
// return request.postOriginal({ url: 'system/captcha/get', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 滑动或者点选验证
|
// 滑动或者点选验证
|
||||||
|
@ -5,7 +5,7 @@ import remainingRouter from './modules/remaining'
|
|||||||
|
|
||||||
// 创建路由实例
|
// 创建路由实例
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(), // createWebHashHistory URL带#,createWebHistory URL不带#
|
history: createWebHistory("/admin"), // createWebHashHistory URL带#,createWebHistory URL不带#
|
||||||
strict: true,
|
strict: true,
|
||||||
routes: remainingRouter as RouteRecordRaw[],
|
routes: remainingRouter as RouteRecordRaw[],
|
||||||
scrollBehavior: () => ({ left: 0, top: 0 })
|
scrollBehavior: () => ({ left: 0, top: 0 })
|
||||||
|
@ -22,32 +22,17 @@
|
|||||||
<div class="h-70px flex items-center justify-end lt-sm:mt-10px">
|
<div class="h-70px flex items-center justify-end lt-sm:mt-10px">
|
||||||
<div class="px-8px text-right">
|
<div class="px-8px text-right">
|
||||||
<div class="mb-16px text-14px text-gray-400">{{ t('workplace.project') }}</div>
|
<div class="mb-16px text-14px text-gray-400">{{ t('workplace.project') }}</div>
|
||||||
<CountTo
|
<CountTo class="text-20px" :start-val="0" :end-val="totalSate.project" :duration="2600" />
|
||||||
class="text-20px"
|
|
||||||
:start-val="0"
|
|
||||||
:end-val="totalSate.project"
|
|
||||||
:duration="2600"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<el-divider direction="vertical" />
|
<el-divider direction="vertical" />
|
||||||
<div class="px-8px text-right">
|
<div class="px-8px text-right">
|
||||||
<div class="mb-16px text-14px text-gray-400">{{ t('workplace.toDo') }}</div>
|
<div class="mb-16px text-14px text-gray-400">{{ t('workplace.toDo') }}</div>
|
||||||
<CountTo
|
<CountTo class="text-20px" :start-val="0" :end-val="totalSate.todo" :duration="2600" />
|
||||||
class="text-20px"
|
|
||||||
:start-val="0"
|
|
||||||
:end-val="totalSate.todo"
|
|
||||||
:duration="2600"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<el-divider direction="vertical" border-style="dashed" />
|
<el-divider direction="vertical" border-style="dashed" />
|
||||||
<div class="px-8px text-right">
|
<div class="px-8px text-right">
|
||||||
<div class="mb-16px text-14px text-gray-400">{{ t('workplace.access') }}</div>
|
<div class="mb-16px text-14px text-gray-400">{{ t('workplace.access') }}</div>
|
||||||
<CountTo
|
<CountTo class="text-20px" :start-val="0" :end-val="totalSate.access" :duration="2600" />
|
||||||
class="text-20px"
|
|
||||||
:start-val="0"
|
|
||||||
:end-val="totalSate.access"
|
|
||||||
:duration="2600"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
@ -55,9 +40,20 @@
|
|||||||
</el-skeleton>
|
</el-skeleton>
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-wrap gap-4" style="margin: 20px 0;">
|
<div class="flex flex-wrap gap-4" style="margin: 10px 0;">
|
||||||
<el-card style="width: 420px;text-align: center;cursor: pointer;" shadow="hover" @click="goToXXLJob">任务调度中心</el-card>
|
<el-card style="width: 420px;text-align: center;cursor: pointer;" shadow="hover" @click="goToXXLJob">任务调度中心</el-card>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 新增的静态图片部分 -->
|
||||||
|
<div>
|
||||||
|
<el-card style="width: 100%; text-align: center;" shadow="never">
|
||||||
|
<div style="overflow: hidden; height: calc(100% - 2px);">
|
||||||
|
<el-image :src="luduViewImage" fit="contain" style="width: 100%; transform: translateY(-2px);" />
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- <el-row class="mt-8px" :gutter="8" justify="space-between">
|
<!-- <el-row class="mt-8px" :gutter="8" justify="space-between">
|
||||||
<el-col :xl="16" :lg="16" :md="24" :sm="24" :xs="24" class="mb-8px">
|
<el-col :xl="16" :lg="16" :md="24" :sm="24" :xs="24" class="mb-8px">
|
||||||
<el-card shadow="never">
|
<el-card shadow="never">
|
||||||
@ -74,17 +70,9 @@
|
|||||||
</el-link>
|
</el-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<el-skeleton :loading="loading" animated>
|
<el-skeleton :loading="loading" animated>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col
|
<el-col v-for="(item, index) in projects" :key="`card-${index}`" :xl="8" :lg="8" :md="8" :sm="24" :xs="24">
|
||||||
v-for="(item, index) in projects"
|
|
||||||
:key="`card-${index}`"
|
|
||||||
:xl="8"
|
|
||||||
:lg="8"
|
|
||||||
:md="8"
|
|
||||||
:sm="24"
|
|
||||||
:xs="24"
|
|
||||||
>
|
|
||||||
<el-card shadow="hover" class="mr-5px mt-5px">
|
<el-card shadow="hover" class="mr-5px mt-5px">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<Icon :icon="item.icon" :size="25" class="mr-8px" />
|
<Icon :icon="item.icon" :size="25" class="mr-8px" />
|
||||||
@ -98,10 +86,10 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-skeleton>
|
</el-skeleton>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-card shadow="never" class="mt-8px">
|
<el-card shadow="never" class="mt-8px">
|
||||||
<el-skeleton :loading="loading" animated>
|
<el-skeleton :loading="loading" animated>
|
||||||
<el-row :gutter="20" justify="space-between">
|
<el-row :gutter="20" justify="space-between">
|
||||||
<el-col :xl="10" :lg="10" :md="24" :sm="24" :xs="24">
|
<el-col :xl="10" :lg="10" :md="24" :sm="24" :xs="24">
|
||||||
@ -120,9 +108,9 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-skeleton>
|
</el-skeleton>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
|
<el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
|
||||||
<el-card shadow="never">
|
<el-card shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="h-3 flex justify-between">
|
<div class="h-3 flex justify-between">
|
||||||
@ -170,47 +158,48 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-skeleton>
|
</el-skeleton>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row> -->
|
</el-row> -->
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { set } from 'lodash-es'
|
import { set } from 'lodash-es'
|
||||||
import { EChartsOption } from 'echarts'
|
import { EChartsOption } from 'echarts'
|
||||||
import { formatTime } from '@/utils'
|
import { formatTime } from '@/utils'
|
||||||
|
import luduView from '@/assets/imgs/ludu_view.png'
|
||||||
|
import { useUserStore } from '@/store/modules/user'
|
||||||
|
import { useWatermark } from '@/hooks/web/useWatermark'
|
||||||
|
import type { WorkplaceTotal, Project, Notice, Shortcut } from './types'
|
||||||
|
import { pieOptions, barOptions } from './echarts-data'
|
||||||
|
|
||||||
import { useUserStore } from '@/store/modules/user'
|
defineOptions({ name: 'Home' })
|
||||||
import { useWatermark } from '@/hooks/web/useWatermark'
|
|
||||||
import type { WorkplaceTotal, Project, Notice, Shortcut } from './types'
|
|
||||||
import { pieOptions, barOptions } from './echarts-data'
|
|
||||||
|
|
||||||
defineOptions({ name: 'Home' })
|
const luduViewImage = ref(luduView);
|
||||||
|
const { t } = useI18n()
|
||||||
const { t } = useI18n()
|
const userStore = useUserStore()
|
||||||
const userStore = useUserStore()
|
const { setWatermark } = useWatermark()
|
||||||
const { setWatermark } = useWatermark()
|
const loading = ref(true)
|
||||||
const loading = ref(true)
|
const avatar = userStore.getUser.avatar
|
||||||
const avatar = userStore.getUser.avatar
|
const username = userStore.getUser.nickname
|
||||||
const username = userStore.getUser.nickname
|
const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
|
||||||
const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
|
// 获取统计数
|
||||||
// 获取统计数
|
let totalSate = reactive<WorkplaceTotal>({
|
||||||
let totalSate = reactive<WorkplaceTotal>({
|
|
||||||
project: 0,
|
project: 0,
|
||||||
access: 0,
|
access: 0,
|
||||||
todo: 0
|
todo: 0
|
||||||
})
|
})
|
||||||
|
|
||||||
const getCount = async () => {
|
const getCount = async () => {
|
||||||
const data = {
|
const data = {
|
||||||
project: 40,
|
project: 40,
|
||||||
access: 2340,
|
access: 2340,
|
||||||
todo: 10
|
todo: 10
|
||||||
}
|
}
|
||||||
totalSate = Object.assign(totalSate, data)
|
totalSate = Object.assign(totalSate, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取项目数
|
// 获取项目数
|
||||||
let projects = reactive<Project[]>([])
|
let projects = reactive<Project[]>([])
|
||||||
const getProject = async () => {
|
const getProject = async () => {
|
||||||
const data = [
|
const data = [
|
||||||
{
|
{
|
||||||
name: 'ruoyi-vue-pro',
|
name: 'ruoyi-vue-pro',
|
||||||
@ -256,11 +245,11 @@ const getProject = async () => {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
projects = Object.assign(projects, data)
|
projects = Object.assign(projects, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取通知公告
|
// 获取通知公告
|
||||||
let notice = reactive<Notice[]>([])
|
let notice = reactive<Notice[]>([])
|
||||||
const getNotice = async () => {
|
const getNotice = async () => {
|
||||||
const data = [
|
const data = [
|
||||||
{
|
{
|
||||||
title: '系统支持 JDK 8/17/21,Vue 2/3',
|
title: '系统支持 JDK 8/17/21,Vue 2/3',
|
||||||
@ -288,12 +277,12 @@ const getNotice = async () => {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
notice = Object.assign(notice, data)
|
notice = Object.assign(notice, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取快捷入口
|
// 获取快捷入口
|
||||||
let shortcut = reactive<Shortcut[]>([])
|
let shortcut = reactive<Shortcut[]>([])
|
||||||
|
|
||||||
const getShortcut = async () => {
|
const getShortcut = async () => {
|
||||||
const data = [
|
const data = [
|
||||||
{
|
{
|
||||||
name: 'Github',
|
name: 'Github',
|
||||||
@ -327,10 +316,10 @@ const getShortcut = async () => {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
shortcut = Object.assign(shortcut, data)
|
shortcut = Object.assign(shortcut, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户来源
|
// 用户来源
|
||||||
const getUserAccessSource = async () => {
|
const getUserAccessSource = async () => {
|
||||||
const data = [
|
const data = [
|
||||||
{ value: 335, name: 'analysis.directAccess' },
|
{ value: 335, name: 'analysis.directAccess' },
|
||||||
{ value: 310, name: 'analysis.mailMarketing' },
|
{ value: 310, name: 'analysis.mailMarketing' },
|
||||||
@ -349,11 +338,11 @@ const getUserAccessSource = async () => {
|
|||||||
value: v.value
|
value: v.value
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const barOptionsData = reactive<EChartsOption>(barOptions) as EChartsOption
|
const barOptionsData = reactive<EChartsOption>(barOptions) as EChartsOption
|
||||||
|
|
||||||
// 周活跃量
|
// 周活跃量
|
||||||
const getWeeklyUserActivity = async () => {
|
const getWeeklyUserActivity = async () => {
|
||||||
const data = [
|
const data = [
|
||||||
{ value: 13253, name: 'analysis.monday' },
|
{ value: 13253, name: 'analysis.monday' },
|
||||||
{ value: 34235, name: 'analysis.tuesday' },
|
{ value: 34235, name: 'analysis.tuesday' },
|
||||||
@ -375,9 +364,9 @@ const getWeeklyUserActivity = async () => {
|
|||||||
type: 'bar'
|
type: 'bar'
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
const getAllApi = async () => {
|
const getAllApi = async () => {
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
getCount(),
|
getCount(),
|
||||||
getProject(),
|
getProject(),
|
||||||
@ -387,10 +376,22 @@ const getAllApi = async () => {
|
|||||||
getWeeklyUserActivity()
|
getWeeklyUserActivity()
|
||||||
])
|
])
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
const goToXXLJob = async () => {
|
const goToXXLJob = async () => {
|
||||||
window.open('http://127.0.0.1:9090/xxl-job-admin/');
|
window.open('https://mt.ptzykjgs.com/xxl-job-admin/');
|
||||||
}
|
}
|
||||||
getAllApi()
|
getAllApi()
|
||||||
</script>
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
.image-container {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-image img {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue
Block a user