Skip to content

Commit

Permalink
feat: v0.1.1用户管理 (dataelement#6)
Browse files Browse the repository at this point in the history
新增用户管理功能
mvp 版本的部分 bug 修复
  • Loading branch information
yaojin3616 committed Sep 7, 2023
2 parents 9431a6e + e06079c commit 7700935
Show file tree
Hide file tree
Showing 31 changed files with 952 additions and 276 deletions.
4 changes: 2 additions & 2 deletions src/frontend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
FROM node:14-alpine as frontend_build
FROM node:16-alpine as frontend_build
ARG BACKEND
WORKDIR /app
COPY . /app
RUN npm install
RUN npm install --force
RUN npm run build

FROM nginx
Expand Down
21 changes: 19 additions & 2 deletions src/frontend/nginx.conf
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
gzip on;
gzip_comp_level 2;
Expand All @@ -10,9 +15,21 @@ server {
listen 80;

location / {
root /usr/share/nginx/html;
root /data/webroot/bisheng;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}


location /api {
proxy_pass https://192.168.106.116:7860;
proxy_read_timeout 300s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
client_max_body_size 50m;
# proxy_set_header Connection "Upgrade";
}
}
8 changes: 5 additions & 3 deletions src/frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bisheng",
"version": "0.1.2",
"version": "0.0.2",
"private": true,
"dependencies": {
"@emotion/react": "^11.10.5",
Expand Down Expand Up @@ -71,8 +71,9 @@
"build": "vite build",
"serve": "vite preview",
"format": "npx prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
"test": "scp -r ./src/* [email protected]:/data/langflow/frontend/src",
"test120": "scp -r ./src/* [email protected]:/data/langflow/frontend120/src"
"demo": "scp -r ./build/* [email protected]:/data/webroot/bisheng",
"dev": "scp -r ./build/* [email protected]:/data/webroot/bisheng-dev",
"test": "scp -r ./build/* [email protected]:/data/webroot/bisheng-test"
},
"eslintConfig": {
"extends": [
Expand Down Expand Up @@ -115,6 +116,7 @@
"prettier-plugin-tailwindcss": "^0.3.0",
"tailwindcss": "^3.3.2",
"typescript": "^5.0.2",
"vite-plugin-static-copy": "^0.17.0",
"vite": "^4.3.9"
}
}
5 changes: 5 additions & 0 deletions src/frontend/src/App.css
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,11 @@
} */
}

.anwser-souce span{
color: #347ef9;
cursor: pointer;
}

@keyframes App-logo-spin {
from {
transform: rotate(0deg);
Expand Down
29 changes: 5 additions & 24 deletions src/frontend/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { locationContext } from "./contexts/locationContext";
import { TabsContext } from "./contexts/tabsContext";
import { LoginPage } from "./pages/login";
import router from "./routes";
import { userContext } from "./contexts/userContext";

export default function App() {
let { setCurrent, setShowSideBar, setIsStackedOpen } = useContext(locationContext);
Expand Down Expand Up @@ -121,34 +122,14 @@ export default function App() {
);
};

const localUserStr = localStorage.getItem('auth')
const localUser = localUserStr ? JSON.parse(atob(localUserStr)) : { name: '', role: '', time: Date.now() }
// if (Date.now() - localUser.time > 10 * 1000) localUser.name = ''
if (Date.now() - localUser.time > 24 * 60 * 60 * 1000) localUser.name = ''
const [user, setUser] = useState(localUser)
const handleLogin = (name, pwd) => {
if (name === '[email protected]' && pwd === 'admin') {
const data = { name: 'bisheng', role: 'admin', time: Date.now() }
setUser(data)
localStorage.setItem('auth', btoa(JSON.stringify(data)))
} else if (name === '[email protected]' && pwd === 'test') {
const data = { name: 'test', role: 'user', time: Date.now() }
setUser(data)
localStorage.setItem('auth', btoa(JSON.stringify(data)))
} else {
setErrorData({
title: "账号密码不正确: ",
list: [],
});
}
}
const { user, setUser } = useContext(userContext);

// 退出
useEffect(() => {
const handleKeyDown = (event) => {
if (event.ctrlKey && event.keyCode === 81) {
setUser({ name: '', role: '', time: Date.now() })
localStorage.setItem('auth', '')
setUser(null)
localStorage.setItem('UUR_INFO', '')
}
};
document.addEventListener('keydown', handleKeyDown);
Expand All @@ -171,7 +152,7 @@ export default function App() {
FallbackComponent={CrashErrorComponent}
>
{/* <Header /> */}
{!user.name ? <LoginPage onLogin={handleLogin}></LoginPage> : <RouterProvider router={router} />}
{user ? <RouterProvider router={router} /> : <LoginPage></LoginPage>}
</ErrorBoundary>
<div></div>
<div className="app-div" style={{ zIndex: 999 }}>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Info } from "lucide-react";
import React, { useContext, useEffect, useRef, useState } from "react";
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
import { Handle, Position, useUpdateNodeInternals } from "reactflow";
import ShadTooltip from "../../../../components/ShadTooltipComponent";
import CodeAreaComponent from "../../../../components/codeAreaComponent";
Expand Down Expand Up @@ -27,6 +27,7 @@ import {
nodeIconsLucide,
nodeNames,
} from "../../../../utils";
import CollectionNameComponent from "../../../../pages/FlowPage/components/CollectionNameComponent";

export default function ParameterComponent({
left,
Expand Down Expand Up @@ -64,18 +65,20 @@ export default function ParameterComponent({
useEffect(() => { }, [closePopUp, data.node.template]);

const { reactFlowInstance } = useContext(typesContext);
let disabled =
reactFlowInstance?.getEdges().some((e) => e.targetHandle === id) ?? false;
// 特殊处理milvus组件的 disabled
if (data.type === "Milvus"
&& name === 'collection_name'
&& reactFlowInstance?.getEdges().some((e) => e.targetHandle.indexOf('documents') !== -1
&& e.targetHandle.indexOf(data.id) !== -1)) {
disabled = true
}
let disabled = useMemo(() => {
let dis = reactFlowInstance?.getEdges().some((e) => e.targetHandle === id) ?? false;
// 特殊处理milvus组件的 disabled
if (data.type === "Milvus"
&& name === 'collection_name'
&& reactFlowInstance?.getEdges().some((e) => e.targetHandle.indexOf('documents') !== -1
&& e.targetHandle.indexOf(data.id) !== -1)) {
dis = true
}
return dis
}, [id, data, reactFlowInstance])
const [myData, setMyData] = useState(useContext(typesContext).data);

const handleOnNewValue = (newValue: any) => {
const handleOnNewValue = useCallback((newValue: any) => {
data.node.template[name].value = ['float', 'int'].includes(type) ? Number(newValue) : newValue;
// Set state to pending
setTabsState((prev) => {
Expand All @@ -87,7 +90,7 @@ export default function ParameterComponent({
},
};
});
};
}, [data, tabId]);

useEffect(() => {
infoHtml.current = (
Expand Down Expand Up @@ -241,8 +244,19 @@ export default function ParameterComponent({
value={data.node.template[name].value ?? ""}
onChange={handleOnNewValue}
/>
) : name === 'collection_name' ? (
// 知识库选择
<CollectionNameComponent
setNodeClass={(nodeClass) => {
data.node = nodeClass;
}}
nodeClass={data.node}
disabled={disabled}
value={data.node.template[name].value ?? ""}
onChange={handleOnNewValue}
/>
) : (
// 导航输入
// 单行输入
<InputComponent
disabled={disabled}
disableCopyPaste={true}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import ToggleShadComponent from "../../../../components/toggleShadComponent";
import { TabsContext } from "../../../../contexts/tabsContext";
import { typesContext } from "../../../../contexts/typesContext";
import { cleanEdges } from "../../../../util/reactflowUtils";
import CollectionNameComponent from "../../../../pages/FlowPage/components/CollectionNameComponent";

export default function L2ParameterComponent({
// id,
Expand Down Expand Up @@ -58,6 +59,17 @@ export default function L2ParameterComponent({
value={data.node.template[name].value ?? ""}
onChange={handleOnNewValue}
/>
) : name === 'collection_name' ? (
// 知识库选择
<CollectionNameComponent
setNodeClass={(nodeClass) => {
data.node = nodeClass;
}}
nodeClass={data.node}
disabled={disabled}
value={data.node.template[name].value ?? ""}
onChange={handleOnNewValue}
/>
) : (
<InputComponent
disabled={disabled}
Expand Down
5 changes: 4 additions & 1 deletion src/frontend/src/contexts/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import PopUpProvider from "./popUpContext";
import { TabsProvider } from "./tabsContext";
import { TypesProvider } from "./typesContext";
import { UndoRedoProvider } from "./undoRedoContext";
import { UserProvider } from "./userContext";

export default function ContextWrapper({ children }: { children: ReactNode }) {
//element to wrap all context
Expand All @@ -23,7 +24,9 @@ export default function ContextWrapper({ children }: { children: ReactNode }) {
<SSEProvider>
<TabsProvider>
<UndoRedoProvider>
<PopUpProvider>{children}</PopUpProvider>
<UserProvider>
<PopUpProvider>{children}</PopUpProvider>
</UserProvider>
</UndoRedoProvider>
</TabsProvider>
</SSEProvider>
Expand Down
30 changes: 30 additions & 0 deletions src/frontend/src/contexts/userContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { ReactNode, createContext, useState } from "react";

type userContextType = {
user: any;
setUser: (newState: any) => void;
}

const userInfoLocalStr = localStorage.getItem('UUR_INFO')
const initialValue = {
user: userInfoLocalStr ? JSON.parse(atob(userInfoLocalStr)) : null,
setUser: () => { }
}

console.log('initialValue :>> ', initialValue);

export const userContext = createContext<userContextType>(initialValue);

export function UserProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState(initialValue.user);

return (
<userContext.Provider
value={{
user, setUser
}}
>
{children}
</userContext.Provider>
);
}
38 changes: 38 additions & 0 deletions src/frontend/src/controllers/API/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,14 @@ export async function deleteFileLib(id) {
export async function deleteFile(id) {
return await axios.delete(`/api/v1/knowledge/file/${id}`);
}

/**
* 获取模型列表
*/
export async function getEmbeddingModel() {
return await axios.get(`/api/v1/knowledge/embedding_param`);
}

/**
* Sends data to the API for prediction.
*
Expand Down Expand Up @@ -325,6 +333,14 @@ export async function deleteFlowFromDatabase(flowId: string) {
}
}

/**
* 获取会话列表
*/
export const getChatsApi = () => {
return axios.get(`/api/v1/chat/list`)
};


/**
* 获取会话消息记录
*
Expand Down Expand Up @@ -507,3 +523,25 @@ export async function GPUlistApi() {
const response = await axios.get(`/api/v1/server/GPU`);
return response.data
}


/**
* ************************ user
*/

// 登录
export async function loginApi(name, pwd) {
return await axios.post(`/api/v1/user/login`, { user_name: name, password: pwd });
}
// 注册
export async function registerApi(name, pwd) {
return await axios.post(`/api/v1/user/regist`, { user_name: name, password: pwd });
}
// 用户列表
export async function getUsersApi(name: string, page: number, pageSize: number) {
return await axios.get(`/api/v1/user/list?page_num=${page}&page_size=${pageSize}&name=${name || ''}`)
}
// 修改用户状态(启\禁用)
export async function disableUserApi(userid, status) {
return await axios.post(`/api/v1/user/update`, { user_id: userid, delete: status });
}
Loading

0 comments on commit 7700935

Please sign in to comment.