UNPKG

whistle.mock-plugins

Version:

Whistle 插件,用于快速创建 API 模拟数据

225 lines (208 loc) 7.57 kB
import React, { useState } from 'react'; import AppLayout from '../components/AppLayout'; import '../styles/url-redirect.css'; const UrlRedirect = () => { const [urlRedirects, setUrlRedirects] = useState([ { id: 1, sourceUrl: 'https://api.example.com/users', targetUrl: 'http://localhost:3000/mock/users', description: '用户API重定向到本地', active: true }, { id: 2, sourceUrl: 'https://api.example.com/products', targetUrl: 'http://localhost:3000/mock/products', description: '产品API重定向到本地', active: false } ]); const [isModalOpen, setIsModalOpen] = useState(false); const [currentRedirect, setCurrentRedirect] = useState(null); const [sourceUrl, setSourceUrl] = useState(''); const [targetUrl, setTargetUrl] = useState(''); const [description, setDescription] = useState(''); const openModal = (redirect = null) => { if (redirect) { setCurrentRedirect(redirect); setSourceUrl(redirect.sourceUrl); setTargetUrl(redirect.targetUrl); setDescription(redirect.description); } else { setCurrentRedirect(null); setSourceUrl(''); setTargetUrl(''); setDescription(''); } setIsModalOpen(true); }; const closeModal = () => { setIsModalOpen(false); }; const handleSubmit = (e) => { e.preventDefault(); if (!sourceUrl || !targetUrl) { alert('请填写源URL和目标URL'); return; } if (currentRedirect) { // 编辑现有配置 setUrlRedirects(urlRedirects.map(redirect => redirect.id === currentRedirect.id ? { ...redirect, sourceUrl, targetUrl, description } : redirect )); } else { // 添加新配置 const newRedirect = { id: urlRedirects.length > 0 ? Math.max(...urlRedirects.map(r => r.id)) + 1 : 1, sourceUrl, targetUrl, description, active: true }; setUrlRedirects([...urlRedirects, newRedirect]); } closeModal(); }; const toggleActive = (id) => { setUrlRedirects(urlRedirects.map(redirect => redirect.id === id ? { ...redirect, active: !redirect.active } : redirect )); }; const deleteRedirect = (id) => { if (window.confirm('确定要删除此条重定向配置吗?')) { setUrlRedirects(urlRedirects.filter(redirect => redirect.id !== id)); } }; return ( <AppLayout> <div className="url-redirect-container"> <div className="page-title-bar"> <div> <h1 className="page-title">URL重定向配置</h1> <div className="page-description"> 配置URL重定向规则,支持路径和查询参数匹配 </div> </div> <div className="page-actions"> <button className="add-button" onClick={() => openModal()}> 添加URL重定向 </button> </div> </div> <div className="redirect-list-container"> {urlRedirects.length === 0 ? ( <div className="empty-data"> <div className="empty-icon">🔄</div> <div className="empty-text">暂无URL重定向配置</div> <button className="add-button" onClick={() => openModal()}> 添加URL重定向 </button> </div> ) : ( <table className="redirect-table"> <thead> <tr> <th>状态</th> <th>源URL</th> <th>目标URL</th> <th>描述</th> <th>操作</th> </tr> </thead> <tbody> {urlRedirects.map(redirect => ( <tr key={redirect.id} className={redirect.active ? '' : 'inactive'}> <td> <label className="switch"> <input type="checkbox" checked={redirect.active} onChange={() => toggleActive(redirect.id)} /> <span className="slider"></span> </label> </td> <td className="url-text">{redirect.sourceUrl}</td> <td className="url-text">{redirect.targetUrl}</td> <td>{redirect.description || '-'}</td> <td> <div className="action-buttons"> <button className="edit-button" onClick={() => openModal(redirect)} > 编辑 </button> <button className="delete-button" onClick={() => deleteRedirect(redirect.id)} > 删除 </button> </div> </td> </tr> ))} </tbody> </table> )} </div> {isModalOpen && ( <div className="modal-overlay"> <div className="modal"> <div className="modal-header"> <h2>{currentRedirect ? '编辑URL重定向' : '添加URL重定向'}</h2> <button className="close-button" onClick={closeModal}>×</button> </div> <form className="redirect-form" onSubmit={handleSubmit}> <div className="form-group"> <label>源URL</label> <input type="text" value={sourceUrl} onChange={(e) => setSourceUrl(e.target.value)} placeholder="https://api.example.com/endpoint" required /> <div className="help-text">需要重定向的原始URL</div> </div> <div className="form-group"> <label>目标URL</label> <input type="text" value={targetUrl} onChange={(e) => setTargetUrl(e.target.value)} placeholder="http://localhost:3000/mock/endpoint" required /> <div className="help-text">重定向的目标地址</div> </div> <div className="form-group"> <label>描述(可选)</label> <input type="text" value={description} onChange={(e) => setDescription(e.target.value)} placeholder="重定向描述" /> </div> <div className="form-actions"> <button type="button" className="cancel-button" onClick={closeModal}> 取消 </button> <button type="submit" className="submit-button"> {currentRedirect ? '保存修改' : '添加重定向'} </button> </div> </form> </div> </div> )} </div> </AppLayout> ); }; export default UrlRedirect;