修改bot路由、白名单用户安装bot时仅安装组织下的某个仓库

This commit is contained in:
谢思 2023-03-25 13:32:30 +08:00
parent 535238b50a
commit 9dd08c47a9
15 changed files with 76 additions and 44 deletions

View File

@ -353,7 +353,7 @@ class App extends Component {
</Route>
{/* 上架bot配置 */}
<Route
path="/settings/exploitBot/configuration/:id"
path="/settings/mybot/configuration/:id"
render={(p) => (
<ConfigurateBot {...this.props} {...p}/>
)}

View File

@ -25,7 +25,7 @@ if (isDev) {
}
debugType = window.location.search.indexOf('debug=t') !== -1 ? 'teacher' :
window.location.search.indexOf('debug=s') !== -1 ? 'student' :
window.location.search.indexOf('debug=a') !== -1 ? 'admin' : parsed.debug || 'admin'
window.location.search.indexOf('debug=a') !== -1 ? 'admin' : parsed.debug || 'student'
}
window._debugType = debugType;
export function initAxiosInterceptors(props) {

View File

@ -119,8 +119,8 @@ function Index(props){
</ul>
<ul className="securityUl">
<li>Bot开发</li>
<li className={pathname.indexOf("/settings/exploitBot")>-1 ?"active":""}><Link to={`/settings/exploitBot`}><i className="iconfont icon-kaifabot mr5 font-18"></i><span className="text-shodow-bold">我的Bot</span></Link></li>
<li className={pathname.indexOf("/settings/dispositionBot")>-1 ?"active":""}><Link to={`/settings/dispositionBot`}><i className="iconfont icon-BOTpeizhi mr5 font-17"></i><span className="text-shodow-bold">Bot安装</span></Link></li>
<li className={pathname.indexOf("/settings/mybot")>-1 ?"active":""}><Link to={`/settings/mybot`}><i className="iconfont icon-kaifabot mr5 font-18"></i><span className="text-shodow-bold">我的Bot</span></Link></li>
<li className={pathname.indexOf("/settings/installbot")>-1 ?"active":""}><Link to={`/settings/installbot`}><i className="iconfont icon-BOTpeizhi mr5 font-17"></i><span className="text-shodow-bold">Bot安装</span></Link></li>
</ul>
</div>
<LongWidth>
@ -188,28 +188,28 @@ function Index(props){
></Route>
{/* 创建一个新的bot */}
<Route
path="/settings/exploitBot/new"
path="/settings/mybot/new"
render={(p) => (
<CreateBot {...props} {...p}/>
)}
></Route>
{/* 开发bot */}
<Route
path="/settings/exploitBot"
path="/settings/mybot"
render={(p) => (
<ExploitBot {...props} {...p}/>
)}
></Route>
{/* bot配置页面 */}
<Route
path="/settings/dispositionBot/:id"
path="/settings/installbot/:id"
render={(p) => (
<DispositionDetail {...props} {...p}/>
)}
></Route>
{/* bot配置 */}
<Route
path="/settings/dispositionBot"
path="/settings/installbot"
render={(p) => (
<Disposition {...props} {...p}/>
)}

View File

@ -125,7 +125,7 @@ function DispositionDetail(props){
<span className="color88">{botDetail && botDetail.create_time}</span>
</div>
</div>}
<Button style={{width: '53px', padding: '0'}} className="grayBorBut"><Link to={`/settings/dispositionBot`}>返回</Link></Button>
<Button style={{width: '53px', padding: '0'}} className="grayBorBut"><Link to={`/settings/installbot`}>返回</Link></Button>
</div>
{botDetail && <div className="mb10 greenCol font-16"><i className={`mr8 iconfont ${botDetail.limit_vo.juris_diction_code !== 2 ? 'icon-wanchenggouxuan' : 'icon-tishi1 font-16'}`}></i>代码库{botDetail.limit_vo.juris_diction_code === 2 ? '无' : botDetail.limit_vo.juris_diction_code === 1 ? '读写' : '只读'}权限</div>}
{botDetail && <div className="mb20 greenCol font-16"><i className={`mr8 iconfont ${botDetail.limit_vo.juris_diction_pr !== 2 ? 'icon-wanchenggouxuan' : 'icon-tishi1 font-16'}`}></i>合并请求(PR){botDetail.limit_vo.juris_diction_pr === 2 ? '无' : botDetail.limit_vo.juris_diction_pr === 1 ? '读写' : '只读'}权限</div>}
@ -141,7 +141,7 @@ function DispositionDetail(props){
onChange={selectChange}
className="radioBox selectBox"
>
{filterOption.map(item=>(<Select.Option key={item.id} value={item.id}>{item.name}</Select.Option>))}
{filterOption.map(item=>(<Select.Option key={item.id} value={item.id}>{`${item.author && item.author.name}/${item.name}`}</Select.Option>))}
</Select>}
{checkValue === 1 && selectValue.map((item, index)=>{return <div key={index} className="selectValueBox font-14">
<i className="iconfont icon-daimakuicon1 font-14 mr5"></i>

View File

@ -51,11 +51,11 @@ function DispositionBot(props){
{botList.map((item, index)=>{return <div className="disBotItem" key={index}>
<div className="botNameLeft">
<img src={getImageUrl(item.logo)} alt="" className="imgBox mr20"/>
<Link className="font-15 botName" to={`/settings/dispositionBot/${item.bot_id}`}>{item.bot_name}</Link>
<Link className="font-15 botName" to={`/settings/installbot/${item.bot_id}`}>{item.bot_name}</Link>
<span className={`statusBox font-12 ml10 ${item.state === 0 ? '' : 'active'}`}>{item.state === 0 ? '挂起' : '启用'}</span>
</div>
<div>
<Button className="themeCorBorBut" style={{width: '68px', height: '36px'}}><Link to={`/settings/dispositionBot/${item.bot_id}`}>配置</Link></Button>
<Button className="themeCorBorBut" style={{width: '68px', height: '36px'}}><Link to={`/settings/installbot/${item.bot_id}`}>配置</Link></Button>
<Button className="dangerBorBut ml20" style={{width: '68px', height: '36px'}} onClick={()=>{setDelBotId(item.bot_id);setVisible(true)}}>卸载</Button>
</div>
</div>})}

View File

@ -84,7 +84,7 @@
}
}
.selectBox{
width: 260px;
width: 360px;
margin: 10px 0 0 24px;
.ant-select-selection{padding-top: 0;}
.ant-select-selection__placeholder{

View File

@ -134,7 +134,7 @@ function AdvancedInformation(props){
if(res && res.code === 200){
message.success('删除成功');
setVisibleDelete(false);
props.history.push("/settings/exploitBot/configuration");
props.history.push("/settings/mybot/configuration");
}
})
}else{
@ -202,7 +202,7 @@ function AdvancedInformation(props){
<p className="grayBox font-14">目前您的Bot所有用户都能安装</p>
</div>
<div>
<Button type="primary" style={{width:"88px", height: '36px', padding: '0'}} className="mr20"><Link to={`/settings/exploitBot/configuration/${id}/advanced/putaway`}>上架市场</Link></Button>
<Button type="primary" style={{width:"88px", height: '36px', padding: '0'}} className="mr20"><Link to={`/settings/mybot/configuration/${id}/advanced/putaway`}>上架市场</Link></Button>
<Button className="themeCorBorBut" style={{width:"88px", height: '36px', padding: '0'}} onClick={()=>{setType('2');setVisibleDelete(true)}}>私有此Bot</Button>
</div>
</div>}
@ -212,7 +212,7 @@ function AdvancedInformation(props){
<p className="grayBox font-14">目前您的Bot所有用户都能安装</p>
</div>
<div>
<Button type="primary" style={{width:"88px", height: '36px', padding: '0'}} className="mr20"><Link to={`/settings/exploitBot/configuration/${id}/advanced/putaway/edit`}>编辑</Link></Button>
<Button type="primary" style={{width:"88px", height: '36px', padding: '0'}} className="mr20"><Link to={`/settings/mybot/configuration/${id}/advanced/putaway/edit`}>编辑</Link></Button>
<Button className="themeCorBorBut" style={{width:"88px", height: '36px', padding: '0'}} onClick={()=>{setType('3');setVisibleDelete(true)}}>下架市场</Button>
</div>
</div>}

View File

@ -114,13 +114,21 @@ function BasicInformation(props){
<div className="disFlex">
<img src={miyao} alt="" className="imgBox"/>
<div>
<p className="font-16">{botDetail.client_secret}</p>
<div className="copyBotInfo">
<span className="font-16 oneLineSpan">{botDetail.client_secret}</span>
<CopyToClipboard text={botDetail.client_secret} onCopy={()=>{message.success('复制成功')}}>
<i className="iconfont icon-fuzhiicon ml5" style={{color: '#466aff'}}></i>
</CopyToClipboard>
</div>
<div className="copyBotInfo">
<span className="font-16 oneLineSpan">{botDetail.private_key}</span>
<CopyToClipboard text={botDetail.private_key} onCopy={()=>{message.success('复制成功')}}>
<i className="iconfont icon-fuzhiicon ml5" style={{color: '#466aff'}}></i>
</CopyToClipboard>
</div>
{/* <div className="font-15 grayCol">生成者姓名<span className="ml20">时间</span></div> */}
</div>
</div>
<CopyToClipboard text={botDetail.client_secret} onCopy={()=>{message.success('复制成功')}}>
<Button className="themeCorBorBut">复制</Button>
</CopyToClipboard>
</div>
<p className="informationHead mt30 pb15">Bot信息</p>
<Form className="basicInformationForm mt10" onSubmit={submit}>

View File

@ -35,6 +35,16 @@
padding: 25px 0;
border-bottom: 1px dashed #e0e6f5;
&:hover{background-color:rgba(125, 148, 246, 0.05);}
.copyBotInfo{
display: flex;
align-items: center;
}
.oneLineSpan{
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 680px;
}
}
.basicInformationForm{
.width80{

View File

@ -43,7 +43,7 @@ function ConfigurateBot(props){
setBotDetail(res.data.bot_output_vo);
}else if(res && res.code === 500){
message.error("您没有权限访问该bot");
history.push('/settings/exploitBot/configuration');
history.push('/settings/mybot/configuration');
}
})
}, [reload])
@ -51,42 +51,42 @@ function ConfigurateBot(props){
return <div className="configurateBotBox">
<div className="configurateBotHead mb30">
<span className="font-18 configurateBotTitle">Bot开发者配置</span>
<Button style={{width: '53px', padding: '0'}} className="grayBorBut"><Link to={`/settings/exploitBot/configuration`}>返回</Link></Button>
<Button style={{width: '53px', padding: '0'}} className="grayBorBut"><Link to={`/settings/mybot/configuration`}>返回</Link></Button>
</div>
<Box>
<div className="leftBox mr30">
<Link to={`/settings/exploitBot/configuration/${id}/basic`} className={pathname.lastIndexOf("/jurisdiction") === -1 && pathname.lastIndexOf("/advanced") === -1 ?"active itemBox":"itemBox"}>基本信息</Link>
<Link to={`/settings/exploitBot/configuration/${id}/jurisdiction`} className={pathname.lastIndexOf("/jurisdiction") > -1 ?"active itemBox":"itemBox"}>权限&订阅</Link>
<Link to={`/settings/exploitBot/configuration/${id}/advanced`} className={pathname.lastIndexOf("/advanced") > -1 ?"active itemBox":"itemBox"}>高级选项</Link>
<Link to={`/settings/mybot/configuration/${id}/basic`} className={pathname.lastIndexOf("/jurisdiction") === -1 && pathname.lastIndexOf("/advanced") === -1 ?"active itemBox":"itemBox"}>基本信息</Link>
<Link to={`/settings/mybot/configuration/${id}/jurisdiction`} className={pathname.lastIndexOf("/jurisdiction") > -1 ?"active itemBox":"itemBox"}>权限&订阅</Link>
<Link to={`/settings/mybot/configuration/${id}/advanced`} className={pathname.lastIndexOf("/advanced") > -1 ?"active itemBox":"itemBox"}>高级选项</Link>
</div>
<Switch>
{/* bot上架市场 */}
<Route
path="/settings/exploitBot/configuration/:id/advanced/putaway"
path="/settings/mybot/configuration/:id/advanced/putaway"
render={(p) => (
<Putaway {...props} {...p} botDetail={botDetail} setReload={setReload}/>
)}
></Route>
<Route
path="/settings/exploitBot/configuration/:id/advanced/putaway/edit"
path="/settings/mybot/configuration/:id/advanced/putaway/edit"
render={(p) => (
<Putaway {...props} {...p} botDetail={botDetail} setReload={setReload}/>
)}
></Route>
<Route
path="/settings/exploitBot/configuration/:id/basic"
path="/settings/mybot/configuration/:id/basic"
render={(p)=>(<BasicInformation {...props} {...p} botDetail={botDetail} setReload={setReload}/>)}
></Route>
<Route
path="/settings/exploitBot/configuration/:id/jurisdiction"
path="/settings/mybot/configuration/:id/jurisdiction"
render={(p)=>(<Jurisdiction {...props} {...p} botDetail={botDetail} setReload={setReload}/>)}
></Route>
<Route
path="/settings/exploitBot/configuration/:id/advanced"
path="/settings/mybot/configuration/:id/advanced"
render={(p)=>(<AdvancedInformation {...props} {...p} botDetail={botDetail} setReload={setReload}/>)}
></Route>
<Route
path="/settings/exploitBot/configuration/:id"
path="/settings/mybot/configuration/:id"
render={(p)=>(<BasicInformation {...props} {...p} botDetail={botDetail} setReload={setReload}/>)}
></Route>
</Switch>

View File

@ -75,7 +75,7 @@ function ExploitBot(props){
return <div>
<div className="exploitHead font-18">
<span>我的Bot</span>
<Button type="primary" style={{width: '100px', height: '36px'}}><Link to={`/settings/exploitBot/new`}>Bot注册</Link></Button>
<Button type="primary" style={{width: '100px', height: '36px'}}><Link to={`/settings/mybot/new`}>Bot注册</Link></Button>
</div>
{/* bot转让接收按钮显示区域 */}
@ -97,15 +97,15 @@ function ExploitBot(props){
{botList.map((item, index)=>{return <div className="softBotItem" key={index}>
<div className="botOneLine botNameWarpBox">
<img src={getImageUrl(item.logo)} alt="" className="imgBox mr20" object-fit="fill"/>
<Link className="font-15 botOneLine botNameBox" to={`/settings/exploitBot/configuration/${item.bot_id}`}>{item.bot_name}</Link>
<Link className="font-15 botOneLine botNameBox" to={`/settings/mybot/configuration/${item.bot_id}`}>{item.bot_name}</Link>
<span className={`font-12 ml10 statusBot ${item.is_public ? item.is_market ? 'market' : 'public' : 'private'}`}>{item.is_public ? item.is_market ? '上架' : '公开' : '私有'}</span>
</div>
<Button className="themeCorBorBut ml30" style={{width: '68px', height: '36px'}}><Link to={`/settings/exploitBot/configuration/${item.bot_id}`}>编辑</Link></Button>
<Button className="themeCorBorBut ml30" style={{width: '68px', height: '36px'}}><Link to={`/settings/mybot/configuration/${item.bot_id}`}>编辑</Link></Button>
</div>})}
</div> : <div className="nullBotsBox mt80">
<img src={nullBot} alt="" width={62}/>
<p className="font-18 showBigTip">您当前暂未注册任何Bot</p>
<div className="showTip font-14">Bot可以帮助您自动化处理一些繁杂的项目任务欢迎您<Link to="/settings/exploitBot/new"> 注册一个Bot </Link>基于GitLink API进行开发<br/>此外您还可以在<Link to="/softbot"> Bot市场 </Link>中共享或安装他人的Bot</div>
<div className="showTip font-14">Bot可以帮助您自动化处理一些繁杂的项目任务欢迎您<Link to="/settings/mybot/new"> 注册一个Bot </Link>基于GitLink API进行开发<br/>此外您还可以在<Link to="/softbot"> Bot市场 </Link>中共享或安装他人的Bot</div>
</div>)}
<Modal

View File

@ -82,7 +82,7 @@ function Disposition(props){
registerBot(param).then(res=>{
if(res && res.code === 200){
message.success('注册成功');
props.history.push('/settings/exploitBot/configuration/'+res.data.bot_id);
props.history.push('/settings/mybot/configuration/'+res.data.bot_id);
}else{
message.success('注册失败: '+res.data);
}
@ -92,7 +92,7 @@ function Disposition(props){
return <div className="createExploitBox">
<div className="ceHead pb5 font-16 mb10">
<Link to={`/settings/exploitBot`} className="blue-Purple">我的Bot</Link><span className="ceTitle font-18"><i className="iconfont icon-youjiantou ml5 mr5 font-12"></i>注册新的Bot</span>
<Link to={`/settings/mybot`} className="blue-Purple">我的Bot</Link><span className="ceTitle font-18"><i className="iconfont icon-youjiantou ml5 mr5 font-12"></i>注册新的Bot</span>
</div>
<Form className="createExploitForm" onSubmit={submit}>
<Form.Item label="Bot名称" className="width50 botItem">

View File

@ -32,7 +32,7 @@ function SoftBot(props){
<span className="font-15 botName">{item.bot_name}</span>
<span className={`statusBox font-12 ml10 ${item.state === 0 ? '' : 'active'}`}>{item.state === 0 ? '挂起' : '启用'}</span>
</div>
<Button className="themeCorBorBut" style={{width: '68px', height: '36px'}}><Link to={`/settings/dispositionBot/${item.bot_id}`}>配置</Link></Button>
<Button className="themeCorBorBut" style={{width: '68px', height: '36px'}}><Link to={`/settings/installbot/${item.bot_id}`}>配置</Link></Button>
</div>})}
</div> : <div className="nullBotBox mt20">
<img src={nullBot} alt="" width={62}/>

View File

@ -5,6 +5,7 @@ import { getImageUrl } from 'educoder';
import './index.scss';
import axios from "axios";
import RenderHtml from "../../components/render-html";
import { Link } from "react-router-dom";
function SoftBotDEtail(props){
const {match:{params:{id}}, current_user, history, showLoginDialog} = props;
@ -18,6 +19,8 @@ function SoftBotDEtail(props){
// bot
const [isInstall, setIsInstall] = useState(false);
const [reload, setReload] = useState(undefined);
// userLoginMap:
const userLoginMap = ["wangtao", "wuxiaojun", "durian", "pxicb3wke", "xxq250", "Nigel"];
useEffect(()=>{
if(current_user && current_user.login){
@ -26,7 +29,7 @@ function SoftBotDEtail(props){
params:{
limit: 1000,
page: 1,
category:"manage"
category: userLoginMap.includes(current_user.login) ? "admin" : "manage"
}
}).then(result=>{
if(result && result.data){
@ -84,7 +87,7 @@ function SoftBotDEtail(props){
function click(){
if(isInstall){
props.history.push(`/settings/dispositionBot/${id}`)
props.history.push(`/settings/installbot/${id}`)
}else{
if(current_user && current_user.login){
// bot
@ -134,7 +137,17 @@ function SoftBotDEtail(props){
store_list: checkValue ? selectValue.map(item=>{return item.id}) : options.map(item=>{return item.id}),
repo_map
}
installMarketBot(params).then(res=>{
let bool = true;
// selectValue
if(userLoginMap.includes(current_user.login)){
if(selectValue.length === 1 && selectValue[0].author.type === "Organization"){
params.login = selectValue[0].author.login;
}else{
message.error("请选择组织下的一个仓库");
bool = false;
}
}
bool && installMarketBot(params).then(res=>{
if(res && res.code === 200){
message.success("安装成功");
setVisible(false);
@ -185,12 +198,13 @@ function SoftBotDEtail(props){
onChange={selectChange}
className="installSelectBox"
dropdownClassName="installDropdownClass"
getPopupContainer={trigger => trigger.parentNode}
>
{filterOption.map(item=>(<Select.Option key={item.id} value={item.id}>{item.name}</Select.Option>))}
{filterOption.map(item=>(<Select.Option key={item.id} value={item.id}>{`${item.author && item.author.name}/${item.name}`}</Select.Option>))}
</Select>}
{checkValue === 1 && selectValue.map((item, index)=>{return <div key={index} className="selectValueBox font-14">
<i className="iconfont icon-daimakuicon1 font-14 mr5"></i>
<span className="selectValue">{`${item.author && item.author.name}/${item.name}`}</span>
<Link className="selectValue" to={`/${item.author && item.author.login}/${item.identifier}`}>{`${item.author && item.author.name}/${item.name}`}</Link>
<i className="iconfont icon-guanbi font-12 close ml30" onClick={()=>{deleteSelect(item)}}></i>
</div>})}
<div className="installTil font-18 mt20 mb10">权限信息</div>

View File

@ -60,7 +60,7 @@ function SoftBot(props){
//
function registerBot(){
if(current_user && current_user.login){
history.push('/settings/exploitBot/new');
history.push('/settings/mybot/new');
}else{
showLoginDialog();
}