2023-04-03 01:00:24 +08:00
|
|
|
|
from flask import Blueprint, render_template, current_app, request, flash, redirect, url_for
|
2023-03-31 22:11:34 +08:00
|
|
|
|
from flask_login import login_required, current_user, login_manager
|
2023-04-03 01:00:24 +08:00
|
|
|
|
from .models import User, Conversation
|
|
|
|
|
from . import db
|
2023-04-04 23:38:22 +08:00
|
|
|
|
from datetime import datetime, timedelta
|
2023-04-03 01:00:24 +08:00
|
|
|
|
import openai
|
2023-03-31 22:11:34 +08:00
|
|
|
|
|
|
|
|
|
main = Blueprint('main', __name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@main.route('/')
|
|
|
|
|
def index():
|
2023-04-01 19:38:43 +08:00
|
|
|
|
return render_template('index.html', user=current_user)
|
2023-03-31 22:11:34 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@main.route('/profile')
|
|
|
|
|
@login_required
|
|
|
|
|
def profile():
|
2023-04-01 19:38:43 +08:00
|
|
|
|
if current_user.role == "admin":
|
|
|
|
|
return render_template('profile.html', user=current_user, accounts=User.query.all())
|
|
|
|
|
return render_template('profile.html', user=current_user)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@main.route('/manage')
|
|
|
|
|
@login_required
|
|
|
|
|
def manage():
|
|
|
|
|
if current_user.role == "admin":
|
|
|
|
|
accountid = request.args.get('id')
|
|
|
|
|
if accountid:
|
|
|
|
|
accounts = User.query.filter_by(id=accountid)
|
|
|
|
|
else:
|
|
|
|
|
accounts = User.query
|
|
|
|
|
if accounts:
|
|
|
|
|
return render_template('manage.html', user=current_user, accounts=accounts)
|
|
|
|
|
else:
|
|
|
|
|
flash("无此用户id!")
|
|
|
|
|
return redirect(request.referrer if request.referrer else url_for('main.index'))
|
|
|
|
|
|
|
|
|
|
flash("您无权管理其他账户")
|
|
|
|
|
return redirect(url_for('main.index'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@main.route('/chat')
|
|
|
|
|
@login_required
|
|
|
|
|
def chat():
|
2023-04-03 01:00:24 +08:00
|
|
|
|
if current_user.isActivated:
|
2023-04-03 22:50:10 +08:00
|
|
|
|
if request.args.get("act") == "get_history":
|
|
|
|
|
chats_desc = Conversation.query.filter_by(
|
|
|
|
|
userid=current_user.id, useremail=current_user.email).order_by(Conversation.datetime.desc()).limit(20).all()
|
|
|
|
|
msgs = []
|
|
|
|
|
for chat in reversed(chats_desc):
|
|
|
|
|
msgs.append(
|
|
|
|
|
{"request": chat.request, "response": chat.response, "datetime": chat.datetime})
|
|
|
|
|
return msgs
|
2023-04-03 01:00:24 +08:00
|
|
|
|
return render_template('chat.html', user=current_user)
|
|
|
|
|
else:
|
|
|
|
|
flash("您的账户暂未被激活")
|
|
|
|
|
return redirect(url_for('main.index'))
|
|
|
|
|
return redirect(url_for('main.index'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@main.route('/chat', methods=['POST'])
|
|
|
|
|
@login_required
|
|
|
|
|
def chat_post():
|
|
|
|
|
openai.api_key = current_app.config['OPENAI_API_KEY']
|
|
|
|
|
openai.proxy = current_app.config['NETWORK_PROXY']
|
|
|
|
|
|
|
|
|
|
msg = request.form.get("msg")
|
|
|
|
|
|
|
|
|
|
new_conversation = Conversation(userid=current_user.id,
|
|
|
|
|
useremail=current_user.email,
|
|
|
|
|
username=current_user.name,
|
|
|
|
|
request=msg,
|
|
|
|
|
response="")
|
|
|
|
|
db.session.add(new_conversation)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
if current_user.is_authenticated and current_user.isActivated:
|
2023-04-04 23:38:22 +08:00
|
|
|
|
messages = [
|
|
|
|
|
{"role": "system",
|
|
|
|
|
"content": current_app.config['OPENAI_PROMPT']},
|
|
|
|
|
]
|
|
|
|
|
chats_desc = Conversation.query.filter_by(
|
|
|
|
|
userid=current_user.id, useremail=current_user.email).order_by(Conversation.datetime.desc()).limit(20).all()
|
|
|
|
|
for chat in reversed(chats_desc):
|
|
|
|
|
if chat.datetime <= datetime.utcnow() - timedelta(seconds=300):
|
|
|
|
|
continue
|
|
|
|
|
if chat.response:
|
|
|
|
|
messages.append(
|
|
|
|
|
{"role": "assistant", "content": chat.response})
|
|
|
|
|
else:
|
|
|
|
|
messages.append(
|
|
|
|
|
{"role": "user", "content": chat.request})
|
|
|
|
|
|
2023-04-03 01:00:24 +08:00
|
|
|
|
openai_resp = openai.ChatCompletion.create(
|
|
|
|
|
model=current_app.config['OPENAI_MODEL_NAME'],
|
2023-04-04 23:38:22 +08:00
|
|
|
|
messages=messages
|
2023-04-03 01:00:24 +08:00
|
|
|
|
)
|
|
|
|
|
msg_resp = openai_resp['choices'][0]['message']['content']
|
|
|
|
|
if msg_resp:
|
|
|
|
|
response = {"message": msg_resp, "status": "success"}
|
|
|
|
|
else:
|
|
|
|
|
response = {"message": "请求错误", "status": "success"}
|
|
|
|
|
else:
|
|
|
|
|
response = {"message": "请先登录/激活", "status": "fail"}
|
|
|
|
|
|
|
|
|
|
new_conversation = Conversation(userid=current_user.id,
|
|
|
|
|
useremail=current_user.email,
|
|
|
|
|
username=current_user.name,
|
|
|
|
|
request=msg,
|
|
|
|
|
response=msg_resp)
|
|
|
|
|
db.session.add(new_conversation)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
return response
|