devin15/cursor2api-rust
0
1<!DOCTYPE html>2<html lang="zh">3 4<head>5 <meta charset="UTF-8">6 <link rel="icon" type="image/x-icon" href="data:image/x-icon;,">7 <meta name="viewport" content="width=device-width, initial-scale=1.0">8 <title>配置管理</title>9 <!-- 引入共享样式 -->10 <link rel="stylesheet" href="/static/shared-styles.css">11 <script src="/static/shared.js"></script>12</head>13 14<body>15 <h1>配置管理</h1>16 17 <div class="container">18 <div class="form-group">19 <label>路径:</label>20 <select id="path">21 <option value="/">根路径 (/)</option>22 <option value="/logs">日志页面 (/logs)</option>23 <option value="/config">配置页面 (/config)</option>24 <option value="/tokeninfo">Token 信息页面 (/tokeninfo)</option>25 <option value="/static/shared-styles.css">共享样式 (/static/shared-styles.css)</option>26 <option value="/static/shared.js">共享脚本 (/static/shared.js)</option>27 <option value="/about">关于页面 (/about)</option>28 <option value="/readme">ReadMe文档 (/readme)</option>29 <option value="/api">api调用 (/api)</option>30 </select>31 </div>32 33 <div class="form-group">34 <label>内容类型:</label>35 <select id="content_type">36 <option value="default">默认</option>37 <option value="text">纯文本</option>38 <option value="html">HTML</option>39 </select>40 </div>41 42 <div class="form-group">43 <label>内容:</label>44 <textarea id="content"></textarea>45 </div>46 47 <div class="form-group">48 <label>流第一个块检查:</label>49 <select id="enable_stream_check">50 <option value="">保持不变</option>51 <option value="true">启用</option>52 <option value="false">禁用</option>53 </select>54 </div>55 56 <div class="form-group">57 <label>包含停止流:</label>58 <select id="include_stop_stream">59 <option value="">保持不变</option>60 <option value="true">启用</option>61 <option value="false">禁用</option>62 </select>63 </div>64 65 <div class="form-group">66 <label>图片处理能力:</label>67 <select id="vision_ability">68 <option value="">保持不变</option>69 <option value="disabled">禁用</option>70 <option value="base64-only">仅 Base64</option>71 <option value="base64-http">Base64 + HTTP</option>72 </select>73 </div>74 75 <div class="form-group">76 <label>慢速池:</label>77 <select id="enable_slow_pool">78 <option value="">保持不变</option>79 <option value="true">启用</option>80 <option value="false">禁用</option>81 </select>82 </div>83 84 <div class="form-group">85 <label>允许所有Claude模型:</label>86 <select id="enable_all_claude">87 <option value="">保持不变</option>88 <option value="true">启用</option>89 <option value="false">禁用</option>90 </select>91 </div>92 93 <div class="form-group">94 <label>使用量检查模型规则:</label>95 <select id="check_usage_models_type">96 <option value="">保持不变</option>97 <option value="none">禁用</option>98 <option value="default">默认</option>99 <option value="all">所有</option>100 <option value="list">自定义列表</option>101 </select>102 <input type="text" id="check_usage_models_list" placeholder="模型列表,以逗号分隔" style="display: none;">103 </div>104 105 <div class="form-group">106 <label>认证令牌:</label>107 <input type="password" id="authToken">108 </div>109 110 <div class="button-group">111 <button onclick="updateConfig('get')">获取配置</button>112 <button onclick="updateConfig('update')">更新配置</button>113 <button onclick="updateConfig('reset')" class="secondary">重置配置</button>114 </div>115 </div>116 117 <div id="result" class="message"></div>118 119 <script>120 async function fetchConfig() {121 const path = document.getElementById('path').value;122 const data = await makeAuthenticatedRequest('/config', {123 body: JSON.stringify({ action: 'get', path })124 });125 126 if (data) {127 let content = '';128 129 // 获取当前路径的页面内容130 const pageContent = data.data.page_content;131 132 // 如果是 default 类型,需要从路径获取内容133 if (pageContent?.type === 'default') {134 // 直接从路径获取内容135 const response = await fetch(path);136 content = await response.text();137 } else if (pageContent?.type === 'text' || pageContent?.type === 'html') {138 content = pageContent.content;139 }140 141 // 更新表单142 document.getElementById('content').value = content || '';143 document.getElementById('content_type').value = pageContent?.type || 'default';144 let visionValue = data.data.vision_ability || '';145 // 标准化 vision_ability 的值146 switch (visionValue) {147 case 'none':148 visionValue = 'disabled';149 break;150 case 'base64':151 visionValue = 'base64-only';152 break;153 case 'all':154 visionValue = 'base64-http';155 break;156 }157 document.getElementById('enable_stream_check').value =158 parseStringFromBoolean(data.data.enable_stream_check, '');159 document.getElementById('include_stop_stream').value =160 parseStringFromBoolean(data.data.include_stop_stream, '');161 document.getElementById('vision_ability').value = visionValue;162 document.getElementById('enable_slow_pool').value =163 parseStringFromBoolean(data.data.enable_slow_pool, '');164 document.getElementById('enable_all_claude').value =165 parseStringFromBoolean(data.data.enable_all_claude, '');166 document.getElementById('check_usage_models_type').value = data.data.check_usage_models?.type || '';167 document.getElementById('check_usage_models_list').value = data.data.check_usage_models?.type === 'list' ? data.data.check_usage_models?.content || '' : document.getElementById('check_usage_models_list').value;168 }169 }170 171 async function updateConfig(action) {172 if (action === 'get') {173 await fetchConfig();174 return;175 }176 177 const contentType = document.getElementById('content_type').value;178 const content = document.getElementById('content').value;179 180 // 根据内容类型构造 content 对象181 let contentObj = { type: 'default' };182 if (action === 'update' && contentType !== 'default') {183 contentObj = {184 type: contentType,185 content: content186 };187 }188 189 const data = {190 action,191 path: document.getElementById('path').value,192 ...(contentObj && { content: contentObj }),193 ...(document.getElementById('enable_stream_check').value && {194 enable_stream_check: parseBooleanFromString(document.getElementById('enable_stream_check').value)195 }),196 ...(document.getElementById('include_stop_stream').value && {197 include_stop_stream: parseBooleanFromString(document.getElementById('include_stop_stream').value)198 }),199 ...(document.getElementById('vision_ability').value && {200 vision_ability: document.getElementById('vision_ability').value201 }),202 ...(document.getElementById('enable_slow_pool').value && {203 enable_slow_pool: parseBooleanFromString(document.getElementById('enable_slow_pool').value)204 }),205 ...(document.getElementById('enable_all_claude').value && {206 enable_all_claude: parseBooleanFromString(document.getElementById('enable_all_claude').value)207 }),208 ...(document.getElementById('check_usage_models_type').value && {209 check_usage_models: {210 type: document.getElementById('check_usage_models_type').value,211 ...(document.getElementById('check_usage_models_type').value === 'list' && {212 content: document.getElementById('check_usage_models_list').value213 })214 }215 })216 };217 218 const result = await makeAuthenticatedRequest('/config', {219 body: JSON.stringify(data)220 });221 222 if (result) {223 showMessage('result', result.message, false);224 if (action === 'update' || action === 'reset') {225 await fetchConfig();226 }227 }228 }229 230 function showSuccess(message) {231 showMessage('result', message, false);232 }233 234 function showError(message) {235 showMessage('result', message, true);236 }237 238 // 添加按钮事件监听239 document.getElementById('path').addEventListener('change', fetchConfig);240 241 // 更新内容类型变更处理242 document.getElementById('content_type').addEventListener('change', function () {243 const textarea = document.getElementById('content');244 textarea.disabled = this.value === 'default';245 });246 247 // 初始化 token 处理248 initializeTokenHandling('authToken');249 250 // 添加使用量检查模型类型变更处理251 document.getElementById('check_usage_models_type').addEventListener('change', function() {252 const input = document.getElementById('check_usage_models_list');253 input.style.display = this.value === 'list' ? 'inline-block' : 'none';254 });255 </script>256</body>257 258</html>