Merge branch 'zh' into 'main'
Zh See merge request prism/lable/labelmain!2
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
28
.gitlab-ci.yml
Normal file
28
.gitlab-ci.yml
Normal file
@@ -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"
|
||||
@@ -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 (
|
||||
<UnstyledButton
|
||||
<Text
|
||||
px={6}
|
||||
variant="transparent"
|
||||
onClick={async () => {
|
||||
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}
|
||||
</UnstyledButton>
|
||||
</Text>
|
||||
)
|
||||
},
|
||||
},
|
||||
|
||||
@@ -247,7 +247,10 @@ export default function PersonDashboardPage() {
|
||||
</SimpleGrid>
|
||||
</Group>
|
||||
|
||||
<SimpleGrid cols={{ base: 1, lg: 2 }} spacing="md" style={{ flex: 1 }}>
|
||||
<SimpleGrid
|
||||
cols={{ base: 1, lg: 2 }}
|
||||
spacing="md"
|
||||
style={{ flex: 1, maxHeight: "calc(100% - 194px)" }}>
|
||||
<Paper
|
||||
shadow="xs"
|
||||
withBorder
|
||||
|
||||
@@ -1,17 +1,28 @@
|
||||
"use client"
|
||||
|
||||
import { usePermissionStore } from "@/components/label/store/auth"
|
||||
import AppLayout from "@/components/layout/AppLayout"
|
||||
import { PathnameRecorder } from "@/components/layout/PathnameRecorder"
|
||||
import { componentList, showList } from "@/components/layout/common"
|
||||
import { useMemo } from "react"
|
||||
|
||||
async function getMenu() {
|
||||
return [...componentList, ...showList]
|
||||
}
|
||||
// async function getMenu() {
|
||||
// return [...componentList, ...showList]
|
||||
// }
|
||||
|
||||
export default function Layout({ children }: { children: React.ReactNode }) {
|
||||
const detailInfo = usePermissionStore((s) => 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 (
|
||||
<AppLayout menu={menu}>
|
||||
{children}
|
||||
|
||||
26
build.sh
26
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}"
|
||||
|
||||
@@ -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"
|
||||
|
||||
121
components/label/hooks/useAuth.ts
Normal file
121
components/label/hooks/useAuth.ts
Normal file
@@ -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
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
// 获取验证码
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user