diff --git a/src/pages/PromotionsPage/PromotionsPage.jsx b/src/pages/PromotionsPage/PromotionsPage.jsx
index 834ad73..ff01ef3 100644
--- a/src/pages/PromotionsPage/PromotionsPage.jsx
+++ b/src/pages/PromotionsPage/PromotionsPage.jsx
@@ -1,435 +1,435 @@
-import React, { useState, useEffect } from 'react';
-import './PromotionsPage.css';
+// import React, { useState, useEffect } from 'react';
+// import './PromotionsPage.css';
 
 
-function PromotionsPage() {
-  const [promotions, setPromotions] = useState([]);
-  const [currentPromotion, setCurrentPromotion] = useState(null);
-  const [isAdmin, setIsAdmin] = useState(false);
-  const [isLoading, setIsLoading] = useState(false);
-  const [error, setError] = useState(null);
-  const [formData, setFormData] = useState({
-    name: '',
-    uploadCoeff: 1,
-    downloadCoeff: 1,
-    timeRange: 0,
-    criteria: 1,
-    pStartTime: '',
-    pEndTime: ''
-  });
-  const [isCreating, setIsCreating] = useState(false);
-  const [currentPage, setCurrentPage] = useState(1);
-  const [perPage] = useState(10);
-  const [totalPromotions, setTotalPromotions] = useState(0);
+// function PromotionsPage() {
+//   const [promotions, setPromotions] = useState([]);
+//   const [currentPromotion, setCurrentPromotion] = useState(null);
+//   const [isAdmin, setIsAdmin] = useState(false);
+//   const [isLoading, setIsLoading] = useState(false);
+//   const [error, setError] = useState(null);
+//   const [formData, setFormData] = useState({
+//     name: '',
+//     uploadCoeff: 1,
+//     downloadCoeff: 1,
+//     timeRange: 0,
+//     criteria: 1,
+//     pStartTime: '',
+//     pEndTime: ''
+//   });
+//   const [isCreating, setIsCreating] = useState(false);
+//   const [currentPage, setCurrentPage] = useState(1);
+//   const [perPage] = useState(10);
+//   const [totalPromotions, setTotalPromotions] = useState(0);
 
-  const getAuthHeaders = () => {
-    const token = localStorage.getItem('token');
-    return {
-      'Authorization': token ? `Bearer ${token}` : '',
-      'Content-Type': 'application/json'
-    };
-  };
+//   const getAuthHeaders = () => {
+//     const token = localStorage.getItem('token');
+//     return {
+//       'Authorization': token ? `Bearer ${token}` : '',
+//       'Content-Type': 'application/json'
+//     };
+//   };
 
-  const fetchPromotions = async (page = 1) => {
-    setIsLoading(true);
-    try {
-      const response = await fetch(`/promotions/list?page=${page}&per_page=${perPage}`, {
-        headers: getAuthHeaders()
-      });
+//   const fetchPromotions = async (page = 1) => {
+//     setIsLoading(true);
+//     try {
+//       const response = await fetch(`/promotions/list?page=${page}&per_page=${perPage}`, {
+//         headers: getAuthHeaders()
+//       });
 
-      if (!response.ok) {
-        throw new Error('获取促销活动失败');
-      }
+//       if (!response.ok) {
+//         throw new Error('获取促销活动失败');
+//       }
 
-      const data = await response.json();
-      if (data.code === 0 && data.result) {
-        setPromotions(data.rows || []);
-        setTotalPromotions(data.total || 0);
-      } else {
-        throw new Error(data.msg || '获取促销活动失败');
-      }
-    } catch (err) {
-      console.error('获取促销活动错误:', err);
-      setError(err.message);
-    } finally {
-      setIsLoading(false);
-    }
-  };
+//       const data = await response.json();
+//       if (data.code === 0 && data.result) {
+//         setPromotions(data.rows || []);
+//         setTotalPromotions(data.total || 0);
+//       } else {
+//         throw new Error(data.msg || '获取促销活动失败');
+//       }
+//     } catch (err) {
+//       console.error('获取促销活动错误:', err);
+//       setError(err.message);
+//     } finally {
+//       setIsLoading(false);
+//     }
+//   };
 
-  const fetchPromotionDetails = async (promoId) => {
-    setIsLoading(true);
-    try {
-      const response = await fetch(`/promotions/${promoId}`, {
-        headers: getAuthHeaders()
-      });
+//   const fetchPromotionDetails = async (promoId) => {
+//     setIsLoading(true);
+//     try {
+//       const response = await fetch(`/promotions/${promoId}`, {
+//         headers: getAuthHeaders()
+//       });
 
-      if (!response.ok) {
-        throw new Error('获取促销详情失败');
-      }
+//       if (!response.ok) {
+//         throw new Error('获取促销详情失败');
+//       }
 
-      const data = await response.json();
-      if (data.code === 0 && data.result) {
-        setCurrentPromotion(data.rows);
-      } else {
-        throw new Error(data.msg || '获取促销详情失败');
-      }
-    } catch (err) {
-      console.error('获取促销详情错误:', err);
-      setError(err.message);
-    } finally {
-      setIsLoading(false);
-    }
-  };
+//       const data = await response.json();
+//       if (data.code === 0 && data.result) {
+//         setCurrentPromotion(data.rows);
+//       } else {
+//         throw new Error(data.msg || '获取促销详情失败');
+//       }
+//     } catch (err) {
+//       console.error('获取促销详情错误:', err);
+//       setError(err.message);
+//     } finally {
+//       setIsLoading(false);
+//     }
+//   };
 
-  const createPromotion = async () => {
-    if (!formData.name || !formData.pStartTime || !formData.pEndTime) {
-      alert('请填写完整活动信息');
-      return;
-    }
+//   const createPromotion = async () => {
+//     if (!formData.name || !formData.pStartTime || !formData.pEndTime) {
+//       alert('请填写完整活动信息');
+//       return;
+//     }
 
-    if (new Date(formData.pStartTime) >= new Date(formData.pEndTime)) {
-      alert('活动时间设置不正确，请重新设定');
-      return;
-    }
+//     if (new Date(formData.pStartTime) >= new Date(formData.pEndTime)) {
+//       alert('活动时间设置不正确，请重新设定');
+//       return;
+//     }
 
-    setIsLoading(true);
-    try {
-      const response = await fetch('/promotions/add', {
-        method: 'POST',
-        headers: getAuthHeaders(),
-        body: JSON.stringify(formData)
-      });
+//     setIsLoading(true);
+//     try {
+//       const response = await fetch('/promotions/add', {
+//         method: 'POST',
+//         headers: getAuthHeaders(),
+//         body: JSON.stringify(formData)
+//       });
 
-      if (!response.ok) {
-        throw new Error('创建促销活动失败');
-      }
+//       if (!response.ok) {
+//         throw new Error('创建促销活动失败');
+//       }
 
-      const data = await response.json();
-      if (data.code === 0 && data.result) {
-        alert(`活动创建成功！活动ID: ${data.msg}`);
-        setIsCreating(false);
-        setFormData({
-          name: '',
-          uploadCoeff: 1,
-          downloadCoeff: 1,
-          timeRange: 0,
-          criteria: 1,
-          pStartTime: '',
-          pEndTime: ''
-        });
-        fetchPromotions();
-      } else {
-        throw new Error(data.msg || '创建促销活动失败');
-      }
-    } catch (err) {
-      console.error('创建促销活动错误:', err);
-      alert(err.message);
-    } finally {
-      setIsLoading(false);
-    }
-  };
+//       const data = await response.json();
+//       if (data.code === 0 && data.result) {
+//         alert(`活动创建成功！活动ID: ${data.msg}`);
+//         setIsCreating(false);
+//         setFormData({
+//           name: '',
+//           uploadCoeff: 1,
+//           downloadCoeff: 1,
+//           timeRange: 0,
+//           criteria: 1,
+//           pStartTime: '',
+//           pEndTime: ''
+//         });
+//         fetchPromotions();
+//       } else {
+//         throw new Error(data.msg || '创建促销活动失败');
+//       }
+//     } catch (err) {
+//       console.error('创建促销活动错误:', err);
+//       alert(err.message);
+//     } finally {
+//       setIsLoading(false);
+//     }
+//   };
 
-  const deletePromotion = async (promoId) => {
-    if (!window.confirm('确定要删除这个促销活动吗？')) {
-      return;
-    }
+//   const deletePromotion = async (promoId) => {
+//     if (!window.confirm('确定要删除这个促销活动吗？')) {
+//       return;
+//     }
 
-    setIsLoading(true);
-    try {
-      const response = await fetch(`/promotions/delete/${promoId}`, {
-        method: 'DELETE',
-        headers: getAuthHeaders()
-      });
+//     setIsLoading(true);
+//     try {
+//       const response = await fetch(`/promotions/delete/${promoId}`, {
+//         method: 'DELETE',
+//         headers: getAuthHeaders()
+//       });
 
-      if (!response.ok) {
-        throw new Error('删除促销活动失败');
-      }
+//       if (!response.ok) {
+//         throw new Error('删除促销活动失败');
+//       }
 
-      const data = await response.json();
-      if (data.code === 0 && data.result) {
-        alert('促销活动删除成功');
-        fetchPromotions();
-        if (currentPromotion && currentPromotion.promoId === promoId) {
-          setCurrentPromotion(null);
-        }
-      } else {
-        throw new Error(data.msg || '删除促销活动失败');
-      }
-    } catch (err) {
-      console.error('删除促销活动错误:', err);
-      alert(err.message);
-    } finally {
-      setIsLoading(false);
-    }
-  };
+//       const data = await response.json();
+//       if (data.code === 0 && data.result) {
+//         alert('促销活动删除成功');
+//         fetchPromotions();
+//         if (currentPromotion && currentPromotion.promoId === promoId) {
+//           setCurrentPromotion(null);
+//         }
+//       } else {
+//         throw new Error(data.msg || '删除促销活动失败');
+//       }
+//     } catch (err) {
+//       console.error('删除促销活动错误:', err);
+//       alert(err.message);
+//     } finally {
+//       setIsLoading(false);
+//     }
+//   };
 
-  const checkAdminStatus = () => {
-    const role = localStorage.getItem('role');
-    setIsAdmin(role === 'admin');
-  };
+//   const checkAdminStatus = () => {
+//     const role = localStorage.getItem('role');
+//     setIsAdmin(role === 'admin');
+//   };
 
-  useEffect(() => {
-    checkAdminStatus();
-    fetchPromotions();
-  }, []);
+//   useEffect(() => {
+//     checkAdminStatus();
+//     fetchPromotions();
+//   }, []);
 
-  const handleInputChange = (e) => {
-    const { name, value } = e.target;
-    setFormData(prev => ({
-      ...prev,
-      [name]: name === 'uploadCoeff' || name === 'downloadCoeff' || name === 'timeRange' || name === 'criteria'
-          ? parseFloat(value)
-          : value
-    }));
-  };
+//   const handleInputChange = (e) => {
+//     const { name, value } = e.target;
+//     setFormData(prev => ({
+//       ...prev,
+//       [name]: name === 'uploadCoeff' || name === 'downloadCoeff' || name === 'timeRange' || name === 'criteria'
+//           ? parseFloat(value)
+//           : value
+//     }));
+//   };
 
-  const handlePageChange = (newPage) => {
-    setCurrentPage(newPage);
-    fetchPromotions(newPage);
-  };
+//   const handlePageChange = (newPage) => {
+//     setCurrentPage(newPage);
+//     fetchPromotions(newPage);
+//   };
 
-  const getPromotionType = (promo) => {
-    if (promo.downloadCoeff === 0 && promo.uploadCoeff > 1) {
-      return '免费';
-    } else if (promo.downloadCoeff < 1 && promo.uploadCoeff > 1) {
-      return '折扣+上传奖励';
-    } else if (promo.downloadCoeff < 1) {
-      return '折扣';
-    } else if (promo.uploadCoeff > 1) {
-      return '上传奖励';
-    }
-    return '普通';
-  };
+//   const getPromotionType = (promo) => {
+//     if (promo.downloadCoeff === 0 && promo.uploadCoeff > 1) {
+//       return '免费';
+//     } else if (promo.downloadCoeff < 1 && promo.uploadCoeff > 1) {
+//       return '折扣+上传奖励';
+//     } else if (promo.downloadCoeff < 1) {
+//       return '折扣';
+//     } else if (promo.uploadCoeff > 1) {
+//       return '上传奖励';
+//     }
+//     return '普通';
+//   };
 
-  return (
-      <div className="promotions-page">
-        <div className="promotions-container">
-          <h1>促销活动</h1>
+//   return (
+//       <div className="promotions-page">
+//         <div className="promotions-container">
+//           <h1>促销活动</h1>
 
-          {isAdmin && (
-              <div className="admin-actions">
-                <button
-                    className="create-button"
-                    onClick={() => setIsCreating(!isCreating)}
-                >
-                  {isCreating ? '取消创建' : '创建新活动'}
-                </button>
-              </div>
-          )}
+//           {isAdmin && (
+//               <div className="admin-actions">
+//                 <button
+//                     className="create-button"
+//                     onClick={() => setIsCreating(!isCreating)}
+//                 >
+//                   {isCreating ? '取消创建' : '创建新活动'}
+//                 </button>
+//               </div>
+//           )}
 
-          {isCreating && isAdmin && (
-              <div className="create-promotion-form">
-                <h2>创建新促销活动</h2>
-                <div className="form-group">
-                  <label>活动名称</label>
-                  <input
-                      type="text"
-                      name="name"
-                      value={formData.name}
-                      onChange={handleInputChange}
-                      placeholder="例如: 春节特惠"
-                  />
-                </div>
+//           {isCreating && isAdmin && (
+//               <div className="create-promotion-form">
+//                 <h2>创建新促销活动</h2>
+//                 <div className="form-group">
+//                   <label>活动名称</label>
+//                   <input
+//                       type="text"
+//                       name="name"
+//                       value={formData.name}
+//                       onChange={handleInputChange}
+//                       placeholder="例如: 春节特惠"
+//                   />
+//                 </div>
 
-                <div className="form-row">
-                  <div className="form-group">
-                    <label>上传量系数</label>
-                    <input
-                        type="number"
-                        name="uploadCoeff"
-                        min="0"
-                        step="0.1"
-                        value={formData.uploadCoeff}
-                        onChange={handleInputChange}
-                    />
-                  </div>
+//                 <div className="form-row">
+//                   <div className="form-group">
+//                     <label>上传量系数</label>
+//                     <input
+//                         type="number"
+//                         name="uploadCoeff"
+//                         min="0"
+//                         step="0.1"
+//                         value={formData.uploadCoeff}
+//                         onChange={handleInputChange}
+//                     />
+//                   </div>
 
-                  <div className="form-group">
-                    <label>下载量系数</label>
-                    <input
-                        type="number"
-                        name="downloadCoeff"
-                        min="0"
-                        step="0.1"
-                        value={formData.downloadCoeff}
-                        onChange={handleInputChange}
-                    />
-                  </div>
-                </div>
+//                   <div className="form-group">
+//                     <label>下载量系数</label>
+//                     <input
+//                         type="number"
+//                         name="downloadCoeff"
+//                         min="0"
+//                         step="0.1"
+//                         value={formData.downloadCoeff}
+//                         onChange={handleInputChange}
+//                     />
+//                   </div>
+//                 </div>
 
-                <div className="form-row">
-                  <div className="form-group">
-                    <label>资源时间范围</label>
-                    <select
-                        name="timeRange"
-                        value={formData.timeRange}
-                        onChange={handleInputChange}
-                    >
-                      <option value="0">全站资源</option>
-                      <option value="1">当天上传</option>
-                      <option value="2">最近两天</option>
-                      <option value="7">最近一周</option>
-                      <option value="30">最近一个月</option>
-                    </select>
-                  </div>
+//                 <div className="form-row">
+//                   <div className="form-group">
+//                     <label>资源时间范围</label>
+//                     <select
+//                         name="timeRange"
+//                         value={formData.timeRange}
+//                         onChange={handleInputChange}
+//                     >
+//                       <option value="0">全站资源</option>
+//                       <option value="1">当天上传</option>
+//                       <option value="2">最近两天</option>
+//                       <option value="7">最近一周</option>
+//                       <option value="30">最近一个月</option>
+//                     </select>
+//                   </div>
 
-                  <div className="form-group">
-                    <label>最低用户等级</label>
-                    <input
-                        type="number"
-                        name="criteria"
-                        min="1"
-                        value={formData.criteria}
-                        onChange={handleInputChange}
-                    />
-                  </div>
-                </div>
+//                   <div className="form-group">
+//                     <label>最低用户等级</label>
+//                     <input
+//                         type="number"
+//                         name="criteria"
+//                         min="1"
+//                         value={formData.criteria}
+//                         onChange={handleInputChange}
+//                     />
+//                   </div>
+//                 </div>
 
-                <div className="form-row">
-                  <div className="form-group">
-                    <label>开始时间</label>
-                    <input
-                        type="datetime-local"
-                        name="pStartTime"
-                        value={formData.pStartTime}
-                        onChange={handleInputChange}
-                    />
-                  </div>
+//                 <div className="form-row">
+//                   <div className="form-group">
+//                     <label>开始时间</label>
+//                     <input
+//                         type="datetime-local"
+//                         name="pStartTime"
+//                         value={formData.pStartTime}
+//                         onChange={handleInputChange}
+//                     />
+//                   </div>
 
-                  <div className="form-group">
-                    <label>结束时间</label>
-                    <input
-                        type="datetime-local"
-                        name="pEndTime"
-                        value={formData.pEndTime}
-                        onChange={handleInputChange}
-                    />
-                  </div>
-                </div>
+//                   <div className="form-group">
+//                     <label>结束时间</label>
+//                     <input
+//                         type="datetime-local"
+//                         name="pEndTime"
+//                         value={formData.pEndTime}
+//                         onChange={handleInputChange}
+//                     />
+//                   </div>
+//                 </div>
 
-                <button
-                    className="submit-button"
-                    onClick={createPromotion}
-                    disabled={isLoading}
-                >
-                  {isLoading ? '创建中...' : '提交创建'}
-                </button>
-              </div>
-          )}
+//                 <button
+//                     className="submit-button"
+//                     onClick={createPromotion}
+//                     disabled={isLoading}
+//                 >
+//                   {isLoading ? '创建中...' : '提交创建'}
+//                 </button>
+//               </div>
+//           )}
 
-          {error && <div className="error-message">{error}</div>}
+//           {error && <div className="error-message">{error}</div>}
 
-          <div className="promotions-grid">
-            {/* 促销活动列表 */}
-            <div className="promotions-list">
-              <h2>当前促销活动</h2>
-              {isLoading && promotions.length === 0 ? (
-                  <div className="loading">加载中...</div>
-              ) : promotions.length === 0 ? (
-                  <div className="no-promotions">暂无促销活动</div>
-              ) : (
-                  <div className="promotion-items">
-                    {promotions.map(promo => (
-                        <div
-                            key={promo.promoId}
-                            className={`promotion-item ${currentPromotion && currentPromotion.promoId === promo.promoId ? 'active' : ''}`}
-                            onClick={() => fetchPromotionDetails(promo.promoId)}
-                        >
-                          <div className="promotion-header">
-                            <h3>{promo.name}</h3>
-                            <span className="promotion-type">{getPromotionType(promo)}</span>
-                          </div>
-                          <div className="promotion-dates">
-                            {new Date(promo.pStartTime).toLocaleString()} - {new Date(promo.pEndTime).toLocaleString()}
-                          </div>
-                          <div className="promotion-coeffs">
-                            <span>上传: {promo.uploadCoeff}x</span>
-                            <span>下载: {promo.downloadCoeff}x</span>
-                          </div>
-                          {isAdmin && (
-                              <button
-                                  className="delete-button"
-                                  onClick={(e) => {
-                                    e.stopPropagation();
-                                    deletePromotion(promo.promoId);
-                                  }}
-                                  disabled={isLoading}
-                              >
-                                删除
-                              </button>
-                          )}
-                        </div>
-                    ))}
-                  </div>
-              )}
+//           <div className="promotions-grid">
+//             {/* 促销活动列表 */}
+//             <div className="promotions-list">
+//               <h2>当前促销活动</h2>
+//               {isLoading && promotions.length === 0 ? (
+//                   <div className="loading">加载中...</div>
+//               ) : promotions.length === 0 ? (
+//                   <div className="no-promotions">暂无促销活动</div>
+//               ) : (
+//                   <div className="promotion-items">
+//                     {promotions.map(promo => (
+//                         <div
+//                             key={promo.promoId}
+//                             className={`promotion-item ${currentPromotion && currentPromotion.promoId === promo.promoId ? 'active' : ''}`}
+//                             onClick={() => fetchPromotionDetails(promo.promoId)}
+//                         >
+//                           <div className="promotion-header">
+//                             <h3>{promo.name}</h3>
+//                             <span className="promotion-type">{getPromotionType(promo)}</span>
+//                           </div>
+//                           <div className="promotion-dates">
+//                             {new Date(promo.pStartTime).toLocaleString()} - {new Date(promo.pEndTime).toLocaleString()}
+//                           </div>
+//                           <div className="promotion-coeffs">
+//                             <span>上传: {promo.uploadCoeff}x</span>
+//                             <span>下载: {promo.downloadCoeff}x</span>
+//                           </div>
+//                           {isAdmin && (
+//                               <button
+//                                   className="delete-button"
+//                                   onClick={(e) => {
+//                                     e.stopPropagation();
+//                                     deletePromotion(promo.promoId);
+//                                   }}
+//                                   disabled={isLoading}
+//                               >
+//                                 删除
+//                               </button>
+//                           )}
+//                         </div>
+//                     ))}
+//                   </div>
+//               )}
 
-              {totalPromotions > perPage && (
-                  <div className="pagination">
-                    <button
-                        disabled={currentPage === 1}
-                        onClick={() => handlePageChange(currentPage - 1)}
-                    >
-                      上一页
-                    </button>
-                    <span>第 {currentPage} 页</span>
-                    <button
-                        disabled={currentPage * perPage >= totalPromotions}
-                        onClick={() => handlePageChange(currentPage + 1)}
-                    >
-                      下一页
-                    </button>
-                  </div>
-              )}
-            </div>
+//               {totalPromotions > perPage && (
+//                   <div className="pagination">
+//                     <button
+//                         disabled={currentPage === 1}
+//                         onClick={() => handlePageChange(currentPage - 1)}
+//                     >
+//                       上一页
+//                     </button>
+//                     <span>第 {currentPage} 页</span>
+//                     <button
+//                         disabled={currentPage * perPage >= totalPromotions}
+//                         onClick={() => handlePageChange(currentPage + 1)}
+//                     >
+//                       下一页
+//                     </button>
+//                   </div>
+//               )}
+//             </div>
 
-            {/* 促销活动详情 */}
-            <div className="promotion-details">
-              {currentPromotion ? (
-                  <>
-                    <h2>{currentPromotion.name}</h2>
-                    <div className="detail-item">
-                      <label>活动ID:</label>
-                      <span>{currentPromotion.promoId}</span>
-                    </div>
-                    <div className="detail-item">
-                      <label>活动时间:</label>
-                      <span>
-                    {new Date(currentPromotion.pStartTime).toLocaleString()} - {new Date(currentPromotion.pEndTime).toLocaleString()}
-                  </span>
-                    </div>
-                    <div className="detail-item">
-                      <label>促销类型:</label>
-                      <span>{getPromotionType(currentPromotion)}</span>
-                    </div>
-                    <div className="detail-item">
-                      <label>上传量系数:</label>
-                      <span>{currentPromotion.uploadCoeff}x</span>
-                    </div>
-                    <div className="detail-item">
-                      <label>下载量系数:</label>
-                      <span>{currentPromotion.downloadCoeff}x</span>
-                    </div>
-                    <div className="detail-item">
-                      <label>适用资源:</label>
-                      <span>
-                    {currentPromotion.timeRange === 0
-                        ? '全站资源'
-                        : `最近${currentPromotion.timeRange}天内上传的资源`}
-                  </span>
-                    </div>
-                    <div className="detail-item">
-                      <label>参与条件:</label>
-                      <span>用户等级 ≥ {currentPromotion.criteria}</span>
-                    </div>
-                  </>
-              ) : (
-                  <div className="no-selection">请从左侧选择一个促销活动查看详情</div>
-              )}
-            </div>
-          </div>
-        </div>
-      </div>
-  );
-}
+//             {/* 促销活动详情 */}
+//             <div className="promotion-details">
+//               {currentPromotion ? (
+//                   <>
+//                     <h2>{currentPromotion.name}</h2>
+//                     <div className="detail-item">
+//                       <label>活动ID:</label>
+//                       <span>{currentPromotion.promoId}</span>
+//                     </div>
+//                     <div className="detail-item">
+//                       <label>活动时间:</label>
+//                       <span>
+//                     {new Date(currentPromotion.pStartTime).toLocaleString()} - {new Date(currentPromotion.pEndTime).toLocaleString()}
+//                   </span>
+//                     </div>
+//                     <div className="detail-item">
+//                       <label>促销类型:</label>
+//                       <span>{getPromotionType(currentPromotion)}</span>
+//                     </div>
+//                     <div className="detail-item">
+//                       <label>上传量系数:</label>
+//                       <span>{currentPromotion.uploadCoeff}x</span>
+//                     </div>
+//                     <div className="detail-item">
+//                       <label>下载量系数:</label>
+//                       <span>{currentPromotion.downloadCoeff}x</span>
+//                     </div>
+//                     <div className="detail-item">
+//                       <label>适用资源:</label>
+//                       <span>
+//                     {currentPromotion.timeRange === 0
+//                         ? '全站资源'
+//                         : `最近${currentPromotion.timeRange}天内上传的资源`}
+//                   </span>
+//                     </div>
+//                     <div className="detail-item">
+//                       <label>参与条件:</label>
+//                       <span>用户等级 ≥ {currentPromotion.criteria}</span>
+//                     </div>
+//                   </>
+//               ) : (
+//                   <div className="no-selection">请从左侧选择一个促销活动查看详情</div>
+//               )}
+//             </div>
+//           </div>
+//         </div>
+//       </div>
+//   );
+// }
 
-export default PromotionsPage;
\ No newline at end of file
+// export default PromotionsPage;
\ No newline at end of file
