from . import home
from app import db
from app.home.forms import LoginForm, RegisterForm, SuggetionForm
from app.models import User, Artist, Song, Collect
from flask import render_template, url_for, redirect, flash, session, request, jsonify
from functools import wraps
import time
import os
base = os.path.dirname(__file__)
song_path = base + '/../static/song/'
img_path = base + '/../static/artist/'
def admin_login(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if session['username'] != 'admin':
return redirect(url_for('home.index'))
return f(*args, **kwargs)
return decorated_function
def user_login(f):
""" 登录装饰器 """
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
return '<script>alert(\'请先登录\');history.go(-1)</script>'
return f(*args, **kwargs)
return decorated_function
@home.route('/contentFrame')
def contentFrame():
""" 主页面 """
hot_artist = Artist.query.filter_by(isHot=1).limit(12).all()
hot_song = Song.query.order_by(Song.hits.desc()).limit(10).all()
return render_template('home/contentFrame.html', hot_artist=hot_artist, hot_song=hot_song)
@home.route('/')
def index():
""" 首页 """
return render_template('home/index.html')
@home.route('/login/', methods=['GET', 'POST'])
def login():
""" 登录 """
if request.method == 'POST':
username = request.form.get('username')
pwd = request.form.get('pwd')
user = User.query.filter_by(username=username).first()
res = {}
if not user:
res['status'] = -1
res['message'] = '用户名不存在'
return jsonify(res)
if not user.check_pwd(pwd):
res['status'] = -2
res['message'] = '用户名和密码不匹配'
return jsonify(res)
session['user_id'] = user.id
session['username'] = user.username
res['status'] = 1
res['message'] = '登录成功'
return jsonify(res)
return render_template('home/login.html')
@home.route('/register/', methods=['GET', 'POST'])
def register():
""" 注册功能 """
if request.method == 'POST':
username = request.form.get('username')
pwd = request.form.get('pwd')
user = User.query.filter_by(username=username).first()
if user:
res = {}
res['status'] = -2
res['message'] = '该用户已存在'
return jsonify(res)
try:
user = User(username=username, pwd=pwd)
db.session.add(user)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '注册成功'
except:
res = {}
res['status'] = -1
res['message'] = '注册失败'
return jsonify(res)
return render_template('home/register.html')
@home.route('/logout/')
def logout():
""" 退出登录 """
session.pop('user_id', None)
session.pop('username', None)
return redirect(url_for('home.index'))
@home.route('/artist/<int:id>')
def artist(id=None):
""" 歌手页 """
song = Song.query.join(Artist, Song.singer == Artist.artistName).filter(Artist.id == id).all()
hot_artist = Artist.query.limit(6).all()
return render_template('home/artist.html', song=song, hot_artist=hot_artist)
@home.route('/play_song')
def playSong():
""" 获取播放路径 """
song_id = request.args.get('id', '')
song = Song.query.filter_by(id=int(song_id)).first()
res = {}
res['status'] = 1
res['path'] = song.fileURL
return jsonify(res)
@home.route('/toplist')
def toplist():
top_song = Song.query.order_by(Song.hits.desc()).limit(30).all()
hot_artist = Artist.query.limit(6).all()
return render_template('home/toplist.html', top_song=top_song, hot_artist=hot_artist)
@home.route('/style_list')
def styleList():
type_val = request.args.get('type', 0, type=int)
page = request.args.get('page', type=int)
if type_val:
page_data = Song.query.filter_by(style=type_val).order_by(Song.hits.desc()).paginate(page=page, per_page=10)
else:
page_data = Song.query.order_by(Song.hits.desc()).paginate(page=page, per_page=10)
return render_template('home/styleList.html', page_data=page_data, type=type_val)
@home.route('/artist_list')
def artistList():
''' 歌手列表 '''
type_val = request.args.get('type', 0, type=int)
page = request.args.get('page', type=int)
if type_val:
page_data = Artist.query.filter_by(style=type_val).paginate(page=page, per_page=10)
else:
page_data = Artist.query.paginate(page=page, per_page=10)
return render_template('home/artistList.html', page_data=page_data, type=type_val)
@home.route('/search')
def search():
keyword = request.args.get('keyword')
page = request.args.get('page', type=int)
if keyword:
keyword = keyword.strip()
page_data = Song.query.filter(Song.songName.like('%' + keyword + '%')).order_by(Song.hits.desc()).paginate(page=page, per_page=10)
else:
page_data = Song.query.order_by(Song.hits.desc()).paginate(page=page, per_page=10)
return render_template('home/search.html', keyword=keyword, page_data=page_data)
@home.route('/modify_password', methods=['GET', 'POST'])
def modifyPassword():
if request.method == 'POST':
old_pwd = request.form.get('old_pwd')
new_pwd = request.form.get('new_pwd')
user = User.query.filter_by(id=session['user_id']).first()
res = {}
if not user.check_pwd(old_pwd):
res['status'] = -1
res['message'] = '原始密码错误'
return jsonify(res)
try:
user.pwd = new_pwd
db.session.add(user)
db.session.commit()
res['status'] = 1
res['message'] = '密码修改成功'
return jsonify(res)
except:
res['status'] = -2
res['message'] = '密码修改错误'
return render_template('home/modifyPassword.html')
@home.route('/collect')
@user_login
def collect():
""" 收藏歌曲 """
song_id = request.args.get('id', '')
user_id = session['user_id']
collect = Collect.query.filter_by(user_id=int(user_id), song_id=int(song_id)).count()
res = {}
if collect == 1:
res['status'] = 0
res['message'] = '已经收藏'
else:
collect_obj = Collect(user_id=int(user_id), song_id=int(song_id))
db.session.add(collect_obj)
db.session.commit()
res['status'] = 1
res['message'] = '收藏成功'
return jsonify(res)
@home.route('/collect_list')
@user_login
def collectList():
page = request.args.get('page', type=int)
page_data = Collect.query.paginate(page=page, per_page=10)
return render_template('home/collectList.html', page_data=page_data)
@home.route('/manage_artist_list')
@admin_login
def manageArtist():
''' 后台管理 '''
page = request.args.get('page', type=int)
page_data = Artist.query.paginate(page=page, per_page=10)
return render_template('home/manageArtist.html', page_data=page_data)
@home.route('/manage_artist_add', methods=['GET', 'POST'])
@admin_login
def manageArtistAdd():
''' 新增歌手 '''
if request.method == 'POST':
artistName = request.form.get('artistName')
style = request.form.get('style')
imgURL = request.form.get('imgURL')
isHot = request.form.get('isHot')
artist = Artist.query.filter_by(artistName=artistName).first()
if artist:
res = {}
res['status'] = -2
res['message'] = '该歌手已存在'
return jsonify(res)
try:
artist = Artist(artistName=artistName, style=int(style), imgURL=imgURL, isHot=int(isHot))
db.session.add(artist)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '添加成功'
except:
res = {}
res['status'] = -1
res['message'] = '添加失败'
return jsonify(res)
return render_template('home/manageArtistAdd.html')
@home.route('/manage_artist_edit', methods=['GET', 'POST'])
@admin_login
def manageArtistEdit():
''' 编辑歌手 '''
id_val = request.values['id']
artist = Artist.query.filter_by(id=id_val).first()
if request.method == 'POST':
artistName = request.form.get('artistName')
style = request.form.get('style')
isHot = request.form.get('isHot')
try:
artist.artistName = artistName
artist.style = int(style)
artist.isHot = int(isHot)
db.session.add(artist)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '保存成功'
except:
res = {}
res['status'] = -1
res['message'] = '保存失败'
return jsonify(res)
return render_template('home/manageArtistEdit.html', artist=artist)
@home.route('/manage_artist_del')
@admin_login
def manageArtistDel():
''' 删除歌手 '''
id_val = request.args.get('id')
try:
artist = Artist.query.get_or_404(int(id_val))
db.session.delete(artist)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '删除成功'
except:
res = {}
res['status'] = -1
res['message'] = '删除失败'
return jsonify(res)
@home.route('/manage_song_list')
@admin_login
def manageSong():
''' 歌曲管理 '''
page = request.args.get('page', type=int)
page_data = Song.query.paginate(page=page, per_page=10)
return render_template('home/manageSong.html', page_data=page_data)
@home.route('/manage_song_add', methods=['GET', 'POST'])
@admin_login
def manageSongAdd():
''' 新增歌曲 '''
if request.method == 'POST':
songName = request.form.get('songName')
singer = request.form.get('singer')
style = request.form.get('style')
fileURL = request.form.get('fileURL')
song = Song.query.filter_by(songName=songName).first()
if song:
res = {}
res['status'] = -2
res['message'] = '该歌曲已存在'
return jsonify(res)
try:
song = Song(songName=songName, singer=singer, style=1, fileURL=fileURL)
db.session.add(song)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '添加成功'
except:
res = {}
res['status'] = -1
res['message'] = '添加失败'
return jsonify(res)
return render_template('home/manageSongAdd.html')
@home.route('/manage_song_edit', methods=['GET', 'POST'])
@admin_login
def manageSongEdit():
''' 编辑歌曲 '''
id_val = request.values['id']
song = Song.query.filter_by(id=id_val).first()
if request.method == 'POST':
songName = request.form.get('songName')
singer = request.form.get('singer')
style = request.form.get('style')
try:
song.songName = songName
song.singer = singer
song.style = int(style)
db.session.add(song)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '保存成功'
except:
res = {}
res['status'] = -1
res['message'] = '保存失败'
return jsonify(res)
return render_template('home/manageSongEdit.html', song=song)
@home.route('/manage_song_del')
@admin_login
def manageSongDel():
''' 删除歌曲 '''
id_val = request.args.get('id')
try:
song = Song.query.get_or_404(int(id_val))
db.session.delete(song)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '删除成功'
except:
res = {}
res['status'] = -1
res['message'] = '删除失败'
return jsonify(res)
@home.route('/upload', methods=['POST'])
@admin_login
def upload():
"""接受前端传送过来的文件"""
file_obj = request.files.get('mp3')
if file_obj is None:
return '文件上传为空'
path = str(int(time.time())) + '.mp3'
file_obj.save(os.path.join(song_path, path))
res = {}
res['status'] = 1
res['path'] = path
return jsonify(res)
@home.route('/upload/img', methods=['POST'])
@admin_login
def uploadImg():
"""接受前端传送过来的文件"""
file_obj = request.files.get('img')
if file_obj is None:
return '文件上传为空'
path = str(int(time.time())) + '.jpg'
file_obj.save(os.path.join(img_path, path))
res = {}
res['status'] = 1
res['path'] = path
return jsonify(res)
@home.route('/addHit')
def addHit():
''' 点击量加 1 '''
id_val = request.args.get('id')
song = Song.query.get_or_404(int(id_val))
if not song:
res = {}
res['status'] = -1
res['message'] = '歌曲不存在'
else:
song.hits += 1
db.session.add(song)
db.session.commit()
res = {}
res['status'] = 1
res['message'] = '播放次数加 1'
return jsonify(res)