Exemple #1
0
def reset_user_password(user_name, email):
    """
    用户重置密码
    :param user_name: 用户名
    :param email: 邮箱
    :return:
    """
    recipient = email
    subject = "reset password"
    # 重新生成8位长度的密码
    from tool.util import random_str
    new_password = random_str()
    content = "您的新密码: " + new_password + "\n请在24小时内修改默认密码!"

    print recipient, subject, content

    if recipient and subject and content:
        from lib.email import mailnotify
        mbres = mailnotify.send_notifymail(recipient, subject, content)
        if not mbres:
            return False, "发送失败"
    else:
        return False, "请求参数不正确"
    # 邮件发送成功
    # 更新用户密码, 添加用户重置记录

    db_manager = DBManager()
    password = hashlib.sha224(new_password).hexdigest()
    sql0 = "update `%s` set password='******' where username='******'" % ("tb_account", password, user_name)
    cursor0 = db_manager.conn_r.cursor()
    try:
        cursor0.execute(sql0)
        db_manager.conn_r.commit()
        cursor0.close()
    except Exception:
        db_manager.conn_r.rollback()
        cursor0.close()
        db_manager.close()
        raise Exception
        return False, "密码更新失败"

    sql1 = "insert into `%s` (username, reset_time) values ('%s', '%s')" % ("tb_reset", user_name, time_now_str())
    cursor1 = db_manager.conn_r.cursor()
    try:
        cursor1.execute(sql1)
        db_manager.conn_r.commit()
        cursor1.close()
    except Exception:
        db_manager.conn_r.rollback()
        cursor1.close()
        db_manager.close()
        raise Exception
        return False, "添加重置记录失败"
    db_manager.close()
    is_success = True

    result = dict()
    result['new_password'] = new_password
    return is_success, result
Exemple #2
0
def login(username, password, identifier):
    """
    用户登录 (学生, 教师登录入口)
    :param username: 用户名
    :param password: 密码
    :return:
    """
    password = hashlib.sha224(password).hexdigest()
    db_manager = DBManager()
    sql = "select *from `tb_account` as ta inner join `tb_user` as tu on ta.username=tu.username and ta.username='******'" \
          " and ta.password='******' and tu.identifier=%s" % (username, password, identifier)
    cursor_0 = db_manager.conn_r.cursor()
    cursor_0.execute(sql)
    result = cursor_0.fetchone()
    cursor_0.close()
    is_ok = False
    data = None
    if result:
        # 是否为新用户登录
        is_new_user = False
        sql = "select *from `%s` where username='******'" % ("tb_user_log", username)
        cursor_0 = db_manager.conn_r.cursor()
        cursor_0.execute(sql)
        result_0 = cursor_0.fetchone()
        cursor_0.close()
        if result_0 is None:
            is_new_user = True
        cursor0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
        sql0 = "select *from `%s` where username='******'" % ("tb_user", username)
        cursor0.execute(sql0)
        result0 = cursor0.fetchone()
        cursor0.close()
        is_ok = True
        data = result0
        # 拿到签到数据
        sql1 = "select *from `%s` where username='******' and to_days(sign_time)=to_days(now())" % ("tb_sign", username)
        cursor1 = db_manager.conn_r.cursor()
        cursor1.execute(sql1)
        result1 = cursor1.fetchone()
        cursor1.close()
        has_sign_today = 0
        if result1 is not None:
            has_sign_today = 1
        data['has_sign_today'] = has_sign_today
        # 如果是新用户登录, 更新积分
        if is_new_user:
            user_operation_type = 1
            sql2 = "select score_points from `%s` where user_operation_type=%s" % ("tb_score_rule_template",
                                                                                   user_operation_type)
            cursor2 = db_manager.conn_r.cursor(cursorclass=DictCursor)
            cursor2.execute(sql2)
            result2 = cursor2.fetchone()
            point_value = result2['score_points']
            sql_0 = "insert into `%s` (username, point_type, point_value) values ('%s', %s, %s) ON DUPLICATE KEY UPDATE" \
                    " point_value=point_value+VALUES(point_value)" % ("tb_user_points", username, user_operation_type,
                                                                      point_value)
            try:
                cursor2 = db_manager.conn_r.cursor()
                cursor2.execute(sql_0)
                db_manager.conn_r.commit()
                cursor2.close()
            except Exception:
                db_manager.conn_r.rollback()
                cursor2.close()
                db_manager.close()
                raise Exception
        # 记录用户登录日志
        sql_0 = "insert into `%s` (username, login_time) values ('%s', '%s') ON DUPLICATE KEY UPDATE" \
            " login_time=login_time" % ("tb_user_log", username, time_now_str())
        cursor1 = db_manager.conn_r.cursor()
        try:
            cursor1.execute(sql_0)
            db_manager.conn_r.commit()
            cursor1.close()
        except Exception:
            db_manager.conn_r.rollback()
            cursor1.close()
            db_manager.close()
            raise Exception
    db_manager.close()
    return is_ok, data
Exemple #3
0
def ask_question(username, answer_id, ask_content, original_question_id, be_asked_username, options=None):
    """
    用户追问
    :param username: 用户名
    :param answer_id: 回答的ID
    :param ask_content: 追问内容
    :param original_question_id: 原问题ID
    :param be_asked_username: 被追问的用户
    :return:
    """
    db_manager = DBManager()
    # 问题是否已经被解决
    sql_0 = "select question_status from `%s` where question_id=%s" % ("tb_question", original_question_id)
    cursor_0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
    cursor_0.execute(sql_0)
    result_0 = cursor_0.fetchone()
    cursor_0.close()
    if result_0 is None:
        return False, "问题不存在"
    question_status = result_0['question_status']
    # 问题已经被解决
    if question_status == 1:
        return False, "问题已经被解决"
    # 检验被提问的用户是否回答过该问题
    sql_0 = "select *from `tb_answer` where answer_username='******' and question_id=%s" % (be_asked_username,
                                                                                        original_question_id)
    cursor_0 = db_manager.conn_r.cursor()
    cursor_0.execute(sql_0)
    result_0 = cursor_0.fetchone()
    cursor_0.close()
    if result_0 is None or len(result_0) == 0:
        return False, "没有回答该问题"

    # 拿到追问顺序ask_order
    sql_1 = "select max(ask_order) as ask_order0 from `tb_ask` where be_asked_username='******' and original_question_id=" \
            "%s" % (be_asked_username, original_question_id)
    cursor_1 = db_manager.conn_r.cursor(cursorclass=DictCursor)
    cursor_1.execute(sql_1)
    result_1 = cursor_1.fetchone()
    cursor_1.close()
    if result_1 is None or len(result_1) == 0:
        ask_order = 0
    else:
        ask_order = result_1['ask_order0'] if result_1['ask_order0'] else 0
    # 添加一条追问记录
    props = dict()
    props['ask_content'] = ask_content
    props['ask_time'] = time_now_str()
    props['original_question_id'] = original_question_id
    props['be_asked_username'] = be_asked_username
    props['ask_order'] = ask_order + 1
    props['answer_id'] = answer_id

    if options:
        assert isinstance(options, dict)
        props.update(options)

    insert_sql = forEachPlusInsertProps("tb_ask", props)
    msg0 = "[in ask_question] insert_sql=" + insert_sql
    logging.info(msg0)
    cursor_2 = db_manager.conn_r.cursor()
    try:
        cursor_2.execute(insert_sql)
        db_manager.conn_r.commit()
        cursor_2.close()
    except Exception:
        db_manager.conn_r.rollback()
        cursor_2.close()
        db_manager.close()
        raise Exception
    db_manager.close()
    return True, ""
Exemple #4
0
def answer_question(username, question_id, answer_content, is_original_answer, options=None):
    """
    回答问题
    :param username: 用户名
    :param question_id: 问题ID
    :param answer_content: 回答内容
    :param is_original_answer: 是否是原回答(1: 原回答 0: 追答)
    :return:
    """
    db_manager = DBManager()
    # 判断用户是否有权限回答问题
    sql0 = "select *from `%s` where username='******'" % ("tb_user", username)
    cursor0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
    cursor0.execute(sql0)
    result0 = cursor0.fetchone()
    cursor0.close()
    if result0 is None:
        return False, "用户不存在"
    identifier = result0['identifier']
    if identifier != 1:
        return False, "没有回答权限"
    original_question_id = question_id
    # 如果是追答
    if is_original_answer == 0:
        # 拿到问题原始ID
        sql_0 = "select original_question_id from `%s` where ask_question_id=%s" % ("tb_ask", question_id)
        cursor_0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
        cursor_0.execute(sql_0)
        result_0 = cursor_0.fetchone()
        cursor_0.close()
        if result_0 is None:
            return False, "问题不存在"
        original_question_id = result_0['original_question_id']
    # 问题是否已经被解决
    sql_0 = "select question_status from `%s` where question_id=%s" % ("tb_question", original_question_id)
    cursor_0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
    cursor_0.execute(sql_0)
    result_0 = cursor_0.fetchone()
    cursor_0.close()
    if result_0 is None:
        return False, "问题不存在"
    question_status = result_0['question_status']
    # 问题已经被解决
    if question_status == 1:
        return False, "问题已经被解决"

    props = dict()
    props['answer_username'] = username
    props['answer_time'] = time_now_str()
    props['question_id'] = question_id
    props['is_accepted'] = 0
    props['answer_content'] = answer_content

    if options:
        assert isinstance(options, dict)
        props.update(options)

    sql = forEachPlusInsertProps("tb_answer", props)
    msg = "[in answer_question] sql=" + sql
    logging.info(msg)
    cursor = db_manager.conn_r.cursor()
    try:
        cursor.execute(sql)
        db_manager.conn_r.commit()
        cursor.close()
    except Exception:
        db_manager.conn_r.rollback()
        cursor.close()
        db_manager.close()
        raise Exception
    # 更新用户积分 (只有原始问题的回答加分, 追答不加分)
    if is_original_answer == 1:
        user_operation_type = 4
        sql2 = "select score_points from `%s` where user_operation_type=%s" % ("tb_score_rule_template", user_operation_type)
        cursor2 = db_manager.conn_r.cursor(cursorclass=DictCursor)
        cursor2.execute(sql2)
        result2 = cursor2.fetchone()
        point_value = result2['score_points']
        sql_0 = "insert into `%s` (username, point_type, point_value) values ('%s', %s, %s) ON DUPLICATE KEY UPDATE" \
                " point_value=point_value+VALUES(point_value)" % ("tb_user_points", username, user_operation_type,
                                                                  point_value)
        msg_110 = "[in answer_question refresh user points] sql_0=" + sql_0
        logging.info(msg_110)
        try:
            cursor2 = db_manager.conn_r.cursor()
            cursor2.execute(sql_0)
            db_manager.conn_r.commit()
            cursor2.close()
        except Exception:
            db_manager.conn_r.rollback()
            cursor2.close()
            db_manager.close()
            raise Exception
            return False
    db_manager.close()
    return True, "回答成功"
Exemple #5
0
def connect_question(username, question_id):
    """
    收藏问题
    :param username: 用户名
    :param question_id: 问题ID
    :return:
    """
    db_manager = DBManager()
    # 问题是否存在
    sql0 = "select *from `%s` where question_id=%s" % ("tb_question", question_id)
    cursor0 = db_manager.conn_r.cursor()
    cursor0.execute(sql0)
    result0 = cursor0.fetchone()
    cursor0.close()
    if result0 is None:
        return False, "问题不存在"
    # 查询是否收藏过该问题
    sql0 = "select *from `%s` where collecter_username='******' and question_id=%s" % ("tb_question_collection",
                                                                                   username, question_id)
    cursor0 = db_manager.conn_r.cursor()
    cursor0.execute(sql0)
    result0 = cursor0.fetchone()
    cursor0.close()
    if result0 is not None:
        return False, "已收藏过该问题"
    sql = "insert into `%s` (question_id, collecter_username, collect_time) values (%s, '%s', '%s')" % ("tb_question_collection",
                                                                                    question_id, username, time_now_str())
    msg = "[in connect_question] sql=" + sql
    logging.info(msg)
    cursor = db_manager.conn_r.cursor()
    try:
        cursor.execute(sql)
        db_manager.conn_r.commit()
    except Exception:
        db_manager.conn_r.rollback()
        raise Exception
    db_manager.close()
    return True, ""
Exemple #6
0
def post_question(username, grade, subject, question_content, question_score=0, options=None):
    """
    用户提问
    :param username: 用户名
    :param grade: 年级
    :param subject: 学科
    :param question_content: 问题内容
    :param question_score: 悬赏积分
    :param options: 可变字段
    :return:
    """
    db_manager = DBManager()
    # 判断用户是否有权限提问
    sql0 = "select *from `%s` where username='******'" % ("tb_user", username)
    cursor0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
    cursor0.execute(sql0)
    result0 = cursor0.fetchone()
    cursor0.close()
    if result0 is None:
        return False
    identifier = result0['identifier']
    if identifier != 0:
        return False
    # 客户端提交的问题内容为空
    if question_content is None or question_content == '':
        # 获取随机问题内容 (随机数的上限取决于后期配置的模板表的大小)
        # 拿到模板表的大小
        template_size = 0
        sql0 = "select count(*) as counts from `%s`" % "tb_question_content_template"
        cursor0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
        cursor0.execute(sql0)
        result0 = cursor0.fetchone()
        cursor0.close()
        if result0:
            template_size = result0['counts']
        if template_size < 1:
            return False
        r_index = randint(1, template_size)
        sql0 = "select *from `%s` where content_id=%s" % ("tb_question_content_template", r_index)
        cursor0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
        cursor0.execute(sql0)
        result0 = cursor0.fetchone()
        cursor0.close()
        if result0:
            question_content = result0['content_value']

    # 拿到插入的数据
    props = dict()
    props['question_username'] = username
    props['question_content'] = question_content
    props['question_score'] = question_score
    props['question_grade'] = grade
    props['question_subject'] = subject
    props['question_time'] = time_now_str()
    props['question_status'] = 0

    if options:
        assert isinstance(options, dict)
        props.update(options)

    sql = forEachPlusInsertProps("tb_question", props)
    msg = "[in post_question] sql=" + sql
    logging.info(msg)
    cursor = db_manager.conn_r.cursor()
    try:
        cursor.execute(sql)
        db_manager.conn_r.commit()
    except Exception:
        db_manager.conn_r.rollback()
        raise Exception
    # 提问成功, 更新积分
    # 更新用户积分
    user_operation_type = 2
    sql2 = "select score_points from `%s` where user_operation_type=%s" % ("tb_score_rule_template", user_operation_type)
    cursor2 = db_manager.conn_r.cursor(cursorclass=DictCursor)
    cursor2.execute(sql2)
    result2 = cursor2.fetchone()
    point_value = result2['score_points'] - question_score
    if point_value >= 0:
        sql_0 = "insert into `%s` (username, point_type, point_value) values ('%s', %s, %s) ON DUPLICATE KEY UPDATE" \
                " point_value=point_value+VALUES(point_value)" % ("tb_user_points", username, user_operation_type,
                                                                  point_value)
    else:
        # 查询是否存在记录
        sql_110 = "select *from `%s` where username='******' and point_type=%s" % ("tb_user_points", username,
                                                                               user_operation_type)
        cursor_0 = db_manager.conn_r.cursor(cursorclass=DictCursor)
        cursor_0.execute(sql_110)
        result_110 = cursor_0.fetchone()
        cursor_0.close()
        if result_110:
            point_value += result_110['point_value']
            sql_0 = "update `%s` set point_value=%s where username='******' and point_type=%s" % \
                    ("tb_user_points", point_value, username, user_operation_type)
        else:
            sql_0 = "insert into `%s` (username, point_type, point_value) values ('%s', %s, %s)" % \
                    ("tb_user_points", username, user_operation_type, point_value)
    msg_110 = "[in post_question refresh user points] sql_0=" + sql_0
    logging.info(msg_110)
    try:
        cursor2 = db_manager.conn_r.cursor()
        cursor2.execute(sql_0)
        db_manager.conn_r.commit()
        cursor2.close()
    except Exception:
        db_manager.conn_r.rollback()
        cursor2.close()
        db_manager.close()
        raise Exception
        return False
    db_manager.close()
    return True