-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoppressor.py
147 lines (134 loc) · 4.89 KB
/
oppressor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# 随手打的一个词竟然还真的有,那就用这个名吧
# 这个文件封装了一些针对数据库的操作
import database as DB
thisYear = 2022 # 以后要改成自动获取
# 并且这个应该是指学年而不是当前年份
# 这个函数被用到的地方:_class.py
def classIdToString(a):
global thisYear
id = int(a)
_year = id // 100
_class = id % 100
ret = ""
# 特殊身份的判断 # 这些东西要放到文档里
# 教师 100001 100002
# 管理员 110001 110002
# 系统 120003 120004
# 超管 130001
if _year//100 == 10:
ret = "教师"
return ret
elif _year//100 == 11:
ret = "管理员"
return ret
elif _year//100 == 12:
ret = "系统"
return ret
elif _year//100 == 13:
ret = "超管"
return ret
if _class <= 9:
ret = ret + "高"
elif _class <= 17:
ret = ret + "蛟"
if _year == thisYear:
ret = ret + "一"
elif _year == thisYear - 1:
ret = ret + "二"
elif _year == thisYear - 2:
ret = ret + "三"
ret = ret + (["NULL","1","2","3","4","5","6","7","8","9","NULL","1","2","3","4","5","6","7"])[_class] #如果我没记错的话校徽是这样的
ret = ret + "班"
if "NULL" in ret: ret = "无班级"
return ret
OP_NOT_FOUND = "数据库信息错误:未查询到相关信息"
OP_NOT_ONLY = "数据库信息错误:要求一个但查询到多个"
# 下面三个是对MySQL操作的封装
# 对SQL的操作尽量使用这三个而不是直接DB.execute()
# 标出来的是调试输出
# 注意:SQL中传入的所有参数要使用%s(我也不知道为什么,但是是对的)
def select(col,src,exp,val,ret,only=True): # 估计能用了
# col:选择的列,字符串 src:从哪张表,字符串 exp:条件,字符串
# val:传入的数据,元组 ret:返回的格式,列表,内容为字符串,为[]则为col
# only:是否只取一个
# 返回值:一个布尔值、一个字典,格式由ret决定(若only=False则为一个数组)
s = "SELECT %s FROM %s WHERE %s;"%(col,src,exp)
print("Selecting:",s,val) # 生成的SQL语句和参数 #
DB.execute(s,val)
r = DB.fetchall()
print("Select Result:",r) # SQL返回值 #
if ret==[]: # 这个尽量避免使用吧,可能会有奇奇怪怪的锅(本来还想偷点懒的)
ret=list(col.split(","))
for i in len(ret): ret[i]=ret[i].strip()
if r is None or len(r)==0:
return False, {"type":"ERROR","message":OP_NOT_FOUND}
if len(r)==1:
result={} # 格式化返回值
for j in range(0,len(ret)):
result.update({ret[j]: r[0][j]})
if only: return True, result
else: return True, [result] # 就算只有一个,没有Only还是要返回数组
else:
if only: # 理论上不应该有这种情况,真出现了估计是Insert的锅
return False, {"type":"ERROR","message":OP_NOT_ONLY}
result=[]
for i in range(0,len(r)):
result.append({}) # 格式化返回值
for j in range(0, len(ret)):
result[i].update({ret[j]: r[i][j]})
return True, result
# !!!注意!!!下面两个函数是没有返回值的!!!
# fl,r=OP.update(...) 错!
# OP.update(...) 对!
def update(col, src, exp, val): # 估计能用了
# 参数同上
s = "UPDATE %s SET %s WHERE %s;" % (src, col, exp)
print("Updating:", s, val) # 生成的SQL语句和参数 #
DB.execute(s, val)
r = DB.fetchall()
def insert(col,src,val): # 估计能用了
# 参数同上
print(col)
print(src)
print(val)
tmp=("%s,"*len(val))[:-1]
print(tmp)
s="INSERT INTO %s (%s) VALUES (%s);"%(src,col,tmp)
print("Inserting:",s,val) # 生成的SQL语句和参数 #
DB.execute(s,val)
r=DB.fetchall()
def getRandThought():
s="SELECT * FROM stu_vol ORDER BY status DESC, RAND() DESC LIMIT 1;"
DB.execute(s)
return DB.fetchone()
# 获取一个表中有多少行记录
# (到目前)只被用于获取volId
# 是不是可以用来随机获取一条数据?
# 这东西现在看来好像没什么用,只要设置AUTO_INCREMENT就好了
def getLength(src): # 还未调试!
s="SELECT MAX(ROWNUM) FROM %s"%src
print("Get Length:",s,src) # 生成的SQL语句和参数 #
DB.execute(s)
r=DB.fetchall()
print("Length:",r) # SQL返回值 #
return r[0]
# 下面两个函数本来是想改掉的,但是他们(到目前为止)没有任何锅,
# 并且和别的函数也没有关系,暂时先放一下。
# 被使用到的地方:user.py
def user2dict(v):
return { "username":v[1], "class":v[2],
"permission":v[3], "classname":classIdToString(v[2])
}
def userLogin(userId, password):
if isinstance(userId, str) and isinstance(password, str): # 其实传入的都是str类型
DB.execute("SELECT * FROM user WHERE userId = %s AND password = %s;", (userId, password))
r = DB.fetchall()
if len(r) == 0:
return False, {"message":"用户ID或密码错误"}
elif len(r) > 1:
return False, {"message":"数据库信息错误:要求一个但查询到多个"}
else:
return True, r[0]
else:
return False, {"message": "请求接口错误"}
# 其他一些就都暂时没用了,在这个分支上先删了