Team Ai
Apppublic

devin15/cursor2api-rust

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
config.html258 linesDownload Raw Back to static
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>