diff --git a/UI/datacheck.py b/UI/datacheck.py index b9d5a20..2253fcc 100644 --- a/UI/datacheck.py +++ b/UI/datacheck.py @@ -9,4 +9,27 @@ class LoginForm(FlaskForm): password = PasswordField('Password', validators=[ InputRequired(message='Password is required.'), Length(min=1, max=30, message='Password must be between 1 and 30 characters long.') - ]) \ No newline at end of file + ]) + +class AddUserForm(FlaskForm): + username = StringField('Username', validators=[ + InputRequired(message='Username is required.'), + Regexp(r'^[a-zA-Z][a-zA-Z0-9_]{0,19}$', message='Username must start with a letter and can only contain letters, numbers, and underscores (max 20 characters).') + ]) + password = PasswordField('Password', validators=[ + InputRequired(message='Password is required.'), + Length(min=1, max=30, message='Password must be between 1 and 30 characters long.') + ]) + name = StringField('Name', validators=[ + InputRequired(message='Name is required.'), + Regexp(r'^[\u4e00-\u9fa5]{2,5}$', message='Name must be 2-5 Chinese characters.') + ]) + mailAddr = StringField('Email', validators=[ + InputRequired(message='Email is required.'), + Length(max=30, message='Email must be less than 30 characters long.'), + Regexp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', message='Invalid email format.') + ]) + privilege = StringField('Privilege', validators=[ + InputRequired(message='Privilege is required.'), + Regexp(r'^[0-9]$|^10$', message='Privilege must be an integer between 0 and 10.') + ]) diff --git a/UI/main.py b/UI/main.py index 2afeaee..a9ab537 100644 --- a/UI/main.py +++ b/UI/main.py @@ -127,3 +127,32 @@ def logout(): return redirect(url_for('home')) if __name__ == '__main__': app.run(debug=True) + +@app.route('/admin/adduser', methods=['GET', 'POST']) +def add_user(): + if 'username' not in session or utils.GetPrivilege(session['username'], ExecCommand) < 10: + return redirect(url_for('login')) + + form = AddUserForm() + if form.validate_on_submit(): + cur_username = session['username'] + new_username = form.username.data + password = form.password.data + name = form.name.data + mailAddr = form.mailAddr.data + privilege = form.privilege.data + + # 调用 ExecCommand 执行添加用户命令 + add_user_response = ExecCommand(f'add_user -c {cur_username} -u {new_username} -p {password} -n {name} -m {mailAddr} -g {privilege}') + + if add_user_response.strip() == '0': + flash('User added successfully.', 'success') + return redirect(url_for('home')) + elif add_user_response.strip() == '-1': + error = 'Failed to add user.' + else: + error = 'An unknown error occurred.' + + flash(error, 'danger') + + return render_template('adduser.html', form=form) diff --git a/UI/templates/adduser.html b/UI/templates/adduser.html new file mode 100644 index 0000000..a286537 --- /dev/null +++ b/UI/templates/adduser.html @@ -0,0 +1,108 @@ +{% extends "base.html" %} + +{% block title %}Add User{% endblock %} + +{% block content %} +
+
+

Add User

+ + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} + + {% endfor %} + {% endif %} + {% endwith %} + +
+ {{ form.hidden_tag() }} +
+ + +
+ Username must start with a letter and can only contain letters, numbers, and underscores (max 20 characters). +
+
+
+ + +
+ Password must be between 1 and 30 characters long. +
+
+
+ + +
+ Name must be 2-5 Chinese characters. +
+
+
+ + +
+ Invalid email format. +
+
+
+ + +
+ Privilege must be an integer between 0 and 10. +
+
+ +
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/UI/templates/base.html b/UI/templates/base.html index 623b42f..0ea0d6e 100644 --- a/UI/templates/base.html +++ b/UI/templates/base.html @@ -22,22 +22,30 @@ + {% if session.get('username') %} + + + {% else %} + + {% endif %} +