feat:backup
This commit is contained in:
parent
15960748be
commit
ccfb6136c5
67
README.md
67
README.md
|
@ -1,36 +1,37 @@
|
||||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
# 任务管理小应用
|
||||||
|
平时事情不多但是容易忘记,最近也在学习react,便开发了这个应用。
|
||||||
|
|
||||||
## Getting Started
|
应用将任务分为两种类型来管理:任务树和[四象线](https://baike.baidu.com/item/%E5%9B%9B%E8%B1%A1%E9%99%90%E6%B3%95/4228184?fr=ge_ala)任务管理
|
||||||
|
## 任务树
|
||||||
|
1. 层级展示任务
|
||||||
|
2. 可在操作中四象线展示子任务
|
||||||
|
## 四象线
|
||||||
|
1. 向上重要
|
||||||
|
2. 向左紧急
|
||||||
|
|
||||||
First, run the development server:
|
## 项目启动
|
||||||
|
### 后端服务启动
|
||||||
```bash
|
1. 后端启动应用需求:docker,redis,mysql8。
|
||||||
npm run dev
|
2. jar通过docker打入镜像中,无需java环境。
|
||||||
# or
|
3. 使用docker/Dockerfile-server文件构建镜像及运行容器
|
||||||
yarn dev
|
4. 通过docker/hosts修改自己数据库ip和redis的ip
|
||||||
# or
|
5. 数据库端口:3306,数据库名:task_manager,数据库用户名及密码:task_manager_user/TaskMU0001,redis:无密码认证。(此条内容目前代码写死,后期修改为可配置)
|
||||||
pnpm dev
|
构建镜像
|
||||||
# or
|
```shell
|
||||||
bun dev
|
docker build -t task-manager-server -f Dockerfile-server .
|
||||||
|
```
|
||||||
|
运行
|
||||||
|
```shell
|
||||||
|
docker run -d -p 8090:8090 --restart unless-stopped -v ./hosts:/etc/hosts --name task-manager-server task-manager-server
|
||||||
|
```
|
||||||
|
### 前端项目启动
|
||||||
|
1. 前端启动应用需求:docker
|
||||||
|
2. 需要在电脑hosts(linux地址/etc/hosts,windows地址C:\Windows\System32\drivers\etc\hosts)中配置后端运行环境地址,例如添加:127.0.0.1 taskmanagerserver.com
|
||||||
|
构建镜像
|
||||||
|
```shell
|
||||||
|
docker build -t task-manager-nginx .
|
||||||
|
```
|
||||||
|
运行
|
||||||
|
```shell
|
||||||
|
docker run -d -p 3001:3001 --restart unless-stopped --name task-manager-nginx task-manager-nginx
|
||||||
```
|
```
|
||||||
|
|
||||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
||||||
|
|
||||||
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
|
||||||
|
|
||||||
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
|
|
||||||
|
|
||||||
## Learn More
|
|
||||||
|
|
||||||
To learn more about Next.js, take a look at the following resources:
|
|
||||||
|
|
||||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
||||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
||||||
|
|
||||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
|
||||||
|
|
||||||
## Deploy on Vercel
|
|
||||||
|
|
||||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
||||||
|
|
||||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
|
||||||
|
|
|
@ -5,4 +5,4 @@ COPY out /usr/share/nginx/html
|
||||||
EXPOSE 3001
|
EXPOSE 3001
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
# docker build -t task-manager-nginx .
|
# docker build -t task-manager-nginx .
|
||||||
# docker run -d -p 3001:3001 --name task-manager-nginx task-manager-nginx
|
# docker run -d -p 3001:3001 --restart unless-stopped --name task-manager-nginx task-manager-nginx
|
||||||
|
|
|
@ -5,4 +5,4 @@ EXPOSE 8090
|
||||||
CMD ["java", "-jar", "task-manager-server.jar"]
|
CMD ["java", "-jar", "task-manager-server.jar"]
|
||||||
# 指定文件名 当前路径
|
# 指定文件名 当前路径
|
||||||
# docker build -t task-manager-server -f Dockerfile-server .
|
# docker build -t task-manager-server -f Dockerfile-server .
|
||||||
# docker run -d -p 8090:8090 --name task-manager-server task-manager-server
|
# docker run -d -p 8090:8090 --restart unless-stopped -v ./hosts:/etc/hosts --name task-manager-server task-manager-server
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
127.0.0.1 localhost
|
||||||
|
10.0.2.15 task-manager-server-mysql
|
||||||
|
10.0.2.15 task-manager-server-redis
|
|
@ -21,15 +21,18 @@ http {
|
||||||
server_name localhost;
|
server_name localhost;
|
||||||
# 访问日志路径
|
# 访问日志路径
|
||||||
access_log /var/log/nginx/access.log;
|
access_log /var/log/nginx/access.log;
|
||||||
|
# 站点根目录
|
||||||
|
root /usr/share/nginx/html;
|
||||||
# 代理配置
|
# 代理配置
|
||||||
location / {
|
location / {
|
||||||
# 站点根目录
|
|
||||||
root /usr/share/nginx/html;
|
|
||||||
# 默认页面
|
# 默认页面
|
||||||
index index.html index.htm;
|
index index.html index.htm;
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri.html $uri/ =404;
|
||||||
# try_files $uri $uri/ =404;
|
# try_files $uri $uri/ =404;
|
||||||
}
|
}
|
||||||
|
location /task/ {
|
||||||
|
rewrite ^/task/(.*)$ /task/$1.html break;
|
||||||
|
}
|
||||||
# 静态文件缓存配置
|
# 静态文件缓存配置
|
||||||
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
|
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
|
||||||
expires 7d;
|
expires 7d;
|
||||||
|
|
Binary file not shown.
|
@ -1,6 +1,14 @@
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
output: 'export',
|
output: 'export',
|
||||||
|
// Optional: Change links `/me` -> `/me/` and emit `/me.html` -> `/me/index.html`
|
||||||
|
// trailingSlash: true,
|
||||||
|
|
||||||
|
// Optional: Prevent automatic `/me` -> `/me/`, instead preserve `href`
|
||||||
|
// skipTrailingSlashRedirect: true,
|
||||||
|
|
||||||
|
// Optional: Change the output directory `out` -> `dist`
|
||||||
|
// distDir: 'dist',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
|
|
@ -41,7 +41,7 @@ export type DataType ={
|
||||||
action?:React.ReactNode;
|
action?:React.ReactNode;
|
||||||
expectedStartTime?:Date|string;
|
expectedStartTime?:Date|string;
|
||||||
expectedEndTime?:Date;
|
expectedEndTime?:Date;
|
||||||
expectedTimeRange?:(string|Dayjs)[];
|
expectedTimeRange?:(string|Dayjs|undefined)[];
|
||||||
actualStartTime?:Date;
|
actualStartTime?:Date;
|
||||||
actualEndTime?:Date;
|
actualEndTime?:Date;
|
||||||
actualTimeRange?:(string|Dayjs)[]
|
actualTimeRange?:(string|Dayjs)[]
|
||||||
|
|
|
@ -8,7 +8,7 @@ export async function getTaskTreeResult(requestParam:string): Promise<ResponseVO
|
||||||
|
|
||||||
// 使用 Axios 发送 POST 请求获取数据
|
// 使用 Axios 发送 POST 请求获取数据
|
||||||
const response: AxiosResponse<ResponseVO<ResultPage<DataType>>> = await axios.get(
|
const response: AxiosResponse<ResponseVO<ResultPage<DataType>>> = await axios.get(
|
||||||
'http://localhost:8090/search/task_message_tree?search='+encodeURIComponent(requestParam));
|
'http://taskmanagerserver.com:8090/search/task_message_tree?search='+encodeURIComponent(requestParam));
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -23,7 +23,7 @@ export async function commonUpdate(requestParam:any): Promise<ResponseVO<string>
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 PUT 请求获取数据
|
// 使用 Axios 发送 PUT 请求获取数据
|
||||||
const response: AxiosResponse<ResponseVO<string>> = await axios.put(
|
const response: AxiosResponse<ResponseVO<string>> = await axios.put(
|
||||||
'http://localhost:8090/search/task_message_tree',requestParam);
|
'http://taskmanagerserver.com:8090/search/task_message_tree',requestParam);
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -38,7 +38,7 @@ export async function taskTreeResult(): Promise<ResponseVO<ResultPage<DataType>>
|
||||||
noStore();
|
noStore();
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 POST 请求获取数据
|
// 使用 Axios 发送 POST 请求获取数据
|
||||||
const response: AxiosResponse<ResponseVO<ResultPage<DataType>>> = await axios.post('http://localhost:8090/task/tree', {
|
const response: AxiosResponse<ResponseVO<ResultPage<DataType>>> = await axios.post('http://taskmanagerserver.com:8090/task/tree', {
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
pageNumber: 1
|
pageNumber: 1
|
||||||
});
|
});
|
||||||
|
@ -55,7 +55,7 @@ export async function getTask(id:number): Promise<ResponseVO<DataType>> {
|
||||||
noStore();
|
noStore();
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 GET 请求获取数据
|
// 使用 Axios 发送 GET 请求获取数据
|
||||||
const response: AxiosResponse<ResponseVO<DataType>> = await axios.get('http://localhost:8090/task/'+id);
|
const response: AxiosResponse<ResponseVO<DataType>> = await axios.get('http://taskmanagerserver.com:8090/task/'+id);
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -70,7 +70,7 @@ export async function addTask(task:DataType): Promise<ResponseVO<string>> {
|
||||||
noStore();
|
noStore();
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 POST 请求添加数据
|
// 使用 Axios 发送 POST 请求添加数据
|
||||||
const response: AxiosResponse<ResponseVO<string>> = await axios.post('http://localhost:8090/task', task);
|
const response: AxiosResponse<ResponseVO<string>> = await axios.post('http://taskmanagerserver.com:8090/task', task);
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -84,7 +84,7 @@ export async function updateTask(task:DataType): Promise<ResponseVO<string>> {
|
||||||
noStore();
|
noStore();
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 PUT 请求修改数据
|
// 使用 Axios 发送 PUT 请求修改数据
|
||||||
const response: AxiosResponse<ResponseVO<string>> = await axios.put('http://localhost:8090/task', task);
|
const response: AxiosResponse<ResponseVO<string>> = await axios.put('http://taskmanagerserver.com:8090/task', task);
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -98,7 +98,7 @@ export async function deleteTask(id:number): Promise<ResponseVO<string>> {
|
||||||
noStore();
|
noStore();
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 DELETE 删除数据
|
// 使用 Axios 发送 DELETE 删除数据
|
||||||
const response: AxiosResponse<ResponseVO<string>> = await axios.delete('http://localhost:8090/task/'+id);
|
const response: AxiosResponse<ResponseVO<string>> = await axios.delete('http://taskmanagerserver.com:8090/task/'+id);
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -113,7 +113,7 @@ export async function editState(id:number,state:number): Promise<ResponseVO<stri
|
||||||
noStore();
|
noStore();
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 DELETE 删除数据
|
// 使用 Axios 发送 DELETE 删除数据
|
||||||
const response: AxiosResponse<ResponseVO<string>> = await axios.patch('http://localhost:8090/task/'+id);
|
const response: AxiosResponse<ResponseVO<string>> = await axios.patch('http://taskmanagerserver.com:8090/task/'+id);
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -128,7 +128,7 @@ export async function editPriority(id:number,priority:number): Promise<ResponseV
|
||||||
noStore();
|
noStore();
|
||||||
try {
|
try {
|
||||||
// 使用 Axios 发送 DELETE 删除数据
|
// 使用 Axios 发送 DELETE 删除数据
|
||||||
const response: AxiosResponse<ResponseVO<string>> = await axios.patch('http://localhost:8090/task/'+id);
|
const response: AxiosResponse<ResponseVO<string>> = await axios.patch('http://taskmanagerserver.com:8090/task/'+id);
|
||||||
// 从响应中提取数据并返回
|
// 从响应中提取数据并返回
|
||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
'use client'
|
'use client'
|
||||||
import React from "react";
|
import React, {Fragment} from "react";
|
||||||
import {TitleOperation} from "@/app/ui/task/TitleOperation";
|
import {TitleOperation} from "@/app/ui/task/TitleOperation";
|
||||||
import LocalContext from "@/app/ui/LocalContent";
|
import LocalContext from "@/app/ui/LocalContent";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
|
@ -20,7 +20,7 @@ export default function Layout({children}: { children: React.ReactNode }) {
|
||||||
|
|
||||||
console.log('taskState,expectedStartTime,refreshDataFlag', taskState, expectedStartTime, refreshDataFlag)
|
console.log('taskState,expectedStartTime,refreshDataFlag', taskState, expectedStartTime, refreshDataFlag)
|
||||||
return (
|
return (
|
||||||
<div>
|
<Fragment>
|
||||||
<ConfigProvider
|
<ConfigProvider
|
||||||
theme={{
|
theme={{
|
||||||
components: {
|
components: {
|
||||||
|
@ -41,6 +41,6 @@ export default function Layout({children}: { children: React.ReactNode }) {
|
||||||
{children}
|
{children}
|
||||||
</LocalContext.Provider>
|
</LocalContext.Provider>
|
||||||
</ConfigProvider>
|
</ConfigProvider>
|
||||||
</div>
|
</Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ export const TitleOperation: React.FC<TitleOperationProps> = ({
|
||||||
expectStartTimeParseResult[0]&&expectStartTimeParseResult[0].value ? dayjs(expectStartTimeParseResult[0].value.toString()) : undefined,
|
expectStartTimeParseResult[0]&&expectStartTimeParseResult[0].value ? dayjs(expectStartTimeParseResult[0].value.toString()) : undefined,
|
||||||
expectStartTimeParseResult[1]&&expectStartTimeParseResult[1].value ? dayjs(expectStartTimeParseResult[1].value.toString()) : undefined
|
expectStartTimeParseResult[1]&&expectStartTimeParseResult[1].value ? dayjs(expectStartTimeParseResult[1].value.toString()) : undefined
|
||||||
];
|
];
|
||||||
return <Space style={{marginTop: 0}}>
|
return <Space style={{marginTop: 0 ,"height": "42px", "alignContent": "center"}}>
|
||||||
<DetailModelForm operationId={OPERATION_BUTTON_TYPE.ADD} description='添加主线任务' reloadData={refreshData}/>
|
<DetailModelForm operationId={OPERATION_BUTTON_TYPE.ADD} description='添加主线任务' reloadData={refreshData}/>
|
||||||
{usePathname().startsWith("/task/project") ?
|
{usePathname().startsWith("/task/project") ?
|
||||||
<>
|
<>
|
||||||
|
|
|
@ -66,6 +66,9 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
|
||||||
props.handleCancel()
|
props.handleCancel()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}else if(props.operationId === OPERATION_BUTTON_TYPE.ADD|| props.operationId === OPERATION_BUTTON_TYPE.ADD_CHILD){
|
||||||
|
let data={'expectedTimeRange':[dayjs(), undefined]};
|
||||||
|
form.setFieldsValue(data)
|
||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
const normFile = (e: any) => {
|
const normFile = (e: any) => {
|
||||||
|
@ -234,10 +237,9 @@ export const DetailForm: React.FC<DetailFormProps> = (props) => {
|
||||||
placeholder={['开始时间', '结束时间']}
|
placeholder={['开始时间', '结束时间']}
|
||||||
allowEmpty={[true, true]}
|
allowEmpty={[true, true]}
|
||||||
needConfirm={false}
|
needConfirm={false}
|
||||||
defaultValue={[dayjs(), undefined]}
|
|
||||||
showTime={{
|
showTime={{
|
||||||
hideDisabledOptions: true,
|
hideDisabledOptions: true,
|
||||||
defaultValue: [dayjs('00:00:00', 'HH:mm:ss'), dayjs('11:59:59', 'HH:mm:ss')],
|
defaultValue: [dayjs('00:00:00', 'HH:mm:ss'), dayjs('23:59:59', 'HH:mm:ss')],
|
||||||
}}
|
}}
|
||||||
// format="YYYY-MM-DD HH:mm:ss"
|
// format="YYYY-MM-DD HH:mm:ss"
|
||||||
/>
|
/>
|
||||||
|
|
Loading…
Reference in New Issue