Exemple #1
0
def edit_admin(**kwargs):
    """修改管理员资料,参数必须是键值对的形式"""
    message = {"message": "success"}
    if not check_admin_args(**kwargs):
        message["message"] = "参数错误"
    else:
        admin_id = kwargs.pop("admin_id", None)
        if admin_id is None or not my_db.validate_arg(admin_id):
            message["message"] = "无效的用户ID"
        else:
            sql = my_db.structure_sql(
                "edit",
                "admin_info",
                query_terms="where admin_id='{}'".format(admin_id),
                **kwargs)
            session = my_db.sql_session()
            try:
                session.execute(sql)
                session.commit()
            except Exception as e:
                print(e)
                message['message'] = '编辑管理员信息失败'
            finally:
                session.close()
    return message
Exemple #2
0
def mark_as_read(notification_id):
    """根据用户id标记消息为已读"""
    session = my_db.sql_session()
    sql = "update notification set `read` = 1 where notification_id = {}".format(
        notification_id)
    session.execute(sql)
    session.commit()
Exemple #3
0
def add_admin(**kwargs):
    """增加管理员,参数必须是键值对的形式,"""
    message = {"message": "success"}
    if not check_admin_args(**kwargs):
        message["message"] = "参数错误"
    else:
        try:
            sql = my_db.structure_sql("add", "admin_info", **kwargs)
            session = my_db.sql_session()
            session.execute(sql)
            session.commit()
        except sqlalchemy.exc.IntegrityError as e1:
            """
            re.findall(r"for key '(.+?)'",str) 是从str中找到匹配以for key 'PRIMARY'")
            句子中的PRIMARY,findall方法返回的是数组
            """
            print(e1.args)
            error_cause = re.findall(r"for key '(.+?)'", e1.args[-1])[0]
            if error_cause == "admin_phone":
                message["message"] = "管理员手机重复"
            else:
                print(error_cause)
                message['message'] = "添加管理员失败"
        except Exception as e2:
            print(e2)
            print("未知错误")
        finally:
            session.close()
    return message
Exemple #4
0
def edit_user(**kwargs):
    """修改用户资料,参数必须是键值对的形式"""
    message = {"message": "success"}
    flag, msg = check_user_args(**kwargs)
    if not flag:
        message["message"] = "参数错误%s" % (msg)
    else:
        user_id = kwargs.pop("user_id", None)
        if user_id is None or len(user_id) != 20:
            message["message"] = "无效的用户ID"
        else:
            sql = my_db.structure_sql(
                "edit",
                "user_info",
                query_terms="where user_id='{}'".format(user_id),
                **kwargs)
            session = my_db.sql_session()
            try:
                session.execute(sql)
                session.commit()
            except Exception as e:
                print(e)
                message['message'] = '编辑用户信息失败'
            finally:
                session.close()
    return message
Exemple #5
0
def add_user(**kwargs):
    """增加用户,参数必须是键值对的形式,注意,暂时没追加微信登录的方式"""
    message = {"message": "success"}
    if not check_user_args(**kwargs):
        message["message"] = "参数错误"
    else:
        try:
            sql = my_db.structure_sql("add", "user_info", **kwargs)
            session = my_db.sql_session()
            session.execute(sql)
            session.commit()
        except sqlalchemy.exc.IntegrityError as e1:
            """
            re.findall(r"for key '(.+?)'",str) 是从str中找到匹配以for key 'PRIMARY'")
            句子中的PRIMARY,findall方法返回的是数组
            """
            print(e1.args)
            error_cause = re.findall(r"for key '(.+?)'", e1.args[-1])[0]
            if error_cause == "user_phone":
                message["message"] = "此手机已注册过"
            elif error_cause == "PRIMARY":
                message["message"] = "用户ID重复"
            else:
                print(error_cause)
                message['message'] = "注册失败,请联系客服"
        except Exception as e2:
            print(e2)
            print("未知错误")
        finally:
            session.close()
    return message
Exemple #6
0
def get_user_info(user_id, user_password):
    """根据用户id和密码获取信息"""
    message = {"message": "success"}
    if my_db.validate_arg(user_password) and my_db.validate_arg(user_password):
        session = my_db.sql_session()
        columns = get_columns()
        sql = "select " + ",".join(
            columns) + " from user_info where user_id='{}'".format(user_id)
        try:
            proxy_result = session.execute(sql)
            result = proxy_result.fetchone()
            if result is None:
                message['message'] = "此ID不存在"
            else:
                result = my_db.str_format(result)
                result = dict(zip(columns, result))
                if user_password.lower() == result['user_password'].lower():
                    if result['user_status'] == 1:
                        message['data'] = result
                    else:
                        message['message'] = "账户已冻结"
                else:
                    message["message"] = "密码错误"
        except Exception as e:
            print(e)
            message['message'] = '查询失败'
        finally:
            session.close()
    else:
        message['message'] = "参数错误"
    return message
Exemple #7
0
def page(index=1, length=30):
    """分页查询用户,后台管理用,index是页码,length是每页多少条记录"""
    message = {"message": "success"}
    if isinstance(index, (int, str)) and isinstance(length, (int, str)):
        try:
            index = index if isinstance(index, int) else int(index)
            length = length if isinstance(length, int) else int(length)
            session = my_db.sql_session()
            columns = get_columns()
            sql = "select " + ",".join(columns) + (
                " from user_info order by create_date desc "
                "limit {},{}".format((index - 1) * length, length))
            try:
                proxy_result = session.execute(sql)
                result = proxy_result.fetchall()
                if len(result) != 0:
                    result = [my_db.str_format(x) for x in result]
                    data = [dict(zip(columns, x)) for x in result]
                else:
                    data = []
                message['data'] = data
            except Exception as e:
                print(e)
                message['message'] = "查询错误"
            finally:
                session.close()
        except TypeError:
            message['message'] = "参数错误"
    else:
        raise TypeError("参数只能是str或者int")
        message['message'] = "参数类型错误"
    return message
Exemple #8
0
def up_down(**kwargs):
    """赞和踩"""
    message = {"message": "success"}
    up_down_str = kwargs.get("up_down_str")
    if up_down_str is None:
        message['message'] = 'error'
    else:
        kwargs.pop("up_down_str")
        if up_down_str == "up":
            kwargs['up_it'] = 1
            kwargs['down_it'] = 0
        else:
            kwargs['up_it'] = 0
            kwargs['down_it'] = 1
        kwargs['create_date'] = my_db.current_datetime()
        ses = my_db.sql_session()
        comment_id = kwargs['comment_id']
        only_id= kwargs['only_id']
        sql = "delete from up_down_info where comment_id={} and only_id='{}'".format(comment_id, only_id)
        ses.execute(sql)
        ses.commit()
        sql = my_db.structure_sql("add", "up_down_info", **kwargs)
        ses.execute(sql)
        ses.commit()
        ses.close()
    return message
Exemple #9
0
def change_status(the_type, user_id):
    """启用/禁用/删除账户 ,第一个参数是up/down/delete ,启用或者禁用,第二个是用户id"""
    message = {"message": "success"}
    if my_db.validate_arg(user_id) and my_db.validate_arg(the_type):
        if the_type.strip().lower() == "up":
            verb = "启用"
            sql = "update user_info set user_status=1 where user_id='{}'".format(
                user_id)
        elif the_type.strip().lower() == "delete":
            verb = "删除"
            sql = "delete from user_info where user_id='{}'".format(user_id)
        else:
            verb = "禁用"
            sql = "update user_info set user_status=0 where user_id='{}'".format(
                user_id)
        session = my_db.sql_session()
        try:
            session.execute(sql)
            session.commit()
        except Exception as e:
            print(e)
            message['message'] = "{}账户失败".format(verb)
        finally:
            session.close()
    else:
        message['message'] = "用户ID错误"
    return message
Exemple #10
0
def manage_topic(**kwargs):
    """用户对话题的管理"""
    message = {"message": "success"}
    try:
        the_type = kwargs.pop("the_type")
        if the_type == "add":
            """添加"""
            if kwargs['begin_date'] == "":
                kwargs['begin_date'] = my_db.current_datetime()
            if kwargs['end_date'] == "":
                kwargs['end_date'] = my_db.current_datetime(365)
            kwargs['can_show'] = 0
            sql = my_db.structure_sql("add", "topic_info", **kwargs)
            sql_session = my_db.sql_session()
            print(sql)
            sql_session.execute(sql)
            sql_session.commit()
            sql_session.close()

        elif the_type == "edit":
            pass
    except KeyError:
        message['message'] = "不理解的操作"
    except Exception as e:
        message['message'] = "数据库执行错误"
        print(e)
    finally:
        return message
Exemple #11
0
def index_topic_list():
    """获取首页的各频道的话题列表,返回的是是字典
    字典以channel_id为key,值是话题字典的数组,排序以优先级+发布时间来排序
    这里不包含置顶帖子,置顶帖子会在视图函数中与此结果重新组合。
    """
    cache = my_db.cache
    key = "index_topic_dict"
    index_topic_dict = cache.get(key)
    if index_topic_dict is None:
        """从数据库查询"""
        channel_id_list = [x['channel_id'] for x in channel_list()]
        current_date = my_db.current_datetime()
        index_topic_dict = dict()  # 结果集容器
        columns_str = "channel_id,class_id,top_id,top_title"
        columns = columns_str.split(",")
        columns.append('view_count')
        ses = my_db.sql_session()
        for channel_id in channel_id_list:
            """首页查询的结果将不会排除过期的话题/投票"""
            sql = "select {0},(select count(view_count.view_id) from view_count where " \
                  "topic_info.top_id=view_count.topic_id) from topic_info where can_show=1 " \
                  "and channel_id={1} " \
                  "order by create_date desc limit 0,5".format(columns_str, channel_id)
            proxy = ses.execute(sql)
            temp = proxy.fetchall()
            result = [dict(zip(columns, x)) for x in temp]
            index_topic_dict[channel_id] = result
        ses.close()
        """将字典按照左右两列排序,以帖子被浏览总数降序排列"""
        pass
        cache.set(key, index_topic_dict, timeout=60 * 1)

    return index_topic_dict
Exemple #12
0
def topic_detail_user(top_id):
    """用户根据id获取单个话题的详细内容,参数中必须要有一个top_id"""
    ses = my_db.sql_session()
    message = {'message': "success"}
    child_sql = "(SELECT CONCAT_WS(' vs ',SUM(support_a),SUM(support_b))  " \
                "FROM vote_count WHERE vote_count.topic_id=topic_info.top_id)"  # 查询ab支持度的子查询
    sql = "SELECT top_id,top_title,top_content,viewpoint_a,viewpoint_b,can_show,img_url_a,img_url_b," \
          "topic_info.channel_id,channel_info.channel_name,topic_info.class_id," \
          "class_info.class_name,end_date,begin_date," \
          "user_info.user_nickname,{} FROM topic_info,channel_info,class_info,user_info " \
          "WHERE user_info.user_id=topic_info.author " \
          "AND channel_info.channel_id=topic_info.channel_id and can_show=1 and " \
          "class_info.class_id=topic_info.class_id AND  " \
          "top_id='{}'".format(child_sql, top_id)
    columns = [
        'top_id', 'top_title', 'top_content', 'viewpoint_a', 'viewpoint_b',
        'can_show', 'img_url_a', 'img_url_b', 'channel_id', 'channel_name',
        'class_id', 'class_name', 'end_date', 'begin_date', 'author', "a_vs_b"
    ]
    proxy_result = ses.execute(sql)
    result = proxy_result.fetchone()
    result = my_db.str_format(result)
    ses.close()
    data = dict(zip(columns, result))
    message['data'] = data
    return message
Exemple #13
0
def fetch_joined_topics(user_id):
    """根据用户id获取参加过的话题"""
    session = my_db.sql_session()
    columns = get_columns()
    sql = "select * from topic_info where top_id in " \
          "(select topic_id from vote_count where user_id = {})" \
        .format(user_id)
    data = []
    try:
        proxy_result = session.execute(sql)
        result = proxy_result.fetchall()
        if len(result) != 0:
            result = [my_db.str_format(x) for x in result]
            data = [dict(zip(columns, x)) for x in result]
            for x in data:
                x.update({
                    "view_count": get_view_count(x['top_id']),
                    "vote_count": sum_vote_count(x['top_id'])
                })
        else:
            data = []
    except Exception as e:
        print(e)
    finally:
        session.close()
    return data
Exemple #14
0
def vote(**kwargs):
    """投票计数"""
    message = {"message": "success"}
    kwargs['create_date'] = my_db.current_datetime()
    sql = my_db.structure_sql("add", "vote_count", **kwargs)
    sql_session = my_db.sql_session()
    try:
        sql_session.execute(sql)
        sql_session.commit()
        """同步道缓存"""
        lock = RLock()
        lock.acquire()
        add_vote_cache(kwargs['topic_id'], kwargs['support_a'],
                       kwargs['support_b'])
        lock.release()
    except sqlalchemy.exc.IntegrityError as e1:
        """
        re.findall(r"for key '(.+?)'",str) 是从str中找到匹配以for key 'PRIMARY'")
        句子中的PRIMARY,findall方法返回的是数组
        """
        print(e1.args)
        error_cause = re.findall(r"for key '(.+?)'", e1.args[-1])[0]
        if error_cause == "only_once":
            message["message"] = "你已经投过票了"
        else:
            print(error_cause)
            message['message'] = "投票失败,请联系管理员"
    finally:
        sql_session.close()
    return message
Exemple #15
0
def check_wx(user_open_id):
    """根据用户微信id和密码获取信息"""
    message = {}
    session = my_db.sql_session()
    columns = get_columns()
    sql = "select " + ",".join(
        columns) + " from user_info where user_open_id='{}'".format(
            user_open_id)
    try:
        proxy_result = session.execute(sql)
        result = proxy_result.fetchone()
        if result is None:
            message['message'] = "not exists"
        else:
            result = my_db.str_format(result)
            result = dict(zip(columns, result))
            if result['user_status'] == 1:
                message["message"] = "exists"
                message['data'] = result
            else:
                message['message'] = "账户已冻结"
    except Exception as e:
        print(e)
        message['message'] = 'fail'
    finally:
        session.close()
    return message
Exemple #16
0
def login(admin_name, admin_password):
    """管理员登录"""
    message = {"message": "success"}
    if my_db.validate_arg(admin_name) and my_db.validate_arg(admin_password):
        session = my_db.sql_session()
        columns = get_columns()
        sql = "select " + ",".join(
            columns) + " from admin_info where admin_name='{}'".format(
                admin_name)
        try:
            proxy_result = session.execute(sql)
            result = proxy_result.fetchone()
            if result is None:
                message['message'] = "管理员账户不存在"
            else:
                result = my_db.str_format(result)
                result = dict(zip(columns, result))
                if admin_password.lower() == result['admin_password'].lower():
                    if result['admin_status'] == 1:
                        message['data'] = result
                    else:
                        message['message'] = "此管理员账户已禁用"
                else:
                    message["message"] = "密码错误"
        except Exception as e:
            print(e)
            message['message'] = '查询失败'
        finally:
            session.close()
    else:
        message['message'] = "参数错误"
    return message
Exemple #17
0
def comment_count():
    """统计所有评论的数量"""
    sql_session = my_db.sql_session()
    sql = "select count(1) from comment_info"
    proxy = sql_session.execute(sql)
    result = proxy.fetchone()[0]
    sql_session.close()
    return result
Exemple #18
0
def save_class(small_class_dict):
    """保存类别信息,目前只能增加和修改,不能删除类别"""
    old_dict_raw = get_cache("small_class_dict")
    new_dict = small_class_dict
    add_list = list()  # 存放插入的小类的数组
    update_list = list()  # 存放更新的小类的数组
    drop_list = list()  # 存放删除的小类的id的数组
    old_list = []
    for k, v in old_dict_raw.items():
        for i in v:
            temp = {
                "channel_id": k,
                "class_id": i['class_id'],
                "class_name": i['class_name']
            }
            old_list.append(temp)
    new_list = [{
        "channel_id": new_dict[key]['channel_id'],
        "class_id": new_dict[key]['class_id'],
        "class_name": key
    } for key in new_dict.keys()]
    if len(new_list) == 0:
        return {"message": "success"}
    else:
        new_keys = [x['class_id'] for x in new_list]
        drop_list = [
            x['class_id'] for x in old_list
            if str(x['class_id']) not in new_keys
        ]
        old_keys = [x['class_id'] for x in old_list]
        for x in new_list:
            if x['class_id'] == "":
                add_list.append(x)
            else:
                update_list.append(x)
        sql_session = my_db.sql_session()
        if len(drop_list) > 0:
            for x in drop_list:
                sql = my_db.structure_sql("delete", "class_info",
                                          "where class_id={}".format(x))
                sql_session.execute(sql)
            sql_session.commit()
        if len(update_list) > 0:
            for x in update_list:
                class_id = x.pop("class_id")
                sql = my_db.structure_sql("edit", "class_info",
                                          "where class_id={}".format(class_id),
                                          **x)
                sql_session.execute(sql)
            sql_session.commit()
        if len(add_list) > 0:
            for x in add_list:
                x.pop("class_id")
                sql = my_db.structure_sql("add", "class_info", **x)
                sql_session.execute(sql)
            sql_session.commit()
        sql_session.close()
        return {"message": "success"}
Exemple #19
0
def add(user_id, detail):
    """对某个用户添加一个新的消息通知。
    当遇到评论过千、审核通过时,调用此方法将消息写入数据库。
    detail为通知的详细内容。"""
    session = my_db.sql_session()
    sql = "insert into zvoter.notification (`user_id`, `detail`, `read`, `date`) values ('{}', '{}', {}, '{}')".\
        format(user_id, detail, 0, my_db.current_datetime())
    session.execute(sql)
    session.commit()
Exemple #20
0
def __get_view_count(topic_id):
    """低级,根据话题id获取话题的浏览人数"""
    sql = "select count(1) from view_count where topic_id='{}'".format(
        topic_id)
    ses = my_db.sql_session()
    proxy = ses.execute(sql)
    result = proxy.fetchone()[0]
    ses.close()
    return result
Exemple #21
0
 def __init__(self):
     """使用数据库中最大的手机号码初始化内部存储的伪手机号码值"""
     session = my_db.sql_session()
     sql = "SELECT MAX(user_phone) FROM zvoter.user_info"
     result = session.execute(sql)
     if result is not None:
         maxphone = int(result.fetchone()[0])
         if self.dumb_phone_num < maxphone:
             self.dumb_phone_num = maxphone
Exemple #22
0
def __get_banner():
    """低级方法从数据库查询所有的banner配置信息,返回字典的数组"""
    sql = "select {} from banner_info order by order_index".format(column_str)  # 以人工排序
    ses = my_db.sql_session()
    proxy = ses.execute(sql)
    result = proxy.fetchall()
    columns = column_str.split(",")
    result = [dict(zip(columns, x)) for x in result]
    ses.close()
    return result
Exemple #23
0
def __add_view_count(topic_id, only_id, from_ip, browser_type):
    """低级方法。对页面浏览进行计数"""
    message = {'message': "success"}
    sql = "insert into view_count(topic_id,only_id,from_ip,browser_type,create_date) " \
          "values('{0}','{1}','{2}','{3}','{4}')".format(topic_id, only_id, from_ip,
                                                         browser_type, my_db.current_datetime())
    ses = my_db.sql_session()
    ses.execute(sql)
    ses.commit()
    ses.close()
    return message
Exemple #24
0
def __get_vote_count(topic_id):
    """低级方法。根据话题id获取相关的投票人数"""
    message = {'message': "success"}
    sql = "select sum(vote_count.support_a),sum(vote_count.support_b) from vote_count " \
          "where vote_count.topic_id='{}'".format(topic_id)
    ses = my_db.sql_session()
    proxy = ses.execute(sql)
    result = list(proxy.fetchone())
    ses.close()
    message['support_a'] = result[0]
    message['support_b'] = result[1]
    return message
Exemple #25
0
def manage_keywords(**kwargs):
    """对搜索热词,keywords,title,description的操作"""
    message = {"message": "success"}
    ses = my_db.sql_session()
    try:
        the_type = kwargs.pop('the_type')
        if the_type == "add":
            sql = my_db.structure_sql("add", 'key_word_info', kwargs)
            ses.execute(sql)
            ses.commit()
        elif the_type == 'delete':
            try:
                key_word_id = kwargs['key_word_id']
                try:
                    key_word_id = int(key_word_id)
                    sql = 'select key_word_id from key_word_info'
                    proxy = ses.execute(sql)
                    result = [x[0] for x in proxy.fetchall()]
                    if key_word_id not in result:
                        message['message'] = '错误的id'
                    else:
                        sql = "delete from key_word_info where key_word_id={}".format(key_word_id)
                        ses.execute(sql)
                        ses.commit()
                except ValueError:
                    raise ValueError("待删除id格式错误")
                    message['message'] = '待删除id格式错误'
            except KeyError:
                raise KeyError("删除key_word_info没有找到key_word_id")
                message['message'] == '待删除id无效'
        elif the_type == 'edit':
            key_word_id = kwargs.get('key_word_id')
            if key_word_id is None:
                message['message'] = '没有key_word_id'
            else:
                if key_word_id.isdigit():
                    adict = {k: v for k, v in kwargs.items() if v != "" or v is not None}
                    sql = my_db.structure_sql("edit", "key_word_info", "where key_word_id={}".format(key_word_id),
                                              **adict)
                    ses.execute(sql)
                    ses.commit()
                else:
                    message['message'] = 'id非法'

    except KeyError:
        raise KeyError("the_type参数不存在")
        message['message'] = '操作类型错误'
    finally:
        ses.close()
        FromDB.yes("key_word_info")  # 提醒要从数据库重新加载banner数据,参数为表明
        return message
Exemple #26
0
def get_columns(first=False):
    """获取所有的user_info表的列名,只在启动程序时运行一次,参数
    first是代表是否第一次启动,如果第一次启动要强制重新加载列名"""
    redis_client = my_db.MyRedis.redis_client()
    value = redis_client.get("notification_columns")
    if value is None or first:
        sql = "SHOW columns FROM notification"
        session = my_db.sql_session()
        proxy_result = session.execute(sql)
        session.close()
        result = proxy_result.fetchall()
        value = json.dumps([x[0] for x in result]).encode()
        redis_client.set('notification', value)
    return json.loads(value.decode())
Exemple #27
0
def get_class_list():
    """获取所有的小类信息,高级方法。from_db代表是否直接从数据读读取返回的是以
    [{"class_id":class_id,"class_name:class_name},'...]这样字典的数组
    """
    cache = my_db.cache
    key = "small_class_list"
    data = cache.get(key)
    if data is None:
        sql = "SELECT class_id,class_name FROM class_info"
        ses = my_db.sql_session()
        proxy = ses.execute(sql)
        result = proxy.fetchall()
        ses.close()
        data = [dict(zip(['class_id', 'class_name'], x)) for x in result]
        cache.set(key, data, timeout=60 * 15)
    return data
Exemple #28
0
def check_phone_registered(phone):
    """查看手机号是否被注册"""
    session = my_db.sql_session()
    columns = get_columns()
    sql = "select " + ",".join(
        columns) + " from user_info where user_phone='{}'".format(phone)
    try:
        proxy_result = session.execute(sql)
        result = proxy_result.fetchone()
        if result is None:
            return False
        else:
            return True
    except Exception as e:
        return True
    finally:
        session.close()
Exemple #29
0
def save_channel(channel_dict):
    """保存频道信息"""
    new_dict = channel_dict
    if new_dict:
        sql_session = my_db.sql_session()()
        for k, v in new_dict:
            sql = my_db.structure_sql("edit",
                                      "channel_info",
                                      "where channel_id={}".format(k),
                                      channel_name=v)
            sql_session.execute(sql)
        sql_session.commit()
        sql_session.close()
        return True
    else:
        raise ValueError("频道信息错误")
        return False
Exemple #30
0
def get_channel():
    """获取所有频道,低级方法"""
    channel_sql = "SELECT channel_id,channel_name,channel_img_url FROM channel_info"
    sql_session = my_db.sql_session()
    proxy_result = sql_session.execute(channel_sql)
    channel_result = proxy_result.fetchall()
    sql_session.close()
    if len(channel_result) == 0:
        channel_dict = dict()
    else:
        channel_dict = [{
            "channel_id": x[0],
            "channel_name": x[1],
            "channel_img_url": x[2]
        } for x in channel_result]
    set_cache("channel_list", channel_dict)
    return channel_dict