mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-23 13:03:50 +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:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
@@ -188,16 +188,21 @@ export const useUserRoute = (app) => {
|
|||||||
$match: {
|
$match: {
|
||||||
status: 'SUCCESS',
|
status: 'SUCCESS',
|
||||||
createTime: {
|
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: {
|
$group: {
|
||||||
_id: {
|
_id: {
|
||||||
year: { $year: '$createTime' },
|
year: { $year: '$adjustedCreateTime' },
|
||||||
month: { $month: '$createTime' },
|
month: { $month: '$adjustedCreateTime' },
|
||||||
day: { $dayOfMonth: '$createTime' }
|
day: { $dayOfMonth: '$adjustedCreateTime' }
|
||||||
},
|
},
|
||||||
count: { $sum: '$price' }
|
count: { $sum: '$price' }
|
||||||
}
|
}
|
||||||
@@ -216,7 +221,8 @@ export const useUserRoute = (app) => {
|
|||||||
startCount += item.count;
|
startCount += item.count;
|
||||||
return {
|
return {
|
||||||
date: item.date,
|
date: item.date,
|
||||||
count: startCount
|
total: startCount,
|
||||||
|
count: item.count
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -16,13 +16,20 @@ import dayjs from 'dayjs';
|
|||||||
const authStorageKey = 'tushan:auth';
|
const authStorageKey = 'tushan:auth';
|
||||||
const PRICE_SCALE = 100000;
|
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 = {
|
type chatDataType = {
|
||||||
date: string;
|
date: string;
|
||||||
userCount: number;
|
userCount: number;
|
||||||
userIncrease?: number;
|
userIncrease?: number;
|
||||||
userIncreaseRate?: string;
|
userIncreaseRate?: string;
|
||||||
|
payTotal: number;
|
||||||
payCount: number;
|
payCount: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -84,7 +91,8 @@ export const Dashboard: React.FC = React.memo(() => {
|
|||||||
userCount: item.count,
|
userCount: item.count,
|
||||||
userIncrease: item.increase,
|
userIncrease: item.increase,
|
||||||
userIncreaseRate: item.increaseRate,
|
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);
|
setChatData(data);
|
||||||
@@ -208,10 +216,13 @@ const CustomTooltip = ({ active, payload }: any) => {
|
|||||||
用户总数: <strong>{data.userCount}</strong>
|
用户总数: <strong>{data.userCount}</strong>
|
||||||
</p>
|
</p>
|
||||||
<p className="label">
|
<p className="label">
|
||||||
用户进入增长数量: <strong>{data.userIncrease}</strong>
|
用户今日增长数量: <strong>{data.userIncrease}</strong>
|
||||||
</p>
|
</p>
|
||||||
<p className="label">
|
<p className="label">
|
||||||
60天累计支付: <strong>{data.payCount}</strong>元
|
今日支付: <strong>{data.payCount}</strong>元
|
||||||
|
</p>
|
||||||
|
<p className="label">
|
||||||
|
60天累计支付: <strong>{data.payTotal}</strong>元
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -233,7 +244,7 @@ const UserChart = ({ data }: { data: chatDataType[] }) => {
|
|||||||
<stop offset="5%" stopColor="#82ca9d" stopOpacity={0.8} />
|
<stop offset="5%" stopColor="#82ca9d" stopOpacity={0.8} />
|
||||||
<stop offset="95%" stopColor="#82ca9d" stopOpacity={0} />
|
<stop offset="95%" stopColor="#82ca9d" stopOpacity={0} />
|
||||||
</linearGradient>
|
</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="5%" stopColor="#8884d8" stopOpacity={0.8} />
|
||||||
<stop offset="95%" stopColor="#8884d8" stopOpacity={0} />
|
<stop offset="95%" stopColor="#8884d8" stopOpacity={0} />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
@@ -251,10 +262,10 @@ const UserChart = ({ data }: { data: chatDataType[] }) => {
|
|||||||
/>
|
/>
|
||||||
<Area
|
<Area
|
||||||
type="monotone"
|
type="monotone"
|
||||||
dataKey="payCount"
|
dataKey="payTotal"
|
||||||
stroke="#8884d8"
|
stroke="#8884d8"
|
||||||
fillOpacity={1}
|
fillOpacity={1}
|
||||||
fill="url(#payCount)"
|
fill="url(#payTotal)"
|
||||||
/>
|
/>
|
||||||
</AreaChart>
|
</AreaChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
|
Reference in New Issue
Block a user