from tools import * from Utils.Config import * from Utils.Lib import * """ 已被废弃,仅供参考 """ Manage=flask.Blueprint("Manage", __name__, static_folder = JoinPath(FlaskTempLate, "Manage"), static_url_path = "/", subdomain = "manage") #response = client.chat.completions.create( # model="deepseek-chat", # messages=[ # {"role": "system", "content": "You are a helpful assistant"}, # {"role": "user", "content": "你好"}, # ], # stream=False #) #print(response.choices[0].message.content) #https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww36e7f50aa690169a&corpsecret=-r2vvpDpqX8DIUbHOuA5GjEyiniWLrSFfnKNyvZ88yQ access_token="DpsH1Vt9Hg7cd-4VGQij2zQ9fQ7G9sREK5ugxs52bDUA46f3tJLjVxzbkqxFG91WRRlL7GaEdAx1E5UPAgL7O05psZqDQK8wm3OWR4ixLvx4M2LU6Pi5UfgqhKi53mhKe1IyxbOJLNkT7BdnYBW2WgKXO8mlhC6_jqpQgKDrDKF7U0i1KU9B6ZWlGlJz06caeK7J5ji4ADqheCokL2oByw" def GetWeekStartDate(day=None, week_start=0, week_seek=0): if week_seek != 0: day = date.today() day += timedelta(weeks=week_seek) else: day = day or date.today() return (day - timedelta(days=(day.weekday() - week_start) % 7)).strftime('%Y-%m-%d 00:00:00') def PermissionsToStrPermissions(ADMIN): ADMIN = str(ADMIN) if "." not in ADMIN:return "未知" main, sub = ADMIN.split(".", 1) permissions_map = { "5": ["工作室创始人", { "0": "", "2": "(没有认真阅读文档加入)(这个状态码在工作室创始人换人前不会出现)", "9": "(劳动合同未签署或失效)(这个状态码在工作室创始人换人前不会出现)", }], "4": ["组代理", { "01": "(临时)", "0": "", "5": "(4~5的中间级)(正常情况下不会出现)" }], "3": ["委代理", { "01": "(临时)", "0": "" }], "2": ["", { "0": "组员", "5": "组长", "9": "特权" }], "1": ["", { "0": "网站注册人员/普通人员/测试用户/工作室用户暂时权限未更改" }], } invalid_msg = f"{main}没有这个状态码" if main not in permissions_map: return "未知" if sub in permissions_map[main][1]: return permissions_map[main][0] + permissions_map[main][1].get(sub) else: return invalid_msg TaskTypeLib={"1":"图像(纯图像文件)","2":"图像工程文件","3":"视频(纯视频文件)","4":"视频工程文件","5":"代码源文件","6":"编译后文件(exe)","7":"编译后文件(elf)","8":"编译后文件(app)","9":"编译后文件(apk)","10":"编译后文件(其它)(库文件)","11":"网络资源文件(exe)","12":"网络资源文件(elf)","13":"网络资源文件(app)","14":"网络资源文件(apk)","15":"网络资源文件(其它)(库文件)","16":"文稿(纯文字)","17":"文稿(网页文件)(富文本)(HTML5)","18":"文稿(标记语言)(MarkDown)","19":"文稿(故事剧情)","20":"停职恢复考察"} TaskAnswerLib={"1":"上传文件","2":"填写长信息(多次换行)","3":"填写短信息(不可换行)","4":"填写链接","5":"其它链接(如考试题答题界面链接)"} def LISTTOTASKTYPE(I): s=[] for i in I: if str(i) in TaskTypeLib:s.append(TaskTypeLib[str(i)]) else:s.append("未知") return s def LISTTOTASKANSWER(I): s=[] for i in I: if str(i) in TaskAnswerLib:s.append(TaskAnswerLib[str(i)]) else:s.append("未知") return s def INTTOTASKTYPE(I): if I in TaskTypeLib:return TaskTypeLib[I] else:return "未知" def INTTOTASKANSWER(I): if I in TaskAnswerLib:return TaskAnswerLib[I] else:return "未知" """def GetSMTM(): res=[] for i in SQLUsers.selectashead(NSQL.MOD.ALL,FROM="SMTM"): if not Is_User(GetBytesto16(i["UserUUID"])): SQLUsers.delete(FROM="UserSub", WHERE=("UserUUID=%s", i["UserUUID"])) continue res.append({"UserUUID":GetBytesto16(i["UserUUID"]), "UserParent": GetBytesto16(i["UserParent"])}) return res def SearchChilds(UUID: str, SMTM): if not UUID or not SMTM: return False l=[] for i in SMTM: if i["UserParent"] == UUID: l.append(i["UserUUID"]) return l def SearchFutureGenerations(UUID: str, SMTM): # 搜索某个UUID在SMTM下的所有子类 ASMTM=GetSMTM() d={str(SearchChilds("0"*32, ASMTM)[0]):{"Member":{}}} def Recursion(d, U): for i in SearchChilds(U, SMTM): d["Member"][i]=Recursion({"Member": {}}, i) return d for i in SearchChilds(UUID, SMTM): d[SearchChilds("0"*32, ASMTM)[0]]["Member"][i]=Recursion({"Member": {}}, i) return d""" def GetSMTM(): result = [] for user in SQLUsers.selectashead(NSQL.MOD.ALL, FROM="SMTM"): UserUUID = GetBytesto16(user["UserUUID"]) #if not Is_User(userUuid): # SQLUsers.delete(FROM="UserSub", WHERE=("UserUUID=%s", user["UserUUID"])) # continue result.append({"UserUUID": UserUUID, "UserParent": GetBytesto16(user["UserParent"])}) return result def SearchChilds(UserUUID, smtm): if not UserUUID or not smtm: return False return [child["UserUUID"] for child in smtm if child["UserParent"] == UserUUID] def SearchFutureGenerations(UserUUID, smtm): if not UserUUID or not smtm: return {} RootUUID = SearchChilds("0"*32, smtm)[0] result = {RootUUID: {"Member": {}}} directChildren = SearchChilds(UserUUID, smtm) if not directChildren: return result stack = [(childUuid, result[RootUUID]["Member"]) for childUuid in directChildren] while stack: currentUuid, parentMember = stack.pop() currentMember = {"Member": {}} parentMember[currentUuid] = currentMember children = SearchChilds(currentUuid, smtm) for childUuid in children: stack.append((childUuid, currentMember["Member"])) return result # Tasks def Is_Task(u): return SQLTasks.istrue("Tasks", ("TaskUUID=%s", Get16toBytes(u))) def Is_UserInTask(u, UserUUID): return SQLTasks.istrue("Answer", ("TaskUUID=%s AND UserUUID=%s" , (Get16toBytes(u), Get16toBytes(UserUUID)))) def GetTaskInFo(u): return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Tasks", WHERE=("TaskUUID=%s", Get16toBytes(u)), _limit=1)[0] def GetTaskAnswerInFo(TaskUUID, UserUUID): return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID))), _limit=1)[0] def GetTaskUsers(u): return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("TaskUUID=%s", Get16toBytes(u))) def GetTaskUserInFo(u, UserUUID): return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(u), Get16toBytes(UserUUID))), _limit=1)[0] def GetTasksByOne(UserUUID): return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Tasks", WHERE=("TaskPublisher=%s", Get16toBytes(UserUUID))) def GetTasksNeedDo(UserUUID): return SQLTasks.selectashead(NSQL.MOD.ALL, FROM="Answer", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))) #占用额外资源,可以给删了 def GetTaskAlowDev(TaskUUID, UserUUID): return UserUUID == GetBytesto16(GetTaskInFo(TaskUUID)["TaskPublisher"]) or SubIsIn(UserUUID, GetBytesto16(GetTaskInFo(TaskUUID)["TaskPublisher"])) def SubIsInOrIs(ParentUUID, SubUserUUID): return ParentUUID == SubUserUUID or SubIsIn(ParentUUID, SubUserUUID) def SearchParent(UUID: str, SMTM): if not UUID or not SMTM:return False for i in SMTM: if "UserParent" in i and "UserUUID" in i and i["UserUUID"] == UUID: return i["UserParent"] return False def SubIsIn(ParentUUID,SubUserUUID): s=0 ASMTM=GetSMTM() while True: if (SubUserUUID:=SearchParent(SubUserUUID, ASMTM)) == ParentUUID: return True if SubUserUUID == "0"*32: return False if s == 500: return False s+=1 def SearchAndDelChildRen(Member: list, LDI: str): indices = [int(index) for index in LDI.split("-")] current_list = Member for index in indices[:-1]: current_list = current_list[index]["Member"] del current_list[indices[-1]] return current_list def Str2Sex(c): if c == -1: return "未更改" elif c == 1: return "男" elif c == 0: return "女" else: return "错误" def PersonnelTemplate(UUID, MEMB, SmtmUser): res={} c=next((item for item in SmtmUser if GetBytesto16(item["UserUUID"]) == UUID), None) #c=ReadUserConfig(UUID) res["name"]=c["UserName"] res["UserJobNumber"]=GetBytesto16(c["UserJobNumber"]) if c["UserJobNumber"] else "未启用工号" res["UserRealName"]=c["UserRealName"] res["UserSex"]=Str2Sex(c["UserSex"]) res["UserUUID"]=GetBytesto16(c["UserUUID"]) res["UserHeadPng"]="https://ugm.gvsds.com/GetArgsUserHeadPng.api?UserUUID="+res["UserUUID"] res["UserPermissions"]=c["UserPermissions"] res["UserPermissionstr"]=PermissionsToStrPermissions(c["UserPermissions"]) res["UserJob"]=c["UserJob"] res["UserLastCheckInDate"]=c["UserLastCheckInDate"].strftime("%Y-%m-%d %H:%M:%S") if c["UserLastCheckInDate"] else "从未签到" if c["UserPositionStatus"] == 1: res["UserPositionStatus"]="在职" elif c["UserPositionStatus"] == 0: res["UserPositionStatus"]="停职" elif c["UserPositionStatus"] == 2: res["UserPositionStatus"]="在职合作" elif c["UserPositionStatus"] == 3: res["UserPositionStatus"]="停职合作" else: res["UserPositionStatus"]="未知代码" if "Member" in MEMB and MEMB["Member"] != {}: res["type"]=4 res["children"]=[] for i in MEMB["Member"]: res["children"].append(PersonnelTemplate(i, MEMB["Member"][i], SmtmUser)) res["isParent"]=True else: res["type"]=6 res["children"]=[] res["isParent"]=False return res class _i18n: def __init__(self): pass #def __getattribute__(self, name): pass def __t(self, args1, *args2): return f"{", ".join(args1+args2)}" # TempLateMore def illegal(self, *args): return "%s 违法" % self.__t(args) def DataError(self, Name, Type): return "%s 应当为 %s 类型" % (Name, Type) #User def NoUser(self, *args): return "%s 用户不存在" % self.__t(args) def NoIn(self, ParentUser, SubUser): return "%s 不受 %s 管理" % (ParentUser, SubUser) def NoPower(self, Permission): return "无 %s 操作权限" % Permission # Task def NoTask(self, *args): return "%s 任务不存在" % self.__t(args) def NoAnswer(self, *args): return "%s 成员任务回答不存在" % self.__t(args) # PersonPage YouNeverRegisterPersonalPage="你没有注册过个人主页,填写并提交表单以应用" # Other def NoParameter(self, *args): return "%s 参数不存在" % self.__t(args) def NoUUID(self, Name): return "%s 不符合 UUID 格式" % Name def Abnormal(self, *args): return "%s 异常" % self.__t(args) def NoFound(self, *args): return "%s 不存在" % self.__t(args) def NotLegalChar(self, Name): return "%s 含有禁止字符" % Name def TooBigMsg(self, Name, Max): return "%s 过大,理应不超过 %s" % (Name, Max) def BeMostValue(self, Name): return "%s 为必填项" % Name def NotAZ09(self, Name): return "%s 只允许大写字母、数字和下划线" % Name def Notaz09(self, Name): return "%s 只允许小写字母、数字和下划线" % Name def NotAZaz09(self, Name): return "%s 只允许字母、数字和下划线" % Name def AgainstSystem(self, Name): return "%s 占用系统资源" % Name def Repeat(self, Name): return "%s 重复" % Name CodeError="状态码异常" AddSuccess="添加成功" AddError="添加失败" DelSuccess="删除成功" DelError="删除失败" OperateSuccess="操作成功" OperateError="操作失败" RegisterSuccess="注册成功" RegisterError="注册失败" ChangeSuccess="修改成功" ChangeError="修改失败" AdminMode="管理模式" NoTime="无时间" ModeError="模式错误" Yes="是" No="否" GetError="数据取值异常" NoPermission="无权限" TooBig="数据过大" AlreadyExist="已存在" NotExist="不存在" Cancelled="已注销" # Task ThisTaskNotBelongToYou="你无需做这个任务,这个任务不属于你" YouVeSubmitted="你已提交该任务" YouDontHavePermissionToperate="你无权操作该任务" YouDontHavaPermissionToSeeit="你无权查看" TaskTimeOut="任务已超时" TaskAlreadyExist="任务已存在" TimeAbnormal="时间戳异常" TimeBeMostOver2Hour="任务时间必须大于2小时" # Score InitialAssessmentScore="初始考核分" LWSIAWU="上上周签到考核不合格"#Last week, the sign-in assessment was unqualified LWSAF="上周签到考核不合格"#Last week's sign-in assessment failed # CheckIn CheckInError="签到失败!CSRF无效,也许您应该刷新网页!" AlreadyCheckIn="您已签到" i18n=_i18n() """ API统一管理 验证所有参数是否为None 验证所有参数是否达到最基本的合法(UUID) 验证所有参数是否合法 做好SMTM继承保护 _limit=1必要条件 if not _ 必要条件才能执行取0 if None:赋值直接在get里写 执行 返回 """ #给删了 def HightLight(l, s=" "): return s.join(list(map(lambda x: '%s' % x, l))) #给删了 def GetUserPositionStatusStr(UserPositionStatus): if UserPositionStatus == 1: return "在职" else: return "停职" @Manage.route("/") def ManageIndex(): UserConfig=GetELTUserConfig() return flask.render_template("/Manage/index.html", UserName=StrMinus(UserConfig["UserName"], 15), UserPersonalSignature=StrMinus(UserConfig["UserPersonalSignature"], 15), UserEmail=StrMinus(UserConfig["UserEmail"], 15), UserPermissions=float(UserConfig["UserPermissions"]), UserJob=UserConfig["UserJob"], UserBook=False if flask.request.args.get("UserBook") else True) @Manage.route("/index.html") def MainIndexHtml(): return flask.redirect(flask.url_for("Manage.ManageIndex")) @Manage.route("/User/ChangePasswd.html") def UserChangePasswd(): return flask.render_template("/Manage/User/ChangePasswd.html") @Manage.route("/API/UserHeadCard.api") def UserHeadCard(): UserConfig=GetELTUserConfig() return {"UserHeadCard_UserName": StrMinus(UserConfig["UserName"], 15), "UserHeadCard_UserPersonalSignature": StrMinus(UserConfig["UserPersonalSignature"], 15), "UserHeadCard_UserEmail": StrMinus(UserConfig["UserEmail"], 15)} @Manage.route("/API/IdCard.api") @PreRequirements(1.0) def UserIdCard(): UserConfig=GetELTUserConfig() return {"UserName": UserConfig["UserName"], "UserRealName": UserConfig["UserRealName"], "UserUUID": GetBytesto16(UserConfig["UserUUID"]), "UserPermissions": float(UserConfig["UserPermissions"]), "UserStrPermissions": PermissionsToStrPermissions(float(UserConfig["UserPermissions"])), "UserJob": UserConfig["UserJob"], "UserPosition": UserConfig["UserPositionStatus"]} @Manage.route("/API/SubMemIdCard.api") @PreRequirements(1.0, mod=[PRMODS.OVERPERMISSION], c="ag/UserUUID") def UserSubMemIdCardAPI(): UserUUID=flask.request.args.get("UserUUID") if not Is_User(UserUUID): return {"code":1,"msg":"NOT USER"} UserConfig=ReadUserConfig(UserUUID) return {"code":0, "UserName": GetUUIDUser(UserUUID), "UserRealName": UserConfig["UserRealName"], "UserSex": Str2Sex(UserConfig["UserSex"]), "UserUUID": UserUUID, "UserPermissions": UserConfig["UserPermissions"], "UserStrPermissions": PermissionsToStrPermissions(UserConfig["UserPermissions"]), "UserJob": UserConfig["UserJob"], "UserPosition": UserConfig["UserPositionStatus"]} @Manage.route("/API/GetSubMem.api") @PreRequirements(2.0) def UserGetSubMemApi(): SMTM=GetSMTM() User=SearchFutureGenerations(GetELTUserUUID(), SMTM) SmtmUser=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="UserSub", WHERE=("UserPermissions>=2.0")) if User == False: User={"Member":[]} data=[] for i in (Member:=User[SearchChilds("0"*32, SMTM)[0]]["Member"]): data.append(PersonnelTemplate(i, Member[i], SmtmUser)) return flask.jsonify({"code":0, "count":1000, "data":data}) @Manage.route("/API/SetPositionStatus.api", methods=["POST"]) @PreRequirements(1.0) def UserRePositionStatus(): UserUUID=flask.request.form.get("UserUUID") Code=flask.request.form.get("Code") if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if Code not in ["1","0"]: return {"code":1,"msg":i18n.CodeError} if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser("UserUUID")} if not SubIsIn(GetELTUserUUID(), UserUUID): return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "UserUUID")} WriteUserConfigI(UserUUID, "UserPositionStatus", Code) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/AddChildRen.api", methods=["POST"]) def UserAddChildRen(): ELTUserUUID=GetELTUserUUID() SubUserUUID=flask.request.form.get("SubUserUUID") ParentUserUUID=flask.request.form.get("ParentUserUUID", ELTUserUUID) if not Is_UUID(SubUserUUID): return {"code":1,"msg":i18n.NoUUID("SubUserUUID")} if not Is_UUID(ParentUserUUID): return {"code":1,"msg":i18n.NoUUID("ParentUserUUID")} if not Is_User(SubUserUUID): return {"code":1,"msg":i18n.NoUser("SubUserUUID")} if not Is_User(ParentUserUUID): return {"code":1,"msg":i18n.NoUser("ParentUserUUID")} # if not SubIsIn(ELTUserUUID, SubUserUUID): return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "SubUserUUID")} # if not SubIsInOrIs(ELTUserUUID, ParentUserUUID): return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "ParentUserUUID")} if GetELTUserPermissions() < 4.0: return {"code":1,"msg":i18n.NoPower(4.0)} SQLUsers.delete("SMTM", WHERE=("UserUUID=%s", Get16toBytes(SubUserUUID))) SQLUsers.insert("SMTM", UserUUID=Get16toBytes(SubUserUUID), UserParent=Get16toBytes(ParentUserUUID)) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/Post/SubMemberManagementDelete.api", methods=["POST"]) @PreRequirements(2.0) def UserSubMemberManagementDeleteApi():# 调试!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #LDI=flask.request.form.get("LAY_DATA_INDEX") #_=GetSMTM() #_["Member"]=SearchAndDelChildRen(Search(GetSMTM()["Member"],GetELTUserUUID())["Member"],LDI) #print(_) return "1" @Manage.route("/Takes/TaskFinish.html") @PreRequirements(1.0) def UserTaskFinish(): if Is_Task((TaskUUID:=flask.request.args.get("TaskUUID"))): return flask.render_template("/Manage/TaskFinish.html",TaskName=GetTaskInFo(TaskUUID)["TaskName"],TaskUUID=TaskUUID) flask.abort(404) @Manage.route("/Tasks/TaskToDo.html") @PreRequirements(1.0) def UserTaskToDo(): TaskUUID=flask.request.args.get("TaskUUID") if TaskUUID==None: return "Error: TaskUUID Is None" if not Is_Task(TaskUUID): return "Error: UUID NOT IN TASKS" TaskInFo=GetTaskInFo(TaskUUID) TaskAnswerInFo=None TaskEndTime = TaskInFo["TaskEndTime"] TaskAnswerList=-1 if (int(TaskEndTime.timestamp()) - time.time()) <= 0: ReLoad=0 else: ReLoad=1 if Is_UserInTask(TaskUUID, GetELTUserUUID()): TaskAnswerInFo=GetTaskAnswerInFo(TaskUUID, GetELTUserUUID()) if GetTaskUserInFo(TaskUUID, GetELTUserUUID())["UserDo"] == 1: if flask.request.args.get("detailed"): TaskDo=3 else: return flask.redirect(f"/Tasks/TaskFinish.html?TaskUUID={TaskUUID}&TaskName={TaskInFo["TaskName"]}") else: TaskDo=1 TaskAnswerList=TaskInFo["TaskAnswer"] else: if GetTaskAlowDev(TaskUUID, GetELTUserUUID()): TaskDo=0 else: flask.abort(503) return flask.render_template("/Manage/Tasks/TaskToDo.html", TaskName=TaskInFo["TaskName"], TaskPublisher=GetUUIDUser(GetBytesto16(TaskInFo["TaskPublisher"])), TaskUUID=TaskUUID, TaskStartTime=TaskInFo["TaskStartTime"], TaskEndTime=TaskInFo["TaskEndTime"], TaskAddTime=i18n.AdminMode if not TaskAnswerInFo else (i18n.NoTime if not TaskAnswerInFo["TaskAddTime"] else TaskAnswerInFo["TaskAddTime"].strftime("%Y-%m-%d %H:%M:%S")), TaskFinishTime=i18n.AdminMode if not TaskAnswerInFo else (i18n.NoTime if not TaskAnswerInFo["TaskFinishTime"] else TaskAnswerInFo["TaskFinishTime"].strftime("%Y-%m-%d %H:%M:%S")), TaskCCGOID=TaskInFo["TaskCCGOID"], TaskNeed=TaskInFo["TaskNeed"].replace(r"\n","
"), TaskOther=TaskInFo["TaskOther"].replace(r"\n","
"), CountYear=TaskEndTime.year, CountMonth=TaskEndTime.month, CountDay=TaskEndTime.day, CountHour=TaskEndTime.hour, CountMinute=TaskEndTime.minute, CountSecond=TaskEndTime.second, ReLoad=ReLoad, TaskDo=TaskDo, TaskAnswerList=TaskAnswerList, TaskType=LISTTOTASKTYPE(TaskInFo["TaskType"]), TaskAnswer=LISTTOTASKANSWER(TaskInFo["TaskAnswer"])) @Manage.route("/API/UserTaskSubmit.api", methods=["POST"]) @PreRequirements(1.0) def UserTaskSubmit(): TaskUUID=flask.request.form.get("TaskUUID") UserUUID=flask.request.form.get("UserUUID") if not UserUUID: UserUUID = GetELTUserUUID() File=flask.request.files.get("File") LongInFo=flask.request.form.get("LongInFo") ShortInFo=flask.request.form.get("ShortInFo") LinkInFo=flask.request.form.get("LinkInFo") if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_Task(TaskUUID): return i18n.NoTask(TaskUUID) if not Is_UserInTask(TaskUUID, UserUUID): return {"code":1,"msg":i18n.ThisTaskNotBelongToYou} TaskInFo=GetTaskInFo(TaskUUID) if GetTaskUserInFo(TaskUUID, UserUUID)["UserDo"] == 1: return {"code":1,"msg":i18n.YouVeSubmitted} if not TaskInFo["TaskEndTime"].timestamp() >= time.time(): return {"code":1,"msg":i18n.TaskTimeOut} UserAnswer={"UserUpLoadFileName":"","UserUpLoadFile":"","UserLong":"","UserShort":"","UserDo":0,"UserPass":0,"TaskFinishTime":TimeFormatStr("%Y-%m-%d %H:%M:%S")} #File ReName is System for it 's UUID for i in TaskInFo["TaskAnswer"]: if i == 1: #if not File.content_length >= 1024*1024*1024: # return f"文件或过小过大,无法上传,请重新打开页面后重试,File.content_length: {File.content_length}" UserAnswer["UserUpLoadFileName"]=File.filename UserAnswer["UserUpLoadFile"]=NSQL.Func.insertbytes(File.stream.read()) if i == 2: UserAnswer["UserLong"]=LongInFo if i == 3: UserAnswer["UserShort"]=ShortInFo if i == 4: UserAnswer["UserLink"]=LinkInFo UserAnswer["UserDo"]=1 SQLTasks.update(**UserAnswer, WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID))), FROM="Answer" ) resp = flask.redirect(f"/Tasks/TaskFinish.html?TaskUUID={TaskUUID}") return resp @Manage.route("/API/TaskUpload.api", methods=["POST"]) @PreRequirements(2.0) def UserUpTask(): TaskName=flask.request.form.get("TaskName") TaskEndTime=flask.request.form.get("TaskEndTime") TaskCCGOID=flask.request.form.get("TaskCCGOID") TaskNeed=flask.request.form.get("TaskNeed") TaskManual=flask.request.form.get("TaskManual") TaskShop=flask.request.form.get("TaskShop") TaskOther=flask.request.form.get("TaskOther") try:time.mktime(time.strptime(TaskEndTime, "%Y-%m-%d %H:%M:%S")) except:return {"code": 1, "msg": i18n.TimeAbnormal} #if (int(TaskEndTime) - time.time()) < 7200: # return {"code":1,"msg":i18n.TimeBeMostOver2Hour} TaskType=[] TaskAnswer=[] for i in range(1,20+1): if flask.request.form.get(f"TaskType[{i}]") != None: TaskType.append(i) for i in range(1,5+1): if flask.request.form.get(f"TaskAnswer[{i}]") != None: TaskAnswer.append(i) SQLTasks.insert("Tasks", TaskUUID=Get16toBytes(NewUUID()), TaskName=TaskName, TaskPublisher=Get16toBytes(GetELTUserUUID()), TaskStartTime=TimeFormatStr("%Y-%m-%d %H:%M:%S"), TaskEndTime=TaskEndTime, TaskType="%s" % TaskType, TaskAnswer="%s" % TaskAnswer, TaskCCGOID=TaskCCGOID, TaskNeed=TaskNeed, TaskOther=TaskOther, TaskManual=bool(TaskManual), TaskShop=bool(TaskShop), ) return {"code": 0} @Manage.route("/API/UserTaskAdd.api", methods=["POST"]) @PreRequirements(1.0) def UserAddTask(): UserUUID=flask.request.form.get("UserUUID") TaskUUID=flask.request.form.get("TaskUUID") if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not TaskUUID: return {"code":1,"msg":i18n.NoParameter("TaskUUID")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")} if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)} if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavePermissionToperate} if Is_UserInTask(TaskUUID, UserUUID): return {"code":1,"msg":i18n.TaskAlreadyExist} SQLTasks.insert("Answer", UserUUID=Get16toBytes(UserUUID), TaskUUID=Get16toBytes(TaskUUID), TaskAddTime=TimeFormatStr("%Y-%m-%d %H:%M:%S"), UserDo=0, UserPass=0 ) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/GetMakeTasks.api") @PreRequirements(1.0) def UserGetMakeTasks(): ELTUserUUID=GetELTUserUUID() UserUUID=flask.request.args.get("UserUUID", ELTUserUUID) TasksReturn=[] if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not SubIsInOrIs(ELTUserUUID, UserUUID): return {"code":1,"count":1000,"data":i18n.YouDontHavaPermissionToSeeit} for i in GetTasksByOne(GetELTUserUUID()): TasksReturn.append( {"TaskUUID":GetBytesto16(i["TaskUUID"]), "TaskPublisher":GetBytesto16(i["TaskPublisher"]), "TaskName":i["TaskName"], "TaskEndTime":i["TaskEndTime"].strftime("%Y-%m-%d %H:%M:%S"), "TaskType":LISTTOTASKTYPE(i["TaskType"]), "TaskAnswer":LISTTOTASKANSWER(i["TaskAnswer"]), "TaskCCGOID":i["TaskCCGOID"], "TaskNeed":i["TaskNeed"], "TaskOther":i["TaskOther"], "TaskManual":i18n.Yes if i["TaskManual"] else i18n.No, "TaskShop":i18n.Yes if i["TaskShop"] else i18n.No}) return {"code":0,"count":1000,"data":TasksReturn} @Manage.route("/API/GetTasks.api") @PreRequirements(1.0) def UserGetTasks(): ELTUserUUID=GetELTUserUUID() UserUUID=flask.request.args.get("UserUUID", ELTUserUUID) TaskMod =flask.request.args.get("TaskMod", "0") if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if TaskMod not in ["1", 0]: return {"code":1,"msg":i18n.ModeError} if not SubIsInOrIs(GetELTUserUUID(), UserUUID): return {"code":1,"count":1000,"data":i18n.YouDontHavaPermissionToSeeit} TasksReturn=[] for i in GetTasksNeedDo(UserUUID): TaskUUID=GetBytesto16(i["TaskUUID"]) TaskInFo=GetTaskInFo(TaskUUID) TaskAnswerInFo=GetTaskAnswerInFo(TaskUUID, UserUUID) if i["UserDo"] != (0 if TaskMod == "0" else 1): continue TasksReturn.append({"TaskUUID": TaskUUID, "TaskPublisher": GetUUIDUser(GetBytesto16(TaskInFo["TaskPublisher"])), "TaskName": TaskInFo["TaskName"], "TaskDo": i["UserDo"], "TaskPass": i["UserPass"], "TaskStartTime": TaskInFo["TaskStartTime"].strftime("%Y-%m-%d %H:%M:%S"), "TaskEndTime": TaskInFo["TaskEndTime"].strftime("%Y-%m-%d %H:%M:%S"), "TaskAddTime": "未完成" if not TaskAnswerInFo["TaskAddTime"] else TaskAnswerInFo["TaskAddTime"].strftime("%Y-%m-%d %H:%M:%S"), "TaskFinishTime": "未完成" if not TaskAnswerInFo["TaskFinishTime"] else TaskAnswerInFo["TaskFinishTime"].strftime("%Y-%m-%d %H:%M:%S"), "TaskType": LISTTOTASKTYPE(TaskInFo["TaskType"]), "TaskAnswer": LISTTOTASKANSWER(TaskInFo["TaskAnswer"]), "TaskCCGOID": TaskInFo["TaskCCGOID"]}) return {"code":0,"count":1000,"data":TasksReturn} @Manage.route("/API/GetTasksDevReceiver.api") @PreRequirements(1.0) def UserGetTasksDevReceiver(): TaskUUID=flask.request.args.get("TaskUUID") if not TaskUUID: return {"code":0,"count":1000,"data":i18n.NoParameter("TaskUUID")} if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")} if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)} TaskInFo=GetTaskInFo(TaskUUID) TaskPublisher=GetBytesto16(TaskInFo["TaskPublisher"]) if not GetELTUserUUID() == TaskPublisher and not SubIsIn(GetELTUserUUID(), TaskPublisher): return {"code":0,"count":1000,"data":i18n.YouDontHavePermissionToperate} if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavePermissionToperate} s=[] for i in GetTaskUsers(TaskUUID): s.append( {"ReceiverUUID": GetBytesto16(i["UserUUID"]), "ReceiverName": GetUUIDUser(GetBytesto16(i["UserUUID"])), "ReceiverFinishFlan": i["UserDo"], "PublisherFinishFlan": i["UserPass"], "ReceiverFile": i["UserUpLoadFileName"] }) return {"code":0,"count":1000,"data":s} @Manage.route("/API/TasksDevPass.api", methods=["POST"]) @PreRequirements(1.0) def UserTasksDevPass(): TaskUUID=flask.request.form.get("TaskUUID") PassMod=flask.request.form.get("PassMod") UserUUID=flask.request.form.get("UserUUID") if not TaskUUID: return {"code":1,"msg":i18n.NoParameter("TaskUUID")} if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)} if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)} if PassMod not in ["1", "0", "-1"]: return {"code":1,"msg":i18n.ModeError} if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavaPermissionToSeeit} SQLTasks.update(UserPass=int(PassMod), WHERE=("TaskUUID=%s AND UserUUID=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID))), FROM="Answer") return {"code":0,"msg":i18n.OperateSuccess} @Manage.route("/API/UserTasksDelete.api", methods=["POST"]) @PreRequirements(1.0) def UserGroupTasksDelete(): UserUUID=flask.request.form.get("UserUUID") TaskUUID=flask.request.form.get("TaskUUID") PassMod=flask.request.form.get("PassMod") if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not TaskUUID: return {"code":1,"msg":i18n.NoParameter("TaskUUID")} if not Is_UUID(TaskUUID): return {"code":1,"msg":i18n.NoUUID("TaskUUID")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)} if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)} if PassMod not in ["Task", "TaskFinish"]: return {"code":1,"msg":i18n.ModeError} PassMod="0" if PassMod == "Task" else "1" if not Is_Task(TaskUUID): return {"code":1,"msg":i18n.NoTask(TaskUUID)} if not GetTaskAlowDev(TaskUUID, GetELTUserUUID()): return {"code":1,"msg":i18n.YouDontHavePermissionToperate} if not SQLTasks.istrue("Answer", WHERE=("TaskUUID=%s AND UserUUID=%s AND UserDo=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID), PassMod))): return {"code":1,"msg":i18n.NoAnswer(TaskUUID)} SQLTasks.delete("Answer", WHERE=("TaskUUID=%s AND UserUUID=%s AND UserDo=%s", (Get16toBytes(TaskUUID), Get16toBytes(UserUUID), PassMod))) return {"code":0,"msg":i18n.OperateSuccess} @Manage.route("/API/TasksDelete.api", methods=["POST"]) @PreRequirements(1.0) def UserTasksDelete(): TaskUUID=flask.request.form.get("TaskUUID") ELTUserUUID=GetELTUserUUID() if not TaskUUID: return {"code":1,"data":i18n.NoParameter("TaskUUID")} if not Is_UUID(TaskUUID): return {"code":1,"data":i18n.NoUUID("TaskUUID")} if not Is_Task(TaskUUID): return {"code":1,"data":i18n.NoTask(TaskUUID)} if not GetTaskAlowDev(TaskUUID, ELTUserUUID): return {"code":1,"msg":i18n.YouDontHavePermissionToperate} SQLTasks.delete("Tasks", WHERE=("TaskUUID=%s", Get16toBytes(TaskUUID))) SQLTasks.delete("Answer", WHERE=("TaskUUID=%s", Get16toBytes(TaskUUID))) return {"code":0,"msg":i18n.OperateSuccess} @Manage.route("/API/TalentPlanSubCard.api") @PreRequirements(4.0) def TalentPlanSubCardAPI(): UserUUID=str(flask.request.args.get("UserUUID")) if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} _=SQLPlans.selectashead(NSQL.MOD.ALL, FROM="TalentPlan", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)), _limit=1) if not _: return {"code":1,"msg":i18n.GetError} _=_[0] return {"UserName": _["UserName"], "UserUUID": UserUUID, "UserEcho": _["UserEcho"], "Other": _["Other"], "UserWork": _["UserWork"], "UserWillWork": _["UserWillWork"], "UserBornTime": str(_["UserBornTime"]), "UserIDCard": _["UserIDCard"], "UserBilibili": _["UserBilibili"], "UserTikTok": _["UserTikTok"], "UserTel": _["UserTel"], "UserKuaiShou": _["UserKuaiShou"], "UserWX": _["UserWX"]} @Manage.route("/API/TalentPlan.api") @PreRequirements(4.0) def UserTalentPlanApi(): Label=[] for i in SQLPlans.selectashead(NSQL.MOD.ALL, FROM="TalentPlan"): i["UserUUID"]=GetBytesto16(i["UserUUID"]) i["UserWork"]=HightLight(i["UserWork"]) i["UserWillWork"]=HightLight(i["UserWillWork"]) Label.append(i) return {"code":0,"count":1000,"data":Label} @Manage.route("/API/TalentPlanEcho.api") def UserTalentPlanEchoApi(): Label=[] for i in SQLPlans.selectashead(NSQL.MOD.ALL, FROM="TalentPlan"): if i["UserEcho"] == "on": i["UserUUID"]=GetBytesto16(i["UserUUID"]) i["UserBornTime"]="xxx" i["UserIDCard"]="xxx" i["UserWX"]="xxx" i["UserTel"]="xxx" i["UserWork"]=HightLight(i["UserWork"]) i["UserWillWork"]=HightLight(i["UserWillWork"]) Label.append(i) return {"code":0,"count":1000,"data":Label} @Manage.route("/API/TalentPlanUpSub.api", methods=["POST"]) @PreRequirements(4.0) def UserTalentPlanUpSub(): _=flask.request.form.to_dict() try:time.mktime(time.strptime(_["UserBornTime"], "%Y-%m-%d %H:%M:%S")) except:return {"code":1,"msg":i18n.TimeAbnormal} if not isinstance(ast.literal_eval(_["UserWork"]), list): return {"code":1,"msg":i18n.DataError("UserWork", "List")} if not isinstance(ast.literal_eval(_["UserWillWork"]), list): return {"code":1,"msg":i18n.DataError("UserWillWork", "List")} SQLPlans.insert("TalentPlan", UserName=_["UserName"], UserUUID=Get16toBytes(NewUUID()), UserEcho=_["UserEcho"], UserWork=_["UserWork"], UserWillWork=_["UserWillWork"], UserBornTime=_["UserBornTime"], UserIDCard=_["UserIDCard"], UserBilibili=_["UserBilibili"], UserTikTok=_["UserTikTok"], UserKuaiShou=_["UserKuaiShou"], UserTel=_["UserTel"], UserWX=_["UserWX"], Other=_["Other"]) return {"code":0,"msg":i18n.OperateSuccess} @Manage.route("/API/TalentPlanDelSub.api", methods=["POST"]) @PreRequirements(4.0) def UserTalentPlanDelSub(): UserUUID=flask.request.form.get("UserUUID") if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)} if SQLPlans.istrue("TalentPlan", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): SQLPlans.delete("TalentPlan", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))) return {"code":0,"msg":i18n.OperateSuccess} else: return {"code":0,"msg":i18n.OperateError} @Manage.route("/API/GetArchives.api") @PreRequirements(2.0) def UserGetArchives(): UserUUID=flask.request.args.get("UserUUID", GetELTUserUUID()) if not UserUUID: return {"code":1,"count":1000,"data":i18n.NoParameter("UserUUID")} if not Is_UUID(UserUUID): return {"code":0,"count":1000,"data":i18n.NoUUID("UserUUID")} if not Is_User(UserUUID): return {"code":0,"count":1000,"data":i18n.NoUser(UserUUID)} if not SubIsInOrIs(GetELTUserUUID(), UserUUID): return {"code":0,"count":1000,"data":i18n.NoPermission} if not (Archives:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archives", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)))): return {"code":0,"count":1000,"data":[]} _=[] for i in Archives: i["UserUUID"]=GetBytesto16(i["UserUUID"]) i["ArchivesUUID"]=GetBytesto16(i["ArchivesUUID"]) i["ArchivesID"]=GetBytesto16(i["ArchivesID"]) i["ArchivesAuthorUUID"]=GetBytesto16(i["ArchivesAuthorUUID"]) if Is_User(i["ArchivesAuthorUUID"]): i["ArchivesAuthorName"]=ReadUserConfig(i["ArchivesAuthorUUID"])["UserName"] i["ArchivesCreateTime"]=i["ArchivesCreateTime"].strftime("%Y-%m-%d %H:%M:%S") i["ArchivesTextName"]="" i["ArchivesTextDesc"]="" if (ArchivesText:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archivestext", WHERE=("ArchivesID=%s", Get16toBytes(i["ArchivesID"])), _limit=1)): i["ArchivesTextName"]=ArchivesText[0]["ArchivesName"] i["ArchivesTextDesc"]=ArchivesText[0]["ArchivesDesc"] _.append(i) return {"code":0,"count":1000,"data":_} @Manage.route("/API/GetArchivesText.api") @PreRequirements(4.0) def UserGetArchivesText(): if not (ArchivesText:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archivestext", WHERE="1=1")): return {"code":0,"count":1000,"data":[]} _=[] for i in ArchivesText: i["ArchivesID"]=GetBytesto16(i["ArchivesID"]) _.append(i) return {"code":0,"count":1000,"data":_} @Manage.route("/API/AddArchivesText.api", methods=["POST"]) @PreRequirements(4.0) def UserAddArchivesText(): ArchivesName=flask.request.form.get("ArchivesName") ArchivesDesc=flask.request.form.get("ArchivesDesc") ArchivesID=flask.request.form.get("ArchivesID", GUUID()) if not ArchivesName: return {"code":1,"msg":i18n.NoParameter("ArchivesName")} if not ArchivesDesc: return {"code":1,"msg":i18n.NoParameter("ArchivesDesc")} if not Is_UUID(ArchivesID): {"code":1,"msg":i18n.NoUUID("ArchivesID")} if len(ArchivesName) > 1024 or len(ArchivesDesc) > 1024*1024: return {"code":1,"msg":i18n.TooBig} if SQLUsers.istrue("archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID))): SQLUsers.update(FROM="archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID)), ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc) else: SQLUsers.insert("archivestext", ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc, ArchivesID=Get16toBytes(ArchivesID)) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/DelArchivesText.api", methods=["POST"]) @PreRequirements(4.0) def UserDelArchivesText(): ArchivesID=flask.request.form.get("ArchivesID") if not ArchivesID: {"code":1,"msg":i18n.NoParameter("ArchivesID")} if not Is_UUID(ArchivesID): return {"code":1,"msg":i18n.NoUUID("ArchivesID")} if not SQLUsers.istrue("archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID))): return {"code":1,"msg":i18n.NoFound("ArchivesID")} SQLUsers.delete(FROM="archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID))) return {"code":0,"msg":i18n.DelSuccess} @Manage.route("/API/AddArchives.api", methods=["POST"]) @PreRequirements(2.0) def UserAddArchives(): ArchivesUUID=flask.request.form.get("ArchivesUUID", GUUID()) UserUUID=flask.request.form.get("UserUUID") ArchivesName=flask.request.form.get("ArchivesName") ArchivesDesc=flask.request.form.get("ArchivesDesc") ArchivesPoints=flask.request.form.get("ArchivesPoints") ArchivesID=flask.request.form.get("ArchivesID", "0"*16) ArchivesAuthorUUID=GetELTUserUUID() ArchivesCreateTime=TimeFormatInt() try: ArchivesPoints=int(ArchivesPoints) except: return {"code":1,"msg":i18n.DataError("ArchivesPoints", "Int")} if not ArchivesUUID: return {"code":1,"msg":i18n.NoParameter("ArchivesUUID")} if not ArchivesID: return {"code":1,"msg":i18n.NoParameter("ArchivesID")} if not ArchivesName: return {"code":1,"msg":i18n.NoParameter("ArchivesName")} if not ArchivesDesc: return {"code":1,"msg":i18n.NoParameter("ArchivesDesc")} if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if len(ArchivesName) > 1024 or len(ArchivesDesc) > 1024*1024: return {"code":1,"msg":i18n.No} if not SubIsIn(GetELTUserUUID(), UserUUID): return {"code":1,"count":1000,"data":i18n.NoIn("ELTUserUUID", "UserUUID")} if not Is_UUID(ArchivesUUID): {"code":1,"msg":i18n.NoUUID("ArchivesUUID")} if not Is_UUID(ArchivesID): {"code":1,"msg":i18n.NoUUID("ArchivesID")} if not SQLUsers.istrue("archivestext", WHERE=("ArchivesID=%s", Get16toBytes(ArchivesID))): return {"code":1,"msg":i18n.NoFound("ArchivesID")} if SQLUsers.istrue("archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID))): SQLUsers.update(FROM="archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID)), ArchivesID=Get16toBytes(ArchivesID), ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc, ArchivesPoints=ArchivesPoints, ArchivesAuthorUUID=Get16toBytes(ArchivesAuthorUUID)) else: SQLUsers.insert("archives", UserUUID=Get16toBytes(UserUUID), ArchivesUUID=Get16toBytes(ArchivesUUID), ArchivesID=Get16toBytes(ArchivesID), ArchivesName=ArchivesName, ArchivesDesc=ArchivesDesc, ArchivesPoints=ArchivesPoints, ArchivesAuthorUUID=Get16toBytes(ArchivesAuthorUUID), ArchivesCreateTime=ArchivesCreateTime) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/DelArchives.api", methods=["POST"]) @PreRequirements(2.0) def UserDelArchives(): ArchivesUUID=flask.request.form.get("ArchivesUUID") UserUUID=flask.request.form.get("UserUUID") if not ArchivesUUID: {"code":1,"msg":i18n.NoParameter("ArchivesUUID")} if not UserUUID: {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Is_UUID(ArchivesUUID): {"code":1,"msg":i18n.NoUUID("ArchivesUUID")} if not Is_UUID(UserUUID): {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_User(UserUUID): {"code":1,"msg":i18n.NoFound("UserUUID")} if not SubIsIn(GetELTUserUUID(), UserUUID): return {"code":0,"count":1000,"data":i18n.NoIn("ELTUserUUID", "UserUUID")} if SQLUsers.istrue("archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID))): SQLUsers.delete(FROM="archives", WHERE=("ArchivesUUID=%s", Get16toBytes(ArchivesUUID))) return {"code":0,"msg":"success"} def process_checkin_data(checkin_records, week_start_date): week_status = [0] * 7 if not checkin_records: return week_status try: if isinstance(week_start_date, datetime.datetime): start_date = week_start_date.date() else: date_str = str(week_start_date).split()[0] year, month, day = map(int, date_str.split('-')) start_date = datetime.datetime(year, month, day).date() except: return week_status week_dates = [start_date + datetime.timedelta(days=i) for i in range(7)] for record in checkin_records: if not record or 'CheckInTime' not in record: continue try: checkin_time = record['CheckInTime'] checkin_date = checkin_time.date() if start_date <= checkin_date <= week_dates[-1]: day_of_week = (checkin_date - start_date).days if 0 <= day_of_week < 7: week_status[day_of_week] = 1 except: continue return week_status def days_between_today(target_date_str): try: today = datetime.datetime.now().date() target_date = datetime.datetime.strptime(target_date_str, "%Y-%m-%d").date() delta = abs((target_date - today).days) return delta + 1 except ValueError: return None @Manage.route("/API/AssessmentScore.api") @PreRequirements(2.0) def UserAssessmentScore(): ELTUserUUID=GetELTUserUUID() UserUUID=flask.request.args.get("UserUUID", ELTUserUUID) if not SubIsInOrIs(ELTUserUUID, UserUUID) and GetPermissions(ELTUserUUID) < 4: return {"code":1,"msg":i18n.NoIn("ELTUserUUID", "UserUUID")} CheckIn3=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE=("UserUUID=%s AND WeekFirstTime=%s", (Get16toBytes(UserUUID), GetWeekStartDate(week_seek=-2))), _limit=7) CheckIn2=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE=("UserUUID=%s AND WeekFirstTime=%s", (Get16toBytes(UserUUID), GetWeekStartDate(week_seek=-1))), _limit=7) CheckIn1=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE=("UserUUID=%s AND WeekFirstTime=%s", (Get16toBytes(UserUUID), GetWeekStartDate(week_seek=0))), _limit=7) Archives=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="archives", WHERE=("UserUUID=%s AND ArchivesPoints!=0", Get16toBytes(UserUUID))) last_week_data = process_checkin_data(CheckIn3, GetWeekStartDate(week_seek=-2)) current_week_data = process_checkin_data(CheckIn2, GetWeekStartDate(week_seek=-1)) next_week_data = process_checkin_data(CheckIn1, GetWeekStartDate(week_seek=0)) penaltyItems=[] AMScore=100 bonusItems=[{"description": i18n.InitialAssessmentScore, "points": 100}] last_week_minus_score = 5 if len(CheckIn3) < 3 else 0 current_week_minus_score = 5 if len(CheckIn2) < 3 else 0 AMScore -= last_week_minus_score AMScore -= current_week_minus_score if last_week_minus_score: penaltyItems.append({"description": i18n.LWSIAWU, "points": 5}) if current_week_minus_score: penaltyItems.append({"description": i18n.LWSAF, "points": 5}) for i in Archives: _={"description": i["ArchivesName"], "points": i["ArchivesPoints"]} AMScore+=i["ArchivesPoints"] bonusItems.append(_) if i["ArchivesPoints"] > 0 else penaltyItems.append(_) return {"success": True, "data": { "score": AMScore if AMScore < 100 else 100, "tscore": AMScore, "attendance": { "lastWeek": last_week_data, "currentWeek": current_week_data, "nextWeek": next_week_data, }, "bonusItems": bonusItems, "penaltyItems": penaltyItems }} @App.route("/API/GetWebSiteShowMembers.api") @Manage.route("/API/GetWebSiteShowMembers.api") def UserGetWebSiteShowMembersAPI(): Type=flask.request.args.get("Type") if not Type: return {"code":1,"msg":i18n.NoParameter("Type")} if Type not in ["Members", "AKS", "Collaborators"]: return {"code":1,"msg":i18n.ModeError} _=SQLUsers.selectashead(NSQL.MOD.ALL, FROM=f"show_{Type.lower()}", WHERE="1=1") _2=[] for i in _: i["UserUUID"]=GetBytesto16(i["UserUUID"]) UserConfig=ReadUserConfig(i["UserUUID"]) _2.append({ "UserUUID": i["UserUUID"], "UserName": i["UserName"] if i["UserName"] else GetUUIDUser(i["UserUUID"]), "UserBrInt": i["UserBrInt"] if i["UserBrInt"] else UserConfig["UserPersonalSignature"], "UserPhotoPath": i["UserPhotoPath"] if i["UserPhotoPath"] else "https://ugm.gvsds.com/GetArgsUserHeadPng.api?UserUUID=%s" % i["UserUUID"], "UserSoundPath": i["UserSoundPath"] if i["UserSoundPath"] else "", "UserWork": "" if not i["UserWork"] else (UserConfig["UserJob"] if i["UserWork"] == "work" else i["UserWork"]), "UserTel": "" if not i["UserTel"] else (RUserTele(GetBytesto16(UserConfig["UserTele"])) if i["UserTel"] == "tel" else i["UserTel"]), "UserEmail": "" if not i["UserEmail"] else (UserConfig["UserEmail"] if i["UserEmail"] == "email" else i["UserEmail"]), "UserQQName": "" if not i["UserQQName"] else i["UserQQName"], "UserWXName": "" if not i["UserWXName"] else i["UserWXName"], "UserQQ": "" if not i["UserQQ"] else (UserConfig["UserQQ"] if i["UserQQ"] == "qq" else i["UserQQ"]), "UserWX": "" if not i["UserWX"] else (UserConfig["UserWX"] if i["UserWX"] == "wx" else i["UserWX"]), "UserAccentColor": i["UserAccentColor"] if i["UserAccentColor"] else "#555" }) return {"code":0,"count":1000,"data":_2} @Manage.route("/API/WebSiteShowMembersDel.api", methods=["POST"]) @PreRequirements(4.0) def UserWebSiteShowMembersDelAPI(): UserUUID=flask.request.form.get("UserUUID") Type=flask.request.form.get("Type") if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Type: return {"code":1,"msg":i18n.NoParameter("Type")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)} if Type not in ["Members", "AKS", "Collaborators"]: return {"code":1,"msg":i18n.ModeError} if not SQLUsers.istrue(f"show_{Type.lower()}", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): return {"code":1,"msg":i18n.NoFound("UserUUID")} SQLUsers.delete(f"show_{Type.lower()}", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))) return {"code":0} @Manage.route("/API/WebSiteShowMembersAdd.api", methods=["POST"]) @PreRequirements(4.0) def UserWebSiteShowMembersAddAPI(): UserUUID=flask.request.form.get("UserUUID") Type=flask.request.form.get("Type") if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Type: return {"code":1,"msg":i18n.NoParameter("Type")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)} if Type not in ["Members", "AKS", "Collaborators"]: return {"code":1,"msg":i18n.ModeError} if SQLUsers.istrue(f"show_{Type.lower()}", WHERE=("UserUUID=%s", Get16toBytes(flask.request.form.get("UserUUID")))): return {"code":1,"msg":i18n.AlreadyExist} SQLUsers.insert(f"show_{Type.lower()}", UserUUID=Get16toBytes(UserUUID), UserName=flask.request.form.get("UserName") if flask.request.form.get("UserName") else "", UserBrInt=flask.request.form.get("UserBrInt") if flask.request.form.get("UserBrInt") else ReadUserConfig(flask.request.form.get("UserUUID"), "UserPersonalSignature"), UserPhotoPath=flask.request.form.get("UserPhotoPath") if flask.request.form.get("UserPhotoPath") else "", UserSoundPath=flask.request.form.get("UserSoundPath") if flask.request.form.get("UserSoundPath") else "", UserWork=flask.request.form.get("UserWork") if flask.request.form.get("UserWork") else "", UserTel=flask.request.form.get("UserTel") if flask.request.form.get("UserTel") else "", UserEmail=flask.request.form.get("UserEmail") if flask.request.form.get("UserEmail") else "", UserQQName=flask.request.form.get("UserQQName") if flask.request.form.get("UserQQName") else "", UserWXName=flask.request.form.get("UserWXName") if flask.request.form.get("UserWXName") else "", UserQQ=flask.request.form.get("UserQQ") if flask.request.form.get("UserQQ") else "", UserWX=flask.request.form.get("UserWX") if flask.request.form.get("UserWX") else "", UserAccentColor=flask.request.form.get("UserAccentColor") if flask.request.form.get("UserAccentColor") else "" ) return {"code":0} @Manage.route("/API/GetIdCard.api") @PreRequirements(4.0) def UserGetIdCard(): if not (IdCards:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="idcard", WHERE="1=1")): return {"code":0,"count":1000,"data":[]} _=[] for i in IdCards: i["UserUUID"]=GetBytesto16(i["UserUUID"]) i["Born"]=i["Born"].strftime("%Y-%m-%d") i["ChangeStudentStatus"]=json.dumps(i["ChangeStudentStatus"], ensure_ascii=False) i["CorrespondenceAddress"]=json.dumps(i["CorrespondenceAddress"], ensure_ascii=False) i["InformationAboutFamilyMembers"]=json.dumps(i["InformationAboutFamilyMembers"], ensure_ascii=False) i["Appointments"]=json.dumps(i["Appointments"], ensure_ascii=False) _.append(i) return {"code":0,"count":1000,"data":_} @Manage.route("/API/AddIdCard.api", methods=["POST"]) @PreRequirements(4.0) def UserAddIdCard(): UserUUID=flask.request.form.get("UserUUID") Name=flask.request.form.get("Name") OldName=flask.request.form.get("OldName") Born=flask.request.form.get("Born") Sex=flask.request.form.get("Sex") Ethnic=flask.request.form.get("Ethnic") IdentificationNumber=flask.request.form.get("IdentificationNumber") StudentRegistrationNumber=flask.request.form.get("StudentRegistrationNumber") ChangeStudentStatus=flask.request.form.get("ChangeStudentStatus") CorrespondenceAddress=flask.request.form.get("CorrespondenceAddress") HeadImage=flask.request.form.get("HeadImage") InformationAboutFamilyMembers=flask.request.form.get("InformationAboutFamilyMembers") Appointments=flask.request.form.get("Appointments") ReadmeReport=flask.request.form.get("ReadmeReport") # ChangeStudentStatus #HeadImage #InformationAboutFamilyMembers #Appointments #ReadmeReport if not UserUUID: return {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Name: return {"code":1,"msg":i18n.NoParameter("Name")} if not OldName: OldName="" if not Born: return {"code":1,"msg":i18n.NoParameter("Born")} if not Sex: return {"code":1,"msg":i18n.NoParameter("Sex")} if not Ethnic: return {"code":1,"msg":i18n.NoParameter("Ethnic")} if not IdentificationNumber: return {"code":1,"msg":i18n.NoParameter("IdentificationNumber")} if not StudentRegistrationNumber: return {"code":1,"msg":i18n.NoParameter("StudentRegistrationNumber")} if not ChangeStudentStatus: ChangeStudentStatus="[]" if not CorrespondenceAddress: CorrespondenceAddress="[]" if not HeadImage: HeadImage="" if not InformationAboutFamilyMembers: InformationAboutFamilyMembers="[]" if not Appointments: Appointments="[]" if not ReadmeReport: ReadmeReport="" if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not Is_User(UserUUID): return {"code":1,"msg":i18n.NoUser(UserUUID)} if len(Name) > 128: return {"code":1,"msg":i18n.TooBigMsg("Name", "128B")} if len(OldName) > 128: return {"code":1,"msg":i18n.TooBigMsg("OldName", "128B")} try: time.mktime(time.strptime(Born, "%Y-%m-%d")) except: return {"code": 1, "msg": i18n.TimeAbnormal} if len(Sex) > 10: return {"code":1,"msg":i18n.TooBigMsg("Sex", "10B")} if len(Ethnic) > 20: return {"code":1,"msg":i18n.TooBigMsg("Ethnic", "20B")} if len(IdentificationNumber) > 20: return {"code":1,"msg":i18n.TooBigMsg("IdentificationNumber", "20B")} try: int(IdentificationNumber) except:return {"code":1,"msg":i18n.DataError("IdentificationNumber", "int")} if len(StudentRegistrationNumber) > 30: return {"code":1,"msg":i18n.TooBigMsg("StudentRegistrationNumber", "30B")} if len(ChangeStudentStatus) > 4096: return {"code":1,"msg":i18n.TooBigMsg("ChangeStudentStatus", "4096B")} try: json.loads(ChangeStudentStatus) except: return {"code":1,"msg":i18n.DataError("ChangeStudentStatus", "dict")} if len(CorrespondenceAddress) > 4096: return {"code":1,"msg":i18n.TooBigMsg("CorrespondenceAddress", "4096B")} try: json.loads(CorrespondenceAddress) except: return {"code":1,"msg":i18n.DataError("CorrespondenceAddress", "list")} if len(HeadImage) > 4096: return {"code":1,"msg":i18n.TooBigMsg("HeadImage", "4096B")} if len(InformationAboutFamilyMembers) > 4096: return {"code":1,"msg":i18n.TooBigMsg("InformationAboutFamilyMembers", "4096B")} try: json.loads(InformationAboutFamilyMembers) except: return {"code":1,"msg":i18n.DataError("InformationAboutFamilyMembers", "dict")} if len(Appointments) > 4096: return {"code":1,"msg":i18n.TooBigMsg("Appointments", "4096B")} try: json.loads(Appointments) except: return {"code":1,"msg":i18n.DataError("Appointments", "dict")} if len(ReadmeReport) > 4096: return {"code":1,"msg":i18n.TooBigMsg("ReadmeReport", "4096B")} if SQLUsers.istrue("idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): SQLUsers.update(FROM="idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)), Name=Name, OldName=OldName, Born=Born, Sex=Sex, Ethnic=Ethnic, IdentificationNumber=IdentificationNumber, StudentRegistrationNumber=StudentRegistrationNumber, ChangeStudentStatus=ChangeStudentStatus, CorrespondenceAddress=CorrespondenceAddress, HeadImage=HeadImage, InformationAboutFamilyMembers=InformationAboutFamilyMembers, Appointments=Appointments, ReadmeReport=ReadmeReport) else: SQLUsers.insert("idcard", UserUUID=Get16toBytes(UserUUID), Name=Name, OldName=OldName, Born=Born, Sex=Sex, Ethnic=Ethnic, IdentificationNumber=IdentificationNumber, StudentRegistrationNumber=StudentRegistrationNumber, ChangeStudentStatus=ChangeStudentStatus, CorrespondenceAddress=CorrespondenceAddress, HeadImage=HeadImage, InformationAboutFamilyMembers=InformationAboutFamilyMembers, Appointments=Appointments, ReadmeReport=ReadmeReport) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/DelIdCard.api", methods=["POST"]) @PreRequirements(4.0) def UserDelIdCard(): UserUUID=flask.request.form.get("UserUUID") if not UserUUID: {"code":1,"msg":i18n.NoParameter("UserUUID")} if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not SQLUsers.istrue("idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): return {"code":1,"msg":i18n.NoFound("UserUUID")} SQLUsers.delete(FROM="idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))) return {"code":0,"msg":i18n.DelSuccess} @Manage.route("/API/TIdCard.api") def UserTIdCard(): UserUUID=flask.request.form.get("UserUUID", GetELTUserUUID()) if not Is_UUID(UserUUID): return {"code":1,"msg":i18n.NoUUID("UserUUID")} if not SQLUsers.istrue("idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID))): return {"code":1,"msg":i18n.NoFound("IdCardUserUUID")} _=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="idcard", WHERE=("UserUUID=%s", Get16toBytes(UserUUID)), _limit=1) if not _: return {"code":1,"msg":i18n.GetError} _=_[0] _["UserUUID"]=GetBytesto16(_["UserUUID"]) _["Born"]=_["Born"].strftime("%Y-%m-%d") _["Year"]=_["Born"].split("-")[0] _["Month"]=_["Born"].split("-")[1] _["Day"]=_["Born"].split("-")[2] _["ChangeStudentStatus"]=json.dumps(_["ChangeStudentStatus"], ensure_ascii=False) _["CorrespondenceAddress"]=" ".join(_["CorrespondenceAddress"]) _["InformationAboutFamilyMembers"]=json.dumps(_["InformationAboutFamilyMembers"], ensure_ascii=False) _["Appointments"]=json.dumps(_["Appointments"], ensure_ascii=False) return {"code":0,"data":_} @Manage.route("/API/Money.api") @PreRequirements(1.0) def UserGetMoney(): UserConfig = GetELTUserConfig() UserMoneyIntegral = UserConfig["UserMoneyIntegral"] UserMoneyLightCoin = UserConfig["UserMoneyLightCoin"] UserMoneyBrightCoin = UserConfig["UserMoneyBrightCoin"] UserMoneyDarkCoin = UserConfig["UserMoneyDarkCoin"] return {"UserMoneyIntegral": UserMoneyIntegral, "UserMoneyLightCoin": UserMoneyLightCoin, "UserMoneyBrightCoin": UserMoneyBrightCoin, "UserMoneyDarkCoin": UserMoneyDarkCoin} PersonalForm=["PersonalPageName", "Subtitle", "BackgroundLink", "Classification", "Github", "WeChat", "QQ", "SelfIntroduction", "ProjectExperience", "SatisfiedCustomers", "ReceiveAward", "CoffeeCups", "Achievement1Icon", "Achievement1Name", "Achievement1Time", "Achievement1Introduction", "Achievement2Icon", "Achievement2Name", "Achievement2Time", "Achievement2Introduction", "Achievement3Icon", "Achievement3Name", "Achievement3Time", "Achievement3Introduction", "Achievement4Icon", "Achievement4Name", "Achievement4Time", "Achievement4Introduction", "Tags", "MarkDown"] @Manage.route("/API/WritePersonalInformation.api", methods=["POST"]) def UserWritePersonalInformation(): _=SQLUsers.selectashead(NSQL.MOD.ALL, WHERE=("PersonalPageUserUUID=%s", Get16toBytes(GetELTUserUUID())), FROM="personal", _limit=1) r={} for i in PersonalForm: _r=str(flask.request.form.get(i)) if i != "MarkDown" and len(_r) > 256: return {"code": 1, "msg": i18n.TooBigMsg(i, "256B")} if len(_r) > 64*1024: return {"code": 1, "msg": i18n.TooBigMsg("Markdown", "64KB")} if i == "PersonalPageName" and not _r: return {"code": 1, "msg": i18n.BeMostValue("PersonalPageName")} if i == "PersonalPageName" and not bool(re.fullmatch(r'^[a-z0-9_]+$', _r)): return {"code": 1, "msg": i18n.Notaz09("PersonalPageName")} r[i]=_r r["PersonalPageUserUUID"]=Get16toBytes(GetELTUserUUID()) if r["PersonalPageName"].lower() in BadH: return {"code": 1, "msg": i18n.AgainstSystem("PersonalPageName")} if not _: if SQLUsers.selectashead(NSQL.MOD.ALL, WHERE=("PersonalPageName=%s", r["PersonalPageName"]), FROM="personal", _limit=1): return {"code": 1, "msg": i18n.Repeat("PersonalPageName")} SQLUsers.insert("personal", **r) return {"code": 0, "msg": i18n.ChangeSuccess} SQLUsers.update(WHERE=("PersonalPageUserUUID=%s", r["PersonalPageUserUUID"]), FROM="personal", **r) return {"code": 0, "msg": i18n.ChangeSuccess} @Manage.route("/API/RequestPersonalInformation.api") def UserRequestPersonalInformation(): _=SQLUsers.selectashead(NSQL.MOD.ALL, WHERE=("PersonalPageUserUUID=%s", Get16toBytes(GetELTUserUUID())), FROM="personal", _limit=1) if not _: return {"code": 1, "msg": i18n.YouNeverRegisterPersonalPage} _=_[0] del _["PersonalPageUserUUID"] return {"code": 0, "data": _} def GetPersonalPage(name): if (r:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="personal", WHERE=("PersonalPageName=%s", name), _limit=1)): return r[0] return False @Manage.route("/API/JumpToPersonalPage.api") def UserJumpToPersonalPage(): UserUUID=flask.request.form.get("UserUUID", GetELTUserUUID()) if not Is_UUID(UserUUID): flask.abort(404) if not (r:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="personal", WHERE=("PersonalPageUserUUID=%s", Get16toBytes(UserUUID)), _limit=1)): flask.abort(404) return flask.redirect(f"https://{r[0]["PersonalPageName"]}.gvsds.com") @App.before_request def PersonalBeforeRequest(): h=flask.request.host.lower().split(".")[0] if h.lower() in BadH: return None if (r:=GetPersonalPage(h)): p=ReadUserConfig(GetBytesto16(r["PersonalPageUserUUID"])) return flask.render_template("Personal/index.html", UserName=p["UserName"], UserUUID=GetBytesto16(p["UserUUID"]), UserPersonalSignature=p["UserPersonalSignature"], UserEmail=p["UserEmail"], UserTele=RUserTele(GetBytesto16(p["UserTele"])), Subtitle=r["Subtitle"], BackgroundLink=r["BackgroundLink"], Classification=r["Classification"], Github=r["Github"], WeChat=r["WeChat"], QQ=r["QQ"], SelfIntroduction=r["SelfIntroduction"], ProjectExperience=r["ProjectExperience"], SatisfiedCustomers=r["SatisfiedCustomers"], ReceiveAward=r["ReceiveAward"], CoffeeCups=r["CoffeeCups"], Tags=r["Tags"], MarkDown=markdown.markdown(r["MarkDown"]), ChildHost=h, Achievement1Icon=r["Achievement1Icon"],Achievement1Name=r["Achievement1Name"],Achievement1Time=r["Achievement1Time"],Achievement1Introduction=r["Achievement1Introduction"], Achievement2Icon=r["Achievement2Icon"],Achievement2Name=r["Achievement2Name"],Achievement2Time=r["Achievement2Time"],Achievement2Introduction=r["Achievement2Introduction"], Achievement3Icon=r["Achievement3Icon"],Achievement3Name=r["Achievement3Name"],Achievement3Time=r["Achievement3Time"],Achievement3Introduction=r["Achievement3Introduction"], Achievement4Icon=r["Achievement4Icon"],Achievement4Name=r["Achievement4Name"],Achievement4Time=r["Achievement4Time"],Achievement4Introduction=r["Achievement4Introduction"], ) @Manage.route("/API/RequestPersonalConfig.api") def UserRequestPersonalConfig(): _=GetELTUserConfig() return { "UserName": _["UserName"], "UserRealName": _["UserRealName"], "UserSex": _["UserSex"], "UserPersonalSignature": _["UserPersonalSignature"], "UserEmail": _["UserEmail"], "UserTele": RUserTele(GetBytesto16(_["UserTele"])), "UserBornTime": _["UserBornTime"].strftime("%Y-%m-%d %H:%M:%S") } @Manage.route("/API/GetSeries.api") def UserGetSeries(): _=[] ELTUserUUID = GetELTUserUUID() if SQLDocument.istrue("series", WHERE=("DocAuthorUserUUID=%s", Get16toBytes(ELTUserUUID))): _=SQLDocument.selectashead(NSQL.MOD.ALL,WHERE=("DocAuthorUserUUID=%s", Get16toBytes(ELTUserUUID)), FROM="series") _2=[] for i in _: _2.append({"DocSerieUUID": GetBytesto16(i["DocSerieUUID"]), "DocSerieName": i["DocSerieName"], "DocAuthorUserUUID": GetBytesto16(i["DocAuthorUserUUID"]), "DocSerieCreateTime": i["DocSerieCreateTime"].strftime("%Y-%m-%d %H:%M:%S")}) return flask.jsonify({"code":0,"count":1000,"data":_2}) def gdfp(s, x): if x >= len(s): return 0 pattern = r'^([0-9]+)' match = re.match(pattern, s[x:]) if match: m=match.group(1) try: m=int(m) except: pass return m else: try: s=int(s) except: pass return s def dsort(s): if len(s) >= 3: if s[0] == "第": return gdfp(s, 1) if s[0:1] == "No": return gdfp(s, 2) if s[0] in "1234567890": return gdfp(s, 0) return 0 @Manage.route("/API/GetSerieDoces.api") def UserGetSerieDoces(): DocSerieUUID=flask.request.args.get("DocSerieUUID") if not DocSerieUUID: return {"code":1,"msg":i18n.NoParameter("DocSerieUUID")} if not Get16toBytes(DocSerieUUID, True): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")} if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission} _=[] if SQLDocument.istrue("doc", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): _=SQLDocument.selectashead(NSQL.MOD.ALL,WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)), FROM="doc") _2=[] for i in _: _2.append({"DocUUID": GetBytesto16(i["DocUUID"]), "DocSerieUUID": GetBytesto16(i["DocSerieUUID"]), "DocTitle": i["DocTitle"], "DocCreateTime": i["DocCreateTime"].strftime("%Y-%m-%d %H:%M:%S")}) _2=sorted(_2, key=lambda x: dsort(x["DocTitle"])) return flask.jsonify({"code":0,"count":1000,"data":_2}) @Manage.route("/API/addserie.api", methods=["POST"]) def UserAddSerie(): DocSerieName=flask.request.form.get("DocSerieName") if not DocSerieName: return {"code":1,"msg":i18n.NoParameter("DocSerieName")} if not NonLegalChar(DocSerieName): return {"code":1,"msg":i18n.NotLegalChar("DocSerieName")} if len(DocSerieName) > 255: return {"code":1,"msg":i18n.TooBigMsg("DocSerieName", "256B")} if SQLDocument.istrue("series", WHERE=("DocSerieName=%s", DocSerieName)): return {"code":1,"msg":i18n.AlreadyExist} SQLDocument.insert("series", DocSerieUUID=Get16toInsert(NewUUID()), DocSerieName=DocSerieName, DocAuthorUserUUID=Get16toInsert(GetELTUserUUID()), DocSerieCreateTime=TimeFormatStr("%Y-%m-%d %H:%M:%S")) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/delserie.api", methods=["POST"]) def UserDelSerie(): DocSerieUUID=flask.request.form.get("DocSerieUUID") if not DocSerieUUID: return {"code":1,"msg":i18n.NoParameter("DocSerieUUID")} if not Get16toBytes(DocSerieUUID, True): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")} if not Get16toBytes(DocSerieUUID, True): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")} if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist} SQLDocument.delete("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))) SQLDocument.delete("doc", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))) return {"code":1,"msg":i18n.DelSuccess} @Manage.route("/API/addoc.api", methods=["POST"]) def UserAddoc(): DocTitle=flask.request.form.get("DocTitle") DocSerieUUID=flask.request.form.get("DocSerieUUID") if not DocTitle: return {"code":1,"msg":i18n.NoParameter("DocTitle")} if not DocSerieUUID: return {"code":1,"msg":i18n.NoParameter("DocSerieUUID")} if not Is_UUID(DocSerieUUID): return {"code":1,"msg":i18n.NoUUID("DocSerieUUID")} if not NonLegalChar(DocTitle): return {"code":1,"msg":i18n.NotLegalChar("DocTitle")} if len(DocTitle) > 255: return {"code":1,"msg":i18n.TooBigMsg("DocTitle","255B")} if DocTitle != "__index" and SQLDocument.istrue("doc", ("DocTitle=%s" , DocTitle)): return {"code":1,"msg":i18n.AlreadyExist} if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist} if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission} SQLDocument.insert("doc", DocUUID=Get16toBytes(NewUUID()), DocSerieUUID=Get16toBytes(DocSerieUUID), DocTitle=DocTitle, DocContent="", DocCreateTime=TimeFormatStr("%Y-%m-%d %H:%M:%S")) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/writedoc.api", methods=["POST"]) def UserWriteDoc(): DocUUID=flask.request.form.get("DocUUID") DocContent=flask.request.form.get("DocContent") if not DocUUID: return {"code":1,"msg":i18n.NoParameter("DocUUID")} if not DocContent: return {"code":1,"msg":i18n.NoParameter("DocContent")} if len(DocContent) > 50 * 1024 * 1024: return {"code":1,"msg":i18n.TooBigMsg("DocContent","50M")} if not Get16toBytes(DocUUID, True): return {"code":1,"msg":i18n.NoUUID("DocUUID")} if not SQLDocument.istrue("doc", ("DocUUID=%s", Get16toBytes(DocUUID))): return {"code":1,"msg":"DOC "+i18n.NotExist} DocSerieUUID=GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0]["DocSerieUUID"]) if not SQLDocument.istrue("series", ("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":"SERIE "+i18n.NotExist} if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission} SQLDocument.update(DocContent=DocContent, FROM="doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID))) return {"code":0,"msg":i18n.AddSuccess} @Manage.route("/API/readdoc.api", methods=["POST"]) def UserReadDoc(): DocUUID=flask.request.form.get("DocUUID") if not DocUUID: return {"code":1,"msg":i18n.NoParameter("DocUUID")} if not Get16toBytes(DocUUID, True): return {"code":1,"msg":i18n.NoUUID("DocUUID")} if not SQLDocument.istrue("doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID))): return {"code":1,"msg":i18n.NotExist} DocSerieUUID=GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0]["DocSerieUUID"]) if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist} if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return {"code":1,"msg":i18n.NoPermission} _r=SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0] return {"DocTitle": _r["DocTitle"], "DocContent": _r["DocContent"]} @Manage.route("/API/deldoc.api", methods=["POST"]) def UserDelDoc(): DocUUID=flask.request.form.get("DocUUID") if not DocUUID: return {"code":1,"msg":i18n.NoParameter("DocUUID")} if not Get16toBytes(DocUUID, True): return {"code":1,"msg":i18n.NoUUID("DocUUID")} if not SQLDocument.istrue("doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID))): return {"code":1,"msg":i18n.NotExist} DocSerieUUID=GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="doc",WHERE=("DocUUID=%s", Get16toBytes(DocUUID)))[0]["DocSerieUUID"]) if not SQLDocument.istrue("series", WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID))): return {"code":1,"msg":i18n.NotExist} if GetBytesto16(SQLDocument.selectashead(NSQL.MOD.ALL,FROM="series",WHERE=("DocSerieUUID=%s", Get16toBytes(DocSerieUUID)))[0]["DocAuthorUserUUID"]) != GetELTUserUUID(): return "此表单提供的系列不由cookie记录的账户管理" SQLDocument.delete("doc", WHERE=("DocUUID=%s", Get16toBytes(DocUUID))) return {"code":0,"msg":i18n.DelSuccess} from flask_wtf import FlaskForm from flask_wtf.csrf import validate_csrf from wtforms import SubmitField, HiddenField from wtforms.validators import DataRequired @Manage.route("/User/checkin.html") def UserCheckInPage(): return flask.render_template("Manage/User/checkin.html") @Manage.route("/API/CheckInStatus.api") def UserCheckInStatusAPI(): _=GetELTUserConfig()["UserLastCheckInDate"] if not _: return flask.jsonify({"code": 0, "checkin": False}) if _.date() == datetime.datetime.today().date(): return flask.jsonify({"code": 0, "checkin": True}) return flask.jsonify({"code": 0, "checkin": False}) class CheckInForm(FlaskForm): csrf_token = HiddenField(validators=[DataRequired()]) @Manage.route("/API/CheckIn.api", methods=["POST"]) @PreRequirements(2.0) def UserCheckInAPI(): checkin=CheckInForm() if not checkin.validate_on_submit(): return flask.jsonify({"code": 1, "msg": i18n.CheckInError}) try: validate_csrf(checkin.csrf_token.data) except: return flask.jsonify({"code": 1, "msg": i18n.CheckInError}) _ = GetELTUserConfig()["UserLastCheckInDate"] if hasattr(_, "date") and _ and _.date() == datetime.datetime.today().date(): return flask.jsonify({"code": 1, "msg": i18n.AlreadyCheckIn}) WriteELTUserConfigI("UserLastCheckInDate", TimeFormatInt()) ELTUserUUID = GetELTUserUUID() GC = -1 if (r:=GetMCMarketByGVSDSUUID(ELTUserUUID)): GC = random.randint(0,500) SQLMinecraft.update(FROM="server_market_balances", WHERE=("uuid=%s", r[0]["uuid"]), amount=r[0]["amount"] + GC) SQLUsers.insert("checkin", UserUUID=Get16toBytes(ELTUserUUID), WeekFirstTime=GetWeekStartDate(), CheckInTime=TimeFormatStr()) return flask.jsonify({"code": 0, "GC": GC}) @Manage.route("/API/GetNewCheckIn.api") @PreRequirements(2.0) def UserGetNewCheckIn(): _r=[] for i in SQLUsers.selectashead(NSQL.MOD.ALL, FROM="checkin", WHERE="1=1", _limit=16*3, WITH="ORDER BY CheckInTime DESC"): if not (_u:=SQLUsers.selectashead(NSQL.MOD.ALL, FROM="usersub", WHERE=("UserUUID=%s", i["UserUUID"]))): _r.append({"name":i18n.Cancelled, "avatar":"/assets/img/UserDefaultImg.png", "signin_time": i["CheckInTime"].strftime("%Y-%m-%d %H:%M:%S"), "firstweek_time": i["WeekFirstTime"].strftime("%Y-%m-%d")}) continue _u=_u[0] _r.append({"name":_u["UserName"], "avatar":f"https://ugm.gvsds.com/GetArgsUserHeadPng.api?UserUUID={GetBytesto16(_u["UserUUID"])}", "signin_time": i["CheckInTime"].strftime("%Y-%m-%d %H:%M:%S"), "firstweek_time": i["WeekFirstTime"].strftime("%Y-%m-%d")}) return {"code": 0, "data": _r} @Manage.route("/API/GetLJUMPM.api") def ManageGetLJUMPM(): return {"code": GetELTUserConfig()["UserLoginJump"]} @Manage.route("/API/GetTheme.api") def ManageGetTheme(): return {"code": GetELTUserConfig()["UserTheme"]} @Manage.route("/API/GetPhotoViewPort.api") def ManageGetPhotoViewPort(): return {"code": GetELTUserConfig()["UserPhotoViewPort"]} @Manage.route("/API/SetLJUMPM.api", methods=["POST"]) def ManageSetLJUMPM(): Jump=flask.request.form.get("Jump") if not Jump: return {"code": 1, "msg": i18n.NoParameter("Jump")} if Jump not in ["0", "1"]: return {"code": 1, "msg": i18n.ModeError} SQLUsers.update(UserLoginJump=int(Jump), FROM="usersub", WHERE=("UserUUID=%s", Get16toBytes(GetELTUserUUID()))) return {"code": 0, "msg": i18n.OperateSuccess} @Manage.route("/API/SetTheme.api", methods=["POST"]) def ManageSetTheme(): Theme=flask.request.form.get("Theme") if not Theme: return {"code": 1, "msg": i18n.NoParameter("Theme")} if not os.path.isfile(os.path.join(TempLate, f"Manage/css/theme{str(Theme)}.css")): return {"code": 0, "msg": i18n.NoFound("ThemeCSS")} SQLUsers.update(UserTheme=int(Theme), FROM="usersub", WHERE=("UserUUID=%s", Get16toBytes(GetELTUserUUID()))) return {"code": 0, "msg": i18n.OperateSuccess} @Manage.route("/API/SetPhotoViewPort.api", methods=["POST"]) def ManageSetPhotoViewPort(): PhotoViewPort=flask.request.form.get("PhotoViewPort") if not PhotoViewPort: return {"code": 1, "msg": i18n.NoParameter("PhotoViewPort")} if PhotoViewPort not in ["0", "1"]: return {"code": 1, "msg": i18n.ModeError} SQLUsers.update(UserPhotoViewPort=int(PhotoViewPort), FROM="usersub", WHERE=("UserUUID=%s", Get16toBytes(GetELTUserUUID()))) return {"code": 0, "msg": i18n.OperateSuccess} @Manage.route("/css/theme.css") def ManageThemeCSS(): return flask.Response(openr(os.path.join(TempLate, f"Manage/css/Theme{GetELTUserConfig()["UserTheme"]}.css")), mimetype="text/css") @Manage.before_request def ManageBeforeRequest(): #return flask.render_template("Manage/workonit.html") allowsu=["txt", "png", "jpg", "gif", "js", "css", "eot", "svg", "tff", "woff", "woff2"] if flask.request.url.split(".")[-1].lower() not in allowsu and not Is_ELTUser(): return flask.redirect(flask.url_for("MainLoginHTML")) #App.jinja_env.globals.update App.register_blueprint(Manage) Verify=flask.Blueprint("verify", __name__, subdomain="verify",static_folder=TempLate + "/verify",static_url_path="/") @Verify.route("/") def VerifyIndex(): if not Is_ELTUser(): return flask.render_template("/Verify/index_de.html") ELTUserConfig=GetELTUserConfig() Permission=int(float(ELTUserConfig["UserPermissions"])) PermissionWord={5: "A",4: "B",3: "C",2: "D",1: "E"}.get(Permission, "UK") PermissionWork={5: ["系统管理员", "网络架构配置与管理", "防火墙与入侵检测系统管理", "安全事件响应与处置", "网络流量监控与分析", "最高权限"],4: ["组管理员", "网络架构配置与管理", "防火墙与入侵检测系统管理", "安全事件响应与处置", "网络流量监控与分析"],3: ["委员会成员", "可读取", "可修改", "禁止越权", "网络架构配置与管理", "防火墙与入侵检测系统管理", "安全事件响应与处置", "系统漏洞扫描与修复", "网络流量监控与分析"],2: ["组成员", "可读取", "禁止修改", "禁止越权"],1: ["用户", "可读取", "禁止修改", "禁止越权"]}.get(Permission, "UK") PermissionWork2={5: ["允许修改全部 ELT 凭证", "可本地写入读取,可服务器写入读取"],4: ["允许修改全部 ELT 凭证", "可本地写入读取,可服务器写入读取"],3: ["允许修改部分 ELT 凭证", "可本地写入读取,可服务器写入读取"],2: ["禁止修改 ELT 凭证", "可本地写入读取"],1: ["禁止修改 ELT 凭证", "可本地写入读取"]}.get(Permission, "UK") VerifyStatus={5: "SYSTEM OVERSEER",4: "GROUP AGENT",3: "COMMITTEE AGENT",2: "GROUP",1: "USER"}.get(Permission, "UK") return flask.render_template("/Verify/index.html", UserName=StrMinus(ELTUserConfig["UserName"], 20), Permission=Permission, PermissionWord=PermissionWord, UserCreatime=ELTUserConfig["UserCreatime"].strftime("%Y-%m-%d %H:%M:%S"), UserLastLoginDate=ELTUserConfig["UserLastLoginDate"].strftime("%Y-%m-%d %H:%M:%S"), UserUUID=GetBytesto16(ELTUserConfig["UserUUID"]).upper(), UserJob=ELTUserConfig["UserJob"], VerifyStatus=VerifyStatus, PermissionWork=PermissionWork, PermissionWork2=PermissionWork2, ) @Verify.route("/index.html") def VerifyIndexHtml(): return flask.redirect(flask.url_for("Verify.VerifyIndex")) App.register_blueprint(Verify)