对接接口完善功能

This commit is contained in:
WenC 2024-03-25 19:25:57 +08:00
parent aaae4f05e4
commit 3b8419f7a7
7 changed files with 162 additions and 64 deletions

View File

@ -1,15 +1,28 @@
import './card-proj-loading.css'; import './card-proj-loading.css';
import {Loading3QuartersOutlined} from '@ant-design/icons'; import {Loading3QuartersOutlined} from '@ant-design/icons';
import {IProjLoading} from "../../interfaces/card/ICardProj.ts"; import {IProjLoading} from "../../interfaces/card/ICardProj.ts";
import {useState} from "react";
export default function CardProjLoading(props: IProjLoading) {
const [duration, setDuration] = useState(props.duration);
const interval = setInterval(() => {
if (duration <= 0) {
clearInterval(interval);
props.handleCountDownOver();
return;
}
setDuration(duration - 1000);
}, 1000);
export default function CardProjLoading(props:IProjLoading) {
return ( return (
<div className="card-proj-loading"> <div className="card-proj-loading">
<div className="title"> <div className="title">
<Loading3QuartersOutlined spin={true} style={{color: '#0052d9'}}/> <Loading3QuartersOutlined spin={true} style={{color: '#0052d9'}}/>
<span className="label">{props.title}</span> <span className="label">{props.title}</span>
</div> </div>
<div className="desc">600s</div> <div className="desc">{props.desc}{duration}s</div>
</div> </div>
) )
} }

View File

@ -11,10 +11,12 @@ export default function CardProjResult(props: IProjResult) {
{ {
props.handleFeedback ? ( props.handleFeedback ? (
<div className="option"> <div className="option">
<a href="/#" className="edit" onClick={(e) => { {
e.preventDefault(); <a href="/#" className="edit" onClick={(e) => {
props.handleFeedback?.(); e.preventDefault();
}}></a> props.handleFeedback?.();
}}></a>
}
</div> </div>
) : <></> ) : <></>
} }

View File

@ -17,6 +17,9 @@ export interface IProjEdit {
export interface IProjLoading { export interface IProjLoading {
title: string; title: string;
desc?: string; desc?: string;
duration: number;
handleCountDownOver(): void;
} }
export interface IProjResult { export interface IProjResult {

View File

@ -1,6 +1,6 @@
import './proj-edit.css'; import './proj-edit.css';
import {Link, useNavigate, useParams} from "react-router-dom"; import {Link, useNavigate, useParams} from "react-router-dom";
import {Breadcrumb, Button, message} from "antd"; import {Breadcrumb, Button, message, Modal} from "antd";
import StepProjEdit from "../../components/step/StepProjEdit.tsx"; import StepProjEdit from "../../components/step/StepProjEdit.tsx";
import CardProjEdit from "../../components/card/CardProjEdit.tsx"; import CardProjEdit from "../../components/card/CardProjEdit.tsx";
import {Process} from "../../interfaces/step/IStepProj.ts"; import {Process} from "../../interfaces/step/IStepProj.ts";
@ -9,10 +9,10 @@ import CardProjResult from "../../components/card/CardProjResult.tsx";
import CardProjDownload from "../../components/card/CardProjDownload.tsx"; import CardProjDownload from "../../components/card/CardProjDownload.tsx";
import CardProjJump from "../../components/card/CardProjJump.tsx"; import CardProjJump from "../../components/card/CardProjJump.tsx";
import {useEffect, useState} from "react"; import {useEffect, useState} from "react";
import {get} from "../../util/AjaxUtils.ts"; import {Axios, get, post} from "../../util/AjaxUtils.ts";
import {EditStepEnum, IProjEdit} from "../../interfaces/card/ICardProj.ts"; import {EditStepEnum, IProjEdit} from "../../interfaces/card/ICardProj.ts";
import {MAX_MOD_SIZE} from "./edit/ProjConfigModList.tsx"; import {MAX_MOD_SIZE} from "./edit/ProjConfigModList.tsx";
import {GenerateStatus} from "../../interfaces/proj/IProj.ts";
export default function ProjEdit() { export default function ProjEdit() {
const nav = useNavigate(); const nav = useNavigate();
@ -25,9 +25,12 @@ export default function ProjEdit() {
const [isConfigEdited, setIsConfigEdited] = useState(false); const [isConfigEdited, setIsConfigEdited] = useState(false);
// const [isAllStepEdited, setIsAllStepEdited] = useState(false); // const [isAllStepEdited, setIsAllStepEdited] = useState(false);
const [canGenerate, setCanGenerate] = useState(false); const [canGenerate, setCanGenerate] = useState(false);
const [generateStatus, setGenerateStatus] = useState(GenerateStatus.NONE);
const [isGenerateModalOpen, setIsGenerateModalOpen] = useState(false);
const [previewUrl, setPreviewUrl] = useState('');
const height = window.innerHeight - 240; const height = window.innerHeight - 240;
const renderEditStep = (editSteps: any[]) => { const renderEditStep = (editSteps: any[], isEdited: boolean) => {
const editStepArray: IProjEdit[] = []; const editStepArray: IProjEdit[] = [];
editStepArray.push( editStepArray.push(
{ {
@ -86,17 +89,10 @@ export default function ProjEdit() {
} }
) )
setEditStepArray(editStepArray); setEditStepArray(editStepArray);
setIsEditStepEdited( setIsEditStepEdited(isEdited);
editSteps[0].editStatus == EditStepEnum.EDITED
&& editSteps[1].editStatus == EditStepEnum.EDITED
&& editSteps[2].editStatus == EditStepEnum.EDITED
&& editSteps[3].editStatus == EditStepEnum.EDITED
&& editSteps[4].editStatus == EditStepEnum.EDITED
&& editSteps[5].editStatus == EditStepEnum.EDITED
)
} }
const renderSetting = (data: any) => { const renderSetting = (data: any, isConfig: boolean) => {
const configArray: IProjEdit[] = []; const configArray: IProjEdit[] = [];
configArray.push( configArray.push(
{ {
@ -124,25 +120,40 @@ export default function ProjEdit() {
desc: '调整菜单顺序', desc: '调整菜单顺序',
step: 3, step: 3,
btnName: '设置', btnName: '设置',
status: data.projModCount > MAX_MOD_SIZE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT, status: data.projModCount > MAX_MOD_SIZE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
handleEdit() { handleEdit() {
nav(`/proj-edit/config-menu-list/${pathParams.projId}`) nav(`/proj-edit/config-menu-list/${pathParams.projId}`)
} }
} }
) )
setConfigArray(configArray); setConfigArray(configArray);
setIsConfigEdited(data.loginpage.loginpageId && MAX_MOD_SIZE); setIsConfigEdited(isConfig);
} }
useEffect(() => { const renderData = () => {
get({ get({
messageApi: messageApi, messageApi: messageApi,
url: `/api/proj/get/${pathParams.projId}`, url: `/api/proj/get/${pathParams.projId}`,
onSuccess({data}) { onSuccess({data}) {
renderEditStep(data.editSteps); const isEdited = data.editSteps[0].editStatus == EditStepEnum.EDITED
renderSetting(data); && data.editSteps[1].editStatus == EditStepEnum.EDITED
&& data.editSteps[2].editStatus == EditStepEnum.EDITED
&& data.editSteps[3].editStatus == EditStepEnum.EDITED
&& data.editSteps[4].editStatus == EditStepEnum.EDITED
&& data.editSteps[5].editStatus == EditStepEnum.EDITED;
const isConfig = data.loginpage.loginpageId && MAX_MOD_SIZE > 0;
const isGenerate = isEdited && isConfig;
renderEditStep(data.editSteps, isEdited);
renderSetting(data, isConfig);
setCanGenerate(isGenerate);
setGenerateStatus(data.generate.generateStatus);
setPreviewUrl(data.previewUrl);
} }
}) })
}
useEffect(() => {
renderData();
}, []) }, [])
return ( return (
@ -193,31 +204,67 @@ export default function ProjEdit() {
<CardProjJump title="预览系统" <CardProjJump title="预览系统"
desc="点击查看预览系统" desc="点击查看预览系统"
handleJump={() => { handleJump={() => {
nav('/agent-select/2'); window.open(`${Axios.defaults?.baseURL}/${previewUrl}`, '_blank')
}} }}
/> />
) : <></> ) : <></>
} }
</StepProjEdit> </StepProjEdit>
<StepProjEdit step={3} process={Process.PENDING} descTitle="资料生成" hasNext={true}> <StepProjEdit step={3} process={canGenerate ? Process.PROCESSING : Process.PENDING} descTitle="资料生成"
<CardProjEdit title="资料生成" hasNext={true}>
desc="生成软著所需要的资料,此操作后项目无法再次编辑" {
btnName="生成" generateStatus == GenerateStatus.NONE || generateStatus == GenerateStatus.FAILED ? (
status={EditStepEnum.UN_EDIT} <CardProjEdit title="资料生成"
canBtnClick={canGenerate} desc="生成软著所需要的资料,此操作后项目无法再次编辑"
handleEdit={() => { btnName="生成"
console.log('编辑') status={EditStepEnum.UN_EDIT}
}} canBtnClick={canGenerate}
/> handleEdit={() => {
<CardProjLoading title="正在排队" setIsGenerateModalOpen(true);
desc="资料正在排队预计等待600秒" }}
/> />
<CardProjResult title="生成成功" ) : <></>
isSuccess={true} }
handleFeedback={() => { {
console.log('反馈') generateStatus == GenerateStatus.PENDING ? (
}} <CardProjLoading title="正在排队"
/> desc="资料正在排队"
duration={600}
handleCountDownOver={() => {
renderData();
}}
/>
) : <></>
}
{
generateStatus == GenerateStatus.GENERATING ? (
<CardProjLoading title="正在生成"
desc="资料正在生成"
duration={600}
handleCountDownOver={() => {
renderData();
}}
/>
) : <></>
}
{
generateStatus == GenerateStatus.SUCCESS ? (
<CardProjResult title="生成成功"
isSuccess={true}
/>
) : <></>
}
{
generateStatus == GenerateStatus.FAILED ? (
<CardProjResult title="生成失败"
isSuccess={false}
handleFeedback={() => {
console.log('反馈')
}}
/>
) : <></>
}
</StepProjEdit> </StepProjEdit>
<StepProjEdit step={4} process={Process.PENDING} descTitle="资料下载"> <StepProjEdit step={4} process={Process.PENDING} descTitle="资料下载">
<CardProjDownload title="软件基本信息" <CardProjDownload title="软件基本信息"
@ -244,7 +291,27 @@ export default function ProjEdit() {
nav(-1); nav(-1);
}}></Button> }}></Button>
</div> </div>
<Modal title="提示"
okText="确定"
cancelText="取消"
open={isGenerateModalOpen}
onOk={() => {
post({
messageApi,
url: `/api/proj/generate/proj-id/${pathParams.projId}`,
body: {},
onSuccess() {
messageApi.success('提交成功');
setIsGenerateModalOpen(false);
renderData();
}
})
}}
onCancel={() => {
setIsGenerateModalOpen(false);
}}>
<div>便</div>
</Modal>
</> </>
) )
} }

View File

@ -1,11 +1,11 @@
import './proj-config-list-mod.css'; import './proj-config-list-mod.css';
import { import {
Alert, Alert,
Breadcrumb, Input, Breadcrumb, InputNumber,
message, message,
Table, TableProps, Table, TableProps,
} from "antd"; } from "antd";
import {Link, useNavigate, useParams} from "react-router-dom"; import {Link, useParams} from "react-router-dom";
import {useEffect, useState} from "react"; import {useEffect, useState} from "react";
import {get, put} from "../../../util/AjaxUtils.ts"; import {get, put} from "../../../util/AjaxUtils.ts";
@ -14,15 +14,14 @@ export const MAX_MOD_SIZE = 2;
interface DataType { interface DataType {
projModId: string; projModId: string;
projId: string; projId: string;
modContext: string; projMenuId: string;
modName: string; menuTitle: string;
modUrl: string; menuIcon: string;
modDesc: string; menuUrl: string;
modIcon: string; orderNo: string;
} }
export default function ProjConfigMenuList() { export default function ProjConfigMenuList() {
const nav = useNavigate();
const pathParams = useParams(); const pathParams = useParams();
const [messageApi, contextHolder] = message.useMessage(); const [messageApi, contextHolder] = message.useMessage();
const [dataArray, setDataArray] = useState<DataType[]>(); const [dataArray, setDataArray] = useState<DataType[]>();
@ -47,22 +46,36 @@ export default function ProjConfigMenuList() {
const columns: TableProps<DataType>['columns'] = [ const columns: TableProps<DataType>['columns'] = [
{ {
title: '菜单标题', title: '菜单标题',
dataIndex: 'modName', dataIndex: 'menuTitle',
align: 'center', align: 'center',
width: 180 width: 250
}, },
{ {
title: '菜单连接', title: '菜单连接',
dataIndex: 'modDesc', dataIndex: 'menuUrl',
align: 'center', align: 'center',
}, },
{ {
title: '顺序', title: '顺序',
dataIndex: 'modIcon', dataIndex: 'orderNo',
align: 'center', align: 'center',
width: 80, width: 120,
render: (text, record) => { render: (text, record) => {
return <Input defaultValue={text}/> return <InputNumber defaultValue={text} onChange={(value) => {
put({
messageApi,
url: `/api/proj-menu/update-order-no/${record.projMenuId}`,
body: {
orderNo: value
},
onSuccess() {
messageApi.success('修改成功');
setTimeout(() => {
renderData();
}, 500)
}
})
}}/>
} }
}, },
]; ];
@ -83,10 +96,10 @@ export default function ProjConfigMenuList() {
]} ]}
/> />
<div className="mod-list-container" style={{height: `${height}px`}}> <div className="mod-list-container" style={{height: `${height}px`}}>
<Alert message="菜单指的是系统的功能最少10个菜单最多15个菜单" type="info"/> <Alert message="此数据在添加模块候自动生成,编辑顺序列可修改" type="info"/>
<div className="mod-list"> <div className="mod-list" style={{marginTop: '15px'}}>
<Table columns={columns} dataSource={dataArray} pagination={{pageSize: 20}} <Table columns={columns} dataSource={dataArray} pagination={{pageSize: 20}}
scroll={{y: height - 210}} size="middle" bordered key="dataTable" rowKey="projModId"/> scroll={{y: height - 160}} size="middle" bordered key="dataTable" rowKey="projModId"/>
</div> </div>
</div> </div>
</> </>

View File

@ -10,7 +10,7 @@ import {useEffect, useState} from "react";
import {EditOutlined, PlusOutlined, DeleteOutlined, SearchOutlined} from "@ant-design/icons"; import {EditOutlined, PlusOutlined, DeleteOutlined, SearchOutlined} from "@ant-design/icons";
import {del, get} from "../../../util/AjaxUtils.ts"; import {del, get} from "../../../util/AjaxUtils.ts";
export const MAX_MOD_SIZE = 2; export const MAX_MOD_SIZE = 15;
interface DataType { interface DataType {
projModId: string; projModId: string;

View File

@ -43,7 +43,7 @@ export default function ProjEditStep5() {
}) })
} }
}) })
}) }, [])
return ( return (
<> <>