This commit is contained in:
秋帆
2024-11-03 16:37:10 +08:00
191 changed files with 7855 additions and 5796 deletions

View File

@@ -10,6 +10,7 @@
import { type EChartsOption, graphic } from 'echarts'
import { useChart } from '@/hooks'
import { type DashboardChartCommonResp, getAnalysisTimeslot as getData } from '@/apis/common'
import handleIcon from '@/assets/icons/slider.svg'
// 提示框
const tooltipItemsHtmlString = (items) => {
@@ -23,7 +24,7 @@ const tooltipItemsHtmlString = (items) => {
<span class="tooltip-value">
${el.value}
</span>
</div>`
</div>`,
)
.join('')
}
@@ -36,7 +37,7 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
left: '40',
right: 0,
top: '20',
bottom: '100'
bottom: '100',
},
xAxis: {
type: 'category',
@@ -49,24 +50,24 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
if (idx === 0) return ''
if (idx === xAxis.value.length - 1) return ''
return `${value}`
}
},
},
axisLine: {
lineStyle: {
color: isDark ? '#3f3f3f' : '#A9AEB8'
}
color: isDark ? '#3f3f3f' : '#A9AEB8',
},
},
axisTick: {
show: true,
alignWithLabel: true,
lineStyle: {
color: '#86909C'
color: '#86909C',
},
interval(idx: number) {
if (idx === 0) return false
if (idx === xAxis.value.length - 1) return false
return true
}
},
},
splitLine: {
show: true,
@@ -75,16 +76,16 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
return idx !== xAxis.value.length - 1
},
lineStyle: {
color: isDark ? '#3F3F3F' : '#E5E8EF'
}
color: isDark ? '#3F3F3F' : '#E5E8EF',
},
},
axisPointer: {
show: true,
lineStyle: {
color: '#23ADFF',
width: 2
}
}
width: 2,
},
},
},
yAxis: {
type: 'value',
@@ -95,17 +96,17 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
return `${value / 1000}k`
}
return `${value}`
}
},
},
axisLine: {
show: false
show: false,
},
splitLine: {
lineStyle: {
type: 'dashed',
color: isDark ? '#3F3F3F' : '#E5E8EF'
}
}
color: isDark ? '#3F3F3F' : '#E5E8EF',
},
},
},
tooltip: {
show: true,
@@ -117,7 +118,7 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
${tooltipItemsHtmlString(params)}
</div>`
},
className: 'echarts-tooltip-diy'
className: 'echarts-tooltip-diy',
},
series: [
{
@@ -133,23 +134,23 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
focus: 'series',
itemStyle: {
borderWidth: 2,
borderColor: '#E0E3FF'
}
borderColor: '#E0E3FF',
},
},
areaStyle: {
opacity: 0.8,
color: new graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: 'rgba(17, 126, 255, 0.16)'
color: 'rgba(17, 126, 255, 0.16)',
},
{
offset: 1,
color: 'rgba(17, 128, 255, 0)'
}
])
}
}
color: 'rgba(17, 128, 255, 0)',
},
]),
},
},
],
dataZoom: [
{
@@ -159,23 +160,22 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
right: 14,
height: 14,
borderColor: 'transparent',
handleIcon:
'image://http://p3-armor.byteimg.com/tos-cn-i-49unhts6dw/1ee5a8c6142b2bcf47d2a9f084096447.svg~tplv-49unhts6dw-image.image',
handleIcon: `image://${handleIcon}`,
handleSize: '20',
handleStyle: {
shadowColor: 'rgba(0, 0, 0, 0.2)',
shadowBlur: 4
shadowBlur: 4,
},
brushSelect: false,
backgroundColor: isDark ? '#313132' : '#F2F3F5'
backgroundColor: isDark ? '#313132' : '#F2F3F5',
},
{
type: 'inside',
start: 0,
end: 100,
zoomOnMouseWheel: false
}
]
zoomOnMouseWheel: false,
},
],
}
})

View File

@@ -29,7 +29,7 @@ const tooltipItemsHtmlString = (items) => {
<span class="tooltip-value">
${el.value}
</span>
</div>`
</div>`,
)
.join('')
}
@@ -43,14 +43,14 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
left: '38',
right: '5',
top: '10',
bottom: '50'
bottom: '50',
},
legend: {
bottom: -3,
icon: 'circle',
textStyle: {
color: '#4E5969'
}
color: '#4E5969',
},
},
xAxis: {
type: 'category',
@@ -63,13 +63,13 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
if (idx === 0) return ''
if (idx === xAxis.value.length - 1) return ''
return `${value}`
}
},
},
axisLine: {
show: false
show: false,
},
axisTick: {
show: false
show: false,
},
splitLine: {
show: true,
@@ -78,16 +78,16 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
return idx !== xAxis.value.length - 1
},
lineStyle: {
color: isDark ? '#3F3F3F' : '#E5E8EF'
}
color: isDark ? '#3F3F3F' : '#E5E8EF',
},
},
axisPointer: {
show: true,
lineStyle: {
color: '#23ADFF',
width: 2
}
}
width: 2,
},
},
},
yAxis: {
type: 'value',
@@ -98,17 +98,17 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
return `${value / 1000}k`
}
return `${value}`
}
},
},
axisLine: {
show: false
show: false,
},
splitLine: {
lineStyle: {
type: 'dashed',
color: isDark ? '#3F3F3F' : '#E5E8EF'
}
}
color: isDark ? '#3F3F3F' : '#E5E8EF',
},
},
},
tooltip: {
show: true,
@@ -120,7 +120,7 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
${tooltipItemsHtmlString(params)}
</div>`
},
className: 'echarts-tooltip-diy'
className: 'echarts-tooltip-diy',
},
series: [
{
@@ -136,22 +136,22 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
focus: 'series',
itemStyle: {
borderWidth: 2,
borderColor: '#E0E3FF'
}
borderColor: '#E0E3FF',
},
},
areaStyle: {
opacity: 0.8,
color: new graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: 'rgba(17, 126, 255, 0.16)'
color: 'rgba(17, 126, 255, 0.16)',
},
{
offset: 1,
color: 'rgba(17, 128, 255, 0)'
}
])
}
color: 'rgba(17, 128, 255, 0)',
},
]),
},
},
{
name: '独立IP',
@@ -166,24 +166,24 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
focus: 'series',
itemStyle: {
borderWidth: 2,
borderColor: '#E2F2FF'
}
borderColor: '#E2F2FF',
},
},
areaStyle: {
opacity: 0.8,
color: new graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: 'rgba(17, 126, 255, 0.16)'
color: 'rgba(17, 126, 255, 0.16)',
},
{
offset: 1,
color: 'rgba(17, 128, 255, 0)'
}
])
}
}
]
color: 'rgba(17, 128, 255, 0)',
},
]),
},
},
],
}
})

View File

@@ -23,15 +23,15 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
icon: 'circle',
itemWidth: 8,
textStyle: {
color: isDark ? 'rgba(255,255,255,0.7)' : '#4E5969'
color: isDark ? 'rgba(255,255,255,0.7)' : '#4E5969',
},
itemStyle: {
borderWidth: 0
}
borderWidth: 0,
},
},
tooltip: {
show: true,
trigger: 'item'
trigger: 'item',
},
series: [
{
@@ -40,15 +40,15 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
center: ['50%', '42%'],
label: {
formatter: '{d}% ',
color: isDark ? 'rgba(255, 255, 255, 0.7)' : '#4E5969'
color: isDark ? 'rgba(255, 255, 255, 0.7)' : '#4E5969',
},
itemStyle: {
borderColor: isDark ? '#000' : '#fff',
borderWidth: 1
borderWidth: 1,
},
data: chartData.value
}
]
data: chartData.value,
},
],
}
})
@@ -64,8 +64,8 @@ const getChartData = async () => {
chartData.value.push({
...item,
itemStyle: {
color: data.length > 1 && index === data.length - 1 ? colors[colors.length - 1] : colors[index]
}
color: data.length > 1 && index === data.length - 1 ? colors[colors.length - 1] : colors[index],
},
})
})
} finally {

View File

@@ -39,7 +39,6 @@
<script lang="ts" setup>
import { computed } from 'vue'
import type { EChartsOption } from 'echarts'
import { useChart } from '@/hooks'
import { useAppStore } from '@/stores'
@@ -50,24 +49,24 @@ const count = ref(0)
const growth = ref(0)
const xAxis = ref<string[]>([])
const chartData = ref<number[]>([])
const { chartOption } = useChart((isDark: EChartsOption) => {
const { chartOption } = useChart(() => {
return {
grid: {
left: 0,
right: 30,
top: 10,
bottom: 0
bottom: 0,
},
xAxis: {
type: 'category',
data: xAxis.value
data: xAxis.value,
},
yAxis: {
show: false
show: false,
},
tooltip: {
show: true,
trigger: 'axis'
trigger: 'axis',
},
series: [
{
@@ -79,10 +78,10 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
lineStyle: {
color: '#246EFF',
width: 2,
type: 'dashed'
}
}
]
type: 'dashed',
},
},
],
}
})

View File

@@ -39,7 +39,6 @@
<script lang="ts" setup>
import { computed } from 'vue'
import type { EChartsOption } from 'echarts'
import { useChart } from '@/hooks'
import { useAppStore } from '@/stores'
@@ -49,13 +48,13 @@ const isDark = computed(() => appStore.theme === 'dark')
const count = ref(0)
const growth = ref(0)
const chartData = ref<number[]>([])
const { chartOption } = useChart((isDark: EChartsOption) => {
const { chartOption } = useChart(() => {
return {
grid: {
left: 0,
right: 0,
top: 0,
bottom: 0
bottom: 0,
},
legend: {
show: true,
@@ -66,11 +65,11 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
itemWidth: 6,
itemHeight: 6,
textStyle: {
color: '#4E5969'
}
color: '#4E5969',
},
},
tooltip: {
show: true
show: true,
},
series: [
{
@@ -79,11 +78,11 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
radius: ['50%', '70%'],
center: ['30%', '50%'],
label: {
show: false
show: false,
},
data: chartData.value
}
]
data: chartData.value,
},
],
}
})
@@ -101,8 +100,8 @@ const getChartData = async () => {
name: `示例${index + 1}`,
value: item,
itemStyle: {
color: data.length > 1 && index === data.length - 1 ? colors[colors.length - 1] : colors[index]
}
color: data.length > 1 && index === data.length - 1 ? colors[colors.length - 1] : colors[index],
},
})
})
} finally {

View File

@@ -39,7 +39,6 @@
<script lang="ts" setup>
import { computed } from 'vue'
import type { EChartsOption } from 'echarts'
import { useChart } from '@/hooks'
import { useAppStore } from '@/stores'
import { type DashboardChartCommonResp, getDashboardOverviewIp as getData } from '@/apis'
@@ -52,24 +51,24 @@ const today = ref(0)
const growth = ref(0)
const xAxis = ref<string[]>([])
const chartData = ref<number[]>([])
const { chartOption } = useChart((isDark: EChartsOption) => {
const { chartOption } = useChart(() => {
return {
grid: {
left: 0,
right: 30,
top: 10,
bottom: 0
bottom: 0,
},
xAxis: {
type: 'category',
data: xAxis.value
data: xAxis.value,
},
yAxis: {
show: false
show: false,
},
tooltip: {
show: true,
trigger: 'axis'
trigger: 'axis',
},
series: [
{
@@ -79,10 +78,10 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
showSymbol: false,
lineStyle: {
color: '#2CAB40',
width: 2
}
}
]
width: 2,
},
},
],
}
})

View File

@@ -39,7 +39,6 @@
<script lang="ts" setup>
import { computed } from 'vue'
import type { EChartsOption } from 'echarts'
import { useChart } from '@/hooks'
import { useAppStore } from '@/stores'
import { type DashboardChartCommonResp, getDashboardOverviewPv as getData } from '@/apis'
@@ -52,24 +51,24 @@ const today = ref(0)
const growth = ref(0)
const xAxis = ref<string[]>([])
const chartData = ref<number[]>([])
const { chartOption } = useChart((isDark: EChartsOption) => {
const { chartOption } = useChart(() => {
return {
grid: {
left: 0,
right: 30,
top: 10,
bottom: 0
bottom: 0,
},
xAxis: {
type: 'category',
data: xAxis.value
data: xAxis.value,
},
yAxis: {
show: false
show: false,
},
tooltip: {
show: true,
trigger: 'axis'
trigger: 'axis',
},
series: [
{
@@ -79,10 +78,10 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
showSymbol: false,
lineStyle: {
color: '#246EFF',
width: 2
}
}
]
width: 2,
},
},
],
}
})

View File

@@ -21,7 +21,7 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
left: 55,
right: 20,
top: 0,
bottom: 20
bottom: 20,
},
xAxis: {
type: 'value',
@@ -30,38 +30,38 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
formatter(value: number, idx: number) {
if (idx === 0) return String(value)
return `${Number(value) / 1000}k`
}
},
},
splitLine: {
lineStyle: {
color: isDark ? '#484849' : '#E5E8EF'
}
}
color: isDark ? '#484849' : '#E5E8EF',
},
},
},
yAxis: {
type: 'category',
data: yAxis.value,
axisLabel: {
show: true,
color: '#4E5969'
color: '#4E5969',
},
axisTick: {
show: true,
length: 2,
lineStyle: {
color: '#A9AEB8'
color: '#A9AEB8',
},
alignWithLabel: true
alignWithLabel: true,
},
axisLine: {
lineStyle: {
color: isDark ? '#484849' : '#A9AEB8'
}
}
color: isDark ? '#484849' : '#A9AEB8',
},
},
},
tooltip: {
show: true,
trigger: 'axis'
trigger: 'axis',
},
series: [
{
@@ -70,10 +70,10 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
barWidth: 7,
itemStyle: {
color: '#4086FF',
borderRadius: 4
}
}
]
borderRadius: 4,
},
},
],
}
})

View File

@@ -23,15 +23,15 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
icon: 'circle',
itemWidth: 8,
textStyle: {
color: isDark ? 'rgba(255,255,255,0.7)' : '#4E5969'
color: isDark ? 'rgba(255,255,255,0.7)' : '#4E5969',
},
itemStyle: {
borderWidth: 0
}
borderWidth: 0,
},
},
tooltip: {
show: true,
trigger: 'item'
trigger: 'item',
},
series: [
{
@@ -40,15 +40,15 @@ const { chartOption } = useChart((isDark: EChartsOption) => {
center: ['50%', '42%'],
label: {
formatter: '{d}% ',
color: isDark ? 'rgba(255, 255, 255, 0.7)' : '#4E5969'
color: isDark ? 'rgba(255, 255, 255, 0.7)' : '#4E5969',
},
itemStyle: {
borderColor: isDark ? '#000' : '#fff',
borderWidth: 1
borderWidth: 1,
},
data: chartData.value
}
]
data: chartData.value,
},
],
}
})
@@ -64,8 +64,8 @@ const getChartData = async () => {
chartData.value.push({
...item,
itemStyle: {
color: data.length > 1 && index === data.length - 1 ? colors[colors.length - 1] : colors[index]
}
color: data.length > 1 && index === data.length - 1 ? colors[colors.length - 1] : colors[index],
},
})
})
} finally {

View File

@@ -12,7 +12,7 @@
target="_blank"
rel="noopener"
>
<img :src="`${image.src}?${new Date().getTime()}`" style="width: 100%" alt="" />
<img :src="image.src" style="width: 100%" alt="" />
</a-link>
</div>
</a-carousel-item>
@@ -22,12 +22,12 @@
<script lang="ts" setup>
const images = [
{
src: 'https://continew.top/qrcode-text.png',
url: 'https://continew.top/about/intro.html'
src: `https://continew.top/qrcode-text.png?${new Date().getTime()}`,
url: 'https://continew.top/about/intro.html',
},
{
src: 'https://continew.top/sponsor.png',
url: 'https://continew.top/sponsor.html'
}
src: `https://continew.top/sponsor.png?${new Date().getTime()}`,
url: 'https://continew.top/sponsor.html',
},
]
</script>

View File

@@ -30,7 +30,7 @@ const links = [
{ text: '常见问题', url: 'https://continew.top/faq.html' },
{ text: '更新日志', url: 'https://continew.top/admin/other/changelog.html' },
{ text: '贡献指南', url: 'https://continew.top/admin/other/contributing.html' },
{ text: '赞助支持 💖', url: 'https://continew.top/sponsor.html' }
{ text: '赞助支持 💖', url: 'https://continew.top/sponsor.html' },
]
</script>

View File

@@ -0,0 +1,198 @@
<template>
<a-card class="general-card" title="最新动态" style="margin-bottom: 14px">
<template #extra>
<a-dropdown>
<a-link>更多</a-link>
<template #content>
<a-doption>
<a-link href="https://gitee.com/organizations/continew/events" target="_blank" rel="noopener">Gitee</a-link>
</a-doption>
<a-doption>
<a-link href="https://gitcode.com/org/continew/discussion" target="_blank" rel="noopener">GitCode</a-link>
</a-doption>
<a-doption>
<a-link href="https://github.com/orgs/continew-org/discussions" target="_blank" rel="noopener">GitHub</a-link>
</a-doption>
</template>
</a-dropdown>
</template>
<a-skeleton v-if="loading" :loading="loading" :animation="true">
<a-skeleton-line :rows="10" />
</a-skeleton>
<div v-else>
<a-empty v-if="dataList.length === 0">暂无动态</a-empty>
<a-comment
v-for="(item, index) in dataList"
v-else
:key="index"
:author="item.actor.nickname"
:class="`animated-fade-up-${index}`"
>
<template #avatar>
<a-badge>
<template #content>
<GiSvgIcon v-if="item.platform === 'GitHub'" name="github" :size="15" />
<GiSvgIcon v-else-if="item.platform === 'Gitee'" name="gitee" :size="15" />
</template>
<a :href="item.actor.url" target="_blank" rel="noopener">
<a-avatar :size="30">
<img :src="item.actor.avatar" alt="avatar" />
</a-avatar>
</a>
</a-badge>
</template>
<template #datetime>
<span :title="item.createTime">{{ item.createTimeString }}</span>
</template>
<template #content>
<div class="content">
<p v-if="item.type === 'PUSH'">
推送到了 <a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
{{ `${item.payload.branch} 分支 ${item.payload.commits.length} 个提交` }}
<a-comment
v-for="(commit, idx) in item.payload.commits"
:key="idx"
class="commit"
>
<template #content>
<a-link :href="commit.url" target="_blank" rel="noopener" style="font-size: 12px" :title="commit.message">{{ commit.sha.substring(0, 7) }}</a-link>
<a :href="commit.url" target="_blank" rel="noopener" :title="commit.message">{{ commit.message }}</a>
</template>
</a-comment>
</p>
<p v-else-if="item.type === 'ISSUE_OPEN'">
<a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
创建了 Issue <a-link :href="item.payload.url" target="_blank" rel="noopener">{{ item.payload.title }}</a-link>
</p>
<p v-else-if="item.type === 'ISSUE_CLOSE'">
更改了 <a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
Issue <a-link :href="item.payload.url" target="_blank" rel="noopener">{{ item.payload.title }}</a-link>
状态为 {{ item.payload.stateString }}
</p>
<p v-else-if="item.type === 'ISSUE_COMMENT'">
评论了 <a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
Issue <a-link :href="item.payload.url" target="_blank" rel="noopener">{{ item.payload.title }}</a-link>
</p>
<p v-else-if="item.type === 'PULL_REQUEST_OPEN'">
<a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
创建了 Pull Request <a-link :href="item.payload.url" target="_blank" rel="noopener">{{ item.payload.title }}</a-link>
</p>
<p v-else-if="item.type === 'PULL_REQUEST_MERGE'">
接受了 <a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
Pull Request <a-link :href="item.payload.url" target="_blank" rel="noopener">{{ item.payload.title }}</a-link>
</p>
<p v-else-if="item.type === 'PULL_REQUEST_CLOSE'">
更改了 <a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
Pull Request <a-link :href="item.payload.url" target="_blank" rel="noopener">{{ item.payload.title }}</a-link>
状态为 {{ item.payload.stateString }}
</p>
<p v-else-if="item.type === 'CREATE'">
推送了新的 {{ item.payload.refType }}
<a-link :href="item.payload.url" target="_blank" rel="noopener">{{ item.payload.ref }}</a-link>
<a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
</p>
<p v-else-if="item.type === 'DELETE'">
删除了 <a-link :href="item.repo.url" target="_blank" rel="noopener">{{ item.repo.alias }}</a-link>
{{ item.payload.ref }} {{ item.payload.refType }}
</p>
<p v-else>暂无</p>
</div>
</template>
</a-comment>
</div>
</a-card>
</template>
<script lang="ts" setup>
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios'
import qs from 'query-string'
dayjs.extend(relativeTime)
dayjs.locale('zh-cn')
export interface DataItem {
type: string
actor: {
username: string
nickname: string
avatar: string
url: string
}
repo: {
name: string
alias: string
url: string
}
payload: object
createTime: string
createTimeString: string
}
const get = <T = unknown>(url: string, params?: object, config?: AxiosRequestConfig): Promise<ApiRes<T>> => {
return new Promise((resolve, reject) => {
axios
.request<T>({
method: 'get',
url,
params,
paramsSerializer: (obj) => {
return qs.stringify(obj)
},
...config,
})
.then((res: AxiosResponse) => resolve(res.data))
.catch((err: { msg: string }) => reject(err))
})
}
const dataList = ref<DataItem[]>([])
const loading = ref(false)
// 查询列表数据
const getDataList = async () => {
try {
loading.value = true
const { data } = await get('https://api.charles7c.top/git/orgs/events/continew')
data.forEach((item) => {
dataList.value.push({
...item,
createTimeString: dayjs(new Date(item.createTime)).fromNow(),
})
})
} catch (err) {
// console.log(err)
} finally {
loading.value = false
}
}
onMounted(() => {
getDataList()
})
</script>
<style scoped lang="scss">
:deep(.arco-comment:not(:first-of-type), .arco-comment-inner-comment) {
margin-top: 10px;
}
:deep(.arco-comment:not(:last-of-type)) {
border-bottom: 1px solid var(--color-border-1);
padding-bottom: 10px;
}
:deep(.arco-comment-content) {
color: var(--color-text-2);
}
:deep(.arco-comment-datetime) {
color: var(--color-text-4);
}
.commit.arco-comment {
margin-top: 10px;
font-size: 12px;
border-bottom: none;
padding-bottom: 0;
}
</style>

View File

@@ -24,7 +24,7 @@
css: true,
}"
>
{{ item.title }}
{{ item.title }}
</a-typography-paragraph>
</a-link>
</div>
@@ -68,6 +68,10 @@ onMounted(() => {
</script>
<style scoped lang="less">
:deep(.arco-typography) {
color: var(--color-text-2);
}
.item {
display: flex;
align-items: center;

View File

@@ -1,31 +1,45 @@
<template>
<a-card class="general-card" title="我的项目">
<template #extra>
<a-link href="https://github.com/charles7c" target="_blank" rel="noopener">更多</a-link>
<a-dropdown>
<a-link>更多</a-link>
<template #content>
<a-doption>
<a-link href="https://gitee.com/charles7c" target="_blank" rel="noopener">Gitee</a-link>
</a-doption>
<a-doption>
<a-link href="https://gitcode.com/charles_7c" target="_blank" rel="noopener">GitCode</a-link>
</a-doption>
<a-doption>
<a-link href="https://github.com/charles7c" target="_blank" rel="noopener">GitHub</a-link>
</a-doption>
</template>
</a-dropdown>
</template>
<a-row :gutter="16">
<a-row :gutter="[14, 14]">
<a-col
v-for="(item, index) in list"
:key="index"
:xs="12"
:sm="12"
:xs="24"
:sm="24"
:md="12"
:lg="12"
:xl="8"
:xxl="8"
class="my-project-item"
>
<a-card style="min-height: 204px; max-height: 204px" :bordered="true" hoverable>
<a-card :bordered="true" hoverable>
<div class="badge badge-right" :style="`background-color: ${item.statusColor}`">{{ item.status }}</div>
<a :href="item.url" target="_blank">
<a-space direction="vertical">
<a-card-meta>
<template #title>
<a-space>
<a-image :src="item.logo" width="30px" alt="logo" />
<a-typography-text bold>{{ item.name }}</a-typography-text>
<img :src="item.logo" width="35px" height="25px" alt="logo" />
<a-typography-text bold>{{ item.alias }}</a-typography-text>
</a-space>
</template>
<template #description>
<a-typography-paragraph
:ellipsis="{
rows: 6,
rows: 2,
showTooltip: true,
css: true,
}"
@@ -34,8 +48,26 @@
{{ item.desc }}
</a-typography-text>
</a-typography-paragraph>
</a-space>
</a>
</template>
<template #avatar>
<a-avatar-group :size="32" :max-count="7">
<a-avatar
v-for="(contributor, idx) in item.contributors"
:key="idx"
:title="contributor.name"
>
<img :src="contributor.avatar" alt="avatar" />
</a-avatar>
</a-avatar-group>
</template>
</a-card-meta>
<template v-if="!loading && item.status !== '孵化'" #actions>
<a-tooltip content="点个 Star 吧">
<span class="icon-hover">
<a :href="item.url" target="_blank" rel="noopener"><IconThumbUp :size="20" /></a>
</span>
</a-tooltip>
</template>
</a-card>
</a-col>
</a-row>
@@ -43,68 +75,119 @@
</template>
<script lang="ts" setup>
import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios'
import qs from 'query-string'
const list = [
{
name: 'ContiNew Admin',
desc: '🔥Almost最佳后端规范🔥持续迭代优化的前后端分离中后台管理系统框架开箱即用持续提供舒适的开发体验。当前采用技术栈Spring Boot3Java17、Vue3 & Arco Design、TS、Vite5 、Sa-Token、MyBatisPlus、Redisson、JetCache、Jackson、SpringDoc、Crane4j、Liquibase、Hutool 等。',
alias: 'ContiNew Admin',
name: 'continew-admin',
owner: 'continew-org',
desc: '🔥Almost最佳后端规范🔥持续迭代优化的前后端分离中后台管理系统框架开箱即用持续提供舒适的开发体验。',
logo: 'https://continew.top/logo.svg',
url: 'https://gitee.com/continew/continew-admin',
url: 'https://gitee.com/continew/continew-admin/stargazers',
status: '迭代',
statusColor: 'rgb(var(--primary-6))'
statusColor: 'rgb(var(--primary-6))',
},
{
name: 'ContiNew Starter',
alias: 'ContiNew Starter',
name: 'continew-starter',
owner: 'continew-org',
desc: '🔥高质量Starter🔥包含了一系列经过企业实践优化的依赖包如 MyBatis-Plus、SaToken可轻松集成到应用中为开发人员减少手动引入依赖及配置的麻烦为 Spring Boot Web 项目的灵活快速构建提供支持。',
logo: 'https://continew.top/logo.svg',
url: 'https://gitee.com/continew/continew-starter',
url: 'https://gitee.com/continew/continew-starter/stargazers',
status: '迭代',
statusColor: 'rgb(var(--primary-6))'
statusColor: 'rgb(var(--primary-6))',
},
{
name: 'ContiNew Admin UI',
alias: 'ContiNew Admin UI',
name: 'continew-admin-ui',
owner: 'continew-org',
desc: '全新 3.x 版本,基于 Gi Demo 前端模板开发的 ContiNew Admin 前端适配项目。',
logo: 'https://continew.top/logo.svg',
url: 'https://gitee.com/continew/continew-admin-ui',
url: 'https://gitee.com/continew/continew-admin-ui/stargazers',
status: '迭代',
statusColor: 'rgb(var(--primary-6))'
statusColor: 'rgb(var(--primary-6))',
},
{
name: 'ContiNew Admin UI Arco',
alias: 'ContiNew Admin UI Arco',
name: 'continew-admin-ui-arco',
owner: 'continew-org',
desc: '2.5 版本,基于 Arco Design Pro 前端模板开发的 ContiNew Admin 前端适配项目。',
logo: 'https://continew.top/logo.svg',
url: 'https://gitee.com/continew/continew-admin-ui-arco',
url: 'https://gitee.com/continew/continew-admin-ui-arco/stargazers',
status: '归档',
statusColor: 'rgb(var(--warning-6))'
statusColor: 'rgb(var(--warning-6))',
},
{
name: 'ContiNew Cloud',
desc: 'ContiNew Admin 微服务版本。',
alias: 'ContiNew Cloud',
name: 'continew-admin',
owner: 'continew',
desc: 'ContiNew Admin 微服务版本。基于 SpringBoot 3.x、Spring Cloud 2023 & Alibaba。',
logo: 'https://continew.top/logo.svg',
url: '#',
status: '孵化',
statusColor: 'rgb(var(--danger-6))'
statusColor: 'rgb(var(--danger-6))',
},
{
alias: 'charles7c.github.io',
name: 'charles7c.github.io',
desc: '基于 VitePress 构建的个人知识库/博客。扩展 VitePress 默认主题增加ICP备案号、公安备案号显示增加文章元数据信息原创标识、作者、发布时间、分类、标签显示增加文末版权声明增加 Gitalk 评论功能,主页美化、自动生成侧边栏、文章内支持 Mermaid 流程图、MD公式、MD脚注、增加我的标签、我的归档等独立页面以及浏览器滚条等细节优化。查尔斯的个人技术知识库记录 & 分享个人碎片化、结构化、体系化的技术知识内容。',
owner: 'charles7c',
desc: '基于 VitePress 构建的个人知识库/博客。扩展 VitePress 默认主题增加ICP备案号、公安备案号显示增加文章元数据信息原创标识、作者、发布时间、分类、标签显示增加文末版权声明增加 Gitalk 评论功能,主页美化、自动生成侧边栏、文章内支持 Mermaid 流程图、MD公式、MD脚注、增加我的标签、我的归档等独立页面以及浏览器滚条等细节优化。',
logo: 'https://blog.charles7c.top/logo.png',
url: 'https://github.com/Charles7c/charles7c.github.io',
url: 'https://github.com/Charles7c/charles7c.github.io/stargazers',
status: '归档',
statusColor: 'rgb(var(--warning-6))'
}
statusColor: 'rgb(var(--warning-6))',
},
]
const get = <T = unknown>(url: string, params?: object, config?: AxiosRequestConfig): Promise<ApiRes<T>> => {
return new Promise((resolve, reject) => {
axios
.request<T>({
method: 'get',
url,
params,
paramsSerializer: (obj) => {
return qs.stringify(obj)
},
...config,
})
.then((res: AxiosResponse) => resolve(res.data))
.catch((err: { msg: string }) => reject(err))
})
}
const loading = ref(false)
// 查询数据
const getDataList = async () => {
try {
loading.value = true
for (const item of list) {
const { data } = await get(`https://api.charles7c.top/git/repos/contributors/${item.owner}/${item.name}`)
item.contributors = data
}
} catch (err) {
// console.log(err)
} finally {
loading.value = false
}
}
onMounted(() => {
getDataList()
})
</script>
<style scoped lang="less">
:deep(.arco-card-body) {
min-height: 128px;
overflow: hidden;
position: relative;
overflow: hidden;
.badge {
position: absolute;
font-size: 12px;
height: 18px;
line-height: 18px;
font-size: 10px;
height: 16px;
line-height: 16px;
text-align: center;
width: 74px;
color: #fff;
@@ -115,8 +198,8 @@ const list = [
-o-transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
left: -18px;
top: 9px;
left: -20px;
top: 6px;
}
.badge-right {
-moz-transform: rotate(45deg);
@@ -124,34 +207,29 @@ const list = [
-o-transform: rotate(45deg);
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
right: -18px;
top: 9px;
right: -20px;
top: 6px;
}
}
.my-project {
&-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
}
&-title {
margin-top: 0 !important;
margin-bottom: 18px !important;
}
.icon-hover {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
color: rgba(var(--primary-6));
border-radius: 50%;
transition: all 0.1s;
animation: icon-hover-animated 1.2s ease-in-out infinite;
}
.icon-hover:hover {
background-color: rgb(var(--gray-2));
}
&-list {
display: flex;
justify-content: space-between;
}
&-item {
// padding-right: 16px;
margin-bottom: 16px;
&:last-child {
padding-right: 0;
}
@keyframes icon-hover-animated {
50% {
transform: scale(0.8);
}
}
</style>

View File

@@ -33,7 +33,7 @@ const links = [
{ text: '菜单管理', icon: 'menu', path: '/system/menu' },
{ text: '文件管理', icon: 'file', path: '/system/file' },
{ text: '代码生成', icon: 'code', path: '/tool/generator' },
{ text: '系统日志', icon: 'history', path: '/monitor/log' }
{ text: '系统日志', icon: 'history', path: '/monitor/log' },
]
</script>

View File

@@ -2,11 +2,9 @@
<a-card class="card" :bordered="false">
<a-row align="center" wrap :gutter="[{ xs: 0, sm: 14, md: 14, lg: 14, xl: 14, xxl: 14 }, 16]" class="content">
<a-space size="medium">
<a-avatar :size="68">
<img :src="userStore.avatar" alt="avatar" />
</a-avatar>
<Avatar :src="userStore.avatar" :name="userStore.nickname" :size="68" />
<div class="welcome">
<p class="hello">{{ goodTimeText() }}{{ userStore.name }}</p>
<p class="hello">{{ goodTimeText() }}{{ userStore.nickname }}</p>
<p>北海虽赊扶摇可接东隅已逝桑榆非晚</p>
</div>
</a-space>

View File

@@ -9,6 +9,9 @@
<a-grid-item :span="24">
<Project />
</a-grid-item>
<a-grid-item :span="24">
<LatestActivity />
</a-grid-item>
</a-grid>
</div>
</div>
@@ -36,6 +39,7 @@
<script setup lang="ts">
import Welcome from './components/Welcome.vue'
import Project from './components/Project.vue'
import LatestActivity from './components/LatestActivity.vue'
import QuickOperation from './components/QuickOperation.vue'
import Carousel from './components/Carousel.vue'
import Notice from './components/Notice.vue'