diff --git a/src/rom/nanoweb.py b/src/rom/nanoweb.py index b75c701..5eb34ec 100644 --- a/src/rom/nanoweb.py +++ b/src/rom/nanoweb.py @@ -36,7 +36,7 @@ async def error(request, code, reason): await request.write(str(reason)) -async def send_file(request, filename, segment=64, binary=True): +async def send_file(request, filename, segment=512, binary=True): try: with open(filename, "rb" if binary else "r") as f: while True: @@ -91,7 +91,8 @@ class Nanoweb: handler = (request.url, handler) if isinstance(handler, str): - await write(request, "HTTP/1.1 200 OK\r\n\r\n") + await write(request, "HTTP/1.1 200 OK\r\n") + await write(request, "Cache-Control: max-age=3600\r\n\r\n") await send_file(request, handler) elif isinstance(handler, tuple): await write(request, "HTTP/1.1 200 OK\r\n\r\n") diff --git a/src/rom/www/css/micro.min.css b/src/rom/www/css/micro.min.css new file mode 100644 index 0000000..19a8204 --- /dev/null +++ b/src/rom/www/css/micro.min.css @@ -0,0 +1 @@ +.card,body{padding:20px}.card,h1{margin-bottom:20px}.form-control,.table{width:100%;font-size:14px}.btn,.form-control,.table{font-size:14px}.list,.progress{overflow:hidden}*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;line-height:1.5;background:#f8f9fa;color:#333;max-width:800px;margin:0 auto}.card{background:#fff;border-radius:8px;box-shadow:0 2px 10px rgba(0,0,0,.05);border:1px solid #e9ecef}h1{font-size:24px;color:#2c3e50}h2{font-size:20px;margin:15px 0;color:#34495e}h3{font-size:16px;margin:10px 0;color:#7f8c8d}.btn{display:inline-block;padding:8px 16px;background:#3498db;color:#fff;border:none;border-radius:4px;cursor:pointer;text-decoration:none;transition:background .2s;margin:2px}.btn:hover{background:#2980b9}.btn:active{transform:translateY(1px)}.btn-success{background:#27ae60}.btn-success:hover{background:#219653}.btn-danger{background:#e74c3c}.btn-danger:hover{background:#c0392b}.btn-warning{background:#f39c12}.btn-warning:hover{background:#d68910}.btn-outline{background:0 0;border:1px solid #3498db;color:#3498db}.badge-info,.btn-outline:hover{background:#3498db;color:#fff}.list-item:hover,.table th,.table tr:hover,.table-striped tr:nth-child(2n){background:#f8f9fa}.form-group{margin-bottom:15px}.form-label{display:block;margin-bottom:5px;font-weight:500;color:#555}.form-control{padding:10px;border:1px solid #ddd;border-radius:4px;transition:border .2s}.alert,.list-item{padding:12px 15px}.form-control:focus{outline:0;border-color:#3498db;box-shadow:0 0 0 2px rgba(52,152,219,.2)}.form-control:disabled{background:#f8f9fa;cursor:not-allowed}.checkbox,.radio{display:flex;align-items:center;margin:5px 0;cursor:pointer}.alert,.table{margin:10px 0}.checkbox input,.radio input{margin-right:8px}.table{border-collapse:collapse}.table td,.table th{padding:10px;text-align:left;border-bottom:1px solid #eee}.table th{font-weight:600;color:#555}.list{list-style:none;border:1px solid #eee;border-radius:4px}.list-item{border-bottom:1px solid #eee;background:#fff}.list-item:last-child{border-bottom:none}.alert{border-radius:4px;border-left:4px solid}.alert-success{background:#d4edda;border-left-color:#27ae60;color:#155724}.alert-warning{background:#fff3cd;border-left-color:#f39c12;color:#856404}.alert-error{background:#f8d7da;border-left-color:#e74c3c;color:#721c24}.alert-info{background:#d1ecf1;border-left-color:#3498db;color:#0c5460}.badge{display:inline-block;padding:3px 8px;font-size:12px;border-radius:20px;background:#e9ecef;color:#495057;margin:0 2px}.badge-success{background:#27ae60;color:#fff}.badge-warning{background:#f39c12;color:#fff}.badge-danger{background:#e74c3c;color:#fff}.progress{height:20px;background:#f0f0f0;border-radius:10px;margin:10px 0}.progress-bar{height:100%;background:#3498db;transition:width .3s;border-radius:10px}.row{display:flex;flex-wrap:wrap;margin:0 -10px}.col{flex:1;padding:0 10px;min-width:200px}.text-center{text-align:center}.text-right{text-align:right}.text-muted{color:#6c757d}.mt-1{margin-top:5px}.mt-2{margin-top:10px}.mt-3{margin-top:20px}.mb-1{margin-bottom:5px}.mb-2{margin-bottom:10px}.mb-3{margin-bottom:20px}.p-1{padding:5px}.p-2{padding:10px}.p-3{padding:20px}.hidden{display:none!important}@media (max-width:768px){body{padding:10px}.card{padding:15px}.row{flex-direction:column}.col{width:100%}} diff --git a/src/rom/www/index.html b/src/rom/www/index.html index 48792f3..a105ed0 100644 --- a/src/rom/www/index.html +++ b/src/rom/www/index.html @@ -1,571 +1,307 @@ - - -
- - -| 属性 | -值 | -
|---|
- WS2是一款基于ESP8266的桌面气象站,能够实时显示天气信息、环境数据和时间。 -
- -本项目采用MIT许可证开源,欢迎自由使用和修改。
-| 属性 | 值 |
|---|
+WS2是一款基于ESP8266的桌面气象站,能够实时显示天气信息、环境数据和时间。 +
本项目采用MIT许可证开源,欢迎自由使用和修改。