diff --git a/.github/workflows/admin-image.yml b/.github/workflows/admin-image.yml new file mode 100644 index 000000000..51216d646 --- /dev/null +++ b/.github/workflows/admin-image.yml @@ -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}} diff --git a/.github/workflows/image.yml b/.github/workflows/fastgpt-image.yml similarity index 98% rename from .github/workflows/image.yml rename to .github/workflows/fastgpt-image.yml index f533f765d..ed461e104 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/fastgpt-image.yml @@ -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: diff --git a/admin/service/route/user.js b/admin/service/route/user.js index 8c2d4329d..3006319cb 100644 --- a/admin/service/route/user.js +++ b/admin/service/route/user.js @@ -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 }; }); diff --git a/admin/src/Dashboard.tsx b/admin/src/Dashboard.tsx index 7d5ba10cd..53209a0ef 100644 --- a/admin/src/Dashboard.tsx +++ b/admin/src/Dashboard.tsx @@ -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) => { 用户总数: {data.userCount}
- 用户进入增长数量: {data.userIncrease} + 用户今日增长数量: {data.userIncrease}
- 60天累计支付: {data.payCount}元 + 今日支付: {data.payCount}元 +
++ 60天累计支付: {data.payTotal}元
); @@ -233,7 +244,7 @@ const UserChart = ({ data }: { data: chatDataType[] }) => {