from app import home, 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 jsonify(res)
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_count = Collect.query.filter_by(user_id=int(user_id), song_id=int(song_id)).count()
res = {}
if collect_count == 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)