def to_collection_model(user_id, book_id, is_clear=False): """添加、取消收藏""" conn = ToMongo() if is_clear: result = False query = {'_id': str(user_id), 'book_ids.book_id': {'$in': [book_id]}} ret = conn.update('favorites', query, {'$pull': { 'book_ids': { 'book_id': book_id } }}) if ret.modified_count: result = True else: result = False query = {'_id': str(user_id), 'book_ids.book_id': {'$nin': [book_id]}} ret = conn.update('favorites', query, { '$push': { 'book_ids': { 'book_id': book_id, 'create_time': get_now() } } }) if ret.modified_count: result = True conn.close_conn() return result
def add_visits(user_id): """访问量加1函数""" db_conn = ToMongo() dawn_timestamp = get_dawn_timestamp() last_date = db_conn.get_col('visits').aggregate([{ '$group': { '_id': '$_id', 'day': { '$last': '$date' } } }]) date_list = list(last_date) # 不为空 if date_list: # 同一天加入 if date_list[0]['day'] == get_dawn_timestamp(): db_conn.update('visits', {'_id': date_list[0]['_id']}, {'$addToSet': { 'users_id': user_id }}) else: # 不是同一天,插入新的文档 db_conn.insert('visits', { 'date': dawn_timestamp, 'users_id': [user_id] }) else: # 为空也插入 db_conn.insert('visits', { 'date': dawn_timestamp, 'users_id': [user_id] })
def get_book(id, query_off_shelf=True): """获取图书信息""" mydb = ToMongo() mycol = mydb.get_col('books') if query_off_shelf: book = mycol.find_one({'_id': ObjectId(id), 'is_off_shelf': 0}) else: book = mycol.find_one({'_id': ObjectId(id)}) # 添加点击量 mydb.update('books', {'_id': ObjectId(id)}, {'$inc': {'hits': 1}}) mydb.close_conn() return book
def add_history(user_id, book_id): """添加浏览历史""" conn = ToMongo() query = {'_id': str(user_id), 'book_ids': {'$nin': [book_id]}} ret = conn.update('history', query, {'$push': {'book_ids': book_id}}) conn.close_conn() if ret: return ret.modified_count
def evaluate_model(user_id, user_name, request, book_ids): """用户评论模型""" rlt = {} order_no = request.get('order_no') star = int(request.get('star')) context = request.get('context') anonymous = request.get('anonymous') if not star: rlt['error'] = '评分不能为空' return rlt img_path = '' create_time = get_now() if anonymous: user_name = user_name[0] + '**' else: user_name = user_name[0] + '*' + user_name[-1] id_list = [] mydb = ToMongo() for book_id in book_ids: value = {'$addToSet': {'comment': {'order_no': order_no, 'star': star, 'context': context, 'user_id': user_id, 'user_name': user_name, 'img_path': img_path, 'create_time': create_time } } } result = mydb.update('evaluate', {'_id': ObjectId(book_id)}, value) if result.modified_count: id_list.append(result.modified_count) else: # 无评论时,直接插入 rel = mydb.insert('evaluate', {'_id': ObjectId(book_id), 'comment': [ {'order_no': order_no, 'star': star, 'context': context, 'user_id': user_id, 'user_name': user_name, 'img_path': img_path, 'create_time': create_time } ] }) id_list.append(rel.inserted_id) # print(id_list) if len(id_list) != len(book_ids): # print(id_list) rlt['error'] = '评论失败,请重试!' mydb.close_conn() return rlt
def refund_model(order_no, user_id): """用户申请退款""" mydb = ToMongo() query = {'order_no': order_no, 'user_id': user_id} new = {'$set': {'orders_status': 6}} rel = mydb.update('order', query, new) mydb.close_conn() if rel and rel.modified_count: return rel.modified_count
def update_status(order_no): """更新订单状态为交易完成""" mydb = ToMongo() result = mydb.update('order', {'order_no': order_no}, {'$set': { 'orders_status': 4 }}) mydb.close_conn() return result.modified_count
def clear_history_model(user_id): """清除浏览记录""" conn = ToMongo() result = False query = {'_id': str(user_id)} ret = conn.update('history', query, {'$set': {'book_ids': []}}) if ret.modified_count: result = True conn.close_conn() return result
def add_hits_cf(user_id, book_id): conn = ToMongo() result = conn.update('hits_data', { '_id': str(user_id), 'book_ids': { '$nin': [book_id] } }, {'$push': { 'book_ids': book_id }}) conn.close_conn()
def update_status_user_id(order_no, user_id): """更新订单状态为待评论""" mydb = ToMongo() result = mydb.update('order', { 'order_no': order_no, 'user_id': user_id }, {'$set': { 'orders_status': 3 }}) mydb.close_conn() return result.modified_count
def cancel_model(order_no, user_id): """用户取消订单""" mydb = ToMongo() # 还原物品库存 query = {'order_no': order_no, 'user_id': user_id} restore_stock(query, mydb) # 更改订单状态 query = {'order_no': order_no, 'user_id': user_id} new = {'$set': {'orders_status': 5}} rel = mydb.update('order', query, new) mydb.close_conn() return rel.modified_count
def admin_login_model(email, password): result = {} conn = ToMongo() admin = conn.get_col('admin').find_one({'email': email, 'is_effective': 1}) if admin: # 用户名正确 if admin['sign_count'] >= 5 and get_now() - admin['last_signIn_time'] < FROZEN_TIME: result['error'] = '请 {}秒 后再重试'.format(FROZEN_TIME - (get_now() - admin['last_signIn_time'])) conn.close_conn() return result else: if check_password_hash(admin['password'], password): # 成功 conn.update('admin', {'email': admin.get('email')}, {'$set': {'sign_count': 0, 'last_signIn_time': get_now()}}) result['admin'] = admin conn.close_conn() return result else: # 失败 conn.update('admin', {'email': admin.get('email')}, {'$inc': {'sign_count': 1}}) conn.update('admin', {'email': admin.get('email')}, {'$set': {'last_signIn_time': get_now()}}) error = '邮箱地址或密码错误!剩余 {} 次'.format(5 - (admin['sign_count'] + 1)) result['error'] = error conn.close_conn() return result else: # 用户名错误 result['error'] = '邮箱地址或密码错误!' conn.close_conn() return result
def search_book_model(word, page, page_size): """搜索图书""" db_conn = ToMongo() # 如果输入不为空 if word: first_type = db_conn.get_col('books').find().distinct('first_type') if word in first_type: books, count = get_like_books(word, page, page_size, book_type=True) else: # 添加关键字数据到数据库,用与绘制词云图 db_conn.update('keyword', {'_id': 'keyword'}, {'$inc': {word: 1}}) books, count = get_like_books(word, page, page_size) # 如果输入为空,则显示点击量前十的 else: books = db_conn.get_col('books').find({ 'is_off_shelf': 0 }).sort('hits', -1).skip((page - 1) * page_size).limit(page_size) count = db_conn.get_col('books').find({'is_off_shelf': 0}).count() db_conn.close_conn() return books, count
def user_delete_order(user_id, order_no): """用户删除单个订单""" rel = False db_conn = ToMongo() result = db_conn.update('order', { 'order_no': order_no, 'user_id': user_id }, {'$set': { 'is_effective': 0 }}) if result.modified_count: # 删除成功 rel = True db_conn.close_conn() return rel
def to_delete_collection(user_id, ids): conn = ToMongo() result = False query = {'_id': str(user_id)} ret = conn.update('favorites', query, {'$pull': { 'book_ids': { 'book_id': { '$in': ids } } }}) if ret.modified_count: result = True conn.close_conn() return result
def update_status_to_5(): """将过期订单,状态更新为失效""" mydb = ToMongo() query = { 'orders_status': 0, 'create_time': { '$lt': get_now() - ORDER_EFFECTIVE_TIME }, } # 恢复库存 orders = mydb.get_col('order').find(query) for order in orders: order_no = order.get('order_no') query = {'order_no': order_no} restore_stock(query, mydb) # 更新订单状态 new = {'$set': {'orders_status': 5}} result = mydb.update('order', query, new, is_one=False) mydb.close_conn() return result.modified_count
def edit_addr_model(user_id, request): rel = False name = request.form.get('name') tel = request.form.get('tel') address_list = request.form.get('address').strip().split(' ') details = request.form.get('details') _id = request.form.get('_id') db_conn = ToMongo() result = db_conn.update('address', {'_id': ObjectId(_id)}, { "$set": { 'name': name, 'tel': tel, 'province': address_list[0], 'city': address_list[1], 'district': address_list[2], 'details': details } }) if result.modified_count: rel = True result = db_conn.get_col('address').find({'user_id': user_id}) db_conn.close_conn() return rel, result
def clear_user_count(admin): conn = ToMongo() result = conn.update('admin', {'email': admin.get('email')}, {'$set': {'sign_count': 0}}) conn.close_conn() return result.modified_count
def to_pay_model(user_id, book_ids, addr_id, is_buy_now): """去支付""" DISCOUNT = 1.01 create_time = int(time.time()) order_no = create_orders() books = [] amount = .0 # 获取收货地址,写入订单号详情 db_conn = ToMongo() address = db_conn.get_col('address').find_one({ 'user_id': user_id, '_id': ObjectId(addr_id) }) for book_id in book_ids: book = get_book(book_id, False) if not is_buy_now: db = ToConn() sql = 'select book_num from cart where user_id=%s and book_id=%s and is_effe=1' book_num = db.get_db(sql, (user_id, book_id)).fetchone() if book_num: books.append({ 'book_num': int(book_num['book_num']), 'book_id': book_id }) amount += (float(book.get('price')) * int(book_num['book_num'])) else: books.append({'book_num': 1, 'book_id': book_id}) amount += (float(book.get('price')) * 1) else: books.append({'book_num': 1, 'book_id': book_id}) amount += (float(book.get('price')) * 1) v = { "amount": amount - DISCOUNT, "books": books, "order_no": order_no, "is_processed": 0, "user_id": user_id, "create_time": create_time, "is_effective": 1, "address": address, "orders_status": 0, "pay_status": 0, "exp_status": 0, "logistics": [], # 物流信息 } result = db_conn.insert('order', v) if result and not is_buy_now: db = ToConn() conn = db.to_execute() cursor = conn.cursor() try: for book_id in book_ids: sql = 'delete from cart where user_id=%s and book_id=%s' cursor.execute(sql, (user_id, book_id)) except Exception as e: print('========to_pay=========事务处理失败:', e) conn.rollback() # 事务回滚 else: conn.commit() # 事务提交 for book in books: # 销量加 db_conn.update('books', {'_id': ObjectId(book.get('book_id'))}, {'$inc': { 'sales': book.get('book_num') }}) # 库存减 db_conn.update('books', {'_id': ObjectId(book.get('book_id'))}, {'$inc': { 'stock': -book.get('book_num') }}) db.to_close() elif is_buy_now: for book in books: # 销量加 db_conn.update('books', {'_id': ObjectId(book.get('book_id'))}, {'$inc': { 'sales': book.get('book_num') }}) # 库存减 db_conn.update('books', {'_id': ObjectId(book.get('book_id'))}, {'$inc': { 'stock': -book.get('book_num') }}) db_conn.close_conn() return order_no
def evaluate_model(user_id, user_name, request): """用户评论模型""" rlt = {} order_no = request.form.get('order_no') if int(get_order_status(order_no)) == 4: rlt['error'] = '已评论!' return rlt star = int(request.form.get('star')) context = request.form.get('context') anonymous = request.form.get('anonymous') img = request.files.get('img') if not star: rlt['error'] = '评分不能为空' return rlt if img: img_path = save_img(order_no, img) else: img_path = '' create_time = get_now() book_ids = get_book_id(order_no) if anonymous: user_name = user_name[0] + '**' elif user_name is None: user_name = '***' else: user_name = user_name[0] + '*' + user_name[-1] id_list = [] mydb = ToMongo() for book_id in book_ids: evaluates = mydb.get_col('evaluate').find_one( {'_id': ObjectId(book_id)}) if evaluates: value = { '$addToSet': { 'comment': { 'order_no': order_no, 'star': star, 'context': context, 'user_id': user_id, 'user_name': user_name, 'img_path': img_path, 'create_time': create_time } } } result = mydb.update('evaluate', {'_id': ObjectId(book_id)}, value) if result and result.modified_count: id_list.append(result.modified_count) else: # 无评论时,直接插入 rel = mydb.insert( 'evaluate', { '_id': ObjectId(book_id), 'comment': [{ 'order_no': order_no, 'star': star, 'context': context, 'user_id': user_id, 'user_name': user_name, 'img_path': img_path, 'create_time': create_time }] }) if rel: id_list.append(rel.inserted_id) if len(id_list) != len(book_ids): # print(id_list) rlt['error'] = '评论失败,请重试!' mydb.close_conn() return rlt