增加新功能

This commit is contained in:
wzj 2025-06-24 11:24:47 +08:00
parent eef87ab6e8
commit 0e7a5475ec
3 changed files with 81 additions and 52 deletions

63
app.py
View File

@ -1,8 +1,6 @@
from flask import Flask, render_template, request, jsonify, abort, redirect, url_for, session, flash
from functools import wraps
import os
import subprocess
import base64
import sqlite3
from werkzeug.security import generate_password_hash, check_password_hash
@ -18,7 +16,6 @@ SQUID_PASSWD_FILE = 'config/squid_passwd'
def init_db():
with sqlite3.connect(DATABASE) as conn:
cursor = conn.cursor()
# 创建admin_users表
cursor.execute('''
CREATE TABLE IF NOT EXISTS admin_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -26,8 +23,6 @@ def init_db():
password TEXT NOT NULL
)
''')
# 创建squid_users表
cursor.execute('''
CREATE TABLE IF NOT EXISTS squid_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -36,8 +31,6 @@ def init_db():
is_active INTEGER DEFAULT 1
)
''')
# 创建settings表
cursor.execute('''
CREATE TABLE IF NOT EXISTS settings (
id INTEGER PRIMARY KEY DEFAULT 1,
@ -47,23 +40,21 @@ def init_db():
)
''')
# 检查并初始化管理员用户
# 检查是否有管理员用户
cursor.execute("SELECT COUNT(*) FROM admin_users")
if cursor.fetchone()[0] == 0:
cursor.execute(
"INSERT INTO admin_users (username, password) VALUES (?, ?)",
('admin', generate_password_hash('admin123'))
)
# 检查并初始化设置
cursor.execute("SELECT COUNT(*) FROM settings")
if cursor.fetchone()[0] == 0:
cursor.execute(
"INSERT INTO settings (proxy_address, proxy_port) VALUES (?, ?)",
('proxy.example.com', '3128')
)
# 检查是否有设置
cursor.execute("SELECT COUNT(*) FROM settings")
if cursor.fetchone()[0] == 0:
cursor.execute(
"INSERT INTO settings (proxy_address, proxy_port) VALUES (?, ?)",
('proxy.example.com', '3128'))
conn.commit()
conn.commit()
# 数据库连接
@ -74,6 +65,18 @@ def get_db():
return db
# 更新squid_passwd文件
def update_squid_passwd():
db = get_db()
users = db.execute("SELECT * FROM squid_users").fetchall()
db.close()
with open(SQUID_PASSWD_FILE, 'w') as f:
for user in users:
line = f"{'#' if not user['is_active'] else ''}{user['username']}:{user['password']}\n"
f.write(line)
# 登录装饰器
def login_required(f):
@wraps(f)
@ -167,6 +170,7 @@ def settings():
)
db.commit()
flash('密码修改成功', 'success')
return redirect(url_for('settings'))
elif action == 'update_proxy':
proxy_address = request.form['proxy_address']
@ -178,6 +182,7 @@ def settings():
)
db.commit()
flash('代理设置更新成功', 'success')
return redirect(url_for('settings'))
settings = db.execute("SELECT * FROM settings WHERE id = 1").fetchone()
db.close()
@ -185,7 +190,7 @@ def settings():
return render_template('settings.html', settings=settings)
# Squid用户管理API
# API路由
@app.route('/api/toggle_user/<int:user_id>', methods=['POST'])
@login_required
def toggle_user(user_id):
@ -199,8 +204,6 @@ def toggle_user(user_id):
(new_status, user_id)
)
db.commit()
# 更新squid_passwd文件
update_squid_passwd()
db.close()
@ -213,10 +216,7 @@ def delete_user(user_id):
db = get_db()
db.execute("DELETE FROM squid_users WHERE id = ?", (user_id,))
db.commit()
# 更新squid_passwd文件
update_squid_passwd()
db.close()
return jsonify({'success': True})
@ -237,10 +237,7 @@ def create_user():
(username, password)
)
db.commit()
# 更新squid_passwd文件
update_squid_passwd()
return jsonify({'success': True})
except sqlite3.IntegrityError:
return jsonify({'success': False, 'error': '用户名已存在'}), 400
@ -263,25 +260,11 @@ def update_user_password():
(password, user_id)
)
db.commit()
# 更新squid_passwd文件
update_squid_passwd()
db.close()
return jsonify({'success': True})
def update_squid_passwd():
db = get_db()
users = db.execute("SELECT * FROM squid_users").fetchall()
db.close()
with open(SQUID_PASSWD_FILE, 'w') as f:
for user in users:
line = f"{'#' if not user['is_active'] else ''}{user['username']}:{user['password']}\n"
f.write(line)
if __name__ == '__main__':
if not os.path.exists('config'):
os.makedirs('config')

View File

@ -1,4 +1,52 @@
/* 基础样式 */
/* 新增导航栏样式 */
.navbar {
background-color: #2c3e50;
overflow: hidden;
display: flex;
padding: 0 20px;
}
.nav-item {
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
font-size: 16px;
transition: background-color 0.3s;
}
.nav-item:hover {
background-color: #1a252f;
}
.nav-item.active {
background-color: #3498db;
}
.nav-item.right {
margin-left: auto;
}
/* 修改密码提示样式 */
.alert {
padding: 10px 15px;
margin: 10px 0;
border-radius: 4px;
}
.alert-error {
background-color: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.alert-success {
background-color: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
/* 其他样式保持不变 */
body {
font-family: 'Microsoft YaHei', 'PingFang SC', sans-serif;
margin: 0;
@ -9,7 +57,7 @@ body {
.container {
max-width: 1200px;
margin: 0 auto;
margin: 20px auto;
padding: 20px;
background-color: white;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);

View File

@ -6,15 +6,17 @@
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
</head>
<body>
<div class="navbar">
<a href="{{ url_for('index') }}" class="nav-item">首页</a>
<a href="{{ url_for('clients') }}" class="nav-item active">用户管理</a>
<a href="{{ url_for('settings') }}" class="nav-item">系统设置</a>
<a href="{{ url_for('logout') }}" class="nav-item right">退出登录</a>
</div>
<div class="container">
<h1>用户管理</h1>
<div class="header-actions">
<a href="{{ url_for('index') }}" class="btn-primary">返回首页</a>
<a href="{{ url_for('settings') }}" class="btn-primary">系统设置</a>
<button id="createUserBtn" class="btn-success">+ 添加新用户</button>
<a href="{{ url_for('logout') }}" class="btn-danger">退出登录</a>
</div>
<button id="createUserBtn" class="btn-success">+ 添加新用户</button>
<table>
<tr>
@ -49,10 +51,6 @@
</tr>
{% endfor %}
</table>
<footer>
Squid代理管理系统 &copy; 2023
</footer>
</div>
<!-- 编辑用户模态框 -->