#!/usr/local/bin/python3 # -*- coding: utf-8 -*- import json from tornado import gen import libs.common as common import libs.stock_web_dic as stock_web_dic import web.base as webBase import logging import datetime # info 蓝色 云财经 # success 绿色 # danger 红色 东方财富 # warning 黄色 WEB_EASTMONEY_URL = u""" 东财 指标 东研 """ # 和在dic中的字符串一致。字符串前面都不特别声明是u"" eastmoney_name = "查看股票" # 获得页面数据,进入页面中。 class GetStockHtmlHandler(webBase.BaseHandler): @gen.coroutine def get(self): name = self.get_argument("table_name", default=None, strip=False) tableInfo = stock_web_dic.STOCK_WEB_DATA_MAP[name] # self.uri_ = ("self.request.url:", self.request.uri) # print self.uri_ date_now = datetime.datetime.now() date_now_str = date_now.strftime("%Y%m%d") # 每天的 16 点前显示昨天数据。 if date_now.hour < 16: date_now_str = (date_now + datetime.timedelta(days=-1)).strftime("%Y%m%d") # try: # # 增加columns 字段中的【查看股票 东方财富】 # logging.info(eastmoney_name in tableInfo.column_names) # if eastmoney_name in tableInfo.column_names: # tmp_idx = tableInfo.column_names.index(eastmoney_name) # logging.info(tmp_idx) # try: # # 防止重复插入数据。可能会报错。 # tableInfo.columns.remove("eastmoney_url") # except Exception as e: # print("error :", e) # tableInfo.columns.insert(tmp_idx, "eastmoney_url") # except Exception as e: # print("error :", e) logging.info("####################GetStockHtmlHandlerEnd") self.render("tableInfo.html", tableInfo=tableInfo, date_now=date_now_str, pythonStockVersion=common.__version__, leftMenu=webBase.GetLeftMenu(self.request.uri)) # 获得股票数据内容。 class GetStockDataHandler(webBase.BaseHandler): def get(self): self.set_header('Content-Type', 'application/json;charset=UTF-8') logging.info("######################## GetStockDataHandler ########################") # 获得分页参数。 page_param = self.get_argument("page", default=0, strip=False) limit_param = self.get_argument("limit", default=10, strip=False) name_param = self.get_argument("name", default="stock_zh_ah_name", strip=False) type_param = self.get_argument("type", default=None, strip=False) date_param = self.get_argument("date", default=None, strip=False) code_param = self.get_argument("code", default=None, strip=False) logging.info(f"page param: {page_param}, {limit_param}, {type_param}, {date_param}, {code_param}") if name_param == ":tableName": obj = { "code": 20000, "message": "success", "draw": 0, "data": [] } # logging.info("####################") # logging.info(obj) self.write(json.dumps(obj)) return tableInfo = stock_web_dic.STOCK_WEB_DATA_MAP[name_param] order_by_column = [] order_by_dir = [] # 支持多排序。使用shift+鼠标左键。 for item, val in self.request.arguments.items(): # logging.info("item: %s, val: %s" % (item, val) ) if str(item).startswith("order["): print("order:", item, ",val:", val[0]) if str(item).startswith("order[") and str(item).endswith("[column]"): order_by_column.append(int(val[0])) if str(item).startswith("order[") and str(item).endswith("[dir]"): order_by_dir.append(val[0].decode("utf-8")) # bytes转换字符串 search_by_column = [] search_by_data = [] # 返回search字段。 for item, val in self.request.arguments.items(): # logging.info("item: %s, val: %s" % (item, val)) if str(item).startswith("columns[") and str(item).endswith("[search][value]"): logging.info("item: %s, val: %s" % (item, val)) str_idx = item.replace("columns[", "").replace("][search][value]", "") int_idx = int(str_idx) # 找到字符串 str_val = val[0].decode("utf-8") if str_val != "": # 字符串。 search_by_column.append(tableInfo.columns[int_idx]) search_by_data.append(val[0].decode("utf-8")) # bytes转换字符串 # 打印日志。 search_sql = "" search_idx = 0 logging.info("################# search_by_column #################") logging.info(search_by_column) logging.info(search_by_data) for item in search_by_column: val = search_by_data[search_idx] logging.info("idx: %s, column: %s, value: %s " % (search_idx, item, val)) # 查询sql if search_idx == 0: search_sql = " WHERE `%s` = '%s' " % (item, val) else: search_sql = search_sql + " AND `%s` = '%s' " % (item, val) search_idx = search_idx + 1 if date_param: if "WHERE" not in search_sql: search_sql += f" WHERE `date` = '{date_param}' " else: search_sql += f" AND `date` = '{date_param}' " if code_param: if "WHERE" not in search_sql: search_sql += f" WHERE `code` = '{code_param}' " else: search_sql += f" AND `code` = '{code_param}' " # print("tableInfo :", stock_web) order_by_sql = "" # 增加排序。 if len(order_by_column) != 0 and len(order_by_dir) != 0: order_by_sql = " ORDER BY " idx = 0 for key in order_by_column: # 找到排序字段和dir。 col_tmp = tableInfo.columns[key] dir_tmp = order_by_dir[idx] if idx != 0: order_by_sql += " , %s %s" % (col_tmp, dir_tmp) else: order_by_sql += " %s %s" % (col_tmp, dir_tmp) idx += 1 # 查询数据库。 limit_sql = "" if int(limit_param) > 0: start = ( int(page_param) - 1 ) * int(limit_param) limit_sql = f" LIMIT {start} , {limit_param} " sql = " SELECT * FROM `%s` %s %s %s " % ( tableInfo.table_name, search_sql, order_by_sql, limit_sql) count_sql = " SELECT count(1) as num FROM `%s` %s " % (tableInfo.table_name, search_sql) logging.info("select sql : " + sql) logging.info("count sql : " + count_sql) stock_web_list = self.db.query(sql) stock_web_size = self.db.query(count_sql) logging.info("tableInfoList size : %s " % stock_web_size) # 动态表格展示: table_columns = [] try: tmp_len = len(tableInfo.columns) logging.info("ableInfo.columns tmp_len : %s " % tmp_len) # 循环数据,转换成对象,放入到数组中,方便前端 vue table 循环使用。 for tmp_idx in range(0, tmp_len): logging.info(tmp_idx) column = tableInfo.columns[tmp_idx] column_name = tableInfo.column_names[tmp_idx] tpm_column_obj = { "column": column, "columnName" : column_name } table_columns.append(tpm_column_obj) except Exception as e: print("error :", e) obj = { "code": 20000, "message": "success", "draw": 0, "tableName" : tableInfo.name, "tableColumns": table_columns, "total": stock_web_size[0]["num"], "recordsTotal": stock_web_size[0]["num"], "recordsFiltered": stock_web_size[0]["num"], "data": stock_web_list } # logging.info("####################") # logging.info(obj) self.write(json.dumps(obj))