models.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #!/usr/bin/python
  2. # -*- coding=utf-8 -*-
  3. # @Create Time: 2024-01-12 15:23:13
  4. # @Last Modified time: 2024-02-22 17:34:06
  5. from datetime import datetime
  6. import click
  7. from flask import current_app
  8. from flask.cli import with_appcontext
  9. from flask_sqlalchemy import SQLAlchemy
  10. from .secure import AES_Util
  11. db = SQLAlchemy()
  12. class Record(db.Model):
  13. # 原始记录表
  14. __tablename__ = 'recorder'
  15. # 表的结构:
  16. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='记录id')
  17. Record_Time = db.Column(db.DateTime, nullable=False, doc='记录时间')
  18. # Current_Url = db.Column(db.UnicodeText, nullable=False, doc='当前url')
  19. _Current_Url = db.Column(db.LargeBinary, nullable=False, doc='当前url')
  20. # Full_Url = db.Column(db.UnicodeText, nullable=False, doc='')
  21. # _Full_Url = db.Column(db.LargeBinary, nullable=False, doc='')
  22. # Sim_Url = db.Column(db.UnicodeText, nullable=True, doc='')
  23. # _Sim_Url = db.Column(db.LargeBinary, nullable=True, doc='')
  24. # User_Id = db.Column(db.String, nullable=False, doc='用户id')
  25. _User_Id = db.Column(db.LargeBinary, nullable=False, doc='用户id')
  26. # Device_Id = db.Column(db.String, nullable=True, doc='设备id')
  27. _Device_Id = db.Column(db.LargeBinary, nullable=True, doc='设备id')
  28. # Request_Method = db.Column(db.String, nullable=False, doc='请求方法')
  29. _Request_Method = db.Column(db.LargeBinary, nullable=False, doc='请求方法')
  30. # Event_Type = db.Column(db.String, nullable=True, doc='事件类型')
  31. _Event_Type = db.Column(db.LargeBinary, nullable=True, doc='事件类型')
  32. # Form_Data = db.Column(db.UnicodeText, nullable=True, doc='表单数据')
  33. _Form_Data = db.Column(db.LargeBinary, nullable=True, doc='表单数据')
  34. # Json_Data = db.Column(db.UnicodeText, nullable=True, doc='')
  35. # Value_Data = db.Column(db.UnicodeText, nullable=True, doc='')
  36. # Status_Code = db.Column(db.String, nullable=True, doc='状态码')
  37. _Status_Code = db.Column(db.LargeBinary, nullable=True, doc='状态码')
  38. # Target_Url = db.Column(db.UnicodeText, nullable=False, doc='请求地址')
  39. _Target_Url = db.Column(db.LargeBinary, nullable=False, doc='请求地址')
  40. # Iframe_Url = db.Column(db.UnicodeText, nullable=True, doc='内联url')
  41. _Iframe_Url = db.Column(db.LargeBinary, nullable=True, doc='内联url')
  42. # Button_Text = db.Column(db.String, nullable=True, doc='按钮文字')
  43. _Button_Text = db.Column(db.LargeBinary, nullable=True, doc='按钮文字')
  44. @property
  45. def Current_Url(self):
  46. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  47. return aes.decrypt(self._Current_Url)
  48. @Current_Url.setter
  49. def Current_Url(self, Current_Url):
  50. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  51. self._Current_Url = aes.encrypt(Current_Url)
  52. @property
  53. def User_Id(self):
  54. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  55. return aes.decrypt(self._User_Id)
  56. @User_Id.setter
  57. def User_Id(self, User_Id):
  58. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  59. self._User_Id = aes.encrypt(User_Id)
  60. @property
  61. def Device_Id(self):
  62. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  63. return aes.decrypt(self._Device_Id)
  64. @Device_Id.setter
  65. def Device_Id(self, Device_Id):
  66. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  67. self._Device_Id = aes.encrypt(Device_Id)
  68. @property
  69. def Request_Method(self):
  70. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  71. return aes.decrypt(self._Request_Method)
  72. @Request_Method.setter
  73. def Request_Method(self, Request_Method):
  74. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  75. self._Request_Method = aes.encrypt(Request_Method)
  76. @property
  77. def Event_Type(self):
  78. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  79. return aes.decrypt(self._Event_Type)
  80. @Event_Type.setter
  81. def Event_Type(self, Event_Type):
  82. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  83. self._Event_Type = aes.encrypt(Event_Type)
  84. @property
  85. def Form_Data(self):
  86. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  87. return aes.decrypt(self._Form_Data)
  88. @Form_Data.setter
  89. def Form_Data(self, Form_Data):
  90. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  91. self._Form_Data = aes.encrypt(Form_Data)
  92. @property
  93. def Status_Code(self):
  94. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  95. return aes.decrypt(self._Status_Code)
  96. @Status_Code.setter
  97. def Status_Code(self, Status_Code):
  98. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  99. self._Status_Code = aes.encrypt(Status_Code)
  100. @property
  101. def Target_Url(self):
  102. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  103. return aes.decrypt(self._Target_Url)
  104. @Target_Url.setter
  105. def Target_Url(self, Target_Url):
  106. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  107. self._Target_Url = aes.encrypt(Target_Url)
  108. @property
  109. def Iframe_Url(self):
  110. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  111. return aes.decrypt(self._Iframe_Url)
  112. @Iframe_Url.setter
  113. def Iframe_Url(self, Iframe_Url):
  114. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  115. self._Iframe_Url = aes.encrypt(Iframe_Url)
  116. @property
  117. def Button_Text(self):
  118. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  119. return aes.decrypt(self._Button_Text)
  120. @Button_Text.setter
  121. def Button_Text(self, Button_Text):
  122. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  123. self._Button_Text = aes.encrypt(Button_Text)
  124. def to_json(self):
  125. json_data = {
  126. 'record_time': self.Record_Time,
  127. 'current_url': self.Current_Url,
  128. 'user_id': self.User_Id,
  129. 'device_id': self.Device_Id,
  130. 'request_method': self.Request_Method,
  131. 'event_type': self.Event_Type,
  132. 'form_data': self.Form_Data,
  133. 'status_code': self.Status_Code,
  134. 'target_url': self.Target_Url,
  135. 'iframe_url': self.Iframe_Url,
  136. 'button_text': self.Button_Text
  137. }
  138. return json_data
  139. class Fragment(db.Model):
  140. # 临时表(屏一表三 | 屏一表四)
  141. __tablename__ = 'fragment'
  142. # 表的结构:
  143. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='统计id')
  144. Time = db.Column(db.DateTime, nullable=False, doc='记录时间')
  145. User_Id = db.Column(db.String, nullable=False, doc='用户id')
  146. Method = db.Column(db.String, nullable=False, doc='请求方法')
  147. Has_Form = db.Column(db.Boolean, nullable=False, default=False, doc='是否有表单')
  148. Dom = db.Column(db.String, nullable=False, doc='访问域')
  149. Title1 = db.Column(db.String, nullable=False, doc='一级标题')
  150. Title2 = db.Column(db.String, nullable=False, doc='二级标题')
  151. Title3 = db.Column(db.String, nullable=False, doc='三级标题')
  152. Title4 = db.Column(db.String, nullable=True, doc='四级标题')
  153. Behavior = db.Column(db.String, nullable=False, doc='行为内容')
  154. Stay = db.Column(db.Integer, nullable=False, default=0, doc='持续时间')
  155. class TotalCount(db.Model):
  156. # 统计表(屏一表一 | 屏一表二)
  157. __tablename__ = 'totalcount'
  158. # 表的结构: 采集总量,偏离总量,登录人数,四域偏离量
  159. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='统计id')
  160. Name = db.Column(db.String, nullable=False, unique=True, doc='统计名')
  161. Count = db.Column(db.Integer, nullable=False, default=0, doc='统计量')
  162. def __init__(self, name, count = 0):
  163. self.Name = name
  164. self.Count = count
  165. def to_json(self):
  166. json_data = {
  167. self.Name: self.Count
  168. }
  169. return json_data
  170. def add_one(self):
  171. self.Count += 1
  172. class PersonLogin(db.Model):
  173. # 用户登录统计表(屏二表二 | 屏一表五)
  174. __tablename__ = 'personlogin'
  175. # 表的结构: 用户在线时长
  176. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='id')
  177. User_Id = db.Column(db.String, nullable=False, unique=True, doc='业务用户id')
  178. Online_Duration = db.Column(db.Integer, nullable=False, default=0, doc='在线时长')
  179. ZC_Visit = db.Column(db.Boolean, nullable=False, default=False, doc='是否访问资产域')
  180. CW_Visit = db.Column(db.Boolean, nullable=False, default=False, doc='是否访问财务域')
  181. RZ_Visit = db.Column(db.Boolean, nullable=False, default=False, doc='是否访问人资域')
  182. YX_Visit = db.Column(db.Boolean, nullable=False, default=False, doc='是否访问财务域')
  183. def __init__(self, user_id):
  184. self.User_Id = user_id
  185. def visit_zc(self):
  186. self.ZC_Visit = True
  187. def visit_cw(self):
  188. self.CW_Visit = True
  189. def visit_rz(self):
  190. self.RZ_Visit = True
  191. def visit_yx(self):
  192. self.YX_Visit = True
  193. def to_json(self):
  194. json_data = {
  195. "User_Id": self.User_Id ,
  196. "Online_Duration": self.Online_Duration,
  197. "ZC_Visit": self.ZC_Visit ,
  198. "CW_Visit": self.CW_Visit ,
  199. "RZ_Visit": self.RZ_Visit ,
  200. "YX_Visit": self.YX_Visit
  201. }
  202. return json_data
  203. class Business(db.Model):
  204. # 业务操作统计表(屏二表一 | 屏二表三)
  205. __tablename__ = 'business'
  206. # 表的结构: 用户操作数量,业务数量,业务时长,业务偏离统计量
  207. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='行为id')
  208. User_Id = db.Column(db.String, unique=True, nullable=False, doc='业务用户id')
  209. Be_Num = db.Column(db.Integer, nullable=False, doc='操作统计量')
  210. Bu_Num = db.Column(db.Integer, nullable=False, doc='业务统计量')
  211. Time = db.Column(db.DateTime, nullable=False, doc='业务时间')
  212. Bias_Num = db.Column(db.Integer, nullable=False, doc='业务偏离统计量')
  213. class TotalVisit(db.Model):
  214. # 域访问量统计表
  215. __tablename__ = 'totalvisit'
  216. # 表的结构:
  217. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='域id')
  218. Name = db.Column(db.String, unique=True, nullable=False, doc='域名')
  219. Count = db.Column(db.Integer, nullable=False, doc='访问量')
  220. class TotalBusiness(db.Model):
  221. # 业务统计表
  222. __tablename__ = 'totalbusiness'
  223. # 表的结构:
  224. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='业务id')
  225. Name = db.Column(db.String, nullable=False, doc='业务名称')
  226. Count = db.Column(db.Integer, nullable=False, doc='访问量')
  227. class PersonTotalVisit(db.Model):
  228. # 个人域访问量统计表
  229. __tablename__ = 'persontotalvisit'
  230. # 表的结构:
  231. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='域id')
  232. User_Id = db.Column(db.String, nullable=False, doc='用户id')
  233. Name = db.Column(db.String, nullable=False, doc='域名')
  234. Count = db.Column(db.Integer, nullable=False, doc='访问量')
  235. class PersonPortrayal(db.Model):
  236. # 用户画像表(屏三表四)
  237. __tablename__ = 'personportrayal'
  238. # 表的结构:
  239. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='画像id')
  240. User_Id = db.Column(db.String, nullable=False, doc='用户id')
  241. Attr1 = db.Column(db.String, nullable=False, doc='用户属性1')
  242. Attr2 = db.Column(db.String, nullable=False, doc='用户属性2')
  243. Attr3 = db.Column(db.String, nullable=False, doc='用户属性3')
  244. Attr4 = db.Column(db.String, nullable=False, doc='用户属性4')
  245. Attr5 = db.Column(db.String, nullable=False, doc='用户属性5')
  246. Attr6 = db.Column(db.String, nullable=False, doc='用户属性6')
  247. Attr7 = db.Column(db.String, nullable=False, doc='用户属性7')
  248. Attr8 = db.Column(db.String, nullable=False, doc='用户属性8')
  249. class PersonDeparture(db.Model):
  250. # 个人行为偏离统计
  251. __tablename__ = 'persondeparture'
  252. # 表的结构:
  253. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='统计id')
  254. User_Id = db.Column(db.String, nullable=False, doc='用户id')
  255. Count = db.Column(db.Integer, nullable=False, doc='偏离量')
  256. class PersonBehavior(db.Model):
  257. # 个人行为表
  258. __tablename__ = 'personbehavior'
  259. # 表的结构:
  260. id = db.Column(db.Integer, primary_key=True, autoincrement=True, doc='行为id')
  261. User_Id = db.Column(db.String, nullable=False, unique=True, doc='行为用户id')
  262. Time = db.Column(db.DateTime, nullable=False, doc='行为时间')
  263. BGroup = db.Column(db.String, doc='行为组')
  264. @click.command('init-db')
  265. @with_appcontext
  266. def init_db_command():
  267. db.create_all()
  268. tc1 = TotalCount(name='采集量')
  269. tc2 = TotalCount(name='发现行为偏离')
  270. tc3 = TotalCount(name='资产域行为偏离')
  271. tc4 = TotalCount(name='财务域行为偏离')
  272. tc5 = TotalCount(name='人资域行为偏离')
  273. tc6 = TotalCount(name='营销管理行为偏离')
  274. db.session.add_all([tc1,tc2,tc3,tc4,tc5,tc6])
  275. db.session.commit()
  276. @click.command('drop-db')
  277. @with_appcontext
  278. def drop_db_command():
  279. db.drop_all()
  280. def init_app(app):
  281. app.cli.add_command(init_db_command)
  282. app.cli.add_command(drop_db_command)