From 8dd5a17062c7a9b4b932a026957ec788a806ab4f Mon Sep 17 00:00:00 2001 From: typingbugs Date: Sun, 26 May 2024 21:49:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=9F=E6=9C=AB=E5=A4=A7?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=96=87=E4=BB=B6=E5=A4=B9Project=EF=BC=8C?= =?UTF-8?q?=E7=9B=AE=E5=89=8D=E4=B8=8EAssignment5=E4=B8=AD=E4=B8=80?= =?UTF-8?q?=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project/__pycache__/main.cpython-311.pyc | Bin 0 -> 9475 bytes Project/db.sql | 10 ++ Project/init_db.py | 17 +++ Project/main.py | 179 +++++++++++++++++++++++ Project/requirements.txt | 12 ++ Project/run.sh | 1 + Project/static/css/style.css | 9 ++ Project/static/js/checkInfo.js | 51 +++++++ Project/static/js/modify.js | 28 ++++ Project/templates/index.html | 24 +++ Project/templates/modify.html | 96 ++++++++++++ Project/templates/signup.html | 115 +++++++++++++++ 12 files changed, 542 insertions(+) create mode 100644 Project/__pycache__/main.cpython-311.pyc create mode 100644 Project/db.sql create mode 100644 Project/init_db.py create mode 100644 Project/main.py create mode 100644 Project/requirements.txt create mode 100644 Project/run.sh create mode 100644 Project/static/css/style.css create mode 100644 Project/static/js/checkInfo.js create mode 100644 Project/static/js/modify.js create mode 100644 Project/templates/index.html create mode 100644 Project/templates/modify.html create mode 100644 Project/templates/signup.html diff --git a/Project/__pycache__/main.cpython-311.pyc b/Project/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e510a5cb5e1becd188669c5191ab5615d758ed1 GIT binary patch literal 9475 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 str: + # 检查已有用户 + sql = """ + SELECT COUNT(*) FROM passengers \ + WHERE ID = %s; + """ + try: + cursor.execute(sql, (id,)) + id_exist = cursor.fetchall()[0][0] + except Exception as e: + flash("数据库异常,查询失败") + print(e) + return redirect(url_for('signup')) + if (id_exist == 0): + return "NO_USER" + + # 检查密码 + sql = """ + SELECT `Password` FROM passengers \ + WHERE ID = %s; + """ + try: + cursor.execute(sql, (id,)) + record_password = cursor.fetchall()[0][0] + except Exception as e: + flash("数据库异常,查询失败") + print(e) + return redirect(url_for('modify')) + if (record_password != password): + return "WRONG_PASSWORD" + + return "USER_VERIFIED" + + +class ModifyInfo: + def __init__(self, form:Dict[str, str]): + self.id = form['cardCode'] + modifyType = form['modifyType'] + self.new_password = form['encryptedNewPassword'] + self.phone_number = form['mobileNo'] + modifyType2command = { + '1':'delete account', + '2':'modify Password', + '3':'modify Phone_Number' + } + self.sql_dict = { + 'delete account': 'DELETE FROM passengers WHERE ID = %s;', + 'modify Password': 'UPDATE passengers SET `Password` = %s WHERE ID = %s;', + 'modify Phone_Number': 'UPDATE passengers SET Phone_number = %s WHERE ID = %s;' + } + self.sql_args_dict = { + 'delete account': (self.id,), + 'modify Password': (self.new_password, self.id), + 'modify Phone_Number': (self.phone_number, self.id) + } + self.ok_message_dict = { + 'delete account': "删除账户成功", + 'modify Password': "修改密码成功", + 'modify Phone_Number': "修改手机号成功" + } + self.fail_message_dict = { + 'delete account': "数据库异常,删除账户失败", + 'modify Password': "数据库异常,修改密码失败", + 'modify Phone_Number': "数据库异常,修改手机号失败" + } + self.command = modifyType2command[modifyType] + def get_sql(self): + return self.sql_dict[self.command] + def get_args(self): + return self.sql_args_dict[self.command] + def get_ok_message(self): + return self.ok_message_dict[self.command] + def get_fail_message(self): + return self.fail_message_dict[self.command] + + +@app.route("/modify.html", methods=('GET', 'POST')) +def modify(): + if request.method == 'GET': + return render_template('modify.html') + + if request.method == 'POST': + id = request.form['cardCode'] + password = request.form['encryptedPassword'] + db = get_db() + cursor = db.cursor() + + verify_info = verify_user(cursor, id, password) + if (verify_info == "NO_USER"): + flash("您未注册过,无法修改账号") + db.close() + return redirect(url_for('signup')) + elif (verify_info == "WRONG_PASSWORD"): + flash("密码错误") + db.close() + return redirect(url_for('modify')) + + modifyInfo = ModifyInfo(request.form) + try: + cursor.execute(modifyInfo.get_sql(), modifyInfo.get_args()) + db.commit() + flash(modifyInfo.get_ok_message()) + except Exception as e: + db.rollback() + print(e) + flash(modifyInfo.get_fail_message()) + db.close() + return redirect(url_for('index')) \ No newline at end of file diff --git a/Project/requirements.txt b/Project/requirements.txt new file mode 100644 index 0000000..e79ebbc --- /dev/null +++ b/Project/requirements.txt @@ -0,0 +1,12 @@ +blinker==1.8.1 +cffi==1.16.0 +click==8.1.7 +configparser==7.0.0 +cryptography==42.0.6 +Flask==3.0.3 +itsdangerous==2.2.0 +Jinja2==3.1.3 +MarkupSafe==2.1.5 +pycparser==2.22 +PyMySQL==1.1.0 +Werkzeug==3.0.2 diff --git a/Project/run.sh b/Project/run.sh new file mode 100644 index 0000000..dc861d9 --- /dev/null +++ b/Project/run.sh @@ -0,0 +1 @@ +SECRET_KEY='ILOVEDATABASETECH' FLASK_APP=main FLASK_ENV=development flask run \ No newline at end of file diff --git a/Project/static/css/style.css b/Project/static/css/style.css new file mode 100644 index 0000000..34abe50 --- /dev/null +++ b/Project/static/css/style.css @@ -0,0 +1,9 @@ +/* h1, ul, li, a, body { + margin: 0; + padding: 0; + text-decoration: none; +} */ + +li { + list-style: none; +} \ No newline at end of file diff --git a/Project/static/js/checkInfo.js b/Project/static/js/checkInfo.js new file mode 100644 index 0000000..641c012 --- /dev/null +++ b/Project/static/js/checkInfo.js @@ -0,0 +1,51 @@ +var checkInfo = {} + +checkInfo.checkCardCode = function() { + let cardCode = document.getElementById('cardCode').value + let regexCardCode = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ + if(!regexCardCode.test(cardCode)) { + alert('身份证号格式有误') + return false + } + return true +} + +checkInfo.checkMobileNo = function() { + let mobileNo = document.getElementById('mobileNo').value + let regexMobileNo = /^1[3-9]\d{9}$/ + if (!regexMobileNo.test(mobileNo)) { + alert('手机号格式有误') + return false + } + return true +} + +checkInfo.checkPassword = function() { + let password = document.getElementById('password') + let regexPassword = /^[A-Za-z0-9\W_]{6,20}$/ + if (!regexPassword.test(password.value)) { + alert("密码须为长度为6-20位字母、数字或符号") + return false + } + let confirmPassword = document.getElementById('confirmPassword') + if (password.value !== confirmPassword.value) { + alert("两次输入的密码不一致") + return false + } + return true +} + +checkInfo.checkNewPassword = function() { + let password = document.getElementById('newPassword') + let regexPassword = /^[A-Za-z0-9\W_]{6,20}$/ + if (!regexPassword.test(password.value)) { + alert("密码须为长度为6-20位字母、数字或符号") + return false + } + let confirmPassword = document.getElementById('confirmNewPassword') + if (password.value !== confirmPassword.value) { + alert("两次输入的密码不一致") + return false + } + return true +} \ No newline at end of file diff --git a/Project/static/js/modify.js b/Project/static/js/modify.js new file mode 100644 index 0000000..084e9f4 --- /dev/null +++ b/Project/static/js/modify.js @@ -0,0 +1,28 @@ +var modify = {} + +modify.showModifyPassword = function() { + let modifyType = document.getElementById('modifyType').value + let info = { + modifyPasswordLis: document.getElementsByClassName('modifyPassword'), + modifymobileNoLis: document.getElementsByClassName('modifymobileNo'), + } + + // 遍历隐藏所有元素 + for (let key in info) { + let elements = info[key]; + for (let item of elements) { + item.style.display = 'none'; // 确保所有相关元素被隐藏 + } + } + + // 根据 modifyType 显示相关元素 + if (modifyType === "2") { + for (let item of info.modifyPasswordLis) { + item.style.display = 'block'; + } + } else if (modifyType === "3") { + for (let item of info.modifymobileNoLis) { + item.style.display = 'block'; + } + } +} \ No newline at end of file diff --git a/Project/templates/index.html b/Project/templates/index.html new file mode 100644 index 0000000..a08a5b8 --- /dev/null +++ b/Project/templates/index.html @@ -0,0 +1,24 @@ + + + + 我的12306官网 + + + +

Coming soon~

+ + + + \ No newline at end of file diff --git a/Project/templates/modify.html b/Project/templates/modify.html new file mode 100644 index 0000000..dcd57dc --- /dev/null +++ b/Project/templates/modify.html @@ -0,0 +1,96 @@ + + + + 修改账户 + + + + + + +
+
    +
    +
    证件号码:
    + +
    + +
  • +
    +
    登陆密码:
    + + +
    +
  • +
  • +
    +
    修改内容:
    + +
    +
  • + + + +
    + +
    +
+ +
+ + + + + + \ No newline at end of file diff --git a/Project/templates/signup.html b/Project/templates/signup.html new file mode 100644 index 0000000..518e500 --- /dev/null +++ b/Project/templates/signup.html @@ -0,0 +1,115 @@ + + + + 我的12306注册 + + + + + + +
+
    +
  • +
    +
    用 户 名:
    + +
    +
  • +
  • +
    +
    登陆密码:
    + + +
    +
  • +
  • +
    +
    确认密码:
    + +
    +
  • +
  • +
    +
    证件类型:
    + + +
    +
  • +
  • +
    +
    姓 名:
    + +
    +
  • +
  • +
    +
    证件号码:
    + +
    +
  • +
  • +
    +
    优惠(待)类型:
    + +
    +
  • +
  • +
  • +
    +
    邮 箱:
    + +
    +
  • +
  • +
    +
    手机号码:
    +
    + + +
    +
    +
  • +
    + +
    +
+ +
+ + + + + \ No newline at end of file