diff --git a/.env.development b/.env.development
index dc0fe94..eb8bf3c 100644
--- a/.env.development
+++ b/.env.development
@@ -5,10 +5,10 @@ NEXT_PUBLIC_ENV=development
# redis
-# NEXT_PUBLIC_REDIS_URL="172.16.112.128"
-NEXT_PUBLIC_REDIS_URL="localhost"
+# NEXT_PUBLIC_REDIS_URL="172.16.115.128"
+NEXT_PUBLIC_REDIS_URL="172.30.21.213"
NEXT_PUBLIC_REDIS_PORT=9765
NEXT_PUBLIC_REDIS_PASSWORD=password
NEXT_PUBLIC_REDIS_USERNAME=default
-NEXT_PUBLIC_REDIS_DB=0
+NEXT_PUBLIC_REDIS_DB=1
diff --git a/.env.staging b/.env.staging
index 1fd59f4..edfe9c2 100644
--- a/.env.staging
+++ b/.env.staging
@@ -3,7 +3,7 @@ NEXT_PUBLIC_BASE_PATH=""
NEXT_PUBLIC_ENV=staging
# redis
-NEXT_PUBLIC_REDIS_URL="172.30.21.213"
+NEXT_PUBLIC_REDIS_URL="172.16.115.128"
NEXT_PUBLIC_REDIS_PORT=9765
NEXT_PUBLIC_REDIS_PASSWORD=password
NEXT_PUBLIC_REDIS_USERNAME=default
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..4380e73
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,28 @@
+stages:
+ - sync_github
+
+sync_github:
+ stage: sync_github
+ tags:
+ - webbuild
+ image: harbor.cowarobot.cn/softrepo/rust_build:1.94
+ script:
+ - echo "代码已合并到 main, 开始执行发布逻辑..."
+ - |
+ for i in {1..10}; do
+ if command -v docker >/dev/null 2>&1 && [ -S /var/run/docker.sock ]; then
+ echo "Docker is ready!"
+ break
+ fi
+ echo "Waiting for Docker..."
+ sleep 2
+ done
+ - docker info
+ - echo ${CI_PROJECT_NAME} ${CI_PROJECT_PATH} ${CI_PROJECT_DIR} ${CI_PROJECT_URL} ${CI_COMMIT_SHA}
+ - echo ${HARBORKEY} | docker login harbor.cowarobot.cn -u 'robot$softpro+cibuild' --password-stdin
+ - rm -rf ${CI_PROJECT_NAME}
+ - git clone https://oauth2:${TOKEN}@git.cowarobot.com/${CI_PROJECT_PATH}
+ - cd ${CI_PROJECT_NAME}
+ - bash build.sh prod
+ rules:
+ - if: $CI_COMMIT_BRANCH == "main"
diff --git a/app/person/dashboard/components/PersonalProjectTable.tsx b/app/person/dashboard/components/PersonalProjectTable.tsx
index 97e8c36..213aa6e 100644
--- a/app/person/dashboard/components/PersonalProjectTable.tsx
+++ b/app/person/dashboard/components/PersonalProjectTable.tsx
@@ -2,7 +2,7 @@
import { getPersonProjectDashBoard } from "@/components/label/api/project"
import { Project } from "@/components/label/api/project/typing"
-import { Button, Group, Text, UnstyledButton } from "@mantine/core"
+import { Button, Group, Text } from "@mantine/core"
import { IconRefresh } from "@tabler/icons-react"
import dayjs from "dayjs"
@@ -76,15 +76,16 @@ export default function PersonalProjectTable() {
width: 150,
render: (record: Project.PersonProjectDashboardResponseItem) => {
return (
- {
- setCurrentRowId(record.project_id)
- router.push(`/project/info/detail?id=${record.project_id}`)
+ false && setCurrentRowId(record.project_id)
+ false &&
+ router.push(`/project/info/detail?id=${record.project_id}`)
}}
title={record.project_id.toString()}
- c={"brand"}
+ // c={"brand"}
style={{
fontSize: "14px",
maxWidth: "100%",
@@ -93,7 +94,7 @@ export default function PersonalProjectTable() {
textOverflow: "ellipsis",
}}>
{record.project_id}
-
+
)
},
},
diff --git a/app/person/dashboard/page.tsx b/app/person/dashboard/page.tsx
index 0da1889..0640037 100644
--- a/app/person/dashboard/page.tsx
+++ b/app/person/dashboard/page.tsx
@@ -247,7 +247,10 @@ export default function PersonDashboardPage() {
-
+
s.detailInfo)
+
+ const menu = useMemo(() => {
+ if (detailInfo?.roles?.length) {
+ return [...componentList, ...showList]
+ } else {
+ return [...componentList, ...showList].filter(
+ (item) => item.title !== "管理中心"
+ )
+ }
+ }, [detailInfo?.roles?.length])
-export default async function Layout({
- children,
-}: {
- children: React.ReactNode
-}) {
- const menu = await getMenu()
return (
{children}
diff --git a/build.sh b/build.sh
index 18f4501..6745453 100755
--- a/build.sh
+++ b/build.sh
@@ -51,11 +51,11 @@ FLAG_PROD="${ENV}_latest"
cd $SHELL_FOLDER
-# 检查git状态
-echo -e "${GREEN}Checking git status...${NC}"
-git fetch
-git merge
-if [[ $? != 0 ]]; then echo -e "${RED}git pull error${NC}"; exit 100; fi
+# # 检查git状态
+# echo -e "${GREEN}Checking git status...${NC}"
+# git fetch
+# git merge
+# if [[ $? != 0 ]]; then echo -e "${RED}git pull error${NC}"; exit 100; fi
BRANCH_NAME=`git branch | grep "*"`
echo -e "${GREEN}Current branch: ${BRANCH_NAME/* /}${NC}"
@@ -71,23 +71,27 @@ pnpm run $BUILD_FLAG
if [[ $? != 0 ]]; then echo -e "${RED}build error${NC}"; exit 100; fi
# Docker构建和推送
-MAIN_NAME=digitalspace_labelmain
+MAIN_NAME=web_digitalspace_labelmain
DOCKER_FILE=$SHELL_FOLDER/Dockerfile
+HARBOR_REPO=softrepo
+if [[ $ENV == prod ]]; then
+ HARBOR_REPO=softpro
+fi
if [[ $OUTPUT_TYPE == export ]]; then
DOCKER_FILE=$SHELL_FOLDER/docker/nginx.dockerfile
- MAIN_NAME=digitalspace_labelmain_static
+ MAIN_NAME=web_digitalspace_labelmain_static
elif [[ $OUTPUT_TYPE == standalone ]]; then
DOCKER_FILE=$SHELL_FOLDER/docker/node.dockerfile
- MAIN_NAME=digitalspace_labelmain_ssr
+ MAIN_NAME=web_digitalspace_labelmain_ssr
fi
echo -e "${GREEN}Building docker image...${NC}"
-sudo docker build -f $DOCKER_FILE -t $MAIN_NAME $SHELL_FOLDER
+docker build -f $DOCKER_FILE -t $MAIN_NAME $SHELL_FOLDER
if [[ $? != 0 ]]; then echo -e "${RED}build docker with error${NC}"; exit 100; fi
echo -e "${GREEN}Tagging and pushing docker image...${NC}"
-sudo docker tag $MAIN_NAME harbor.cowarobot.cn/gopro/$MAIN_NAME:$FLAG_PROD
-# docker push harbor.cowarobot.cn/gopro/$MAIN_NAME:$FLAG_PROD
+docker tag $MAIN_NAME harbor.cowarobot.cn/$HARBOR_REPO/$MAIN_NAME:$FLAG_PROD
+docker push harbor.cowarobot.cn/$HARBOR_REPO/$MAIN_NAME:$FLAG_PROD
echo -e "${GREEN}Build completed successfully${NC}"
diff --git a/components/label/api/const.ts b/components/label/api/const.ts
index 8b520b4..5e1fb07 100644
--- a/components/label/api/const.ts
+++ b/components/label/api/const.ts
@@ -1,6 +1,6 @@
export const BASE_LABEL_API =
process.env.NEXT_PUBLIC_ENV === "production"
- ? "https://label.cowarobot.com"
+ ? "https://label.soft.cowarobot.com"
: process.env.NEXT_PUBLIC_ENV === "staging"
- ? "https://label.softtest.cowarobot.com"
+ ? "http://172.16.115.128:9110"
: "https://label.softtest.cowarobot.com"
diff --git a/components/label/hooks/useAuth.ts b/components/label/hooks/useAuth.ts
new file mode 100644
index 0000000..4114743
--- /dev/null
+++ b/components/label/hooks/useAuth.ts
@@ -0,0 +1,121 @@
+"use client"
+
+import { usePermissionStore } from "@/components/label/store/auth"
+import { usePathname } from "next/navigation"
+
+interface PermissionItem {
+ [x: string]: [boolean, null, string]
+}
+
+type PermissionMap = {
+ [x: string]: PermissionItem
+}
+
+const mappingList: { [x: string]: [string, string] } = {
+ "/project/own": ["project", "config"],
+ "/management/team/employee": ["user", "view"],
+ "/management/team/organization": ["user", "group_view"],
+ "/management/team/dailypaper": ["daily_work", "team_view"],
+ "/management/team/cost": ["settlement_form", "view"],
+ "/management/team/workload": ["workload", "view"],
+ "/management/team/sync_server": ["data_sync", "server_view"],
+ "/management/team/sync_task": ["data_sync", "task_view"],
+ "/management/team/board": ["user", "view"],
+}
+
+export const headerBarCheckItems = (data: PermissionMap) => {
+ const projectTitle = [
+ ["daily_work", "self_view"],
+ ["label_schema", "view"],
+ ["project", "view"],
+ ["task", "view"],
+ ] as const
+
+ let projectVisible = false
+ projectTitle.forEach(([prop, subProp]) => {
+ if (data[prop] && data[prop][subProp] && data[prop][subProp][0]) {
+ projectVisible = true
+ }
+ })
+
+ const staffTitle = [
+ ["daily_work", "team_view"],
+ ["user", "view"],
+ ["user", "group_view"],
+ ] as const
+
+ let staffVisible = false
+ staffTitle.forEach(([prop, subProp]) => {
+ if (data[prop] && data[prop][subProp] && data[prop][subProp][0]) {
+ staffVisible = true
+ }
+ })
+
+ return [projectVisible, staffVisible]
+}
+
+const useAuth = () => {
+ const pathname = usePathname()
+ const detailInfo = usePermissionStore((s) => s.detailInfo)
+ const permission = detailInfo?.permissions as PermissionMap | undefined
+ const roleName: string[] = detailInfo?.role_name ?? []
+
+ return {
+ hasPermission: () => {
+ if (
+ [
+ "/",
+ "/login",
+ "/management",
+ "/management/person/dashboard",
+ "/management/team",
+ ].includes(pathname)
+ ) {
+ return true
+ }
+
+ if (!permission) return false
+ if (mappingList[pathname]) {
+ const [prop, subProp] = mappingList[pathname]
+ return (
+ !!permission[prop] &&
+ !!permission[prop][subProp] &&
+ !!permission[prop][subProp][0]
+ )
+ }
+ return false
+ },
+ // path 跳转是否可见
+ canNv: (path: string, type = "view") => {
+ if (!permission) return false
+ if (mappingList[path]) {
+ const [prop] = mappingList[path]
+ return (
+ !!permission[prop] &&
+ !!permission[prop][type] &&
+ !!permission[prop][type][0]
+ )
+ }
+ return false
+ },
+ // 当前页面是否可见某个操作
+ isShow: (type = "view") => {
+ if (!permission) return false
+ if (mappingList[pathname]) {
+ const [prop] = mappingList[pathname]
+ return (
+ !!permission[prop] &&
+ !!permission[prop][type] &&
+ !!permission[prop][type][0]
+ )
+ }
+ return false
+ },
+ checkRole: (name: string) => {
+ if (!name) return false
+ return roleName.includes(name)
+ },
+ }
+}
+
+export default useAuth
diff --git a/components/label/store/auth.ts b/components/label/store/auth.ts
index ac584ce..5ef8fc5 100644
--- a/components/label/store/auth.ts
+++ b/components/label/store/auth.ts
@@ -263,8 +263,13 @@ export const useBackUrlStore = create(
(set) => ({
backUrl: null,
backTitle: null,
- setBackProps: (url: string, title?: string) =>
- set({ backUrl: url, backTitle: title || null }),
+ basePath: "",
+ setBackProps: (url: string, title?: string, basePath?: string) =>
+ set({
+ backUrl: url,
+ backTitle: title || null,
+ basePath: basePath || "",
+ }),
}),
{
name: "back_url",
diff --git a/components/layout/common.ts b/components/layout/common.ts
index 66d9bbe..f854411 100644
--- a/components/layout/common.ts
+++ b/components/layout/common.ts
@@ -32,22 +32,39 @@ export const subConfigList: { source: string; url: string }[] =
? [
{
source: "/image",
- url: "http://172.30.21.213:5532",
+ url: "http://172.16.115.128:5532",
},
{
source: "/video",
- url: "http://172.30.21.213:5533",
+ url: "http://172.16.115.128:5533",
},
{
source: "/lidar",
- url: "http://172.30.21.213:5534",
+ url: "http://172.16.115.128:5534",
},
{
source: "/mgt",
- url: "http://172.30.21.213:5535",
+ url: "http://172.16.115.128:5535",
+ },
+ ]
+ : [
+ {
+ source: "/image",
+ url: "https://label.soft.cowarobot.com",
+ },
+ {
+ source: "/video",
+ url: "https://label.soft.cowarobot.com",
+ },
+ {
+ source: "/lidar",
+ url: "https://label.soft.cowarobot.com",
+ },
+ {
+ source: "/mgt",
+ url: "https://label.soft.cowarobot.com",
},
]
- : []
const currentComponentList: MenuItem[] = [
{
@@ -81,11 +98,11 @@ export const componentList: MenuItem[] = [
url: "video",
icon: "SystemIcon",
},
- {
- title: "点云标注",
- url: "pointcloud",
- icon: "SystemIcon",
- },
+ // {
+ // title: "点云标注",
+ // url: "pointcloud",
+ // icon: "SystemIcon",
+ // },
{
title: "管理中心",
url: "mgt",
diff --git a/components/login/api/index.ts b/components/login/api/index.ts
index a4d5890..2075b43 100644
--- a/components/login/api/index.ts
+++ b/components/login/api/index.ts
@@ -4,9 +4,9 @@ import { Login } from "./types"
const BASE_PATH =
process.env.NEXT_PUBLIC_ENV === "production"
- ? "https://label.cowarobot.com"
+ ? "https://label.soft.cowarobot.com"
: process.env.NEXT_PUBLIC_ENV === "staging"
- ? "https://label.softtest.cowarobot.com"
+ ? "http://172.16.115.128:9110"
: "https://label.softtest.cowarobot.com"
// 获取验证码
diff --git a/docker-compose.yml b/docker-compose.yml
index 5d2e20e..c1136d6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,9 +1,9 @@
version: "3"
services:
- digitalspace_labelmain_ssr:
- container_name: digitalspace_labelmain_ssr
- image: harbor.cowarobot.cn/gopro/digitalspace_labelmain_ssr:stage_latest
+ web_digitalspace_labelmain_ssr:
+ container_name: web_digitalspace_labelmain_ssr
+ image: harbor.cowarobot.cn/softrepo/web_digitalspace_labelmain_ssr:stage_latest
restart: unless-stopped
ports:
- 5531:5531