Browse Source

feat: 调整config模型

SongZihuan 3 years ago
parent
commit
4cccc8e59a
26 changed files with 214 additions and 155 deletions
  1. 2 2
      app/rank_views.py
  2. 2 2
      app/rank_web.py
  3. 9 10
      conf/__init__.py
  4. 31 3
      conf/args.py
  5. 6 2
      conf/equipment.py
  6. 10 4
      conf/sql.py
  7. 33 18
      conf/sys_default.py
  8. 5 5
      core/user.py
  9. 3 3
      equipment/scan.py
  10. 2 2
      equipment/scan_user.py
  11. 5 6
      main.py
  12. 4 4
      setup.py
  13. 5 1
      sql/base_db.py
  14. 3 3
      sql/db.py
  15. 0 1
      sql/garbage.py
  16. 13 5
      sql/mysql_db.py
  17. 4 4
      sql/user.py
  18. 17 17
      tk_ui/admin.py
  19. 1 1
      tk_ui/admin_event.py
  20. 18 18
      tk_ui/admin_program.py
  21. 3 3
      tk_ui/event.py
  22. 9 9
      tk_ui/ranking.py
  23. 22 25
      tk_ui/station.py
  24. 3 3
      tool/login.py
  25. 2 2
      tool/pic.py
  26. 2 2
      tool/tk.py

+ 2 - 2
app/rank_views.py

@@ -1,4 +1,4 @@
-import conf
+from conf import Config
 from flask import render_template, Blueprint, Flask
 from .rank_web import RankWebsite
 from sql.db import DB
@@ -11,7 +11,7 @@ rank_app: Optional[Flask] = None
 
 @main.route('/')
 def index():
-    return render_template("index.html", loc=conf.base_location)
+    return render_template("index.html", loc=Config.base_location)
 
 
 @main.route('/rank_up')

+ 2 - 2
app/rank_web.py

@@ -1,6 +1,6 @@
 from flask import Flask
 
-import conf
+from conf import Config
 from sql.db import DB
 from tool.type_ import Optional, List, Tuple
 
@@ -21,7 +21,7 @@ class RankWebsite:
         res = []
         for index in range(cur.rowcount):
             i = cur.fetchone()
-            res.append((f"NO.{index + 1}", i[1], i[0][:conf.tk_show_uid_len], str(i[3]), str(i[2])))
+            res.append((f"NO.{index + 1}", i[1], i[0][:Config.tk_show_uid_len], str(i[3]), str(i[2])))
         return res
 
     def run(self,

+ 9 - 10
conf/__init__.py

@@ -5,16 +5,15 @@
 
 from font.noto import noto_font
 from picture import head_pic, rank_bg_pic
+from args import p_args
+from .equipment import ConfigCapture
+from .sql import ConfigDatabase
+from .sys_default import ConfigExport, ConfigSystem, ConfigSecret, ConfigTkinter, ConfUser
 
-from .equipment import *
-from .sql import *
-from .sys_default import *
 
-font_d = {
-    "noto": noto_font
-}
+class Config(ConfigTkinter, ConfigSecret, ConfigSystem, ConfUser, ConfigExport, ConfigDatabase, ConfigCapture):
+    run_type = p_args.run[0]
+    program = p_args.program[0]
 
-picture_d = {
-    "head": head_pic,
-    "rank_bg": rank_bg_pic
-}
+    font_d = {"noto": noto_font}
+    picture_d = {"head": head_pic, "rank_bg": rank_bg_pic}

+ 31 - 3
conf/args.py

@@ -1,9 +1,12 @@
 import argparse
+import os
+import warnings
 
 parser = argparse.ArgumentParser()
-parser.add_argument("--mysql_url", nargs=1, required=True, type=str, help="MySQL-URL")
-parser.add_argument("--mysql_name", nargs=1, required=True, type=str, help="MySQL-用户名")
-parser.add_argument("--mysql_passwd", nargs=1, required=True, type=str, help="MySQL-密码")
+parser.add_argument("--mysql_url", nargs=1, required=False, type=str, default=None, help="MySQL-URL")
+parser.add_argument("--mysql_name", nargs=1, required=False, type=str, default=None, help="MySQL-用户名")
+parser.add_argument("--mysql_passwd", nargs=1, required=False, type=str, default=None, help="MySQL-密码")
+parser.add_argument("--mysql_port", nargs=1, required=False, type=str, default=[None], help="MySQL-端口")
 
 parser.add_argument("--program", nargs=1, required=True, type=str, choices=["setup",
                                                                             "garbage",
@@ -12,4 +15,29 @@ parser.add_argument("--program", nargs=1, required=True, type=str, choices=["set
                                                                             "ranking_website"],
                     help="选择启动的程序")
 
+parser.add_argument("--run", nargs=1, required=False, type=str, choices=["Test",
+                                                                         "Release"],
+                    default=["Release"],
+                    help="选择允许模式")
+
 p_args = parser.parse_args()
+
+if p_args.mysql_url is None or p_args.mysql_name is None or p_args.mysql_passwd is None:
+    res = os.environ.get('HGSSystem_MySQL')
+    if res is None:
+        warnings.warn("未找到MySQL地址")
+        exit(1)
+    res = res.split(';')
+    if len(res) == 4:
+        p_args.mysql_url = [res[0]]
+        p_args.mysql_name = [res[1]]
+        p_args.mysql_passwd = [res[2]]
+        p_args.mysql_port = [res[3]]
+    elif len(res) == 3:
+        p_args.mysql_url = [res[0]]
+        p_args.mysql_name = [res[1]]
+        p_args.mysql_passwd = [res[2]]
+        p_args.mysql_port = [None]
+    else:
+        warnings.warn("MYSQL地址错误")
+        exit(1)

+ 6 - 2
conf/equipment.py

@@ -1,2 +1,6 @@
-capture_num = 0  # 摄像头号
-capture_arg = []
+class ConfigCaptureRelease:
+    capture_num = 0  # 摄像头号
+    capture_arg = []
+
+
+ConfigCapture = ConfigCaptureRelease

+ 10 - 4
conf/sql.py

@@ -1,6 +1,12 @@
 from . import args
 
-database = 'MySQL'
-mysql_url = args.p_args.mysql_url[0]
-mysql_name = args.p_args.mysql_name[0]
-mysql_passwd = args.p_args.mysql_passwd[0]
+
+class ConfigDatabaseRelease:
+    database = 'MySQL'
+    mysql_url = args.p_args.mysql_url[0]
+    mysql_name = args.p_args.mysql_name[0]
+    mysql_passwd = args.p_args.mysql_passwd[0]
+    mysql_port = args.p_args.mysql_port[0]
+
+
+ConfigDatabase = ConfigDatabaseRelease

+ 33 - 18
conf/sys_default.py

@@ -1,29 +1,44 @@
-passwd_salt = "HGSSystem"
-default_score = 10
-default_reputation = 300
+class ConfigSecretRelease:
+    passwd_salt = "HGSSystem"
 
-max_rubbish_week = 34
-limit_rubbish_week = 50
 
-base_location = "Guangdong-Guangzhou"
+class ConfUserRelease:
+    default_score = 10
+    default_reputation = 300
 
-tk_refresh_delay = 50  # 延时任务的时间
+    max_rubbish_week = 34
+    limit_rubbish_week = 50
 
-qr_show_uid_len = 12  # qr 码上展示uid的长度
 
-# tkinter 相关
-tk_show_uid_len = qr_show_uid_len  # tk 界面上展示uid的长度
-ranking_tk_show_uid_len = tk_show_uid_len  # tk ranking 界面上展示uid的长度
-
-tk_second_win_bg = "#fffffb"  # tkinter 第二窗口 标准颜色
-tk_win_bg = "#F0FFF0"  # tkinter 一般窗口 标准颜色 蜜瓜绿
-tk_btn_bg = "#dcdcdc"  # tkinter 按钮 标准颜色
-
-about_info = f'''
+class ConfigSystemRelease:
+    base_location = "Guangdong-KZ"
+    about_info = f'''
 HGSSystem is Garbage Sorting System
 
 HGSSystem 版权归属 SuperHuan
 作者: SongZihuan[SuperHuan]
 
 项目托关于 Github 平台
-'''.strip()
+    '''.strip()
+
+
+class ConfigExportRelease:
+    qr_show_uid_len = 12  # qr 码上展示uid的长度
+
+
+class ConfigTkinterRelease:
+    tk_refresh_delay = 50  # 延时任务的时间
+
+    tk_show_uid_len = ConfigExportRelease.qr_show_uid_len  # tk 界面上展示uid的长度
+    ranking_tk_show_uid_len = tk_show_uid_len  # tk ranking 界面上展示uid的长度
+
+    tk_second_win_bg = "#fffffb"  # tkinter 第二窗口 标准颜色
+    tk_win_bg = "#F0FFF0"  # tkinter 一般窗口 标准颜色 蜜瓜绿
+    tk_btn_bg = "#dcdcdc"  # tkinter 按钮 标准颜色
+
+
+ConfigTkinter = ConfigTkinterRelease
+ConfigExport = ConfigExportRelease
+ConfigSystem = ConfigSystemRelease
+ConfUser = ConfUserRelease
+ConfigSecret = ConfigSecretRelease

+ 5 - 5
core/user.py

@@ -1,7 +1,7 @@
 import abc
 import threading
 
-import conf
+from conf import Config
 from tool.type_ import *
 from tool.time_ import HGSTime
 from .garbage import GarbageBag, GarbageType
@@ -147,7 +147,7 @@ class NormalUser(User):
         """
         try:
             self._lock.acquire()
-            if is_right and self._rubbish > conf.max_rubbish_week:
+            if is_right and self._rubbish > Config.max_rubbish_week:
                 return self._reputation  # 执行 finally将释放锁
 
             pa = self._reputation / 1000  # P(A)
@@ -200,12 +200,12 @@ class NormalUser(User):
             self._lock.release()
         return score
 
-    def throw_rubbish(self, garbage: GarbageBag, garbage_type: enum, loc: location_t = conf.base_location) -> bool:
+    def throw_rubbish(self, garbage: GarbageBag, garbage_type: enum, loc: location_t = Config.base_location) -> bool:
         try:
             self._lock.acquire()
-            if self._rubbish > conf.max_rubbish_week:
+            if self._rubbish > Config.max_rubbish_week:
                 self.add_score(-3)
-            elif self._rubbish > conf.limit_rubbish_week:
+            elif self._rubbish > Config.limit_rubbish_week:
                 return False
 
             if garbage.is_use() or garbage.is_check()[0]:

+ 3 - 3
equipment/scan.py

@@ -2,14 +2,14 @@ import time
 import threading
 import cv2 as cv2
 
-import conf
+from conf import Config
 import qrcode
 from tool.type_ import *
 
 
 class HGSCapture:
-    def __init__(self, capnum: int = conf.capture_num, *args, **kwargs):
-        args = *args, *conf.capture_arg
+    def __init__(self, capnum: int = Config.capture_num, *args, **kwargs):
+        args = *args, *Config.capture_arg
         if cv2.CAP_DSHOW not in args:
             args = *args, cv2.CAP_DSHOW
         self._capture = cv2.VideoCapture(int(capnum), *args, **kwargs)

+ 2 - 2
equipment/scan_user.py

@@ -1,4 +1,4 @@
-import conf
+from conf import Config
 from core.user import User
 from sql.db import DB
 from sql.user import find_user_by_id
@@ -46,7 +46,7 @@ def make_uid_image(uid: uid_t, name: uname_t, path: str):
     res = qr.make_img(path)
     if not res:
         return False
-    write_text((60, 5), "noto", f"User: {name} {uid[0: conf.qr_show_uid_len]}", path)
+    write_text((60, 5), "noto", f"User: {name} {uid[0: Config.qr_show_uid_len]}", path)
     return True
 
 

+ 5 - 6
main.py

@@ -8,8 +8,7 @@
 import sys
 import os
 
-import conf
-from conf.args import p_args
+from conf import Config
 
 
 def can_not_load(name):
@@ -17,13 +16,13 @@ def can_not_load(name):
 
 
 def main():
-    program_name = p_args.program[0]
+    program_name = Config.program
     if program_name == "setup":  # setup程序不需要数据库链接等操作
         __main = os.path.dirname(os.path.abspath(__file__))
         res = os.system(f"{sys.executable} {os.path.join(__main, 'setup.py')} "
-                        f"--mysql_url={conf.mysql_url} "
-                        f"--mysql_name={conf.mysql_name} "
-                        f"--mysql_passwd={conf.mysql_passwd} "
+                        f"--mysql_url={Config.mysql_url} "
+                        f"--mysql_name={Config.mysql_name} "
+                        f"--mysql_passwd={Config.mysql_passwd} "
                         f"--program=setup")
         if res != 0:
             print("初始化程序加载失败", file=sys.stderr)

+ 4 - 4
setup.py

@@ -35,11 +35,11 @@ check_import("flask", "Flask")  # 网页服务
 check_import("PIL", "Pillow")  # 图片处理
 
 import pymysql
-import conf
+from conf import Config
 
-mysql_url = conf.mysql_url
-mysql_name = conf.mysql_name
-mysql_passwd = conf.mysql_passwd
+mysql_url = Config.mysql_url
+mysql_name = Config.mysql_name
+mysql_passwd = Config.mysql_passwd
 
 sql = pymysql.connect(user=mysql_name, password=mysql_passwd, host=mysql_url)
 cursor = sql.cursor()

+ 5 - 1
sql/base_db.py

@@ -21,10 +21,14 @@ class DBBit:
 
 class HGSDatabase(metaclass=abc.ABCMeta):
     @abc.abstractmethod
-    def __init__(self, host: str, name: str, passwd: str):
+    def __init__(self, host: str, name: str, passwd: str, port: str):
         self._host = str(host)
         self._name = str(name)
         self._passwd = str(passwd)
+        if port is None:
+            self._port = 0
+        else:
+            self._port = int(port)
 
     @abc.abstractmethod
     def close(self):

+ 3 - 3
sql/db.py

@@ -1,7 +1,7 @@
-import conf
+from conf import Config
 from tool.type_ import List
 
-if conf.database.upper() == 'MYSQL':
+if Config.database.upper() == 'MYSQL':
     try:
         from .mysql_db import MysqlDB
     except ImportError:
@@ -10,7 +10,7 @@ if conf.database.upper() == 'MYSQL':
     else:
         DB = MysqlDB
 else:
-    print(f"Not support database: {conf.database}")
+    print(f"Not support database: {Config.database}")
     raise Exception
 
 

+ 0 - 1
sql/garbage.py

@@ -257,7 +257,6 @@ def update_garbage(garbage: GarbageBag, db: DB) -> bool:
 
 def create_new_garbage(db: DB) -> Optional[GarbageBag]:
     cur = db.insert(table="garbage", columns=["CreateTime", "Flat"], values=f"{mysql_time()}, 0")
-    print(cur)
     if cur is None:
         return None
     assert cur.rowcount == 1

+ 13 - 5
sql/mysql_db.py

@@ -2,16 +2,24 @@ import pymysql
 import threading
 import traceback
 
-from conf import mysql_url, mysql_name, mysql_passwd
+from conf import Config
 from .base_db import HGSDatabase, DBCloseException
 from tool.type_ import *
 
 
 class MysqlDB(HGSDatabase):
-    def __init__(self, host: str = mysql_url, name: str = mysql_name, passwd: str = mysql_passwd):
-        super(MysqlDB, self).__init__(host, name, passwd)
+    def __init__(self,
+                 host: str = Config.mysql_url,
+                 name: str = Config.mysql_name,
+                 passwd: str = Config.mysql_passwd,
+                 port: str = Config.mysql_port):
+        super(MysqlDB, self).__init__(host, name, passwd, port)
         try:
-            self._db = pymysql.connect(user=self._name, password=self._passwd, host=self._host, database="hgssystem")
+            self._db = pymysql.connect(user=self._name,
+                                       password=self._passwd,
+                                       host=self._host,
+                                       port=self._port,
+                                       database="hgssystem")
         except pymysql.err.OperationalError:
             raise
         self._cursor = self._db.cursor()
@@ -54,7 +62,7 @@ class MysqlDB(HGSDatabase):
             by = [f" {i[0]} {i[1]} " for i in order_by]
             order_by: str = " ORDER BY" + ", ".join(by)
 
-        if limit is None:
+        if limit is None or limit == 0:
             limit: str = ""
         else:
             limit = f" LIMIT {limit}"

+ 4 - 4
sql/user.py

@@ -6,7 +6,7 @@ from tool.type_ import *
 from tool.login import create_uid, randomPassword
 from tool.time_ import mysql_time
 from core.user import NormalUser, ManagerUser, User
-import conf
+from conf import Config
 from . import garbage
 
 
@@ -137,13 +137,13 @@ def create_new_user(name: Optional[uname_t], passwd: Optional[passwd_t], phone:
     is_manager = '1' if manager else '0'
     cur = db.insert(table="user",
                     columns=["UserID", "Name", "IsManager", "Phone", "Score", "Reputation", "CreateTime"],
-                    values=f"'{uid}', '{name}', {is_manager}, '{phone}', {conf.default_score}, "
-                           f"{conf.default_reputation}, {mysql_time()}")
+                    values=f"'{uid}', '{name}', {is_manager}, '{phone}', {Config.default_score}, "
+                           f"{Config.default_reputation}, {mysql_time()}")
     if cur is None:
         return None
     if is_manager:
         return ManagerUser(name, uid)
-    return NormalUser(name, uid, conf.default_reputation, 0, conf.default_score)
+    return NormalUser(name, uid, Config.default_reputation, 0, Config.default_score)
 
 
 def get_user_phone(uid: uid_t, db: DB) -> Optional[str]:

+ 17 - 17
tk_ui/admin.py

@@ -3,7 +3,7 @@ import tkinter as tk
 from tkinter import messagebox as msg
 from tkinter import ttk
 
-import conf
+from conf import Config
 from core.garbage import GarbageBag
 from core.user import User
 from equipment.scan_garbage import write_gid_qr, write_all_gid_qr
@@ -221,7 +221,7 @@ class AdminStation(AdminStationBase):
     def set_after_run_now(self, ms, func, *args):
         self._window.after(ms, func, *args)
 
-    def __init__(self, db: DB, refresh_delay: int = conf.tk_refresh_delay):
+    def __init__(self, db: DB, refresh_delay: int = Config.tk_refresh_delay):
         self.init_after_run_list: List[Tuple[int, Callable, Tuple]] = []
 
         super().__init__(db)
@@ -254,7 +254,7 @@ class AdminStation(AdminStationBase):
     def __conf_windows(self):
         self._window.title('HGSSystem: Manage Station')
         self._window.geometry(f'{self._win_width}x{self._win_height}')
-        self._window['bg'] = conf.tk_win_bg
+        self._window['bg'] = Config.tk_win_bg
         self._window.resizable(False, False)
         self._window.protocol("WM_DELETE_WINDOW", lambda: self.main_exit())
 
@@ -307,7 +307,7 @@ class AdminStation(AdminStationBase):
 
         for bt in self._win_ctrl_button:
             bt: tk.Button
-            bt['bg'] = conf.tk_btn_bg
+            bt['bg'] = Config.tk_btn_bg
             bt['font'] = title_font
 
         bt_main: tk.Button = self._win_ctrl_button[1]
@@ -358,7 +358,7 @@ class AdminStation(AdminStationBase):
         frame_list = []
 
         for i in tk_menu.all_menu:
-            frame_list.append(i(self, self._menu_back, conf.tk_second_win_bg))
+            frame_list.append(i(self, self._menu_back, Config.tk_second_win_bg))
 
         for i in frame_list:
             name, _ = i.get_menu_frame()
@@ -367,15 +367,15 @@ class AdminStation(AdminStationBase):
     def __conf_menu(self, n: int = 1):
         for i in self._menu_dict:
             menu = self._menu_dict[i]
-            menu.conf_gui(conf.tk_btn_bg, n)
+            menu.conf_gui(Config.tk_btn_bg, n)
 
     def __conf_menu_title(self):
-        self._menu_back['bg'] = conf.tk_second_win_bg
+        self._menu_back['bg'] = Config.tk_second_win_bg
         self._menu_back['bd'] = 5
         self._menu_back['relief'] = "ridge"
 
         title_font = make_font(size=self._menu_title_font_size, weight="bold")
-        self._menu_title[0]['bg'] = conf.tk_second_win_bg
+        self._menu_title[0]['bg'] = Config.tk_second_win_bg
         self._menu_title[0]['font'] = title_font
         self._menu_title[0]['textvariable'] = self._menu_title[1]
 
@@ -404,7 +404,7 @@ class AdminStation(AdminStationBase):
         self.set_ctrl_back_button()
 
     def __conf_program_title(self):
-        self._program_back['bg'] = conf.tk_second_win_bg
+        self._program_back['bg'] = Config.tk_second_win_bg
         self._program_back['relief'] = "ridge"
         self._program_back['bd'] = 5
 
@@ -419,7 +419,7 @@ class AdminStation(AdminStationBase):
     def __conf_create_program(self):
         program_list = []
         for i in tk_program.all_program:
-            program_list.append(i(self, self._program_back, conf.tk_second_win_bg))
+            program_list.append(i(self, self._program_back, Config.tk_second_win_bg))
 
         for i in program_list:
             name, _ = i.get_program_frame()
@@ -478,20 +478,20 @@ class AdminStation(AdminStationBase):
         title_font = make_font(size=self._msg_font_size + 1, weight="bold")
         info_font = make_font(size=self._msg_font_size - 1)
 
-        self._msg_frame['bg'] = conf.tk_second_win_bg
+        self._msg_frame['bg'] = Config.tk_second_win_bg
         self._msg_frame['bd'] = 5
         self._msg_frame['relief'] = "ridge"
         # frame 不会立即显示
 
         self._msg_label[0]['font'] = title_font
-        self._msg_label[0]['bg'] = conf.tk_second_win_bg
+        self._msg_label[0]['bg'] = Config.tk_second_win_bg
         self._msg_label[0]['anchor'] = 'w'
         self._msg_label[0]['textvariable'] = self._msg_label[2]
 
         self._msg_line['bg'] = '#000000'
 
         self._msg_label[1]['font'] = info_font
-        self._msg_label[1]['bg'] = conf.tk_second_win_bg
+        self._msg_label[1]['bg'] = Config.tk_second_win_bg
         self._msg_label[1]['anchor'] = 'nw'
         self._msg_label[1]['textvariable'] = self._msg_label[3]
         self._msg_label[1]['justify'] = 'left'
@@ -502,7 +502,7 @@ class AdminStation(AdminStationBase):
 
         self._msg_hide['font'] = info_font
         self._msg_hide['text'] = '关闭'
-        self._msg_hide['bg'] = conf.tk_btn_bg
+        self._msg_hide['bg'] = Config.tk_btn_bg
         self._msg_hide['command'] = lambda: self.hide_msg()
         self._msg_hide.place(relx=0.375, rely=0.80, relwidth=0.25, relheight=0.10)
 
@@ -563,7 +563,7 @@ class AdminStation(AdminStationBase):
             height = int(width / 2)
 
         self.login_window.geometry(f'{width}x{height}')
-        self.login_window['bg'] = conf.tk_win_bg
+        self.login_window['bg'] = Config.tk_win_bg
         self.login_window.resizable(False, False)
         self.login_window.protocol("WM_DELETE_WINDOW", lambda: self.login_exit())
         self._login_frame = tk.Frame(self.login_window)
@@ -601,13 +601,13 @@ class AdminStation(AdminStationBase):
         self._login_passwd[1]['show'] = "*"
         self._login_passwd[1].place(relx=0.26, rely=0.53, relwidth=0.64, relheight=0.30)
 
-        self._login_btn[0]['bg'] = conf.tk_btn_bg
+        self._login_btn[0]['bg'] = Config.tk_btn_bg
         self._login_btn[0]['font'] = btn_font
         self._login_btn[0]['text'] = '登录'
         self._login_btn[0]['command'] = lambda: self.login_call()
         self._login_btn[0].place(relx=0.54, rely=0.70, relwidth=0.16, relheight=0.15)
 
-        self._login_btn[1]['bg'] = conf.tk_btn_bg
+        self._login_btn[1]['bg'] = Config.tk_btn_bg
         self._login_btn[1]['font'] = btn_font
         self._login_btn[1]['text'] = '退出'
         self._login_btn[1]['command'] = lambda: self.login_exit()

+ 1 - 1
tk_ui/admin_event.py

@@ -70,7 +70,7 @@ class CreateUserEvent(AdminEventBase):
             self.station.show_warning("创建用户错误", f"无法创建用户 user: {self._name}")
         else:
             name = res.get_name()
-            self.station.show_msg("创建用户成功", f"成功创建{name}个新用户")
+            self.station.show_msg("创建用户成功", f"成功创建 {name} 新用户")
 
 
 class CreateGarbageEvent(AdminEventBase):

+ 18 - 18
tk_ui/admin_program.py

@@ -7,7 +7,7 @@ from tool.type_ import *
 from tool.tk import make_font, set_tk_disable_from_list
 from tool.login import create_uid
 
-import conf
+from conf import Config
 from . import admin
 from . import admin_event as tk_event
 
@@ -124,7 +124,7 @@ class AboutProgram(AdminProgram):
         self.info['font'] = info_font
         self.info['anchor'] = 'nw'
         self.info['justify'] = 'left'
-        self.info['text'] = conf.about_info
+        self.info['text'] = Config.about_info
 
         self.title.place(relx=0.1, rely=0.0, relwidth=0.8, relheight=0.2)
         self.info.place(relx=0.05, rely=0.21, relwidth=0.90, relheight=0.75)
@@ -189,7 +189,7 @@ class CreateUserProgramBase(AdminProgram):
                                       [lambda: self.create_by_name(), lambda: self.get_uid()]):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['command'] = func
             btn.place(relx=x, rely=0.7, relwidth=0.2, relheight=0.08)
 
@@ -280,7 +280,7 @@ class CreateAutoNormalUserProgram(AdminProgram):
 
         self.btn['font'] = btn_font
         self.btn['text'] = "创建用户"
-        self.btn['bg'] = conf.tk_btn_bg
+        self.btn['bg'] = Config.tk_btn_bg
         self.btn['command'] = lambda: self.create_user()
         self.btn.place(relx=0.4, rely=0.7, relwidth=0.2, relheight=0.08)
 
@@ -348,7 +348,7 @@ class CreateGarbageProgram(AdminProgram):
                                       [lambda: self.create_garbage(), lambda: self.choose_file()]):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['command'] = func
             btn.place(relx=x, rely=0.7, relwidth=0.2, relheight=0.08)
 
@@ -458,7 +458,7 @@ class ExportProgramBase(AdminProgram):
         for btn, text in zip(self.create_btn + self.file_btn, self.title_command):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
 
         self.create_btn[1]['command'] = self.export_where
         self.create_btn[0]['command'] = self.export_id
@@ -598,7 +598,7 @@ class CreateUserFromCSVProgram(AdminProgram):
                              ["创建用户", "创建自动用户", "选择CSV", "选择CSV"]):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
 
         self.create_btn[0]['command'] = self.create
         self.create_btn[1]['command'] = self.create_auto
@@ -709,7 +709,7 @@ class DeleteUserProgram(AdminProgram):
                                    [lambda: self.del_by_uid(), lambda: self.del_by_name()]):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['command'] = func
 
         self.btn[0].place(relx=0.6, rely=0.32, relwidth=0.2, relheight=0.08)
@@ -789,7 +789,7 @@ class DeleteUsersProgram(AdminProgram):
                                       [lambda: self.delete_user(), lambda: self.scan_user()]):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['command'] = func
             btn.place(relx=x, rely=0.6, relwidth=0.2, relheight=0.08)
 
@@ -886,7 +886,7 @@ class DeleteGarbageProgramBase(AdminProgram):
 
         self.btn['font'] = btn_font
         self.btn['text'] = '删除'
-        self.btn['bg'] = conf.tk_btn_bg
+        self.btn['bg'] = Config.tk_btn_bg
         self.btn['command'] = lambda: self.delete_garbage()
         self.btn.place(relx=0.4, rely=0.68, relwidth=0.2, relheight=0.08)
 
@@ -932,7 +932,7 @@ class DeleteGarbageMoreProgram(DeleteGarbageProgramBase):
 
         self.scan_btn['font'] = make_font(size=self.btn_font_size)
         self.scan_btn['text'] = '扫描'
-        self.scan_btn['bg'] = conf.tk_btn_bg
+        self.scan_btn['bg'] = Config.tk_btn_bg
         self.scan_btn['command'] = self.scan_garbage
         self.scan_btn.place(relx=0.6, rely=0.68, relwidth=0.2, relheight=0.08)
 
@@ -1036,7 +1036,7 @@ class DeleteAllGarbageProgram(AdminProgram):
         self.btn[0]['command'] = lambda: self.delete_garbage()
 
         self.btn[1]['font'] = btn_font
-        self.btn[1]['bg'] = conf.tk_btn_bg
+        self.btn[1]['bg'] = Config.tk_btn_bg
         self.btn[1]['command'] = lambda: self.scan_garbage()
 
     def scan_garbage(self):
@@ -1157,7 +1157,7 @@ class SearchUserProgram(SearchProgramBase):
 
         self.btn['font'] = btn_font
         self.btn['text'] = "搜索"
-        self.btn['bg'] = conf.tk_btn_bg
+        self.btn['bg'] = Config.tk_btn_bg
         self.btn['command'] = self.search_user
         self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
 
@@ -1244,7 +1244,7 @@ class SearchAdvancedProgramBase(SearchProgramBase, metaclass=abc.ABCMeta):
 
         self.btn['text'] = "搜索"
         self.btn['font'] = btn_font
-        self.btn['bg'] = conf.tk_btn_bg
+        self.btn['bg'] = Config.tk_btn_bg
         self.btn['command'] = self.search
         self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
 
@@ -1333,7 +1333,7 @@ class SearchGarbageProgram(SearchProgramBase):
             height += 0.121
 
         self.btn['font'] = btn_font
-        self.btn['bg'] = conf.tk_btn_bg
+        self.btn['bg'] = Config.tk_btn_bg
         self.btn['text'] = "Search"
         self.btn['command'] = self.search_user
         self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
@@ -1472,7 +1472,7 @@ class UpdateUserProgramBase(AdminProgram):
                                    [self.update_by_where, self.update_by_uid]):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['command'] = func
 
         self.btn[0].place(relx=0.55, rely=0.40, relwidth=0.25, relheight=0.08)
@@ -1604,7 +1604,7 @@ class UpdateGarbageTypeProgram(AdminProgram):
                                    [self.update_by_where, self.update_by_gid]):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['command'] = func
 
         self.btn[0].place(relx=0.55, rely=0.43, relwidth=0.25, relheight=0.08)
@@ -1705,7 +1705,7 @@ class UpdateGarbageCheckResultProgram(AdminProgram):
                                    ["通过条件更新", "通过垃圾袋ID更新"],
                                    [self.update_by_where, self.update_by_gid]):
             btn['font'] = btn_font
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['text'] = text
             btn['command'] = func
 

+ 3 - 3
tk_ui/event.py

@@ -2,7 +2,7 @@ import abc
 import traceback
 import threading
 
-import conf
+from conf import Config
 from tool.type_ import *
 
 
@@ -35,7 +35,7 @@ class TkEventMain(metaclass=abc.ABCMeta):
 
     def __init__(self):
         self._event_list: List[TkEventBase] = []
-        self.set_after_run(conf.tk_refresh_delay, lambda: self.run_event())
+        self.set_after_run(Config.tk_refresh_delay, lambda: self.run_event())
 
     def push_event(self, event: TkEventBase):  # 添加子线程
         self._event_list.append(event)
@@ -62,7 +62,7 @@ class TkEventMain(metaclass=abc.ABCMeta):
                 event.done_after_event()
             except:
                 traceback.print_exc()
-        self.set_after_run_now(conf.tk_refresh_delay, self.run_event)
+        self.set_after_run_now(Config.tk_refresh_delay, self.run_event)
 
     @abc.abstractmethod
     def show_loading(self, title: str):  # 有子线程时显示加载

+ 9 - 9
tk_ui/ranking.py

@@ -2,7 +2,7 @@ import abc
 import tkinter as tk
 from PIL import Image, ImageTk
 
-import conf
+from conf import Config
 from tool.type_ import *
 from tool.tk import make_font
 from sql.db import DB
@@ -260,17 +260,17 @@ class RankingStation(RankingStationBase):
     def __conf_windows(self):
         self.window.title('HGSSystem: Ranking')
         self.window.geometry(f'{self.width}x{self.height}')
-        self.window['bg'] = conf.tk_win_bg
+        self.window['bg'] = Config.tk_win_bg
         self.window.resizable(False, False)
         self.bg_img = None
         self.bg_lb = tk.Label(self.window)
-        self.bg_lb['bg'] = conf.tk_win_bg
+        self.bg_lb['bg'] = Config.tk_win_bg
         self.bg_lb.place(relx=0, rely=0, relwidth=1, relheight=1)
 
         self.window.bind("<F11>", lambda _: self.__switch_full_screen())
 
     def __conf_windows_bg(self):
-        img = Image.open(conf.picture_d['rank_bg']).resize((self.width, self.height))
+        img = Image.open(Config.picture_d['rank_bg']).resize((self.width, self.height))
         self.bg_img = ImageTk.PhotoImage(img)
         self.bg_lb['image'] = self.bg_img
         self.bg_lb.place(relx=0, rely=0, relwidth=1, relheight=1)
@@ -309,11 +309,11 @@ class RankingStation(RankingStationBase):
 
         self.rank_frame['relief'] = "ridge"
         self.rank_frame['bd'] = 5
-        self.rank_frame['bg'] = conf.tk_second_win_bg
+        self.rank_frame['bg'] = Config.tk_second_win_bg
         self.rank_frame.place(relx=relx, rely=rely, relwidth=relwidth, relheight=relheight)
 
         self.rank_title['font'] = title_font
-        self.rank_title['bg'] = conf.tk_second_win_bg
+        self.rank_title['bg'] = Config.tk_second_win_bg
         self.rank_title['textvariable'] = self.rank_title_var
         self.rank_title.place(relx=0.02, rely=0.00, relwidth=0.96, relheight=0.1)
         self.rank_title_var.set("排行榜加载中...")
@@ -345,10 +345,10 @@ class RankingStation(RankingStationBase):
             height += height_l + height_s
 
         for btn, text, x in zip(self.rank_btn,
-                                ("一页", "手动" if self.auto else "自动", "下一页"), (0.050, 0.375, 0.700)):
+                                ("一页", "手动" if self.auto else "自动", "下一页"), (0.050, 0.375, 0.700)):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn.place(relx=x, rely=0.93, relwidth=0.25, relheight=0.06)
 
         self.rank_btn[0]['command'] = lambda: self.rank_page_to_prev()
@@ -368,7 +368,7 @@ class RankingStation(RankingStationBase):
         for i, info in enumerate(rank_info):
             no, name, uid, score, eval_, color = info
             self.rank_var[i].set(f"NO.{no}  {name}\n\n"  # 中间空一行 否则中文字体显得很窄
-                                 f"ID: {uid[0:conf.ranking_tk_show_uid_len]}  "
+                                 f"ID: {uid[0:Config.ranking_tk_show_uid_len]}  "
                                  f"信用: {eval_} 积分: {score}")
             if color is None:
                 self.rank_label[i]['bg'] = "#F5FFFA"

+ 22 - 25
tk_ui/station.py

@@ -1,5 +1,4 @@
 import time
-import conf
 import cv2
 import random
 import traceback
@@ -9,6 +8,7 @@ from tkinter import ttk
 import datetime
 from PIL import Image, ImageTk
 
+from conf import Config
 from tool.type_ import *
 from tool.tk import set_tk_disable_from_list, make_font
 
@@ -46,7 +46,7 @@ class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
                  db: DB,
                  cap: HGSCapture,
                  qr: HGSQRCoder,
-                 loc: location_t = conf.base_location):
+                 loc: location_t = Config.base_location):
         self._db: DB = db
         self._cap: HGSCapture = cap
         self._qr: HGSQRCoder = qr
@@ -162,10 +162,6 @@ class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
         获取排行榜的功能
         :return:
         """
-        if limit > 0:
-            limit = f"LIMIT {int(limit)}"
-        else:
-            limit = ""
 
         if order_by != 'ASC' and order_by != 'DESC':
             order_by = 'DESC'
@@ -173,7 +169,8 @@ class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
         cur = self._db.search(columns=['UserID', 'Name', 'Score', 'Reputation'],
                               table='user',
                               where='IsManager=0',
-                              order_by=[('Reputation', order_by), ('Score', order_by), ('UserID', order_by)])
+                              order_by=[('Reputation', order_by), ('Score', order_by), ('UserID', order_by)],
+                              limit=limit)
         if cur is None:
             return []
         return list(cur.fetchall())
@@ -230,20 +227,20 @@ class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
         garbage_type = GarbageType.GarbageTypeStrList_ch[int(info['type'])]
         if self._garbage.is_check()[0]:
             time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(info['use_time'])))
-            check = f'Checker is {info["checker"][0:conf.tk_show_uid_len]}\n'
+            check = f'Checker is {info["checker"][0:Config.tk_show_uid_len]}\n'
             if info["check"] == '1':
                 check += f'检查结果为 投放正确\n'
             else:
                 check += f'检查结果为 投放错误\n'
             self.show_msg("垃圾袋信息", (f"垃圾类型为 {garbage_type}\n"
-                                    f"用户是 {info['user'][0:conf.tk_show_uid_len]}\n"
+                                    f"用户是 {info['user'][0:Config.tk_show_uid_len]}\n"
                                     f"地址:\n  {info['loc']}\n"
                                     f"{check}"
                                     f"使用日期:\n  {time_str}"), show_time=5.0)  # 遮蔽Pass和Fail按键
         elif self._garbage.is_use():
             time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(info['use_time'])))
             self.show_msg("垃圾袋信息", (f"垃圾类型为 {garbage_type}\n"
-                                    f"用户是 {info['user'][0:conf.tk_show_uid_len]}\n"
+                                    f"用户是 {info['user'][0:Config.tk_show_uid_len]}\n"
                                     f"地址:\n  {info['loc']}\n"
                                     f"垃圾袋还未检查\n"
                                     f"使用日期:\n  {time_str}"), big=False, show_time=5.0)  # 不遮蔽Pass和Fail按键
@@ -290,7 +287,7 @@ class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
 
     def show_about_info(self):
         self.update_user_time()
-        self.show_msg("关于", conf.about_info, show_time=5.0)
+        self.show_msg("关于", Config.about_info, show_time=5.0)
 
     def show_exit(self):
         self.update_user_time()
@@ -443,8 +440,8 @@ class GarbageStation(GarbageStationBase):
                  db: DB,
                  cap: HGSCapture,
                  qr: HGSQRCoder,
-                 loc: location_t = conf.base_location,
-                 refresh_delay: int = conf.tk_refresh_delay):
+                 loc: location_t = Config.base_location,
+                 refresh_delay: int = Config.tk_refresh_delay):
         self.init_after_run_list: List[Tuple[int, Callable, Tuple]] = []
 
         super(GarbageStation, self).__init__(db, cap, qr, loc)
@@ -598,7 +595,7 @@ class GarbageStation(GarbageStationBase):
     def __conf_windows(self):
         self._window.title('HGSSystem: Garbage Station')
         self._window.geometry(f'{self._win_width}x{self._win_height}')
-        self._window['bg'] = conf.tk_win_bg
+        self._window['bg'] = Config.tk_win_bg
         self._window.resizable(False, False)  # 禁止缩放
         self._window.protocol("WM_DELETE_WINDOW", lambda: self.show_exit())  # 设置标题栏[x]按钮
         self._window.overrideredirect(False)  # 显示标题栏
@@ -665,7 +662,7 @@ class GarbageStation(GarbageStationBase):
     def __conf_title_label(self):
         title_font = make_font(size=self._title_font_size, weight="bold")
         self._title_label['font'] = title_font
-        self._title_label['bg'] = conf.tk_win_bg
+        self._title_label['bg'] = Config.tk_win_bg
         self._title_label['text'] = "HGSSystem: Garbage Station Control Center"  # 使用英语标题在GUI更美观
         self._title_label['anchor'] = 'w'
         self._title_label.place(relx=0.02, rely=0.01, relwidth=0.7, relheight=0.07)
@@ -676,7 +673,7 @@ class GarbageStation(GarbageStationBase):
         for bt in self._win_ctrl_button:
             bt: tk.Button
             bt['font'] = title_font
-            bt['bg'] = conf.tk_btn_bg
+            bt['bg'] = Config.tk_btn_bg
 
         rely = 0.02
         relwidth = 0.05
@@ -746,7 +743,7 @@ class GarbageStation(GarbageStationBase):
         # 显示一张图片 (GUI更美观)
         img_relwidth = 0.30
         img_relheight = height_label * 3 + (h_label_s / height_count) * 2
-        img = (Image.open(conf.picture_d['head']).
+        img = (Image.open(Config.picture_d['head']).
                resize((int(img_relwidth * frame_width), int(img_relheight * frame_height))))
         self._user_im = ImageTk.PhotoImage(image=img)
         self._user_img['image'] = self._user_im
@@ -839,7 +836,7 @@ class GarbageStation(GarbageStationBase):
                                            ("搜索", "#F4A460")]
 
         self._user_btn_frame.place(relx=0.02, rely=0.66, relwidth=0.19, relheight=0.32)
-        self._user_btn_frame['bg'] = conf.tk_win_bg
+        self._user_btn_frame['bg'] = Config.tk_win_bg
 
         """
         计算标签和间隔的大小比例(相对于Frame)
@@ -876,7 +873,7 @@ class GarbageStation(GarbageStationBase):
         title_font = make_font(size=self._msg_font_size + 1, weight="bold")
         info_font = make_font(size=self._msg_font_size - 1)
 
-        bg_color = conf.tk_second_win_bg
+        bg_color = Config.tk_second_win_bg
         self._msg_frame['bg'] = bg_color
         self._msg_frame['bd'] = 5
         self._msg_frame['relief'] = "ridge"
@@ -918,7 +915,7 @@ class GarbageStation(GarbageStationBase):
         self._msg_y_scroll.place(relx=0.95 - y_scroll, rely=0.20, relwidth=y_scroll, relheight=0.64)
 
         self._msg_hide['font'] = info_font
-        self._msg_hide['bg'] = conf.tk_btn_bg
+        self._msg_hide['bg'] = Config.tk_btn_bg
         self._msg_hide['text'] = '关闭'
         self._msg_hide['command'] = lambda: self.hide_msg_rank(True)
         self._msg_hide.place(relx=0.42, rely=0.85, relwidth=0.16, relheight=0.09)
@@ -986,7 +983,7 @@ class GarbageStation(GarbageStationBase):
         # 标签结束的高度为 0.12 + 0.15 * 5 = 0.87
         for btn, text in zip(self._rank_btn, ("上一页", "关闭", "下一页")):
             btn['font'] = btn_font
-            btn['bg'] = conf.tk_btn_bg
+            btn['bg'] = Config.tk_btn_bg
             btn['text'] = text
 
         self._rank_btn[0].place(relx=0.050, rely=0.88, relwidth=0.25, relheight=0.08)
@@ -1014,7 +1011,7 @@ class GarbageStation(GarbageStationBase):
         for i, info in enumerate(rank_info):
             no, name, uid, score, eval_, color = info
             self._rank_var[i + 1].set(f"NO.{no}  {name}\n\n"  # 中间空一行 否则中文字体显得很窄
-                                      f"ID: {uid[0:conf.ranking_tk_show_uid_len]}  "
+                                      f"ID: {uid[0:Config.ranking_tk_show_uid_len]}  "
                                       f"信用: {eval_} 积分: {score}")
             if color is None:
                 self._rank_label[i + 1]['bg'] = "#F5FFFA"
@@ -1064,13 +1061,13 @@ class GarbageStation(GarbageStationBase):
     def __conf_loading(self):
         title_font = make_font(size=self._loading_tile_font, weight="bold")
 
-        self._loading_frame['bg'] = conf.tk_second_win_bg
+        self._loading_frame['bg'] = Config.tk_second_win_bg
         self._loading_frame['bd'] = 5
         self._loading_frame['relief'] = "ridge"
         # frame 不会立即显示
 
         self._loading_title[0]['font'] = title_font
-        self._loading_title[0]['bg'] = conf.tk_second_win_bg
+        self._loading_title[0]['bg'] = Config.tk_second_win_bg
         self._loading_title[0]['anchor'] = 'w'
         self._loading_title[0]['textvariable'] = self._loading_title[1]
         self._loading_title[0].place(relx=0.02, rely=0.00, relwidth=0.96, relheight=0.6)
@@ -1159,7 +1156,7 @@ class GarbageStation(GarbageStationBase):
             if uid_get is None or len(uid_get) < 32:
                 uid.set('error')
             else:
-                uid.set(uid_get[0:conf.tk_show_uid_len])
+                uid.set(uid_get[0:Config.tk_show_uid_len])
             eval_.set(user_info.get('reputation'))
             rubbish.set(user_info.get('rubbish'))
             score.set(user_info.get('score'))

+ 3 - 3
tool/login.py

@@ -1,14 +1,14 @@
 from .type_ import *
 import hashlib
-import conf
+from conf import Config
 from random import randint
 
 
-def create_uid(name: uname_t, passwd: passwd_t, salt: str = conf.passwd_salt) -> str:
+def create_uid(name: uname_t, passwd: passwd_t, salt: str = Config.passwd_salt) -> str:
     return hashlib.md5(f"HGSSystem-USER{name}-PASSWORD:{passwd}-{salt}-END".encode('utf-8')).hexdigest()
 
 
-def check_login(uid: uid_t, name: uname_t, passwd: passwd_t, salt: str = conf.passwd_salt) -> bool:
+def check_login(uid: uid_t, name: uname_t, passwd: passwd_t, salt: str = Config.passwd_salt) -> bool:
     return uid == create_uid(name, passwd, salt)
 
 

+ 2 - 2
tool/pic.py

@@ -1,4 +1,4 @@
-import conf
+from conf import Config
 from .type_ import *
 from PIL import Image, ImageDraw, ImageFont
 
@@ -6,6 +6,6 @@ from PIL import Image, ImageDraw, ImageFont
 def write_text(pos: Tuple[int, int], font: str, text: str, path: str):
     image = Image.open(path)
     draw = ImageDraw.Draw(image)
-    font = ImageFont.truetype(font=conf.font_d[font], size=20)
+    font = ImageFont.truetype(font=Config.font_d[font], size=20)
     draw.text(pos, text, font=font)
     image.save(path)

+ 2 - 2
tool/tk.py

@@ -2,13 +2,13 @@ import tkinter as tk
 from tkinter import font
 from typing import List, Union
 
-import conf
+from conf import Config
 
 Disable_type = Union[tk.Button, tk.Entry]
 
 
 def make_font(family: str = 'noto', **kwargs):
-    return font.Font(family=conf.font_d[family], **kwargs)
+    return font.Font(family=Config.font_d[family], **kwargs)
 
 
 def set_tk_disable_from_list(btn_list: List[Disable_type], flat: str = 'disable'):