diff --git a/.env.development b/.env.development
index 4ea0c46..e065a5f 100644
--- a/.env.development
+++ b/.env.development
@@ -1,4 +1,3 @@
# 前缀为NEXT_PUBLIC_才可以被浏览器使用
-NEXT_PUBLIC_TODO_REQUEST_URL=http://localhost:8090
-NEXT_PUBLIC_SECURITY_REQUEST_URL=http://localhost:8091
-NEXT_PUBLIC_PRIVATE_KEY=
\ No newline at end of file
+NEXT_PUBLIC_TODO_REQUEST_URL=http://localhost:8092
+NEXT_PUBLIC_SECURITY_REQUEST_URL=http://localhost:8091
\ No newline at end of file
diff --git a/.env.production b/.env.production
index 4691b0d..537f3c8 100644
--- a/.env.production
+++ b/.env.production
@@ -1 +1,2 @@
-NEXT_PUBLIC_TODO_REQUEST_URL=http://taskmanagerserver.com:8090
\ No newline at end of file
+NEXT_PUBLIC_TODO_REQUEST_URL=http://www.huaruyu.com/todo-server
+NEXT_PUBLIC_SECURITY_REQUEST_URL=http://www.huaruyu.com/security-server
\ No newline at end of file
diff --git a/docker/Dockerfile b/docker/Dockerfile
index e6df779..73f2133 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -5,4 +5,4 @@ COPY out /usr/share/nginx/html
EXPOSE 3001
CMD ["nginx", "-g", "daemon off;"]
# docker build -t task-manager-nginx .
-# docker run -d -p 3001:3001 --restart unless-stopped -v ./out:/usr/share/nginx/html --name task-manager-nginx task-manager-nginx
+# docker run -d -p 3001:3001 --network task-manager --restart unless-stopped -v ./out:/usr/share/nginx/html --name task-manager-nginx task-manager-nginx
diff --git a/docker/nginx.conf b/docker/nginx.conf
index 0056077..0a2c2bc 100644
--- a/docker/nginx.conf
+++ b/docker/nginx.conf
@@ -30,6 +30,48 @@ http {
try_files $uri $uri.html $uri/ =404;
# try_files $uri $uri/ =404;
}
+ location ^~ /todo-server {
+ rewrite ^/todo-server/(.*)$ /$1 break;
+ proxy_pass http://huayu-platform-todo:8092;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ client_body_buffer_size 16k;
+ client_max_body_size 100M;
+
+ add_header 'Access-Control-Allow-Origin' '*';
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Origin, Authorization, Content-Type, Accept, X-Requested-With';
+
+ # 如果请求方法为 OPTIONS,则直接返回 204 状态码
+ if ($request_method = 'OPTIONS') {
+ add_header 'Access-Control-Allow-Origin' '*';
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Origin, Authorization, Content-Type, Accept, X-Requested-With';
+ return 204;
+ }
+ }
+ location ^~ /security-server {
+ rewrite ^/security-server/(.*)$ /$1 break;
+ proxy_pass http://huayu-platform-security:8091;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ client_body_buffer_size 16k;
+ client_max_body_size 100M;
+
+ add_header 'Access-Control-Allow-Origin' '*';
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Origin, Authorization, Content-Type, Accept, X-Requested-With';
+
+ # 如果请求方法为 OPTIONS,则直接返回 204 状态码
+ if ($request_method = 'OPTIONS') {
+ add_header 'Access-Control-Allow-Origin' '*';
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
+ add_header 'Access-Control-Allow-Headers' 'Origin, Authorization, Content-Type, Accept, X-Requested-With';
+ return 204;
+ }
+ }
location /task/ {
rewrite ^/task/(.*)$ /task/$1.html break;
}
diff --git a/src/app/favicon.ico b/src/app/favicon.ico
deleted file mode 100644
index 718d6fe..0000000
Binary files a/src/app/favicon.ico and /dev/null differ
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index b2e603d..57403f7 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -20,6 +20,10 @@ export default function RootLayout({
+
+ 任务管理
+
+
{children}
);
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
index ba279aa..cd16487 100644
--- a/src/app/login/page.tsx
+++ b/src/app/login/page.tsx
@@ -8,18 +8,18 @@ import {
WeiboOutlined,
} from '@ant-design/icons';
import {
+ LoginForm,
LoginFormPage,
ProConfigProvider,
ProFormCaptcha,
ProFormCheckbox,
ProFormText,
} from '@ant-design/pro-components';
-import {Button, Divider, Space, Tabs, message, theme} from 'antd';
+import { Divider, Space, Tabs, message, theme} from 'antd';
import type {CSSProperties} from 'react';
import {useState} from 'react';
import {LoginObject} from "@/lib/login/definitions";
import {httpReq} from "@/utils/axiosReq";
-import Cookies from 'js-cookie';
import { useRouter } from 'next/navigation'
type LoginType = 'phone' | 'account';
@@ -31,9 +31,10 @@ const iconStyles: CSSProperties = {
};
const Page = () => {
- const [loginType, setLoginType] = useState('phone');
+ const [loginType, setLoginType] = useState('account');
const {token} = theme.useToken();
const router = useRouter()
+ const [messageApi, contextHolder] = message.useMessage();
return (
{
height: '100vh',
}}
>
-
{
console.log("登录信息:"+formData.username+";"+formData.password)
httpReq.post(process.env.NEXT_PUBLIC_SECURITY_REQUEST_URL+"/stateless/login/username",{
@@ -73,72 +75,77 @@ const Page = () => {
// 删除名为 'platform-security' 的Cookie
// Cookies.remove('platform-security');
// 设置一个有效期为7天的Cookie
- Cookies.set('platform-security', response.data.data, { expires: 7 });
+ // Cookies.set('platform-security', response.data.data, { expires: 7 });
// 登录成功,跳转到首页或者回调
router.push('/task/project')
+ }else{
+ messageApi.open({
+ type: 'error',
+ content: response.data.status.message,
+ })
};
})
}}
- actions={
-
-
-
- 其他登录方式
-
-
-
-
-
-
-
-
-
-
-
-
- }
+ // actions={
+ //
+ //
+ //
+ // 其他登录方式
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ // }
>
{
忘记密码
-
+
);
};
-export default () => {
+export default function Login(){
return (
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 00b50c1..97e6b88 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -6,7 +6,7 @@ import {useEffect} from "react";
export default function Home() {
const {replace} = useRouter();
useEffect(()=>{
- replace("/task/four")
+ replace("/login")
},[])
dayjs.locale('zh-cn')
return (
diff --git a/src/lib/definitions.ts b/src/lib/definitions.ts
index ae0862a..16fad12 100644
--- a/src/lib/definitions.ts
+++ b/src/lib/definitions.ts
@@ -29,9 +29,9 @@ export type ResponseVO={
export type DataType ={
key: React.ReactNode;
- id: number;
- pid:number;
- pPid:number;
+ id: string;
+ pid:string;
+ pPid:string;
code: string;
name: string;
description: string;
diff --git a/src/lib/task/project/data.tsx b/src/lib/task/project/data.tsx
index a757137..2eaccdb 100644
--- a/src/lib/task/project/data.tsx
+++ b/src/lib/task/project/data.tsx
@@ -2,111 +2,67 @@ import {unstable_noStore as noStore} from 'next/cache';
import {AxiosResponse} from "axios";
import {httpReq} from "@/utils/axiosReq";
import {DataType, DictType, ResponseVO, ResultPage} from "@/lib/definitions";
-export async function getTaskTreeResult(requestParam:string): Promise>> {
+
+export async function getTaskTreeResult(requestParam: string): Promise>> {
noStore();
- try {
- // 使用 Axios 发送 POST 请求获取数据
- const response: AxiosResponse>> = await httpReq.get(
- process.env.NEXT_PUBLIC_TODO_REQUEST_URL+'/search/task_message_tree?search='+encodeURIComponent(requestParam));
- // 从响应中提取数据并返回
- console.log("response.data",response.data)
- return response.data;
- } catch (error) {
- // 处理错误
- console.error('Error fetching data:', error);
- // 返回一个默认值或者抛出错误
- throw new Error('Failed to fetch data');
- }
+ // 使用 Axios 发送 POST 请求获取数据
+ const response: AxiosResponse>> = await httpReq.get(
+ process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/search/task_message_tree?search=' + encodeURIComponent(requestParam));
+ // 从响应中提取数据并返回
+ console.log("response.data", response.data)
+ return response.data;
}
-export async function commonUpdate(requestParam:any): Promise> {
+
+export async function commonUpdate(requestParam: any): Promise> {
noStore();
- try {
- // 使用 Axios 发送 PUT 请求获取数据
- const response: AxiosResponse> = await httpReq.put(
- process.env.NEXT_PUBLIC_TODO_REQUEST_URL+'/search/task_message_tree',requestParam);
- // 从响应中提取数据并返回
- return response.data;
- } catch (error) {
- // 处理错误
- console.error('Error fetching data:', error);
- // 返回一个默认值或者抛出错误
- throw new Error('Failed to fetch data');
- }
+ // 使用 Axios 发送 PUT 请求获取数据
+ const response: AxiosResponse> = await httpReq.put(
+ process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/search/task_message_tree', requestParam);
+ // 从响应中提取数据并返回
+ return response.data;
}
export async function taskTreeResult(): Promise>> {
noStore();
- try {
- // 使用 httpReq 发送 POST 请求获取数据
- const response: AxiosResponse>> = await httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL+'/task/tree', {
- pageSize: 10,
- pageNumber: 1
- });
- // 从响应中提取数据并返回
- return response.data;
- } catch (error) {
- // 处理错误
- console.error('Error fetching data:', error);
- // 返回一个默认值或者抛出错误
- throw new Error('Failed to fetch data');
- }
-}
-export async function getTask(id:number): Promise> {
- noStore();
- try {
- // 使用 Axios 发送 GET 请求获取数据
- const response: AxiosResponse> = await httpReq.get(process.env.NEXT_PUBLIC_TODO_REQUEST_URL+'/task/'+id);
- // 从响应中提取数据并返回
- return response.data;
- } catch (error) {
- // 处理错误
- console.error('Error fetching data:', error);
- // 返回一个默认值或者抛出错误
- throw new Error('Failed to fetch data');
- }
+ // 使用 httpReq 发送 POST 请求获取数据
+ const response: AxiosResponse>> = await httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task/tree', {
+ pageSize: 10,
+ pageNumber: 1
+ });
+ // 从响应中提取数据并返回
+ return response.data;
}
-export async function addTask(task:DataType): Promise> {
+export async function getTask(id: string): Promise> {
noStore();
- try {
- // 使用 Axios 发送 POST 请求添加数据
- const response: AxiosResponse> = await httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL+'/task', task);
- // 从响应中提取数据并返回
- return response.data;
- } catch (error) {
- // 处理错误
- console.error('Error fetching data:', error);
- // 返回一个默认值或者抛出错误
- throw new Error('Failed to fetch data');
- }
+ // 使用 Axios 发送 GET 请求获取数据
+ const response: AxiosResponse> = await httpReq.get(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task/' + id);
+ // 从响应中提取数据并返回
+ return response.data;
}
-export async function updateTask(task:DataType): Promise> {
+
+export async function addTask(task: DataType): Promise> {
noStore();
- try {
- // 使用 Axios 发送 PUT 请求修改数据
- const response: AxiosResponse> = await httpReq.put(process.env.NEXT_PUBLIC_TODO_REQUEST_URL+'/task', task);
- // 从响应中提取数据并返回
- return response.data;
- } catch (error) {
- // 处理错误
- console.error('Error fetching data:', error);
- // 返回一个默认值或者抛出错误
- throw new Error('Failed to fetch data');
- }
+ // 使用 Axios 发送 POST 请求添加数据
+ const response: AxiosResponse> = await httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task', task);
+ // 从响应中提取数据并返回
+ return response.data;
}
-export async function deleteTask(id:number): Promise> {
+
+export async function updateTask(task: DataType): Promise> {
noStore();
- try {
- // 使用 Axios 发送 DELETE 删除数据
- const response: AxiosResponse> = await httpReq.delete(process.env.NEXT_PUBLIC_TODO_REQUEST_URL+'/task/'+id);
- // 从响应中提取数据并返回
- return response.data;
- } catch (error) {
- // 处理错误
- console.error('Error fetching data:', error);
- // 返回一个默认值或者抛出错误
- throw new Error('Failed to fetch data');
- }
+ // 使用 Axios 发送 PUT 请求修改数据
+ const response: AxiosResponse> = await httpReq.put(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task', task);
+ // 从响应中提取数据并返回
+ return response.data;
+}
+
+export async function deleteTask(id: string): Promise> {
+ noStore();
+ // 使用 Axios 发送 DELETE 删除数据
+ const response: AxiosResponse> = await httpReq.delete(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task/' + id);
+ // 从响应中提取数据并返回
+ return response.data;
}
//0,重要紧急红色,1,重要不紧急黄色,2,不重要紧急灰色,3不重要,不紧急绿色
@@ -124,7 +80,7 @@ export const taskPriorityList: DictType[] = [
order: 1,
color: 'yellow'
}, {
- id:1,
+ id: 1,
code: '1',
name: '不重要紧急',
order: 2,
@@ -210,6 +166,7 @@ export const taskStateList: DictType[] = [
color: 'YELLOW'
}
]
+
export enum OPERATION_BUTTON_TYPE {
DETAIL,
ADD_CHILD,
diff --git a/src/ui/task/OperationButton.tsx b/src/ui/task/OperationButton.tsx
index 256bf11..7eea369 100644
--- a/src/ui/task/OperationButton.tsx
+++ b/src/ui/task/OperationButton.tsx
@@ -1,23 +1,22 @@
import React, {Fragment} from "react";
import {Button, Dropdown, MenuProps, message, Modal, Popconfirm, Space} from "antd";
import {DownOutlined, QuestionCircleOutlined} from "@ant-design/icons";
-import {DetailForm} from "@/ui/task/four/DetailForm";
import {commonUpdate, deleteTask, OPERATION_BUTTON_TYPE} from "@/lib/task/project/data";
import Link from "next/link";
import {DetailModelForm} from "@/ui/task/project/DetailModelForm";
export interface OperationButtonProps {
- itemId: number,
- pid: number,
- pPid: number,
+ itemId: string,
+ pid: string,
+ pPid: string,
operationId?: string,
refreshDate?: () => void,
}
interface OperationModelProps {
operationId: number,
- pPid: number,
- pid: number,
+ pPid: string,
+ pid: string,
openModal: boolean
}
diff --git a/src/ui/task/project/DetailModelForm.tsx b/src/ui/task/project/DetailModelForm.tsx
index d7b6a52..4157b95 100644
--- a/src/ui/task/project/DetailModelForm.tsx
+++ b/src/ui/task/project/DetailModelForm.tsx
@@ -20,10 +20,10 @@ import dayjs, {Dayjs} from "dayjs";
export type DetailModelFormProps={
// 当前内容id
- itemId?: number,
- pid?:number,
+ itemId?: string,
+ pid?:string,
// 祖宗任务id
- pPid?:number,
+ pPid?:string,
// 操作id
operationId: number,
// 标题描述
@@ -37,12 +37,12 @@ export type DetailModelFormProps={
// 重新加载数据
reloadData?: () => void
}
-export type PidSelectTree= { label: string; value: number;pid:number; children?: PidSelectTree[] }
+export type PidSelectTree= { label: string; value: string;pid:string; children?: PidSelectTree[] }
export const DetailModelForm: React.FC = (props) => {
console.log("DetailModelForm:props:",props)
const [form] = Form.useForm();
- const [pid, setPid] = useState(props.pid?props.pid:0);
+ const [pid, setPid] = useState(props.pid?props.pid:'0');
const [editFormDisable, setEditFormDisable] = useState(props.operationId === OPERATION_BUTTON_TYPE.DETAIL)
useEffect(() => {
if (props.itemId!=undefined&&(
@@ -58,6 +58,7 @@ export const DetailModelForm: React.FC = (props) => {
task.data.expectedTimeRange = [task.data.expectedStartTime ? dayjs(task.data.expectedStartTime) : undefined,
task.data.expectedEndTime ? dayjs(task.data.expectedEndTime) : undefined];
form.setFieldsValue(task.data)
+ console.log("form.setFieldsValue(task.data)"+JSON.stringify(task.data))
} else {
message.error(task.status.message);
props.reloadData?.()
@@ -99,7 +100,7 @@ export const DetailModelForm: React.FC = (props) => {
props.reloadData?.();
},
}}
- submitter={props.itemId!==undefined&&props.itemId!==-1?{
+ submitter={props.itemId!==undefined&&props.itemId!=='-1'?{
render: (prop, defaultDoms) => {
return [
editFormDisable?