72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
||
import os
|
||
import secrets
|
||
import string
|
||
from flask import Flask
|
||
from werkzeug.security import generate_password_hash
|
||
from models import db, User
|
||
from config import Config
|
||
|
||
def create_default_admin(app):
|
||
"""在應用程式上下文中建立一個預設的管理員帳號。"""
|
||
with app.app_context():
|
||
# 檢查管理員是否已存在
|
||
if User.query.filter_by(username='admin').first():
|
||
print("ℹ️ 'admin' 使用者已存在,跳過建立程序。")
|
||
return
|
||
|
||
# 產生一個安全隨機的密碼
|
||
password_length = 12
|
||
alphabet = string.ascii_letters + string.digits + '!@#$%^&*()'
|
||
password = ''.join(secrets.choice(alphabet) for i in range(password_length))
|
||
|
||
# 建立新使用者
|
||
admin_user = User(
|
||
username='admin',
|
||
password_hash=generate_password_hash(password),
|
||
role='admin'
|
||
)
|
||
db.session.add(admin_user)
|
||
db.session.commit()
|
||
|
||
print("✅ 預設管理員帳號已建立!")
|
||
print(" ===================================")
|
||
print(f" 👤 使用者名稱: admin")
|
||
print(f" 🔑 密碼: {password}")
|
||
print(" ===================================")
|
||
print(" 請妥善保管此密碼,並在首次登入後考慮變更。")
|
||
|
||
def init_database(app):
|
||
"""初始化資料庫:刪除所有現有資料表並重新建立。"""
|
||
with app.app_context():
|
||
print("🔄 開始進行資料庫初始化...")
|
||
# 為了安全,先刪除所有表格,再重新建立
|
||
db.drop_all()
|
||
print(" - 所有舊資料表已刪除。")
|
||
db.create_all()
|
||
print(" - 所有新資料表已根據 models.py 建立。")
|
||
print("✅ 資料庫結構已成功初始化!")
|
||
|
||
if __name__ == '__main__':
|
||
# 建立一個暫時的 Flask app 來提供資料庫操作所需的應用程式上下文
|
||
app = Flask(__name__)
|
||
app.config.from_object(Config)
|
||
|
||
# 將資料庫物件與 app 綁定
|
||
db.init_app(app)
|
||
|
||
print("=================================================")
|
||
print(" ⚠️ 資料庫初始化腳本 ⚠️")
|
||
print("=================================================")
|
||
print("此腳本將會刪除所有現有的資料,並重新建立資料庫結構。")
|
||
print("這個操作是不可逆的!")
|
||
|
||
# 讓使用者確認操作
|
||
confirmation = input("👉 您確定要繼續嗎? (yes/no): ")
|
||
|
||
if confirmation.lower() == 'yes':
|
||
init_database(app)
|
||
create_default_admin(app)
|
||
print("\n🎉 全部完成!")
|
||
else:
|
||
print("❌ 操作已取消。") |