Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ __pycache__/
chat/migrations/
login/migrations/
statics/upload/

statics/dist/
statics/src/
statics/img/
Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,9 @@
### 前端

1. <a href="https://layim.layui.com/" target="_blank">LayIM</a>(已获得授权)
2. <a href="https://www.layui.com/" target="_blank">LayUI</a>(开源)
2. <a href="https://www.layui.com/" target="_blank">LayUI</a>(开源)

##待实现功能

1. 客服
2. 聊天机器人
75 changes: 69 additions & 6 deletions WebIM/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
"""

import os
from urllib.parse import urlparse


# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Expand All @@ -22,13 +24,14 @@
SECRET_KEY = '3zt8c)88lmp_8kif4&y*#oy=myhsdh5do)xjixb3$$b+i-2+vt'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
DEBUG = False

ALLOWED_HOSTS = ['*']

# Application definition

INSTALLED_APPS = [
'agent',
'channels',
'login',
'chat',
Expand Down Expand Up @@ -83,6 +86,32 @@
},
}

# cache
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
# 'PASSWORD': redis_url.password,
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
'PICKLE_VERSION': -1, # Use the latest protocol version 默认使用最新的 pickle.
'SOCKET_CONNECT_TIMEOUT': 5, # in seconds socket 建立连接超时设置
'SOCKET_TIMEOUT': 60, # in seconds 连接建立后的读写操作超时设置
"CONNECTION_POOL_KWARGS": {"max_connections": 100}, # 配置默认连接池
'IGNORE_EXCEPTIONS': True,
}
}
}

REDIS_TIMEOUT = 7*24*60*60
CUBES_REDIS_TIMEOUT = 60*60
NEVER_REDIS_TIMEOUT = 365*24*60*60

# Django 默认可以使用任何 cache backend 作为 session backend,
# 将 django-redis 作为 session 储存后端不用安装任何额外的 backend
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

Expand All @@ -107,11 +136,6 @@ def mysql_settings():
'default': mysql_settings()
}

if DEBUG:
Domain = 'http://127.0.0.1:8000'
else:
Domain = 'https://iwantme.cn'

# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

Expand Down Expand Up @@ -154,3 +178,42 @@ def mysql_settings():
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "statics"),
]


# 上传文件白名单
ALLOWED_EXTENSIONS = ('txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'zip')
# 2.5MB - 2621440
# 5MB - 5242880
# 10MB - 10485760
# 20MB - 20971520
# 50MB - 5242880
# 100MB 104857600
# 250MB - 214958080
# 500MB - 429916160
MAX_UPLOAD_SIZE = 10485760

# LOGIN_URL
LOGIN_URL = '/'
# Domain = 'http://127.0.0.1:8000'
Domain = 'https://iwantme.cn'

AUTH_USER_MODEL = 'chat.IMUser'

# session 设置
# 30分钟
SESSION_COOKIE_AGE = 60 * 5
SESSION_SAVE_EVERY_REQUEST = True
# 关闭浏览器,则COOKIE失效
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

# 本地开发配置放在local_settings.py中
# try:
# from .local_settings import *
# except ImportError:
# pass


###
# 部署上线需要修改的地方
# Domain = 'https://iwantme.cn'
# DEBUG = False
1 change: 1 addition & 0 deletions WebIM/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

urlpatterns = [
url(r'^$', login_views.do_login, name='index'),
url(r'^agent/', include('agent.urls')),
url(r'^login/', include('login.urls')),
url(r'^chat/', include('chat.urls')),
url(r'^admin/', admin.site.urls),
Expand Down
Empty file added agent/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions agent/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
5 changes: 5 additions & 0 deletions agent/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class AgentConfig(AppConfig):
name = 'agent'
54 changes: 54 additions & 0 deletions agent/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Generated by Django 2.1.2 on 2018-11-05 16:49

from django.db import migrations, models
import django.db.models.deletion
import uuid


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Agent',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('name', models.CharField(max_length=100, verbose_name='客服名称')),
('password', models.CharField(max_length=100, verbose_name='密码')),
('avatar', models.CharField(default='/statics/img/default_avatar_male_180.gif', max_length=128, verbose_name='客服头像')),
],
),
migrations.CreateModel(
name='Client',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('name', models.CharField(max_length=100, verbose_name='客户昵称')),
('avatar', models.CharField(default='/statics/img/default_avatar_male_180.gif', max_length=128, verbose_name='客户头像')),
('ip', models.CharField(default='0.0.0.0', max_length=64, verbose_name='客户IP')),
],
),
migrations.CreateModel(
name='Dialogue',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('name', models.CharField(max_length=128, verbose_name='对话名称')),
('agent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='agent', to='agent.Agent')),
('client', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='client', to='agent.Client')),
],
),
migrations.CreateModel(
name='Statement',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('from_id', models.CharField(max_length=255)),
('to_id', models.CharField(max_length=255)),
('msg_type', models.IntegerField(default=0)),
('content', models.CharField(max_length=255)),
('timestamp', models.BigIntegerField()),
],
),
]
19 changes: 19 additions & 0 deletions agent/migrations/0002_statement_dialogue.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 2.1.2 on 2018-11-05 16:51

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('agent', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='statement',
name='dialogue',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dialogue', to='agent.Dialogue'),
),
]
18 changes: 18 additions & 0 deletions agent/migrations/0003_auto_20181106_2214.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.1.2 on 2018-11-06 14:14

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('agent', '0002_statement_dialogue'),
]

operations = [
migrations.AlterField(
model_name='client',
name='name',
field=models.CharField(default='访客', max_length=100, verbose_name='客户昵称'),
),
]
Empty file added agent/migrations/__init__.py
Empty file.
41 changes: 41 additions & 0 deletions agent/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import uuid
from django.db import models


class Agent(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100, verbose_name="客服名称")
password = models.CharField(max_length=100, verbose_name="密码")
# 客服头像
avatar = models.CharField(max_length=128, default='/statics/img/default_avatar_male_180.gif', verbose_name="客服头像")


class Client(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100, verbose_name="客户昵称", default='访客')
# 客户头像
avatar = models.CharField(max_length=128, default='/statics/img/default_avatar_male_180.gif', verbose_name="客户头像")
# 客户的IP地址
ip = models.CharField(max_length=64, default='0.0.0.0', verbose_name='客户IP')


class Dialogue(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=128, verbose_name='对话名称')
agent = models.ForeignKey('Agent', on_delete=models.CASCADE, null=True, related_name='agent')
client = models.ForeignKey('Client', on_delete=models.CASCADE, null=True, related_name='client')


class Statement(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
dialogue = models.ForeignKey('Dialogue', on_delete=models.CASCADE, null=True, related_name='dialogue')
from_id = models.CharField(max_length=255)
# from_user_name = models.CharField(max_length=255)
# from_user_avatar = models.CharField(max_length=255)
to_id = models.CharField(max_length=255)
# from_user = models.ForeignKey('User', on_delete=models.CASCADE, null=True, related_name='msg_from_user')
# to_user = models.ForeignKey('User', on_delete=models.CASCADE, null=True, related_name='msg_to_user')
# 0 文本; 1 图片; 2 视频; 3语音
msg_type = models.IntegerField(default=0)
content = models.CharField(max_length=255)
timestamp = models.BigIntegerField()
3 changes: 3 additions & 0 deletions agent/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
8 changes: 8 additions & 0 deletions agent/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from . import views
from django.conf.urls import url


urlpatterns = [
url(r'^$', views.agent),
url(r'^create_user/$', views.create_user, name='create_user'),
]
19 changes: 19 additions & 0 deletions agent/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from django.shortcuts import render
from django.http import JsonResponse
from .models import Client, Agent
from django.views.decorators.csrf import csrf_exempt


def agent(request):
return render(request, 'agent/kefu.html')


@csrf_exempt
def create_user(request):
client_id = request.POST.get('client_id', None)
if client_id is None:
return JsonResponse({'code': 1, 'msg': 'invalid client_id'})
client = Client.objects.create(id=client_id)
agent = Agent.objects.all()[0]
return JsonResponse({'code': 0, 'msg': '', 'data': {'username': client.name, 'id': client.id, 'avatar': client.avatar}})

11 changes: 4 additions & 7 deletions chat/admin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.contrib import admin
from chat.models import User, GroupChat, Group, Message
from chat.models import IMUser, IMGroupChat, IMGroup, Message


class UserAdmin(admin.ModelAdmin):
Expand All @@ -18,9 +18,6 @@ class UserAdmin(admin.ModelAdmin):
)


admin.site.register(User, UserAdmin)
admin.site.register(Group)
admin.site.register(GroupChat)
# admin.site.register(Membership)
# admin.site.register(Message)
# admin.site.register(GroupChatMembership)
admin.site.register(IMUser, UserAdmin)
admin.site.register(IMGroup)
admin.site.register(IMGroupChat)
2 changes: 1 addition & 1 deletion chat/consumers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from channels.generic.websocket import AsyncWebsocketConsumer
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from .models import Group
from .models import IMGroup
import json


Expand Down
Loading