调整页面
This commit is contained in:
parent
d4a75e7933
commit
94d3198c1a
@ -26,6 +26,7 @@ export default function CardProj(props: { item: IProj }) {
|
||||
const [messageApi, messageContext] = useMessage();
|
||||
const [projCategoryId, setProjCategoryId] = useState(data.projCategoryId);
|
||||
const [projCategoryName, setProjCategoryName] = useState(data.projCategoryName);
|
||||
const [charge, setCharge] = useState('');
|
||||
const [payCharge, setPayCharge] = useState('');
|
||||
const indexListContext = useContext(IndexListContext);
|
||||
|
||||
@ -109,6 +110,16 @@ export default function CardProj(props: { item: IProj }) {
|
||||
)
|
||||
}
|
||||
|
||||
const goEdit = () => {
|
||||
if(charge == ProjChargeType.ALL) {
|
||||
nav(`/proj-eall/${data.projId}`);
|
||||
} else if(charge == ProjChargeType.FREE) {
|
||||
nav(`/proj-efree/${data.projId}`);
|
||||
} else {
|
||||
nav(`/proj-edit/${data.projId}`);
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
const charge = props.item.pay.charge.split(':')[0];
|
||||
let chargeName = '';
|
||||
@ -123,6 +134,7 @@ export default function CardProj(props: { item: IProj }) {
|
||||
} else {
|
||||
chargeName = '免费试用';
|
||||
}
|
||||
setCharge(charge)
|
||||
setPayCharge(chargeName);
|
||||
}, [])
|
||||
|
||||
@ -131,9 +143,7 @@ export default function CardProj(props: { item: IProj }) {
|
||||
<div className="card-proj">
|
||||
<div className="title">
|
||||
<div className="left">
|
||||
<span className="text-btn" onClick={() => {
|
||||
nav(`/proj-edit/${data.projId}`)
|
||||
}}>{data.projName}</span>
|
||||
<span className="text-btn" onClick={goEdit}>{data.projName}</span>
|
||||
</div>
|
||||
<div className="right">
|
||||
<span className="context">上下文:{data.projContext}</span>
|
||||
@ -153,16 +163,12 @@ export default function CardProj(props: { item: IProj }) {
|
||||
data.generate.generateStatus == GenerateStatus.SUCCESS ? (
|
||||
<span>
|
||||
<SearchOutlined/>
|
||||
<span className="text-btn" onClick={() => {
|
||||
nav(`/proj-edit/${data.projId}`)
|
||||
}}>查看</span>
|
||||
<span className="text-btn" onClick={goEdit}>查看</span>
|
||||
</span>
|
||||
) : (
|
||||
<span>
|
||||
<EditOutlined/>
|
||||
<span className="text-btn" onClick={() => {
|
||||
nav(`/proj-edit/${data.projId}`)
|
||||
}}>编辑</span>
|
||||
<span className="text-btn" onClick={goEdit}>编辑</span>
|
||||
</span>
|
||||
)
|
||||
}
|
||||
|
@ -5,11 +5,14 @@ import {IProjJump} from "../../interfaces/card/ICardProj.ts";
|
||||
export default function CardProjJump(props: IProjJump) {
|
||||
return (
|
||||
<div className="card-proj-jump" onClick={() => {
|
||||
if(!props.canBtnClick) {
|
||||
return;
|
||||
}
|
||||
props.handleJump();
|
||||
}}>
|
||||
<div className="title">
|
||||
<span className="label">{props.title}</span>
|
||||
<ExportOutlined/>
|
||||
<ExportOutlined style={{color: 'var(--color-note)'}}/>
|
||||
</div>
|
||||
<div className="desc">{props.desc}</div>
|
||||
</div>
|
||||
|
@ -13,7 +13,7 @@
|
||||
}
|
||||
|
||||
.card-proj-jump .desc {
|
||||
margin: 5px 0 10px 0;
|
||||
margin: 15px 0 5px 0;
|
||||
max-height: 36px;
|
||||
line-height: 18px;
|
||||
color: var(--color-note);
|
||||
|
@ -3,6 +3,7 @@ import {Alert, Button, Input, message, Table, TableProps} from "antd";
|
||||
import {useEffect, useState} from "react";
|
||||
import {DeleteOutlined, PlusOutlined} from "@ant-design/icons";
|
||||
import {pinyin} from "pinyin-pro";
|
||||
import {uuid} from "../../util/CommonUtil.ts";
|
||||
|
||||
export interface IModField {
|
||||
projModFieldId: string;
|
||||
@ -15,6 +16,7 @@ interface PropsType {
|
||||
scrollHeight?: number;
|
||||
modFiledArray?: IModField[];
|
||||
isEdit?: boolean;
|
||||
isFree?: boolean;
|
||||
|
||||
handleChange?(modFieldArray: undefined | IModField[]): void;
|
||||
}
|
||||
@ -119,10 +121,14 @@ export default function ModField(props: PropsType) {
|
||||
props.isEdit ? (
|
||||
<div className="mod-field-table-btn">
|
||||
<Button type="default" onClick={() => {
|
||||
if(props.isFree && tableDataArray.length >= 3) {
|
||||
messageApi.error('免费版最多能添加3个字段').then(() => {});
|
||||
return;
|
||||
}
|
||||
setTableDataArray([
|
||||
...tableDataArray,
|
||||
{
|
||||
projModFieldId: '' + (tableDataArray.length + 1),
|
||||
projModFieldId: uuid(),
|
||||
fieldType: 'string',
|
||||
fieldDesc: '',
|
||||
fieldName: '',
|
||||
|
@ -13,7 +13,6 @@ export interface User {
|
||||
hasUserInfo: boolean;
|
||||
}
|
||||
|
||||
|
||||
export function reloadUser(messageApi: MessageInstance, globalDispatchContext: Dispatch<GlobalDataAction>) {
|
||||
return new Promise<any>(resolve => {
|
||||
get<any>({
|
||||
|
@ -40,6 +40,7 @@ export interface IProjDownload {
|
||||
export interface IProjJump {
|
||||
title: string;
|
||||
desc: string;
|
||||
canBtnClick?: boolean;
|
||||
|
||||
handleJump(): void;
|
||||
}
|
||||
|
@ -260,7 +260,7 @@ export default function AgentSelect() {
|
||||
items={[
|
||||
{title: <Link to="/">首页</Link>},
|
||||
{title: <Link to="/proj-create">创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '找代理'},
|
||||
]}
|
||||
/>
|
||||
|
@ -1,15 +1,13 @@
|
||||
import './proj-edit.css';
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {Breadcrumb, Button, message, Modal} from "antd";
|
||||
import {Breadcrumb, Button, message} from "antd";
|
||||
import StepProjEdit from "../../components/step/StepProjEdit.tsx";
|
||||
import CardProjEdit from "../../components/card/CardProjEdit.tsx";
|
||||
import {Process} from "../../interfaces/step/IStepProj.ts";
|
||||
import CardProjLoading from "../../components/card/CardProjLoading.tsx";
|
||||
import CardProjResult from "../../components/card/CardProjResult.tsx";
|
||||
import CardProjDownload from "../../components/card/CardProjDownload.tsx";
|
||||
import CardProjJump from "../../components/card/CardProjJump.tsx";
|
||||
import {useEffect, useState} from "react";
|
||||
import {Axios, get, post} from "../../util/AjaxUtils.ts";
|
||||
import {Axios, get} from "../../util/AjaxUtils.ts";
|
||||
import {EditStepEnum, IProjEdit} from "../../interfaces/card/ICardProj.ts";
|
||||
import {MAX_MOD_SIZE} from "./edit/ProjConfigModList.tsx";
|
||||
import {GenerateStatus} from "../../interfaces/proj/IProj.ts";
|
||||
@ -20,14 +18,9 @@ export default function ProjEditAll() {
|
||||
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [editStepArray, setEditStepArray] = useState<IProjEdit[]>([]);
|
||||
const [configArray, setConfigArray] = useState<IProjEdit[]>([]);
|
||||
const [isEditStepEdited, setIsEditStepEdited] = useState(false);
|
||||
const [isConfigEdited, setIsConfigEdited] = useState(false);
|
||||
// const [isAllStepEdited, setIsAllStepEdited] = useState(false);
|
||||
const [canGenerate, setCanGenerate] = useState(false);
|
||||
const [generateStatus, setGenerateStatus] = useState(GenerateStatus.NONE);
|
||||
const [generateEmainingTime, setGenerateEmainingTime] = useState(0);
|
||||
const [isGenerateModalOpen, setIsGenerateModalOpen] = useState(false);
|
||||
const [previewUrl, setPreviewUrl] = useState('');
|
||||
|
||||
const height = window.innerHeight - 240;
|
||||
@ -49,34 +42,6 @@ export default function ProjEditAll() {
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '基本信息',
|
||||
desc: '完善项目简介、编程语言、版本、公司等内容',
|
||||
step: 2,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[1].editStatus,
|
||||
handleEdit() {
|
||||
if (generateStatus != GenerateStatus.SUCCESS) {
|
||||
nav(`/proj-edit/step2/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step2-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '软件功能特点',
|
||||
desc: '请完善软件功能特点',
|
||||
step: 3,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[2].editStatus,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/step3/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step3-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '著作人信息',
|
||||
desc: '请完善著作人相关信息',
|
||||
@ -105,75 +70,11 @@ export default function ProjEditAll() {
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '选择登录页面',
|
||||
desc: '选择软件的登录页面模板',
|
||||
step: 6,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[5].editStatus,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/step6/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step6-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
setEditStepArray(editStepArray);
|
||||
setIsEditStepEdited(isEdited);
|
||||
}
|
||||
|
||||
const renderSetting = (data: any, isConfig: boolean, isGenerateSuccess: boolean) => {
|
||||
const configArray: IProjEdit[] = [];
|
||||
configArray.push(
|
||||
{
|
||||
title: '登录界面设置',
|
||||
desc: '请对登录界面完成个性化设置',
|
||||
step: 1,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: data.loginpage.loginpageId ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/config-loginpage/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-loginpage-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '系统菜单管理',
|
||||
desc: '请对系统菜单进行设置',
|
||||
step: 2,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: data.projModCount > MAX_MOD_SIZE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/config-mod-list/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-mod-list-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '菜单顺序',
|
||||
desc: '调整菜单顺序',
|
||||
step: 3,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: data.projModCount > MAX_MOD_SIZE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/config-menu-list/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-menu-list-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
setConfigArray(configArray);
|
||||
setIsConfigEdited(isConfig);
|
||||
}
|
||||
|
||||
const renderData = () => {
|
||||
get<any>({
|
||||
messageApi: messageApi,
|
||||
@ -186,14 +87,11 @@ export default function ProjEditAll() {
|
||||
&& 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;
|
||||
const isGenerateSuccess: boolean = data.generate.generateStatus == GenerateStatus.SUCCESS;
|
||||
renderEditStep(data.editSteps, isEdited, isGenerateSuccess);
|
||||
renderSetting(data, isConfig, isGenerateSuccess);
|
||||
setCanGenerate(isGenerate);
|
||||
setIsConfigEdited(isConfig);
|
||||
setGenerateStatus(data.generate.generateStatus);
|
||||
setPreviewUrl(data.previewUrl);
|
||||
setGenerateEmainingTime(data.generate.emainingTime);
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -212,7 +110,7 @@ export default function ProjEditAll() {
|
||||
{title: '编辑项目'},
|
||||
]}
|
||||
/>
|
||||
<div className="proj-edit" style={{height: `${height}px`}}>
|
||||
<div className="proj-edit" style={{height: `${height}px`, padding: '15px 175px'}}>
|
||||
<StepProjEdit step={1} process={isEditStepEdited ? Process.COMPLETE : Process.PROCESSING}
|
||||
descTitle="完善信息"
|
||||
descDetail="完善项目的基本信息"
|
||||
@ -235,87 +133,16 @@ export default function ProjEditAll() {
|
||||
descTitle="功能设置"
|
||||
descDetail="设置系统的菜单功能" hasNext={true}>
|
||||
{
|
||||
configArray.map((item, index) => {
|
||||
return <CardProjEdit key={`config-${index}`}
|
||||
title={item.title}
|
||||
desc={item.desc}
|
||||
btnName={item.btnName}
|
||||
canBtnClick={isEditStepEdited}
|
||||
status={item.status}
|
||||
handleEdit={item.handleEdit}
|
||||
/>
|
||||
})
|
||||
}
|
||||
{
|
||||
isEditStepEdited && isConfigEdited ? (
|
||||
<CardProjJump title="预览系统"
|
||||
desc="点击查看预览系统"
|
||||
handleJump={() => {
|
||||
window.open(`${Axios.defaults?.baseURL}/${previewUrl}`, '_blank')
|
||||
}}
|
||||
/>
|
||||
) : <></>
|
||||
<CardProjJump title="预览系统"
|
||||
desc={isEditStepEdited && isConfigEdited ? "点击查看预览系统" : "制作中"}
|
||||
canBtnClick={isEditStepEdited && isConfigEdited}
|
||||
handleJump={() => {
|
||||
window.open(`${Axios.defaults?.baseURL}/${previewUrl}`, '_blank')
|
||||
}}
|
||||
/>
|
||||
}
|
||||
</StepProjEdit>
|
||||
<StepProjEdit step={3}
|
||||
process={generateStatus == GenerateStatus.SUCCESS ? Process.COMPLETE : (canGenerate ? Process.PROCESSING : Process.PENDING)}
|
||||
descTitle="资料生成"
|
||||
hasNext={true}>
|
||||
{
|
||||
generateStatus == GenerateStatus.NONE || generateStatus == GenerateStatus.FAILED ? (
|
||||
<CardProjEdit title="资料生成"
|
||||
desc="生成软著所需要的资料,此操作后项目无法再次编辑"
|
||||
btnName="生成"
|
||||
status={EditStepEnum.UN_EDIT}
|
||||
canBtnClick={canGenerate}
|
||||
handleEdit={() => {
|
||||
setIsGenerateModalOpen(true);
|
||||
}}
|
||||
/>
|
||||
) : <></>
|
||||
}
|
||||
{
|
||||
generateStatus == GenerateStatus.PENDING ? (
|
||||
<CardProjLoading title="正在排队"
|
||||
desc="资料正在排队"
|
||||
duration={generateEmainingTime}
|
||||
handleCountDownOver={() => {
|
||||
renderData();
|
||||
}}
|
||||
/>
|
||||
) : <></>
|
||||
}
|
||||
{
|
||||
generateStatus == GenerateStatus.GENERATING ? (
|
||||
<CardProjLoading title="正在生成"
|
||||
desc="资料正在生成"
|
||||
duration={generateEmainingTime}
|
||||
handleCountDownOver={() => {
|
||||
renderData();
|
||||
}}
|
||||
|
||||
/>
|
||||
) : <></>
|
||||
}
|
||||
{
|
||||
generateStatus == GenerateStatus.SUCCESS ? (
|
||||
<CardProjResult title="生成成功"
|
||||
isSuccess={true}
|
||||
/>
|
||||
) : <></>
|
||||
}
|
||||
{
|
||||
generateStatus == GenerateStatus.FAILED ? (
|
||||
<CardProjResult title="生成失败"
|
||||
isSuccess={false}
|
||||
handleFeedback={() => {
|
||||
console.log('反馈')
|
||||
}}
|
||||
/>
|
||||
) : <></>
|
||||
}
|
||||
</StepProjEdit>
|
||||
<StepProjEdit step={4}
|
||||
process={generateStatus == GenerateStatus.SUCCESS ? Process.PROCESSING : Process.PENDING}
|
||||
descTitle="资料下载">
|
||||
<CardProjDownload title="申请表"
|
||||
@ -346,12 +173,6 @@ export default function ProjEditAll() {
|
||||
window.open(`${Axios.defaults?.baseURL}/route/proj/download/code/${pathParams.projId}`)
|
||||
}}
|
||||
/>
|
||||
<CardProjJump title="找代理"
|
||||
desc="到软著代理完成软著申请"
|
||||
handleJump={() => {
|
||||
nav(`/agent-select/${pathParams.projId}`);
|
||||
}}
|
||||
/>
|
||||
</StepProjEdit>
|
||||
</div>
|
||||
<div className="btn-container">
|
||||
@ -364,27 +185,6 @@ export default function ProjEditAll() {
|
||||
nav(-1);
|
||||
}}>返回</Button>
|
||||
</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>
|
||||
</>
|
||||
)
|
||||
}
|
315
src/route/proj/ProjEditFree.tsx
Normal file
315
src/route/proj/ProjEditFree.tsx
Normal file
@ -0,0 +1,315 @@
|
||||
import './proj-edit.css';
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {Breadcrumb, Button, message} from "antd";
|
||||
import StepProjEdit from "../../components/step/StepProjEdit.tsx";
|
||||
import CardProjEdit from "../../components/card/CardProjEdit.tsx";
|
||||
import {Process} from "../../interfaces/step/IStepProj.ts";
|
||||
import CardProjDownload from "../../components/card/CardProjDownload.tsx";
|
||||
import CardProjJump from "../../components/card/CardProjJump.tsx";
|
||||
import {useEffect, useState} from "react";
|
||||
import {Axios, get} from "../../util/AjaxUtils.ts";
|
||||
import {EditStepEnum, IProjEdit} from "../../interfaces/card/ICardProj.ts";
|
||||
import {MAX_MOD_SIZE_FREE} from "./edit/ProjConfigModList.tsx";
|
||||
import {GenerateStatus} from "../../interfaces/proj/IProj.ts";
|
||||
|
||||
export default function ProjEdit() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [editStepArray, setEditStepArray] = useState<IProjEdit[]>([]);
|
||||
const [configArray, setConfigArray] = useState<IProjEdit[]>([]);
|
||||
const [isEditStepEdited, setIsEditStepEdited] = useState(false);
|
||||
const [isConfigEdited, setIsConfigEdited] = useState(false);
|
||||
const [canGenerate, setCanGenerate] = useState(false);
|
||||
const [generateStatus, setGenerateStatus] = useState(GenerateStatus.NONE);
|
||||
const [previewUrl, setPreviewUrl] = useState('');
|
||||
|
||||
const height = window.innerHeight - 240;
|
||||
|
||||
const renderEditStep = (editSteps: any[], isEdited: boolean, isGenerateSuccess: boolean) => {
|
||||
const editStepArray: IProjEdit[] = [];
|
||||
editStepArray.push(
|
||||
{
|
||||
title: '标题简介',
|
||||
desc: '完善代码、样式类型和详细介绍等内容',
|
||||
step: 1,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[0].editStatus,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/step1/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step1-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '基本信息',
|
||||
desc: '完善项目简介、编程语言、版本、公司等内容',
|
||||
step: 2,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[1].editStatus,
|
||||
canBtnClick: false,
|
||||
handleEdit() {
|
||||
if (generateStatus != GenerateStatus.SUCCESS) {
|
||||
nav(`/proj-edit/step2/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step2-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '软件功能特点',
|
||||
desc: '请完善软件功能特点',
|
||||
step: 3,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[2].editStatus,
|
||||
canBtnClick: false,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/step3/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step3-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '著作人信息',
|
||||
desc: '请完善著作人相关信息',
|
||||
step: 4,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[3].editStatus,
|
||||
canBtnClick: false,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/step4/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step4-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '申请人信息',
|
||||
desc: '请完善申请人信息',
|
||||
step: 5,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[4].editStatus,
|
||||
canBtnClick: false,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/step5/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step5-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '选择登录页面',
|
||||
desc: '选择软件的登录页面模板',
|
||||
step: 6,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: editSteps[5].editStatus,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/step6/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/step6-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
setEditStepArray(editStepArray);
|
||||
setIsEditStepEdited(isEdited);
|
||||
}
|
||||
|
||||
const renderSetting = (data: any, isConfig: boolean, isGenerateSuccess: boolean) => {
|
||||
const configArray: IProjEdit[] = [];
|
||||
configArray.push(
|
||||
{
|
||||
title: '登录界面设置',
|
||||
desc: '请对登录界面完成个性化设置',
|
||||
step: 1,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: data.loginpage.loginpageId ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/config-loginpage/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-loginpage-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '系统菜单管理',
|
||||
desc: '请对系统菜单进行设置',
|
||||
step: 2,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: data.projModCount > MAX_MOD_SIZE_FREE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/config-mod-flist/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-mod-flist-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '菜单顺序',
|
||||
desc: '调整菜单顺序',
|
||||
step: 3,
|
||||
btnName: !isGenerateSuccess ? '设置' : '查看',
|
||||
status: data.projModCount > MAX_MOD_SIZE_FREE ? EditStepEnum.EDITED : EditStepEnum.UN_EDIT,
|
||||
handleEdit() {
|
||||
if (!isGenerateSuccess) {
|
||||
nav(`/proj-edit/config-menu-list/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-menu-list-show/${pathParams.projId}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
setConfigArray(configArray);
|
||||
setIsConfigEdited(isConfig);
|
||||
}
|
||||
|
||||
const renderData = () => {
|
||||
get<any>({
|
||||
messageApi: messageApi,
|
||||
url: `/api/proj/get/${pathParams.projId}`,
|
||||
onSuccess({data}) {
|
||||
const isEdited = data.editSteps[0].editStatus == EditStepEnum.EDITED
|
||||
&& data.editSteps[5].editStatus == EditStepEnum.EDITED;
|
||||
const isConfig = data.loginpage.loginpageId && data.projModCount > MAX_MOD_SIZE_FREE;
|
||||
const isGenerate = isEdited && isConfig;
|
||||
const isGenerateSuccess: boolean = data.generate.generateStatus == GenerateStatus.SUCCESS;
|
||||
renderEditStep(data.editSteps, isEdited, isGenerateSuccess);
|
||||
renderSetting(data, isConfig, isGenerateSuccess);
|
||||
setCanGenerate(isGenerate);
|
||||
setGenerateStatus(data.generate.generateStatus);
|
||||
setPreviewUrl(data.previewUrl);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
renderData();
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<>
|
||||
{contextHolder}
|
||||
<Breadcrumb
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: '编辑项目'},
|
||||
]}
|
||||
/>
|
||||
<div className="proj-edit" style={{height: `${height}px`}}>
|
||||
<StepProjEdit step={1} process={isEditStepEdited ? Process.COMPLETE : Process.PROCESSING}
|
||||
descTitle="完善信息"
|
||||
descDetail="完善项目的基本信息"
|
||||
hasNext={true}>
|
||||
{
|
||||
editStepArray.map((item, index) => {
|
||||
return <CardProjEdit key={`editStep-${index}`}
|
||||
title={item.title}
|
||||
desc={item.desc}
|
||||
status={item.status}
|
||||
btnName={item.btnName}
|
||||
canBtnClick={item.canBtnClick}
|
||||
handleEdit={item.handleEdit}
|
||||
/>
|
||||
})
|
||||
}
|
||||
|
||||
</StepProjEdit>
|
||||
<StepProjEdit step={2}
|
||||
process={!isEditStepEdited ? Process.PENDING : (isConfigEdited ? Process.COMPLETE : Process.PROCESSING)}
|
||||
descTitle="功能设置"
|
||||
descDetail="设置系统的菜单功能" hasNext={true}>
|
||||
{
|
||||
configArray.map((item, index) => {
|
||||
return <CardProjEdit key={`config-${index}`}
|
||||
title={item.title}
|
||||
desc={item.desc}
|
||||
btnName={item.btnName}
|
||||
canBtnClick={isEditStepEdited}
|
||||
status={item.status}
|
||||
handleEdit={item.handleEdit}
|
||||
/>
|
||||
})
|
||||
}
|
||||
{
|
||||
isEditStepEdited && isConfigEdited ? (
|
||||
<CardProjJump title="预览系统"
|
||||
desc="点击查看预览系统"
|
||||
handleJump={() => {
|
||||
window.open(`${Axios.defaults?.baseURL}/${previewUrl}`, '_blank')
|
||||
}}
|
||||
/>
|
||||
) : <></>
|
||||
}
|
||||
</StepProjEdit>
|
||||
<StepProjEdit step={3}
|
||||
process={generateStatus == GenerateStatus.SUCCESS ? Process.COMPLETE : (canGenerate ? Process.PROCESSING : Process.PENDING)}
|
||||
descTitle="资料生成"
|
||||
hasNext={true}>
|
||||
{
|
||||
generateStatus == GenerateStatus.NONE || generateStatus == GenerateStatus.FAILED ? (
|
||||
<CardProjEdit title="资料生成"
|
||||
desc="生成软著所需要的资料,此操作后项目无法再次编辑"
|
||||
btnName="生成"
|
||||
status={EditStepEnum.UN_EDIT}
|
||||
canBtnClick={false}
|
||||
handleEdit={() => {}}
|
||||
/>
|
||||
) : <></>
|
||||
}
|
||||
|
||||
|
||||
</StepProjEdit>
|
||||
<StepProjEdit step={4}
|
||||
process={generateStatus == GenerateStatus.SUCCESS ? Process.PROCESSING : Process.PENDING}
|
||||
descTitle="资料下载">
|
||||
<CardProjDownload title="申请表"
|
||||
desc="点击下载申请表"
|
||||
canBtnClick={false}
|
||||
handleDownload={() => {}}
|
||||
/>
|
||||
<CardProjDownload title="操作手册"
|
||||
desc="点击下载操作手册"
|
||||
canBtnClick={false}
|
||||
handleDownload={() => {}}
|
||||
/>
|
||||
<CardProjDownload title="代码压缩包"
|
||||
desc="点击下载代码压缩包"
|
||||
canBtnClick={false}
|
||||
handleDownload={() => {}}
|
||||
/>
|
||||
<CardProjDownload title="代码文档"
|
||||
desc="点击下载代码文档"
|
||||
canBtnClick={false}
|
||||
handleDownload={() => {}}
|
||||
/>
|
||||
<CardProjJump title="找代理"
|
||||
desc="到软著代理完成软著申请"
|
||||
canBtnClick={false}
|
||||
handleJump={() => {}}
|
||||
/>
|
||||
</StepProjEdit>
|
||||
</div>
|
||||
<div className="btn-container">
|
||||
<Button size="large" style={{
|
||||
width: '200px',
|
||||
fontSize: '14px',
|
||||
backgroundColor: 'var(--color-primary)',
|
||||
color: 'var(--color-light)'
|
||||
}} onClick={() => {
|
||||
nav(-1);
|
||||
}}>返回</Button>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
@ -176,7 +176,13 @@ export default function ProjNew() {
|
||||
cancelText="取消"
|
||||
open={isEditModalOpen}
|
||||
onOk={() => {
|
||||
nav(`/proj-edit/${createProjId}`);
|
||||
if(pathParams.projChargeType == ProjChargeType.ALL) {
|
||||
nav(`/proj-eall/${createProjId}`);
|
||||
} else if(pathParams.projChargeType == ProjChargeType.FREE) {
|
||||
nav(`/proj-efree/${createProjId}`);
|
||||
} else {
|
||||
nav(`/proj-edit/${createProjId}`);
|
||||
}
|
||||
}}
|
||||
onCancel={() => {
|
||||
setIsEditModalOpen(false);
|
||||
|
@ -121,7 +121,7 @@ export default function ProjConfigLoginpage() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '登录界面设置'},
|
||||
]}
|
||||
/>
|
||||
|
@ -13,7 +13,7 @@ import {
|
||||
UploadFile,
|
||||
UploadProps
|
||||
} from "antd";
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect, useState} from "react";
|
||||
import {DevUserId, downloadUrl, get, post, uploadImageUrl} from "../../../util/AjaxUtils.ts";
|
||||
|
||||
@ -31,6 +31,7 @@ type FormFieldType = {
|
||||
type FileType = Parameters<GetProp<UploadProps, 'beforeUpload'>>[0];
|
||||
|
||||
export default function ProjConfigLoginpageShow() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FormFieldType>();
|
||||
@ -116,7 +117,7 @@ export default function ProjConfigLoginpageShow() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '登录界面设置'},
|
||||
]}
|
||||
/>
|
||||
|
@ -5,10 +5,9 @@ import {
|
||||
message,
|
||||
Table, TableProps,
|
||||
} from "antd";
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect, useState} from "react";
|
||||
import {get, put} from "../../../util/AjaxUtils.ts";
|
||||
export const MAX_MOD_SIZE = 2;
|
||||
|
||||
interface DataType {
|
||||
projModId: string;
|
||||
@ -21,7 +20,7 @@ interface DataType {
|
||||
}
|
||||
|
||||
export default function ProjConfigMenuList() {
|
||||
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [dataArray, setDataArray] = useState<DataType[]>();
|
||||
@ -91,7 +90,7 @@ export default function ProjConfigMenuList() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '系统菜单顺序'},
|
||||
]}
|
||||
/>
|
||||
|
@ -1,6 +1,6 @@
|
||||
import './proj-config-list-mod.css';
|
||||
import {Alert, Breadcrumb, message, Table, TableProps,} from "antd";
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect, useState} from "react";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
|
||||
@ -17,7 +17,7 @@ interface DataType {
|
||||
}
|
||||
|
||||
export default function ProjConfigMenuListShow() {
|
||||
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [dataArray, setDataArray] = useState<DataType[]>();
|
||||
@ -70,7 +70,7 @@ export default function ProjConfigMenuListShow() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '系统菜单顺序'},
|
||||
]}
|
||||
/>
|
||||
|
@ -9,6 +9,7 @@ import {useEffect, useState} from "react";
|
||||
import FaiconSelect from "../../../components/faicon/FaIconSelect.tsx";
|
||||
import ModField, {IModField} from "../../../components/modfield/ModField.tsx";
|
||||
import {get, put} from "../../../util/AjaxUtils.ts";
|
||||
import {MAX_MOD_SIZE, MAX_MOD_SIZE_FREE, MIN_MOD_SIZE, MIN_MOD_SIZE_FREE} from "./ProjConfigModList.tsx";
|
||||
|
||||
type FormFieldType = {
|
||||
projId: string;
|
||||
@ -18,7 +19,11 @@ type FormFieldType = {
|
||||
fields: IModField[];
|
||||
}
|
||||
|
||||
export default function ProjConfigModEdit() {
|
||||
type PropsType = {
|
||||
isFree?: boolean;
|
||||
}
|
||||
|
||||
export default function ProjConfigModEdit(props: PropsType) {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
@ -28,6 +33,8 @@ export default function ProjConfigModEdit() {
|
||||
const [isEditModalOpen, setIsEditModalOpen] = useState(false);
|
||||
const [selectedModIcon, setSelectedModIcon] = useState<string>('fa fa-list');
|
||||
const [fields, setFields] = useState<IModField[]>([]);
|
||||
const minSize = props.isFree ? MIN_MOD_SIZE_FREE : MIN_MOD_SIZE;
|
||||
const maxSize = props.isFree ? MAX_MOD_SIZE_FREE : MAX_MOD_SIZE;
|
||||
|
||||
const height = window.innerHeight - 180;
|
||||
|
||||
@ -56,13 +63,25 @@ export default function ProjConfigModEdit() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <Link to={`/proj-edit/config-mod-list/${pathParams.projId}`}>系统菜单管理</Link>},
|
||||
{
|
||||
title: <a onClick={() => {
|
||||
if(props.isFree) {
|
||||
nav(`/proj-efree/${pathParams.projId}`)
|
||||
} else {
|
||||
`/proj-edit/${pathParams.projId}`
|
||||
}
|
||||
}}>编辑项目</a>
|
||||
},
|
||||
{
|
||||
title: <a onClick={() => {
|
||||
nav(-1);
|
||||
}}>系统菜单管理</a>
|
||||
},
|
||||
{title: '编辑菜单'},
|
||||
]}
|
||||
/>
|
||||
<div className="mod-edit-container" style={{height: `${height}px`}}>
|
||||
<Alert message="菜单指的是系统的功能,最少10个菜单,最多15个菜单" type="info"/>
|
||||
<Alert message={`菜单指的是系统的功能,最少${minSize}个菜单,最多${maxSize}个菜单`} type="info"/>
|
||||
<div className="mod-content">
|
||||
<Form
|
||||
name="basic"
|
||||
|
@ -10,7 +10,10 @@ import {useEffect, useState} from "react";
|
||||
import {EditOutlined, PlusOutlined, DeleteOutlined, SearchOutlined} from "@ant-design/icons";
|
||||
import {del, get} from "../../../util/AjaxUtils.ts";
|
||||
|
||||
export const MAX_MOD_SIZE = 5;
|
||||
export const MAX_MOD_SIZE = 18;
|
||||
export const MIN_MOD_SIZE = 10
|
||||
export const MAX_MOD_SIZE_FREE = 3
|
||||
export const MIN_MOD_SIZE_FREE = 1
|
||||
|
||||
interface DataType {
|
||||
projModId: string;
|
||||
@ -22,12 +25,18 @@ interface DataType {
|
||||
modIcon: string;
|
||||
}
|
||||
|
||||
export default function ProjConfigModList() {
|
||||
type PropType = {
|
||||
isFree?: boolean;
|
||||
}
|
||||
|
||||
export default function ProjConfigModList(props: PropType) {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [dataArray, setDataArray] = useState<DataType[]>();
|
||||
const [modSize, setModSize] = useState(0);
|
||||
const minSize = props.isFree ? MIN_MOD_SIZE_FREE : MIN_MOD_SIZE;
|
||||
const maxSize = props.isFree ? MAX_MOD_SIZE_FREE : MAX_MOD_SIZE;
|
||||
|
||||
const height = window.innerHeight - 165;
|
||||
|
||||
@ -88,11 +97,15 @@ export default function ProjConfigModList() {
|
||||
return (
|
||||
<>
|
||||
{
|
||||
modSize < MAX_MOD_SIZE ? (
|
||||
modSize < maxSize ? (
|
||||
<Button type="primary" size="small"
|
||||
style={{marginRight: '5px'}}
|
||||
onClick={() => {
|
||||
nav(`/proj-edit/config-mod-edit/${pathParams.projId}/${record.projModId}`)
|
||||
if(props.isFree) {
|
||||
nav(`/proj-edit/config-mod-fedit/${pathParams.projId}/${record.projModId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-mod-edit/${pathParams.projId}/${record.projModId}`)
|
||||
}
|
||||
}}>
|
||||
<EditOutlined/>
|
||||
</Button>
|
||||
@ -100,7 +113,11 @@ export default function ProjConfigModList() {
|
||||
<Button type="default" size="small"
|
||||
style={{marginRight: '5px'}}
|
||||
onClick={() => {
|
||||
nav(`/proj-edit/config-mod-show/${pathParams.projId}/${record.projModId}`)
|
||||
if(props.isFree) {
|
||||
nav(`/proj-edit/config-mod-fshow/${pathParams.projId}/${record.projModId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-mod-show/${pathParams.projId}/${record.projModId}`)
|
||||
}
|
||||
}}>
|
||||
<SearchOutlined/>
|
||||
</Button>
|
||||
@ -136,18 +153,26 @@ export default function ProjConfigModList() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{
|
||||
title: <a onClick={() => {
|
||||
nav(-1)
|
||||
}}>编辑项目</a>
|
||||
},
|
||||
{title: '系统菜单管理'},
|
||||
]}
|
||||
/>
|
||||
<div className="mod-list-container" style={{height: `${height}px`}}>
|
||||
<Alert message="菜单指的是系统的功能,最少10个菜单,最多15个菜单" type="info"/>
|
||||
<Alert message={`菜单指的是系统的功能,最少${minSize}个菜单,最多${maxSize}个菜单`} type="info"/>
|
||||
<div className="mod-list">
|
||||
<div className="table-btn-group">
|
||||
{
|
||||
modSize < MAX_MOD_SIZE ? (
|
||||
modSize < maxSize ? (
|
||||
<Button value="small" onClick={() => {
|
||||
nav(`/proj-edit/config-mod-save/${pathParams.projId}`)
|
||||
if(props.isFree) {
|
||||
nav(`/proj-edit/config-mod-fsave/${pathParams.projId}`)
|
||||
} else {
|
||||
nav(`/proj-edit/config-mod-save/${pathParams.projId}`)
|
||||
}
|
||||
}}><PlusOutlined/> 新增</Button>
|
||||
) : <></>
|
||||
}
|
||||
|
@ -10,8 +10,6 @@ import {useEffect, useState} from "react";
|
||||
import {SearchOutlined} from "@ant-design/icons";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
|
||||
export const MAX_MOD_SIZE = 15;
|
||||
|
||||
interface DataType {
|
||||
projModId: string;
|
||||
projId: string;
|
||||
@ -109,7 +107,7 @@ export default function ProjConfigModListShow() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '系统菜单查看'},
|
||||
]}
|
||||
/>
|
||||
|
@ -9,6 +9,7 @@ import {useEffect, useState} from "react";
|
||||
import FaiconSelect from "../../../components/faicon/FaIconSelect.tsx";
|
||||
import ModField, {IModField} from "../../../components/modfield/ModField.tsx";
|
||||
import {post} from "../../../util/AjaxUtils.ts";
|
||||
import {MAX_MOD_SIZE, MAX_MOD_SIZE_FREE, MIN_MOD_SIZE, MIN_MOD_SIZE_FREE} from "./ProjConfigModList.tsx";
|
||||
|
||||
type FormFieldType = {
|
||||
modName: string;
|
||||
@ -17,7 +18,11 @@ type FormFieldType = {
|
||||
fields: IModField[];
|
||||
}
|
||||
|
||||
export default function ProjConfigModSave() {
|
||||
type PropsType = {
|
||||
isFree?: boolean;
|
||||
}
|
||||
|
||||
export default function ProjConfigModSave(props: PropsType) {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
@ -26,6 +31,8 @@ export default function ProjConfigModSave() {
|
||||
const [isModIconModalOpen, setIsModIconModalOpen] = useState(false);
|
||||
const [isEditModalOpen, setIsEditModalOpen] = useState(false);
|
||||
const [selectedModIcon, setSelectedModIcon] = useState<string>('fa fa-list');
|
||||
const minSize = props.isFree ? MIN_MOD_SIZE_FREE : MIN_MOD_SIZE;
|
||||
const maxSize = props.isFree ? MAX_MOD_SIZE_FREE : MAX_MOD_SIZE;
|
||||
|
||||
const height = window.innerHeight - 180;
|
||||
|
||||
@ -42,13 +49,25 @@ export default function ProjConfigModSave() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <Link to={`/proj-edit/config-mod-list/${pathParams.projId}`}>系统菜单管理</Link>},
|
||||
{
|
||||
title: <a onClick={() => {
|
||||
if(props.isFree) {
|
||||
nav(`/proj-efree/${pathParams.projId}`)
|
||||
} else {
|
||||
`/proj-edit/${pathParams.projId}`
|
||||
}
|
||||
}}>编辑项目</a>
|
||||
},
|
||||
{
|
||||
title: <a onClick={() => {
|
||||
nav(-1);
|
||||
}}>系统菜单管理</a>
|
||||
},
|
||||
{title: '添加菜单'},
|
||||
]}
|
||||
/>
|
||||
<div className="mod-edit-container" style={{height: `${height}px`}}>
|
||||
<Alert message="菜单指的是系统的功能,最少10个菜单,最多15个菜单" type="info"/>
|
||||
<Alert message={`菜单指的是系统的功能,最少${minSize}个菜单,最多${maxSize}个菜单`} type="info"/>
|
||||
<div className="mod-content">
|
||||
<Form
|
||||
name="basic"
|
||||
@ -97,14 +116,15 @@ export default function ProjConfigModSave() {
|
||||
rules={[{required: true, message: '请添加菜单属性'}]}
|
||||
>
|
||||
<ModField
|
||||
isEdit={true}
|
||||
scrollHeight={height - 380}
|
||||
handleChange={(dataArray) => {
|
||||
if (!dataArray) {
|
||||
return;
|
||||
}
|
||||
form.setFieldValue('fields', dataArray);
|
||||
}}/>
|
||||
isEdit={true}
|
||||
isFree={props.isFree}
|
||||
scrollHeight={height - 380}
|
||||
handleChange={(dataArray) => {
|
||||
if (!dataArray) {
|
||||
return;
|
||||
}
|
||||
form.setFieldValue('fields', dataArray);
|
||||
}}/>
|
||||
</Form.Item>
|
||||
|
||||
</Col>
|
||||
|
@ -8,6 +8,7 @@ import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect, useState} from "react";
|
||||
import ModField, {IModField} from "../../../components/modfield/ModField.tsx";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
import {MAX_MOD_SIZE, MAX_MOD_SIZE_FREE, MIN_MOD_SIZE, MIN_MOD_SIZE_FREE} from "./ProjConfigModList.tsx";
|
||||
|
||||
type FormFieldType = {
|
||||
projId: string;
|
||||
@ -17,13 +18,19 @@ type FormFieldType = {
|
||||
fields: IModField[];
|
||||
}
|
||||
|
||||
export default function ProjConfigModShow() {
|
||||
type PropsType = {
|
||||
isFree?: boolean;
|
||||
}
|
||||
|
||||
export default function ProjConfigModShow(props: PropsType) {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FormFieldType>();
|
||||
const [selectedModIcon, setSelectedModIcon] = useState<string>('fa fa-list');
|
||||
const [fields, setFields] = useState<IModField[]>([]);
|
||||
const minSize = props.isFree ? MIN_MOD_SIZE_FREE : MIN_MOD_SIZE;
|
||||
const maxSize = props.isFree ? MAX_MOD_SIZE_FREE : MAX_MOD_SIZE;
|
||||
|
||||
const height = window.innerHeight - 180;
|
||||
|
||||
@ -52,13 +59,25 @@ export default function ProjConfigModShow() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <Link to={`/proj-edit/config-mod-list/${pathParams.projId}`}>系统菜单管理</Link>},
|
||||
{
|
||||
title: <a onClick={() => {
|
||||
if(props.isFree) {
|
||||
nav(`/proj-efree/${pathParams.projId}`)
|
||||
} else {
|
||||
`/proj-edit/${pathParams.projId}`
|
||||
}
|
||||
}}>编辑项目</a>
|
||||
},
|
||||
{
|
||||
title: <a onClick={() => {
|
||||
nav(-1);
|
||||
}}>系统菜单管理</a>
|
||||
},
|
||||
{title: '查看菜单'},
|
||||
]}
|
||||
/>
|
||||
<div className="mod-edit-container" style={{height: `${height}px`}}>
|
||||
<Alert message="菜单指的是系统的功能,最少10个菜单,最多15个菜单" type="info"/>
|
||||
<Alert message={`菜单指的是系统的功能,最少${minSize}个菜单,最多${maxSize}个菜单`} type="info"/>
|
||||
<div className="mod-content">
|
||||
<Form
|
||||
name="basic"
|
||||
|
@ -48,7 +48,7 @@ export default function ProjEditStep1() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '标题简介'},
|
||||
]}
|
||||
/>
|
||||
@ -143,7 +143,8 @@ export default function ProjEditStep1() {
|
||||
<Flex align="center" justify="center" gap="large">
|
||||
<Button type="primary"
|
||||
htmlType="submit"
|
||||
style={{backgroundColor: 'var(--color-primary)'}}>
|
||||
style={{backgroundColor: 'var(--color-primary)'}}
|
||||
>
|
||||
保存
|
||||
</Button>
|
||||
<Button type="default" htmlType="button" onClick={() => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import './proj-edit-step.css';
|
||||
import {Breadcrumb, Col, message, Row, Select} from "antd";
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect} from "react";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
import {Form, Input} from 'antd';
|
||||
@ -17,6 +17,7 @@ type FieldType = {
|
||||
};
|
||||
|
||||
export default function ProjEditStep1Show() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FieldType>();
|
||||
@ -45,7 +46,7 @@ export default function ProjEditStep1Show() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '标题简介'},
|
||||
]}
|
||||
/>
|
||||
|
@ -49,7 +49,7 @@ export default function ProjEditStep2() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '基本信息'},
|
||||
]}
|
||||
/>
|
||||
|
@ -1,7 +1,7 @@
|
||||
import './proj-edit-step.css';
|
||||
import {Breadcrumb, Col, DatePicker, message, Row} from "antd";
|
||||
import locale from 'antd/es/date-picker/locale/zh_CN';
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect} from "react";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
import {Form, Input} from 'antd';
|
||||
@ -17,6 +17,7 @@ type FieldType = {
|
||||
};
|
||||
|
||||
export default function ProjEditStep2Show() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FieldType>();
|
||||
@ -46,7 +47,7 @@ export default function ProjEditStep2Show() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '基本信息'},
|
||||
]}
|
||||
/>
|
||||
|
@ -135,7 +135,7 @@ export default function ProjEditStep3() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '软件功能特点'},
|
||||
]}
|
||||
/>
|
||||
|
@ -1,6 +1,6 @@
|
||||
import './proj-edit-step.css';
|
||||
import {Breadcrumb, Col, message, Row, Checkbox, Divider} from "antd";
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect, useState} from "react";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
import {Form, Input} from 'antd';
|
||||
@ -32,6 +32,7 @@ type FormFieldType = {
|
||||
};
|
||||
|
||||
export default function ProjEditStep3Show() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FormFieldType>();
|
||||
@ -132,7 +133,7 @@ export default function ProjEditStep3Show() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '软件功能特点'},
|
||||
]}
|
||||
/>
|
||||
|
@ -91,7 +91,7 @@ export default function ProjEditStep4() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '著作人信息'},
|
||||
]}
|
||||
/>
|
||||
|
@ -1,7 +1,7 @@
|
||||
import './proj-edit-step.css';
|
||||
import {Breadcrumb, Cascader, Col, DatePicker, message, Row, Select} from "antd";
|
||||
import locale from 'antd/es/date-picker/locale/zh_CN';
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect, useState} from "react";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
import {Form, Input} from 'antd';
|
||||
@ -28,6 +28,7 @@ interface Option {
|
||||
}
|
||||
|
||||
export default function ProjEditStep4Show() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FieldType>();
|
||||
@ -88,7 +89,7 @@ export default function ProjEditStep4Show() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '著作人信息'},
|
||||
]}
|
||||
/>
|
||||
|
@ -52,7 +52,7 @@ export default function ProjEditStep5() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '申请人信息'},
|
||||
]}
|
||||
/>
|
||||
|
@ -1,6 +1,6 @@
|
||||
import './proj-edit-step.css';
|
||||
import {Breadcrumb, Col, message, Row} from "antd";
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect} from "react";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
import {Form, Input} from 'antd';
|
||||
@ -18,6 +18,7 @@ type FieldType = {
|
||||
};
|
||||
|
||||
export default function ProjEditStep5Show() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FieldType>();
|
||||
@ -49,7 +50,7 @@ export default function ProjEditStep5Show() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '申请人信息'},
|
||||
]}
|
||||
/>
|
||||
|
@ -67,7 +67,7 @@ export default function ProjEditStep6() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '选择登录页面'},
|
||||
]}
|
||||
/>
|
||||
|
@ -1,6 +1,6 @@
|
||||
import './proj-edit-step.css';
|
||||
import {Breadcrumb, Col, message, Row} from "antd";
|
||||
import {Link, useParams} from "react-router-dom";
|
||||
import {Link, useNavigate, useParams} from "react-router-dom";
|
||||
import {useEffect, useState} from "react";
|
||||
import {get} from "../../../util/AjaxUtils.ts";
|
||||
import {Form} from 'antd';
|
||||
@ -13,6 +13,7 @@ type FieldType = {
|
||||
};
|
||||
|
||||
export default function ProjEditStep6Show() {
|
||||
const nav = useNavigate();
|
||||
const pathParams = useParams();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [form] = Form.useForm<FieldType>();
|
||||
@ -62,7 +63,7 @@ export default function ProjEditStep6Show() {
|
||||
items={[
|
||||
{title: <Link to={'/'}>首页</Link>},
|
||||
{title: <Link to={'/proj-create'}>创建项目</Link>},
|
||||
{title: <Link to={`/proj-edit/${pathParams.projId}`}>编辑项目</Link>},
|
||||
{title: <a onClick={() => {nav(-1)}}>编辑项目</a>},
|
||||
{title: '选择登录页面'},
|
||||
]}
|
||||
/>
|
||||
|
@ -3,6 +3,8 @@ import Index from "../route/index/Index.tsx";
|
||||
import ProjCreate from "./proj/ProjCreate.tsx";
|
||||
import ProjNew from "./proj/ProjNew.tsx";
|
||||
import ProjEdit from "./proj/ProjEdit.tsx";
|
||||
import ProjEditAll from "./proj/ProjEditAll.tsx";
|
||||
import ProjEditFree from "./proj/ProjEditFree.tsx";
|
||||
import ProjEditStep1 from "./proj/edit/ProjEditStep1.tsx";
|
||||
import ProjEditStep1Show from "./proj/edit/ProjEditStep1Show.tsx";
|
||||
import ProjEditStep2 from "./proj/edit/ProjEditStep2.tsx";
|
||||
@ -46,6 +48,14 @@ export const router = createHashRouter([
|
||||
path: '/proj-edit/:projId',
|
||||
element: <ProjEdit/>
|
||||
},
|
||||
{
|
||||
path: '/proj-eall/:projId',
|
||||
element: <ProjEditAll/>
|
||||
},
|
||||
{
|
||||
path: '/proj-efree/:projId',
|
||||
element: <ProjEditFree/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/step1/:projId',
|
||||
element: <ProjEditStep1/>
|
||||
@ -107,21 +117,37 @@ export const router = createHashRouter([
|
||||
element: <ProjConfigModList/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-list-show/:projId',
|
||||
path: '/proj-edit/config-mod-flist/:projId',
|
||||
element: <ProjConfigModList isFree={true}/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-flist-show/:projId',
|
||||
element: <ProjConfigModListShow/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-save/:projId',
|
||||
element: <ProjConfigModSave/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-fsave/:projId',
|
||||
element: <ProjConfigModSave isFree={true}/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-edit/:projId/:projModId',
|
||||
element: <ProjConfigModEdit/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-fedit/:projId/:projModId',
|
||||
element: <ProjConfigModEdit isFree={true}/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-show/:projId/:projModId',
|
||||
element: <ProjConfigModShow/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-mod-fshow/:projId/:projModId',
|
||||
element: <ProjConfigModShow isFree={true}/>
|
||||
},
|
||||
{
|
||||
path: '/proj-edit/config-menu-list/:projId',
|
||||
element: <ProjConfigMenuList/>
|
||||
|
@ -5,8 +5,8 @@ export const Axios = axios;
|
||||
|
||||
axios.defaults.baseURL = 'http://127.0.0.1:7025/copyright';
|
||||
// axios.defaults.baseURL = '/copyright';
|
||||
// export const DevUserId: string = '80d3365e-0597-4988-979e-18ef1c3ec671'; // 18634604067
|
||||
export const DevUserId: string = 'c2438eb8-2685-49a9-bf02-5111a5192d96'; // 18647109157
|
||||
export const DevUserId: string = '80d3365e-0597-4988-979e-18ef1c3ec671'; // 18634604067
|
||||
// export const DevUserId: string = 'c2438eb8-2685-49a9-bf02-5111a5192d96'; // 18647109157
|
||||
// export const DevUserId: string = '';
|
||||
|
||||
type Req<T> = {
|
||||
|
@ -1 +1,29 @@
|
||||
export const errorImage = 'data:image/png;base64,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';
|
||||
export const errorImage = 'data:image/png;base64,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';
|
||||
|
||||
export const uuid = () => {
|
||||
if (typeof crypto === 'object') {
|
||||
if (typeof crypto.randomUUID === 'function') {
|
||||
return crypto.randomUUID();
|
||||
}
|
||||
if (typeof crypto.getRandomValues === 'function' && typeof Uint8Array === 'function') {
|
||||
const callback = (c: string) => {
|
||||
const num = Number(c);
|
||||
return (num ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (num / 4)))).toString(16);
|
||||
};
|
||||
return (1e7 + -1e3 + -4e3 + -8e3 + -1e11).toString().replace(/[018]/g, callback);
|
||||
}
|
||||
}
|
||||
let timestamp = new Date().getTime();
|
||||
let perforNow = (typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0;
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
||||
let random = Math.random() * 16;
|
||||
if (timestamp > 0) {
|
||||
random = (timestamp + random) % 16 | 0;
|
||||
timestamp = Math.floor(timestamp / 16);
|
||||
} else {
|
||||
random = (perforNow + random) % 16 | 0;
|
||||
perforNow = Math.floor(perforNow / 16);
|
||||
}
|
||||
return (c === 'x' ? random : (random & 0x3) | 0x8).toString(16);
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue
Block a user