init.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. import os
  2. import sys
  3. import time
  4. from typing import Union, List, Tuple
  5. print("初始化程序开始执行")
  6. print("开始检查依赖")
  7. print(r"是否使用 http://pypi.douban.com/simple/ 源")
  8. use_i = input(r"[Y/n]")
  9. if use_i == "Y" or use_i == 'y':
  10. use_i = r"-i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com"
  11. else:
  12. use_i = ""
  13. try:
  14. __import__("pip")
  15. except ImportError:
  16. print("检查结束, 未找到pip")
  17. sys.exit(1)
  18. else:
  19. print("依赖 pip 存在")
  20. if os.system(f"{sys.executable} -m pip install {use_i} --upgrade pip") != 0:
  21. print(f"依赖 pip 更新失败", file=sys.stderr)
  22. else:
  23. print(f"依赖 pip 更新成功")
  24. __setup = os.path.dirname(os.path.abspath(__file__))
  25. def check_import(packages: Union[str, List[str]], pips: Union[str, List[str]]):
  26. if type(pips) is str:
  27. pips = [pips]
  28. if type(packages) is str:
  29. packages = [packages]
  30. try:
  31. for package in packages:
  32. __import__(package)
  33. print(f"依赖 {package} 存在")
  34. except ImportError:
  35. for pip in pips:
  36. command = f"{sys.executable} -m pip install {use_i} {pip}"
  37. print(f"依赖 {pip} 安装: {command}")
  38. if os.system(command) != 0:
  39. print(f"依赖 {pip} 安装失败", file=sys.stderr)
  40. raise ImportError
  41. else:
  42. print(f"依赖 {packages}:{pip} 安装成功")
  43. print("是否安装可选的`picamera`支持?")
  44. res = input("[Y/n]")
  45. if res == "Y" or res == "y":
  46. check_import("picamera", "picamera")
  47. try:
  48. check_import("cv2", "opencv-python==4.5.3.56") # 图像处理
  49. check_import("qrcode", "qrcode") # 二维码生成
  50. check_import("pymysql", "PyMySQL") # 连接 MySQL服务器
  51. check_import("PIL", "Pillow") # 图片处理
  52. except ImportError:
  53. sys.exit(1)
  54. try:
  55. check_import("flask", "Flask") # 网页服务
  56. check_import("flask_wtf", "Flask-WTF") # 网页服务
  57. check_import("flask_login", "Flask-Login") # 网页服务
  58. check_import("pyecharts", "pyecharts") # 网页服务
  59. check_import("waitress", "waitress") # waitress 网页服务
  60. except ImportError:
  61. print(f"网络服务不可用", file=sys.stderr)
  62. try:
  63. check_import("numpy", "numpy") # matplotlib依赖
  64. check_import("matplotlib", "matplotlib") # matplotlib依赖
  65. except ImportError:
  66. print(f"数据分析服务不可用", file=sys.stderr)
  67. try:
  68. check_import(["oss2", "viapi", "aliyunsdkcore", "aliyunsdkimagerecog"],
  69. ["oss2", "aliyun-python-sdk-viapiutils", "viapi-utils", "aliyun-python-sdk-imagerecog"]) # 阿里云依赖
  70. except ImportError:
  71. print("垃圾站服务不可用")
  72. import pymysql
  73. from conf import Config
  74. mysql_url = Config.mysql_url
  75. mysql_name = Config.mysql_name
  76. mysql_passwd = Config.mysql_passwd
  77. mysql_port = Config.mysql_port
  78. try:
  79. print(f"MySQL -h {mysql_url} -u {mysql_name} -P {mysql_port} -p{mysql_passwd}")
  80. if mysql_port is None:
  81. mysql_port = 0
  82. else:
  83. mysql_port = int(mysql_port)
  84. sql = pymysql.connect(user=mysql_name, password=mysql_passwd, host=mysql_url, port=mysql_port)
  85. cursor = sql.cursor()
  86. except pymysql.err.Error:
  87. print("请提供正确的MySQL信息", file=sys.stderr)
  88. sys.exit(1)
  89. else:
  90. cursor.execute("USE hgssystem")
  91. from tool.login import create_uid
  92. from tool.time import mysql_time
  93. print("是否执行数据库初始化程序?\n执行初始化程序会令你丢失所有数据.")
  94. res = input("[Y/n]")
  95. if res == 'Y' or res == 'y':
  96. with open(os.path.join(__setup, "init.sql"), "r", encoding='utf-8') as f:
  97. all_sql = f.read().split(';\n') # 使用 `;` 作为分隔符是不够的, 因为函数中可能会使用`;`表示语句
  98. for s in all_sql:
  99. if s.strip() == "":
  100. continue
  101. cursor.execute(f"{s};")
  102. sql.commit()
  103. admin_passwd = input("创建 'admin' 管理员的密码: ")
  104. admin_phone = ""
  105. while len(admin_phone) != 11:
  106. admin_phone = input("输入 'admin' 管理员的电话[长度=11]: ")
  107. # 生成基本 admin 用户
  108. uid = create_uid("admin", admin_passwd)
  109. cursor.execute(f"INSERT INTO user(UserID, Name, IsManager, Phone, Score, Reputation, CreateTime) "
  110. f"VALUES ('{uid}', 'admin', 1, '{admin_phone}', 10, 300, {mysql_time()});")
  111. sql.commit()
  112. print("是否伪造数据?")
  113. if input("[Y/n]") != "Y":
  114. cursor.close()
  115. sql.close()
  116. exit(0)
  117. # 伪造数据
  118. # 只有执行setup时可以伪造数据, 目的是不希望在生产环境上允许伪造数据
  119. # 不过这是个开源程序, 所以你完全可以绕开限制
  120. import random
  121. from tool.login import randomPassword
  122. try:
  123. check_import("faker", "Faker") # matplotlib依赖
  124. except ImportError:
  125. print("伪造数据服务不可用")
  126. else:
  127. from faker import Faker
  128. fake = Faker(locale='zh_CN')
  129. random_manager = []
  130. random_normal = []
  131. loc = [fake.street_name() for _ in range(4)]
  132. def random_time() -> str:
  133. r_time = int(time.time())
  134. r_start = int(r_time - 35 * 24 * 60 * 60)
  135. return mysql_time(random.randint(r_start, r_time))
  136. def random_time_double() -> Tuple[str, str]:
  137. r_time = int(time.time())
  138. r_start = int(r_time - 35 * 24 * 60 * 60)
  139. r_h1 = random.randint(r_start, r_time)
  140. r_h2 = random.randint(r_start, r_time)
  141. return mysql_time(min(r_h1, r_h2)), mysql_time(max(r_h1, r_h2))
  142. def random_user(r_name, r_passwd, r_phone, r_time, is_manager: int, cur, c_g=0, u_g=0):
  143. r_score = random.randint(0, 50000) / 100
  144. r_reputation = random.randint(5, 995)
  145. r_uid = create_uid(r_name, r_passwd)
  146. cur.execute(f"INSERT INTO user(UserID, Name, IsManager, Phone, Score, Reputation, CreateTime) "
  147. f"VALUES ('{r_uid}', '{r_name}', {is_manager}, '{r_phone}', {r_score}, {r_reputation}, {r_time});")
  148. if is_manager:
  149. random_manager.append(r_uid)
  150. print(f"管理员: {r_name} {r_passwd} {r_phone} {r_reputation} {r_score} {r_uid}")
  151. else:
  152. random_normal.append(r_uid)
  153. print(f"普通用户: {r_name} {r_passwd} {r_phone} {r_reputation} {r_score} {r_uid}")
  154. while c_g > 0:
  155. c_g -= 1
  156. t2, t1 = random_time_double()
  157. random_garbage_c_to_user(r_uid, t1, t2, cur)
  158. while u_g > 0:
  159. u_g -= 1
  160. t2, t1 = random_time_double()
  161. random_garbage_u_to_user(r_uid, t1, t2, cur)
  162. def random_garbage_n(r_time, cur):
  163. cur.execute(f"INSERT INTO garbage(CreateTime, Flat) VALUES ({r_time}, 0);")
  164. def random_garbage_c_to_user(user, r_time, r_time2, cur):
  165. r_loc = random.choice(loc)
  166. cur.execute(f"INSERT INTO garbage(CreateTime, Flat, UserID, UseTime, GarbageType, Location) "
  167. f"VALUES ({r_time}, 1, '{user}', {r_time2}, {random.randint(1, 4)}, '{r_loc}');")
  168. def random_garbage_u_to_user(user, r_time, r_time2, cur):
  169. checker = random.choice(random_manager)
  170. r_loc = random.choice(loc)
  171. cur.execute(f"INSERT INTO garbage(CreateTime, Flat, UserID, UseTime, GarbageType, Location, "
  172. f"CheckerID, CheckResult) "
  173. f"VALUES ({r_time}, 1, '{user}', {r_time2}, {random.randint(1, 4)}, '{r_loc}', "
  174. f"'{checker}', {random.randint(0, 1)});")
  175. def random_garbage_c(r_time, r_time2, cur):
  176. user = random.choice(random_normal)
  177. random_garbage_c_to_user(user, r_time, r_time2, cur)
  178. def random_garbage_u(r_time, r_time2, cur):
  179. user = random.choice(random_normal)
  180. random_garbage_u_to_user(user, r_time, r_time2, cur)
  181. def random_news(c_time, cur):
  182. user = random.choice(random_normal)
  183. text = f"大家好,我是 {fake.name()}, 我居住在 {fake.street_name()}{fake.street_address()}, 谢谢"
  184. cur.execute(f"INSERT INTO context(Context, Author, Time) "
  185. f"VALUES ('{text}', '{user}', {c_time});")
  186. def random_goods(cur):
  187. car = fake.license_plate()
  188. quantity = random.randint(0, 20)
  189. score = random.randint(10, 200)
  190. cur.execute(f"INSERT INTO goods(Name, Quantity, Score) "
  191. f"VALUES ('{car}', '{quantity}', {score});")
  192. def make_fake():
  193. print("步骤1, 注册管理账户[输入q结束]:")
  194. while True:
  195. name = input("输入用户名:")
  196. if name == 'q': # 这里使用了海象表达式, 把赋值运算变成一种表达式
  197. break
  198. passwd = input("输入密码:")
  199. if passwd == 'q':
  200. break
  201. phone = input("输入手机号码[输入x表示随机]:")
  202. if phone == 'q':
  203. break
  204. creat_time = input("是否随机时间[n=不随机 y=随机]:")
  205. if creat_time == 'q':
  206. break
  207. if phone == 'x':
  208. phone = fake.phone_number()
  209. if creat_time == 'n':
  210. c_time = mysql_time()
  211. else:
  212. c_time = random_time()
  213. random_user(name, passwd, phone, c_time, 1, cursor)
  214. print("步骤2, 注册普通账户[输入q结束]:")
  215. while True:
  216. name = input("输入用户名:")
  217. if name == 'q': # 这里使用了海象表达式, 把赋值运算变成一种表达式
  218. break
  219. passwd = input("输入密码:")
  220. if passwd == 'q':
  221. break
  222. phone = input("输入手机号码[输入x表示随机]:")
  223. if phone == 'q':
  224. break
  225. creat_time = input("是否随机时间[n=不随机 y=随机]:")
  226. if creat_time == 'q':
  227. break
  228. w_garbage = input("待检测垃圾个数:")
  229. if w_garbage == 'q':
  230. break
  231. c_garbage = input("已检测垃圾个数:")
  232. if c_garbage == 'q':
  233. break
  234. if creat_time == 'n':
  235. c_time = mysql_time()
  236. else:
  237. c_time = random_time()
  238. if phone == 'x':
  239. phone = fake.phone_number()
  240. w_garbage = int(w_garbage)
  241. c_garbage = int(c_garbage)
  242. random_user(name, passwd, phone, c_time, 0, cursor, w_garbage, c_garbage)
  243. count = int(input("步骤3, 注册随机管理员账户[输入个数]:"))
  244. while count > 0:
  245. name = fake.name()
  246. passwd = randomPassword()
  247. phone = fake.phone_number()
  248. c_time = random_time()
  249. random_user(name, passwd, phone, c_time, 1, cursor)
  250. count -= 1
  251. count = int(input("步骤3, 注册随机普通账户[输入个数]:"))
  252. while count > 0:
  253. name = fake.name()
  254. passwd = randomPassword()
  255. phone = fake.phone_number()
  256. c_time = random_time()
  257. random_user(name, passwd, phone, c_time, 0, cursor)
  258. count -= 1
  259. count = int(input("步骤4, 注册随机未使用垃圾袋[输入个数]:"))
  260. while count > 0:
  261. count -= 1
  262. c_time = random_time()
  263. random_garbage_n(c_time, cursor)
  264. if len(random_normal) > 0:
  265. count = int(input("步骤5, 注册随机待检查垃圾袋[输入个数]:"))
  266. while count > 0:
  267. count -= 1
  268. c_time2, c_time1 = random_time_double()
  269. random_garbage_c(c_time1, c_time2, cursor)
  270. if len(random_manager) > 0:
  271. count = int(input("步骤6, 注册随机已检查垃圾袋[输入个数]:"))
  272. while count > 0:
  273. count -= 1
  274. c_time2, c_time1 = random_time_double()
  275. random_garbage_u(c_time1, c_time2, cursor)
  276. count = int(input("步骤7, 注册随机新闻内容:"))
  277. while count > 0:
  278. count -= 1
  279. c_time = random_time()
  280. random_news(c_time, cursor)
  281. count = int(input("步骤8, 注册随机商城内容:"))
  282. while count > 0:
  283. count -= 1
  284. random_goods(cursor)
  285. make_fake()
  286. sql.commit()
  287. cursor.close()
  288. sql.close()