mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-22 12:20:34 +00:00
perf: admin
This commit is contained in:
77
.github/workflows/admin-image.yml
vendored
Normal file
77
.github/workflows/admin-image.yml
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
name: Build fastgpt-admin images and copy image to docker hub
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
jobs:
|
||||
build-images:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y nodejs npm
|
||||
- name: Set up QEMU (optional)
|
||||
uses: docker/setup-qemu-action@v2
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||
run: |
|
||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-admin:latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-admin:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Build and publish image for main branch or tag push event
|
||||
env:
|
||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||
run: |
|
||||
cd client && \
|
||||
docker buildx build \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--label "org.opencontainers.image.source= https://github.com/ ${{ github.repository_owner }}/FastGPT" \
|
||||
--label "org.opencontainers.image.description=fastgpt-admin image" \
|
||||
--label "org.opencontainers.image.licenses=MIT" \
|
||||
--push \
|
||||
-t ${DOCKER_REPO_TAGGED} \
|
||||
-f Dockerfile \
|
||||
.
|
||||
push-to-docker-hub:
|
||||
needs: build-images
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||
run: |
|
||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||
echo "IMAGE_TAG=latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: Pull image from GitHub Container Registry
|
||||
run: docker pull ghcr.io/${{ github.repository_owner }}/fastgpt-admin:${{env.IMAGE_TAG}}
|
||||
- name: Tag image with Docker Hub repository name and version tag
|
||||
run: docker tag ghcr.io/${{ github.repository_owner }}/fastgpt-admin:${{env.IMAGE_TAG}} ${{ secrets.DOCKER_IMAGE_NAME }}:${{env.IMAGE_TAG}}
|
||||
- name: Push image to Docker Hub
|
||||
run: docker push ${{ secrets.DOCKER_IMAGE_NAME }}:${{env.IMAGE_TAG}}
|
@@ -1,4 +1,4 @@
|
||||
name: Build images and copy image to docker
|
||||
name: Build fastgpt images and copy image to docker hub
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
@@ -188,16 +188,21 @@ export const useUserRoute = (app) => {
|
||||
$match: {
|
||||
status: 'SUCCESS',
|
||||
createTime: {
|
||||
$gte: new Date(Date.now() - day * 24 * 60 * 60 * 1000)
|
||||
$gte: new Date(Date.now() - day * 24 * 60 * 60 * 1000 + 8 * 60 * 60 * 1000) // 补时差
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
$addFields: {
|
||||
adjustedCreateTime: { $add: ['$createTime', 8 * 60 * 60 * 1000] }
|
||||
}
|
||||
},
|
||||
{
|
||||
$group: {
|
||||
_id: {
|
||||
year: { $year: '$createTime' },
|
||||
month: { $month: '$createTime' },
|
||||
day: { $dayOfMonth: '$createTime' }
|
||||
year: { $year: '$adjustedCreateTime' },
|
||||
month: { $month: '$adjustedCreateTime' },
|
||||
day: { $dayOfMonth: '$adjustedCreateTime' }
|
||||
},
|
||||
count: { $sum: '$price' }
|
||||
}
|
||||
@@ -216,7 +221,8 @@ export const useUserRoute = (app) => {
|
||||
startCount += item.count;
|
||||
return {
|
||||
date: item.date,
|
||||
count: startCount
|
||||
total: startCount,
|
||||
count: item.count
|
||||
};
|
||||
});
|
||||
|
||||
|
@@ -16,13 +16,20 @@ import dayjs from 'dayjs';
|
||||
const authStorageKey = 'tushan:auth';
|
||||
const PRICE_SCALE = 100000;
|
||||
|
||||
type fetchChatData = { count: number; date: string; increase?: number; increaseRate?: string };
|
||||
type fetchChatData = {
|
||||
count: number;
|
||||
total?: number;
|
||||
date: string;
|
||||
increase?: number;
|
||||
increaseRate?: string;
|
||||
};
|
||||
|
||||
type chatDataType = {
|
||||
date: string;
|
||||
userCount: number;
|
||||
userIncrease?: number;
|
||||
userIncreaseRate?: string;
|
||||
payTotal: number;
|
||||
payCount: number;
|
||||
};
|
||||
|
||||
@@ -84,7 +91,8 @@ export const Dashboard: React.FC = React.memo(() => {
|
||||
userCount: item.count,
|
||||
userIncrease: item.increase,
|
||||
userIncreaseRate: item.increaseRate,
|
||||
payCount: pay ? pay.count / PRICE_SCALE : 0
|
||||
payCount: pay ? pay.count / PRICE_SCALE : 0,
|
||||
payTotal: pay?.total ? pay.total / PRICE_SCALE : 0
|
||||
};
|
||||
});
|
||||
setChatData(data);
|
||||
@@ -208,10 +216,13 @@ const CustomTooltip = ({ active, payload }: any) => {
|
||||
用户总数: <strong>{data.userCount}</strong>
|
||||
</p>
|
||||
<p className="label">
|
||||
用户进入增长数量: <strong>{data.userIncrease}</strong>
|
||||
用户今日增长数量: <strong>{data.userIncrease}</strong>
|
||||
</p>
|
||||
<p className="label">
|
||||
60天累计支付: <strong>{data.payCount}</strong>元
|
||||
今日支付: <strong>{data.payCount}</strong>元
|
||||
</p>
|
||||
<p className="label">
|
||||
60天累计支付: <strong>{data.payTotal}</strong>元
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
@@ -233,7 +244,7 @@ const UserChart = ({ data }: { data: chatDataType[] }) => {
|
||||
<stop offset="5%" stopColor="#82ca9d" stopOpacity={0.8} />
|
||||
<stop offset="95%" stopColor="#82ca9d" stopOpacity={0} />
|
||||
</linearGradient>
|
||||
<linearGradient id="payCount" x1="0" y1="0" x2="0" y2="1">
|
||||
<linearGradient id="payTotal" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="5%" stopColor="#8884d8" stopOpacity={0.8} />
|
||||
<stop offset="95%" stopColor="#8884d8" stopOpacity={0} />
|
||||
</linearGradient>
|
||||
@@ -251,10 +262,10 @@ const UserChart = ({ data }: { data: chatDataType[] }) => {
|
||||
/>
|
||||
<Area
|
||||
type="monotone"
|
||||
dataKey="payCount"
|
||||
dataKey="payTotal"
|
||||
stroke="#8884d8"
|
||||
fillOpacity={1}
|
||||
fill="url(#payCount)"
|
||||
fill="url(#payTotal)"
|
||||
/>
|
||||
</AreaChart>
|
||||
</ResponsiveContainer>
|
||||
|
Reference in New Issue
Block a user