Skip to content

Commit ca6d450

Browse files
authored
Merge pull request #10 from nkto/master
update
2 parents 90fad50 + 9561ec7 commit ca6d450

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1431
-228
lines changed

website/backend/apis/goods.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from django.views.decorators.csrf import csrf_exempt, ensure_csrf_cookie
2+
from django.http import HttpResponse, JsonResponse
3+
import json,hashlib,re, datetime, time
4+
from .. import models
5+
6+
@ensure_csrf_cookie
7+
def new_item(request):
8+
obj = models.NKTO_Goods.objects.order_by("time")[0:4]
9+
items = []
10+
for i in obj:
11+
o = models.NKTO_GoodsDts.objects.filter(gid = i.gid, order = 1) #表示查找第一张图片
12+
item = {}
13+
item['src'] = o[0].pic
14+
item['name'] = i.name
15+
item['value'] = i.price
16+
items.append(item)
17+
return JsonResponse({'message': items})
18+
19+
@ensure_csrf_cookie
20+
def generate(request):
21+
info = json.loads(request.body.decode('utf8'))
22+
form = info['formitem']
23+
special = info['special']
24+
return JsonResponse({'price': form['price']})

website/backend/apis/user.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def user_validate(request):
120120
def user_modify(request):
121121
if hasattr(request, 'body'):
122122
info = json.loads(request.body.decode('utf8'))
123-
obj = models.NKTO_User.filter(uid = info['id'])
123+
obj = models.NKTO_User.objects.filter(uid = info['id'])
124124
if len(obj) > 0:
125125
if hasattr(info, 'icon'):
126126
obj.update(icon = info['icon'])
@@ -146,4 +146,20 @@ def user_storeimage(request):
146146
with open('./static/upload/' + name, 'wb') as destination:
147147
for chunk in file.chunks():
148148
destination.write(chunk)
149-
return JsonResponse({'url': '/static/upload/' + name})
149+
return JsonResponse({'url': '/static/upload/' + name})
150+
151+
@ensure_csrf_cookie
152+
def user_checkstate(request):
153+
''' 檢查用戶是否已經登錄,返回true或者false '''
154+
# 檢查session中是否有uid
155+
try:
156+
uid = int(request.session['uid'])
157+
print(uid)
158+
# 檢查用戶狀態
159+
obj = models.NKTO_User.objects.filter(uid=uid)
160+
print(obj[0].icon)
161+
if len(obj) == 0:
162+
return JsonResponse({'flag': -2, 'msg': 'no such account'})
163+
return JsonResponse({'flag': 1, 'msg': obj[0].icon})
164+
except BaseException as e:
165+
return JsonResponse({'flag': -1, 'msg': 'not logged'})
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.3 on 2017-11-26 06:21
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.utils.timezone
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('backend', '0003_auto_20171105_2211'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='nkto_goods',
18+
name='time',
19+
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
20+
preserve_default=False,
21+
),
22+
]

website/backend/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class NKTO_Goods(models.Model):
2626
eval_price = models.FloatField()
2727
category = models.IntegerField(default = 0)
2828
state = models.IntegerField(default = 0)
29+
time = models.DateTimeField(auto_now_add = True)
2930
def __str__(self):
3031
return self.name
3132

website/backend/socket.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from django.shortcuts import render
2+
import socketio
3+
from django.views.decorators.csrf import ensure_csrf_cookie,csrf_exempt
4+
import hashlib, time, datetime
5+
import urllib.parse
6+
7+
async_mode = None
8+
sio = socketio.Server(async_mode = async_mode)
9+
slist = [1]*2
10+
thread = None
11+
"""
12+
talker_list以cid或uid为key存储sid customer_list以cid为key存储uid列表 conversation以uid为key存储聊天内容
13+
"""
14+
15+
@csrf_exempt
16+
def model(request):
17+
return render(request, 'nktoindex.html')
18+
19+
def time2str():
20+
date = datetime.datetime.now()
21+
return date.strftime('%Y-%m-%d %H:%M:%S')
22+
23+
def str2time(st):
24+
t = time.strptime(st, '%Y-%m-%d %H:%M:%S')
25+
return time.mktime(t)
26+
27+
@sio.on('sendmessage', namespace = '/test')
28+
def send_message(sid, message):
29+
uid = 1 - int(message['uid'])
30+
sio.emit('getresponse', {'data': message['data'], 'time': message['time'], 'src': message['src']}, room = slist[uid], namespace = '/test')
31+
32+
33+
@sio.on('connected', namespace = '/test')
34+
def connected(sid, message):
35+
uid = int(message['uid'])
36+
print(uid)
37+
slist[uid] = sid
38+
39+
@sio.on('disconnect request', namespace = '/test')
40+
def disconnect_request(sid):
41+
sio.disconnect(sid, namespace = '/test')
42+
43+
@sio.on('disconnect', namespace = '/test')
44+
def test_disconnect(sid):
45+
print('Client disconnected')

website/backend/urls.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.conf.urls import url
22
from django.contrib import admin
3-
from .apis import user
3+
from .apis import user, goods
4+
from . import socket
45

56
urlpatterns = [
67
#apis
@@ -9,4 +10,8 @@
910
url(r'^api/user/logout/$', user.user_logout),
1011
url(r'^api/user/validate/$', user.user_validate),
1112
url(r'^api/user/storeimage/$', user.user_storeimage),
13+
url(r'^api/goods/newitems/$', goods.new_item),
14+
url(r'^api/user/checkstate/$', user.user_checkstate),
15+
url(r'^api/goods/generate/$', goods.generate),
16+
url(r'^socket.io/', socket.model),
1217
]
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<template>
2+
<div class="customertalk">
3+
<div id="app">
4+
<div class="sidebar">
5+
<card :name="name" :icon="icon"></card>
6+
</div>
7+
<div class="main">
8+
<message :content="content"></message>
9+
<text-input @onKeyup="send"></text-input>
10+
</div>
11+
</div>
12+
</div>
13+
</template>
14+
<script>
15+
import Card from './Card'
16+
import TextInput from './TextInput'
17+
import Message from './Message'
18+
export default {
19+
components: {Card, TextInput, Message},
20+
props: {
21+
content: {
22+
type: Array
23+
},
24+
icon: {
25+
type: String
26+
},
27+
name: {
28+
type: String
29+
},
30+
uid: {
31+
type: String
32+
}
33+
},
34+
methods: {
35+
send (message) {
36+
this.$emit('send', message)
37+
},
38+
swit (item) {
39+
this.$emit('swit', item)
40+
},
41+
close () {
42+
this.$emit('close', true)
43+
},
44+
transfer () {
45+
this.$emit('transfer', true)
46+
}
47+
}
48+
}
49+
</script>
50+
<style scoped>
51+
.customertalk {
52+
display: flex;
53+
}
54+
#app {
55+
width: 100%;
56+
height: 75vh;
57+
overflow: hidden;
58+
border-radius: 3px;
59+
}
60+
#app .sidebar, #app .main {
61+
height: 100%;
62+
}
63+
#app .sidebar {
64+
float: left;
65+
width: 20%;
66+
color: #f4f4f4;
67+
background-color: #2d8cf0;
68+
}
69+
#app .main {
70+
position: relative;
71+
overflow: hidden;
72+
background-color: #eee;
73+
}
74+
#app .text {
75+
position: absolute;
76+
width: 100%;
77+
bottom: 0;
78+
left: 0;
79+
}
80+
#app .message {
81+
height: calc(100% - 160px);
82+
}
83+
.userinfo {
84+
width: 30%;
85+
}
86+
.buttongroup {
87+
margin-top: 20%;
88+
}
89+
.button {
90+
margin-left: 10%;
91+
}
92+
</style>
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
<template>
2+
<div class="container">
3+
<div class="text">
4+
<textarea placeholder="按 Ctrl + Enter 发送" v-model="content" @keyup="onKeyup"></textarea>
5+
</div>
6+
</div>
7+
</template>
8+
<script>
9+
export default {
10+
data () {
11+
return {
12+
content: '',
13+
}
14+
},
15+
methods: {
16+
onKeyup (e) {
17+
if (e.ctrlKey && e.keyCode === 13 && this.content.length) {
18+
this.$emit('onKeyup', this.html2Escape(this.content))
19+
this.content = ''
20+
}
21+
},
22+
html2Escape (sHtml) {
23+
// 将html字符转义
24+
return sHtml.replace(/[<>&"]/g, function (c) {
25+
return {
26+
'<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;'
27+
}[c]
28+
})
29+
},
30+
dataURLtoFile (dataurl, filename) {
31+
/* global File, atob: true */
32+
let arr = dataurl.split(',')
33+
let mime = arr[0].match(/:(.*?);/)[1]
34+
let bstr = atob(arr[1])
35+
let n = bstr.length
36+
let u8arr = new Uint8Array(n)
37+
while (n--) {
38+
u8arr[n] = bstr.charCodeAt(n)
39+
}
40+
return new File([u8arr], filename, {type: mime})
41+
},
42+
getCookie (cName) {
43+
if (document.cookie.length > 0) {
44+
let cStart = document.cookie.indexOf(cName + '=')
45+
if (cStart !== -1) {
46+
cStart = cStart + cName.length + 1
47+
let cEnd = document.cookie.indexOf(';', cStart)
48+
if (cEnd === -1) {
49+
cEnd = document.cookie.length
50+
}
51+
return unescape(document.cookie.substring(cStart, cEnd))
52+
}
53+
}
54+
return ''
55+
},
56+
handleUpload (file) {
57+
let image = new FormData()
58+
image.append('image', file)
59+
fetch('/storeimage/', {
60+
method: 'post',
61+
credentials: 'same-origin',
62+
headers: {
63+
'X-CSRFToken': this.getCookie('csrftoken'),
64+
'Accept': 'application/json'
65+
},
66+
body: image
67+
}).then((res) => res.json()).then((res) => {
68+
console.log(res)
69+
this.$emit('onKeyup', res['url'])
70+
})
71+
return false
72+
}
73+
},
74+
mounted: function () {
75+
// 由于在created和data中dom尚未渲染,所以无法在created和data中进行初始化
76+
/* global wantEmoji: true */
77+
}
78+
}
79+
</script>
80+
<style type="text/css" scoped>
81+
.container {
82+
position: relative;
83+
}
84+
.text {
85+
height: 160px;
86+
border-top: solid 1px #ddd;
87+
padding-top: 3vh;
88+
}
89+
.text textarea {
90+
padding: 10px;
91+
height: 100%;
92+
width: 100%;
93+
border-bottom: 1px solid #2e3238;
94+
border-right: 1px solid #243238;
95+
outline: none;
96+
font-family: "Micrsofot Yahei";
97+
resize: none;
98+
}
99+
.wrapper {
100+
position: absolute;
101+
top: -150%;
102+
height: 200px;
103+
left: 0;
104+
background-color: whitesmoke;
105+
}
106+
.icon {
107+
position: absolute;
108+
width: 100%;
109+
top: -5%;
110+
left: 0;
111+
border-right: 1px solid black;
112+
border-top: 1px solid lightgray;
113+
background-color: white;
114+
z-index: 10;
115+
}
116+
.no-margin {
117+
margin-left: -0.3vw;
118+
}
119+
.upload {
120+
display: inline-block;
121+
margin-left: -0.3vw;
122+
}
123+
</style>

0 commit comments

Comments
 (0)