From 34668379f1adf2091d8badae4444af7e0ee6d348 Mon Sep 17 00:00:00 2001 From: JIANG Date: Mon, 10 Nov 2025 14:25:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=A4=BA=E4=BE=8B=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=9B=E6=9B=B4=E6=96=B0docker=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/docker-compose_influxdb.yml | 16 +++ .../docker-compose_keycloak.yml | 0 .../docker-compose_mapservice.yml | 0 keycloak/.vscode/tasks.json | 26 ---- mapservice/.vscode/tasks.json | 26 ---- src/app/(main)/blog-posts/create/page.tsx | 122 ---------------- src/app/(main)/blog-posts/edit/[id]/page.tsx | 127 ----------------- src/app/(main)/blog-posts/layout.tsx | 23 ---- src/app/(main)/blog-posts/page.tsx | 130 ------------------ src/app/(main)/blog-posts/show/[id]/page.tsx | 62 --------- src/app/(main)/categories/create/page.tsx | 38 ----- src/app/(main)/categories/edit/[id]/page.tsx | 37 ----- src/app/(main)/categories/layout.tsx | 23 ---- src/app/(main)/categories/page.tsx | 61 -------- src/app/(main)/categories/show/[id]/page.tsx | 27 ---- 15 files changed, 16 insertions(+), 702 deletions(-) create mode 100644 docker/docker-compose_influxdb.yml rename keycloak/docker-compose.yml => docker/docker-compose_keycloak.yml (100%) rename mapservice/docker-compose.yml => docker/docker-compose_mapservice.yml (100%) delete mode 100644 keycloak/.vscode/tasks.json delete mode 100644 mapservice/.vscode/tasks.json delete mode 100644 src/app/(main)/blog-posts/create/page.tsx delete mode 100644 src/app/(main)/blog-posts/edit/[id]/page.tsx delete mode 100644 src/app/(main)/blog-posts/layout.tsx delete mode 100644 src/app/(main)/blog-posts/page.tsx delete mode 100644 src/app/(main)/blog-posts/show/[id]/page.tsx delete mode 100644 src/app/(main)/categories/create/page.tsx delete mode 100644 src/app/(main)/categories/edit/[id]/page.tsx delete mode 100644 src/app/(main)/categories/layout.tsx delete mode 100644 src/app/(main)/categories/page.tsx delete mode 100644 src/app/(main)/categories/show/[id]/page.tsx diff --git a/docker/docker-compose_influxdb.yml b/docker/docker-compose_influxdb.yml new file mode 100644 index 0000000..6a99548 --- /dev/null +++ b/docker/docker-compose_influxdb.yml @@ -0,0 +1,16 @@ +version: '3.8' +services: + influxdb: + image: influxdb:2.7 + container_name: influxdb + environment: + DOCKER_INFLUXDB_INIT_MODE: setup + DOCKER_INFLUXDB_INIT_USERNAME: tjwater + DOCKER_INFLUXDB_INIT_PASSWORD: Tjwater@123456 + DOCKER_INFLUXDB_INIT_ORG: TJWATERORG + DOCKER_INFLUXDB_INIT_BUCKET: TJWATERBUCKET + DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: kMPX2V5HsbzPpUT2B9HPBu1sTG1Emf-lPlT2UjxYnGAuocpXq_f_0lK4HHs-TbbKyjsZpICkMsyXG_V2D7P7yQ== + ports: + - "8086:8086" + volumes: + - C:\Users\admin\Documents\docker\influxdb\data:/var/lib/influxdb2 diff --git a/keycloak/docker-compose.yml b/docker/docker-compose_keycloak.yml similarity index 100% rename from keycloak/docker-compose.yml rename to docker/docker-compose_keycloak.yml diff --git a/mapservice/docker-compose.yml b/docker/docker-compose_mapservice.yml similarity index 100% rename from mapservice/docker-compose.yml rename to docker/docker-compose_mapservice.yml diff --git a/keycloak/.vscode/tasks.json b/keycloak/.vscode/tasks.json deleted file mode 100644 index 0c87756..0000000 --- a/keycloak/.vscode/tasks.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Docker Compose Up", - "type": "shell", - "command": "docker compose --project-name keycloak -f docker-compose.yml up -d --build", - "group": "build", - "problemMatcher": [] - }, - { - "label": "Docker Compose Down", - "type": "shell", - "command": "docker compose --project-name keycloak -f docker-compose.yml down", - "group": "build", - "problemMatcher": [] - }, - { - "label": "Docker Compose Restart", - "type": "shell", - "command": "docker compose --project-name keycloak -f docker-compose.yml restart", - "group": "build", - "problemMatcher": [] - } - ] -} diff --git a/mapservice/.vscode/tasks.json b/mapservice/.vscode/tasks.json deleted file mode 100644 index 2919fd4..0000000 --- a/mapservice/.vscode/tasks.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Docker Compose Up", - "type": "shell", - "command": "docker compose --project-name mapservice -f docker-compose.yml up -d --build", - "group": "build", - "problemMatcher": [] - }, - { - "label": "Docker Compose Down", - "type": "shell", - "command": "docker compose --project-name mapservice -f docker-compose.yml down", - "group": "build", - "problemMatcher": [] - }, - { - "label": "Docker Compose Restart", - "type": "shell", - "command": "docker compose --project-name mapservice -f docker-compose.yml restart", - "group": "build", - "problemMatcher": [] - } - ] -} diff --git a/src/app/(main)/blog-posts/create/page.tsx b/src/app/(main)/blog-posts/create/page.tsx deleted file mode 100644 index 107f722..0000000 --- a/src/app/(main)/blog-posts/create/page.tsx +++ /dev/null @@ -1,122 +0,0 @@ -"use client"; - -import { Autocomplete, Box, MenuItem, Select, TextField } from "@mui/material"; -import { Create, useAutocomplete } from "@refinedev/mui"; -import { useForm } from "@refinedev/react-hook-form"; -import { Controller } from "react-hook-form"; - -export default function BlogPostCreate() { - const { - saveButtonProps, - refineCore: { formLoading, onFinish }, - handleSubmit, - register, - control, - formState: { errors }, - } = useForm({}); - - const { autocompleteProps: categoryAutocompleteProps } = useAutocomplete({ - resource: "categories", - }); - - return ( - - - - - ( - { - field.onChange(value.id); - }} - getOptionLabel={(item) => { - return ( - categoryAutocompleteProps?.options?.find((p) => { - const itemId = - typeof item === "object" - ? item?.id?.toString() - : item?.toString(); - const pId = p?.id?.toString(); - return itemId === pId; - })?.title ?? "" - ); - }} - isOptionEqualToValue={(option, value) => { - const optionId = option?.id?.toString(); - const valueId = - typeof value === "object" - ? value?.id?.toString() - : value?.toString(); - return value === undefined || optionId === valueId; - }} - renderInput={(params) => ( - - )} - /> - )} - /> - { - return ( - - ); - }} - /> - - - ); -} diff --git a/src/app/(main)/blog-posts/edit/[id]/page.tsx b/src/app/(main)/blog-posts/edit/[id]/page.tsx deleted file mode 100644 index aa79207..0000000 --- a/src/app/(main)/blog-posts/edit/[id]/page.tsx +++ /dev/null @@ -1,127 +0,0 @@ -"use client"; - -import { Autocomplete, Box, Select, TextField } from "@mui/material"; -import MenuItem from "@mui/material/MenuItem"; -import { Edit, useAutocomplete } from "@refinedev/mui"; -import { useForm } from "@refinedev/react-hook-form"; -import { Controller } from "react-hook-form"; - -export default function BlogPostEdit() { - const { - saveButtonProps, - refineCore: { query, formLoading, onFinish }, - handleSubmit, - register, - control, - formState: { errors }, - } = useForm({}); - - const blogPostsData = query?.data?.data; - - const { autocompleteProps: categoryAutocompleteProps } = useAutocomplete({ - resource: "categories", - defaultValue: blogPostsData?.category?.id, - }); - - return ( - - - - ( - { - field.onChange(value.id); - }} - getOptionLabel={(item) => { - return ( - categoryAutocompleteProps?.options?.find((p) => { - const itemId = - typeof item === "object" - ? item?.id?.toString() - : item?.toString(); - const pId = p?.id?.toString(); - return itemId === pId; - })?.title ?? "" - ); - }} - isOptionEqualToValue={(option, value) => { - const optionId = option?.id?.toString(); - const valueId = - typeof value === "object" - ? value?.id?.toString() - : value?.toString(); - return value === undefined || optionId === valueId; - }} - renderInput={(params) => ( - - )} - /> - )} - /> - { - return ( - - ); - }} - /> - - - - ); -} diff --git a/src/app/(main)/blog-posts/layout.tsx b/src/app/(main)/blog-posts/layout.tsx deleted file mode 100644 index 4fa30f6..0000000 --- a/src/app/(main)/blog-posts/layout.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import authOptions from "@app/api/auth/[...nextauth]/options"; -import { Header } from "@components/header"; -import { ThemedLayout } from "@refinedev/mui"; -import { getServerSession } from "next-auth/next"; -import { redirect } from "next/navigation"; -import React from "react"; - -export default async function Layout({ children }: React.PropsWithChildren) { - const data = await getData(); - - if (!data.session?.user) { - return redirect("/login"); - } - - return {children}; -} - -async function getData() { - const session = await getServerSession(authOptions); - return { - session, - }; -} diff --git a/src/app/(main)/blog-posts/page.tsx b/src/app/(main)/blog-posts/page.tsx deleted file mode 100644 index 0ba64c9..0000000 --- a/src/app/(main)/blog-posts/page.tsx +++ /dev/null @@ -1,130 +0,0 @@ -"use client"; - -import { Typography } from "@mui/material"; -import { DataGrid, type GridColDef } from "@mui/x-data-grid"; -import { useMany } from "@refinedev/core"; -import { - DateField, - DeleteButton, - EditButton, - List, - ShowButton, - useDataGrid, -} from "@refinedev/mui"; -import React from "react"; - -export default function BlogPostList() { - const { result, dataGridProps } = useDataGrid({ - syncWithLocation: true, - }); - - const { - result: { data: categories }, - query: { isLoading: categoryIsLoading }, - } = useMany({ - resource: "categories", - ids: - result?.data?.map((item: any) => item?.category?.id).filter(Boolean) ?? - [], - queryOptions: { - enabled: !!result?.data, - }, - }); - - const columns = React.useMemo( - () => [ - { - field: "id", - headerName: "ID", - type: "number", - minWidth: 50, - display: "flex", - align: "left", - headerAlign: "left", - }, - { - field: "title", - headerName: "Title", - minWidth: 200, - display: "flex", - }, - { - field: "content", - flex: 1, - headerName: "Content", - minWidth: 250, - display: "flex", - renderCell: function render({ value }) { - if (!value) return "-"; - return ( - - {value} - - ); - }, - }, - { - field: "category", - headerName: "Category", - minWidth: 160, - display: "flex", - valueGetter: (_, row) => { - const value = row?.category; - return value; - }, - renderCell: function render({ value }) { - return categoryIsLoading ? ( - <>Loading... - ) : ( - categories?.find((item) => item.id === value?.id)?.title - ); - }, - }, - { - field: "status", - headerName: "Status", - minWidth: 80, - display: "flex", - }, - { - field: "createdAt", - headerName: "Created at", - minWidth: 120, - display: "flex", - renderCell: function render({ value }) { - return ; - }, - }, - { - field: "actions", - headerName: "Actions", - align: "right", - headerAlign: "right", - minWidth: 120, - sortable: false, - display: "flex", - renderCell: function render({ row }) { - return ( - <> - - - - - ); - }, - }, - ], - [categories, categoryIsLoading] - ); - - return ( - - - - ); -} diff --git a/src/app/(main)/blog-posts/show/[id]/page.tsx b/src/app/(main)/blog-posts/show/[id]/page.tsx deleted file mode 100644 index 6eb3f15..0000000 --- a/src/app/(main)/blog-posts/show/[id]/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -"use client"; - -import { Stack, Typography } from "@mui/material"; -import { useOne, useShow } from "@refinedev/core"; -import { - DateField, - MarkdownField, - Show, - TextFieldComponent as TextField, -} from "@refinedev/mui"; - -export default function BlogPostShow() { - const { result: record, query } = useShow({}); - - const { isLoading } = query; - - const { - result: category, - query: { isLoading: categoryIsLoading }, - } = useOne({ - resource: "categories", - id: record?.category?.id || "", - queryOptions: { - enabled: !!record, - }, - }); - - return ( - - - - {"ID"} - - - - - {"Title"} - - - - - {"Content"} - - - - - {"Category"} - - {categoryIsLoading ? <>Loading... : <>{category?.title}} - - {"Status"} - - - - - {"CreatedAt"} - - - - - ); -} diff --git a/src/app/(main)/categories/create/page.tsx b/src/app/(main)/categories/create/page.tsx deleted file mode 100644 index a09fddb..0000000 --- a/src/app/(main)/categories/create/page.tsx +++ /dev/null @@ -1,38 +0,0 @@ -"use client"; - -import { Box, TextField } from "@mui/material"; -import { Create } from "@refinedev/mui"; -import { useForm } from "@refinedev/react-hook-form"; - -export default function CategoryCreate() { - const { - saveButtonProps, - refineCore: { formLoading }, - register, - formState: { errors }, - } = useForm({}); - - return ( - - - - - - ); -} diff --git a/src/app/(main)/categories/edit/[id]/page.tsx b/src/app/(main)/categories/edit/[id]/page.tsx deleted file mode 100644 index 2a24b26..0000000 --- a/src/app/(main)/categories/edit/[id]/page.tsx +++ /dev/null @@ -1,37 +0,0 @@ -"use client"; - -import { Box, TextField } from "@mui/material"; -import { Edit } from "@refinedev/mui"; -import { useForm } from "@refinedev/react-hook-form"; - -export default function CategoryEdit() { - const { - saveButtonProps, - register, - formState: { errors }, - } = useForm({}); - - return ( - - - - - - ); -} diff --git a/src/app/(main)/categories/layout.tsx b/src/app/(main)/categories/layout.tsx deleted file mode 100644 index 4fa30f6..0000000 --- a/src/app/(main)/categories/layout.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import authOptions from "@app/api/auth/[...nextauth]/options"; -import { Header } from "@components/header"; -import { ThemedLayout } from "@refinedev/mui"; -import { getServerSession } from "next-auth/next"; -import { redirect } from "next/navigation"; -import React from "react"; - -export default async function Layout({ children }: React.PropsWithChildren) { - const data = await getData(); - - if (!data.session?.user) { - return redirect("/login"); - } - - return {children}; -} - -async function getData() { - const session = await getServerSession(authOptions); - return { - session, - }; -} diff --git a/src/app/(main)/categories/page.tsx b/src/app/(main)/categories/page.tsx deleted file mode 100644 index d78cf09..0000000 --- a/src/app/(main)/categories/page.tsx +++ /dev/null @@ -1,61 +0,0 @@ -"use client"; - -import { DataGrid, type GridColDef } from "@mui/x-data-grid"; -import { - DeleteButton, - EditButton, - List, - ShowButton, - useDataGrid, -} from "@refinedev/mui"; -import React from "react"; - -export default function CategoryList() { - const { dataGridProps } = useDataGrid({}); - - const columns = React.useMemo( - () => [ - { - field: "id", - headerName: "ID", - type: "number", - minWidth: 50, - display: "flex", - align: "left", - headerAlign: "left", - }, - { - field: "title", - flex: 1, - headerName: "Title", - minWidth: 200, - display: "flex", - }, - { - field: "actions", - headerName: "Actions", - align: "right", - headerAlign: "right", - minWidth: 120, - sortable: false, - display: "flex", - renderCell: function render({ row }) { - return ( - <> - - - - - ); - }, - }, - ], - [] - ); - - return ( - - - - ); -} diff --git a/src/app/(main)/categories/show/[id]/page.tsx b/src/app/(main)/categories/show/[id]/page.tsx deleted file mode 100644 index f6b96a8..0000000 --- a/src/app/(main)/categories/show/[id]/page.tsx +++ /dev/null @@ -1,27 +0,0 @@ -"use client"; - -import { Stack, Typography } from "@mui/material"; -import { useShow } from "@refinedev/core"; -import { Show, TextFieldComponent as TextField } from "@refinedev/mui"; - -export default function CategoryShow() { - const { query } = useShow({}); - const { data, isLoading } = query; - - const record = data?.data; - - return ( - - - - {"ID"} - - - - {"Title"} - - - - - ); -}