您的位置:首页 > 数据库 > SQL

用django,mysql设计一个聊天,好友验证,朋友圈功能项目

2020-03-21 21:21 92 查看

(1)重中之重!!!------------------------------------------------解决问题的思路

(1,1)如何获取每个页面的用户名字-----由登陆界面获取用户名------global变量

(1,2)用户消息验证-----由用户搜索好友账号-----数据库查询(重名,不存在,已经成为好友)--若失败,则返回报错结果(返回到text框中)-----若成功--则数据库添加(用户名,邀请人)

(2)项目演示

(2,1)登陆界面

(2,2)好友显示界面

(2,2,1)用户数据库

(2,2,2)已成为好友的数据库

(2,2,3)显示界面(例如我们登录zhangsan)

(2,2,4)我们随机选择一位聊天,例如和wangwu聊天,点击wangwu

(2,2,5)点击发送(忘记换行了。。。)再发送一句

(2,2,6)点击首页,验证搜索功能,(先进行错误示范,分别输入abc(不存在),zzz(已经成为好友),zhexiangm(正确))

 

(2,2,7)此时我们退出登录,再以zhexiangm用户身份登录进去,再点击消息验证,我会分别给你呈现三个图

(2,2,7,1)原先图片

 

(2,2,7,2)点击消息验证,点击同意

(2,2,7,3)现在的界面(此时多了一个叫zhangsan的好友)

(2,3)点击朋友圈

(2,3,1)发送一句django使我快乐

(3)功能完成!!!!

 (4)代码

(4,1)urls.py

[code]from django.urls import path
from . import views
urlpatterns = [
path('',views.login,name='user_login'),
path('index/',views.index,name='user_index'),
path('chat/',views.chat,name='user_chat'),
path('friend/',views.friend,name='user_friend'),
path('pyq/',views.pyq,name='user_pyq'),
]

(4,2)views.py

[code]import pymysql
import datetime
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.template import loader
from django.http import HttpResponse
from django.urls import path
from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_exempt
conn = pymysql.connect(host="localhost",user='root',password='123',charset='utf8')
cursor = conn.cursor()
sql_one = 'use user_management;'
cursor.execute(sql_one)
conn.commit()
sql_two = 'select * from user;'
cursor.execute(sql_two)
conn.commit()
user_name = []
for x in cursor.fetchall():
user_name.append(list(x))
print(user_name)
name = ''
def login(request):
if "POST"==request.method:
username = request.POST.get('username')
password = request.POST.get('password')
print(username)

print(password)
for x in user_name:
if username or password:
if username in x and password in x:
print(2)
global name#使用全局变量表明
name = username
sql_third = 'use user_chat;'
cursor.execute(sql_third)
sql_four = 'select * from friend;'
cursor.execute(sql_four)
global user_friend
user_friend = []
for x in cursor.fetchall():
b =  list(x)
if name in b:
b.remove(name)
user_friend.extend(b)######找出用户的好友,放入名叫user——friend的数组中
sql_five = 'select name_f2f from chat;'
cursor.execute(sql_five)
"""
为避免为后面多增加一些成员列表;
"""
user_old = []#调出聊天名单
for x in cursor.fetchall():
user_old.extend(list(x))
sql_four = 'insert into chat (name_f2f,text) values (%s,%s);'
for x in user_friend:###此阶段为增加用户新增加的一些名单
if name+"_"+x not in user_old and  x+"_"+name not in user_old:
cursor.execute(sql_four,(name+"_"+x,""))
conn.commit()
sql_sex = 'select * from chat;'
cursor.execute(sql_sex)
user_new = []
for x in cursor.fetchall():
user_new.append(list(x))
user_chat = []#最后聊天记录
for x in user_new:
print(442)
print(x)
print(443)
user_chat.extend(x[1].split('\n')[-1])
print(user_friend)
print(user_chat)
return render(request,'index.html',{'name':user_friend,'chat':user_chat,"alerrt_number":'添加好友'})
"""
(1) 先用friend数据库找出用户的好友
(2) 再在chat数据库找出两者的对话,如果没有,则添加数据进去###格式为name_name,text为对话内容
(3) 返回的数据有   ---好友名单--按钮聊天功能(user_friend)   --聊天记录(首界面只显示最后一条)
"""
return render(request
,'login.html',
{"error":"please input your username and your password"})
else:
return render(request,'login.html')
def index(request):
if request.method=="POST":
global name
global user_friend
sql_one_one = 'use user_chat;'
cursor.execute(sql_one_one)
conn.commit()
sql_four = 'select * from friend;'
cursor.execute(sql_four)
user_friend = []
for x in cursor.fetchall():
b = list(x)
if name in b:
b.remove(name)
user_friend.extend(b)  ######找出用户的好友,放入名叫user——friend的数组中
for x in user_friend:
if request.POST.get(x):
sql_one_one = 'use user_chat;'
cursor.execute(sql_one_one)
conn.commit()
sql_one_two = 'select * from chat;'
cursor.execute(sql_one_two)
conn.commit()
ac = []
"""
用户选定与谁聊天,调出聊天记录
"""
for y in cursor.fetchall():
if x in list(y)[0].split('_') and name in list(y)[0].split('_'):####找出是和谁在聊天 把连天记录提取出来(--日期+内容--)
ac = list(y)[1].split('\n')
return render(request,'chat.html',{"name":user_friend,"content":ac,"name_with_who":x,"alerrt_number":'添加好友'})
else:# 使用全局变量表明
alerrt = 0
alert = ''
sql_one = 'use user_management;'
cursor.execute(sql_one)
conn.commit()
sql_two = 'select * from user;'
cursor.execute(sql_two)
conn.commit()
user_name_one = []
for x in cursor.fetchall():
user_name_one.append(list(x)[0])
print(user_name_one)#所有的用户
print(123)
print(user_friend)#现在的好友
print(1234)
print(request.GET.get('friend'))
if request.GET.get('friend'):  #####检测用户是否点击了添加好友功能
if request.GET.get('friend') not in user_friend:
if request.GET.get('friend') not in user_name_one:
alerrt = 0
else:
sql_1 = 'use user_chat;'
cursor.execute(sql_1)
conn.commit()
sql_2 = 'insert into friend_message (name,friend) values (%s,%s);'
cursor.execute(sql_2, (name, request.GET.get('friend')))
conn.commit()
alerrt = 3
else:
alerrt = 1
sql_third = 'use user_chat;'
cursor.execute(sql_third)
sql_four = 'select * from friend;'
cursor.execute(sql_four)
user_friend = []
for x in cursor.fetchall():
b = list(x)
if name in b:
b.remove(name)
user_friend.extend(b)  ######找出用户的好友,放入名叫user——friend的数组中
sql_five = 'select name_f2f from chat;'
cursor.execute(sql_five)
"""
为避免为后面多增加一些成员列表;
"""
user_old = []  # 调出聊天名单
for x in cursor.fetchall():
user_old.extend(list(x))
sql_four = 'insert into chat (name_f2f,text) values (%s,%s);'
for x in user_friend:  ###此阶段为增加用户新增加的一些名单
if name + "_" + x not in user_old and x + "_" + name not in user_old:
cursor.execute(sql_four, (name + "_" + x, "你们已成为好友了"))
conn.commit()
sql_sex = 'select * from chat;'
cursor.execute(sql_sex)
user_new = []
for x in cursor.fetchall():
user_new.append(list(x))
user_chat = []  # 最后聊天记录
for x in user_new:
user_chat.extend(x[1].split('\n')[-1])
print(user_friend)
print(user_chat)
if alerrt == 0:
alert = '好友账号不存在'
elif alerrt == 1:
alert = '已成为好友,请勿重新添加'
elif alerrt == 3:
alert = '添加成功,请等待对方通知'
return render(request, 'index.html', {'name': user_friend, 'chat': user_chat,'alerrt_number':alert})

def chat(request):
if  request.method=="POST":
global name
global user_friend
sql_one = 'use user_management;'
cursor.execute(sql_one)
conn.commit()
alert = ''
alerrt = 0
sql_two = 'select * from user;'
cursor.execute(sql_two)
conn.commit()
user_name_one = []
for x in cursor.fetchall():
user_name_one.append(list(x)[0])
"""
用户提交发送,内容截取,前面加上时间字段 采用datetime库
"""
sql_one_one = 'use user_chat;'
cursor.execute(sql_one_one)
conn.commit()
sql_four = 'select * from friend;'
cursor.execute(sql_four)
user_friend = []
for x in cursor.fetchall():
b = list(x)
if name in b:
b.remove(name)
user_friend.extend(b)  ######找出用户的好友,放入名叫user——friend的数组中
"""
获取用户名和内容
"""
print(user_friend)
for x in user_friend:
if request.POST.get(x):####确定发送的用户
print('yes')
str_one =datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
friend = request.POST.get(x)####发送的内容
sql_two_one = 'use user_chat;'
cursor.execute(sql_two_one)
conn.commit()
sql_two_third = 'select name_f2f from chat;'
cursor.execute(sql_two_third)
conn.commit()
who = ''####确定谁和谁聊天
for i in cursor.fetchall():
if name in list(i)[0].split('_') and x in list(i)[0].split('_'):
who = list(i)[0]
sql_kennys = 'select text from chat where name_f2f = %s'
cursor.execute(sql_kennys,(who))
chat_old = []
for x in cursor.fetchall():
chat_old.append(list(x))
sql_two_two = 'update  chat set text = %s where name_f2f = %s;'
print(chat_old)
cursor.execute(sql_two_two,(chat_old[0][0]+"发送人:  "+name+'\n'+str_one+" "+friend+'\n',who))
####防止sql报错------ Unknown column 'x' in 'where clause' 存储格式为----时间+空格+内容+换行
sql_sex = 'select * from chat;'
cursor.execute(sql_sex)
user_new = []
for x in cursor.fetchall():
user_new.append(list(x))
user_chat = []  # 最后聊天记录
for x in user_new:
user_chat.extend(x[1].split('\n')[-1])
print(user_friend)
print(user_chat)
for x in user_friend:
if request.POST.get(x):
sql_one_one = 'use user_chat;'
cursor.execute(sql_one_one)
conn.commit()
sql_one_two = 'select * from chat;'
cursor.execute(sql_one_two)
conn.commit()
ac = []
"""
用户选定与谁聊天,调出聊天记录
"""
for y in cursor.fetchall():
if x in list(y)[0].split('_') and name in list(y)[0].split('_'):  ####找出是和谁在聊天 把连天记录提取出来(--日期+内容--)
ac = list(y)[1].split('\n')
if alerrt==0:
alert='好友账号不存在'
elif alerrt==1:
alert='已成为好友,请勿重新添加'
elif alerrt==3:
alert='添加成功,请等待对方通知'
return render(request, 'chat.html', {"name": user_friend,
"content": ac, "name_with_who": x,
"alerrt_number":alert})
def friend(request):
if request.method == "GET":
global name
print(333)
print(name)
print(444)
sql_1_1 = 'use user_chat;'
cursor.execute(sql_1_1)
conn.commit()
sql_simple = 'select * from friend_message;'
cursor.execute(sql_simple)
conn.commit()
ac = []
for x in cursor.fetchall():
ac.append(list(x))
ac_one = []
for x in ac:
if name==x[1]:
ac_one.append(x)
return render(request,'friend.html',{"friend":ac_one})
else:
sql_one = 'use user_management;'
cursor.execute(sql_one)
conn.commit()
sql_two = 'select * from user;'
cursor.execute(sql_two)
conn.commit()
user_name_two = []
for x in cursor.fetchall():
user_name_two.append(list(x)[0])
for x in user_name_two:
print(x)
print(request.POST.get(x))
if request.POST.get(x) == '同意':
sql_third = 'use user_chat;'
cursor.execute(sql_third)
conn.commit()
sql_third = 'insert into chat (name_f2f,text) value (%s,%s);'
cursor.execute(sql_third,(name+'_'+x,'你们已成为好友了'))
sql_1_1 = 'use user_chat;'
cursor.execute(sql_1_1)
conn.commit()
sql_four = 'delete from friend_message where (name = %s and friend = %s);'
cursor.execute(sql_four, (x, name))
sql_1_1 = 'use user_chat;'
cursor.execute(sql_1_1)
conn.commit()
sql_123 = 'insert into friend (user_name_one,user_name_two) values (%s,%s);'
cursor.execute(sql_123,(name,x))
conn.commit()
sql_simple = 'select * from friend_message;'
cursor.execute(sql_simple)
conn.commit()
ac = []
for x in cursor.fetchall():
ac.append(list(x))
ac_one = []
for x in ac:
if name == x[1]:
ac_one.append(x)
return render(request, 'friend.html', {"friend": ac_one})
elif request.POST.get(x) =='拒绝':
sql_1_1 = 'use user_chat;'
cursor.execute(sql_1_1)
conn.commit()
sql_four = 'delete from friend_message where (name = %s and friend = %s);'
cursor.execute(sql_four,(x,name))
sql_simple = 'select * from friend_message;'
cursor.execute(sql_simple)
conn.commit()
ac = []
for x in cursor.fetchall():
ac.append(list(x))
ac_one = []
for x in ac:
if name == x[1]:
ac_one.append(x)
return render(request, 'friend.html', {"friend": ac_one})
def pyq(request):
if request.method == 'GET':
global name#用户
sql_third = 'use user_chat;'
cursor.execute(sql_third)
conn.commit()
sql_four = 'select * from friend;'
cursor.execute(sql_four)
user_friend = []####用户的好友
for x in cursor.fetchall():
b = list(x)
if name in b:
b.remove(name)
user_friend.extend(b)  ######找出用户的好友,放入名叫user——friend的数组中
sql_five = 'select * from pyq;'
cursor.execute(sql_five)
conn.commit()
user_pyq = []
for x in cursor.fetchall():
user_pyq.append(list(x))
user_pyq_old = []####用户以及用户好友发送的动态,格式为  名字   内容
for x in user_pyq:
if x[0] in user_friend or x[0] == name:
user_pyq_old.append(x)
return render(request,'pyq.html',{"friend":user_pyq_old,"name":name})
else:
user_value = request.POST.get(name)#获取用户发送的内容
str_one = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')#显示当地的时间
sql_1 = 'use user_chat;'
cursor.execute(sql_1)
conn.commit()
sql_2 = 'insert into pyq (user_name,user_pyq,user_time) values (%s,%s,%s);'
cursor.execute(sql_2,(name,user_value,str_one))
sql_third = 'use user_chat;'
cursor.execute(sql_third)
conn.commit()
sql_four = 'select * from friend;'
cursor.execute(sql_four)
user_friend = []  ####用户的好友
for x in cursor.fetchall():
b = list(x)
if name in b:
b.remove(name)
user_friend.extend(b)  ######找出用户的好友,放入名叫user——friend的数组中
sql_five = 'select * from pyq;'
cursor.execute(sql_five)
conn.commit()
user_pyq = []
for x in cursor.fetchall():
user_pyq.append(list(x))
user_pyq_old = []  ####用户以及用户好友发送的动态,格式为  名字   内容
for x in user_pyq:
if x[0] in user_friend or x[0] == name:
user_pyq_old.append(x)
return render(request, 'pyq.html', {"friend": user_pyq_old, "name": name})

(4,3)templates

(4,3,1)chat.html

[code]<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user_chat</title>
</head>
<body>
<div style="display: flex;align-content: center">
<div style="width:25%;text-align: center"><a href="http://127.0.0.1:8000/index/">首页</a></div>
<div style="width:25%;text-align: center"><a href="http://127.0.0.1:8000/pyq/">朋友圈</a> </div>
<div style="width:25%;text-align: center"><a href="/">退出</a> </div>
</div>
<div style="text-align: center;width: 8.75%;font-size: 10px;border:1px solid #000">好友</div>
{% for x in name %}
<div style="text-align: left; width:30%">

<form action="{% url 'user_chat' %}" method="POST">
{% csrf_token %}
<input type="number" name="{{ x }}" min="0" style="width: 0;height: 0;display:none">
<input type="submit" style="width:30%;height: 20px" value="{{ x }}" name ="{{ x }}">
</form>
</div>
{% endfor %}
<!--头部列出好友列表-->
<div style="text-align: right;width: 70%">
<textarea rows="20" cols="200" readonly>
{% for x in content %}
{{ x }}
{% endfor %}
</textarea>
</div>
<form action="{% url 'user_chat' %}" method="POST">
{% csrf_token %}
<input type="text" style="width:100%;height: 80%" name="{{ name_with_who }}">
<input type="submit" style=""value="发送">
</form>
</body>
</html>

(4,3,2)friend.html

[code]<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户验证</title>
</head>
<body>
{% for x in friend %}
<p>邀请人:{{ x.0 }}</p>
<form action="{% url 'user_friend' %}" method="POST">
{% csrf_token %}
<input type="text" name="{{ x.0 }}"  style="width: 0;height: 0;display:none" value="YES">
<input type="submit" style="width:30%;height: 20px" value="同意" name ="{{x.0}}">
</form>
<form action="{% url 'user_friend' %}" method="POST">
{% csrf_token %}
<input type="text" name="{{ x.0 }}"  style="width: 0;height: 0;display:none" value="NO">
<input type="submit" style="width:30%;height: 20px" value="拒绝" name ="{{ x.0 }}">
</form>
{% endfor %}
<div style="width:25%;text-align: center"><a href="http://127.0.0.1:8000/index/">返回首页</a></div>
</body>
</html>

(4,3,3)index.html

[code]<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user_login</title>
</head>
<body>

<form action="{% url 'user_index' %}">
<div style="display: flex;align-content: center">
<div style="width:20%;text-align: center"><a href="http://127.0.0.1:8000/index/">首页</a></div>
<form action="{% url 'user_index' %}" method="GET">
{% csrf_token %}
<div style="width:25%;"><input type="text" name="friend" value="{{alerrt_number}}"><input type="submit" value="搜索"></div>
</form>
<div style="width:15%;text-align: center"><a href="http://127.0.0.1:8000/friend/">消息验证{{ number }}</a> </div>
<div style="width:20%;text-align: center"><a href="/">退出</a> </div>
<div style="width:20%;text-align: center"><a href="http://127.0.0.1:8000/pyq/">朋友圈</a> </div>
</div>
</form>
<div style="text-align: center;width: 8.75%;font-size: 10px;border:1px solid #000">好友</div>
{% for x in name %}
<div style="text-align: left; width:30%">

<form action="{% url 'user_index' %}" method="POST">
{% csrf_token %}
<input type="number" name="{{ x }}" min="0" style="width: 0;height: 0;display:none">
<input type="submit" style="width:30%;height: 20px" value="{{ x }}" name ="{{ x }}">
</form>
</div>
{% endfor %}

</body>
</html>

(4,3,4)login.html

[code]<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user_login</title>
</head>
<body>
<div style="text-align: center;">
<form action="{%  url 'user_login' %}" method="POST">
{% csrf_token %}
账号:<input type="text" name="username" placeholder="请输入用户名"><br>
密码:<input type="password" name="password" placeholder="请输入密码"><br>
登录:<input type="submit" name="login" value="登录" style="width:170px"><br>
{{ error }}<br>
</form>
</div>
</body>
</html>

(4,3,5)pyq.html

[code]<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>朋友圈动态</title>
</head>
<body>
<div style="display: flex;align-content: center">
<div style="width:20%;text-align: center"><a href="http://127.0.0.1:8000/index/">首页</a></div>
<div style="width:15%;text-align: center"><a href="http://127.0.0.1:8000/friend/">消息验证{{ number }}</a> </div>
<div style="width:20%;text-align: center"><a href="/">退出</a> </div>
<div style="width:20%;text-align: center"><a href="http://127.0.0.1:8000/pyq/">朋友圈</a> </div>
</div>
<div style="text-align: right;width: 70%">
<textarea rows="20" cols="200" readonly>
{% for x in friend %}
时间:{{ x.2 }}
姓名:{{ x.0}}
内容:{{ x.1 }}
{% endfor %}
</textarea>
</div>
<form action="{% url 'user_pyq' %}" method="POST">
{% csrf_token %}
<input type="text" style="width:100%;height: 80%" name="{{ name }}" value="快来分享你的快乐事件吧!!!">
<input type="submit" style=""value="发送">
</form>
</body>
</html>

(5) up感想:

其实做了这项目用时间5天左右吧,主要是写思路,有些报错就很傻,几处错误,慢慢改就是了,写代码最重要是写注释!!!,写注释!!!,写注释!!!,方便理清思路,还有一点不足之处就是用户传图片我没加,可能是更新版本再加吧(哈哈),做这些项目最重要是提升自己的数据处理能力(主要),由数据库或者用户给的数据如何进行处理变成我们想要的数据这一点颇为重要,未来的路还很长,前端问题始终是自己心里面的一块梗,自己在python工程师的方向前进,俗话说:既然选择了远方 便只顾风雨兼程,加油吧!!!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐