调整页面

This commit is contained in:
WenC 2024-04-12 18:18:14 +08:00
parent d4a75e7933
commit 94d3198c1a
34 changed files with 569 additions and 291 deletions

View File

@ -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>
)
}

View File

@ -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>

View File

@ -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);

View File

@ -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: '',

View File

@ -13,7 +13,6 @@ export interface User {
hasUserInfo: boolean;
}
export function reloadUser(messageApi: MessageInstance, globalDispatchContext: Dispatch<GlobalDataAction>) {
return new Promise<any>(resolve => {
get<any>({

View File

@ -40,6 +40,7 @@ export interface IProjDownload {
export interface IProjJump {
title: string;
desc: string;
canBtnClick?: boolean;
handleJump(): void;
}

View File

@ -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: '找代理'},
]}
/>

View File

@ -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>
</>
)
}

View 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>
</>
)
}

View File

@ -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);

View File

@ -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: '登录界面设置'},
]}
/>

View File

@ -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: '登录界面设置'},
]}
/>

View File

@ -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: '系统菜单顺序'},
]}
/>

View File

@ -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: '系统菜单顺序'},
]}
/>

View File

@ -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"

View File

@ -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>
) : <></>
}

View File

@ -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: '系统菜单查看'},
]}
/>

View File

@ -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>

View File

@ -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"

View File

@ -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={() => {

View File

@ -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: '标题简介'},
]}
/>

View File

@ -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: '基本信息'},
]}
/>

View File

@ -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: '基本信息'},
]}
/>

View File

@ -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: '软件功能特点'},
]}
/>

View File

@ -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: '软件功能特点'},
]}
/>

View File

@ -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: '著作人信息'},
]}
/>

View File

@ -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: '著作人信息'},
]}
/>

View File

@ -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: '申请人信息'},
]}
/>

View File

@ -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: '申请人信息'},
]}
/>

View File

@ -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: '选择登录页面'},
]}
/>

View File

@ -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: '选择登录页面'},
]}
/>

View File

@ -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/>

View File

@ -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> = {

View File

@ -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);
});
}